From 9e8d93419059af232791bd872ade2e3aeb80d716 Mon Sep 17 00:00:00 2001 From: Thorsten Date: Thu, 12 Feb 2026 14:55:07 +0100 Subject: [PATCH] . --- py_jellyfin_trickplay_generator.py | 72 +++++++++++++++++++++++++++--- settings.ini | 5 ++- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/py_jellyfin_trickplay_generator.py b/py_jellyfin_trickplay_generator.py index 611780a..5bf2744 100644 --- a/py_jellyfin_trickplay_generator.py +++ b/py_jellyfin_trickplay_generator.py @@ -39,6 +39,71 @@ from dataclasses import dataclass from pathlib import Path from typing import Dict, Iterable, List, Optional, Tuple + +def ensure_venv_and_reexec(): + # Already inside a venv? + if sys.prefix != sys.base_prefix: + return + + script_dir = Path(__file__).resolve().parent + + preferred_venv = script_dir / ".venv" + fallback_venv = Path(os.environ.get("XDG_CACHE_HOME", Path.home() / ".cache")) / "py_jellyfin_trickplay_generator" / "venv" + + def venv_python(venv_dir: Path) -> Path: + if os.name == "nt": + return venv_dir / "Scripts" / "python.exe" + return venv_dir / "bin" / "python" + + def is_valid_venv(venv_dir: Path) -> bool: + py = venv_python(venv_dir) + return py.is_file() + + def recreate_venv(venv_dir: Path) -> None: + if venv_dir.exists(): + shutil.rmtree(venv_dir, ignore_errors=True) + venv_dir.parent.mkdir(parents=True, exist_ok=True) + subprocess.check_call([sys.executable, "-m", "venv", str(venv_dir)]) + + # Pick a venv location that works + venv_dir = preferred_venv + + try: + if not is_valid_venv(venv_dir): + print("[INFO] Creating local virtual environment (.venv)...") + recreate_venv(venv_dir) + except Exception as e: + print(f"[WARN] Failed to create .venv next to script: {e}") + venv_dir = fallback_venv + if not is_valid_venv(venv_dir): + print(f"[INFO] Creating fallback virtual environment at {venv_dir} ...") + recreate_venv(venv_dir) + + py = venv_python(venv_dir) + if not py.is_file(): + raise RuntimeError(f"venv python not found after creation: {py}") + + print("[INFO] Ensuring required packages (pillow, rich)...") + + # Ensure pip exists inside venv (some builds need this) + subprocess.check_call([str(py), "-m", "ensurepip", "--upgrade"]) + + # Upgrade pip + install packages + subprocess.check_call([str(py), "-m", "pip", "install", "--upgrade", "pip", "setuptools", "wheel"]) + subprocess.check_call([str(py), "-m", "pip", "install", "pillow", "rich"]) + + print(f"[INFO] Restarting inside virtual environment: {py}") + os.execv(str(py), [str(py)] + sys.argv) + + + + +ensure_venv_and_reexec() + + + + + from PIL import Image try: @@ -293,15 +358,12 @@ def hw_decode_args(hw: str, hw_device: Optional[str]) -> List[str]: if hw == "vaapi": dev = hw_device or "/dev/dri/renderD128" return [ - "-init_hw_device", - f"vaapi=va:{dev}", - "-filter_hw_device", - "va", "-hwaccel", "vaapi", + "-hwaccel_device", + dev, "-hwaccel_output_format", "vaapi", - "-noautoscale", ] if hw == "qsv": return ["-hwaccel", "qsv", "-noautoscale"] diff --git a/settings.ini b/settings.ini index 45e1102..361a931 100644 --- a/settings.ini +++ b/settings.ini @@ -1,6 +1,7 @@ [input] paths = - C:\Users\Thorsten\Desktop\Test + /home/thorsten/mnt/unRAID/Media/Filme/[Art]/Asian School Girls (2014)/ + /home/thorsten/mnt/unRAID/Media/Filme/[Art]/Auf die Freude (2023)/ recursive = true @@ -23,4 +24,4 @@ tile_rows = 10 ffmpeg = ffprobe = hw = none -hw_device = +hw_device = /dev/dri/renderD128