1
1
mirror of https://github.com/ytdl-org/youtube-dl synced 2024-11-27 21:46:54 +01:00

[twitch:stream] Fix extraction (closes #25528)

This commit is contained in:
Sergey M․ 2020-06-06 00:55:29 +07:00
parent a0455d0ffd
commit ce3735df02
No known key found for this signature in database
GPG Key ID: 2C393E0F18A9236D

View File

@ -22,6 +22,7 @@ from ..utils import (
parse_duration, parse_duration,
parse_iso8601, parse_iso8601,
qualities, qualities,
str_or_none,
try_get, try_get,
unified_timestamp, unified_timestamp,
update_url_query, update_url_query,
@ -591,10 +592,18 @@ class TwitchStreamIE(TwitchBaseIE):
else super(TwitchStreamIE, cls).suitable(url)) else super(TwitchStreamIE, cls).suitable(url))
def _real_extract(self, url): def _real_extract(self, url):
channel_id = self._match_id(url) channel_name = self._match_id(url)
access_token = self._call_api(
'api/channels/%s/access_token' % channel_name, channel_name,
'Downloading access token JSON')
token = access_token['token']
channel_id = compat_str(self._parse_json(
token, channel_name)['channel_id'])
stream = self._call_api( stream = self._call_api(
'kraken/streams/%s?stream_type=all' % channel_id.lower(), 'kraken/streams/%s?stream_type=all' % channel_id,
channel_id, 'Downloading stream JSON').get('stream') channel_id, 'Downloading stream JSON').get('stream')
if not stream: if not stream:
@ -604,11 +613,9 @@ class TwitchStreamIE(TwitchBaseIE):
# (e.g. http://www.twitch.tv/TWITCHPLAYSPOKEMON) that will lead to constructing # (e.g. http://www.twitch.tv/TWITCHPLAYSPOKEMON) that will lead to constructing
# an invalid m3u8 URL. Working around by use of original channel name from stream # an invalid m3u8 URL. Working around by use of original channel name from stream
# JSON and fallback to lowercase if it's not available. # JSON and fallback to lowercase if it's not available.
channel_id = stream.get('channel', {}).get('name') or channel_id.lower() channel_name = try_get(
stream, lambda x: x['channel']['name'],
access_token = self._call_api( compat_str) or channel_name.lower()
'api/channels/%s/access_token' % channel_id, channel_id,
'Downloading channel access token')
query = { query = {
'allow_source': 'true', 'allow_source': 'true',
@ -619,11 +626,11 @@ class TwitchStreamIE(TwitchBaseIE):
'playlist_include_framerate': 'true', 'playlist_include_framerate': 'true',
'segment_preference': '4', 'segment_preference': '4',
'sig': access_token['sig'].encode('utf-8'), 'sig': access_token['sig'].encode('utf-8'),
'token': access_token['token'].encode('utf-8'), 'token': token.encode('utf-8'),
} }
formats = self._extract_m3u8_formats( formats = self._extract_m3u8_formats(
'%s/api/channel/hls/%s.m3u8?%s' '%s/api/channel/hls/%s.m3u8?%s'
% (self._USHER_BASE, channel_id, compat_urllib_parse_urlencode(query)), % (self._USHER_BASE, channel_name, compat_urllib_parse_urlencode(query)),
channel_id, 'mp4') channel_id, 'mp4')
self._prefer_source(formats) self._prefer_source(formats)
@ -646,8 +653,8 @@ class TwitchStreamIE(TwitchBaseIE):
}) })
return { return {
'id': compat_str(stream['_id']), 'id': str_or_none(stream.get('_id')) or channel_id,
'display_id': channel_id, 'display_id': channel_name,
'title': title, 'title': title,
'description': description, 'description': description,
'thumbnails': thumbnails, 'thumbnails': thumbnails,