From 2076d40681c7e8959b4a280350a20ffd9a509bb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Mon, 15 Nov 2021 22:56:42 +0100 Subject: [PATCH] [ytdl] improve error handling (#1680) --- gallery_dl/extractor/ytdl.py | 39 ++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/gallery_dl/extractor/ytdl.py b/gallery_dl/extractor/ytdl.py index e3049e30..8eb0c834 100644 --- a/gallery_dl/extractor/ytdl.py +++ b/gallery_dl/extractor/ytdl.py @@ -80,14 +80,19 @@ class YoutubeDLExtractor(Extractor): set_cookie(cookie) # extract youtube_dl info_dict - info_dict = ytdl_instance._YoutubeDL__extract_info( - self.ytdl_url, - ytdl_instance.get_info_extractor(self.ytdl_ie_key), - False, {}, True) + try: + info_dict = ytdl_instance._YoutubeDL__extract_info( + self.ytdl_url, + ytdl_instance.get_info_extractor(self.ytdl_ie_key), + False, {}, True) + except ytdl_module.utils.YoutubeDLError: + raise exception.StopExtraction("Failed to extract video data") - if "entries" in info_dict: + if not info_dict: + return + elif "entries" in info_dict: results = self._process_entries( - ytdl_instance, info_dict["entries"]) + ytdl_module, ytdl_instance, info_dict["entries"]) else: results = (info_dict,) @@ -104,15 +109,23 @@ class YoutubeDLExtractor(Extractor): yield Message.Directory, info_dict yield Message.Url, url, info_dict - def _process_entries(self, ytdl_instance, entries): + def _process_entries(self, ytdl_module, ytdl_instance, entries): for entry in entries: - if entry.get("_type") in ("url", "url_transparent"): - info_dict = ytdl_instance.extract_info( - entry["url"], False, - ie_key=entry.get("ie_key")) - if "entries" in info_dict: + if not entry: + continue + elif entry.get("_type") in ("url", "url_transparent"): + try: + info_dict = ytdl_instance.extract_info( + entry["url"], False, + ie_key=entry.get("ie_key")) + except ytdl_module.utils.YoutubeDLError: + continue + + if not info_dict: + continue + elif "entries" in info_dict: yield from self._process_entries( - ytdl_instance, info_dict["entries"]) + ytdl_module, ytdl_instance, info_dict["entries"]) else: yield info_dict else: