feat(FormatUtils): choose more specific format by itag or codec (#884)

This commit is contained in:
Loyalsoldier
2025-01-29 02:43:09 +08:00
committed by GitHub
parent 424c65356c
commit 1c1577e85f
2 changed files with 13 additions and 1 deletions

View File

@@ -5,6 +5,10 @@ export type URLTransformer = (url: URL) => URL;
export type FormatFilter = (format: Format) => boolean;
export interface FormatOptions {
/**
* Video or audio itag
*/
itag?: number;
/**
* Video quality; 360p, 720p, 1080p, etc... also accepts 'best' and 'bestefficiency'.
*/
@@ -21,6 +25,10 @@ export interface FormatOptions {
* File format, use 'any' to download any format
*/
format?: string;
/**
* Video or audio codec, e.g. 'avc', 'vp9', 'av01' for video, 'opus', 'mp4a' for audio
*/
codec?: string;
/**
* InnerTube client.
*/
@@ -35,4 +43,4 @@ export interface DownloadOptions extends FormatOptions {
start: number;
end: number;
}
}
}

View File

@@ -155,10 +155,14 @@ export function chooseFormat(options: FormatOptions, streaming_data?: IStreaming
const use_most_efficient = quality !== 'best';
let candidates = formats.filter((format) => {
if (options.itag && format.itag !== options.itag)
return false;
if (requires_audio && !format.has_audio)
return false;
if (requires_video && !format.has_video)
return false;
if (options.codec && !format.mime_type.includes(options.codec))
return false;
if (options.format !== 'any' && !format.mime_type.includes(options.format || 'mp4'))
return false;
if (!is_best && format.quality_label !== quality)