|
@@ -3453,23 +3453,15 @@ class YoutubeTabIE(YoutubeBaseInfoExtractor):
|
|
next_continuation = cls._extract_next_continuation_data(renderer)
|
|
next_continuation = cls._extract_next_continuation_data(renderer)
|
|
if next_continuation:
|
|
if next_continuation:
|
|
return next_continuation
|
|
return next_continuation
|
|
- contents = []
|
|
|
|
- for key in ('contents', 'items'):
|
|
|
|
- contents.extend(try_get(renderer, lambda x: x[key], list) or [])
|
|
|
|
- for content in contents:
|
|
|
|
- if not isinstance(content, dict):
|
|
|
|
- continue
|
|
|
|
- continuation_ep = try_get(
|
|
|
|
- content, lambda x: x['continuationItemRenderer']['continuationEndpoint'],
|
|
|
|
- dict)
|
|
|
|
- if not continuation_ep:
|
|
|
|
- continue
|
|
|
|
- continuation = try_get(
|
|
|
|
- continuation_ep, lambda x: x['continuationCommand']['token'], compat_str)
|
|
|
|
|
|
+ for command in traverse_obj(renderer, (
|
|
|
|
+ ('contents', 'items', 'rows'), Ellipsis, 'continuationItemRenderer',
|
|
|
|
+ ('continuationEndpoint', ('button', 'buttonRenderer', 'command')),
|
|
|
|
+ (('commandExecutorCommand', 'commands', Ellipsis), None), T(dict))):
|
|
|
|
+ continuation = traverse_obj(command, ('continuationCommand', 'token', T(compat_str)))
|
|
if not continuation:
|
|
if not continuation:
|
|
continue
|
|
continue
|
|
- ctp = continuation_ep.get('clickTrackingParams')
|
|
|
|
- return YoutubeTabIE._build_continuation_query(continuation, ctp)
|
|
|
|
|
|
+ ctp = command.get('clickTrackingParams')
|
|
|
|
+ return cls._build_continuation_query(continuation, ctp)
|
|
|
|
|
|
def _entries(self, tab, item_id, webpage):
|
|
def _entries(self, tab, item_id, webpage):
|
|
tab_content = try_get(tab, lambda x: x['content'], dict)
|
|
tab_content = try_get(tab, lambda x: x['content'], dict)
|
|
@@ -3582,8 +3574,12 @@ class YoutubeTabIE(YoutubeBaseInfoExtractor):
|
|
# Downloading page may result in intermittent 5xx HTTP error
|
|
# Downloading page may result in intermittent 5xx HTTP error
|
|
# that is usually worked around with a retry
|
|
# that is usually worked around with a retry
|
|
response = self._download_json(
|
|
response = self._download_json(
|
|
- 'https://www.youtube.com/youtubei/v1/browse?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8',
|
|
|
|
|
|
+ 'https://www.youtube.com/youtubei/v1/browse',
|
|
None, 'Downloading page %d%s' % (page_num, ' (retry #%d)' % count if count else ''),
|
|
None, 'Downloading page %d%s' % (page_num, ' (retry #%d)' % count if count else ''),
|
|
|
|
+ query={
|
|
|
|
+ # 'key': 'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8',
|
|
|
|
+ 'prettyPrint': 'false',
|
|
|
|
+ },
|
|
headers=headers, data=json.dumps(data).encode('utf8'))
|
|
headers=headers, data=json.dumps(data).encode('utf8'))
|
|
break
|
|
break
|
|
except ExtractorError as e:
|
|
except ExtractorError as e:
|