diff options
| -rwxr-xr-x | youtube_dl/YoutubeDL.py | 4 | ||||
| -rw-r--r-- | youtube_dl/__init__.py | 5 | ||||
| -rw-r--r-- | youtube_dl/downloader/common.py | 2 | ||||
| -rw-r--r-- | youtube_dl/downloader/external.py | 15 | ||||
| -rw-r--r-- | youtube_dl/options.py | 6 | 
5 files changed, 26 insertions, 6 deletions
diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 15367c4e3..e0baa9872 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -249,10 +249,10 @@ class YoutubeDL(object):      hls_prefer_native: Use the native HLS downloader instead of ffmpeg/avconv.      The following parameters are not used by YoutubeDL itself, they are used by -    the FileDownloader: +    the downloader (see youtube_dl/downloader/common.py):      nopart, updatetime, buffersize, ratelimit, min_filesize, max_filesize, test,      noresizebuffer, retries, continuedl, noprogress, consoletitle, -    xattr_set_filesize. +    xattr_set_filesize, external_downloader_args.      The following options are used by the post processors:      prefer_ffmpeg:     If True, use ffmpeg instead of avconv if both are available, diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 49f382695..6056da1be 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -9,6 +9,7 @@ import codecs  import io  import os  import random +import shlex  import sys @@ -255,6 +256,9 @@ def _real_main(argv=None):              xattr  # Confuse flake8          except ImportError:              parser.error('setting filesize xattr requested but python-xattr is not available') +    external_downloader_args = None +    if opts.external_downloader_args: +        external_downloader_args = shlex.split(opts.external_downloader_args)      match_filter = (          None if opts.match_filter is None          else match_filter_func(opts.match_filter)) @@ -359,6 +363,7 @@ def _real_main(argv=None):          'no_color': opts.no_color,          'ffmpeg_location': opts.ffmpeg_location,          'hls_prefer_native': opts.hls_prefer_native, +        'external_downloader_args': external_downloader_args,      }      with YoutubeDL(ydl_opts) as ydl: diff --git a/youtube_dl/downloader/common.py b/youtube_dl/downloader/common.py index 3ae90021a..8ed5c19a6 100644 --- a/youtube_dl/downloader/common.py +++ b/youtube_dl/downloader/common.py @@ -42,6 +42,8 @@ class FileDownloader(object):      max_filesize:       Skip files larger than this size      xattr_set_filesize: Set ytdl.filesize user xattribute with expected size.                          (experimenatal) +    external_downloader_args:  A list of additional command-line arguments for the +                        external downloader.      Subclasses of this one must re-define the real_download method.      """ diff --git a/youtube_dl/downloader/external.py b/youtube_dl/downloader/external.py index 51c41c704..1673b2382 100644 --- a/youtube_dl/downloader/external.py +++ b/youtube_dl/downloader/external.py @@ -51,6 +51,13 @@ class ExternalFD(FileDownloader):              return []          return [command_option, source_address] +    def _configuration_args(self, default=[]): +        ex_args = self.params.get('external_downloader_args') +        if ex_args is None: +            return default +        assert isinstance(ex_args, list) +        return ex_args +      def _call_downloader(self, tmpfilename, info_dict):          """ Either overwrite this or implement _make_cmd """          cmd = self._make_cmd(tmpfilename, info_dict) @@ -79,6 +86,7 @@ class CurlFD(ExternalFD):          for key, val in info_dict['http_headers'].items():              cmd += ['--header', '%s: %s' % (key, val)]          cmd += self._source_address('--interface') +        cmd += self._configuration_args()          cmd += ['--', info_dict['url']]          return cmd @@ -89,15 +97,16 @@ class WgetFD(ExternalFD):          for key, val in info_dict['http_headers'].items():              cmd += ['--header', '%s: %s' % (key, val)]          cmd += self._source_address('--bind-address') +        cmd += self._configuration_args()          cmd += ['--', info_dict['url']]          return cmd  class Aria2cFD(ExternalFD):      def _make_cmd(self, tmpfilename, info_dict): -        cmd = [ -            self.exe, '-c', -            '--min-split-size', '1M', '--max-connection-per-server', '4'] +        cmd = [self.exe, '-c'] +        cmd += self._configuration_args([ +            '--min-split-size', '1M', '--max-connection-per-server', '4'])          dn = os.path.dirname(tmpfilename)          if dn:              cmd += ['--dir', dn] diff --git a/youtube_dl/options.py b/youtube_dl/options.py index a2ffe96bc..df2be7b74 100644 --- a/youtube_dl/options.py +++ b/youtube_dl/options.py @@ -435,8 +435,12 @@ def parseOpts(overrideArguments=None):      downloader.add_option(          '--external-downloader',          dest='external_downloader', metavar='COMMAND', -        help='(experimental) Use the specified external downloader. ' +        help='Use the specified external downloader. '               '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.')      workarounds = optparse.OptionGroup(parser, 'Workarounds')      workarounds.add_option(  | 
