diff options
Diffstat (limited to 'youtube_dl/FileDownloader.py')
| -rw-r--r-- | youtube_dl/FileDownloader.py | 69 | 
1 files changed, 49 insertions, 20 deletions
diff --git a/youtube_dl/FileDownloader.py b/youtube_dl/FileDownloader.py index 725d4a016..d82aa2d83 100644 --- a/youtube_dl/FileDownloader.py +++ b/youtube_dl/FileDownloader.py @@ -231,11 +231,21 @@ class FileDownloader(object):              self.to_stderr(message)          if self.params.get('verbose'):              if tb is None: -                tb_data = traceback.format_list(traceback.extract_stack()) -                tb = u''.join(tb_data) +                if sys.exc_info()[0]:  # if .trouble has been called from an except block +                    tb = u'' +                    if hasattr(sys.exc_info()[1], 'exc_info') and sys.exc_info()[1].exc_info[0]: +                        tb += u''.join(traceback.format_exception(*sys.exc_info()[1].exc_info)) +                    tb += compat_str(traceback.format_exc()) +                else: +                    tb_data = traceback.format_list(traceback.extract_stack()) +                    tb = u''.join(tb_data)              self.to_stderr(tb)          if not self.params.get('ignoreerrors', False): -            raise DownloadError(message) +            if sys.exc_info()[0] and hasattr(sys.exc_info()[1], 'exc_info') and sys.exc_info()[1].exc_info[0]: +                exc_info = sys.exc_info()[1].exc_info +            else: +                exc_info = sys.exc_info() +            raise DownloadError(message, exc_info)          self._download_retcode = 1      def report_warning(self, message): @@ -250,6 +260,18 @@ class FileDownloader(object):          warning_message=u'%s %s' % (_msg_header,message)          self.to_stderr(warning_message) +    def report_error(self, message, tb=None): +        ''' +        Do the same as trouble, but prefixes the message with 'ERROR:', colored +        in red if stderr is a tty file. +        ''' +        if sys.stderr.isatty(): +            _msg_header = u'\033[0;31mERROR:\033[0m' +        else: +            _msg_header = u'ERROR:' +        error_message = u'%s %s' % (_msg_header, message) +        self.trouble(error_message, tb) +      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) @@ -281,7 +303,7 @@ class FileDownloader(object):                  return              os.rename(encodeFilename(old_filename), encodeFilename(new_filename))          except (IOError, OSError) as err: -            self.trouble(u'ERROR: unable to rename file') +            self.report_error(u'unable to rename file')      def try_utime(self, filename, last_modified_hdr):          """Try to set the last-modified time of the given file.""" @@ -444,7 +466,7 @@ class FileDownloader(object):              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)) +            self.report_error(u'unable to create directory ' + compat_str(err))              return          if self.params.get('writedescription', False): @@ -454,7 +476,7 @@ class FileDownloader(object):                  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) +                self.report_error(u'Cannot write description file ' + descfn)                  return          if self.params.get('writesubtitles', False) and 'subtitles' in info_dict and info_dict['subtitles']: @@ -469,7 +491,7 @@ class FileDownloader(object):                  with io.open(encodeFilename(sub_filename), 'w', encoding='utf-8') as subfile:                      subfile.write(sub)              except (OSError, IOError): -                self.trouble(u'ERROR: Cannot write subtitles file ' + descfn) +                self.report_error(u'Cannot write subtitles file ' + descfn)                  return              if self.params.get('onlysubtitles', False):                  return  @@ -497,7 +519,7 @@ class FileDownloader(object):                  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) +                self.report_error(u'Cannot write metadata to JSON file ' + infofn)                  return          if not self.params.get('skip_download', False): @@ -509,17 +531,17 @@ class FileDownloader(object):                  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)) +                    self.report_error(u'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)) +                    self.report_error(u'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)) +                    self.report_error(u'postprocessing: %s' % str(err))                      return      def download(self, url_list): @@ -548,9 +570,12 @@ class FileDownloader(object):                  except ExtractorError as de: # An error we somewhat expected                      self.trouble(u'ERROR: ' + compat_str(de), de.format_traceback())                      break +                except MaxDownloadsReached: +                    self.to_screen(u'[info] Maximum number of downloaded files reached.') +                    raise                  except Exception as e:                      if self.params.get('ignoreerrors', False): -                        self.trouble(u'ERROR: ' + compat_str(e), tb=compat_str(traceback.format_exc())) +                        self.report_error(u'' + compat_str(e), tb=compat_str(traceback.format_exc()))                          break                      else:                          raise @@ -564,13 +589,14 @@ class FileDownloader(object):                          self.increment_downloads()                          self.process_info(video)                      except UnavailableVideoError: -                        self.trouble(u'\nERROR: unable to download video') +                        self.to_stderr(u"\n") +                        self.report_error(u'unable to download video')                  # Suitable InfoExtractor had been found; go to next URL                  break              if not suitable_found: -                self.trouble(u'ERROR: no suitable InfoExtractor: %s' % url) +                self.report_error(u'no suitable InfoExtractor: %s' % url)          return self._download_retcode @@ -605,7 +631,7 @@ class FileDownloader(object):          try:              subprocess.call(['rtmpdump', '-h'], stdout=(open(os.path.devnull, 'w')), stderr=subprocess.STDOUT)          except (OSError, IOError): -            self.trouble(u'ERROR: RTMP download detected but "rtmpdump" could not be run') +            self.report_error(u'RTMP download detected but "rtmpdump" could not be run')              return False          # Download using rtmpdump. rtmpdump returns exit code 2 when @@ -650,7 +676,8 @@ class FileDownloader(object):              })              return True          else: -            self.trouble(u'\nERROR: rtmpdump exited with code %d' % retval) +            self.to_stderr(u"\n") +            self.report_error(u'rtmpdump exited with code %d' % retval)              return False      def _do_download(self, filename, info_dict): @@ -750,7 +777,7 @@ class FileDownloader(object):                  self.report_retry(count, retries)          if count > retries: -            self.trouble(u'ERROR: giving up after %s retries' % retries) +            self.report_error(u'giving up after %s retries' % retries)              return False          data_len = data.info().get('Content-length', None) @@ -786,12 +813,13 @@ class FileDownloader(object):                      filename = self.undo_temp_name(tmpfilename)                      self.report_destination(filename)                  except (OSError, IOError) as err: -                    self.trouble(u'ERROR: unable to open for writing: %s' % str(err)) +                    self.report_error(u'unable to open for writing: %s' % str(err))                      return False              try:                  stream.write(data_block)              except (IOError, OSError) as err: -                self.trouble(u'\nERROR: unable to write data: %s' % str(err)) +                self.to_stderr(u"\n") +                self.report_error(u'unable to write data: %s' % str(err))                  return False              if not self.params.get('noresizebuffer', False):                  block_size = self.best_block_size(after - before, len(data_block)) @@ -817,7 +845,8 @@ class FileDownloader(object):              self.slow_down(start, byte_counter - resume_len)          if stream is None: -            self.trouble(u'\nERROR: Did not get any data blocks') +            self.to_stderr(u"\n") +            self.report_error(u'Did not get any data blocks')              return False          stream.close()          self.report_finish()  | 
