]>
jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/s4c.py
1 from .common
import InfoExtractor
2 from ..utils
import traverse_obj
, url_or_none
5 class S4CIE(InfoExtractor
):
6 _VALID_URL
= r
'https?://(?:www\.)?s4c\.cymru/clic/programme/(?P<id>\d+)'
8 'url': 'https://www.s4c.cymru/clic/programme/861362209',
13 'description': 'md5:f7681a30e4955b250b3224aa9fe70cf0',
15 'thumbnail': 'https://www.s4c.cymru/amg/1920x1080/Y_Swn_2023S4C_099_ii.jpg'
18 'url': 'https://www.s4c.cymru/clic/programme/856636948',
24 'description': 'md5:100d8686fc9a632a0cb2db52a3433ffe',
25 'thumbnail': 'https://www.s4c.cymru/amg/1920x1080/Am_Dro_2022-23S4C_P6_4005.jpg'
29 def _real_extract(self
, url
):
30 video_id
= self
._match
_id
(url
)
31 details
= self
._download
_json
(
32 f
'https://www.s4c.cymru/df/full_prog_details?lang=e&programme_id={video_id}',
33 video_id
, fatal
=False)
35 player_config
= self
._download
_json
(
36 'https://player-api.s4c-cdn.co.uk/player-configuration/prod', video_id
, query
={
37 'programme_id': video_id
,
43 }, note
='Downloading player config JSON')
45 for sub
in traverse_obj(player_config
, ('subtitles', lambda _
, v
: url_or_none(v
['0']))):
46 subtitles
.setdefault(sub
.get('3', 'en'), []).append({
50 m3u8_url
= self
._download
_json
(
51 'https://player-api.s4c-cdn.co.uk/streaming-urls/prod', video_id
, query
={
53 'application': 'clic',
56 'thirdParty': 'false',
57 'filename': player_config
['filename'],
58 }, note
='Downloading streaming urls JSON')['hls']
62 'formats': self
._extract
_m
3u8_formats
(m3u8_url
, video_id
, 'mp4', m3u8_id
='hls'),
63 'subtitles': subtitles
,
64 'thumbnail': url_or_none(player_config
.get('poster')),
65 **traverse_obj(details
, ('full_prog_details', 0, {
66 'title': (('programme_title', 'series_title'), {str}
),
67 'description': ('full_billing', {str.strip}
),
68 'duration': ('duration', {lambda x: int(x) * 60}
),
73 class S4CSeriesIE(InfoExtractor
):
74 _VALID_URL
= r
'https?://(?:www\.)?s4c\.cymru/clic/series/(?P<id>\d+)'
76 'url': 'https://www.s4c.cymru/clic/series/864982911',
77 'playlist_mincount': 6,
80 'title': 'Iaith ar Daith',
81 'description': 'md5:e878ebf660dce89bd2ef521d7ce06397'
84 'url': 'https://www.s4c.cymru/clic/series/866852587',
85 'playlist_mincount': 8,
88 'title': 'FFIT Cymru',
89 'description': 'md5:abcb3c129cb68dbb6cd304fd33b07e96'
93 def _real_extract(self
, url
):
94 series_id
= self
._match
_id
(url
)
95 series_details
= self
._download
_json
(
96 'https://www.s4c.cymru/df/series_details', series_id
, query
={
98 'series_id': series_id
,
99 'show_prog_in_series': 'Y'
100 }, note
='Downloading series details JSON')
102 return self
.playlist_result(
103 [self
.url_result(f
'https://www.s4c.cymru/clic/programme/{episode_id}', S4CIE
, episode_id
)
104 for episode_id
in traverse_obj(series_details
, ('other_progs_in_series', ..., 'id'))],
105 series_id
, traverse_obj(series_details
, ('full_prog_details', 0, 'series_title', {str}
)))