From f8bef94e7f39b13936ad891ca80d6bd06eaef4a8 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 28 Feb 2026 09:52:26 +0000 Subject: [PATCH] Fix quality extraction crashing on string-typed quality fields Sonarr (and potentially Radarr/Lidarr) can send the quality field as a plain string instead of the expected nested dict. Added a helper that handles both formats gracefully. https://claude.ai/code/session_019ANRdyL2jfi7ysWhqN4PfD --- app/formatters.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/app/formatters.py b/app/formatters.py index 3e5cd00..4fe396f 100644 --- a/app/formatters.py +++ b/app/formatters.py @@ -9,17 +9,27 @@ def _strip_markdown(text: str) -> str: return text.replace("**", "").replace("*", "").replace("> ", "") +def _extract_quality(quality_obj) -> str: + """Extract quality name from *arr quality field, which may be a string or nested dict.""" + if isinstance(quality_obj, str): + return quality_obj + if isinstance(quality_obj, dict): + inner = quality_obj.get("quality", quality_obj) + if isinstance(inner, str): + return inner + if isinstance(inner, dict): + return inner.get("name", "Unknown") + return "Unknown" + + def format_radarr(payload: dict) -> tuple[str, str]: movie = payload.get("movie", {}) title = movie.get("title", "Unknown") year = movie.get("year", "") is_upgrade = payload.get("isUpgrade", False) - quality = ( - payload.get("movieFile", {}) - .get("quality", {}) - .get("quality", {}) - .get("name", "Unknown") + quality = _extract_quality( + payload.get("movieFile", {}).get("quality", {}) ) if is_upgrade: @@ -52,11 +62,8 @@ def format_sonarr(payload: dict) -> tuple[str, str]: episode = ep.get("episodeNumber", 0) ep_title = ep.get("title", "") - quality = ( - payload.get("episodeFile", {}) - .get("quality", {}) - .get("quality", {}) - .get("name", "Unknown") + quality = _extract_quality( + payload.get("episodeFile", {}).get("quality", {}) ) header = f"\U0001f4fa **{series_title}** \u2014 S{season:02d}E{episode:02d}" @@ -91,11 +98,7 @@ def format_lidarr(payload: dict) -> tuple[str, str]: track_files = payload.get("trackFiles", [{}]) tf = track_files[0] if track_files else {} - quality = ( - tf.get("quality", {}) - .get("quality", {}) - .get("name", "Unknown") - ) + quality = _extract_quality(tf.get("quality", {})) header = f"\U0001f3b5 **{artist_name}**" if album_title: