def __init__(self):
# No need to wrap help messages if we're on a wide console
max_width = compat_get_terminal_size().columns or 80
- # 47% is chosen because that is how README.md is currently formatted
- # and moving help text even further to the right is undesirable.
- # This can be reduced in the future to get a prettier output
- super().__init__(width=max_width, max_help_position=int(0.47 * max_width))
+ # The % is chosen to get a pretty output in README.md
+ super().__init__(width=max_width, max_help_position=int(0.45 * max_width))
@staticmethod
def format_option_strings(option):
general.add_option(
'--default-search',
dest='default_search', metavar='PREFIX',
- help='Use this prefix for unqualified URLs. For example "gvsearch2:" downloads two videos from google videos for the search term "large apple". Use the value "auto" to let yt-dlp guess ("auto_warning" to emit a warning when guessing). "error" just throws an error. The default value "fixup_error" repairs broken URLs, but emits an error if this is not possible instead of searching')
+ help=(
+ 'Use this prefix for unqualified URLs. '
+ 'Eg: "gvsearch2:python" downloads two videos from google videos for the search term "python". '
+ 'Use the value "auto" to let yt-dlp guess ("auto_warning" to emit a warning when guessing). '
+ '"error" just throws an error. The default value "fixup_error" repairs broken URLs, '
+ 'but emits an error if this is not possible instead of searching'))
general.add_option(
'--ignore-config', '--no-config',
action='store_true', dest='ignoreconfig',
'--config-locations',
dest='config_locations', metavar='PATH', action='append',
help=(
- 'Location of the main configuration file; either the path to the config or its containing directory. '
- 'Can be used multiple times and inside other configuration files'))
+ 'Location of the main configuration file; either the path to the config or its containing directory '
+ '("-" for stdin). Can be used multiple times and inside other configuration files'))
general.add_option(
'--flat-playlist',
action='store_const', dest='extract_flat', const='in_playlist', default=False,
'--proxy', dest='proxy',
default=None, metavar='URL',
help=(
- 'Use the specified HTTP/HTTPS/SOCKS proxy. To enable '
- 'SOCKS proxy, specify a proper scheme. For example '
- 'socks5://user:pass@127.0.0.1:1080/. Pass in an empty string (--proxy "") '
- 'for direct connection'))
+ 'Use the specified HTTP/HTTPS/SOCKS proxy. To enable SOCKS proxy, specify a proper scheme. '
+ 'Eg: socks5://user:pass@127.0.0.1:1080/. Pass in an empty string (--proxy "") for direct connection'))
network.add_option(
'--socket-timeout',
dest='socket_timeout', type=float, default=None, metavar='SECONDS',
'--match-filters',
metavar='FILTER', dest='match_filter', action='append',
help=(
- 'Generic video filter. Any field (see "OUTPUT TEMPLATE") can be compared with a '
+ 'Generic video filter. Any "OUTPUT TEMPLATE" field can be compared with a '
'number or a string using the operators defined in "Filtering formats". '
'You can also simply specify a field to match if the field is present, '
'use "!field" to check if the field is not present, and "&" to check multiple conditions. '
'!is_live --match-filter "like_count>?100 & description~=\'(?i)\\bcats \\& dogs\\b\'" '
'matches only videos that are not live OR those that have a like count more than 100 '
'(or the like field is not available) and also has a description '
- 'that contains the phrase "cats & dogs" (ignoring case). '
+ 'that contains the phrase "cats & dogs" (caseless). '
'Use "--match-filter -" to interactively ask whether to download each video'))
selection.add_option(
'--no-match-filter',
'--client-certificate-password',
dest='client_certificate_password', metavar='PASSWORD',
help='Password for client certificate private key, if encrypted. '
- 'If not provided and the key is encrypted, yt-dlp will ask interactively')
+ 'If not provided, and the key is encrypted, yt-dlp will ask interactively')
video_format = optparse.OptionGroup(parser, 'Video Format Options')
video_format.add_option(
action='store_true', dest='format_sort_force', metavar='FORMAT', default=False,
help=(
'Force user specified sort order to have precedence over all fields, '
- 'see "Sorting Formats" for more details'))
+ 'see "Sorting Formats" for more details (Alias: --S-force)'))
video_format.add_option(
'--no-format-sort-force',
action='store_false', dest='format_sort_force', metavar='FORMAT', default=False,
- help=(
- 'Some fields have precedence over the user specified sort order (default), '
- 'see "Sorting Formats" for more details'))
+ help='Some fields have precedence over the user specified sort order (default)')
video_format.add_option(
'--video-multistreams',
action='store_true', dest='allow_multiple_video_streams', default=None,
subtitles.add_option(
'--sub-format',
action='store', dest='subtitlesformat', metavar='FORMAT', default='best',
- help='Subtitle format, accepts formats preference, for example: "srt" or "ass/srt/best"')
+ help='Subtitle format; accepts formats preference, Eg: "srt" or "ass/srt/best"')
subtitles.add_option(
'--sub-langs', '--srt-langs',
action='callback', dest='subtitleslangs', metavar='LANGS', type='str',
default=[], callback=_list_from_options_callback,
help=(
'Languages of the subtitles to download (can be regex) or "all" separated by commas. (Eg: --sub-langs "en.*,ja") '
- 'You can prefix the language code with a "-" to exempt it from the requested languages. (Eg: --sub-langs all,-live_chat) '
+ 'You can prefix the language code with a "-" to exclude it from the requested languages. (Eg: --sub-langs all,-live_chat) '
'Use --list-subs for a list of available language tags'))
downloader = optparse.OptionGroup(parser, 'Download Options')
'default_key': 'http',
}, help=(
'An expression for the time to sleep between retries in seconds (optionally) prefixed '
- 'by the type of retry (http (default), fragment, file_access) to apply the sleep to. '
- 'EXPR can be a number, or of the forms linear=START[:END[:STEP=1]] or exp=START[:END[:BASE=2]]. '
+ 'by the type of retry (file_access, fragment, http (default)) to apply the sleep to. '
+ 'EXPR can be a number, linear=START[:END[:STEP=1]] or exp=START[:END[:BASE=2]]. '
+ 'This option can be used multiple times to set the sleep for the different retry types. '
'Eg: --retry-sleep linear=1::2 --retry-sleep fragment:exp=1:20'))
downloader.add_option(
'--skip-unavailable-fragments', '--no-abort-on-unavailable-fragment',
action='store_true', dest='skip_unavailable_fragments', default=True,
- help='Skip unavailable fragments for DASH, hlsnative and ISM (default) (Alias: --no-abort-on-unavailable-fragment)')
+ help='Skip unavailable fragments for DASH, hlsnative and ISM downloads (default) (Alias: --no-abort-on-unavailable-fragment)')
downloader.add_option(
'--abort-on-unavailable-fragment', '--no-skip-unavailable-fragments',
action='store_false', dest='skip_unavailable_fragments',
- help='Abort downloading if a fragment is unavailable (Alias: --no-skip-unavailable-fragments)')
+ help='Abort download if a fragment is unavailable (Alias: --no-skip-unavailable-fragments)')
downloader.add_option(
'--keep-fragments',
action='store_true', dest='keep_fragments', default=False,
filesystem.add_option(
'--output-na-placeholder',
dest='outtmpl_na_placeholder', metavar='TEXT', default='NA',
- help=('Placeholder value for unavailable meta fields in output filename template (default: "%default")'))
+ help=('Placeholder for unavailable fields in "OUTPUT TEMPLATE" (default: "%default")'))
filesystem.add_option(
'--autonumber-size',
dest='autonumber_size', metavar='NUMBER', type=int,
postproc.add_option(
'--recode-video',
metavar='FORMAT', dest='recodevideo', default=None,
- help=(
- 'Re-encode the video into another format if re-encoding is necessary. '
- 'The syntax and supported formats are the same as --remux-video'))
+ help='Re-encode the video into another format if necessary. The syntax and supported formats are the same as --remux-video')
postproc.add_option(
'--postprocessor-args', '--ppa',
metavar='NAME:ARGS', dest='postprocessor_args', default={}, type='str',
'--force-keyframes-at-cuts',
action='store_true', dest='force_keyframes_at_cuts', default=False,
help=(
- 'Force keyframes around the chapters before removing/splitting them. '
- 'Requires a re-encode and thus is very slow, but the resulting video '
- 'may have fewer artifacts around the cuts'))
+ 'Force keyframes around chapters when removing/splitting them. '
+ 'The resulting video may have fewer artifacts around the cuts, '
+ 'but is very slow due to needing a re-encode'))
postproc.add_option(
'--no-force-keyframes-at-cuts',
action='store_false', dest='force_keyframes_at_cuts',
'aliases': {'default': ['all']}
}, help=(
'SponsorBlock categories to create chapters for, separated by commas. '
- 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. '
+ f'Available categories are {", ".join(SponsorBlockPP.CATEGORIES.keys())}, all and default (=all). '
+ 'You can prefix the category with a "-" to exclude 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',
'--sponsorblock-chapter-title', metavar='TEMPLATE',
default=DEFAULT_SPONSORBLOCK_CHAPTER_TITLE, dest='sponsorblock_chapter_title',
help=(
- 'The title template for SponsorBlock chapters created by --sponsorblock-mark. '
- 'The same syntax as the output template is used, but the only available fields are '
- 'start_time, end_time, category, categories, name, category_names. Defaults to "%default"'))
+ 'An output template for the title of the SponsorBlock chapters created by --sponsorblock-mark. '
+ 'The only available fields are start_time, end_time, category, categories, name, category_names. '
+ 'Defaults to "%default"'))
sponsorblock.add_option(
'--no-sponsorblock', default=False,
action='store_true', dest='no_sponsorblock',