diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py index 3a56f2a42..27eb8aaae 100644 --- a/yt_dlp/extractor/youtube.py +++ b/yt_dlp/extractor/youtube.py @@ -26,6 +26,7 @@ from ..jsinterp import JSInterpreter from ..utils import ( clean_html, + dict_get, ExtractorError, format_field, float_or_none, @@ -2797,7 +2798,8 @@ def extract_entries(parent_renderer): # this needs to called again for continua else: # Youtube sometimes sends incomplete data # See: https://github.com/ytdl-org/youtube-dl/issues/28194 - if response.get('continuationContents') or response.get('onResponseReceivedActions'): + if dict_get(response, + ('continuationContents', 'onResponseReceivedActions', 'onResponseReceivedEndpoints')): break # Youtube may send alerts if there was an issue with the continuation page @@ -2837,9 +2839,11 @@ def extract_entries(parent_renderer): # this needs to called again for continua 'playlistVideoRenderer': (self._playlist_entries, 'contents'), 'itemSectionRenderer': (extract_entries, 'contents'), # for feeds 'richItemRenderer': (extract_entries, 'contents'), # for hashtag + 'backstagePostThreadRenderer': (self._post_thread_continuation_entries, 'contents') } continuation_items = try_get( - response, lambda x: x['onResponseReceivedActions'][0]['appendContinuationItemsAction']['continuationItems'], list) + response, + lambda x: dict_get(x, ('onResponseReceivedActions', 'onResponseReceivedEndpoints'))[0]['appendContinuationItemsAction']['continuationItems'], list) continuation_item = try_get(continuation_items, lambda x: x[0], dict) or {} video_items_renderer = None for key, value in continuation_item.items():