- self.to_screen(u'')
-
- def increment_downloads(self):
- """Increment the ordinal that assigns a number to each file."""
- self._num_downloads += 1
-
- def prepare_filename(self, info_dict):
- """Generate the output filename."""
- try:
- template_dict = dict(info_dict)
-
- template_dict['epoch'] = int(time.time())
- template_dict['autonumber'] = u'%05d' % self._num_downloads
-
- sanitize = lambda k,v: sanitize_filename(
- u'NA' if v is None else compat_str(v),
- restricted=self.params.get('restrictfilenames'),
- is_id=(k==u'id'))
- template_dict = dict((k, sanitize(k, v)) for k,v in template_dict.items())
-
- filename = self.params['outtmpl'] % template_dict
- return filename
- except (ValueError, KeyError) as err:
- self.trouble(u'ERROR: invalid system charset or erroneous output template')
- return None
-
- def _match_entry(self, info_dict):
- """ Returns None iff the file should be downloaded """
-
- title = info_dict['title']
- matchtitle = self.params.get('matchtitle', False)
- if matchtitle:
- if not re.search(matchtitle, title, re.IGNORECASE):
- return u'[download] "' + title + '" title did not match pattern "' + matchtitle + '"'
- rejecttitle = self.params.get('rejecttitle', False)
- if rejecttitle:
- if re.search(rejecttitle, title, re.IGNORECASE):
- return u'"' + title + '" title matched reject pattern "' + rejecttitle + '"'
- return None
-
- def extract_info(self, url):
- '''
- Returns a list with a dictionary for each video we find.
- '''
- suitable_found = False
- for ie in self._ies:
- # Go to next InfoExtractor if not suitable
- if not ie.suitable(url):
- continue
-
- # Warn if the _WORKING attribute is False
- if not ie.working():
- self.to_stderr(u'WARNING: the program functionality for this site has been marked as broken, '
- u'and will probably not work. If you want to go on, use the -i option.')
-
- # Suitable InfoExtractor found
- suitable_found = True
-
- # Extract information from URL and process it
- try:
- ie_results = ie.extract(url)
- results = self.process_ie_results(ie_results, ie)
- return results
- except ExtractorError as de: # An error we somewhat expected
- self.trouble(u'ERROR: ' + compat_str(de), de.format_traceback())
- break
- except Exception as e:
- if self.params.get('ignoreerrors', False):
- self.trouble(u'ERROR: ' + compat_str(e), tb=compat_str(traceback.format_exc()))
- break
- else:
- raise
- if not suitable_found:
- self.trouble(u'ERROR: no suitable InfoExtractor: %s' % url)
- def extract_info_iterable(self, urls):
- '''
- Return the videos founded for the urls
- '''
- results = []
- for url in urls:
- results.extend(self.extract_info(url))
- return results
-
- def process_ie_results(self, ie_results, ie):
- """
- Take the results of the ie and return a list of videos.
- For url elements it will seartch the suitable ie and get the videos
- For playlist elements it will process each of the elements of the 'entries' key
- """
- results = []
- for result in ie_results or []:
- result_type = result.get('_type', 'video') #If not given we suppose it's a video, support the dafault old system
- if result_type == 'video':
- if not 'extractor' in result:
- #The extractor has already been set somewhere else
- result['extractor'] = ie.IE_NAME
- results.append(result)
- elif result_type == 'url':
- #We get the videos pointed by the url
- results.extend(self.extract_info(result['url']))
- elif result_type == 'playlist':
- #We process each entry in the playlist
- entries_result = self.process_ie_results(result['entries'], ie)
- results.extend(entries_result)
- return results
-
- def process_info(self, info_dict):
- """Process a single dictionary returned by an InfoExtractor."""
-
- # Keep for backwards compatibility
- info_dict['stitle'] = info_dict['title']
-
- if not 'format' in info_dict:
- info_dict['format'] = info_dict['ext']
-
- reason = self._match_entry(info_dict)
- if reason is not None:
- self.to_screen(u'[download] ' + reason)
- return
-
- max_downloads = self.params.get('max_downloads')
- if max_downloads is not None:
- if self._num_downloads > int(max_downloads):
- raise MaxDownloadsReached()
-
- filename = self.prepare_filename(info_dict)
-
- # Forced printings
- if self.params.get('forcetitle', False):
- compat_print(info_dict['title'])
- if self.params.get('forceurl', False):
- compat_print(info_dict['url'])
- if self.params.get('forcethumbnail', False) and 'thumbnail' in info_dict:
- compat_print(info_dict['thumbnail'])
- if self.params.get('forcedescription', False) and 'description' in info_dict:
- compat_print(info_dict['description'])
- if self.params.get('forcefilename', False) and filename is not None:
- compat_print(filename)
- if self.params.get('forceformat', False):
- compat_print(info_dict['format'])
-
- # Do nothing else if in simulate mode
- if self.params.get('simulate', False):
- return
-
- if filename is None:
- return
-
- try:
- dn = os.path.dirname(encodeFilename(filename))
- if dn != '' and not os.path.exists(dn): # dn is already encoded
- os.makedirs(dn)
- except (OSError, IOError) as err:
- self.trouble(u'ERROR: unable to create directory ' + compat_str(err))
- return
-
- if self.params.get('writedescription', False):
- try:
- descfn = filename + u'.description'
- self.report_writedescription(descfn)
- with io.open(encodeFilename(descfn), 'w', encoding='utf-8') as descfile:
- descfile.write(info_dict['description'])
- except (OSError, IOError):
- self.trouble(u'ERROR: Cannot write description file ' + descfn)
- return
-
- if self.params.get('writesubtitles', False) and 'subtitles' in info_dict and info_dict['subtitles']:
- # subtitles download errors are already managed as troubles in relevant IE
- # that way it will silently go on when used with unsupporting IE
- try:
- srtfn = filename.rsplit('.', 1)[0] + u'.srt'
- self.report_writesubtitles(srtfn)
- with io.open(encodeFilename(srtfn), 'w', encoding='utf-8') as srtfile:
- srtfile.write(info_dict['subtitles'])
- except (OSError, IOError):
- self.trouble(u'ERROR: Cannot write subtitles file ' + descfn)
- return
-
- if self.params.get('writeinfojson', False):
- infofn = filename + u'.info.json'
- self.report_writeinfojson(infofn)
- try:
- json_info_dict = dict((k, v) for k,v in info_dict.items() if not k in ['urlhandle'])
- write_json_file(json_info_dict, encodeFilename(infofn))
- except (OSError, IOError):
- self.trouble(u'ERROR: Cannot write metadata to JSON file ' + infofn)
- return
-
- if not self.params.get('skip_download', False):
- if self.params.get('nooverwrites', False) and os.path.exists(encodeFilename(filename)):
- success = True
- else:
- try:
- success = self._do_download(filename, info_dict)
- except (OSError, IOError) as err:
- raise UnavailableVideoError()
- except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err:
- self.trouble(u'ERROR: unable to download video data: %s' % str(err))
- return
- except (ContentTooShortError, ) as err:
- self.trouble(u'ERROR: content too short (expected %s bytes and served %s)' % (err.expected, err.downloaded))
- return
-
- if success:
- try:
- self.post_process(filename, info_dict)
- except (PostProcessingError) as err:
- self.trouble(u'ERROR: postprocessing: %s' % str(err))
- return
-
- def download(self, url_list):
- """Download a given list of URLs."""
- if len(url_list) > 1 and self.fixed_template():
- raise SameFileError(self.params['outtmpl'])