1 from .common
import InfoExtractor
12 class RTVSLOIE(InfoExtractor
):
16 (?:365|4d)\.rtvslo.si/arhiv/[^/?#&;]+|
17 (?:www\.)?rtvslo\.si/rtv365/arhiv
19 _GEO_COUNTRIES
= ['SI']
21 _API_BASE
= 'https://api.rtvslo.si/ava/{}/{}?client_id=82013fb3a531d5414f478747c1aca622'
22 SUB_LANGS_MAP
= {'Slovenski': 'sl'}
26 'url': 'https://www.rtvslo.si/rtv365/arhiv/174842550?s=tv',
30 'release_timestamp': 1643140032,
31 'upload_date': '20220125',
33 'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/92/dnevnik_3_wide2.jpg',
34 'description': 'md5:76a18692757aeb8f0f51221106277dd2',
35 'timestamp': 1643137046,
38 'release_date': '20220125',
42 'url': 'https://365.rtvslo.si/arhiv/utrip/174843754',
47 'release_date': '20220129',
48 'timestamp': 1643484455,
51 'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/94/utrip_1_wide2.jpg',
52 'description': 'md5:77f2892630c7b17bb7a5bb84319020c9',
53 'release_timestamp': 1643485825,
54 'upload_date': '20220129',
58 'url': 'https://365.rtvslo.si/arhiv/il-giornale-della-sera/174844609',
62 'series_id': '106615841',
63 'title': 'Il giornale della sera',
65 'series': 'Il giornale della sera',
66 'timestamp': 1643743800,
67 'release_timestamp': 1643745424,
68 'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/il-giornale-della-sera_wide2.jpg',
69 'upload_date': '20220201',
71 'release_date': '20220201',
74 'url': 'https://365.rtvslo.si/arhiv/razred-zase/148350750',
78 'title': 'Prvi šolski dan, mozaična oddaja za mlade',
79 'series': 'Razred zase',
80 'series_id': '148185730',
82 'upload_date': '20121019',
83 'timestamp': 1350672122,
84 'release_date': '20121019',
85 'release_timestamp': 1350672122,
86 'thumbnail': 'https://img.rtvcdn.si/_up/ava/ava_misc/show_logos/148185730/razred_zase_2014_logo_4d_wide2.jpg',
89 'url': 'https://4d.rtvslo.si/arhiv/dnevnik/174842550',
94 def _real_extract(self
, url
):
95 v_id
= self
._match
_id
(url
)
96 meta
= self
._download
_json
(self
._API
_BASE
.format('getRecordingDrm', v_id
), v_id
)['response']
98 thumbs
= [{'id': k, 'url': v, 'http_headers': {'Accept': 'image/jpeg'}
}
99 for k
, v
in (meta
.get('images') or {}).items()]
102 for s
in traverse_obj(meta
, 'subs', 'subtitles', default
=[]):
103 lang
= self
.SUB_LANGS_MAP
.get(s
.get('language'), s
.get('language') or 'und')
104 subs
.setdefault(lang
, []).append({
105 'url': s
.get('file'),
106 'ext': traverse_obj(s
, 'format', expected_type
=str.lower
),
109 jwt
= meta
.get('jwt')
111 raise ExtractorError('Site did not provide an authentication token, cannot proceed.')
113 media
= self
._download
_json
(self
._API
_BASE
.format('getMedia', v_id
), v_id
, query
={'jwt': jwt}
)['response']
116 skip_protocols
= ['smil', 'f4m', 'dash']
117 adaptive_url
= traverse_obj(media
, ('addaptiveMedia', 'hls_sec'), expected_type
=url_or_none
)
119 formats
= self
._extract
_wowza
_formats
(adaptive_url
, v_id
, skip_protocols
=skip_protocols
)
121 adaptive_url
= traverse_obj(media
, ('addaptiveMedia_sl', 'hls_sec'), expected_type
=url_or_none
)
123 for f
in self
._extract
_wowza
_formats
(adaptive_url
, v_id
, skip_protocols
=skip_protocols
):
126 'format_id': 'sign-' + f
['format_id'],
127 'format_note': 'Sign language interpretation', 'preference': -10,
129 'slv' if f
.get('language') == 'eng' and f
.get('acodec') != 'none'
130 else f
.get('language'))
133 for mediafile
in traverse_obj(media
, ('mediaFiles', lambda _
, v
: url_or_none(v
['streams']['https']))):
134 formats
.append(traverse_obj(mediafile
, {
135 'url': ('streams', 'https'),
136 'ext': ('mediaType', {str.lower}
),
137 'width': ('width', {int_or_none}
),
138 'height': ('height', {int_or_none}
),
139 'tbr': ('bitrate', {int_or_none}
),
140 'filesize': ('filesize', {int_or_none}
),
143 for mediafile
in traverse_obj(media
, ('mediaFiles', lambda _
, v
: url_or_none(v
['streams']['hls_sec']))):
144 formats
.extend(self
._extract
_wowza
_formats
(
145 mediafile
['streams']['hls_sec'], v_id
, skip_protocols
=skip_protocols
))
147 if any('intermission.mp4' in x
['url'] for x
in formats
):
148 self
.raise_geo_restricted(countries
=self
._GEO
_COUNTRIES
, metadata_available
=True)
149 if any('dummy_720p.mp4' in x
.get('manifest_url', '') for x
in formats
) and meta
.get('stub') == 'error':
150 raise ExtractorError(f
'{self.IE_NAME} said: Clip not available', expected
=True)
154 'webpage_url': ''.join(traverse_obj(meta
, ('canonical', ('domain', 'path')))),
155 'title': meta
.get('title'),
158 'thumbnails': thumbs
,
159 'description': meta
.get('description'),
160 'timestamp': unified_timestamp(traverse_obj(meta
, 'broadcastDate', ('broadcastDates', 0))),
161 'release_timestamp': unified_timestamp(meta
.get('recordingDate')),
162 'duration': meta
.get('duration') or parse_duration(meta
.get('length')),
163 'tags': meta
.get('genre'),
164 'series': meta
.get('showName'),
165 'series_id': meta
.get('showId'),