57 lines
2.6 KiB
Python
57 lines
2.6 KiB
Python
"""Настройки приложения. Значения берутся из переменных окружения с префиксом 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()
|