mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-13 02:14:20 +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 @@ ## General Options:
|
||||||
--no-mark-watched Do not mark videos watched (default)
|
--no-mark-watched Do not mark videos watched (default)
|
||||||
--no-colors Do not emit color codes in output
|
--no-colors Do not emit color codes in output
|
||||||
--compat-options OPTS Options that can help keep compatibility
|
--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
|
configurations by reverting some of the
|
||||||
changes made in yt-dlp. See "Differences in
|
changes made in yt-dlp. See "Differences in
|
||||||
default behavior" for details
|
default behavior" for details
|
||||||
|
|
|
@ -257,35 +257,7 @@ def parse_retries(retries, name=''):
|
||||||
else:
|
else:
|
||||||
date = DateRange(opts.dateafter, opts.datebefore)
|
date = DateRange(opts.dateafter, opts.datebefore)
|
||||||
|
|
||||||
def parse_compat_opts():
|
compat_opts = opts.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()
|
|
||||||
|
|
||||||
def _unused_compat_opt(name):
|
def _unused_compat_opt(name):
|
||||||
if name not in compat_opts:
|
if name not in compat_opts:
|
||||||
|
|
|
@ -122,6 +122,30 @@ def _list_from_options_callback(option, opt_str, value, parser, append=True, del
|
||||||
parser.values, option.dest,
|
parser.values, option.dest,
|
||||||
current + value if append is True else value + current)
|
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(
|
def _dict_from_options_callback(
|
||||||
option, opt_str, value, parser,
|
option, opt_str, value, parser,
|
||||||
allowed_keys=r'[\w-]+', delimiter=':', default_key=None, process=None, multiple_keys=True):
|
allowed_keys=r'[\w-]+', delimiter=':', default_key=None, process=None, multiple_keys=True):
|
||||||
|
@ -241,10 +265,21 @@ def _dict_from_options_callback(
|
||||||
help='Do not emit color codes in output')
|
help='Do not emit color codes in output')
|
||||||
general.add_option(
|
general.add_option(
|
||||||
'--compat-options',
|
'--compat-options',
|
||||||
metavar='OPTS', dest='compat_opts', default=[],
|
metavar='OPTS', dest='compat_opts', default=set(), type='str',
|
||||||
action='callback', callback=_list_from_options_callback, type='str',
|
action='callback', callback=_set_from_options_callback,
|
||||||
help=(
|
callback_kwargs={
|
||||||
'Options that can help keep compatibility with youtube-dl and youtube-dlc '
|
'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. '
|
'configurations by reverting some of the changes made in yt-dlp. '
|
||||||
'See "Differences in default behavior" for details'))
|
'See "Differences in default behavior" for details'))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue