"""Configuration constants and EPG timespan parsing.""" import os import re from pathlib import Path DATA_ROOT = Path("/data") MOVIES_ROOT = Path("/movies") SERIES_ROOT = Path("/series") CHANNELS_FILE = DATA_ROOT / "channels.json" VIDEO_EXTENSIONS = {".mkv", ".mp4", ".avi", ".mov", ".m4v", ".webm", ".wmv"} DEFAULT_DURATION_SEC = 3600 # EPG timespan (parsed from EPG_TIMESPAN env) EPG_TIMESPAN_DAYS = 14.0 EPG_TIMESPAN_SEC = 14.0 * 24 * 3600 SCHEDULE_CACHE_TTL_SEC = (14 * 24 - 3) * 3600 def _parse_epg_timespan(value: str) -> tuple[float, float]: """Parse EPG_TIMESPAN env (e.g. '2d', '14d', '48h'). Returns (days, seconds).""" value = (value or "").strip().lower() if not value: return 14.0, 14.0 * 24 * 3600 m = re.match(r"^(\d+(?:\.\d+)?)\s*([dh])?$", value) if not m: return 14.0, 14.0 * 24 * 3600 num = float(m.group(1)) unit = m.group(2) or "d" days = num / 24.0 if unit == "h" else num sec = days * 24 * 3600 return days, sec def init_epg_timespan() -> None: """Load EPG_TIMESPAN from env and set EPG_* and SCHEDULE_CACHE_TTL_SEC.""" global EPG_TIMESPAN_DAYS, EPG_TIMESPAN_SEC, SCHEDULE_CACHE_TTL_SEC days, sec = _parse_epg_timespan(os.environ.get("EPG_TIMESPAN", "")) EPG_TIMESPAN_DAYS = days EPG_TIMESPAN_SEC = sec schedule_ttl = sec - 3 * 3600 SCHEDULE_CACHE_TTL_SEC = max(3600, schedule_ttl) init_epg_timespan() # TMDB (The Movie Database) for EPG metadata — Dutch (nl). Set TMDB_API_KEY. TMDB_API_BASE = "https://api.themoviedb.org/3" TMDB_LANGUAGE = "nl" TMDB_CACHE_TTL_SEC = 24 * 3600 TMDB_RATE_LIMIT_REQUESTS = 40 TMDB_RATE_LIMIT_WINDOW_SEC = 10.0 TMDB_CACHE_DIR = DATA_ROOT / "tmdb_cache" try: TMDB_PREFETCH_INTERVAL_SEC = int(os.environ.get("TMDB_PREFETCH_INTERVAL_SEC", str(6 * 3600))) except (TypeError, ValueError): TMDB_PREFETCH_INTERVAL_SEC = 6 * 3600 TMDB_IMAGE_BASE = "https://image.tmdb.org/t/p" TMDB_IMAGE_STILL_SIZE = "w500" # Preferred audio languages for streaming (in order): Dutch → Flemish → default PREFERRED_AUDIO_LANGUAGES = ("nld", "dut", "nl", "vls")