mirror of
https://github.com/yt-dlp/yt-dlp
synced 2024-12-26 21:59:08 +01:00
[options] Add _set_from_options_callback
This commit is contained in:
parent
86c66b2d3e
commit
31654882e9
3 changed files with 41 additions and 34 deletions
|
@ -273,7 +273,7 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||
--no-mark-watched Do not mark videos watched (default)
|
||||
--no-colors Do not emit color codes in output
|
||||
--compat-options OPTS Options that can help keep compatibility
|
||||
with youtube-dl and youtube-dlc
|
||||
with youtube-dl or youtube-dlc
|
||||
configurations by reverting some of the
|
||||
changes made in yt-dlp. See "Differences in
|
||||
default behavior" for details
|
||||
|
|
|
@ -257,35 +257,7 @@ def _real_main(argv=None):
|
|||
else:
|
||||
date = DateRange(opts.dateafter, opts.datebefore)
|
||||
|
||||
def parse_compat_opts():
|
||||
parsed_compat_opts, compat_opts = set(), opts.compat_opts[::-1]
|
||||
while compat_opts:
|
||||
actual_opt = opt = compat_opts.pop().lower()
|
||||
if opt == 'youtube-dl':
|
||||
compat_opts.extend(['-multistreams', 'all'])
|
||||
elif opt == 'youtube-dlc':
|
||||
compat_opts.extend(['-no-youtube-channel-redirect', '-no-live-chat', 'all'])
|
||||
elif opt == 'all':
|
||||
parsed_compat_opts.update(all_compat_opts)
|
||||
elif opt == '-all':
|
||||
parsed_compat_opts = set()
|
||||
else:
|
||||
if opt[0] == '-':
|
||||
opt = opt[1:]
|
||||
parsed_compat_opts.discard(opt)
|
||||
else:
|
||||
parsed_compat_opts.update([opt])
|
||||
if opt not in all_compat_opts:
|
||||
parser.error('Invalid compatibility option %s' % actual_opt)
|
||||
return parsed_compat_opts
|
||||
|
||||
all_compat_opts = [
|
||||
'filename', 'format-sort', 'abort-on-error', 'format-spec', 'no-playlist-metafiles',
|
||||
'multistreams', 'no-live-chat', 'playlist-index', 'list-formats', 'no-direct-merge',
|
||||
'no-youtube-channel-redirect', 'no-youtube-unavailable-videos', 'no-attach-info-json',
|
||||
'embed-thumbnail-atomicparsley', 'seperate-video-versions', 'no-clean-infojson', 'no-keep-subs',
|
||||
]
|
||||
compat_opts = parse_compat_opts()
|
||||
compat_opts = opts.compat_opts
|
||||
|
||||
def _unused_compat_opt(name):
|
||||
if name not in compat_opts:
|
||||
|
|
|
@ -122,6 +122,30 @@ def parseOpts(overrideArguments=None):
|
|||
parser.values, option.dest,
|
||||
current + value if append is True else value + current)
|
||||
|
||||
def _set_from_options_callback(
|
||||
option, opt_str, value, parser,
|
||||
delim=',', allowed_values=None, process=str.lower, aliases={}):
|
||||
current = getattr(parser.values, option.dest)
|
||||
values = [process(value)] if delim is None else process(value).split(delim)[::-1]
|
||||
while values:
|
||||
actual_val = val = values.pop()
|
||||
if val == 'all':
|
||||
current.update(allowed_values)
|
||||
elif val == '-all':
|
||||
current = set()
|
||||
elif val in aliases:
|
||||
values.extend(aliases[val])
|
||||
else:
|
||||
if val[0] == '-':
|
||||
val = val[1:]
|
||||
current.discard(val)
|
||||
else:
|
||||
current.update([val])
|
||||
if allowed_values is not None and val not in allowed_values:
|
||||
raise optparse.OptionValueError(f'wrong {option.metavar} for {opt_str}: {actual_val}')
|
||||
|
||||
setattr(parser.values, option.dest, current)
|
||||
|
||||
def _dict_from_options_callback(
|
||||
option, opt_str, value, parser,
|
||||
allowed_keys=r'[\w-]+', delimiter=':', default_key=None, process=None, multiple_keys=True):
|
||||
|
@ -241,10 +265,21 @@ def parseOpts(overrideArguments=None):
|
|||
help='Do not emit color codes in output')
|
||||
general.add_option(
|
||||
'--compat-options',
|
||||
metavar='OPTS', dest='compat_opts', default=[],
|
||||
action='callback', callback=_list_from_options_callback, type='str',
|
||||
help=(
|
||||
'Options that can help keep compatibility with youtube-dl and youtube-dlc '
|
||||
metavar='OPTS', dest='compat_opts', default=set(), type='str',
|
||||
action='callback', callback=_set_from_options_callback,
|
||||
callback_kwargs={
|
||||
'allowed_values': {
|
||||
'filename', 'format-sort', 'abort-on-error', 'format-spec', 'no-playlist-metafiles',
|
||||
'multistreams', 'no-live-chat', 'playlist-index', 'list-formats', 'no-direct-merge',
|
||||
'no-youtube-channel-redirect', 'no-youtube-unavailable-videos', 'no-attach-info-json',
|
||||
'embed-thumbnail-atomicparsley', 'seperate-video-versions', 'no-clean-infojson', 'no-keep-subs',
|
||||
},
|
||||
'aliases': {
|
||||
'youtube-dl': ['-multistreams', 'all'],
|
||||
'youtube-dlc': ['-no-youtube-channel-redirect', '-no-live-chat', 'all'],
|
||||
}
|
||||
}, help=(
|
||||
'Options that can help keep compatibility with youtube-dl or youtube-dlc '
|
||||
'configurations by reverting some of the changes made in yt-dlp. '
|
||||
'See "Differences in default behavior" for details'))
|
||||
|
||||
|
|
Loading…
Reference in a new issue