mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-23 02:25:11 +00:00
[twitch] Workaround broken paging (Closes #8740)
This commit is contained in:
parent
1b0635aba3
commit
539a1641c6
1 changed files with 22 additions and 5 deletions
|
@ -271,7 +271,7 @@ def _real_extract(self, url):
|
|||
|
||||
class TwitchPlaylistBaseIE(TwitchBaseIE):
|
||||
_PLAYLIST_URL = '%s/kraken/channels/%%s/videos/?offset=%%d&limit=%%d' % TwitchBaseIE._API_BASE
|
||||
_PAGE_LIMIT = 100
|
||||
_PAGE_LIMIT = 10
|
||||
|
||||
def _extract_playlist(self, channel_id):
|
||||
info = self._download_json(
|
||||
|
@ -281,14 +281,34 @@ def _extract_playlist(self, channel_id):
|
|||
entries = []
|
||||
offset = 0
|
||||
limit = self._PAGE_LIMIT
|
||||
broken_paging_detected = False
|
||||
counter_override = None
|
||||
for counter in itertools.count(1):
|
||||
response = self._download_json(
|
||||
self._PLAYLIST_URL % (channel_id, offset, limit),
|
||||
channel_id, 'Downloading %s videos JSON page %d' % (self._PLAYLIST_TYPE, counter))
|
||||
channel_id,
|
||||
'Downloading %s videos JSON page %s'
|
||||
% (self._PLAYLIST_TYPE, counter_override or counter))
|
||||
page_entries = self._extract_playlist_page(response)
|
||||
if not page_entries:
|
||||
break
|
||||
total = int_or_none(response.get('_total'))
|
||||
# Since the beginning of March 2016 twitch's paging mechanism
|
||||
# is completely broken on the twitch side. It simply ignores
|
||||
# a limit and returns the whole offset number of videos.
|
||||
# Working around by just requesting all videos at once.
|
||||
if not broken_paging_detected and total and len(page_entries) > limit:
|
||||
self.report_warning(
|
||||
'Twitch paging is broken on twitch side, requesting all videos at once',
|
||||
channel_id)
|
||||
broken_paging_detected = True
|
||||
limit = total
|
||||
offset = 0
|
||||
counter_override = '(all at once)'
|
||||
continue
|
||||
entries.extend(page_entries)
|
||||
if broken_paging_detected or total and len(page_entries) >= total:
|
||||
break
|
||||
offset += limit
|
||||
return self.playlist_result(
|
||||
[self.url_result(entry) for entry in set(entries)],
|
||||
|
@ -303,7 +323,6 @@ def _real_extract(self, url):
|
|||
|
||||
|
||||
class TwitchProfileIE(TwitchPlaylistBaseIE):
|
||||
_WORKING = False
|
||||
IE_NAME = 'twitch:profile'
|
||||
_VALID_URL = r'%s/(?P<id>[^/]+)/profile/?(?:\#.*)?$' % TwitchBaseIE._VALID_URL_BASE
|
||||
_PLAYLIST_TYPE = 'profile'
|
||||
|
@ -319,7 +338,6 @@ class TwitchProfileIE(TwitchPlaylistBaseIE):
|
|||
|
||||
|
||||
class TwitchPastBroadcastsIE(TwitchPlaylistBaseIE):
|
||||
_WORKING = False
|
||||
IE_NAME = 'twitch:past_broadcasts'
|
||||
_VALID_URL = r'%s/(?P<id>[^/]+)/profile/past_broadcasts/?(?:\#.*)?$' % TwitchBaseIE._VALID_URL_BASE
|
||||
_PLAYLIST_URL = TwitchPlaylistBaseIE._PLAYLIST_URL + '&broadcasts=true'
|
||||
|
@ -336,7 +354,6 @@ class TwitchPastBroadcastsIE(TwitchPlaylistBaseIE):
|
|||
|
||||
|
||||
class TwitchBookmarksIE(TwitchPlaylistBaseIE):
|
||||
_WORKING = False
|
||||
IE_NAME = 'twitch:bookmarks'
|
||||
_VALID_URL = r'%s/(?P<id>[^/]+)/profile/bookmarks/?(?:\#.*)?$' % TwitchBaseIE._VALID_URL_BASE
|
||||
_PLAYLIST_URL = '%s/api/bookmark/?user=%%s&offset=%%d&limit=%%d' % TwitchBaseIE._API_BASE
|
||||
|
|
Loading…
Reference in a new issue