Merge branch 'master' into extract_info_rewrite
authorJaime Marquínez Ferrándiz <jaimemf93@gmail.com>
Mon, 4 Mar 2013 21:25:46 +0000 (22:25 +0100)
committerJaime Marquínez Ferrándiz <jaimemf93@gmail.com>
Mon, 4 Mar 2013 21:25:46 +0000 (22:25 +0100)
1  2 
youtube_dl/FileDownloader.py

index f668b362b6c16ff0add504ff16ad860efc420211,57f741c306470ca174cdb0f1681885f8ee4872dc..9b630c123f23d0c54daf56906a92d952904a9455
@@@ -104,7 -104,7 +104,7 @@@ class FileDownloader(object)
          self.params = params
  
          if '%(stitle)s' in self.params['outtmpl']:
-             self.to_stderr(u'WARNING: %(stitle)s is deprecated. Use the %(title)s and the --restrict-filenames flag(which also secures %(uploader)s et al) instead.')
+             self.report_warning(u'%(stitle)s is deprecated. Use the %(title)s and the --restrict-filenames flag(which also secures %(uploader)s et al) instead.')
  
      @staticmethod
      def format_bytes(bytes):
              raise DownloadError(message)
          self._download_retcode = 1
  
+     def report_warning(self, message):
+         '''
+         Print the message to stderr, it will be prefixed with 'WARNING:'
+         If stderr is a tty file the 'WARNING:' will be colored
+         '''
+         if sys.stderr.isatty():
+             _msg_header=u'\033[0;33mWARNING:\033[0m'
+         else:
+             _msg_header=u'WARNING:'
+         warning_message=u'%s %s' % (_msg_header,message)
+         self.to_stderr(warning_message)
      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)
              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:
 +                videos = ie.extract(url)
 +                for video in videos or []:
 +                    if not 'extractor' in video:
 +                        #The extractor has already been set somewher else
 +                        video['extractor'] = ie.IE_NAME
 +                return videos
 +            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_info(self, info_dict):
          """Process a single dictionary returned by an InfoExtractor."""
              raise SameFileError(self.params['outtmpl'])
  
          for url in url_list:
 -            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.report_warning(u'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.')
 +            videos = self.extract_info(url)
  
 -                # Suitable InfoExtractor found
 -                suitable_found = True
 -
 -                # Extract information from URL and process it
 +            for video in videos or []:
                  try:
 -                    videos = ie.extract(url)
 -                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 len(videos or []) > 1 and self.fixed_template():
 -                    raise SameFileError(self.params['outtmpl'])
 -
 -                for video in videos or []:
 -                    video['extractor'] = ie.IE_NAME
 -                    try:
 -                        self.increment_downloads()
 -                        self.process_info(video)
 -                    except UnavailableVideoError:
 -                        self.trouble(u'\nERROR: 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.increment_downloads()
 +                    self.process_info(video)
 +                except UnavailableVideoError:
 +                    self.trouble(u'\nERROR: unable to download video')
  
          return self._download_retcode
  
                  self.to_screen(u'Deleting original file %s (pass -k to keep)' % filename)
                  os.remove(encodeFilename(filename))
              except (IOError, OSError):
-                 self.to_stderr(u'WARNING: Unable to remove downloaded video file')
+                 self.report_warning(u'Unable to remove downloaded video file')
  
      def _download_with_rtmpdump(self, filename, url, player_url, page_url):
          self.report_destination(filename)
  
          # Check for rtmpdump first
          try:
-             subprocess.call(['rtmpdump', '-h'], stdout=(file(os.path.devnull, 'w')), stderr=subprocess.STDOUT)
+             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')
              return False