| 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) |
|
|