mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-11 15:29:32 +01:00
[core] Fix filesize_approx
calculation (#9560)
Reverts 22e4dfacb6
Despite being documented as `Kbit/s`, the extractors/manifests were returning bitrates in SI units of kilobits/sec.
Authored by: seproDev, pukkandan
This commit is contained in:
parent
e7b17fce14
commit
86e3b82261
16
README.md
16
README.md
@ -1472,9 +1472,9 @@ ## Filtering Formats
|
|||||||
- `width`: Width of the video, if known
|
- `width`: Width of the video, if known
|
||||||
- `height`: Height of the video, if known
|
- `height`: Height of the video, if known
|
||||||
- `aspect_ratio`: Aspect ratio of the video, if known
|
- `aspect_ratio`: Aspect ratio of the video, if known
|
||||||
- `tbr`: Average bitrate of audio and video in KBit/s
|
- `tbr`: Average bitrate of audio and video in [kbps](## "1000 bits/sec")
|
||||||
- `abr`: Average audio bitrate in KBit/s
|
- `abr`: Average audio bitrate in [kbps](## "1000 bits/sec")
|
||||||
- `vbr`: Average video bitrate in KBit/s
|
- `vbr`: Average video bitrate in [kbps](## "1000 bits/sec")
|
||||||
- `asr`: Audio sampling rate in Hertz
|
- `asr`: Audio sampling rate in Hertz
|
||||||
- `fps`: Frame rate
|
- `fps`: Frame rate
|
||||||
- `audio_channels`: The number of audio channels
|
- `audio_channels`: The number of audio channels
|
||||||
@ -1499,7 +1499,7 @@ ## Filtering Formats
|
|||||||
|
|
||||||
**Note**: None of the aforementioned meta fields are guaranteed to be present since this solely depends on the metadata obtained by particular extractor, i.e. the metadata offered by the website. Any other field made available by the extractor can also be used for filtering.
|
**Note**: None of the aforementioned meta fields are guaranteed to be present since this solely depends on the metadata obtained by particular extractor, i.e. the metadata offered by the website. Any other field made available by the extractor can also be used for filtering.
|
||||||
|
|
||||||
Formats for which the value is not known are excluded unless you put a question mark (`?`) after the operator. You can combine format filters, so `-f "bv[height<=?720][tbr>500]"` selects up to 720p videos (or videos where the height is not known) with a bitrate of at least 500 KBit/s. You can also use the filters with `all` to download all formats that satisfy the filter, e.g. `-f "all[vcodec=none]"` selects all audio-only formats.
|
Formats for which the value is not known are excluded unless you put a question mark (`?`) after the operator. You can combine format filters, so `-f "bv[height<=?720][tbr>500]"` selects up to 720p videos (or videos where the height is not known) with a bitrate of at least 500 kbps. You can also use the filters with `all` to download all formats that satisfy the filter, e.g. `-f "all[vcodec=none]"` selects all audio-only formats.
|
||||||
|
|
||||||
Format selectors can also be grouped using parentheses; e.g. `-f "(mp4,webm)[height<480]"` will download the best pre-merged mp4 and webm formats with a height lower than 480.
|
Format selectors can also be grouped using parentheses; e.g. `-f "(mp4,webm)[height<480]"` will download the best pre-merged mp4 and webm formats with a height lower than 480.
|
||||||
|
|
||||||
@ -1531,10 +1531,10 @@ ## Sorting Formats
|
|||||||
- `fps`: Framerate of video
|
- `fps`: Framerate of video
|
||||||
- `hdr`: The dynamic range of the video (`DV` > `HDR12` > `HDR10+` > `HDR10` > `HLG` > `SDR`)
|
- `hdr`: The dynamic range of the video (`DV` > `HDR12` > `HDR10+` > `HDR10` > `HLG` > `SDR`)
|
||||||
- `channels`: The number of audio channels
|
- `channels`: The number of audio channels
|
||||||
- `tbr`: Total average bitrate in KBit/s
|
- `tbr`: Total average bitrate in [kbps](## "1000 bits/sec")
|
||||||
- `vbr`: Average video bitrate in KBit/s
|
- `vbr`: Average video bitrate in [kbps](## "1000 bits/sec")
|
||||||
- `abr`: Average audio bitrate in KBit/s
|
- `abr`: Average audio bitrate in [kbps](## "1000 bits/sec")
|
||||||
- `br`: Average bitrate in KBit/s, `tbr`/`vbr`/`abr`
|
- `br`: Average bitrate in [kbps](## "1000 bits/sec"), `tbr`/`vbr`/`abr`
|
||||||
- `asr`: Audio sample rate in Hz
|
- `asr`: Audio sample rate in Hz
|
||||||
|
|
||||||
**Deprecation warning**: Many of these fields have (currently undocumented) aliases, that may be removed in a future version. It is recommended to use only the documented field names.
|
**Deprecation warning**: Many of these fields have (currently undocumented) aliases, that may be removed in a future version. It is recommended to use only the documented field names.
|
||||||
|
@ -126,5 +126,9 @@
|
|||||||
"when": "4ce57d3b873c2887814cbec03d029533e82f7db5",
|
"when": "4ce57d3b873c2887814cbec03d029533e82f7db5",
|
||||||
"short": "[ie] Support multi-period MPD streams (#6654)",
|
"short": "[ie] Support multi-period MPD streams (#6654)",
|
||||||
"authors": ["alard", "pukkandan"]
|
"authors": ["alard", "pukkandan"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"action": "remove",
|
||||||
|
"when": "22e4dfacb61f62dfbb3eb41b31c7b69ba1059b80"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -146,6 +146,7 @@
|
|||||||
subtitles_filename,
|
subtitles_filename,
|
||||||
supports_terminal_sequences,
|
supports_terminal_sequences,
|
||||||
system_identifier,
|
system_identifier,
|
||||||
|
filesize_from_tbr,
|
||||||
timetuple_from_msec,
|
timetuple_from_msec,
|
||||||
to_high_limit_path,
|
to_high_limit_path,
|
||||||
traverse_obj,
|
traverse_obj,
|
||||||
@ -2826,9 +2827,8 @@ def is_wellformed(f):
|
|||||||
format['aspect_ratio'] = try_call(lambda: round(format['width'] / format['height'], 2))
|
format['aspect_ratio'] = try_call(lambda: round(format['width'] / format['height'], 2))
|
||||||
# For fragmented formats, "tbr" is often max bitrate and not average
|
# For fragmented formats, "tbr" is often max bitrate and not average
|
||||||
if (('manifest-filesize-approx' in self.params['compat_opts'] or not format.get('manifest_url'))
|
if (('manifest-filesize-approx' in self.params['compat_opts'] or not format.get('manifest_url'))
|
||||||
and info_dict.get('duration') and format.get('tbr')
|
|
||||||
and not format.get('filesize') and not format.get('filesize_approx')):
|
and not format.get('filesize') and not format.get('filesize_approx')):
|
||||||
format['filesize_approx'] = int(info_dict['duration'] * format['tbr'] * (1024 / 8))
|
format['filesize_approx'] = filesize_from_tbr(format.get('tbr'), info_dict.get('duration'))
|
||||||
format['http_headers'] = self._calc_headers(collections.ChainMap(format, info_dict), load_cookies=True)
|
format['http_headers'] = self._calc_headers(collections.ChainMap(format, info_dict), load_cookies=True)
|
||||||
|
|
||||||
# Safeguard against old/insecure infojson when using --load-info-json
|
# Safeguard against old/insecure infojson when using --load-info-json
|
||||||
@ -3878,8 +3878,8 @@ def simplified_codec(f, field):
|
|||||||
delim, (
|
delim, (
|
||||||
format_field(f, 'filesize', ' \t%s', func=format_bytes)
|
format_field(f, 'filesize', ' \t%s', func=format_bytes)
|
||||||
or format_field(f, 'filesize_approx', '≈\t%s', func=format_bytes)
|
or format_field(f, 'filesize_approx', '≈\t%s', func=format_bytes)
|
||||||
or format_field(try_call(lambda: format_bytes(int(info_dict['duration'] * f['tbr'] * (1024 / 8)))),
|
or format_field(filesize_from_tbr(f.get('tbr'), info_dict.get('duration')), None,
|
||||||
None, self._format_out('~\t%s', self.Styles.SUPPRESS))),
|
self._format_out('~\t%s', self.Styles.SUPPRESS), func=format_bytes)),
|
||||||
format_field(f, 'tbr', '\t%dk', func=round),
|
format_field(f, 'tbr', '\t%dk', func=round),
|
||||||
shorten_protocol_name(f.get('protocol', '')),
|
shorten_protocol_name(f.get('protocol', '')),
|
||||||
delim,
|
delim,
|
||||||
|
@ -171,12 +171,12 @@ class InfoExtractor:
|
|||||||
Automatically calculated from width and height
|
Automatically calculated from width and height
|
||||||
* dynamic_range The dynamic range of the video. One of:
|
* dynamic_range The dynamic range of the video. One of:
|
||||||
"SDR" (None), "HDR10", "HDR10+, "HDR12", "HLG, "DV"
|
"SDR" (None), "HDR10", "HDR10+, "HDR12", "HLG, "DV"
|
||||||
* tbr Average bitrate of audio and video in KBit/s
|
* tbr Average bitrate of audio and video in kbps (1000 bits/sec)
|
||||||
* abr Average audio bitrate in KBit/s
|
* abr Average audio bitrate in kbps (1000 bits/sec)
|
||||||
* acodec Name of the audio codec in use
|
* acodec Name of the audio codec in use
|
||||||
* asr Audio sampling rate in Hertz
|
* asr Audio sampling rate in Hertz
|
||||||
* audio_channels Number of audio channels
|
* audio_channels Number of audio channels
|
||||||
* vbr Average video bitrate in KBit/s
|
* vbr Average video bitrate in kbps (1000 bits/sec)
|
||||||
* fps Frame rate
|
* fps Frame rate
|
||||||
* vcodec Name of the video codec in use
|
* vcodec Name of the video codec in use
|
||||||
* container Name of the container format
|
* container Name of the container format
|
||||||
|
@ -3834,7 +3834,7 @@ def build_fragments(f):
|
|||||||
video_id=video_id, only_once=True)
|
video_id=video_id, only_once=True)
|
||||||
throttled = True
|
throttled = True
|
||||||
|
|
||||||
tbr = float_or_none(fmt.get('averageBitrate') or fmt.get('bitrate'), 1024)
|
tbr = float_or_none(fmt.get('averageBitrate') or fmt.get('bitrate'), 1000)
|
||||||
language_preference = (
|
language_preference = (
|
||||||
10 if audio_track.get('audioIsDefault') and 10
|
10 if audio_track.get('audioIsDefault') and 10
|
||||||
else -10 if 'descriptive' in (audio_track.get('displayName') or '').lower() and -10
|
else -10 if 'descriptive' in (audio_track.get('displayName') or '').lower() and -10
|
||||||
|
@ -5415,6 +5415,17 @@ def calculate_preference(self, format):
|
|||||||
return tuple(self._calculate_field_preference(format, field) for field in self._order)
|
return tuple(self._calculate_field_preference(format, field) for field in self._order)
|
||||||
|
|
||||||
|
|
||||||
|
def filesize_from_tbr(tbr, duration):
|
||||||
|
"""
|
||||||
|
@param tbr: Total bitrate in kbps (1000 bits/sec)
|
||||||
|
@param duration: Duration in seconds
|
||||||
|
@returns Filesize in bytes
|
||||||
|
"""
|
||||||
|
if tbr is None or duration is None:
|
||||||
|
return None
|
||||||
|
return int(duration * tbr * (1000 / 8))
|
||||||
|
|
||||||
|
|
||||||
# XXX: Temporary
|
# XXX: Temporary
|
||||||
class _YDLLogger:
|
class _YDLLogger:
|
||||||
def __init__(self, ydl=None):
|
def __init__(self, ydl=None):
|
||||||
|
Loading…
Reference in New Issue
Block a user