|
|
@ -122,6 +122,30 @@ def parseOpts(overrideArguments=None):
|
|
|
|
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 parseOpts(overrideArguments=None):
|
|
|
|
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'))
|
|
|
|
|
|
|
|
|
|
|
|