Merge pull request #3927 from qrtt1/master
authorPhilipp Hagemeister <phihag@phihag.de>
Sat, 13 Dec 2014 11:59:12 +0000 (12:59 +0100)
committerPhilipp Hagemeister <phihag@phihag.de>
Sat, 13 Dec 2014 11:59:12 +0000 (12:59 +0100)
apply ratelimit to f4m

1  2 
youtube_dl/downloader/f4m.py

index 00f3a026c8497953059426e52a6e16c9b0813186,54dd6ac3fc55439f3a5e4b8740331f1593a5ff5f..ef3e0d5f44122621eb9252f93dd1c5471b3fcfee
@@@ -9,12 -9,10 +9,12 @@@ import xml.etree.ElementTree as etre
  
  from .common import FileDownloader
  from .http import HttpFD
 +from ..compat import (
 +    compat_urlparse,
 +)
  from ..utils import (
      struct_pack,
      struct_unpack,
 -    compat_urlparse,
      format_bytes,
      encodeFilename,
      sanitize_open,
@@@ -57,7 -55,7 +57,7 @@@ class FlvReader(io.BytesIO)
          if size == 1:
              real_size = self.read_unsigned_long_long()
              header_end = 16
 -        return real_size, box_type, self.read(real_size-header_end)
 +        return real_size, box_type, self.read(real_size - header_end)
  
      def read_asrt(self):
          # version
@@@ -182,7 -180,7 +182,7 @@@ def build_fragments_list(boot_info)
      n_frags = segment_run_entry[1]
      fragment_run_entry_table = boot_info['fragments'][0]['fragments']
      first_frag_number = fragment_run_entry_table[0]['first']
 -    for (i, frag_number) in zip(range(1, n_frags+1), itertools.count(first_frag_number)):
 +    for (i, frag_number) in zip(range(1, n_frags + 1), itertools.count(first_frag_number)):
          res.append((1, frag_number))
      return res
  
@@@ -227,15 -225,14 +227,16 @@@ class F4mFD(FileDownloader)
          self.to_screen('[download] Downloading f4m manifest')
          manifest = self.ydl.urlopen(man_url).read()
          self.report_destination(filename)
 -        http_dl = HttpQuietDownloader(self.ydl,
 +        http_dl = HttpQuietDownloader(
 +            self.ydl,
              {
                  'continuedl': True,
                  'quiet': True,
                  'noprogress': True,
+                 'ratelimit': self.params.get('ratelimit', None),
                  'test': self.params.get('test', False),
 -            })
 +            }
 +        )
  
          doc = etree.fromstring(manifest)
          formats = [(int(f.attrib.get('bitrate', -1)), f) for f in doc.findall(_add_ns('media'))]
                  lambda f: int(f[0]) == requested_bitrate, formats))[0]
  
          base_url = compat_urlparse.urljoin(man_url, media.attrib['url'])
 -        bootstrap = base64.b64decode(doc.find(_add_ns('bootstrapInfo')).text)
 +        bootstrap_node = doc.find(_add_ns('bootstrapInfo'))
 +        if bootstrap_node.text is None:
 +            bootstrap_url = compat_urlparse.urljoin(
 +                base_url, bootstrap_node.attrib['url'])
 +            bootstrap = self.ydl.urlopen(bootstrap_url).read()
 +        else:
 +            bootstrap = base64.b64decode(bootstrap_node.text)
          metadata = base64.b64decode(media.find(_add_ns('metadata')).text)
          boot_info = read_bootstrap_info(bootstrap)
 +
          fragments_list = build_fragments_list(boot_info)
          if self.params.get('test', False):
              # We only download the first fragment
          def frag_progress_hook(status):
              frag_total_bytes = status.get('total_bytes', 0)
              estimated_size = (state['downloaded_bytes'] +
 -                (total_frags - state['frag_counter']) * frag_total_bytes)
 +                              (total_frags - state['frag_counter']) * frag_total_bytes)
              if status['status'] == 'finished':
                  state['downloaded_bytes'] += frag_total_bytes
                  state['frag_counter'] += 1
                  frag_downloaded_bytes = status['downloaded_bytes']
                  byte_counter = state['downloaded_bytes'] + frag_downloaded_bytes
                  frag_progress = self.calc_percent(frag_downloaded_bytes,
 -                    frag_total_bytes)
 +                                                  frag_total_bytes)
                  progress = self.calc_percent(state['frag_counter'], total_frags)
                  progress += frag_progress / float(total_frags)
  
              eta = self.calc_eta(start, time.time(), estimated_size, byte_counter)
              self.report_progress(progress, format_bytes(estimated_size),
 -                status.get('speed'), eta)
 +                                 status.get('speed'), eta)
          http_dl.add_progress_hook(frag_progress_hook)
  
          frags_filenames = []