From 641ad5d813d03b1b5bed2e5a38376f968b7e7764 Mon Sep 17 00:00:00 2001 From: coletdjnz Date: Fri, 13 Aug 2021 18:18:26 +1200 Subject: [PATCH] [youtube] Extract error messages from HTTPError response (#644) Authored by: coletdjnz --- yt_dlp/extractor/youtube.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py index e929aead3..88a7e5b5d 100644 --- a/yt_dlp/extractor/youtube.py +++ b/yt_dlp/extractor/youtube.py @@ -38,6 +38,7 @@ from ..utils import ( format_field, int_or_none, intlist_to_bytes, + is_html, mimetype2ext, network_exceptions, orderedSet, @@ -723,11 +724,11 @@ class YoutubeBaseInfoExtractor(InfoExtractor): if message: yield alert_type, message - def _report_alerts(self, alerts, expected=True): + def _report_alerts(self, alerts, expected=True, fatal=True): errors = [] warnings = [] for alert_type, alert_message in alerts: - if alert_type.lower() == 'error': + if alert_type.lower() == 'error' and fatal: errors.append([alert_type, alert_message]) else: warnings.append([alert_type, alert_message]) @@ -793,6 +794,13 @@ class YoutubeBaseInfoExtractor(InfoExtractor): note='%s%s' % (note, ' (retry #%d)' % count if count else '')) except ExtractorError as e: if isinstance(e.cause, network_exceptions): + if isinstance(e.cause, compat_HTTPError) and not is_html(e.cause.read(512)): + e.cause.seek(0) + yt_error = try_get( + self._parse_json(e.cause.read().decode(), item_id, fatal=False), + lambda x: x['error']['message'], compat_str) + if yt_error: + self._report_alerts([('ERROR', yt_error)], fatal=False) # Downloading page may result in intermittent 5xx HTTP error # Sometimes a 404 is also recieved. See: https://github.com/ytdl-org/youtube-dl/issues/28289 # We also want to catch all other network exceptions since errors in later pages can be troublesome