From 425b3764f451f585d2760f28a04df487d1d81b63 Mon Sep 17 00:00:00 2001 From: Andy Date: Sat, 7 Feb 2026 19:55:45 -0700 Subject: [PATCH] fix(titles): avoid None/double spaces in HDR tokens Ensure dynamic-range tokens use safe fallback when not in DYNAMIC_RANGE_MAP and append exactly one space-separated token without trailing/double spaces. --- unshackle/core/titles/episode.py | 18 ++++++++++++++---- unshackle/core/titles/movie.py | 18 ++++++++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/unshackle/core/titles/episode.py b/unshackle/core/titles/episode.py index b3e90d8..46bd228 100644 --- a/unshackle/core/titles/episode.py +++ b/unshackle/core/titles/episode.py @@ -209,19 +209,29 @@ class Episode(Title): ) frame_rate = float(primary_video_track.frame_rate) + def _append_token(current: str, token: Optional[str]) -> str: + token = (token or "").strip() + current = current.rstrip() + if not token: + return current + if current.endswith(f" {token}"): + return current + return f"{current} {token}" + # Primary HDR format detection if hdr_format: if hdr_format_full.startswith("Dolby Vision"): - name += " DV" + name = _append_token(name, "DV") if any( indicator in (hdr_format_full + " " + hdr_format) for indicator in ["HDR10", "SMPTE ST 2086"] ): - name += " HDR" + name = _append_token(name, "HDR") elif "HDR Vivid" in hdr_format: - name += " HDR" + name = _append_token(name, "HDR") else: - name += f" {DYNAMIC_RANGE_MAP.get(hdr_format)}" + dynamic_range = DYNAMIC_RANGE_MAP.get(hdr_format) or hdr_format or "" + name = _append_token(name, dynamic_range) elif "HLG" in trc or "Hybrid Log-Gamma" in trc or "ARIB STD-B67" in trc or "arib-std-b67" in trc.lower(): name += " HLG" elif any(indicator in trc for indicator in ["PQ", "SMPTE ST 2084", "BT.2100"]) or "smpte2084" in trc.lower() or "bt.2020-10" in trc.lower(): diff --git a/unshackle/core/titles/movie.py b/unshackle/core/titles/movie.py index be0db2e..ab940f0 100644 --- a/unshackle/core/titles/movie.py +++ b/unshackle/core/titles/movie.py @@ -144,19 +144,29 @@ class Movie(Title): ) frame_rate = float(primary_video_track.frame_rate) + def _append_token(current: str, token: Optional[str]) -> str: + token = (token or "").strip() + current = current.rstrip() + if not token: + return current + if current.endswith(f" {token}"): + return current + return f"{current} {token}" + # Primary HDR format detection if hdr_format: if hdr_format_full.startswith("Dolby Vision"): - name += " DV" + name = _append_token(name, "DV") if any( indicator in (hdr_format_full + " " + hdr_format) for indicator in ["HDR10", "SMPTE ST 2086"] ): - name += " HDR" + name = _append_token(name, "HDR") elif "HDR Vivid" in hdr_format: - name += " HDR" + name = _append_token(name, "HDR") else: - name += f" {DYNAMIC_RANGE_MAP.get(hdr_format)} " + dynamic_range = DYNAMIC_RANGE_MAP.get(hdr_format) or hdr_format or "" + name = _append_token(name, dynamic_range) elif "HLG" in trc or "Hybrid Log-Gamma" in trc or "ARIB STD-B67" in trc or "arib-std-b67" in trc.lower(): name += " HLG" elif any(indicator in trc for indicator in ["PQ", "SMPTE ST 2084", "BT.2100"]) or "smpte2084" in trc.lower() or "bt.2020-10" in trc.lower():