mirror of
				https://github.com/ytdl-org/youtube-dl
				synced 2025-10-31 01:33:15 +00:00 
			
		
		
		
	[downloader/fragment] Restart download if .ytdl file is corrupt (closes #16312)
This commit is contained in:
		
							parent
							
								
									7dd6ab4a47
								
							
						
					
					
						commit
						500a86a52e
					
				| @ -74,9 +74,14 @@ class FragmentFD(FileDownloader): | |||||||
|         return not ctx['live'] and not ctx['tmpfilename'] == '-' |         return not ctx['live'] and not ctx['tmpfilename'] == '-' | ||||||
| 
 | 
 | ||||||
|     def _read_ytdl_file(self, ctx): |     def _read_ytdl_file(self, ctx): | ||||||
|  |         assert 'ytdl_corrupt' not in ctx | ||||||
|         stream, _ = sanitize_open(self.ytdl_filename(ctx['filename']), 'r') |         stream, _ = sanitize_open(self.ytdl_filename(ctx['filename']), 'r') | ||||||
|         ctx['fragment_index'] = json.loads(stream.read())['downloader']['current_fragment']['index'] |         try: | ||||||
|         stream.close() |             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): |     def _write_ytdl_file(self, ctx): | ||||||
|         frag_index_stream, _ = sanitize_open(self.ytdl_filename(ctx['filename']), 'w') |         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 self.__do_ytdl_file(ctx): | ||||||
|             if os.path.isfile(encodeFilename(self.ytdl_filename(ctx['filename']))): |             if os.path.isfile(encodeFilename(self.ytdl_filename(ctx['filename']))): | ||||||
|                 self._read_ytdl_file(ctx) |                 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( |                     self.report_warning( | ||||||
|                         'Inconsistent state of incomplete fragment download. ' |                         '%s. Restarting from the beginning...' % message) | ||||||
|                         'Restarting from the beginning...') |  | ||||||
|                     ctx['fragment_index'] = resume_len = 0 |                     ctx['fragment_index'] = resume_len = 0 | ||||||
|  |                     if 'ytdl_corrupt' in ctx: | ||||||
|  |                         del ctx['ytdl_corrupt'] | ||||||
|                     self._write_ytdl_file(ctx) |                     self._write_ytdl_file(ctx) | ||||||
|             else: |             else: | ||||||
|                 self._write_ytdl_file(ctx) |                 self._write_ytdl_file(ctx) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Sergey M․
						Sergey M․