3 Commits

Author SHA1 Message Date
Andy
939ca25c5b 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
2026-02-05 12:57:52 -07:00
Sp5rky
58903c7b14 Merge pull request #70 from CodeName393/Missing-HLS-Curl-Session-Processing
Fix Missing HLS Curl Session Processing
2026-02-05 12:43:27 -07:00
CodeName393
3fa4a81a39 Fix Missing HLS Curl Session Processing 2026-02-05 19:25:51 +09:00
2 changed files with 36 additions and 23 deletions

View File

@@ -1462,30 +1462,43 @@ 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
]
if not candidates:
continue
selected_audio.append(max(candidates, 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)
for language in unique_languages:
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 base_candidates:
continue
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:
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
title.tracks.audio = title.tracks.by_language(
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:
self.log.error(f"There's no {processed_lang} Audio Track, cannot continue...")
sys.exit(1)

View File

@@ -255,7 +255,7 @@ class HLS:
else:
# Get the playlist text and handle both session types
response = session.get(track.url)
if isinstance(response, requests.Response):
if isinstance(response, requests.Response) or isinstance(response, CurlResponse):
if not response.ok:
log.error(f"Failed to request the invariant M3U8 playlist: {response.status_code}")
sys.exit(1)
@@ -583,7 +583,7 @@ class HLS:
)
# Check response based on session type
if isinstance(res, requests.Response):
if isinstance(res, requests.Response) or isinstance(res, CurlResponse):
res.raise_for_status()
init_content = res.content
else: