]>
Commit | Line | Data |
---|---|---|
a71c1d1a | 1 | import base64 |
660a230b S |
2 | |
3 | from .common import InfoExtractor | |
4 | ||
5 | ||
6 | class CloudflareStreamIE(InfoExtractor): | |
a71c1d1a | 7 | _DOMAIN_RE = r'(?:cloudflarestream\.com|(?:videodelivery|bytehighway)\.net)' |
483b858d RA |
8 | _EMBED_RE = r'embed\.%s/embed/[^/]+\.js\?.*?\bvideo=' % _DOMAIN_RE |
9 | _ID_RE = r'[\da-f]{32}|[\w-]+\.[\w-]+\.[\w-]+' | |
660a230b S |
10 | _VALID_URL = r'''(?x) |
11 | https?:// | |
12 | (?: | |
a71c1d1a | 13 | (?:watch\.)?%s/| |
483b858d | 14 | %s |
660a230b | 15 | ) |
483b858d RA |
16 | (?P<id>%s) |
17 | ''' % (_DOMAIN_RE, _EMBED_RE, _ID_RE) | |
bfd973ec | 18 | _EMBED_REGEX = [fr'<script[^>]+\bsrc=(["\'])(?P<url>(?:https?:)?//{_EMBED_RE}(?:{_ID_RE}).*?)\1'] |
660a230b S |
19 | _TESTS = [{ |
20 | 'url': 'https://embed.cloudflarestream.com/embed/we4g.fla9.latest.js?video=31c9291ab41fac05471db4e73aa11717', | |
21 | 'info_dict': { | |
22 | 'id': '31c9291ab41fac05471db4e73aa11717', | |
23 | 'ext': 'mp4', | |
24 | 'title': '31c9291ab41fac05471db4e73aa11717', | |
25 | }, | |
26 | 'params': { | |
27 | 'skip_download': True, | |
28 | }, | |
29 | }, { | |
30 | 'url': 'https://watch.cloudflarestream.com/9df17203414fd1db3e3ed74abbe936c1', | |
31 | 'only_matching': True, | |
32 | }, { | |
33 | 'url': 'https://cloudflarestream.com/31c9291ab41fac05471db4e73aa11717/manifest/video.mpd', | |
34 | 'only_matching': True, | |
169f8d0f | 35 | }, { |
36 | 'url': 'https://embed.videodelivery.net/embed/r4xu.fla9.latest.js?video=81d80727f3022488598f68d323c1ad5e', | |
37 | 'only_matching': True, | |
660a230b S |
38 | }] |
39 | ||
660a230b S |
40 | def _real_extract(self, url): |
41 | video_id = self._match_id(url) | |
a71c1d1a RA |
42 | domain = 'bytehighway.net' if 'bytehighway.net/' in url else 'videodelivery.net' |
43 | base_url = 'https://%s/%s/' % (domain, video_id) | |
44 | if '.' in video_id: | |
45 | video_id = self._parse_json(base64.urlsafe_b64decode( | |
7f71cee0 | 46 | video_id.split('.')[1] + '==='), video_id)['sub'] |
a71c1d1a | 47 | manifest_base_url = base_url + 'manifest/video.' |
660a230b S |
48 | |
49 | formats = self._extract_m3u8_formats( | |
a71c1d1a RA |
50 | manifest_base_url + 'm3u8', video_id, 'mp4', |
51 | 'm3u8_native', m3u8_id='hls', fatal=False) | |
660a230b | 52 | formats.extend(self._extract_mpd_formats( |
a71c1d1a | 53 | manifest_base_url + 'mpd', video_id, mpd_id='dash', fatal=False)) |
660a230b S |
54 | self._sort_formats(formats) |
55 | ||
56 | return { | |
57 | 'id': video_id, | |
58 | 'title': video_id, | |
a71c1d1a | 59 | 'thumbnail': base_url + 'thumbnails/thumbnail.jpg', |
660a230b S |
60 | 'formats': formats, |
61 | } |