3 from .cloudflarestream
import CloudflareStreamIE
4 from .common
import InfoExtractor
5 from ..utils
.traversal
import traverse_obj
8 class HytaleIE(InfoExtractor
):
9 _VALID_URL
= r
'https?://(?:www\.)?hytale\.com/news/\d+/\d+/(?P<id>[a-z0-9-]+)'
11 'url': 'https://hytale.com/news/2021/07/summer-2021-development-update',
13 'id': 'summer-2021-development-update',
14 'title': 'Summer 2021 Development Update',
18 'md5': '0854ebe347d233ee19b86ab7b2ead610',
20 'id': 'ed51a2609d21bad6e14145c37c334999',
22 'title': 'Avatar Personalization',
23 'thumbnail': r
're:https://videodelivery\.net/\w+/thumbnails/thumbnail\.jpg',
27 'url': 'https://www.hytale.com/news/2019/11/hytale-graphics-update',
29 'id': 'hytale-graphics-update',
30 'title': 'Hytale graphics update',
35 def _real_initialize(self
):
36 media_webpage
= self
._download
_webpage
(
37 'https://hytale.com/media', None, note
='Downloading list of media', fatal
=False) or ''
39 clips_json
= traverse_obj(
41 r
'window\.__INITIAL_COMPONENTS_STATE__\s*=\s*\[',
42 media_webpage
, 'clips json', None),
43 ('media', 'clips')) or []
45 self
._titles
= {clip
.get('src'): clip
.get('caption') for clip
in clips_json
}
47 def _real_extract(self
, url
):
48 playlist_id
= self
._match
_id
(url
)
49 webpage
= self
._download
_webpage
(url
, playlist_id
)
52 f
'https://cloudflarestream.com/{video_hash}/manifest/video.mpd?parentOrigin=https%3A%2F%2Fhytale.com',
53 CloudflareStreamIE
, title
=self
._titles
.get(video_hash
), url_transparent
=True)
54 for video_hash
in re
.findall(
55 r
'<stream\s+class\s*=\s*"ql-video\s+cf-stream"\s+src\s*=\s*"([a-f0-9]{32})"',
59 return self
.playlist_result(entries
, playlist_id
, self
._og
_search
_title
(webpage
))