3 from .common
import InfoExtractor
6 class CloudflareStreamIE(InfoExtractor
):
7 _SUBDOMAIN_RE
= r
'(?:(?:watch|iframe|customer-\w+)\.)?'
8 _DOMAIN_RE
= r
'(?:cloudflarestream\.com|(?:videodelivery|bytehighway)\.net)'
9 _EMBED_RE
= rf
'embed\.{_DOMAIN_RE}/embed/[^/]+\.js\?.*?\bvideo='
10 _ID_RE
= r
'[\da-f]{32}|[\w-]+\.[\w-]+\.[\w-]+'
11 _VALID_URL
= rf
'https?://(?:{_SUBDOMAIN_RE}{_DOMAIN_RE}/|{_EMBED_RE})(?P<id>{_ID_RE})'
13 rf
'<script[^>]+\bsrc=(["\'])(?P<url>(?:https?:)?//{_EMBED_RE}(?:{_ID_RE}).*?)\1',
14 rf
'<iframe[^>]+\bsrc=["\'](?P<url>https?://{_SUBDOMAIN_RE}{_DOMAIN_RE}/[\da-f]{{32}})',
17 'url': 'https://embed.cloudflarestream.com/embed/we4g.fla9.latest.js?video=31c9291ab41fac05471db4e73aa11717',
19 'id': '31c9291ab41fac05471db4e73aa11717',
21 'title': '31c9291ab41fac05471db4e73aa11717',
22 'thumbnail': 'https://videodelivery.net/31c9291ab41fac05471db4e73aa11717/thumbnails/thumbnail.jpg',
25 'skip_download': 'm3u8',
28 'url': 'https://watch.cloudflarestream.com/9df17203414fd1db3e3ed74abbe936c1',
29 'only_matching': True,
31 'url': 'https://cloudflarestream.com/31c9291ab41fac05471db4e73aa11717/manifest/video.mpd',
32 'only_matching': True,
34 'url': 'https://embed.videodelivery.net/embed/r4xu.fla9.latest.js?video=81d80727f3022488598f68d323c1ad5e',
35 'only_matching': True,
37 'url': 'https://customer-aw5py76sw8wyqzmh.cloudflarestream.com/2463f6d3e06fa29710a337f5f5389fd8/iframe',
38 'only_matching': True,
41 'url': 'https://upride.cc/incident/shoulder-pass-at-light/',
43 'id': 'eaef9dea5159cf968be84241b5cedfe7',
45 'title': 'eaef9dea5159cf968be84241b5cedfe7',
46 'thumbnail': 'https://videodelivery.net/eaef9dea5159cf968be84241b5cedfe7/thumbnails/thumbnail.jpg',
49 'skip_download': 'm3u8',
53 def _real_extract(self
, url
):
54 video_id
= self
._match
_id
(url
)
55 domain
= 'bytehighway.net' if 'bytehighway.net/' in url
else 'videodelivery.net'
56 base_url
= 'https://%s/%s/' % (domain
, video_id
)
58 video_id
= self
._parse
_json
(base64
.urlsafe_b64decode(
59 video_id
.split('.')[1] + '==='), video_id
)['sub']
60 manifest_base_url
= base_url
+ 'manifest/video.'
62 formats
, subtitles
= self
._extract
_m
3u8_formats
_and
_subtitles
(
63 manifest_base_url
+ 'm3u8', video_id
, 'mp4',
64 'm3u8_native', m3u8_id
='hls', fatal
=False)
65 fmts
, subs
= self
._extract
_mpd
_formats
_and
_subtitles
(
66 manifest_base_url
+ 'mpd', video_id
, mpd_id
='dash', fatal
=False)
68 self
._merge
_subtitles
(subs
, target
=subtitles
)
73 'thumbnail': base_url
+ 'thumbnails/thumbnail.jpg',
75 'subtitles': subtitles
,