"""Application configuration loaded from .env with defaults.""" from __future__ import annotations import os from dataclasses import dataclass, field from pathlib import Path from dotenv import load_dotenv def _load_env() -> None: """Load .env from project root (or CWD) if it exists.""" for candidate in (Path(__file__).resolve().parents[2], Path.cwd()): env_path = candidate / ".env" if env_path.is_file(): load_dotenv(env_path) return load_dotenv() _load_env() @dataclass(frozen=True) class Settings: """Immutable application settings.""" output_dir: str = field( default_factory=lambda: os.getenv("STEMSPLITTER_OUTPUT_DIR", "./output") ) model_file_dir: str = field( default_factory=lambda: os.getenv( "STEMSPLITTER_MODEL_DIR", "/tmp/audio-separator-models/" ) ) default_2stem_model: str = field( default_factory=lambda: os.getenv( "STEMSPLITTER_2STEM_MODEL", "model_mel_band_roformer_ep_3005_sdr_11.4360.ckpt", ) ) default_4stem_model: str = field( default_factory=lambda: os.getenv( "STEMSPLITTER_4STEM_MODEL", "htdemucs_ft.yaml" ) ) output_format: str = field( default_factory=lambda: os.getenv("STEMSPLITTER_OUTPUT_FORMAT", "WAV") ) output_bitrate: str = field( default_factory=lambda: os.getenv("STEMSPLITTER_OUTPUT_BITRATE", "320k") ) sample_rate: int = field( default_factory=lambda: int(os.getenv("STEMSPLITTER_SAMPLE_RATE", "44100")) ) normalization: float = field( default_factory=lambda: float( os.getenv("STEMSPLITTER_NORMALIZATION", "0.9") ) ) log_level: str = field( default_factory=lambda: os.getenv("STEMSPLITTER_LOG_LEVEL", "WARNING") ) web_host: str = field( default_factory=lambda: os.getenv("STEMSPLITTER_WEB_HOST", "127.0.0.1") ) web_port: int = field( default_factory=lambda: int(os.getenv("STEMSPLITTER_WEB_PORT", "7860")) ) def get_settings() -> Settings: """Return a fresh Settings instance (re-reads env vars).""" return Settings()