diff options
Diffstat (limited to 'youtube_dl/downloader')
| -rw-r--r-- | youtube_dl/downloader/common.py | 8 | ||||
| -rw-r--r-- | youtube_dl/downloader/dash.py | 4 | ||||
| -rw-r--r-- | youtube_dl/downloader/f4m.py | 28 | ||||
| -rw-r--r-- | youtube_dl/downloader/hls.py | 6 | ||||
| -rw-r--r-- | youtube_dl/downloader/http.py | 10 | ||||
| -rw-r--r-- | youtube_dl/downloader/rtmp.py | 4 | 
6 files changed, 36 insertions, 24 deletions
diff --git a/youtube_dl/downloader/common.py b/youtube_dl/downloader/common.py index 97e755d4b..beae8c4d0 100644 --- a/youtube_dl/downloader/common.py +++ b/youtube_dl/downloader/common.py @@ -5,9 +5,9 @@ import re  import sys  import time -from ..compat import compat_str  from ..utils import (      encodeFilename, +    error_to_compat_str,      decodeArgument,      format_bytes,      timeconvert, @@ -42,7 +42,7 @@ class FileDownloader(object):      min_filesize:       Skip files smaller than this size      max_filesize:       Skip files larger than this size      xattr_set_filesize: Set ytdl.filesize user xattribute with expected size. -                        (experimenatal) +                        (experimental)      external_downloader_args:  A list of additional command-line arguments for the                          external downloader. @@ -186,7 +186,7 @@ class FileDownloader(object):                  return              os.rename(encodeFilename(old_filename), encodeFilename(new_filename))          except (IOError, OSError) as err: -            self.report_error('unable to rename file: %s' % compat_str(err)) +            self.report_error('unable to rename file: %s' % error_to_compat_str(err))      def try_utime(self, filename, last_modified_hdr):          """Try to set the last-modified time of the given file.""" @@ -325,7 +325,7 @@ class FileDownloader(object):          )          # Check file already present -        if filename != '-' and nooverwrites_and_exists or continuedl_and_exists: +        if filename != '-' and (nooverwrites_and_exists or continuedl_and_exists):              self.report_file_already_downloaded(filename)              self._hook_progress({                  'filename': filename, diff --git a/youtube_dl/downloader/dash.py b/youtube_dl/downloader/dash.py index 8b6fa2753..535f2a7fc 100644 --- a/youtube_dl/downloader/dash.py +++ b/youtube_dl/downloader/dash.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals  import re  from .common import FileDownloader -from ..compat import compat_urllib_request +from ..utils import sanitized_Request  class DashSegmentsFD(FileDownloader): @@ -22,7 +22,7 @@ class DashSegmentsFD(FileDownloader):          def append_url_to_file(outf, target_url, target_name, remaining_bytes=None):              self.to_screen('[DashSegments] %s: Downloading %s' % (info_dict['id'], target_name)) -            req = compat_urllib_request.Request(target_url) +            req = sanitized_Request(target_url)              if remaining_bytes is not None:                  req.add_header('Range', 'bytes=0-%d' % (remaining_bytes - 1)) diff --git a/youtube_dl/downloader/f4m.py b/youtube_dl/downloader/f4m.py index 174180db5..aaf0c49c8 100644 --- a/youtube_dl/downloader/f4m.py +++ b/youtube_dl/downloader/f4m.py @@ -5,15 +5,17 @@ import io  import itertools  import os  import time -import xml.etree.ElementTree as etree  from .fragment import FragmentFD  from ..compat import ( +    compat_etree_fromstring,      compat_urlparse,      compat_urllib_error, +    compat_urllib_parse_urlparse,  )  from ..utils import (      encodeFilename, +    fix_xml_ampersands,      sanitize_open,      struct_pack,      struct_unpack, @@ -285,9 +287,14 @@ class F4mFD(FragmentFD):          man_url = info_dict['url']          requested_bitrate = info_dict.get('tbr')          self.to_screen('[%s] Downloading f4m manifest' % self.FD_NAME) -        manifest = self.ydl.urlopen(man_url).read() - -        doc = etree.fromstring(manifest) +        urlh = self.ydl.urlopen(man_url) +        man_url = urlh.geturl() +        # Some manifests may be malformed, e.g. prosiebensat1 generated manifests +        # (see https://github.com/rg3/youtube-dl/issues/6215#issuecomment-121704244 +        # and https://github.com/rg3/youtube-dl/issues/7823) +        manifest = fix_xml_ampersands(urlh.read().decode('utf-8', 'ignore')).strip() + +        doc = compat_etree_fromstring(manifest)          formats = [(int(f.attrib.get('bitrate', -1)), f)                     for f in self._get_unencrypted_media(doc)]          if requested_bitrate is None: @@ -329,20 +336,25 @@ class F4mFD(FragmentFD):          if not live:              write_metadata_tag(dest_stream, metadata) +        base_url_parsed = compat_urllib_parse_urlparse(base_url) +          self._start_frag_download(ctx)          frags_filenames = []          while fragments_list:              seg_i, frag_i = fragments_list.pop(0)              name = 'Seg%d-Frag%d' % (seg_i, frag_i) -            url = base_url + name +            query = [] +            if base_url_parsed.query: +                query.append(base_url_parsed.query)              if akamai_pv: -                url += '?' + akamai_pv.strip(';') +                query.append(akamai_pv.strip(';'))              if info_dict.get('extra_param_to_segment_url'): -                url += info_dict.get('extra_param_to_segment_url') +                query.append(info_dict['extra_param_to_segment_url']) +            url_parsed = base_url_parsed._replace(path=base_url_parsed.path + name, query='&'.join(query))              frag_filename = '%s-%s' % (ctx['tmpfilename'], name)              try: -                success = ctx['dl'].download(frag_filename, {'url': url}) +                success = ctx['dl'].download(frag_filename, {'url': url_parsed.geturl()})                  if not success:                      return False                  (down, frag_sanitized) = sanitize_open(frag_filename, 'rb') diff --git a/youtube_dl/downloader/hls.py b/youtube_dl/downloader/hls.py index a62d2047b..b5a3e1167 100644 --- a/youtube_dl/downloader/hls.py +++ b/youtube_dl/downloader/hls.py @@ -13,6 +13,7 @@ from ..utils import (      encodeArgument,      encodeFilename,      sanitize_open, +    handle_youtubedl_headers,  ) @@ -30,12 +31,13 @@ class HlsFD(FileDownloader):          args = [ffpp.executable, '-y'] -        if info_dict['http_headers']: +        if info_dict['http_headers'] and re.match(r'^https?://', url):              # Trailing \r\n after each HTTP header is important to prevent warning from ffmpeg/avconv:              # [http @ 00000000003d2fa0] No trailing CRLF found in HTTP header. +            headers = handle_youtubedl_headers(info_dict['http_headers'])              args += [                  '-headers', -                ''.join('%s: %s\r\n' % (key, val) for key, val in info_dict['http_headers'].items())] +                ''.join('%s: %s\r\n' % (key, val) for key, val in headers.items())]          args += ['-i', url, '-f', 'mp4', '-c', 'copy', '-bsf:a', 'aac_adtstoasc'] diff --git a/youtube_dl/downloader/http.py b/youtube_dl/downloader/http.py index a29f5cf31..56840e026 100644 --- a/youtube_dl/downloader/http.py +++ b/youtube_dl/downloader/http.py @@ -7,14 +7,12 @@ import time  import re  from .common import FileDownloader -from ..compat import ( -    compat_urllib_request, -    compat_urllib_error, -) +from ..compat import compat_urllib_error  from ..utils import (      ContentTooShortError,      encodeFilename,      sanitize_open, +    sanitized_Request,  ) @@ -29,8 +27,8 @@ class HttpFD(FileDownloader):          add_headers = info_dict.get('http_headers')          if add_headers:              headers.update(add_headers) -        basic_request = compat_urllib_request.Request(url, None, headers) -        request = compat_urllib_request.Request(url, None, headers) +        basic_request = sanitized_Request(url, None, headers) +        request = sanitized_Request(url, None, headers)          is_test = self.params.get('test', False) diff --git a/youtube_dl/downloader/rtmp.py b/youtube_dl/downloader/rtmp.py index 7d19bb808..14d56db47 100644 --- a/youtube_dl/downloader/rtmp.py +++ b/youtube_dl/downloader/rtmp.py @@ -105,7 +105,7 @@ class RtmpFD(FileDownloader):          protocol = info_dict.get('rtmp_protocol', None)          real_time = info_dict.get('rtmp_real_time', False)          no_resume = info_dict.get('no_resume', False) -        continue_dl = info_dict.get('continuedl', True) +        continue_dl = self.params.get('continuedl', True)          self.report_destination(filename)          tmpfilename = self.temp_name(filename) @@ -117,7 +117,7 @@ class RtmpFD(FileDownloader):              return False          # Download using rtmpdump. rtmpdump returns exit code 2 when -        # the connection was interrumpted and resuming appears to be +        # the connection was interrupted and resuming appears to be          # possible. This is part of rtmpdump's normal usage, AFAIK.          basic_args = [              'rtmpdump', '--verbose', '-r', url,  | 
