diff --git a/VERSION b/VERSION index 7bc1c40..fee0a27 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.9.6 +1.9.7 diff --git a/processors/tv_processor.py b/processors/tv_processor.py index 1d50eff..2772a7f 100644 --- a/processors/tv_processor.py +++ b/processors/tv_processor.py @@ -189,9 +189,15 @@ class TVProcessor: existing_nfo = self.nfo_manager.find_episode_nfo_matching_video(season_dir, season_num, episode_num) if existing_nfo: - # Force processing of this episode to update NFO with NFOGuard data - episode_dates[(season_num, episode_num)] = (None, None, "nfo_update_required") - nfo_episodes_found += 1 + # Found NFO file - need to fetch episode data and update it + # Try to get data from APIs (same as missing episodes) + aired, dateadded = self._get_episode_dates_from_apis(imdb_id, season_num, episode_num) + if aired or dateadded: + episode_dates[(season_num, episode_num)] = (aired, dateadded, "nfo_update_required") + nfo_episodes_found += 1 + else: + # No data available from APIs, skip this episode + _log("WARNING", f"No episode data available for S{season_num:02d}E{episode_num:02d} - skipping NFO update") if nfo_episodes_found > 0: _log("INFO", f"Found {nfo_episodes_found} episodes with existing NFO files to update (preserving names)") @@ -262,6 +268,48 @@ class TVProcessor: return episode_dates + def _get_episode_dates_from_apis(self, imdb_id: str, season_num: int, episode_num: int) -> tuple[Optional[str], Optional[str]]: + """Get episode dates using proper fallback chain: database → Sonarr import → airdate""" + aired = None + dateadded = None + + # First check if it's already in database + existing_ep = self.db.get_episode_date(imdb_id, season_num, episode_num) + if existing_ep and existing_ep.get('dateadded'): + _log("DEBUG", f"Found episode S{season_num:02d}E{episode_num:02d} in database") + return existing_ep.get('aired'), existing_ep.get('dateadded') + + # Try Sonarr API for import date (preferred) + if self.sonarr.enabled: + series = self.sonarr.series_by_imdb(imdb_id) + if series: + series_id = series.get("id") + if series_id: + episodes = self.sonarr.episodes_for_series(series_id) + for ep in episodes: + if ep.get("episodeNumber") == episode_num and ep.get("seasonNumber") == season_num: + # Get import date (preferred for dateadded) + if ep.get("episodeFile", {}).get("dateAdded"): + dateadded = ep["episodeFile"]["dateAdded"] + _log("DEBUG", f"Got Sonarr import date for S{season_num:02d}E{episode_num:02d}: {dateadded}") + + # Get airdate + if ep.get("airDateUtc"): + aired = ep["airDateUtc"] + _log("DEBUG", f"Got Sonarr airdate for S{season_num:02d}E{episode_num:02d}: {aired}") + elif ep.get("airDate"): + aired = ep["airDate"] + "T00:00:00Z" + _log("DEBUG", f"Got Sonarr airdate (no time) for S{season_num:02d}E{episode_num:02d}: {aired}") + + break + + # Fallback: use airdate as dateadded if no import date available + if not dateadded and aired: + dateadded = aired + _log("DEBUG", f"Using airdate as dateadded fallback for S{season_num:02d}E{episode_num:02d}") + + return aired, dateadded + def _parse_date_to_iso(self, date_str: str) -> Optional[str]: """Parse date string to ISO format""" if not date_str: