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
4 changed files with 17 additions and 0 deletions
|
@ -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
|
a file that is in the archive
|
||||||
--break-on-reject Stop the download process when encountering
|
--break-on-reject Stop the download process when encountering
|
||||||
a file that has been filtered out
|
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)
|
--no-download-archive Do not use archive file (default)
|
||||||
|
|
||||||
## Download Options:
|
## Download Options:
|
||||||
|
|
|
@ -214,6 +214,8 @@ class YoutubeDL(object):
|
||||||
ignoreerrors: Do not stop on download errors
|
ignoreerrors: Do not stop on download errors
|
||||||
(Default True when running yt-dlp,
|
(Default True when running yt-dlp,
|
||||||
but False when directly accessing YoutubeDL class)
|
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
|
force_generic_extractor: Force downloader to use the generic extractor
|
||||||
overwrites: Overwrite all video and metadata files if True,
|
overwrites: Overwrite all video and metadata files if True,
|
||||||
overwrite only non-video files if None
|
overwrite only non-video files if None
|
||||||
|
@ -1327,6 +1329,8 @@ class YoutubeDL(object):
|
||||||
x_forwarded_for = ie_result.get('__x_forwarded_for_ip')
|
x_forwarded_for = ie_result.get('__x_forwarded_for_ip')
|
||||||
|
|
||||||
self.to_screen('[%s] playlist %s: %s' % (ie_result['extractor'], playlist, msg))
|
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):
|
for i, entry in enumerate(entries, 1):
|
||||||
self.to_screen('[download] Downloading video %s of %s' % (i, n_entries))
|
self.to_screen('[download] Downloading video %s of %s' % (i, n_entries))
|
||||||
# This __x_forwarded_for_ip thing is a bit ugly but requires
|
# This __x_forwarded_for_ip thing is a bit ugly but requires
|
||||||
|
@ -1351,6 +1355,12 @@ class YoutubeDL(object):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
entry_result = self.__process_iterable_entry(entry, download, extra)
|
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?
|
# TODO: skip failed (empty) entries?
|
||||||
playlist_results.append(entry_result)
|
playlist_results.append(entry_result)
|
||||||
ie_result['entries'] = playlist_results
|
ie_result['entries'] = playlist_results
|
||||||
|
|
|
@ -544,6 +544,7 @@ def _real_main(argv=None):
|
||||||
'download_archive': download_archive_fn,
|
'download_archive': download_archive_fn,
|
||||||
'break_on_existing': opts.break_on_existing,
|
'break_on_existing': opts.break_on_existing,
|
||||||
'break_on_reject': opts.break_on_reject,
|
'break_on_reject': opts.break_on_reject,
|
||||||
|
'skip_playlist_after_errors': opts.skip_playlist_after_errors,
|
||||||
'cookiefile': opts.cookiefile,
|
'cookiefile': opts.cookiefile,
|
||||||
'nocheckcertificate': opts.no_check_certificate,
|
'nocheckcertificate': opts.no_check_certificate,
|
||||||
'prefer_insecure': opts.prefer_insecure,
|
'prefer_insecure': opts.prefer_insecure,
|
||||||
|
|
|
@ -395,6 +395,10 @@ def parseOpts(overrideArguments=None):
|
||||||
'--break-on-reject',
|
'--break-on-reject',
|
||||||
action='store_true', dest='break_on_reject', default=False,
|
action='store_true', dest='break_on_reject', default=False,
|
||||||
help='Stop the download process when encountering a file that has been filtered out')
|
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(
|
selection.add_option(
|
||||||
'--no-download-archive',
|
'--no-download-archive',
|
||||||
dest='download_archive', action="store_const", const=None,
|
dest='download_archive', action="store_const", const=None,
|
||||||
|
|
Loading…
Reference in a new issue