aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLesmiscore (Naoya Ozaki) <nao20010128@gmail.com>2022-04-04 00:41:14 +0900
committerGitHub <noreply@github.com>2022-04-04 00:41:14 +0900
commit265e586d96bae2eb86a4f702ee2caef3b0cd78c3 (patch)
tree741937b146ef2cb418a65ff20433da81cb472249
parentfbfde1c3e6b59c5ff94e2604f1502acdeb14f8f0 (diff)
downloadhypervideo-pre-265e586d96bae2eb86a4f702ee2caef3b0cd78c3.tar.lz
hypervideo-pre-265e586d96bae2eb86a4f702ee2caef3b0cd78c3.tar.xz
hypervideo-pre-265e586d96bae2eb86a4f702ee2caef3b0cd78c3.zip
[openrec] Download archived livestreams (#3267)
Authored by: Lesmiscore
-rw-r--r--yt_dlp/extractor/openrec.py30
1 files changed, 23 insertions, 7 deletions
diff --git a/yt_dlp/extractor/openrec.py b/yt_dlp/extractor/openrec.py
index b476c0986..5eb1cdbad 100644
--- a/yt_dlp/extractor/openrec.py
+++ b/yt_dlp/extractor/openrec.py
@@ -7,6 +7,7 @@ from ..utils import (
get_first,
int_or_none,
traverse_obj,
+ try_get,
unified_strdate,
unified_timestamp,
)
@@ -18,6 +19,13 @@ class OpenRecBaseIE(InfoExtractor):
return self._parse_json(
self._search_regex(r'(?m)window\.pageStore\s*=\s*(\{.+?\});$', webpage, 'window.pageStore'), video_id)
+ def _expand_media(self, video_id, media):
+ for name, m3u8_url in (media or {}).items():
+ if not m3u8_url:
+ continue
+ yield from self._extract_m3u8_formats(
+ m3u8_url, video_id, ext='mp4', m3u8_id=name)
+
def _extract_movie(self, webpage, video_id, name, is_live):
window_stores = self._extract_pagestore(webpage, video_id)
movie_stores = [
@@ -29,13 +37,21 @@ class OpenRecBaseIE(InfoExtractor):
if not any(movie_stores):
raise ExtractorError(f'Failed to extract {name} info')
- m3u8_playlists = get_first(movie_stores, 'media') or {}
- formats = []
- for name, m3u8_url in m3u8_playlists.items():
- if not m3u8_url:
- continue
- formats.extend(self._extract_m3u8_formats(
- m3u8_url, video_id, ext='mp4', live=is_live, m3u8_id=name))
+ formats = list(self._expand_media(video_id, get_first(movie_stores, 'media')))
+ if not formats and is_live:
+ # archived livestreams
+ cookies = self._get_cookies('https://www.openrec.tv/')
+ detail = self._download_json(
+ f'https://apiv5.openrec.tv/api/v5/movies/{video_id}/detail', video_id,
+ headers={
+ 'Origin': 'https://www.openrec.tv',
+ 'Referer': 'https://www.openrec.tv/',
+ 'access-token': try_get(cookies, lambda x: x.get('access_token').value),
+ 'uuid': try_get(cookies, lambda x: x.get('uuid').value),
+ })
+ new_media = traverse_obj(detail, ('data', 'items', ..., 'media'), get_all=False)
+ formats = list(self._expand_media(video_id, new_media))
+ is_live = False
self._sort_formats(formats)