forked from kenzuya/unshackle
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:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user