From 9b5d233c6999beb04eb4a6be903bf531f3a93add Mon Sep 17 00:00:00 2001 From: Andy Date: Wed, 22 Oct 2025 20:46:52 +0000 Subject: [PATCH] fix(dl): validate HYBRID mode requirements before download Add validation to check that both HDR10 and DV tracks are available when HYBRID mode is requested. This prevents wasted downloads when the hybrid processing would fail due to missing tracks. --- unshackle/commands/dl.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/unshackle/commands/dl.py b/unshackle/commands/dl.py index 0436bed..9821674 100644 --- a/unshackle/commands/dl.py +++ b/unshackle/commands/dl.py @@ -1002,6 +1002,29 @@ class dl: selected_videos.append(match) title.tracks.videos = selected_videos + # validate hybrid mode requirements + if any(r == Video.Range.HYBRID for r in range_): + hdr10_tracks = [v for v in title.tracks.videos if v.range == Video.Range.HDR10] + dv_tracks = [v for v in title.tracks.videos if v.range == Video.Range.DV] + + if not hdr10_tracks and not dv_tracks: + available_ranges = sorted(set(v.range.name for v in title.tracks.videos)) + self.log.error("HYBRID mode requires both HDR10 and DV tracks, but neither is available") + self.log.error( + f"Available ranges: {', '.join(available_ranges) if available_ranges else 'none'}" + ) + sys.exit(1) + elif not hdr10_tracks: + available_ranges = sorted(set(v.range.name for v in title.tracks.videos)) + self.log.error("HYBRID mode requires both HDR10 and DV tracks, but only DV is available") + self.log.error(f"Available ranges: {', '.join(available_ranges)}") + sys.exit(1) + elif not dv_tracks: + available_ranges = sorted(set(v.range.name for v in title.tracks.videos)) + self.log.error("HYBRID mode requires both HDR10 and DV tracks, but only HDR10 is available") + self.log.error(f"Available ranges: {', '.join(available_ranges)}") + sys.exit(1) + # filter subtitle tracks if require_subs: missing_langs = [