diff --git a/.env.template b/.env.template index b7070a9..1a53a17 100644 --- a/.env.template +++ b/.env.template @@ -104,6 +104,17 @@ MOVIE_POLL_MODE=always # Update mode: backfill_only or overwrite MOVIE_DATE_UPDATE_MODE=backfill_only +# =========================================== +# TV SERIES PROCESSING +# =========================================== +# Season directory naming format (supports {season} placeholder) +# Examples: "Season {season:02d}" -> "Season 01", "S{season:02d}" -> "S01" +TV_SEASON_DIR_FORMAT=Season {season:02d} + +# Season directory detection pattern (lowercase, what to look for at start of dir name) +# Examples: "season " -> matches "Season 01", "s" -> matches "S01", "season" -> matches "Season01" +TV_SEASON_DIR_PATTERN=season + # =========================================== # LOGGING # =========================================== diff --git a/nfoguard.py b/nfoguard.py index 45317dc..e326832 100644 --- a/nfoguard.py +++ b/nfoguard.py @@ -152,6 +152,10 @@ class NFOGuardConfig: self.max_release_date_gap_years = int(os.environ.get("MAX_RELEASE_DATE_GAP_YEARS", "10")) self.movie_poll_mode = os.environ.get("MOVIE_POLL_MODE", "always").lower() self.movie_update_mode = os.environ.get("MOVIE_DATE_UPDATE_MODE", "backfill_only").lower() + + # TV processing + self.tv_season_dir_format = os.environ.get("TV_SEASON_DIR_FORMAT", "Season {season:02d}") + self.tv_season_dir_pattern = os.environ.get("TV_SEASON_DIR_PATTERN", "season ").lower() config = NFOGuardConfig() @@ -261,8 +265,9 @@ class TVProcessor: if (season, episode) in disk_episodes: # Create NFO if config.manage_nfo: + season_dir = series_path / config.tv_season_dir_format.format(season=season) self.nfo_manager.create_episode_nfo( - series_path / f"Season {season:02d}", + season_dir, season, episode, aired, dateadded, source, config.lock_metadata ) @@ -280,7 +285,7 @@ class TVProcessor: seasons_processed = set() for (season, episode) in disk_episodes.keys(): if season not in seasons_processed: - season_dir = series_path / f"Season {season:02d}" + season_dir = series_path / config.tv_season_dir_format.format(season=season) self.nfo_manager.create_season_nfo(season_dir, season) seasons_processed.add(season) @@ -294,12 +299,20 @@ class TVProcessor: video_exts = (".mkv", ".mp4", ".avi", ".mov", ".m4v") for season_dir in series_path.iterdir(): - if not (season_dir.is_dir() and season_dir.name.lower().startswith("season ")): + if not (season_dir.is_dir() and season_dir.name.lower().startswith(config.tv_season_dir_pattern)): continue try: - season_num = int(season_dir.name.split()[-1]) - except Exception: + # Extract season number from directory name + # Handle formats like "Season 01", "S01", "Season01", etc. + dir_name = season_dir.name.lower() + if config.tv_season_dir_pattern in dir_name: + # Extract everything after the pattern + season_part = dir_name[len(config.tv_season_dir_pattern):].strip() + else: + continue + season_num = int(season_part) + except (ValueError, IndexError): continue for video_file in season_dir.iterdir():