]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/downloader/external.py
1 from __future__
import unicode_literals
6 from .common
import FileDownloader
11 cli_configuration_args
,
17 class ExternalFD(FileDownloader
):
18 def real_download(self
, filename
, info_dict
):
19 self
.report_destination(filename
)
20 tmpfilename
= self
.temp_name(filename
)
22 retval
= self
._call
_downloader
(tmpfilename
, info_dict
)
24 fsize
= os
.path
.getsize(encodeFilename(tmpfilename
))
25 self
.to_screen('\r[%s] Downloaded %s bytes' % (self
.get_basename(), fsize
))
26 self
.try_rename(tmpfilename
, filename
)
28 'downloaded_bytes': fsize
,
36 self
.report_error('%s exited with code %d' % (
37 self
.get_basename(), retval
))
41 def get_basename(cls
):
42 return cls
.__name
__[:-2].lower()
46 return self
.params
.get('external_downloader')
49 def supports(cls
, info_dict
):
50 return info_dict
['protocol'] in ('http', 'https', 'ftp', 'ftps')
52 def _option(self
, command_option
, param
):
53 return cli_option(self
.params
, command_option
, param
)
55 def _bool_option(self
, command_option
, param
, true_value
='true', false_value
='false', separator
=None):
56 return cli_bool_option(self
.params
, command_option
, param
, true_value
, false_value
, separator
)
58 def _valueless_option(self
, command_option
, param
, expected_value
=True):
59 return cli_valueless_option(self
.params
, command_option
, param
, expected_value
)
61 def _configuration_args(self
, default
=[]):
62 return cli_configuration_args(self
.params
, 'external_downloader_args', default
)
64 def _call_downloader(self
, tmpfilename
, info_dict
):
65 """ Either overwrite this or implement _make_cmd """
66 cmd
= [encodeArgument(a
) for a
in self
._make
_cmd
(tmpfilename
, info_dict
)]
71 cmd
, stderr
=subprocess
.PIPE
)
72 _
, stderr
= p
.communicate()
74 self
.to_stderr(stderr
)
78 class CurlFD(ExternalFD
):
79 def _make_cmd(self
, tmpfilename
, info_dict
):
80 cmd
= [self
.exe
, '--location', '-o', tmpfilename
]
81 for key
, val
in info_dict
['http_headers'].items():
82 cmd
+= ['--header', '%s: %s' % (key
, val
)]
83 cmd
+= self
._option
('--interface', 'source_address')
84 cmd
+= self
._option
('--proxy', 'proxy')
85 cmd
+= self
._valueless
_option
('--insecure', 'nocheckcertificate')
86 cmd
+= self
._configuration
_args
()
87 cmd
+= ['--', info_dict
['url']]
91 class AxelFD(ExternalFD
):
92 def _make_cmd(self
, tmpfilename
, info_dict
):
93 cmd
= [self
.exe
, '-o', tmpfilename
]
94 for key
, val
in info_dict
['http_headers'].items():
95 cmd
+= ['-H', '%s: %s' % (key
, val
)]
96 cmd
+= self
._configuration
_args
()
97 cmd
+= ['--', info_dict
['url']]
101 class WgetFD(ExternalFD
):
102 def _make_cmd(self
, tmpfilename
, info_dict
):
103 cmd
= [self
.exe
, '-O', tmpfilename
, '-nv', '--no-cookies']
104 for key
, val
in info_dict
['http_headers'].items():
105 cmd
+= ['--header', '%s: %s' % (key
, val
)]
106 cmd
+= self
._option
('--bind-address', 'source_address')
107 cmd
+= self
._option
('--proxy', 'proxy')
108 cmd
+= self
._valueless
_option
('--no-check-certificate', 'nocheckcertificate')
109 cmd
+= self
._configuration
_args
()
110 cmd
+= ['--', info_dict
['url']]
114 class Aria2cFD(ExternalFD
):
115 def _make_cmd(self
, tmpfilename
, info_dict
):
116 cmd
= [self
.exe
, '-c']
117 cmd
+= self
._configuration
_args
([
118 '--min-split-size', '1M', '--max-connection-per-server', '4'])
119 dn
= os
.path
.dirname(tmpfilename
)
122 cmd
+= ['--out', os
.path
.basename(tmpfilename
)]
123 for key
, val
in info_dict
['http_headers'].items():
124 cmd
+= ['--header', '%s: %s' % (key
, val
)]
125 cmd
+= self
._option
('--interface', 'source_address')
126 cmd
+= self
._option
('--all-proxy', 'proxy')
127 cmd
+= self
._bool
_option
('--check-certificate', 'nocheckcertificate', 'false', 'true', '=')
128 cmd
+= ['--', info_dict
['url']]
132 class HttpieFD(ExternalFD
):
133 def _make_cmd(self
, tmpfilename
, info_dict
):
134 cmd
= ['http', '--download', '--output', tmpfilename
, info_dict
['url']]
135 for key
, val
in info_dict
['http_headers'].items():
136 cmd
+= ['%s:%s' % (key
, val
)]
140 (klass
.get_basename(), klass
)
141 for name
, klass
in globals().items()
142 if name
.endswith('FD') and name
!= 'ExternalFD'
146 def list_external_downloaders():
147 return sorted(_BY_NAME
.keys())
150 def get_external_downloader(external_downloader
):
151 """ Given the name of the executable, see whether we support the given
153 # Drop .exe extension on Windows
154 bn
= os
.path
.splitext(os
.path
.basename(external_downloader
))[0]