'--no-flat-playlist',
action='store_false', dest='extract_flat',
help='Extract the videos of a playlist')
+ general.add_option(
+ '--wait-for-video',
+ dest='wait_for_video', metavar='MIN[-MAX]', default=None,
+ help=(
+ 'Wait for scheduled streams to become available. '
+ 'Pass the minimum number of seconds (or range) to wait between retries'))
+ general.add_option(
+ '--no-wait-for-video',
+ dest='wait_for_video', action='store_const', const=None,
+ help='Do not wait for scheduled streams (default)')
general.add_option(
'--mark-watched',
action='store_true', dest='mark_watched', default=False,
'--reject-title',
dest='rejecttitle', metavar='REGEX',
help=optparse.SUPPRESS_HELP)
- selection.add_option(
- '--max-downloads',
- dest='max_downloads', metavar='NUMBER', type=int, default=None,
- help='Abort after downloading NUMBER files')
selection.add_option(
'--min-filesize',
metavar='SIZE', dest='min_filesize', default=None,
'--download-archive', metavar='FILE',
dest='download_archive',
help='Download only videos not listed in the archive file. Record the IDs of all downloaded videos in it')
+ selection.add_option(
+ '--no-download-archive',
+ dest='download_archive', action="store_const", const=None,
+ help='Do not use archive file (default)')
+ selection.add_option(
+ '--max-downloads',
+ dest='max_downloads', metavar='NUMBER', type=int, default=None,
+ help='Abort after downloading NUMBER files')
selection.add_option(
'--break-on-existing',
action='store_true', dest='break_on_existing', default=False,
'--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,
- help='Do not use archive file (default)')
selection.add_option(
'--include-ads',
dest='include_ads', action='store_true',
filesystem.add_option(
'-a', '--batch-file',
dest='batchfile', metavar='FILE',
- help="File containing URLs to download ('-' for stdin), one URL per line. "
- "Lines starting with '#', ';' or ']' are considered as comments and ignored")
+ help=(
+ 'File containing URLs to download ("-" for stdin), one URL per line. '
+ 'Lines starting with "#", ";" or "]" are considered as comments and ignored'))
filesystem.add_option(
'--no-batch-file',
dest='batchfile', action='store_const', const=None,
filesystem.add_option(
'--cookies',
dest='cookiefile', metavar='FILE',
- help='File to read cookies from and dump cookie jar in')
+ help='Netscape formatted file to read cookies from and dump cookie jar in')
filesystem.add_option(
'--no-cookies',
action='store_const', const=None, dest='cookiefile', metavar='FILE',
thumbnail = optparse.OptionGroup(parser, 'Thumbnail Options')
thumbnail.add_option(
'--write-thumbnail',
- action='store_true', dest='writethumbnail', default=False,
+ action='callback', dest='writethumbnail', default=False,
+ # Should override --no-write-thumbnail, but not --write-all-thumbnail
+ callback=lambda option, _, __, parser: setattr(
+ parser.values, option.dest, getattr(parser.values, option.dest) or True),
help='Write thumbnail image to disk')
thumbnail.add_option(
'--no-write-thumbnail',
help='Do not write thumbnail image to disk (default)')
thumbnail.add_option(
'--write-all-thumbnails',
- action='store_true', dest='write_all_thumbnails', default=False,
+ action='store_const', dest='writethumbnail', const='all',
help='Write all thumbnail image formats to disk')
thumbnail.add_option(
'--list-thumbnails',
'Automatically correct known faults of the file. '
'One of never (do nothing), warn (only emit a warning), '
'detect_or_warn (the default; fix file if we can, warn otherwise), '
- 'force (try fixing even if file already exists'))
+ 'force (try fixing even if file already exists)'))
postproc.add_option(
'--prefer-avconv', '--no-prefer-ffmpeg',
action='store_false', dest='prefer_ffmpeg',
action='store_true', dest='force_keyframes_at_cuts', default=False,
help=(
'Force keyframes around the chapters before removing/splitting them. '
- 'Requires a reencode and thus is very slow, but the resulting video '
+ 'Requires a re-encode and thus is very slow, but the resulting video '
'may have fewer artifacts around the cuts'))
postproc.add_option(
'--no-force-keyframes-at-cuts',
'process': lambda val: dict(_postprocessor_opts_parser(*val.split(':', 1)))
}, help=(
'The (case sensitive) name of plugin postprocessors to be enabled, '
- 'and (optionally) arguments to be passed to it, seperated by a colon ":". '
+ 'and (optionally) arguments to be passed to it, separated by a colon ":". '
'ARGS are a semicolon ";" delimited list of NAME=VALUE. '
'The "when" argument determines when the postprocessor is invoked. '
'It can be one of "pre_process" (after extraction), '
sponsorblock.add_option(
'--sponsorblock-mark', metavar='CATS',
dest='sponsorblock_mark', default=set(), action='callback', type='str',
- callback=_set_from_options_callback, callback_kwargs={'allowed_values': SponsorBlockPP.CATEGORIES.keys()},
- help=(
+ callback=_set_from_options_callback, callback_kwargs={
+ 'allowed_values': SponsorBlockPP.CATEGORIES.keys(),
+ 'aliases': {'default': ['all']}
+ }, help=(
'SponsorBlock categories to create chapters for, separated by commas. '
- 'Available categories are all, %s. You can prefix the category with a "-" to exempt it. '
- 'See https://wiki.sponsor.ajay.app/index.php/Segment_Categories for description of the categories. '
- 'Eg: --sponsorblock-mark all,-preview' % ', '.join(SponsorBlockPP.CATEGORIES.keys())))
+ f'Available categories are all, default(=all), {", ".join(SponsorBlockPP.CATEGORIES.keys())}. '
+ 'You can prefix the category with a "-" to exempt it. See [1] for description of the categories. '
+ 'Eg: --sponsorblock-mark all,-preview [1] https://wiki.sponsor.ajay.app/w/Segment_Categories'))
sponsorblock.add_option(
'--sponsorblock-remove', metavar='CATS',
dest='sponsorblock_remove', default=set(), action='callback', type='str',
- callback=_set_from_options_callback, callback_kwargs={'allowed_values': SponsorBlockPP.CATEGORIES.keys()},
- help=(
+ callback=_set_from_options_callback, callback_kwargs={
+ 'allowed_values': set(SponsorBlockPP.CATEGORIES.keys()) - set(SponsorBlockPP.POI_CATEGORIES.keys()),
+ # Note: From https://wiki.sponsor.ajay.app/w/Types:
+ # The filler category is very aggressive.
+ # It is strongly recommended to not use this in a client by default.
+ 'aliases': {'default': ['all', '-filler']}
+ }, help=(
'SponsorBlock categories to be removed from the video file, separated by commas. '
'If a category is present in both mark and remove, remove takes precedence. '
- 'The syntax and available categories are the same as for --sponsorblock-mark'))
+ 'The syntax and available categories are the same as for --sponsorblock-mark '
+ 'except that "default" refers to "all,-filler" '
+ f'and {", ".join(SponsorBlockPP.POI_CATEGORIES.keys())} is not available'))
sponsorblock.add_option(
'--sponsorblock-chapter-title', metavar='TEMPLATE',
default=DEFAULT_SPONSORBLOCK_CHAPTER_TITLE, dest='sponsorblock_chapter_title',
current_path = os.path.join(path, '%s.conf' % package)
config = _readOptions(current_path, default=None)
if config is not None:
+ current_path = os.path.realpath(current_path)
+ if current_path in paths.values():
+ return False
configs[name], paths[name] = config, current_path
return parser.parse_args(config)[0].ignoreconfig
return False