diff --git a/app/worker.py b/app/worker.py index 96e7ca1..510a401 100644 --- a/app/worker.py +++ b/app/worker.py @@ -1467,6 +1467,34 @@ def _resolve_audio_encoder(codec: str) -> str: return AUDIO_ENCODER_MAP.get(key, codec or "libmp3lame") +def _sanitize_video_preset(encoder: str) -> str | None: + preset = (VIDEO_NORMALIZE_PRESET or "").strip() + if not preset: + return None + enc = (encoder or "").lower() + pl = preset.lower() + + if "nvenc" in enc: + allowed = {"p1", "p2", "p3", "p4", "p5", "p6", "p7"} + return pl if pl in allowed else "p5" + + if enc in {"libx265", "libx264"}: + allowed = {"ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo"} + if pl in allowed: + return pl + if pl.startswith("p") and pl[1:].isdigit(): + return "medium" + return "medium" + + if enc == "libaom-av1": + allowed = {"good", "best", "realtime"} + if pl in allowed: + return pl + return "good" + + return preset + + def _ffprobe_streams(path: Path) -> dict[str, str]: try: out = subprocess.check_output( @@ -1603,8 +1631,9 @@ def _normalize_video_file(path: Path, info: dict[str, str]) -> Path: "-map", "0", "-c:v", v_encoder, ] - if VIDEO_NORMALIZE_PRESET: - cmd.extend(["-preset", VIDEO_NORMALIZE_PRESET]) + preset_val = _sanitize_video_preset(v_encoder) + if preset_val: + cmd.extend(["-preset", preset_val]) if VIDEO_NORMALIZE_TUNE: cmd.extend(["-tune", VIDEO_NORMALIZE_TUNE]) if VIDEO_NORMALIZE_CRF: diff --git a/docker-compose.yml b/docker-compose.yml index fae02b8..41659d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -90,6 +90,8 @@ services: AUDIO_NORMALIZE_BITRATE: ${AUDIO_NORMALIZE_BITRATE:-192k} AUDIO_NORMALIZE_CHANNELS: ${AUDIO_NORMALIZE_CHANNELS:-2} WORKER_MODE: all + NVIDIA_VISIBLE_DEVICES: ${NVIDIA_VISIBLE_DEVICES:-all} + NVIDIA_DRIVER_CAPABILITIES: ${NVIDIA_DRIVER_CAPABILITIES:-video,compute,utility} OPENWEBUI_URL: ${OPENWEBUI_CONTAINER_URL:-http://open-webui:8080} OPENWEBUI_API_KEY: ${OPENWEBUI_API_KEY} OPENWEBUI_KB_NAME: ${OPENWEBUI_KB_NAME:-Homelab Library} @@ -105,6 +107,10 @@ services: - ${TMP_HOST_DIR:-./tmp}:/tmpdl - ${MODELS_HOST_DIR:-./models}:/root/.cache/huggingface - ./app:/app + device_requests: + - driver: nvidia + count: ${NVIDIA_DEVICE_COUNT:-1} + capabilities: [video, compute, utility] depends_on: [meili, redis, open-webui] restart: unless-stopped healthcheck: @@ -150,6 +156,8 @@ services: AUDIO_NORMALIZE_BITRATE: ${AUDIO_NORMALIZE_BITRATE:-192k} AUDIO_NORMALIZE_CHANNELS: ${AUDIO_NORMALIZE_CHANNELS:-2} WORKER_MODE: transcribe + NVIDIA_VISIBLE_DEVICES: ${NVIDIA_VISIBLE_DEVICES:-all} + NVIDIA_DRIVER_CAPABILITIES: ${NVIDIA_DRIVER_CAPABILITIES:-video,compute,utility} OPENWEBUI_URL: ${OPENWEBUI_CONTAINER_URL:-http://open-webui:8080} OPENWEBUI_API_KEY: ${OPENWEBUI_API_KEY} OPENWEBUI_KB_NAME: ${OPENWEBUI_KB_NAME:-Homelab Library} @@ -165,6 +173,10 @@ services: - ${TMP_HOST_DIR:-./tmp}:/tmpdl - ${MODELS_HOST_DIR:-./models}:/root/.cache/huggingface - ./app:/app + device_requests: + - driver: nvidia + count: ${NVIDIA_DEVICE_COUNT:-1} + capabilities: [video, compute, utility] depends_on: [meili, redis, open-webui] restart: unless-stopped healthcheck: