]> jfr.im git - yt-dlp.git/blame - yt_dlp/extractor/cloudycdn.py
[cleanup] Add more ruff rules (#10149)
[yt-dlp.git] / yt_dlp / extractor / cloudycdn.py
CommitLineData
5dda3b29
C
1from .common import InfoExtractor
2from ..utils import (
3 int_or_none,
4 parse_iso8601,
5 url_or_none,
6 urlencode_postdata,
7)
8from ..utils.traversal import traverse_obj
9
10
11class CloudyCDNIE(InfoExtractor):
12 _VALID_URL = r'(?:https?:)?//embed\.cloudycdn\.services/(?P<site_id>[^/?#]+)/media/(?P<id>[\w-]+)'
13 _EMBED_REGEX = [rf'<iframe[^>]+\bsrc=[\'"](?P<url>{_VALID_URL})']
14 _TESTS = [{
15 'url': 'https://embed.cloudycdn.services/ltv/media/46k_d23-6000-105?',
16 'md5': '64f72a360ca530d5ed89c77646c9eee5',
17 'info_dict': {
18 'id': '46k_d23-6000-105',
19 'ext': 'mp4',
20 'timestamp': 1700589151,
21 'duration': 1442,
22 'upload_date': '20231121',
23 'title': 'D23-6000-105_cetstud',
24 'thumbnail': 'https://store.cloudycdn.services/tmsp00060/assets/media/660858/placeholder1700589200.jpg',
add96eb9 25 },
5dda3b29
C
26 }, {
27 'url': 'https://embed.cloudycdn.services/izm/media/26e_lv-8-5-1',
28 'md5': '798828a479151e2444d8dcfbec76e482',
29 'info_dict': {
30 'id': '26e_lv-8-5-1',
31 'ext': 'mp4',
32 'title': 'LV-8-5-1',
33 'timestamp': 1669767167,
34 'thumbnail': 'https://store.cloudycdn.services/tmsp00120/assets/media/488306/placeholder1679423604.jpg',
35 'duration': 1205,
36 'upload_date': '20221130',
add96eb9 37 },
5dda3b29
C
38 }]
39 _WEBPAGE_TESTS = [{
40 'url': 'https://www.tavaklase.lv/video/es-esmu-mina-um-2/',
41 'md5': '63074e8e6c84ac2a01f2fb8bf03b8f43',
42 'info_dict': {
43 'id': 'cqd_lib-2',
44 'ext': 'mp4',
45 'upload_date': '20230223',
46 'duration': 629,
47 'thumbnail': 'https://store.cloudycdn.services/tmsp00120/assets/media/518407/placeholder1678748124.jpg',
48 'timestamp': 1677181513,
49 'title': 'LIB-2',
add96eb9 50 },
5dda3b29
C
51 }]
52
53 def _real_extract(self, url):
54 site_id, video_id = self._match_valid_url(url).group('site_id', 'id')
55
56 data = self._download_json(
57 f'https://player.cloudycdn.services/player/{site_id}/media/{video_id}/',
58 video_id, data=urlencode_postdata({
59 'version': '6.4.0',
60 'referer': url,
61 }))
62
63 formats, subtitles = [], {}
64 for m3u8_url in traverse_obj(data, ('source', 'sources', ..., 'src', {url_or_none})):
65 fmts, subs = self._extract_m3u8_formats_and_subtitles(m3u8_url, video_id, fatal=False)
66 formats.extend(fmts)
67 self._merge_subtitles(subs, target=subtitles)
68
69 return {
70 'id': video_id,
71 'formats': formats,
72 'subtitles': subtitles,
73 **traverse_obj(data, {
74 'title': ('name', {str}),
75 'duration': ('duration', {int_or_none}),
76 'timestamp': ('upload_date', {parse_iso8601}),
77 'thumbnail': ('source', 'poster', {url_or_none}),
78 }),
79 }