1 from .common
import InfoExtractor
11 class RTVSLOIE(InfoExtractor
):
15 (?:365|4d)\.rtvslo.si/arhiv/[^/?#&;]+|
16 (?:www\.)?rtvslo\.si/rtv365/arhiv
18 _GEO_COUNTRIES
= ['SI']
20 _API_BASE
= 'https://api.rtvslo.si/ava/{}/{}?client_id=82013fb3a531d5414f478747c1aca622'
21 SUB_LANGS_MAP
= {'Slovenski': 'sl'}
25 'url': 'https://www.rtvslo.si/rtv365/arhiv/174842550?s=tv',
29 'release_timestamp': 1643140032,
30 'upload_date': '20220125',
32 'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/92/dnevnik_3_wide2.jpg',
33 'description': 'md5:76a18692757aeb8f0f51221106277dd2',
34 'timestamp': 1643137046,
37 'release_date': '20220125',
41 'url': 'https://365.rtvslo.si/arhiv/utrip/174843754',
46 'release_date': '20220129',
47 'timestamp': 1643484455,
50 'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/94/utrip_1_wide2.jpg',
51 'description': 'md5:77f2892630c7b17bb7a5bb84319020c9',
52 'release_timestamp': 1643485825,
53 'upload_date': '20220129',
57 'url': 'https://365.rtvslo.si/arhiv/il-giornale-della-sera/174844609',
61 'series_id': '106615841',
62 'title': 'Il giornale della sera',
64 'series': 'Il giornale della sera',
65 'timestamp': 1643743800,
66 'release_timestamp': 1643745424,
67 'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/il-giornale-della-sera_wide2.jpg',
68 'upload_date': '20220201',
70 'release_date': '20220201',
74 'url': 'https://4d.rtvslo.si/arhiv/dnevnik/174842550',
79 def _real_extract(self
, url
):
80 v_id
= self
._match
_id
(url
)
81 meta
= self
._download
_json
(self
._API
_BASE
.format('getRecordingDrm', v_id
), v_id
)['response']
83 thumbs
= [{'id': k, 'url': v, 'http_headers': {'Accept': 'image/jpeg'}
}
84 for k
, v
in (meta
.get('images') or {}).items()]
87 for s
in traverse_obj(meta
, 'subs', 'subtitles', default
=[]):
88 lang
= self
.SUB_LANGS_MAP
.get(s
.get('language'), s
.get('language') or 'und')
89 subs
.setdefault(lang
, []).append({
91 'ext': traverse_obj(s
, 'format', expected_type
=str.lower
),
96 raise ExtractorError('Site did not provide an authentication token, cannot proceed.')
98 media
= self
._download
_json
(self
._API
_BASE
.format('getMedia', v_id
), v_id
, query
={'jwt': jwt}
)['response']
101 adaptive_url
= traverse_obj(media
, ('addaptiveMedia', 'hls_sec'), expected_type
=url_or_none
)
103 formats
= self
._extract
_wowza
_formats
(adaptive_url
, v_id
, skip_protocols
=['smil'])
105 adaptive_url
= traverse_obj(media
, ('addaptiveMedia_sl', 'hls_sec'), expected_type
=url_or_none
)
107 for f
in self
._extract
_wowza
_formats
(adaptive_url
, v_id
, skip_protocols
=['smil']):
110 'format_id': 'sign-' + f
['format_id'],
111 'format_note': 'Sign language interpretation', 'preference': -10,
113 'slv' if f
.get('language') == 'eng' and f
.get('acodec') != 'none'
114 else f
.get('language'))
119 'url': f
['streams'][strm
],
120 'ext': traverse_obj(f
, 'mediaType', expected_type
=str.lower
),
121 'width': f
.get('width'),
122 'height': f
.get('height'),
123 'tbr': f
.get('bitrate'),
124 'filesize': f
.get('filesize'),
126 for strm
in ('http', 'https')
127 for f
in media
.get('mediaFiles') or []
128 if traverse_obj(f
, ('streams', strm
))
131 if any('intermission.mp4' in x
['url'] for x
in formats
):
132 self
.raise_geo_restricted(countries
=self
._GEO
_COUNTRIES
, metadata_available
=True)
133 if any('dummy_720p.mp4' in x
.get('manifest_url', '') for x
in formats
) and meta
.get('stub') == 'error':
134 raise ExtractorError(f
'{self.IE_NAME} said: Clip not available', expected
=True)
138 'webpage_url': ''.join(traverse_obj(meta
, ('canonical', ('domain', 'path')))),
139 'title': meta
.get('title'),
142 'thumbnails': thumbs
,
143 'description': meta
.get('description'),
144 'timestamp': unified_timestamp(traverse_obj(meta
, 'broadcastDate', ('broadcastDates', 0))),
145 'release_timestamp': unified_timestamp(meta
.get('recordingDate')),
146 'duration': meta
.get('duration') or parse_duration(meta
.get('length')),
147 'tags': meta
.get('genre'),
148 'series': meta
.get('showName'),
149 'series_id': meta
.get('showId'),