fix(dl): avoid selecting all variants when multiple audio codecs requested

When --a-lang is specific (not best/all) and multiple codecs are requested via -a/--acodec, select only the best-bitrate track per codec per language (plus descriptive if --audio-description).

Blame: regression introduced by 939ca25 (fix(dl): keep descriptive and standard audio for requested langs).
This commit is contained in:
Andy
2026-02-07 19:37:48 -07:00
parent 6c83790834
commit d404f213b1

View File

@@ -1484,22 +1484,54 @@ class dl:
selected_audio.append(max(base_candidates, key=lambda x: x.bitrate or 0)) selected_audio.append(max(base_candidates, key=lambda x: x.bitrate or 0))
title.tracks.audio = selected_audio title.tracks.audio = selected_audio
elif "all" not in processed_lang: elif "all" not in processed_lang:
per_language = 0 if acodec and len(acodec) > 1 else 1 # If multiple codecs were explicitly requested, pick the best track per codec per
if audio_description: # requested language instead of selecting *all* bitrate variants of a codec.
standard_audio = [a for a in title.tracks.audio if not a.descriptive] if acodec and len(acodec) > 1:
selected_standards = title.tracks.by_language( selected_audio: list[Audio] = []
standard_audio, processed_lang, per_language=per_language, exact_match=exact_lang
) for language in processed_lang:
desc_audio = [a for a in title.tracks.audio if a.descriptive] for codec in acodec:
# Include all descriptive tracks for the requested languages. codec_tracks = [a for a in title.tracks.audio if a.codec == codec]
selected_descs = title.tracks.by_language( if not codec_tracks:
desc_audio, processed_lang, per_language=0, exact_match=exact_lang continue
)
title.tracks.audio = selected_standards + selected_descs candidates = title.tracks.by_language(
codec_tracks, [language], per_language=0, exact_match=exact_lang
)
if not candidates:
continue
if audio_description:
standards = [t for t in candidates if not t.descriptive]
if standards:
selected_audio.append(max(standards, key=lambda x: x.bitrate or 0))
descs = [t for t in candidates if t.descriptive]
if descs:
selected_audio.append(max(descs, key=lambda x: x.bitrate or 0))
else:
selected_audio.append(max(candidates, key=lambda x: x.bitrate or 0))
title.tracks.audio = selected_audio
else: else:
title.tracks.audio = title.tracks.by_language( per_language = 1
title.tracks.audio, processed_lang, per_language=per_language, exact_match=exact_lang if audio_description:
) standard_audio = [a for a in title.tracks.audio if not a.descriptive]
selected_standards = title.tracks.by_language(
standard_audio, processed_lang, per_language=per_language, exact_match=exact_lang
)
desc_audio = [a for a in title.tracks.audio if a.descriptive]
# Include all descriptive tracks for the requested languages.
selected_descs = title.tracks.by_language(
desc_audio, processed_lang, per_language=0, exact_match=exact_lang
)
title.tracks.audio = selected_standards + selected_descs
else:
title.tracks.audio = title.tracks.by_language(
title.tracks.audio,
processed_lang,
per_language=per_language,
exact_match=exact_lang,
)
if not title.tracks.audio: if not title.tracks.audio:
self.log.error(f"There's no {processed_lang} Audio Track, cannot continue...") self.log.error(f"There's no {processed_lang} Audio Track, cannot continue...")
sys.exit(1) sys.exit(1)