diff --git a/core/nfo_manager.py b/core/nfo_manager.py index fc77d18..d387c5a 100644 --- a/core/nfo_manager.py +++ b/core/nfo_manager.py @@ -126,6 +126,37 @@ class NFOManager: print(f"❌ No IMDb or TMDB ID found in directory, filenames, or NFO for: {movie_dir.name}") return None + def find_series_imdb_id(self, series_dir: Path) -> Optional[str]: + """Find IMDb ID from TV series directory name, filenames, or tvshow.nfo file""" + print(f"🔍 Searching for IMDb ID in TV series: {series_dir.name}") + + # First try directory name + imdb_id = self.parse_imdb_from_path(series_dir) + if imdb_id: + print(f"✅ Found IMDb ID in series directory name: {imdb_id}") + return imdb_id + + # Try all files in the directory for IMDb ID patterns + for file_path in series_dir.iterdir(): + if file_path.is_file(): + imdb_id = self.parse_imdb_from_path(file_path) + if imdb_id: + print(f"✅ Found IMDb ID in series filename: {imdb_id} from {file_path.name}") + return imdb_id + + # Finally, try tvshow.nfo file content + nfo_path = series_dir / "tvshow.nfo" + imdb_id = self.parse_imdb_from_nfo(nfo_path) + if imdb_id: + if imdb_id.startswith("tmdb-"): + print(f"✅ Found TMDB ID in tvshow.nfo: {imdb_id} from {nfo_path} (fallback mode)") + else: + print(f"✅ Found IMDb ID in tvshow.nfo: {imdb_id} from {nfo_path}") + return imdb_id + + print(f"❌ No IMDb or TMDB ID found in series directory, filenames, or tvshow.nfo for: {series_dir.name}") + return None + def extract_nfoguard_dates_from_nfo(self, nfo_path: Path) -> Optional[Dict[str, str]]: """Extract NFOGuard-managed dates from existing NFO file""" if not nfo_path.exists(): diff --git a/webhooks/webhook_batcher.py b/webhooks/webhook_batcher.py index 3688057..0810791 100644 --- a/webhooks/webhook_batcher.py +++ b/webhooks/webhook_batcher.py @@ -107,8 +107,33 @@ class WebhookBatcher: return _log("DEBUG", f"Batch validation passed: IMDb {expected_imdb} found in path (fallback mode)") - # Process based on media type + # CRITICAL: Validate that the path contains the expected IMDb ID for TV shows if media_type == 'tv': + expected_imdb = key.replace('tv:', '') if key.startswith('tv:') else key + + # Use comprehensive IMDb detection (directory, filenames, tvshow.nfo files) + if self.nfo_manager: + detected_imdb = self.nfo_manager.find_series_imdb_id(path_obj) + imdb_match = False + if detected_imdb: + # Compare with and without 'tt' prefix for flexibility + if detected_imdb == expected_imdb or detected_imdb.replace('tt', '') == expected_imdb.replace('tt', ''): + imdb_match = True + + if not imdb_match: + _log("ERROR", f"BATCH VALIDATION FAILED: Expected IMDb {expected_imdb} not found via comprehensive detection in TV path {path_str}") + _log("ERROR", f"Detected TV IMDb: {detected_imdb}, Expected: {expected_imdb}") + _log("ERROR", f"This prevents processing wrong TV series due to batch corruption") + return + _log("DEBUG", f"TV batch validation passed: IMDb {expected_imdb} matches detected {detected_imdb}") + else: + # Fallback to simple string search if nfo_manager not available + if expected_imdb not in path_str.lower(): + _log("ERROR", f"BATCH VALIDATION FAILED: Expected IMDb {expected_imdb} not found in TV path {path_str} (fallback mode)") + _log("ERROR", f"This prevents processing wrong TV series due to batch corruption") + return + _log("DEBUG", f"TV batch validation passed: IMDb {expected_imdb} found in path (fallback mode)") + if not self.tv_processor: _log("ERROR", "TV processor not available") return