diff options
| author | Philipp Hagemeister <phihag@phihag.de> | 2015-02-17 21:37:48 +0100 | 
|---|---|---|
| committer | Philipp Hagemeister <phihag@phihag.de> | 2015-02-17 21:40:35 +0100 | 
| commit | 5cda4eda7253d766611363a880af46895c11ad17 (patch) | |
| tree | 44bfa0631e6286828fda26eb934df80057bffe35 /youtube_dl/downloader/common.py | |
| parent | 98f000409f072e544d6c3b07809022f703b8b23d (diff) | |
[YoutubeDL] Use a progress hook for progress reporting
Instead of every downloader calling two helper functions, let our progress report be an ordinary progress hook like everyone else's.
Closes #4875.
Diffstat (limited to 'youtube_dl/downloader/common.py')
| -rw-r--r-- | youtube_dl/downloader/common.py | 87 | 
1 files changed, 55 insertions, 32 deletions
diff --git a/youtube_dl/downloader/common.py b/youtube_dl/downloader/common.py index 7bb3a948d..45e55b99c 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 @@ -54,6 +54,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): @@ -226,42 +227,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."""  | 
