fix(dl): keep descriptive and standard audio for requested langs

When --audio-description is set, keep standard selections and include descriptive tracks for requested languages, including --a-lang with orig and best selection paths.

Fixes #72
This commit is contained in:
Andy
2026-02-05 12:57:52 -07:00
parent 58903c7b14
commit 939ca25c5b

View File

@@ -1462,27 +1462,40 @@ class dl:
if "best" in processed_lang:
unique_languages = {track.language for track in title.tracks.audio}
selected_audio = []
if acodec and len(acodec) > 1:
for language in unique_languages:
for codec in acodec:
candidates = [
track
for track in title.tracks.audio
if track.language == language and track.codec == codec
codecs_to_check = acodec if (acodec and len(acodec) > 1) else [None]
for codec in codecs_to_check:
base_candidates = [
t
for t in title.tracks.audio
if t.language == language and (codec is None or t.codec == codec)
]
if not candidates:
if not base_candidates:
continue
selected_audio.append(max(candidates, key=lambda x: x.bitrate or 0))
if audio_description:
standards = [t for t in base_candidates if not t.descriptive]
if standards:
selected_audio.append(max(standards, key=lambda x: x.bitrate or 0))
descs = [t for t in base_candidates if t.descriptive]
if descs:
selected_audio.append(max(descs, key=lambda x: x.bitrate or 0))
else:
for language in unique_languages:
highest_quality = max(
(track for track in title.tracks.audio if track.language == language),
key=lambda x: x.bitrate or 0,
)
selected_audio.append(highest_quality)
selected_audio.append(max(base_candidates, key=lambda x: x.bitrate or 0))
title.tracks.audio = selected_audio
elif "all" not in processed_lang:
per_language = 0 if acodec and len(acodec) > 1 else 1
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
)