Merge pull request 'fix: Add targeted mode for rename webhooks using Sonarr history API' (#34) from rename into dev
Local Docker Build (Dev) / build-dev (push) Successful in 4s

Reviewed-on: #34
This commit was merged in pull request #34.
This commit is contained in:
2025-10-10 10:40:16 -04:00
2 changed files with 59 additions and 1 deletions
+1 -1
View File
@@ -1 +1 @@
2.0.13 2.0.14
+58
View File
@@ -3,6 +3,7 @@ FastAPI routes for NFOGuard - extracted from main nfoguard.py for modular archit
""" """
import os import os
import json import json
import requests
from pathlib import Path from pathlib import Path
from datetime import datetime, timezone from datetime import datetime, timezone
from fastapi import HTTPException, BackgroundTasks, Request from fastapi import HTTPException, BackgroundTasks, Request
@@ -100,6 +101,63 @@ async def sonarr_webhook(request: Request, background_tasks: BackgroundTasks, de
else: else:
print(f"DEBUG: Missing season/episode numbers in episodeFile for {webhook.eventType}") print(f"DEBUG: Missing season/episode numbers in episodeFile for {webhook.eventType}")
# Special handling for Rename events - Sonarr doesn't include episodeFile for renames
# Try to find recently renamed episodes using Sonarr history API
if not episodes_data and webhook.eventType == "Rename":
print(f"DEBUG: Attempting to find recently renamed episode for series {imdb_id}")
try:
# Get series info from Sonarr to find series ID
series_lookup_url = f"{config.sonarr_base_url}/api/v3/series/lookup?term=imdbid:{imdb_id}"
print(f"DEBUG: Sonarr lookup for rename: {series_lookup_url}")
response = requests.get(series_lookup_url, headers={"X-Api-Key": config.sonarr_api_key}, timeout=10)
if response.status_code == 200:
series_results = response.json()
if series_results:
series_id = series_results[0].get("id")
print(f"DEBUG: Found series ID {series_id} for rename lookup")
# Get recent history for episodefilerenamed events (last 24 hours)
from datetime import datetime, timedelta
since_date = (datetime.utcnow() - timedelta(hours=1)).strftime('%Y-%m-%dT%H:%M:%SZ')
history_url = f"{config.sonarr_base_url}/api/v3/history?seriesId={series_id}&eventType=episodeFileRenamed&since={since_date}&pageSize=10"
print(f"DEBUG: Checking recent rename history: {history_url}")
history_response = requests.get(history_url, headers={"X-Api-Key": config.sonarr_api_key}, timeout=10)
if history_response.status_code == 200:
history_data = history_response.json()
recent_renames = history_data.get("records", [])
print(f"DEBUG: Found {len(recent_renames)} recent rename events")
if recent_renames:
# Take the most recent rename event
latest_rename = recent_renames[0]
episode_info = latest_rename.get("episode", {})
season_num = episode_info.get("seasonNumber")
episode_num = episode_info.get("episodeNumber")
if season_num and episode_num:
episodes_data = [{
"seasonNumber": season_num,
"episodeNumber": episode_num,
"id": episode_info.get("id"),
"title": episode_info.get("title")
}]
print(f"INFO: Found recently renamed episode from history: S{season_num:02d}E{episode_num:02d}")
else:
print(f"DEBUG: Recent rename event missing season/episode data")
else:
print(f"DEBUG: No recent rename events found in last hour")
else:
print(f"DEBUG: Failed to get rename history: {history_response.status_code}")
else:
print(f"DEBUG: No series found for IMDb {imdb_id}")
else:
print(f"DEBUG: Series lookup failed: {response.status_code}")
except Exception as e:
print(f"DEBUG: Error finding renamed episode: {e}")
# Continue with series processing as fallback
# Force targeted mode for single-episode webhooks to prevent full series processing # Force targeted mode for single-episode webhooks to prevent full series processing
processing_mode = config.tv_webhook_processing_mode processing_mode = config.tv_webhook_processing_mode
if episodes_data and len(episodes_data) <= 3: # Single episode or small batch if episodes_data and len(episodes_data) <= 3: # Single episode or small batch