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