diff --git a/VERSION b/VERSION index 81340c7..bbdeab6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.4 +0.0.5 diff --git a/webhook_server.py b/webhook_server.py index 25d66ff..74cc79b 100644 --- a/webhook_server.py +++ b/webhook_server.py @@ -277,12 +277,22 @@ class RadarrClient: def movie_by_imdb(self, imdb_id: str) -> Optional[Dict[str, Any]]: imdb_id = imdb_id if imdb_id.startswith("tt") else f"tt{imdb_id}" + _log("DEBUG", f"Radarr API: Looking up movie by IMDb ID: {imdb_id}") + + # Try direct movie search first res = self._get("/api/v3/movie", {"imdbId": imdb_id}) if isinstance(res, list) and res: - return res[0] + movie = res[0] + _log("DEBUG", f"Radarr API: Found movie via direct search: {movie.get('title')} (ID: {movie.get('id')})") + return movie + + # Try lookup endpoint res = self._get("/api/v3/movie/lookup/imdb", {"imdbId": imdb_id}) if isinstance(res, dict) and res.get("id"): + _log("DEBUG", f"Radarr API: Found movie via lookup: {res.get('title')} (ID: {res.get('id')})") return res + + _log("DEBUG", f"Radarr API: No movie found for IMDb ID: {imdb_id}") return None def movie_files(self, movie_id: int) -> List[Dict[str, Any]]: @@ -672,9 +682,12 @@ def _decide_movie_date(imdb_id: str, movie_dir: Path, poll_external: bool) -> Tu Returns: (dateadded_iso, source_detail, released_iso) """ + # Initialize fresh variables for each movie released_iso: Optional[str] = None movie_obj: Optional[Dict[str, Any]] = None movie_id: Optional[int] = None + + _log("DEBUG", f"Starting date selection for {imdb_id} - fresh state initialized") def from_file_mtime() -> Tuple[Optional[str], str]: video_exts = (".mkv", ".mp4", ".avi", ".mov", ".m4v") @@ -698,27 +711,39 @@ def _decide_movie_date(imdb_id: str, movie_dir: Path, poll_external: bool) -> Tu def ensure_movie(): nonlocal movie_obj, movie_id, released_iso if movie_obj is None and poll_external and config.radarr_url and config.radarr_api_key: + _log("DEBUG", f"Looking up Radarr movie for IMDb ID: {imdb_id}") movie_obj = _radarr_movie_by_imdb(imdb_id) if movie_obj: movie_id = movie_obj.get("id") + movie_title = movie_obj.get("title", "Unknown") + movie_imdb = movie_obj.get("imdbId", "Unknown") + _log("INFO", f"Found Radarr movie: {movie_title} (ID: {movie_id}, IMDb: {movie_imdb}) for requested {imdb_id}") released_iso = _parse_date_to_iso(movie_obj.get("inCinemas") or movie_obj.get("theatricalRelease")) + else: + movie_id = None # Explicitly set to None when movie not found + movie_obj = None + _log("WARNING", f"No Radarr movie found for IMDb ID: {imdb_id} - will skip import history") def from_import_history() -> Tuple[Optional[str], str]: ensure_movie() - if not (poll_external and movie_id): - _log("DEBUG", f"Skipping import history: poll_external={poll_external}, movie_id={movie_id}") + if not poll_external: + _log("DEBUG", f"Skipping import history: poll_external={poll_external}") return None, "radarr:history.skipped" + if not movie_id: + _log("DEBUG", f"Skipping import history: movie not found in Radarr for {imdb_id}") + return None, "radarr:movie.not_found" + # Try import history events first (most reliable) iso = _radarr_earliest_import_history_iso(movie_id) if iso: - _log("INFO", f"Using Radarr import history date: {iso}") + _log("INFO", f"Using Radarr import history date: {iso} for movie_id {movie_id} (IMDb: {imdb_id})") return iso, "radarr:history.import" # Fallback to moviefile dateAdded iso2 = _radarr_earliest_file_dateadded_iso(movie_id) if iso2: - _log("INFO", f"Using Radarr moviefile dateAdded: {iso2}") + _log("INFO", f"Using Radarr moviefile dateAdded: {iso2} for movie_id {movie_id}") return iso2, "radarr:moviefile.dateAdded" _log("WARNING", f"No import dates found for movie_id {movie_id}") @@ -843,7 +868,9 @@ def _decide_movie_date(imdb_id: str, movie_dir: Path, poll_external: bool) -> Tu def parse_imdb_from_movie_path(p: Path) -> Optional[str]: m = re.search(r'\[imdb-(tt\d+)\]', p.name, re.IGNORECASE) - return m.group(1).lower() if m else None + imdb_id = m.group(1).lower() if m else None + _log("DEBUG", f"Parsed IMDb ID from path '{p.name}': {imdb_id}") + return imdb_id def is_movie_dir(p: Path) -> bool: return p.is_dir() and parse_imdb_from_movie_path(p) is not None