From 4e786d775bd1c312b920cd10aac5981771334992 Mon Sep 17 00:00:00 2001 From: SBCrumb Date: Tue, 9 Sep 2025 20:25:03 -0400 Subject: [PATCH] Add configurable TV season directory naming Features: - TV_SEASON_DIR_FORMAT: Configurable season folder creation (Season {season:02d}) - TV_SEASON_DIR_PATTERN: Configurable season folder detection (season ) - Support for different naming conventions (Season 01, S01, Season01, etc.) - Updated .env.template with TV configuration examples Fixes hardcoded 'Season ' patterns for better flexibility --- .env.template | 11 +++++++++++ nfoguard.py | 23 ++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) 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():