From 60bd37e8c2e1bf99d1d1c959c7c098a5db3aeb0c Mon Sep 17 00:00:00 2001 From: sbcrumb Date: Fri, 10 Oct 2025 14:16:05 -0400 Subject: [PATCH] Fix rename webhook targeting using episodeId lookup Found that rename events contain episodeId field which can be used to fetch specific episode details. Replaced complex episode data extraction with direct API call to /api/v3/episode/{episodeId} to get season/episode numbers for targeted processing. This should resolve rename webhooks processing entire series instead of single episodes. --- VERSION | 2 +- api/routes.py | 75 +++++++++++++++++++++------------------------------ 2 files changed, 31 insertions(+), 46 deletions(-) diff --git a/VERSION b/VERSION index c945ef1..ed2af5c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.18 +2.0.19 diff --git a/api/routes.py b/api/routes.py index c944fb7..08f9711 100644 --- a/api/routes.py +++ b/api/routes.py @@ -152,54 +152,39 @@ async def sonarr_webhook(request: Request, background_tasks: BackgroundTasks, de if recent_renames: # Take the most recent rename event latest_rename = recent_renames[0] - print(f"DEBUG: Latest rename event keys: {list(latest_rename.keys())}") - print(f"DEBUG: Latest rename event full structure: {latest_rename}") + print(f"DEBUG: Processing latest rename event") - # Try different possible episode data locations - episode_info = latest_rename.get("episode", {}) - episode_file_info = latest_rename.get("episodeFile", {}) - data_info = latest_rename.get("data", {}) + # Extract episodeId directly from the rename event + episode_id = latest_rename.get("episodeId") + print(f"DEBUG: Found episodeId {episode_id} in rename event") - print(f"DEBUG: Episode info: {episode_info}") - print(f"DEBUG: EpisodeFile info: {episode_file_info}") - print(f"DEBUG: Data info: {data_info}") - - # Try to extract episode info from any available source - season_num = None - episode_num = None - episode_id = None - episode_title = None - - # Check episode object first - if episode_info: - season_num = episode_info.get("seasonNumber") - episode_num = episode_info.get("episodeNumber") - episode_id = episode_info.get("id") - episode_title = episode_info.get("title") - - # Check episodeFile object - if not season_num and episode_file_info: - season_num = episode_file_info.get("seasonNumber") - episode_num = episode_file_info.get("episodeNumber") - episode_id = episode_file_info.get("episodeId") or episode_file_info.get("id") - - # Check data object - if not season_num and data_info: - season_num = data_info.get("seasonNumber") - episode_num = data_info.get("episodeNumber") - - print(f"DEBUG: Extracted - Season: {season_num}, Episode: {episode_num}, ID: {episode_id}") - - if season_num and episode_num: - episodes_data = [{ - "seasonNumber": season_num, - "episodeNumber": episode_num, - "id": episode_id, - "title": episode_title - }] - print(f"INFO: Found recently renamed episode from history: S{season_num:02d}E{episode_num:02d}") + if episode_id: + # Fetch episode details using the episodeId + episode_detail_url = f"{config.sonarr_url}/api/v3/episode/{episode_id}" + episode_response = requests.get(episode_detail_url, headers={"X-Api-Key": os.environ.get("SONARR_API_KEY", "")}, timeout=10) + + if episode_response.status_code == 200: + episode_detail = episode_response.json() + season_num = episode_detail.get("seasonNumber") + episode_num = episode_detail.get("episodeNumber") + episode_title = episode_detail.get("title") + + print(f"DEBUG: Episode details - Season: {season_num}, Episode: {episode_num}, Title: {episode_title}") + + if season_num is not None and episode_num is not None: + episodes_data = [{ + "seasonNumber": season_num, + "episodeNumber": episode_num, + "id": episode_id, + "title": episode_title + }] + print(f"INFO: Successfully identified renamed episode: S{season_num:02d}E{episode_num:02d} - {episode_title}") + else: + print(f"DEBUG: Episode details missing season/episode numbers") + else: + print(f"DEBUG: Failed to fetch episode details: {episode_response.status_code}") else: - print(f"DEBUG: Could not extract episode data from rename event") + print(f"DEBUG: No episodeId found in rename event") else: print(f"DEBUG: No recent rename events found in last hour") else: