[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
	 Sergey M․
					Sergey M․