diff options
Diffstat (limited to 'youtube_dl/YoutubeDL.py')
| -rw-r--r-- | youtube_dl/YoutubeDL.py | 52 | 
1 files changed, 43 insertions, 9 deletions
| diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index c5d08b0bb..5794fdbe9 100644 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -8,6 +8,7 @@ import datetime  import errno  import io  import json +import locale  import os  import platform  import re @@ -94,6 +95,7 @@ class YoutubeDL(object):      usenetrc:          Use netrc for authentication instead.      verbose:           Print additional info to stdout.      quiet:             Do not print messages to stdout. +    no_warnings:       Do not print out anything for warnings.      forceurl:          Force printing final URL.      forcetitle:        Force printing title.      forceid:           Force printing ID. @@ -158,6 +160,7 @@ class YoutubeDL(object):      include_ads:       Download ads as well      default_search:    Prepend this string if an input url is not valid.                         'auto' for elaborate guessing +    encoding:          Use this encoding instead of the system-specified.      The following parameters are not used by YoutubeDL itself, they are used by      the FileDownloader: @@ -376,6 +379,8 @@ class YoutubeDL(object):          if self.params.get('logger') is not None:              self.params['logger'].warning(message)          else: +            if self.params.get('no_warnings'): +                return              if self._err_file.isatty() and os.name != 'nt':                  _msg_header = '\033[0;33mWARNING:\033[0m'              else: @@ -512,13 +517,7 @@ class YoutubeDL(object):                          '_type': 'compat_list',                          'entries': ie_result,                      } -                self.add_extra_info(ie_result, -                    { -                        'extractor': ie.IE_NAME, -                        'webpage_url': url, -                        'webpage_url_basename': url_basename(url), -                        'extractor_key': ie.ie_key(), -                    }) +                self.add_default_extra_info(ie_result, ie, url)                  if process:                      return self.process_ie_result(ie_result, download, extra_info)                  else: @@ -537,6 +536,14 @@ class YoutubeDL(object):          else:              self.report_error('no suitable InfoExtractor for URL %s' % url) +    def add_default_extra_info(self, ie_result, ie, url): +        self.add_extra_info(ie_result, { +            'extractor': ie.IE_NAME, +            'webpage_url': url, +            'webpage_url_basename': url_basename(url), +            'extractor_key': ie.ie_key(), +        }) +      def process_ie_result(self, ie_result, download=True, extra_info={}):          """          Take the result of the ie(may be modified) and resolve all unresolved @@ -695,6 +702,11 @@ class YoutubeDL(object):      def process_video_result(self, info_dict, download=True):          assert info_dict.get('_type', 'video') == 'video' +        if 'id' not in info_dict: +            raise ExtractorError('Missing "id" field in extractor result') +        if 'title' not in info_dict: +            raise ExtractorError('Missing "title" field in extractor result') +          if 'playlist' not in info_dict:              # It isn't part of a playlist              info_dict['playlist'] = None @@ -726,6 +738,9 @@ class YoutubeDL(object):          # We check that all the formats have the format and format_id fields          for i, format in enumerate(formats): +            if 'url' not in format: +                raise ExtractorError('Missing "url" key in result (index %d)' % i) +              if format.get('format_id') is None:                  format['format_id'] = compat_str(i)              if format.get('format') is None: @@ -736,7 +751,7 @@ class YoutubeDL(object):                  )              # Automatically determine file extension if missing              if 'ext' not in format: -                format['ext'] = determine_ext(format['url']) +                format['ext'] = determine_ext(format['url']).lower()          format_limit = self.params.get('format_limit', None)          if format_limit: @@ -861,7 +876,7 @@ class YoutubeDL(object):          try:              dn = os.path.dirname(encodeFilename(filename)) -            if dn != '' and not os.path.exists(dn): +            if dn and not os.path.exists(dn):                  os.makedirs(dn)          except (OSError, IOError) as err:              self.report_error('unable to create directory ' + compat_str(err)) @@ -1195,6 +1210,9 @@ class YoutubeDL(object):      def print_debug_header(self):          if not self.params.get('verbose'):              return + +        write_string('[debug] Encodings: locale %s, fs %s, out %s, pref %s\n' % +                 (locale.getpreferredencoding(), sys.getfilesystemencoding(), sys.stdout.encoding, self.get_encoding()))          write_string('[debug] youtube-dl version ' + __version__ + '\n')          try:              sp = subprocess.Popen( @@ -1259,3 +1277,19 @@ class YoutubeDL(object):          # (See https://github.com/rg3/youtube-dl/issues/1309 for details)          opener.addheaders = []          self._opener = opener + +    def encode(self, s): +        if isinstance(s, bytes): +            return s  # Already encoded + +        try: +            return s.encode(self.get_encoding()) +        except UnicodeEncodeError as err: +            err.reason = err.reason + '. Check your system encoding configuration or use the --encoding option.' +            raise + +    def get_encoding(self): +        encoding = self.params.get('encoding') +        if encoding is None: +            encoding = preferredencoding() +        return encoding | 
