From a1b535bd750ef33c3cd7cb95bbda3f93441788a5 Mon Sep 17 00:00:00 2001 From: pukkandan Date: Tue, 9 Feb 2021 20:32:12 +0530 Subject: [PATCH] [youtube] Support gridPlaylistRenderer and gridVideoRenderer (Closes #65) --- youtube_dlc/extractor/youtube.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/youtube_dlc/extractor/youtube.py b/youtube_dlc/extractor/youtube.py index 6bf82c100..e0de65900 100644 --- a/youtube_dlc/extractor/youtube.py +++ b/youtube_dlc/extractor/youtube.py @@ -2577,7 +2577,7 @@ def _extract_continuation(cls, renderer): next_continuation = cls._extract_next_continuation_data(renderer) if next_continuation: return next_continuation - contents = renderer.get('contents') + contents = renderer.get('contents') or renderer.get('items') if not isinstance(contents, list): return for content in contents: @@ -2724,19 +2724,26 @@ def extract_entries(parent_renderer): # this needs to called again for continua continuation = continuation_list[0] continue + known_renderers = { + 'gridPlaylistRenderer': (self._grid_entries, 'items'), + 'gridVideoRenderer': (self._grid_entries, 'items'), + 'playlistVideoRenderer': (self._playlist_entries, 'contents'), + 'itemSectionRenderer': (self._playlist_entries, 'contents'), + } continuation_items = try_get( response, lambda x: x['onResponseReceivedActions'][0]['appendContinuationItemsAction']['continuationItems'], list) - if continuation_items: - continuation_item = continuation_items[0] - if not isinstance(continuation_item, dict): - continue - renderer = continuation_item.get('playlistVideoRenderer') or continuation_item.get('itemSectionRenderer') - if renderer: - video_list_renderer = {'contents': continuation_items} - for entry in self._playlist_entries(video_list_renderer): - yield entry - continuation = self._extract_continuation(video_list_renderer) + continuation_item = try_get(continuation_items, lambda x: x[0], dict) or {} + video_items_renderer = None + for key, value in continuation_item.items(): + if key not in known_renderers: continue + video_items_renderer = {known_renderers[key][1]: continuation_items} + for entry in known_renderers[key][0](video_items_renderer): + yield entry + continuation = self._extract_continuation(video_items_renderer) + break + if video_items_renderer: + continue break @staticmethod