diff --git a/README.md b/README.md index ebfad3781..2da25b200 100644 --- a/README.md +++ b/README.md @@ -303,11 +303,14 @@ ## Download Options: allowing to play the video while downloading (some players may not be able to play it) - --external-downloader COMMAND Use the specified external downloader. - Currently supports - aria2c,avconv,axel,curl,ffmpeg,httpie,wget - --external-downloader-args ARGS Give these arguments to the external - downloader + --external-downloader NAME Use the specified external downloader. + Currently supports aria2c, avconv, axel, + curl, ffmpeg, httpie, wget + --downloader-args NAME:ARGS Give these arguments to the external + downloader. Specify the downloader name and + the arguments separated by a colon ":". You + can use this option multiple times (Alias: + --external-downloader-args) ## Filesystem Options: -a, --batch-file FILE File containing URLs to download ('-' for diff --git a/youtube_dlc/__init__.py b/youtube_dlc/__init__.py index 01b1a347b..c58fb7563 100644 --- a/youtube_dlc/__init__.py +++ b/youtube_dlc/__init__.py @@ -326,9 +326,6 @@ def parse_retries(retries): 'key': 'ExecAfterDownload', 'exec_cmd': opts.exec_cmd, }) - external_downloader_args = None - if opts.external_downloader_args: - external_downloader_args = compat_shlex_split(opts.external_downloader_args) if 'default-compat' in opts.postprocessor_args and 'default' not in opts.postprocessor_args: opts.postprocessor_args.setdefault('sponskrub', []) @@ -466,7 +463,7 @@ def parse_retries(retries): 'ffmpeg_location': opts.ffmpeg_location, 'hls_prefer_native': opts.hls_prefer_native, 'hls_use_mpegts': opts.hls_use_mpegts, - 'external_downloader_args': external_downloader_args, + 'external_downloader_args': opts.external_downloader_args, 'postprocessor_args': opts.postprocessor_args, 'cn_verification_proxy': opts.cn_verification_proxy, 'geo_verification_proxy': opts.geo_verification_proxy, diff --git a/youtube_dlc/downloader/external.py b/youtube_dlc/downloader/external.py index 8cd0511fc..2ae153f4a 100644 --- a/youtube_dlc/downloader/external.py +++ b/youtube_dlc/downloader/external.py @@ -95,7 +95,19 @@ def _valueless_option(self, command_option, param, expected_value=True): return cli_valueless_option(self.params, command_option, param, expected_value) def _configuration_args(self, default=[]): - return cli_configuration_args(self.params, 'external_downloader_args', default) + args = self.params.get('external_downloader_args', {}) + if isinstance(args, (list, tuple)): # for backward compatibility + return args + if args is None: + return default + assert isinstance(args, dict) + + dl_args = args.get(self.get_basename().lower()) + if dl_args is None: + dl_args = args.get('default', default) + assert isinstance(dl_args, (list, tuple)) + return dl_args + def _call_downloader(self, tmpfilename, info_dict): """ Either overwrite this or implement _make_cmd """ diff --git a/youtube_dlc/options.py b/youtube_dlc/options.py index 3e7be1451..cb8e8c06d 100644 --- a/youtube_dlc/options.py +++ b/youtube_dlc/options.py @@ -632,14 +632,19 @@ def _dict_from_multiple_values_options_callback( 'video while downloading (some players may not be able to play it)')) downloader.add_option( '--external-downloader', - dest='external_downloader', metavar='COMMAND', + dest='external_downloader', metavar='NAME', help=( 'Use the specified external downloader. ' - 'Currently supports %s' % ','.join(list_external_downloaders()))) + 'Currently supports %s' % ', '.join(list_external_downloaders()))) downloader.add_option( - '--external-downloader-args', - dest='external_downloader_args', metavar='ARGS', - help='Give these arguments to the external downloader') + '--downloader-args', '--external-downloader-args', + metavar='NAME:ARGS', dest='external_downloader_args', default={}, type='str', + action='callback', callback=_dict_from_multiple_values_options_callback, + callback_kwargs={'default_key': 'default', 'process': compat_shlex_split}, + help=( + 'Give these arguments to the external downloader. ' + 'Specify the downloader name and the arguments separated by a colon ":". ' + 'You can use this option multiple times (Alias: --external-downloader-args)')) workarounds = optparse.OptionGroup(parser, 'Workarounds') workarounds.add_option(