From 477fd7f2eb1f2bc75f8b3ae2bea5ae0568eb5ced Mon Sep 17 00:00:00 2001 From: Andy Date: Mon, 19 Jan 2026 20:18:45 +0000 Subject: [PATCH] fix(n_m3u8dl_re): include language in DASH audio track selection When DASH manifests have multiple audio AdaptationSets with the same representation IDs (e.g., both English and Japanese having id="0"), N_m3u8DL-RE would download the same track twice. Now includes the language alongside the ID in selection args to properly disambiguate tracks across adaptation sets. --- unshackle/core/downloaders/n_m3u8dl_re.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/unshackle/core/downloaders/n_m3u8dl_re.py b/unshackle/core/downloaders/n_m3u8dl_re.py index 815c697..5598a63 100644 --- a/unshackle/core/downloaders/n_m3u8dl_re.py +++ b/unshackle/core/downloaders/n_m3u8dl_re.py @@ -67,12 +67,17 @@ def get_track_selection_args(track: Any) -> list[str]: parts = [] if track_type == "Audio": - if track_id := representation.get("id") or adaptation_set.get("audioTrackId"): + track_id = representation.get("id") or adaptation_set.get("audioTrackId") + lang = representation.get("lang") or adaptation_set.get("lang") + + if track_id: parts.append(rf'"id=\b{track_id}\b"') + if lang: + parts.append(f"lang={lang}") else: if codecs := representation.get("codecs"): parts.append(f"codecs={codecs}") - if lang := representation.get("lang") or adaptation_set.get("lang"): + if lang: parts.append(f"lang={lang}") if bw := representation.get("bandwidth"): bitrate = int(bw) // 1000