mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	[extractor/youtube] Construct fragment list lazily
Ref: yt-dlp/yt-dlp/commit/e389d17 See: yt-dlp/yt-dlp#6517
This commit is contained in:
		| @@ -31,6 +31,7 @@ from ..utils import ( | |||||||
|     get_element_by_attribute, |     get_element_by_attribute, | ||||||
|     int_or_none, |     int_or_none, | ||||||
|     js_to_json, |     js_to_json, | ||||||
|  |     LazyList, | ||||||
|     merge_dicts, |     merge_dicts, | ||||||
|     mimetype2ext, |     mimetype2ext, | ||||||
|     parse_codecs, |     parse_codecs, | ||||||
| @@ -1986,9 +1987,19 @@ class YoutubeIE(YoutubeBaseInfoExtractor): | |||||||
|         itags = [] |         itags = [] | ||||||
|         itag_qualities = {} |         itag_qualities = {} | ||||||
|         q = qualities(['tiny', 'small', 'medium', 'large', 'hd720', 'hd1080', 'hd1440', 'hd2160', 'hd2880', 'highres']) |         q = qualities(['tiny', 'small', 'medium', 'large', 'hd720', 'hd1080', 'hd1440', 'hd2160', 'hd2880', 'highres']) | ||||||
|  |         CHUNK_SIZE = 10 << 20 | ||||||
|  |  | ||||||
|         streaming_data = player_response.get('streamingData') or {} |         streaming_data = player_response.get('streamingData') or {} | ||||||
|         streaming_formats = streaming_data.get('formats') or [] |         streaming_formats = streaming_data.get('formats') or [] | ||||||
|         streaming_formats.extend(streaming_data.get('adaptiveFormats') or []) |         streaming_formats.extend(streaming_data.get('adaptiveFormats') or []) | ||||||
|  |  | ||||||
|  |         def build_fragments(f): | ||||||
|  |             return LazyList({ | ||||||
|  |                 'url': update_url_query(f['url'], { | ||||||
|  |                     'range': '{0}-{1}'.format(range_start, min(range_start + CHUNK_SIZE - 1, f['filesize'])) | ||||||
|  |                 }) | ||||||
|  |             } for range_start in range(0, f['filesize'], CHUNK_SIZE)) | ||||||
|  |  | ||||||
|         for fmt in streaming_formats: |         for fmt in streaming_formats: | ||||||
|             if fmt.get('targetDurationSec') or fmt.get('drmFamilies'): |             if fmt.get('targetDurationSec') or fmt.get('drmFamilies'): | ||||||
|                 continue |                 continue | ||||||
| @@ -2048,15 +2059,10 @@ class YoutubeIE(YoutubeBaseInfoExtractor): | |||||||
|             if no_video: |             if no_video: | ||||||
|                 dct['abr'] = tbr |                 dct['abr'] = tbr | ||||||
|             if no_audio or no_video: |             if no_audio or no_video: | ||||||
|                 CHUNK_SIZE = 10 << 20 |  | ||||||
|                 # avoid Youtube throttling |                 # avoid Youtube throttling | ||||||
|                 dct.update({ |                 dct.update({ | ||||||
|                     'protocol': 'http_dash_segments', |                     'protocol': 'http_dash_segments', | ||||||
|                     'fragments': [{ |                     'fragments': build_fragments(dct), | ||||||
|                         'url': update_url_query(dct['url'], { |  | ||||||
|                             'range': '{0}-{1}'.format(range_start, min(range_start + CHUNK_SIZE - 1, dct['filesize'])) |  | ||||||
|                         }) |  | ||||||
|                     } for range_start in range(0, dct['filesize'], CHUNK_SIZE)] |  | ||||||
|                 } if dct['filesize'] else { |                 } if dct['filesize'] else { | ||||||
|                     'downloader_options': {'http_chunk_size': CHUNK_SIZE}  # No longer useful? |                     'downloader_options': {'http_chunk_size': CHUNK_SIZE}  # No longer useful? | ||||||
|                 }) |                 }) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user