]>
jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/rtp.py
6 from .common
import InfoExtractor
7 from ..utils
import js_to_json
10 class RTPIE(InfoExtractor
):
11 _VALID_URL
= r
'https?://(?:www\.)?rtp\.pt/play/p(?P<program_id>[0-9]+)/(?P<id>[^/?#]+)/?'
13 'url': 'http://www.rtp.pt/play/p405/e174042/paixoes-cruzadas',
14 'md5': 'e736ce0c665e459ddb818546220b4ef8',
18 'title': 'Paixões Cruzadas',
19 'description': 'As paixões musicais de António Cartaxo e António Macedo',
20 'thumbnail': r
're:^https?://.*\.jpg',
23 'url': 'http://www.rtp.pt/play/p831/a-quimica-das-coisas',
24 'only_matching': True,
27 _RX_OBFUSCATION
= re
.compile(r
'''(?xs)
28 atob\s*\(\s*decodeURIComponent\s*\(\s*
29 (\[[0-9A-Za-z%,'"]*\])
30 \s*\.\s*join\(\s*(?:""|'')\s*\)\s*\)\s*\)
33 def __unobfuscate(self
, data
, *, video_id
):
34 if data
.startswith('{'):
35 data
= self
._RX
_OBFUSCATION
.sub(
37 base64
.b64decode(urllib
.parse
.unquote(
38 ''.join(self
._parse
_json
(m
.group(1), video_id
))
39 )).decode('iso-8859-1')),
41 return js_to_json(data
)
43 def _real_extract(self
, url
):
44 video_id
= self
._match
_id
(url
)
46 webpage
= self
._download
_webpage
(url
, video_id
)
47 title
= self
._html
_search
_meta
(
48 'twitter:title', webpage
, display_name
='title', fatal
=True)
50 f
, config
= self
._search
_regex
(
52 var\s+f\s*=\s*(?P<f>".*?"|{[^;]+?});\s*
53 var\s+player1\s+=\s+new\s+RTPPlayer\s*\((?P<config>{(?:(?!\*/).)+?})\);(?!\s*\*/)
55 'player config', group
=('f', 'config'))
59 lambda data
: self
.__unobfuscate
(data
, video_id
=video_id
))
60 config
= self
._parse
_json
(
62 lambda data
: self
.__unobfuscate
(data
, video_id
=video_id
))
65 if isinstance(f
, dict):
68 formats
.extend(self
._extract
_m
3u8_formats
(
69 f_hls
, video_id
, 'mp4', 'm3u8_native', m3u8_id
='hls'))
71 f_dash
= f
.get('dash')
72 if f_dash
is not None:
73 formats
.extend(self
._extract
_mpd
_formats
(f_dash
, video_id
, mpd_id
='dash'))
78 'vcodec': 'none' if config
.get('mediaType') == 'audio' else None,
83 vtt
= config
.get('vtt')
85 for lcode
, lname
, url
in vtt
:
86 subtitles
.setdefault(lcode
, []).append({
95 'description': self
._html
_search
_meta
(['description', 'twitter:description'], webpage
),
96 'thumbnail': config
.get('poster') or self
._og
_search
_thumbnail
(webpage
),
97 'subtitles': subtitles
,