mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-21 20:46:36 -05:00
[ie/crunchyroll] Fix stream extraction (#10005)
Closes #9994 Authored by: bashonly
This commit is contained in:
parent
beaf832c7a
commit
f2816634e3
1 changed files with 25 additions and 5 deletions
|
@ -2,6 +2,7 @@
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from .common import InfoExtractor
|
from .common import InfoExtractor
|
||||||
|
from ..networking import Request
|
||||||
from ..networking.exceptions import HTTPError
|
from ..networking.exceptions import HTTPError
|
||||||
from ..utils import (
|
from ..utils import (
|
||||||
ExtractorError,
|
ExtractorError,
|
||||||
|
@ -24,6 +25,7 @@ class CrunchyrollBaseIE(InfoExtractor):
|
||||||
_BASE_URL = 'https://www.crunchyroll.com'
|
_BASE_URL = 'https://www.crunchyroll.com'
|
||||||
_API_BASE = 'https://api.crunchyroll.com'
|
_API_BASE = 'https://api.crunchyroll.com'
|
||||||
_NETRC_MACHINE = 'crunchyroll'
|
_NETRC_MACHINE = 'crunchyroll'
|
||||||
|
_SWITCH_USER_AGENT = 'Crunchyroll/1.8.0 Nintendo Switch/12.3.12.0 UE4/4.27'
|
||||||
_REFRESH_TOKEN = None
|
_REFRESH_TOKEN = None
|
||||||
_AUTH_HEADERS = None
|
_AUTH_HEADERS = None
|
||||||
_AUTH_EXPIRY = None
|
_AUTH_EXPIRY = None
|
||||||
|
@ -179,10 +181,19 @@ def _extract_stream(self, identifier, display_id=None):
|
||||||
display_id = identifier
|
display_id = identifier
|
||||||
|
|
||||||
self._update_auth()
|
self._update_auth()
|
||||||
|
headers = {**CrunchyrollBaseIE._AUTH_HEADERS, 'User-Agent': self._SWITCH_USER_AGENT}
|
||||||
|
try:
|
||||||
stream_response = self._download_json(
|
stream_response = self._download_json(
|
||||||
f'https://cr-play-service.prd.crunchyrollsvc.com/v1/{identifier}/console/switch/play',
|
f'https://cr-play-service.prd.crunchyrollsvc.com/v1/{identifier}/console/switch/play',
|
||||||
display_id, note='Downloading stream info', errnote='Failed to download stream info',
|
display_id, note='Downloading stream info', errnote='Failed to download stream info', headers=headers)
|
||||||
headers=CrunchyrollBaseIE._AUTH_HEADERS)
|
except ExtractorError as error:
|
||||||
|
if self.get_param('ignore_no_formats_error'):
|
||||||
|
self.report_warning(error.orig_msg)
|
||||||
|
return [], {}
|
||||||
|
elif isinstance(error.cause, HTTPError) and error.cause.status == 420:
|
||||||
|
raise ExtractorError(
|
||||||
|
'You have reached the rate-limit for active streams; try again later', expected=True)
|
||||||
|
raise
|
||||||
|
|
||||||
available_formats = {'': ('', '', stream_response['url'])}
|
available_formats = {'': ('', '', stream_response['url'])}
|
||||||
for hardsub_lang, stream in traverse_obj(stream_response, ('hardSubs', {dict.items}, lambda _, v: v[1]['url'])):
|
for hardsub_lang, stream in traverse_obj(stream_response, ('hardSubs', {dict.items}, lambda _, v: v[1]['url'])):
|
||||||
|
@ -211,7 +222,7 @@ def _extract_stream(self, identifier, display_id=None):
|
||||||
fatal=False, note=f'Downloading {f"{format_id} " if hardsub_lang else ""}MPD manifest')
|
fatal=False, note=f'Downloading {f"{format_id} " if hardsub_lang else ""}MPD manifest')
|
||||||
self._merge_subtitles(dash_subs, target=subtitles)
|
self._merge_subtitles(dash_subs, target=subtitles)
|
||||||
else:
|
else:
|
||||||
continue # XXX: Update this if/when meta mpd formats are working
|
continue # XXX: Update this if meta mpd formats work; will be tricky with token invalidation
|
||||||
for f in adaptive_formats:
|
for f in adaptive_formats:
|
||||||
if f.get('acodec') != 'none':
|
if f.get('acodec') != 'none':
|
||||||
f['language'] = audio_locale
|
f['language'] = audio_locale
|
||||||
|
@ -221,6 +232,15 @@ def _extract_stream(self, identifier, display_id=None):
|
||||||
for locale, subtitle in traverse_obj(stream_response, (('subtitles', 'captions'), {dict.items}, ...)):
|
for locale, subtitle in traverse_obj(stream_response, (('subtitles', 'captions'), {dict.items}, ...)):
|
||||||
subtitles.setdefault(locale, []).append(traverse_obj(subtitle, {'url': 'url', 'ext': 'format'}))
|
subtitles.setdefault(locale, []).append(traverse_obj(subtitle, {'url': 'url', 'ext': 'format'}))
|
||||||
|
|
||||||
|
# Invalidate stream token to avoid rate-limit
|
||||||
|
error_msg = 'Unable to invalidate stream token; you may experience rate-limiting'
|
||||||
|
if stream_token := stream_response.get('token'):
|
||||||
|
self._request_webpage(Request(
|
||||||
|
f'https://cr-play-service.prd.crunchyrollsvc.com/v1/token/{identifier}/{stream_token}/inactive',
|
||||||
|
headers=headers, method='PATCH'), display_id, 'Invalidating stream token', error_msg, fatal=False)
|
||||||
|
else:
|
||||||
|
self.report_warning(error_msg)
|
||||||
|
|
||||||
return formats, subtitles
|
return formats, subtitles
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue