mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2025-07-09 11:31:51 +00:00
parent
fca94ac5d6
commit
422cc8cb2f
@ -6,6 +6,7 @@ import re
|
|||||||
import urllib.parse
|
import urllib.parse
|
||||||
|
|
||||||
from .common import InfoExtractor
|
from .common import InfoExtractor
|
||||||
|
from ..networking.exceptions import HTTPError
|
||||||
from ..utils import (
|
from ..utils import (
|
||||||
ExtractorError,
|
ExtractorError,
|
||||||
UserNotLive,
|
UserNotLive,
|
||||||
@ -188,6 +189,7 @@ class TwitchBaseIE(InfoExtractor):
|
|||||||
}] if thumbnail else None
|
}] if thumbnail else None
|
||||||
|
|
||||||
def _extract_twitch_m3u8_formats(self, path, video_id, token, signature, live_from_start=False):
|
def _extract_twitch_m3u8_formats(self, path, video_id, token, signature, live_from_start=False):
|
||||||
|
try:
|
||||||
formats = self._extract_m3u8_formats(
|
formats = self._extract_m3u8_formats(
|
||||||
f'{self._USHER_BASE}/{path}/{video_id}.m3u8', video_id, 'mp4', query={
|
f'{self._USHER_BASE}/{path}/{video_id}.m3u8', video_id, 'mp4', query={
|
||||||
'allow_source': 'true',
|
'allow_source': 'true',
|
||||||
@ -201,6 +203,25 @@ class TwitchBaseIE(InfoExtractor):
|
|||||||
'sig': signature,
|
'sig': signature,
|
||||||
'token': token,
|
'token': token,
|
||||||
})
|
})
|
||||||
|
except ExtractorError as e:
|
||||||
|
if (
|
||||||
|
not isinstance(e.cause, HTTPError)
|
||||||
|
or e.cause.status != 403
|
||||||
|
or e.cause.response.get_header('content-type') != 'application/json'
|
||||||
|
):
|
||||||
|
raise
|
||||||
|
|
||||||
|
error_info = traverse_obj(e.cause.response.read(), ({json.loads}, 0, {dict})) or {}
|
||||||
|
if error_info.get('error_code') in ('vod_manifest_restricted', 'unauthorized_entitlements'):
|
||||||
|
common_msg = 'access to this subscriber-only content'
|
||||||
|
if self._get_cookies('https://gql.twitch.tv').get('auth-token'):
|
||||||
|
raise ExtractorError(f'Your account does not have {common_msg}', expected=True)
|
||||||
|
self.raise_login_required(f'You must be logged into an account that has {common_msg}')
|
||||||
|
|
||||||
|
if error_msg := join_nonempty('error_code', 'error', from_dict=error_info, delim=': '):
|
||||||
|
raise ExtractorError(error_msg, expected=True)
|
||||||
|
raise
|
||||||
|
|
||||||
for fmt in formats:
|
for fmt in formats:
|
||||||
if fmt.get('vcodec') and fmt['vcodec'].startswith('av01'):
|
if fmt.get('vcodec') and fmt['vcodec'].startswith('av01'):
|
||||||
# mpegts does not yet have proper support for av1
|
# mpegts does not yet have proper support for av1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user