File size: 2,819 Bytes
345855e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d782cc
345855e
 
 
 
 
 
 
 
 
 
 
 
 
5d782cc
 
345855e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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", ""))
    public_base_url: str = os.getenv("PUBLIC_BASE_URL", "").rstrip("/")
    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"))
    callback_max_retries: int = int(os.getenv("CALLBACK_MAX_RETRIES", "3"))
    callback_retry_seconds: float = float(os.getenv("CALLBACK_RETRY_SECONDS", "1"))
    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)