diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index ea4c5ae2d..29c9ecd16 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -310,6 +310,8 @@ class YoutubeDL(object): file that is in the archive. break_on_reject: Stop the download process when encountering a video that has been filtered out. + break_per_url: Whether break_on_reject and break_on_existing + should act on each input URL as opposed to for the entire queue cookiefile: File name where cookies should be read from and dumped to cookiesfrombrowser: A tuple containing the name of the browser and the profile name/path from where cookies are loaded. @@ -2968,9 +2970,13 @@ def wrapper(*args, **kwargs): res = func(*args, **kwargs) except UnavailableVideoError as e: self.report_error(e) - except DownloadCancelled as e: + except MaxDownloadsReached as e: self.to_screen(f'[info] {e}') raise + except DownloadCancelled as e: + self.to_screen(f'[info] {e}') + if not self.params.get('break_per_url'): + raise else: if self.params.get('dump_single_json', False): self.post_extract(res) diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py index 38959d930..d56c55b56 100644 --- a/yt_dlp/__init__.py +++ b/yt_dlp/__init__.py @@ -701,6 +701,7 @@ def report_args_compat(arg, name): 'download_archive': download_archive_fn, 'break_on_existing': opts.break_on_existing, 'break_on_reject': opts.break_on_reject, + 'break_per_url': opts.break_per_url, 'skip_playlist_after_errors': opts.skip_playlist_after_errors, 'cookiefile': opts.cookiefile, 'cookiesfrombrowser': opts.cookiesfrombrowser, diff --git a/yt_dlp/options.py b/yt_dlp/options.py index 0843d5ff7..4c1920404 100644 --- a/yt_dlp/options.py +++ b/yt_dlp/options.py @@ -449,6 +449,14 @@ def _dict_from_options_callback( '--break-on-reject', action='store_true', dest='break_on_reject', default=False, help='Stop the download process when encountering a file that has been filtered out') + selection.add_option( + '--break-per-input', + action='store_true', dest='break_per_url', default=False, + help='Make --break-on-existing and --break-on-reject act only on the current input URL') + selection.add_option( + '--no-break-per-input', + action='store_false', dest='break_per_url', + help='--break-on-existing and --break-on-reject terminates the entire download queue') selection.add_option( '--skip-playlist-after-errors', metavar='N', dest='skip_playlist_after_errors', default=None, type=int,