diff options
Diffstat (limited to 'youtube_dl/YoutubeDL.py')
| -rwxr-xr-x | youtube_dl/YoutubeDL.py | 50 | 
1 files changed, 32 insertions, 18 deletions
| diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index d7c6db0ff..4fa2223ad 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -4,8 +4,10 @@  from __future__ import absolute_import, unicode_literals  import collections +import contextlib  import datetime  import errno +import fileinput  import io  import itertools  import json @@ -52,12 +54,14 @@ from .utils import (      MaxDownloadsReached,      PagedList,      parse_filesize, +    PerRequestProxyHandler,      PostProcessingError,      platform_name,      preferredencoding,      render_table,      SameFileError,      sanitize_filename, +    sanitize_path,      std_headers,      subtitles_filename,      takewhile_inclusive, @@ -181,6 +185,8 @@ class YoutubeDL(object):      prefer_insecure:   Use HTTP instead of HTTPS to retrieve information.                         At the moment, this is only supported by YouTube.      proxy:             URL of the proxy server to use +    cn_verification_proxy:  URL of the proxy to use for IP address verification +                       on Chinese sites. (Experimental)      socket_timeout:    Time to wait for unresponsive hosts, in seconds      bidi_workaround:   Work around buggy terminals without bidirectional text                         support, using fridibi @@ -247,10 +253,10 @@ class YoutubeDL(object):      hls_prefer_native: Use the native HLS downloader instead of ffmpeg/avconv.      The following parameters are not used by YoutubeDL itself, they are used by -    the FileDownloader: +    the downloader (see youtube_dl/downloader/common.py):      nopart, updatetime, buffersize, ratelimit, min_filesize, max_filesize, test,      noresizebuffer, retries, continuedl, noprogress, consoletitle, -    xattr_set_filesize. +    xattr_set_filesize, external_downloader_args.      The following options are used by the post processors:      prefer_ffmpeg:     If True, use ffmpeg instead of avconv if both are available, @@ -317,8 +323,10 @@ class YoutubeDL(object):                  'Set the LC_ALL environment variable to fix this.')              self.params['restrictfilenames'] = True -        if '%(stitle)s' in self.params.get('outtmpl', ''): -            self.report_warning('%(stitle)s is deprecated. Use the %(title)s and the --restrict-filenames flag(which also secures %(uploader)s et al) instead.') +        if isinstance(params.get('outtmpl'), bytes): +            self.report_warning( +                'Parameter outtmpl is bytes, but should be a unicode string. ' +                'Put  from __future__ import unicode_literals  at the top of your code file or consider switching to Python 3.x.')          self._setup_opener() @@ -557,7 +565,7 @@ class YoutubeDL(object):                                   if v is not None)              template_dict = collections.defaultdict(lambda: 'NA', template_dict) -            outtmpl = self.params.get('outtmpl', DEFAULT_OUTTMPL) +            outtmpl = sanitize_path(self.params.get('outtmpl', DEFAULT_OUTTMPL))              tmpl = compat_expanduser(outtmpl)              filename = tmpl % template_dict              # Temporary fix for #4787 @@ -624,7 +632,7 @@ class YoutubeDL(object):          Returns a list with a dictionary for each video we find.          If 'download', also downloads the videos.          extra_info is a dict containing the extra values to add to each result -         ''' +        '''          if ie_key:              ies = [self.get_info_extractor(ie_key)] @@ -1080,8 +1088,7 @@ class YoutubeDL(object):          if req_format is None:              req_format = 'best'          formats_to_download = [] -        # The -1 is for supporting YoutubeIE -        if req_format in ('-1', 'all'): +        if req_format == 'all':              formats_to_download = formats          else:              for rfstr in req_format.split(','): @@ -1208,9 +1215,6 @@ class YoutubeDL(object):          if len(info_dict['title']) > 200:              info_dict['title'] = info_dict['title'][:197] + '...' -        # Keep for backwards compatibility -        info_dict['stitle'] = info_dict['title'] -          if 'format' not in info_dict:              info_dict['format'] = info_dict['ext'] @@ -1256,7 +1260,7 @@ class YoutubeDL(object):              return          try: -            dn = os.path.dirname(encodeFilename(filename)) +            dn = os.path.dirname(sanitize_path(encodeFilename(filename)))              if dn and not os.path.exists(dn):                  os.makedirs(dn)          except (OSError, IOError) as err: @@ -1452,8 +1456,11 @@ class YoutubeDL(object):          return self._download_retcode      def download_with_info_file(self, info_filename): -        with io.open(info_filename, 'r', encoding='utf-8') as f: -            info = json.load(f) +        with contextlib.closing(fileinput.FileInput( +                [info_filename], mode='r', +                openhook=fileinput.hook_encoded('utf-8'))) as f: +            # FileInput doesn't have a read method, we can't call json.load +            info = json.loads('\n'.join(f))          try:              self.process_ie_result(info, download=True)          except DownloadError: @@ -1694,10 +1701,10 @@ class YoutubeDL(object):              out = out.decode().strip()              if re.match('[0-9a-f]+', out):                  self._write_string('[debug] Git HEAD: ' + out + '\n') -        except: +        except Exception:              try:                  sys.exc_clear() -            except: +            except Exception:                  pass          self._write_string('[debug] Python version %s - %s\n' % (              platform.python_version(), platform_name())) @@ -1757,13 +1764,20 @@ class YoutubeDL(object):              # Set HTTPS proxy to HTTP one if given (https://github.com/rg3/youtube-dl/issues/805)              if 'http' in proxies and 'https' not in proxies:                  proxies['https'] = proxies['http'] -        proxy_handler = compat_urllib_request.ProxyHandler(proxies) +        proxy_handler = PerRequestProxyHandler(proxies)          debuglevel = 1 if self.params.get('debug_printtraffic') else 0          https_handler = make_HTTPS_handler(self.params, debuglevel=debuglevel) +        # The ssl context is only available in python 2.7.9 and 3.x +        if hasattr(https_handler, '_context'): +            if len(https_handler._context.get_ca_certs()) == 0: +                self.report_warning( +                    'No ssl certificates were loaded, urls that use https ' +                    'won\'t work')          ydlh = YoutubeDLHandler(self.params, debuglevel=debuglevel)          opener = compat_urllib_request.build_opener( -            https_handler, proxy_handler, cookie_processor, ydlh) +            proxy_handler, https_handler, cookie_processor, ydlh) +          # Delete the default user-agent header, which would otherwise apply in          # cases where our custom HTTP handler doesn't come into play          # (See https://github.com/rg3/youtube-dl/issues/1309 for details) | 
