|
|
@ -71,10 +71,10 @@ class FileDownloader(object): |
|
|
|
|
|
|
|
File downloaders accept a lot of parameters. In order not to saturate |
|
|
|
the object constructor with arguments, it receives a dictionary of |
|
|
|
options instead. These options are available through the get_params() |
|
|
|
method for the InfoExtractors to use. The FileDownloader also registers |
|
|
|
itself as the downloader in charge for the InfoExtractors that are |
|
|
|
added to it, so this is a "mutual registration". |
|
|
|
options instead. These options are available through the params |
|
|
|
attribute for the InfoExtractors to use. The FileDownloader also |
|
|
|
registers itself as the downloader in charge for the InfoExtractors |
|
|
|
that are added to it, so this is a "mutual registration". |
|
|
|
|
|
|
|
Available options: |
|
|
|
|
|
|
@ -92,7 +92,7 @@ class FileDownloader(object): |
|
|
|
nooverwrites: Prevent overwriting files. |
|
|
|
""" |
|
|
|
|
|
|
|
_params = None |
|
|
|
params = None |
|
|
|
_ies = [] |
|
|
|
_pps = [] |
|
|
|
|
|
|
@ -100,7 +100,7 @@ class FileDownloader(object): |
|
|
|
"""Create a FileDownloader object with the given options.""" |
|
|
|
self._ies = [] |
|
|
|
self._pps = [] |
|
|
|
self.set_params(params) |
|
|
|
self.params = params |
|
|
|
|
|
|
|
@staticmethod |
|
|
|
def pmkdir(filename): |
|
|
@ -174,16 +174,6 @@ class FileDownloader(object): |
|
|
|
multiplier = 1024.0 ** 'bkmgtpezy'.index(matchobj.group(2).lower()) |
|
|
|
return long(round(number * multiplier)) |
|
|
|
|
|
|
|
def set_params(self, params): |
|
|
|
"""Sets parameters.""" |
|
|
|
if type(params) != dict: |
|
|
|
raise ValueError('params: dictionary expected') |
|
|
|
self._params = params |
|
|
|
|
|
|
|
def get_params(self): |
|
|
|
"""Get parameters.""" |
|
|
|
return self._params |
|
|
|
|
|
|
|
def add_info_extractor(self, ie): |
|
|
|
"""Add an InfoExtractor object to the end of the list.""" |
|
|
|
self._ies.append(ie) |
|
|
@ -196,7 +186,7 @@ class FileDownloader(object): |
|
|
|
|
|
|
|
def to_stdout(self, message, skip_eol=False): |
|
|
|
"""Print message to stdout if not in quiet mode.""" |
|
|
|
if not self._params.get('quiet', False): |
|
|
|
if not self.params.get('quiet', False): |
|
|
|
print u'%s%s' % (message, [u'\n', u''][skip_eol]), |
|
|
|
sys.stdout.flush() |
|
|
|
|
|
|
@ -206,7 +196,7 @@ class FileDownloader(object): |
|
|
|
|
|
|
|
def fixed_template(self): |
|
|
|
"""Checks if the output template is fixed.""" |
|
|
|
return (re.search(ur'(?u)%\(.+?\)s', self._params['outtmpl']) is None) |
|
|
|
return (re.search(ur'(?u)%\(.+?\)s', self.params['outtmpl']) is None) |
|
|
|
|
|
|
|
def trouble(self, message=None): |
|
|
|
"""Determine action to take when a download problem appears. |
|
|
@ -219,13 +209,13 @@ class FileDownloader(object): |
|
|
|
""" |
|
|
|
if message is not None: |
|
|
|
self.to_stderr(message) |
|
|
|
if not self._params.get('ignoreerrors', False): |
|
|
|
if not self.params.get('ignoreerrors', False): |
|
|
|
raise DownloadError(message) |
|
|
|
return 1 |
|
|
|
|
|
|
|
def slow_down(self, start_time, byte_counter): |
|
|
|
"""Sleep if the download speed is over the rate limit.""" |
|
|
|
rate_limit = self._params.get('ratelimit', None) |
|
|
|
rate_limit = self.params.get('ratelimit', None) |
|
|
|
if rate_limit is None or byte_counter == 0: |
|
|
|
return |
|
|
|
now = time.time() |
|
|
@ -253,7 +243,7 @@ class FileDownloader(object): |
|
|
|
"""Download a given list of URLs.""" |
|
|
|
retcode = 0 |
|
|
|
if len(url_list) > 1 and self.fixed_template(): |
|
|
|
raise SameFileError(self._params['outtmpl']) |
|
|
|
raise SameFileError(self.params['outtmpl']) |
|
|
|
|
|
|
|
for url in url_list: |
|
|
|
suitable_found = False |
|
|
@ -268,26 +258,26 @@ class FileDownloader(object): |
|
|
|
retcode = self.trouble() |
|
|
|
|
|
|
|
if len(results) > 1 and self.fixed_template(): |
|
|
|
raise SameFileError(self._params['outtmpl']) |
|
|
|
raise SameFileError(self.params['outtmpl']) |
|
|
|
|
|
|
|
for result in results: |
|
|
|
# Forced printings |
|
|
|
if self._params.get('forcetitle', False): |
|
|
|
if self.params.get('forcetitle', False): |
|
|
|
print result['title'] |
|
|
|
if self._params.get('forceurl', False): |
|
|
|
if self.params.get('forceurl', False): |
|
|
|
print result['url'] |
|
|
|
|
|
|
|
# Do nothing else if in simulate mode |
|
|
|
if self._params.get('simulate', False): |
|
|
|
if self.params.get('simulate', False): |
|
|
|
continue |
|
|
|
|
|
|
|
try: |
|
|
|
filename = self._params['outtmpl'] % result |
|
|
|
filename = self.params['outtmpl'] % result |
|
|
|
self.report_destination(filename) |
|
|
|
except (ValueError, KeyError), err: |
|
|
|
retcode = self.trouble('ERROR: invalid output template or system charset: %s' % str(err)) |
|
|
|
continue |
|
|
|
if self._params['nooverwrites'] and os.path.exists(filename): |
|
|
|
if self.params['nooverwrites'] and os.path.exists(filename): |
|
|
|
self.to_stderr('WARNING: file exists: %s; skipping' % filename) |
|
|
|
continue |
|
|
|
try: |
|
|
@ -417,7 +407,7 @@ class InfoExtractor(object): |
|
|
|
|
|
|
|
def to_stdout(self, message): |
|
|
|
"""Print message to stdout if downloader is not in quiet mode.""" |
|
|
|
if self._downloader is None or not self._downloader.get_params().get('quiet', False): |
|
|
|
if self._downloader is None or not self._downloader.params.get('quiet', False): |
|
|
|
print message |
|
|
|
|
|
|
|
def to_stderr(self, message): |
|
|
@ -475,7 +465,7 @@ class YoutubeIE(InfoExtractor): |
|
|
|
|
|
|
|
username = None |
|
|
|
password = None |
|
|
|
downloader_params = self._downloader.get_params() |
|
|
|
downloader_params = self._downloader.params |
|
|
|
|
|
|
|
# Attempt to use provided username and password or .netrc data |
|
|
|
if downloader_params.get('username', None) is not None: |
|
|
@ -549,7 +539,7 @@ class YoutubeIE(InfoExtractor): |
|
|
|
# Downloader parameters |
|
|
|
format_param = None |
|
|
|
if self._downloader is not None: |
|
|
|
params = self._downloader.get_params() |
|
|
|
params = self._downloader.params |
|
|
|
format_param = params.get('format', None) |
|
|
|
|
|
|
|
# Extension |
|
|
@ -895,7 +885,7 @@ class PostProcessor(object): |
|
|
|
|
|
|
|
def to_stdout(self, message): |
|
|
|
"""Print message to stdout if downloader is not in quiet mode.""" |
|
|
|
if self._downloader is None or not self._downloader.get_params().get('quiet', False): |
|
|
|
if self._downloader is None or not self._downloader.params.get('quiet', False): |
|
|
|
print message |
|
|
|
|
|
|
|
def to_stderr(self, message): |
|
|
|
xxxxxxxxxx