5adc596077
Local Docker Build (Dev) / build-dev (push) Successful in 33s
- Create modular directory structure - Extract Pydantic models to api/models.py - Move configuration to config/settings.py - Create clean main.py with FastAPI app setup WIP: Routes and processor classes still need extraction
62 lines
2.8 KiB
Python
62 lines
2.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
NFOGuard configuration management
|
|
"""
|
|
import os
|
|
from pathlib import Path
|
|
|
|
|
|
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:
|
|
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 configuration instance
|
|
config = NFOGuardConfig() |