mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 06:35:12 +00:00 
			
		
		
		
	[downloader/fragment] Restart download if .ytdl file is corrupt (closes #16312)
This commit is contained in:
		| @@ -74,9 +74,14 @@ class FragmentFD(FileDownloader): | ||||
|         return not ctx['live'] and not ctx['tmpfilename'] == '-' | ||||
|  | ||||
|     def _read_ytdl_file(self, ctx): | ||||
|         assert 'ytdl_corrupt' not in ctx | ||||
|         stream, _ = sanitize_open(self.ytdl_filename(ctx['filename']), 'r') | ||||
|         ctx['fragment_index'] = json.loads(stream.read())['downloader']['current_fragment']['index'] | ||||
|         stream.close() | ||||
|         try: | ||||
|             ctx['fragment_index'] = json.loads(stream.read())['downloader']['current_fragment']['index'] | ||||
|         except Exception: | ||||
|             ctx['ytdl_corrupt'] = True | ||||
|         finally: | ||||
|             stream.close() | ||||
|  | ||||
|     def _write_ytdl_file(self, ctx): | ||||
|         frag_index_stream, _ = sanitize_open(self.ytdl_filename(ctx['filename']), 'w') | ||||
| @@ -158,11 +163,17 @@ class FragmentFD(FileDownloader): | ||||
|         if self.__do_ytdl_file(ctx): | ||||
|             if os.path.isfile(encodeFilename(self.ytdl_filename(ctx['filename']))): | ||||
|                 self._read_ytdl_file(ctx) | ||||
|                 if ctx['fragment_index'] > 0 and resume_len == 0: | ||||
|                 is_corrupt = ctx.get('ytdl_corrupt') is True | ||||
|                 is_inconsistent = ctx['fragment_index'] > 0 and resume_len == 0 | ||||
|                 if is_corrupt or is_inconsistent: | ||||
|                     message = ( | ||||
|                         '.ytdl file is corrupt' if is_corrupt else | ||||
|                         'Inconsistent state of incomplete fragment download') | ||||
|                     self.report_warning( | ||||
|                         'Inconsistent state of incomplete fragment download. ' | ||||
|                         'Restarting from the beginning...') | ||||
|                         '%s. Restarting from the beginning...' % message) | ||||
|                     ctx['fragment_index'] = resume_len = 0 | ||||
|                     if 'ytdl_corrupt' in ctx: | ||||
|                         del ctx['ytdl_corrupt'] | ||||
|                     self._write_ytdl_file(ctx) | ||||
|             else: | ||||
|                 self._write_ytdl_file(ctx) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Sergey M․
					Sergey M․