diff options
Diffstat (limited to 'youtube_dl/downloader/common.py')
| -rw-r--r-- | youtube_dl/downloader/common.py | 118 | 
1 files changed, 70 insertions, 48 deletions
| diff --git a/youtube_dl/downloader/common.py b/youtube_dl/downloader/common.py index 7bb3a948d..b8bf8daf8 100644 --- a/youtube_dl/downloader/common.py +++ b/youtube_dl/downloader/common.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import division, unicode_literals  import os  import re @@ -8,6 +8,7 @@ import time  from ..compat import compat_str  from ..utils import (      encodeFilename, +    decodeArgument,      format_bytes,      timeconvert,  ) @@ -41,7 +42,9 @@ 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.      Subclasses of this one must re-define the real_download method.      """ @@ -54,6 +57,7 @@ class FileDownloader(object):          self.ydl = ydl          self._progress_hooks = []          self.params = params +        self.add_progress_hook(self.report_progress)      @staticmethod      def format_seconds(seconds): @@ -201,7 +205,7 @@ class FileDownloader(object):              return          try:              os.utime(filename, (time.time(), filetime)) -        except: +        except Exception:              pass          return filetime @@ -226,42 +230,64 @@ class FileDownloader(object):              self.to_screen(clear_line + fullmsg, skip_eol=not is_last_line)          self.to_console_title('youtube-dl ' + msg) -    def report_progress(self, percent, data_len_str, speed, eta): -        """Report download progress.""" -        if self.params.get('noprogress', False): +    def report_progress(self, s): +        if s['status'] == 'finished': +            if self.params.get('noprogress', False): +                self.to_screen('[download] Download completed') +            else: +                s['_total_bytes_str'] = format_bytes(s['total_bytes']) +                if s.get('elapsed') is not None: +                    s['_elapsed_str'] = self.format_seconds(s['elapsed']) +                    msg_template = '100%% of %(_total_bytes_str)s in %(_elapsed_str)s' +                else: +                    msg_template = '100%% of %(_total_bytes_str)s' +                self._report_progress_status( +                    msg_template % s, is_last_line=True) + +        if self.params.get('noprogress'):              return -        if eta is not None: -            eta_str = self.format_eta(eta) -        else: -            eta_str = 'Unknown ETA' -        if percent is not None: -            percent_str = self.format_percent(percent) + +        if s['status'] != 'downloading': +            return + +        if s.get('eta') is not None: +            s['_eta_str'] = self.format_eta(s['eta'])          else: -            percent_str = 'Unknown %' -        speed_str = self.format_speed(speed) +            s['_eta_str'] = 'Unknown ETA' -        msg = ('%s of %s at %s ETA %s' % -               (percent_str, data_len_str, speed_str, eta_str)) -        self._report_progress_status(msg) +        if s.get('total_bytes') and s.get('downloaded_bytes') is not None: +            s['_percent_str'] = self.format_percent(100 * s['downloaded_bytes'] / s['total_bytes']) +        elif s.get('total_bytes_estimate') and s.get('downloaded_bytes') is not None: +            s['_percent_str'] = self.format_percent(100 * s['downloaded_bytes'] / s['total_bytes_estimate']) +        else: +            if s.get('downloaded_bytes') == 0: +                s['_percent_str'] = self.format_percent(0) +            else: +                s['_percent_str'] = 'Unknown %' -    def report_progress_live_stream(self, downloaded_data_len, speed, elapsed): -        if self.params.get('noprogress', False): -            return -        downloaded_str = format_bytes(downloaded_data_len) -        speed_str = self.format_speed(speed) -        elapsed_str = FileDownloader.format_seconds(elapsed) -        msg = '%s at %s (%s)' % (downloaded_str, speed_str, elapsed_str) -        self._report_progress_status(msg) - -    def report_finish(self, data_len_str, tot_time): -        """Report download finished.""" -        if self.params.get('noprogress', False): -            self.to_screen('[download] Download completed') +        if s.get('speed') is not None: +            s['_speed_str'] = self.format_speed(s['speed']) +        else: +            s['_speed_str'] = 'Unknown speed' + +        if s.get('total_bytes') is not None: +            s['_total_bytes_str'] = format_bytes(s['total_bytes']) +            msg_template = '%(_percent_str)s of %(_total_bytes_str)s at %(_speed_str)s ETA %(_eta_str)s' +        elif s.get('total_bytes_estimate') is not None: +            s['_total_bytes_estimate_str'] = format_bytes(s['total_bytes_estimate']) +            msg_template = '%(_percent_str)s of ~%(_total_bytes_estimate_str)s at %(_speed_str)s ETA %(_eta_str)s'          else: -            self._report_progress_status( -                ('100%% of %s in %s' % -                 (data_len_str, self.format_seconds(tot_time))), -                is_last_line=True) +            if s.get('downloaded_bytes') is not None: +                s['_downloaded_bytes_str'] = format_bytes(s['downloaded_bytes']) +                if s.get('elapsed'): +                    s['_elapsed_str'] = self.format_seconds(s['elapsed']) +                    msg_template = '%(_downloaded_bytes_str)s at %(_speed_str)s (%(_elapsed_str)s)' +                else: +                    msg_template = '%(_downloaded_bytes_str)s at %(_speed_str)s' +            else: +                msg_template = '%(_percent_str)s % at %(_speed_str)s ETA %(_eta_str)s' + +        self._report_progress_status(msg_template % s)      def report_resuming_byte(self, resume_len):          """Report attempt to resume at given byte.""" @@ -288,18 +314,18 @@ class FileDownloader(object):          """          nooverwrites_and_exists = ( -            self.params.get('nooverwrites', False) -            and os.path.exists(encodeFilename(filename)) +            self.params.get('nooverwrites', False) and +            os.path.exists(encodeFilename(filename))          )          continuedl_and_exists = ( -            self.params.get('continuedl', False) -            and os.path.isfile(encodeFilename(filename)) -            and not self.params.get('nopart', False) +            self.params.get('continuedl', True) and +            os.path.isfile(encodeFilename(filename)) and +            not self.params.get('nopart', False)          )          # 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, @@ -328,19 +354,15 @@ class FileDownloader(object):          # this interface          self._progress_hooks.append(ph) -    def _debug_cmd(self, args, subprocess_encoding, exe=None): +    def _debug_cmd(self, args, exe=None):          if not self.params.get('verbose', False):              return +        str_args = [decodeArgument(a) for a in args] +          if exe is None: -            exe = os.path.basename(args[0]) +            exe = os.path.basename(str_args[0]) -        if subprocess_encoding: -            str_args = [ -                a.decode(subprocess_encoding) if isinstance(a, bytes) else a -                for a in args] -        else: -            str_args = args          try:              import pipes              shell_quote = lambda args: ' '.join(map(pipes.quote, str_args)) | 
