aboutsummaryrefslogtreecommitdiff
path: root/youtube_dl/extractor/youtube.py
diff options
context:
space:
mode:
authordirkf <fieldhouse@gmx.net>2025-10-17 06:24:43 +0100
committerdirkf <fieldhouse@gmx.net>2025-10-18 11:02:28 +0100
commitefb4011211f4cfb97894e8d30eace79e90e33c72 (patch)
tree7812e1ba17004d730a50156bebeee08d1e4f23e5 /youtube_dl/extractor/youtube.py
parentc1f5c3274a0ebc3181fc7094b53815445c154782 (diff)
[YouTube] Introduce `_extract_and_report_alerts()` per yt-dlp
Fixes #33196. Also removing previous `_extract_alerts()` method.
Diffstat (limited to 'youtube_dl/extractor/youtube.py')
-rw-r--r--youtube_dl/extractor/youtube.py46
1 files changed, 31 insertions, 15 deletions
diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py
index d56985420..c045bc8bc 100644
--- a/youtube_dl/extractor/youtube.py
+++ b/youtube_dl/extractor/youtube.py
@@ -3872,18 +3872,34 @@ class YoutubeTabIE(YoutubeBaseInfoExtractor):
uploader['channel'] = uploader['uploader']
return uploader
- @classmethod
- def _extract_alert(cls, data):
- alerts = []
- for alert in traverse_obj(data, ('alerts', Ellipsis), expected_type=dict):
- alert_text = traverse_obj(
- alert, (None, lambda x: x['alertRenderer']['text']), get_all=False)
- if not alert_text:
- continue
- text = cls._get_text(alert_text, 'text')
- if text:
- alerts.append(text)
- return '\n'.join(alerts)
+ def _extract_and_report_alerts(self, data, expected=True, fatal=True, only_once=False):
+
+ def alerts():
+ for alert in traverse_obj(data, ('alerts', Ellipsis), expected_type=dict):
+ alert_dict = traverse_obj(
+ alert, 'alertRenderer', None, expected_type=dict, get_all=False)
+ alert_type = traverse_obj(alert_dict, 'type')
+ if not alert_type:
+ continue
+ message = self._get_text(alert_dict, 'text')
+ if message:
+ yield alert_type, message
+
+ errors, warnings = [], []
+ _IGNORED_WARNINGS = T('Unavailable videos will be hidden during playback')
+ for alert_type, alert_message in alerts():
+ if alert_type.lower() == 'error' and fatal:
+ errors.append([alert_type, alert_message])
+ elif alert_message not in _IGNORED_WARNINGS:
+ warnings.append([alert_type, alert_message])
+
+ for alert_type, alert_message in itertools.chain(warnings, errors[:-1]):
+ self.report_warning(
+ 'YouTube said: %s - %s' % (alert_type, alert_message),
+ only_once=only_once)
+ if errors:
+ raise ExtractorError(
+ 'YouTube said: %s' % (errors[-1][1],), expected=expected)
def _extract_from_tabs(self, item_id, webpage, data, tabs):
selected_tab = self._extract_selected_tab(tabs)
@@ -3983,10 +3999,10 @@ class YoutubeTabIE(YoutubeBaseInfoExtractor):
compat_str) or video_id
if video_id:
return self.url_result(video_id, ie=YoutubeIE.ie_key(), video_id=video_id)
+
# Capture and output alerts
- alert = self._extract_alert(data)
- if alert:
- raise ExtractorError(alert, expected=True)
+ self._extract_and_report_alerts(data)
+
# Failed to recognize
raise ExtractorError('Unable to recognize tab page')