"""Настройки приложения. Значения берутся из переменных окружения с префиксом PVDL_.""" from __future__ import annotations import os from dataclasses import dataclass from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent def _env_path(name: str, default: Path) -> Path: value = os.environ.get(name) return Path(value).expanduser().resolve() if value else default def _env_int(name: str, default: int) -> int: try: return int(os.environ.get(name, default)) except (TypeError, ValueError): return default def _env_path_opt(name: str) -> Path | None: value = os.environ.get(name) return Path(value).expanduser().resolve() if value else None @dataclass(frozen=True) class Settings: # Куда складывать скачанные файлы. download_dir: Path = _env_path("PVDL_DOWNLOAD_DIR", BASE_DIR / "downloads") # Файл SQLite. db_path: Path = _env_path("PVDL_DB_PATH", BASE_DIR / "app.db") # Каталог собранной статики фронтенда (SvelteKit build). static_dir: Path = _env_path("PVDL_STATIC_DIR", BASE_DIR / "frontend" / "build") # Сколько воркеров разбирают очередь параллельно. workers: int = _env_int("PVDL_WORKERS", 3) # Размер chunk'а при скачивании через httpx (байт). chunk_size: int = _env_int("PVDL_CHUNK_SIZE", 64 * 1024) # Как часто (в секундах) пушить событие прогресса, чтобы не заспамить шину. progress_interval: float = 0.3 # Хост/порт веб-сервера. host: str = os.environ.get("PVDL_HOST", "127.0.0.1") port: int = _env_int("PVDL_PORT", 8000) # Cookies для yt-dlp (сайты, блокирующие анонимные запросы: возрастной гейт, # логин, гео). Браузер: "chrome" | "firefox" | "edge" | … , можно "chrome:Профиль". cookies_from_browser: str | None = os.environ.get("PVDL_COOKIES_FROM_BROWSER") or None # Файл cookies в формате Netscape (cookies.txt). cookies_file: Path | None = _env_path_opt("PVDL_COOKIES_FILE") # Импперсонация браузера (TLS-отпечаток) для yt-dlp — нужна сайтам с анти-ботом # (иначе CDN рвёт соединение / 410). "chrome" по умолчанию; пусто — выключить. impersonate: str | None = os.environ.get("PVDL_IMPERSONATE", "chrome") or None settings = Settings()