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
This commit is contained in:
2025-09-09 20:25:03 -04:00
parent 4f12d77d98
commit 4e786d775b
2 changed files with 29 additions and 5 deletions
+11
View File
@@ -104,6 +104,17 @@ MOVIE_POLL_MODE=always
# Update mode: backfill_only or overwrite # Update mode: backfill_only or overwrite
MOVIE_DATE_UPDATE_MODE=backfill_only 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 # LOGGING
# =========================================== # ===========================================
+18 -5
View File
@@ -153,6 +153,10 @@ class NFOGuardConfig:
self.movie_poll_mode = os.environ.get("MOVIE_POLL_MODE", "always").lower() 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() 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() config = NFOGuardConfig()
# --------------------------- # ---------------------------
@@ -261,8 +265,9 @@ class TVProcessor:
if (season, episode) in disk_episodes: if (season, episode) in disk_episodes:
# Create NFO # Create NFO
if config.manage_nfo: if config.manage_nfo:
season_dir = series_path / config.tv_season_dir_format.format(season=season)
self.nfo_manager.create_episode_nfo( self.nfo_manager.create_episode_nfo(
series_path / f"Season {season:02d}", season_dir,
season, episode, aired, dateadded, source, config.lock_metadata season, episode, aired, dateadded, source, config.lock_metadata
) )
@@ -280,7 +285,7 @@ class TVProcessor:
seasons_processed = set() seasons_processed = set()
for (season, episode) in disk_episodes.keys(): for (season, episode) in disk_episodes.keys():
if season not in seasons_processed: 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) self.nfo_manager.create_season_nfo(season_dir, season)
seasons_processed.add(season) seasons_processed.add(season)
@@ -294,12 +299,20 @@ class TVProcessor:
video_exts = (".mkv", ".mp4", ".avi", ".mov", ".m4v") video_exts = (".mkv", ".mp4", ".avi", ".mov", ".m4v")
for season_dir in series_path.iterdir(): 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 continue
try: try:
season_num = int(season_dir.name.split()[-1]) # Extract season number from directory name
except Exception: # 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 continue
for video_file in season_dir.iterdir(): for video_file in season_dir.iterdir():