from __future__ import annotations import os from dataclasses import dataclass from pathlib import Path DEFAULT_ROOT = Path.cwd() @dataclass(frozen=True) class Settings: """Runtime settings tuned for small CPU-only Hugging Face Spaces.""" base_dir: Path = Path(os.getenv("AVA2LON_BASE_DIR", os.getenv("BASYX_BASE_DIR", str(DEFAULT_ROOT)))) temp_dir: Path = Path(os.getenv("TEMP_DIR", str(DEFAULT_ROOT / "temp"))) exports_dir: Path = Path(os.getenv("EXPORTS_DIR", str(DEFAULT_ROOT / "exports"))) jobs_dir: Path = Path(os.getenv("JOBS_DIR", str(DEFAULT_ROOT / "jobs"))) storage_dir: Path = Path(os.getenv("STORAGE_DIR", str(DEFAULT_ROOT / "storage"))) metadata_cache: Path = Path(os.getenv("METADATA_CACHE", str(DEFAULT_ROOT / "temp" / "metadata_cache.json"))) signing_secret: str = os.getenv("AVA2LON_SIGNING_SECRET", os.getenv("BASYX_SIGNING_SECRET", "dev-secret-change-me")) api_key: str = os.getenv("AVA2LON_API_KEY", os.getenv("BASYX_API_KEY", "")) font_path: Path = Path(os.getenv("FONT_PATH", "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf")) output_width: int = int(os.getenv("OUTPUT_WIDTH", "1080")) output_height: int = int(os.getenv("OUTPUT_HEIGHT", "1920")) output_fps: int = int(os.getenv("OUTPUT_FPS", "30")) ffmpeg_timeout_seconds: int = int(os.getenv("FFMPEG_TIMEOUT_SECONDS", "900")) download_timeout_seconds: int = int(os.getenv("DOWNLOAD_TIMEOUT_SECONDS", "60")) max_download_bytes: int = int(os.getenv("MAX_DOWNLOAD_BYTES", str(500 * 1024 * 1024))) allow_private_asset_urls: bool = os.getenv("ALLOW_PRIVATE_ASSET_URLS", "false").lower() == "true" whisper_model_size: str = os.getenv("WHISPER_MODEL_SIZE", "tiny") whisper_compute_type: str = os.getenv("WHISPER_COMPUTE_TYPE", "int8") whisper_device: str = os.getenv("WHISPER_DEVICE", "cpu") whisper_model_dir: Path = Path(os.getenv("WHISPER_MODEL_DIR", str(DEFAULT_ROOT / "models"))) max_retries: int = int(os.getenv("MAX_RETRIES", "3")) max_workers: int = int(os.getenv("MAX_RENDER_WORKERS", "1")) job_retention_seconds: int = int(os.getenv("JOB_RETENTION_SECONDS", str(24 * 3600))) crf: int = int(os.getenv("OUTPUT_CRF", "23")) preset: str = os.getenv("OUTPUT_PRESET", "veryfast") def ensure_dirs(self) -> None: for directory in ( self.temp_dir, self.exports_dir, self.jobs_dir, self.storage_dir, self.metadata_cache.parent, self.whisper_model_dir, ): directory.mkdir(parents=True, exist_ok=True)