""" NFOGuard Configuration Module Handles all configuration loading and validation """ import os from pathlib import Path from typing import List def _bool_env(name: str, default: bool) -> bool: """Convert environment variable to boolean""" v = os.environ.get(name) if v is None: return default return v.lower() in ("1", "true", "yes", "y", "on") class NFOGuardConfig: """Configuration class for NFOGuard""" def __init__(self): # Paths - No hardcoded defaults, must be configured via environment tv_paths_env = os.environ.get("TV_PATHS", "") movie_paths_env = os.environ.get("MOVIE_PATHS", "") if not tv_paths_env: raise ValueError("TV_PATHS environment variable is required but not set") if not movie_paths_env: raise ValueError("MOVIE_PATHS environment variable is required but not set") self.tv_paths = [Path(p.strip()) for p in tv_paths_env.split(",") if p.strip()] self.movie_paths = [Path(p.strip()) for p in movie_paths_env.split(",") if p.strip()] # Core settings self.manage_nfo = _bool_env("MANAGE_NFO", True) self.fix_dir_mtimes = _bool_env("FIX_DIR_MTIMES", True) self.lock_metadata = _bool_env("LOCK_METADATA", True) self.debug = _bool_env("DEBUG", False) self.manager_brand = os.environ.get("MANAGER_BRAND", "NFOGuard") # Batching self.batch_delay = float(os.environ.get("BATCH_DELAY", "5.0")) self.max_concurrent = int(os.environ.get("MAX_CONCURRENT_SERIES", "3")) # Database self.db_path = Path(os.environ.get("DB_PATH", "/app/data/media_dates.db")) # Movie processing self.movie_priority = os.environ.get("MOVIE_PRIORITY", "import_then_digital").lower() self.prefer_release_dates_over_file_dates = _bool_env("PREFER_RELEASE_DATES_OVER_FILE_DATES", True) self.allow_file_date_fallback = _bool_env("ALLOW_FILE_DATE_FALLBACK", False) self.release_date_priority = [p.strip() for p in os.environ.get("RELEASE_DATE_PRIORITY", "digital,physical,theatrical").split(",")] self.enable_smart_date_validation = _bool_env("ENABLE_SMART_DATE_VALIDATION", True) 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() self.tv_webhook_processing_mode = os.environ.get("TV_WEBHOOK_PROCESSING_MODE", "targeted").lower() # Global config instance config = NFOGuardConfig()