]> jfr.im git - yt-dlp.git/commitdiff
[youtube:comments] Fix error handling and add `itct` to params (#446)
authorcoletdjnz <redacted>
Fri, 25 Jun 2021 18:01:10 +0000 (06:01 +1200)
committerGitHub <redacted>
Fri, 25 Jun 2021 18:01:10 +0000 (23:31 +0530)
Should close #439 (untested)

Authored by: colethedj

yt_dlp/extractor/youtube.py

index e27253e37336779204fe09ab80ade178df62236e..b2a9322d70f082bece8acdfbe97889853c5c2936 100644 (file)
@@ -1731,6 +1731,8 @@ def extract_thread(parent_renderer):
                         'pbj': 1,
                         'type': 'next',
                     }
+                    if 'itct' in continuation:
+                        query['itct'] = continuation['itct']
                     if parent:
                         query['action_get_comment_replies'] = 1
                     else:
@@ -1776,19 +1778,27 @@ def extract_thread(parent_renderer):
 
                     response = try_get(browse,
                                        (lambda x: x['response'],
-                                        lambda x: x[1]['response'])) or {}
+                                        lambda x: x[1]['response']), dict) or {}
 
                     if response.get('continuationContents'):
                         break
 
                     # YouTube sometimes gives reload: now json if something went wrong (e.g. bad auth)
-                    if browse.get('reload'):
-                        raise ExtractorError('Invalid or missing params in continuation request', expected=False)
+                    if isinstance(browse, dict):
+                        if browse.get('reload'):
+                            raise ExtractorError('Invalid or missing params in continuation request', expected=False)
+
+                        # TODO: not tested, merged from old extractor
+                        err_msg = browse.get('externalErrorMessage')
+                        if err_msg:
+                            last_error = err_msg
+                            continue
 
-                    # TODO: not tested, merged from old extractor
-                    err_msg = browse.get('externalErrorMessage')
+                    response_error = try_get(response, lambda x: x['responseContext']['errors']['error'][0], dict) or {}
+                    err_msg = response_error.get('externalErrorMessage')
                     if err_msg:
-                        raise ExtractorError('YouTube said: %s' % err_msg, expected=False)
+                        last_error = err_msg
+                        continue
 
                     # Youtube sometimes sends incomplete data
                     # See: https://github.com/ytdl-org/youtube-dl/issues/28194