[extractor/youtube:tab] Improve continuation items extraction

This commit is contained in:
pukkandan 2022-09-27 04:44:54 +05:30
parent 1dd18a8808
commit 1fb53b946c
No known key found for this signature in database
GPG Key ID: 7EEE9E1E817D0A39

View File

@ -4493,26 +4493,6 @@ class YoutubeTabBaseInfoExtractor(YoutubeBaseInfoExtractor):
# See: https://github.com/ytdl-org/youtube-dl/issues/28702 # See: https://github.com/ytdl-org/youtube-dl/issues/28702
visitor_data = self._extract_visitor_data(response) or visitor_data visitor_data = self._extract_visitor_data(response) or visitor_data
known_continuation_renderers = {
'playlistVideoListContinuation': self._playlist_entries,
'gridContinuation': self._grid_entries,
'itemSectionContinuation': self._post_thread_continuation_entries,
'sectionListContinuation': extract_entries, # for feeds
}
continuation_contents = try_get(
response, lambda x: x['continuationContents'], dict) or {}
continuation_renderer = None
for key, value in continuation_contents.items():
if key not in known_continuation_renderers:
continue
continuation_renderer = value
continuation_list = [None]
yield from known_continuation_renderers[key](continuation_renderer)
continuation = continuation_list[0] or self._extract_continuation(continuation_renderer)
break
if continuation_renderer:
continue
known_renderers = { known_renderers = {
'videoRenderer': (self._grid_entries, 'items'), # for membership tab 'videoRenderer': (self._grid_entries, 'items'), # for membership tab
'gridPlaylistRenderer': (self._grid_entries, 'items'), 'gridPlaylistRenderer': (self._grid_entries, 'items'),
@ -4523,23 +4503,30 @@ class YoutubeTabBaseInfoExtractor(YoutubeBaseInfoExtractor):
'richItemRenderer': (extract_entries, 'contents'), # for hashtag 'richItemRenderer': (extract_entries, 'contents'), # for hashtag
'backstagePostThreadRenderer': (self._post_thread_continuation_entries, 'contents'), 'backstagePostThreadRenderer': (self._post_thread_continuation_entries, 'contents'),
'reportHistoryTableRowRenderer': (self._report_history_entries, 'rows'), 'reportHistoryTableRowRenderer': (self._report_history_entries, 'rows'),
'playlistVideoListContinuation': (self._playlist_entries, None),
'gridContinuation': (self._grid_entries, None),
'itemSectionContinuation': (self._post_thread_continuation_entries, None),
'sectionListContinuation': (extract_entries, None), # for feeds
} }
on_response_received = dict_get(response, ('onResponseReceivedActions', 'onResponseReceivedEndpoints'))
continuation_items = try_get( continuation_items = traverse_obj(response, (
on_response_received, lambda x: x[0]['appendContinuationItemsAction']['continuationItems'], list) ('onResponseReceivedActions', 'onResponseReceivedEndpoints'), ...,
continuation_item = try_get(continuation_items, lambda x: x[0], dict) or {} 'appendContinuationItemsAction', 'continuationItems'
), 'continuationContents', get_all=False)
continuation_item = traverse_obj(continuation_items, 0, None, expected_type=dict, default={})
video_items_renderer = None video_items_renderer = None
for key, value in continuation_item.items(): for key in continuation_item.keys():
if key not in known_renderers: if key not in known_renderers:
continue continue
video_items_renderer = {known_renderers[key][1]: continuation_items} func, parent_key = known_renderers[key]
video_items_renderer = {parent_key: continuation_items} if parent_key else continuation_items
continuation_list = [None] continuation_list = [None]
yield from known_renderers[key][0](video_items_renderer) yield from func(video_items_renderer)
continuation = continuation_list[0] or self._extract_continuation(video_items_renderer) continuation = continuation_list[0] or self._extract_continuation(video_items_renderer)
if not video_items_renderer:
break break
if video_items_renderer:
continue
break
@staticmethod @staticmethod
def _extract_selected_tab(tabs, fatal=True): def _extract_selected_tab(tabs, fatal=True):