mirror of
https://github.com/ytdl-org/youtube-dl.git
synced 2024-11-25 03:32:05 +00:00
[twitch:stream] Fix extraction (closes #25528)
This commit is contained in:
parent
a0455d0ffd
commit
ce3735df02
1 changed files with 18 additions and 11 deletions
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue