X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=youtube-dl;h=034da35f54e885ed6307c8b51cdeaba3fdf83fae;hb=147753eb3380137155039cccc0c5c4f0d4b7136d;hp=c526071e5c6f110a5222cec60a236d5865e0c7d0;hpb=c8619e01637ae33ff6ed2a770a6222d792cf0771;p=youtube-dl.git diff --git a/youtube-dl b/youtube-dl index c526071e5..034da35f5 100755 --- a/youtube-dl +++ b/youtube-dl @@ -19,7 +19,7 @@ import urllib import urllib2 std_headers = { - 'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5', + 'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Accept': 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5', 'Accept-Language': 'en-us,en;q=0.5', @@ -95,11 +95,13 @@ class FileDownloader(object): params = None _ies = [] _pps = [] + _download_retcode = None def __init__(self, params): """Create a FileDownloader object with the given options.""" self._ies = [] self._pps = [] + self._download_retcode = 0 self.params = params @staticmethod @@ -203,15 +205,13 @@ class FileDownloader(object): Depending on if the downloader has been configured to ignore download errors or not, this method may throw an exception or - not when errors are found, after printing the message. If it - doesn't raise, it returns an error code suitable to be returned - later as a program exit code to indicate error. + not when errors are found, after printing the message. """ if message is not None: self.to_stderr(message) if not self.params.get('ignoreerrors', False): raise DownloadError(message) - return 1 + self._download_retcode = 1 def slow_down(self, start_time, byte_counter): """Sleep if the download speed is over the rate limit.""" @@ -249,41 +249,45 @@ class FileDownloader(object): # Do nothing else if in simulate mode if self.params.get('simulate', False): - return 0 + return try: filename = self.params['outtmpl'] % info_dict self.report_destination(filename) except (ValueError, KeyError), err: - return self.trouble('ERROR: invalid output template or system charset: %s' % str(err)) + self.trouble('ERROR: invalid output template or system charset: %s' % str(err)) if self.params['nooverwrites'] and os.path.exists(filename): self.to_stderr('WARNING: file exists: %s; skipping' % filename) - return 0 + return try: self.pmkdir(filename) except (OSError, IOError), err: - return self.trouble('ERROR: unable to create directories: %s' % str(err)) + self.trouble('ERROR: unable to create directories: %s' % str(err)) + return try: outstream = open(filename, 'wb') except (OSError, IOError), err: - return self.trouble('ERROR: unable to open for writing: %s' % str(err)) + self.trouble('ERROR: unable to open for writing: %s' % str(err)) + return try: self._do_download(outstream, info_dict['url']) outstream.close() except (OSError, IOError), err: - return self.trouble('ERROR: unable to write video data: %s' % str(err)) + self.trouble('ERROR: unable to write video data: %s' % str(err)) + return except (urllib2.URLError, httplib.HTTPException, socket.error), err: - return self.trouble('ERROR: unable to download video data: %s' % str(err)) + self.trouble('ERROR: unable to download video data: %s' % str(err)) + return try: self.post_process(filename, info_dict) except (PostProcessingError), err: - return self.trouble('ERROR: postprocessing: %s' % str(err)) + self.trouble('ERROR: postprocessing: %s' % str(err)) + return - return 0 + return def download(self, url_list): """Download a given list of URLs.""" - retcode = 0 if len(url_list) > 1 and self.fixed_template(): raise SameFileError(self.params['outtmpl']) @@ -303,7 +307,7 @@ class FileDownloader(object): # See if there were problems extracting any information if len(results) != len(all_results): - retcode = self.trouble() + self.trouble() # Two results could go to the same file if len(results) > 1 and self.fixed_template(): @@ -311,19 +315,15 @@ class FileDownloader(object): # Process each result for result in results: - result = self.process_info(result) - - # Do not overwrite an error code with a success code - if result != 0: - retcode = result + self.process_info(result) # Suitable InfoExtractor had been found; go to next URL break if not suitable_found: - retcode = self.trouble('ERROR: no suitable InfoExtractor: %s' % url) + self.trouble('ERROR: no suitable InfoExtractor: %s' % url) - return retcode + return self._download_retcode def post_process(self, filename, ie_info): """Run the postprocessing chain on the given file.""" @@ -419,15 +419,6 @@ class InfoExtractor(object): """Sets the downloader for this IE.""" self._downloader = downloader - 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.params.get('quiet', False): - print message - - def to_stderr(self, message): - """Print message to stderr.""" - print >>sys.stderr, message - def _real_initialize(self): """Real initialization process. Redefine in subclasses.""" pass @@ -474,27 +465,27 @@ class YoutubeIE(InfoExtractor): def report_lang(self): """Report attempt to set language.""" - self.to_stdout(u'[youtube] Setting language') + self._downloader.to_stdout(u'[youtube] Setting language') def report_login(self): """Report attempt to log in.""" - self.to_stdout(u'[youtube] Logging in') + self._downloader.to_stdout(u'[youtube] Logging in') def report_age_confirmation(self): """Report attempt to confirm age.""" - self.to_stdout(u'[youtube] Confirming age') + self._downloader.to_stdout(u'[youtube] Confirming age') def report_webpage_download(self, video_id): """Report attempt to download webpage.""" - self.to_stdout(u'[youtube] %s: Downloading video webpage' % video_id) + self._downloader.to_stdout(u'[youtube] %s: Downloading video webpage' % video_id) def report_information_extraction(self, video_id): """Report attempt to extract video information.""" - self.to_stdout(u'[youtube] %s: Extracting video information' % video_id) + self._downloader.to_stdout(u'[youtube] %s: Extracting video information' % video_id) def report_video_url(self, video_id, video_real_url): """Report extracted video URL.""" - self.to_stdout(u'[youtube] %s: URL: %s' % (video_id, video_real_url)) + self._downloader.to_stdout(u'[youtube] %s: URL: %s' % (video_id, video_real_url)) def _real_initialize(self): if self._downloader is None: @@ -517,7 +508,7 @@ class YoutubeIE(InfoExtractor): else: raise netrc.NetrcParseError('No authenticators for %s' % self._NETRC_MACHINE) except (IOError, netrc.NetrcParseError), err: - self.to_stderr(u'WARNING: parsing .netrc: %s' % str(err)) + self._downloader.trouble(u'WARNING: parsing .netrc: %s' % str(err)) return # Set language @@ -526,7 +517,7 @@ class YoutubeIE(InfoExtractor): self.report_lang() urllib2.urlopen(request).read() except (urllib2.URLError, httplib.HTTPException, socket.error), err: - self.to_stderr(u'WARNING: unable to set language: %s' % str(err)) + self._downloader.trouble(u'WARNING: unable to set language: %s' % str(err)) return # No authentication to be performed @@ -546,10 +537,10 @@ class YoutubeIE(InfoExtractor): self.report_login() login_results = urllib2.urlopen(request).read() if re.search(r'(?i)