]>
jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/openrec.py
1 from .common
import InfoExtractor
11 from ..compat
import compat_str
14 class OpenRecBaseIE(InfoExtractor
):
15 def _extract_pagestore(self
, webpage
, video_id
):
16 return self
._parse
_json
(
17 self
._search
_regex
(r
'(?m)window\.pageStore\s*=\s*(\{.+?\});$', webpage
, 'window.pageStore'), video_id
)
19 def _expand_media(self
, video_id
, media
):
20 for name
, m3u8_url
in (media
or {}).items():
23 yield from self
._extract
_m
3u8_formats
(
24 m3u8_url
, video_id
, ext
='mp4', m3u8_id
=name
)
26 def _extract_movie(self
, webpage
, video_id
, name
, is_live
):
27 window_stores
= self
._extract
_pagestore
(webpage
, video_id
)
29 # extract all three important data (most of data are duplicated each other, but slightly different!)
30 traverse_obj(window_stores
, ('v8', 'state', 'movie'), expected_type
=dict),
31 traverse_obj(window_stores
, ('v8', 'movie'), expected_type
=dict),
32 traverse_obj(window_stores
, 'movieStore', expected_type
=dict),
34 if not any(movie_stores
):
35 raise ExtractorError(f
'Failed to extract {name} info')
37 formats
= list(self
._expand
_media
(video_id
, get_first(movie_stores
, 'media')))
39 # archived livestreams or subscriber-only videos
40 cookies
= self
._get
_cookies
('https://www.openrec.tv/')
41 detail
= self
._download
_json
(
42 f
'https://apiv5.openrec.tv/api/v5/movies/{video_id}/detail', video_id
,
44 'Origin': 'https://www.openrec.tv',
45 'Referer': 'https://www.openrec.tv/',
46 'access-token': try_get(cookies
, lambda x
: x
.get('access_token').value
),
47 'uuid': try_get(cookies
, lambda x
: x
.get('uuid').value
),
49 new_media
= traverse_obj(detail
, ('data', 'items', ..., 'media'), get_all
=False)
50 formats
= list(self
._expand
_media
(video_id
, new_media
))
55 'title': get_first(movie_stores
, 'title'),
56 'description': get_first(movie_stores
, 'introduction'),
57 'thumbnail': get_first(movie_stores
, 'thumbnailUrl'),
59 'uploader': get_first(movie_stores
, ('channel', 'user', 'name')),
60 'uploader_id': get_first(movie_stores
, ('channel', 'user', 'id')),
61 'timestamp': int_or_none(get_first(movie_stores
, ['publishedAt', 'time']), scale
=1000) or unified_timestamp(get_first(movie_stores
, 'publishedAt')),
66 class OpenRecIE(OpenRecBaseIE
):
68 _VALID_URL
= r
'https?://(?:www\.)?openrec\.tv/live/(?P<id>[^/]+)'
70 'url': 'https://www.openrec.tv/live/2p8v31qe4zy',
71 'only_matching': True,
73 'url': 'https://www.openrec.tv/live/wez93eqvjzl',
74 'only_matching': True,
77 def _real_extract(self
, url
):
78 video_id
= self
._match
_id
(url
)
79 webpage
= self
._download
_webpage
(f
'https://www.openrec.tv/live/{video_id}', video_id
)
81 return self
._extract
_movie
(webpage
, video_id
, 'live', True)
84 class OpenRecCaptureIE(OpenRecBaseIE
):
85 IE_NAME
= 'openrec:capture'
86 _VALID_URL
= r
'https?://(?:www\.)?openrec\.tv/capture/(?P<id>[^/]+)'
88 'url': 'https://www.openrec.tv/capture/l9nk2x4gn14',
89 'only_matching': True,
91 'url': 'https://www.openrec.tv/capture/mldjr82p7qk',
94 'title': 'たいじの恥ずかしい英語力',
95 'uploader': 'たいちゃんねる',
96 'uploader_id': 'Yaritaiji',
97 'upload_date': '20210803',
101 def _real_extract(self
, url
):
102 video_id
= self
._match
_id
(url
)
103 webpage
= self
._download
_webpage
(f
'https://www.openrec.tv/capture/{video_id}', video_id
)
105 window_stores
= self
._extract
_pagestore
(webpage
, video_id
)
106 movie_store
= window_stores
.get('movie')
108 capture_data
= window_stores
.get('capture')
110 raise ExtractorError('Cannot extract title')
112 formats
= self
._extract
_m
3u8_formats
(
113 capture_data
.get('source'), video_id
, ext
='mp4')
117 'title': capture_data
.get('title'),
118 'thumbnail': capture_data
.get('thumbnailUrl'),
120 'timestamp': unified_timestamp(traverse_obj(movie_store
, 'createdAt', expected_type
=compat_str
)),
121 'uploader': traverse_obj(movie_store
, ('channel', 'name'), expected_type
=compat_str
),
122 'uploader_id': traverse_obj(movie_store
, ('channel', 'id'), expected_type
=compat_str
),
123 'upload_date': unified_strdate(capture_data
.get('createdAt')),
127 class OpenRecMovieIE(OpenRecBaseIE
):
128 IE_NAME
= 'openrec:movie'
129 _VALID_URL
= r
'https?://(?:www\.)?openrec\.tv/movie/(?P<id>[^/]+)'
131 'url': 'https://www.openrec.tv/movie/nqz5xl5km8v',
134 'title': '限定コミュニティ(Discord)参加方法ご説明動画',
135 'description': 'md5:ebd563e5f5b060cda2f02bf26b14d87f',
136 'thumbnail': r
're:https://.+',
137 'uploader': 'タイキとカズヒロ',
138 'uploader_id': 'taiki_to_kazuhiro',
139 'timestamp': 1638856800,
143 def _real_extract(self
, url
):
144 video_id
= self
._match
_id
(url
)
145 webpage
= self
._download
_webpage
(f
'https://www.openrec.tv/movie/{video_id}', video_id
)
147 return self
._extract
_movie
(webpage
, video_id
, 'movie', False)