mirror of
				https://gitlab.com/ytdl-org/youtube-dl.git
				synced 2025-11-03 20:47:07 -05:00 
			
		
		
		
	[twitch] Workaround broken paging (Closes #8740)
This commit is contained in:
		@@ -271,7 +271,7 @@ class TwitchVodIE(TwitchItemBaseIE):
 | 
			
		||||
 | 
			
		||||
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 @@ class TwitchPlaylistBaseIE(TwitchBaseIE):
 | 
			
		||||
        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 @@ class TwitchPlaylistBaseIE(TwitchBaseIE):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user