]> jfr.im git - yt-dlp.git/commitdiff
Separate the options `--ignore-errors` and `--no-abort-on-error`
authorpukkandan <redacted>
Fri, 24 Sep 2021 00:21:54 +0000 (05:51 +0530)
committerpukkandan <redacted>
Fri, 24 Sep 2021 00:35:35 +0000 (06:05 +0530)
In youtube-dl, `-i` ignores both download and post-processing error, and
treats the download as successful even if the post-processor fails.

yt-dlp used to skip the entire video on either error and there was no
option to ignore the post-processing errors like youtube-dl does.

By splitting the option into two, now either just the download errors
(--no-abort-on-error, default on CLI) or all errors (--ignore-errors)
can be ignored as per the users' needs

Closes #893

README.md
yt_dlp/YoutubeDL.py
yt_dlp/__init__.py
yt_dlp/options.py
yt_dlp/postprocessor/common.py
yt_dlp/postprocessor/ffmpeg.py
yt_dlp/postprocessor/xattrpp.py

index 641b672e0d54e58b859b12f922e105bb292e800d..07a8e5ef2573eb8c6838db3e7ffb437a2d11199b 100644 (file)
--- a/README.md
+++ b/README.md
@@ -243,9 +243,12 @@ ## General Options:
     -U, --update                     Update this program to latest version. Make
                                      sure that you have sufficient permissions
                                      (run with sudo if needed)
-    -i, --ignore-errors              Continue on download errors, for example to
-                                     skip unavailable videos in a playlist
-                                     (default) (Alias: --no-abort-on-error)
+    -i, --ignore-errors              Ignore download and postprocessing errors.
+                                     The download will be considered successfull
+                                     even if the postprocessing fails
+    --no-abort-on-error              Continue with next video on download
+                                     errors; e.g. to skip unavailable videos in
+                                     a playlist (default)
     --abort-on-error                 Abort downloading of further videos if an
                                      error occurs (Alias: --no-ignore-errors)
     --dump-user-agent                Display the current user-agent and exit
index 117461f5a9e819a98c60ecbae10653c8ab24a861..8df8f1675405e02b8c87b3b3cc5a0fd352495ac7 100644 (file)
@@ -226,9 +226,9 @@ class YoutubeDL(object):
     restrictfilenames: Do not allow "&" and spaces in file names
     trim_file_name:    Limit length of filename (extension excluded)
     windowsfilenames:  Force the filenames to be windows compatible
-    ignoreerrors:      Do not stop on download errors
-                       (Default True when running yt-dlp,
-                       but False when directly accessing YoutubeDL class)
+    ignoreerrors:      Do not stop on download/postprocessing errors.
+                       Can be 'only_download' to ignore only download errors.
+                       Default is 'only_download' for CLI, but False for API
     skip_playlist_after_errors: Number of allowed failures until the rest of
                        the playlist is skipped
     force_generic_extractor: Force downloader to use the generic extractor
@@ -776,7 +776,7 @@ def trouble(self, message=None, tb=None):
                     tb = ''.join(tb_data)
             if tb:
                 self.to_stderr(tb)
-        if not self.params.get('ignoreerrors', False):
+        if not self.params.get('ignoreerrors'):
             if sys.exc_info()[0] and hasattr(sys.exc_info()[1], 'exc_info') and sys.exc_info()[1].exc_info[0]:
                 exc_info = sys.exc_info()[1].exc_info
             else:
@@ -1241,7 +1241,7 @@ def wrapper(self, *args, **kwargs):
             except (MaxDownloadsReached, ExistingVideoReached, RejectedVideoReached, LazyList.IndexError):
                 raise
             except Exception as e:
-                if self.params.get('ignoreerrors', False):
+                if self.params.get('ignoreerrors'):
                     self.report_error(error_to_compat_str(e), tb=encode_compat_str(traceback.format_exc()))
                 else:
                     raise
@@ -2989,10 +2989,17 @@ def run_pp(self, pp, infodict):
         files_to_delete = []
         if '__files_to_move' not in infodict:
             infodict['__files_to_move'] = {}
-        files_to_delete, infodict = pp.run(infodict)
+        try:
+            files_to_delete, infodict = pp.run(infodict)
+        except PostProcessingError as e:
+            # Must be True and not 'only_download'
+            if self.params.get('ignoreerrors') is True:
+                self.report_error(e)
+                return infodict
+            raise
+
         if not files_to_delete:
             return infodict
-
         if self.params.get('keepvideo', False):
             for f in files_to_delete:
                 infodict['__files_to_move'].setdefault(f, '')
index 5168ed0f7ca4432a8da97f54d08643db30952c6c..9987c647213cc4a938039ac802e7548525a7053f 100644 (file)
@@ -279,7 +279,7 @@ def set_default_compat(compat_name, opt_name, default=True, remove_compat=True):
             setattr(opts, opt_name, default)
         return None
 
-    set_default_compat('abort-on-error', 'ignoreerrors')
+    set_default_compat('abort-on-error', 'ignoreerrors', 'only_download')
     set_default_compat('no-playlist-metafiles', 'allow_playlist_files')
     set_default_compat('no-clean-infojson', 'clean_infojson')
     if 'format-sort' in compat_opts:
index 80b3df74f7dfc504617d108e288345e6563ee15b..57e25a5183af3e2e887bdc680129be8b0cf6c6e1 100644 (file)
@@ -206,9 +206,13 @@ def _dict_from_options_callback(
         action='store_true', dest='update_self',
         help='Update this program to latest version. Make sure that you have sufficient permissions (run with sudo if needed)')
     general.add_option(
-        '-i', '--ignore-errors', '--no-abort-on-error',
-        action='store_true', dest='ignoreerrors', default=None,
-        help='Continue on download errors, for example to skip unavailable videos in a playlist (default) (Alias: --no-abort-on-error)')
+        '-i', '--ignore-errors',
+        action='store_true', dest='ignoreerrors',
+        help='Ignore download and postprocessing errors. The download will be considered successfull even if the postprocessing fails')
+    general.add_option(
+        '--no-abort-on-error',
+        action='store_const', dest='ignoreerrors', const='only_download',
+        help='Continue with next video on download errors; e.g. to skip unavailable videos in a playlist (default)')
     general.add_option(
         '--abort-on-error', '--no-ignore-errors',
         action='store_false', dest='ignoreerrors',
index aa4715b062468a9adaadc6a3312107425b9931d7..d8ec997d9d47d929710e97337ea35c344fa949f3 100644 (file)
@@ -52,6 +52,7 @@ def report_warning(self, text, *args, **kwargs):
             return self._downloader.report_warning(text, *args, **kwargs)
 
     def report_error(self, text, *args, **kwargs):
+        # Exists only for compatibility. Do not use
         if self._downloader:
             return self._downloader.report_error(text, *args, **kwargs)
 
index 7ea01620eaf4912109b612bfe97fb50819d2ba85..679377aa63a9d17e962b18fd652504cddeaa34a5 100644 (file)
@@ -288,8 +288,7 @@ def make_args(file, args, name, number):
         stdout, stderr = process_communicate_or_kill(p)
         if p.returncode not in variadic(expected_retcodes):
             stderr = stderr.decode('utf-8', 'replace').strip()
-            if self.get_param('verbose', False):
-                self.report_error(stderr)
+            self.write_debug(stderr)
             raise FFmpegPostProcessorError(stderr.split('\n')[-1])
         for out_path, _ in output_path_opts:
             if out_path:
index 3d31f0ce5bf102e8feb96d57d6452cd605ee83a6..95afa1c4f64f5560d4e728ce6f7d758e2f3c2d9f 100644 (file)
@@ -57,8 +57,7 @@ def run(self, info):
             return [], info
 
         except XAttrUnavailableError as e:
-            self.report_error(str(e))
-            return [], info
+            raise PostProcessingError(str(e))
 
         except XAttrMetadataError as e:
             if e.reason == 'NO_SPACE':
@@ -74,5 +73,5 @@ def run(self, info):
                     msg += 'You need to use NTFS.'
                 else:
                     msg += '(You may have to enable them in your /etc/fstab)'
-                self.report_error(msg)
+                raise PostProcessingError(str(e))
             return [], info