mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	[downloader/dash:hls] Respect --fragment-retries and --skip-unavailable-fragments (Closes #10165, closes #10448)
This commit is contained in:
		| @@ -38,6 +38,7 @@ class DashSegmentsFD(FragmentFD): | ||||
|         segments_filenames = [] | ||||
|  | ||||
|         fragment_retries = self.params.get('fragment_retries', 0) | ||||
|         skip_unavailable_fragments = self.params.get('skip_unavailable_fragments', True) | ||||
|  | ||||
|         def append_url_to_file(target_url, tmp_filename, segment_name): | ||||
|             target_filename = '%s-%s' % (tmp_filename, segment_name) | ||||
| @@ -52,19 +53,20 @@ class DashSegmentsFD(FragmentFD): | ||||
|                     down.close() | ||||
|                     segments_filenames.append(target_sanitized) | ||||
|                     break | ||||
|                 except (compat_urllib_error.HTTPError, ) as err: | ||||
|                 except compat_urllib_error.HTTPError: | ||||
|                     # YouTube may often return 404 HTTP error for a fragment causing the | ||||
|                     # whole download to fail. However if the same fragment is immediately | ||||
|                     # retried with the same request data this usually succeeds (1-2 attemps | ||||
|                     # is usually enough) thus allowing to download the whole file successfully. | ||||
|                     # So, we will retry all fragments that fail with 404 HTTP error for now. | ||||
|                     if err.code != 404: | ||||
|                         raise | ||||
|                     # Retry fragment | ||||
|                     # To be future-proof we will retry all fragments that fail with any | ||||
|                     # HTTP error. | ||||
|                     count += 1 | ||||
|                     if count <= fragment_retries: | ||||
|                         self.report_retry_fragment(segment_name, count, fragment_retries) | ||||
|             if count > fragment_retries: | ||||
|                 if skip_unavailable_fragments: | ||||
|                     self.report_skip_fragment(segment_name) | ||||
|                     return | ||||
|                 self.report_error('giving up after %s fragment retries' % fragment_retries) | ||||
|                 return False | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Sergey M․
					Sergey M․