[extractor/youtube] Construct fragment list lazily
Ref: yt-dlp/yt-dlp/commit/e389d17 See: yt-dlp/yt-dlp#6517
This commit is contained in:
parent
f35b757c82
commit
88f28f620b
1 changed files with 12 additions and 6 deletions
|
@ -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?
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue