diff options
| author | dirkf <fieldhouse@gmx.net> | 2023-03-11 12:17:00 +0000 | 
|---|---|---|
| committer | dirkf <fieldhouse@gmx.net> | 2023-03-14 16:23:20 +0000 | 
| commit | baa6c5e95cb307e7d716645780ff8aef22de6aca (patch) | |
| tree | 419f4f2cd94ac6f2b3fa8fb60483b8bb933a658c /youtube_dl/downloader/fragment.py | |
| parent | 5c985d4f81a43ada75dafb23233e7fe39913907a (diff) | |
[FragmentFD] Respect `--no-continue`
* discard partial fragment on `--no-continue`
* continue with correct progress display otherwise
Resolves #21467
Diffstat (limited to 'youtube_dl/downloader/fragment.py')
| -rw-r--r-- | youtube_dl/downloader/fragment.py | 46 | 
1 files changed, 31 insertions, 15 deletions
| diff --git a/youtube_dl/downloader/fragment.py b/youtube_dl/downloader/fragment.py index 35c76feba..913e91b64 100644 --- a/youtube_dl/downloader/fragment.py +++ b/youtube_dl/downloader/fragment.py @@ -71,7 +71,7 @@ class FragmentFD(FileDownloader):      @staticmethod      def __do_ytdl_file(ctx): -        return not ctx['live'] and not ctx['tmpfilename'] == '-' +        return ctx['live'] is not True and ctx['tmpfilename'] != '-'      def _read_ytdl_file(self, ctx):          assert 'ytdl_corrupt' not in ctx @@ -101,6 +101,13 @@ class FragmentFD(FileDownloader):              'url': frag_url,              'http_headers': headers or info_dict.get('http_headers'),          } +        frag_resume_len = 0 +        if ctx['dl'].params.get('continuedl', True): +            frag_resume_len = self.filesize_or_none( +                self.temp_name(fragment_filename)) +        fragment_info_dict['frag_resume_len'] = frag_resume_len +        ctx['frag_resume_len'] = frag_resume_len or 0 +          success = ctx['dl'].download(fragment_filename, fragment_info_dict)          if not success:              return False, None @@ -124,9 +131,7 @@ class FragmentFD(FileDownloader):              del ctx['fragment_filename_sanitized']      def _prepare_frag_download(self, ctx): -        if 'live' not in ctx: -            ctx['live'] = False -        if not ctx['live']: +        if not ctx.setdefault('live', False):              total_frags_str = '%d' % ctx['total_frags']              ad_frags = ctx.get('ad_frags', 0)              if ad_frags: @@ -136,10 +141,11 @@ class FragmentFD(FileDownloader):          self.to_screen(              '[%s] Total fragments: %s' % (self.FD_NAME, total_frags_str))          self.report_destination(ctx['filename']) +        continuedl = self.params.get('continuedl', True)          dl = HttpQuietDownloader(              self.ydl,              { -                'continuedl': True, +                'continuedl': continuedl,                  'quiet': True,                  'noprogress': True,                  'ratelimit': self.params.get('ratelimit'), @@ -150,12 +156,11 @@ class FragmentFD(FileDownloader):          )          tmpfilename = self.temp_name(ctx['filename'])          open_mode = 'wb' -        resume_len = 0          # Establish possible resume length -        if os.path.isfile(encodeFilename(tmpfilename)): +        resume_len = self.filesize_or_none(tmpfilename) or 0 +        if resume_len > 0:              open_mode = 'ab' -            resume_len = os.path.getsize(encodeFilename(tmpfilename))          # Should be initialized before ytdl file check          ctx.update({ @@ -164,7 +169,8 @@ class FragmentFD(FileDownloader):          })          if self.__do_ytdl_file(ctx): -            if os.path.isfile(encodeFilename(self.ytdl_filename(ctx['filename']))): +            ytdl_file_exists = os.path.isfile(encodeFilename(self.ytdl_filename(ctx['filename']))) +            if continuedl and ytdl_file_exists:                  self._read_ytdl_file(ctx)                  is_corrupt = ctx.get('ytdl_corrupt') is True                  is_inconsistent = ctx['fragment_index'] > 0 and resume_len == 0 @@ -178,7 +184,12 @@ class FragmentFD(FileDownloader):                      if 'ytdl_corrupt' in ctx:                          del ctx['ytdl_corrupt']                      self._write_ytdl_file(ctx) +              else: +                if not continuedl: +                    if ytdl_file_exists: +                        self._read_ytdl_file(ctx) +                    ctx['fragment_index'] = resume_len = 0                  self._write_ytdl_file(ctx)                  assert ctx['fragment_index'] == 0 @@ -209,6 +220,7 @@ class FragmentFD(FileDownloader):          start = time.time()          ctx.update({              'started': start, +            'fragment_started': start,              # Amount of fragment's bytes downloaded by the time of the previous              # frag progress hook invocation              'prev_frag_downloaded_bytes': 0, @@ -218,6 +230,9 @@ class FragmentFD(FileDownloader):              if s['status'] not in ('downloading', 'finished'):                  return +            if not total_frags and ctx.get('fragment_count'): +                state['fragment_count'] = ctx['fragment_count'] +              time_now = time.time()              state['elapsed'] = time_now - start              frag_total_bytes = s.get('total_bytes') or 0 @@ -232,16 +247,17 @@ class FragmentFD(FileDownloader):                  ctx['fragment_index'] = state['fragment_index']                  state['downloaded_bytes'] += frag_total_bytes - ctx['prev_frag_downloaded_bytes']                  ctx['complete_frags_downloaded_bytes'] = state['downloaded_bytes'] +                ctx['speed'] = state['speed'] = self.calc_speed( +                    ctx['fragment_started'], time_now, frag_total_bytes) +                ctx['fragment_started'] = time.time()                  ctx['prev_frag_downloaded_bytes'] = 0              else:                  frag_downloaded_bytes = s['downloaded_bytes']                  state['downloaded_bytes'] += frag_downloaded_bytes - ctx['prev_frag_downloaded_bytes'] +                ctx['speed'] = state['speed'] = self.calc_speed( +                    ctx['fragment_started'], time_now, frag_downloaded_bytes - ctx['frag_resume_len'])                  if not ctx['live']: -                    state['eta'] = self.calc_eta( -                        start, time_now, estimated_size - resume_len, -                        state['downloaded_bytes'] - resume_len) -                state['speed'] = s.get('speed') or ctx.get('speed') -                ctx['speed'] = state['speed'] +                    state['eta'] = self.calc_eta(state['speed'], estimated_size - state['downloaded_bytes'])                  ctx['prev_frag_downloaded_bytes'] = frag_downloaded_bytes              self._hook_progress(state) @@ -268,7 +284,7 @@ class FragmentFD(FileDownloader):                          os.utime(ctx['filename'], (time.time(), filetime))                      except Exception:                          pass -            downloaded_bytes = os.path.getsize(encodeFilename(ctx['filename'])) +            downloaded_bytes = self.filesize_or_none(ctx['filename']) or 0          self._hook_progress({              'downloaded_bytes': downloaded_bytes, | 
