Add option `--skip-playlist-after-errors`
Allows to skip the rest of a playlist after a given number of errors are encountered
This commit is contained in:
parent
3b4775e021
commit
26e2805c3f
|
@ -305,6 +305,8 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||
a file that is in the archive
|
||||
--break-on-reject Stop the download process when encountering
|
||||
a file that has been filtered out
|
||||
--skip-playlist-after-errors N Number of allowed failures until the rest
|
||||
of the playlist is skipped
|
||||
--no-download-archive Do not use archive file (default)
|
||||
|
||||
## Download Options:
|
||||
|
|
|
@ -214,6 +214,8 @@ class YoutubeDL(object):
|
|||
ignoreerrors: Do not stop on download errors
|
||||
(Default True when running yt-dlp,
|
||||
but False when directly accessing YoutubeDL class)
|
||||
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
|
||||
overwrites: Overwrite all video and metadata files if True,
|
||||
overwrite only non-video files if None
|
||||
|
@ -1327,6 +1329,8 @@ class YoutubeDL(object):
|
|||
x_forwarded_for = ie_result.get('__x_forwarded_for_ip')
|
||||
|
||||
self.to_screen('[%s] playlist %s: %s' % (ie_result['extractor'], playlist, msg))
|
||||
failures = 0
|
||||
max_failures = self.params.get('skip_playlist_after_errors') or float('inf')
|
||||
for i, entry in enumerate(entries, 1):
|
||||
self.to_screen('[download] Downloading video %s of %s' % (i, n_entries))
|
||||
# This __x_forwarded_for_ip thing is a bit ugly but requires
|
||||
|
@ -1351,6 +1355,12 @@ class YoutubeDL(object):
|
|||
continue
|
||||
|
||||
entry_result = self.__process_iterable_entry(entry, download, extra)
|
||||
if not entry_result:
|
||||
failures += 1
|
||||
if failures >= max_failures:
|
||||
self.report_error(
|
||||
'Skipping the remaining entries in playlist "%s" since %d items failed extraction' % (playlist, failures))
|
||||
break
|
||||
# TODO: skip failed (empty) entries?
|
||||
playlist_results.append(entry_result)
|
||||
ie_result['entries'] = playlist_results
|
||||
|
|
|
@ -544,6 +544,7 @@ def _real_main(argv=None):
|
|||
'download_archive': download_archive_fn,
|
||||
'break_on_existing': opts.break_on_existing,
|
||||
'break_on_reject': opts.break_on_reject,
|
||||
'skip_playlist_after_errors': opts.skip_playlist_after_errors,
|
||||
'cookiefile': opts.cookiefile,
|
||||
'nocheckcertificate': opts.no_check_certificate,
|
||||
'prefer_insecure': opts.prefer_insecure,
|
||||
|
|
|
@ -395,6 +395,10 @@ def parseOpts(overrideArguments=None):
|
|||
'--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(
|
||||
'--skip-playlist-after-errors', metavar='N',
|
||||
dest='skip_playlist_after_errors', default=None, type=int,
|
||||
help='Number of allowed failures until the rest of the playlist is skipped')
|
||||
selection.add_option(
|
||||
'--no-download-archive',
|
||||
dest='download_archive', action="store_const", const=None,
|
||||
|
|
Loading…
Reference in New Issue