From aabb28ee06b09c027da57767ab54cde38e775129 Mon Sep 17 00:00:00 2001 From: mboehmlaender Date: Wed, 11 Mar 2026 14:54:08 +0000 Subject: [PATCH] DOcs --- README.md | 25 ++- docs/api/index.md | 56 +----- docs/appendix/index.md | 30 ++++ docs/architecture/index.md | 25 +-- docs/configuration/index.md | 14 +- docs/deployment/index.md | 8 +- docs/deployment/production.md | 112 +++++++++++- docs/getting-started/configuration.md | 120 +++++-------- docs/getting-started/index.md | 56 +++--- docs/getting-started/installation.md | 131 ++++++-------- docs/getting-started/prerequisites.md | 169 +++++------------- docs/getting-started/quickstart.md | 130 +++++--------- docs/gui/dashboard.md | 124 +++++++++++++ docs/gui/database.md | 39 ++++ docs/gui/history.md | 62 +++++++ docs/gui/index.md | 24 +++ docs/gui/settings.md | 92 ++++++++++ docs/index.md | 148 +++------------ docs/pipeline/index.md | 18 +- docs/tools/index.md | 10 +- docs/workflows/index.md | 61 +++++++ mkdocs.yml | 83 +++++---- site/404.html | 2 +- site/api/crons/index.html | 2 +- site/api/history/index.html | 2 +- site/api/index.html | 17 +- site/api/pipeline/index.html | 2 +- site/api/runtime-activities/index.html | 74 ++++++++ site/api/settings/index.html | 2 +- site/api/websocket/index.html | 31 +++- site/appendix/index.html | 1 + site/architecture/backend/index.html | 2 +- site/architecture/database/index.html | 2 +- site/architecture/frontend/index.html | 2 +- site/architecture/index.html | 4 +- site/architecture/overview/index.html | 2 +- site/configuration/environment/index.html | 2 +- site/configuration/index.html | 2 +- .../settings-reference/index.html | 2 +- site/deployment/development/index.html | 4 +- site/deployment/index.html | 2 +- site/deployment/production/index.html | 142 +++++++++------ site/getting-started/configuration/index.html | 4 +- site/getting-started/index.html | 2 +- site/getting-started/installation/index.html | 36 ++-- site/getting-started/prerequisites/index.html | 58 +----- site/getting-started/quickstart/index.html | 13 +- site/gui/dashboard/index.html | 1 + site/gui/database/index.html | 1 + site/gui/history/index.html | 1 + site/gui/index.html | 1 + site/gui/settings/index.html | 1 + site/index.html | 30 +--- site/pipeline/encoding/index.html | 2 +- site/pipeline/index.html | 2 +- site/pipeline/playlist-analysis/index.html | 2 +- site/pipeline/post-encode-scripts/index.html | 2 +- site/pipeline/workflow/index.html | 2 +- site/search/search_index.json | 2 +- site/sitemap.xml | 96 ++++++---- site/sitemap.xml.gz | Bin 454 -> 501 bytes site/tools/handbrake/index.html | 4 +- site/tools/index.html | 2 +- site/tools/makemkv/index.html | 2 +- site/tools/mediainfo/index.html | 2 +- site/workflows/index.html | 1 + 66 files changed, 1199 insertions(+), 904 deletions(-) create mode 100644 docs/appendix/index.md create mode 100644 docs/gui/dashboard.md create mode 100644 docs/gui/database.md create mode 100644 docs/gui/history.md create mode 100644 docs/gui/index.md create mode 100644 docs/gui/settings.md create mode 100644 docs/workflows/index.md create mode 100644 site/api/runtime-activities/index.html create mode 100644 site/appendix/index.html create mode 100644 site/gui/dashboard/index.html create mode 100644 site/gui/database/index.html create mode 100644 site/gui/history/index.html create mode 100644 site/gui/index.html create mode 100644 site/gui/settings/index.html create mode 100644 site/workflows/index.html diff --git a/README.md b/README.md index ec0da04..acacac1 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,30 @@ Ripster ist eine lokale Web-Anwendung für halbautomatisches Disc-Ripping mit Ma - `HandBrakeCLI` - `mediainfo` -## Schnellstart +## Schnellstart (Produktion) + +Auf Debian 11/12 oder Ubuntu 22.04/24.04 (root erforderlich): + +```bash +wget -qO install.sh https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh +sudo bash install.sh +``` + +Das Skript fragt interaktiv, ob HandBrake als Standard-Version (apt) oder mit GPU/NVDEC-Unterstützung (gebündeltes Binary) installiert werden soll. + +Danach ist Ripster unter `http://` erreichbar. + +Wichtige Optionen: + +```bash +sudo bash install.sh --branch dev # anderen Branch installieren +sudo bash install.sh --no-makemkv # MakeMKV überspringen +sudo bash install.sh --reinstall # Update (Daten bleiben erhalten) +``` + +## Entwicklungsumgebung + +Für lokale Entwicklung mit Hot-Reload: ```bash ./start.sh diff --git a/docs/api/index.md b/docs/api/index.md index 66a1c03..637e681 100644 --- a/docs/api/index.md +++ b/docs/api/index.md @@ -1,8 +1,6 @@ -# API-Referenz +# Anhang: API-Referenz -Ripster bietet eine REST-API für Steuerung/Verwaltung sowie einen WebSocket-Endpunkt für Echtzeit-Updates. - ---- +REST- und WebSocket-Schnittstellen für Integration, Automatisierung und Debugging. ## Basis-URL @@ -12,13 +10,6 @@ http://localhost:3001 API-Prefix: `/api` -Beispiele: - -- `GET /api/health` -- `GET /api/pipeline/state` - ---- - ## API-Gruppen
@@ -73,45 +64,6 @@ Beispiele:
---- +## Hinweis -## Authentifizierung - -Es gibt keine eingebaute Authentifizierung. Ripster ist für lokalen Betrieb gedacht. - ---- - -## Fehlerformat - -Fehler werden zentral als JSON geliefert: - -```json -{ - "error": { - "message": "Job nicht gefunden.", - "statusCode": 404, - "reqId": "req_...", - "details": [ - { - "field": "name", - "message": "Name darf nicht leer sein." - } - ] - } -} -``` - -`details` ist optional (z. B. bei Validierungsfehlern). - ---- - -## Häufige Statuscodes - -| Code | Bedeutung | -|------|-----------| -| `200` | Erfolg | -| `201` | Ressource erstellt | -| `400` | Ungültige Anfrage / Validierungsfehler | -| `404` | Ressource nicht gefunden | -| `409` | Konflikt (z. B. falscher Pipeline-Zustand, Job läuft bereits) | -| `500` | Interner Fehler | +Ripster hat keine eingebaute Authentifizierung und ist für lokalen, geschützten Betrieb gedacht. diff --git a/docs/appendix/index.md b/docs/appendix/index.md new file mode 100644 index 0000000..0739305 --- /dev/null +++ b/docs/appendix/index.md @@ -0,0 +1,30 @@ +# Technischer Anhang + +Dieser Bereich enthält die technische Referenz hinter dem Benutzerhandbuch. + +## Inhalt + +- **Konfiguration** + - komplette Feldreferenz + - Umgebungsvariablen +- **Pipeline intern** + - Zustandsmodell + - Encode-Planung + - Playlist-Analyse + - Pre-/Post-Encode-Ausführungen +- **API-Referenz** + - REST-Endpunkte + - WebSocket-Events +- **Architektur** + - Backend-/Frontend-Aufbau + - Datenbank +- **Deployment** + - Betrieb in Entwicklung und Produktion +- **Externe Tools** + - MakeMKV, HandBrake, MediaInfo + +## Wann du in den Anhang wechselst + +- du integrierst Ripster mit anderen Systemen +- du betreibst mehrere Instanzen oder willst tiefer debuggen +- du brauchst Feld-/API-/Schema-Details für Automatisierung diff --git a/docs/architecture/index.md b/docs/architecture/index.md index 436b338..8a44a70 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -1,6 +1,6 @@ -# Architektur +# Anhang: Architektur -Ripster ist eine Client-Server-Anwendung mit REST + WebSocket. +Ripster ist eine Client-Server-Anwendung mit REST + WebSocket und externen CLI-Tools. --- @@ -40,26 +40,7 @@ graph TB --- -## Schichten - -### Backend - -- `src/index.js` (Bootstrapping, Routes, WS, Services) -- `src/routes/*` (Pipeline, Settings, History, Crons) -- `src/services/*` (Business-Logik) -- `src/db/database.js` (Init/Migration) -- `src/utils/*` (Parser, Dateifunktionen, Validierung) - -### Frontend - -- `App.jsx` + `pages/*` (Dashboard, Settings, History) -- `components/*` (Status-/Review-/Dialog-Komponenten) -- `api/client.js` (REST-Client) -- `hooks/useWebSocket.js` (WS-Reconnect) - ---- - -## Weiterführend +## Details
diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 7d6a6a9..8a0f4d8 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -1,4 +1,8 @@ -# Konfiguration +# Anhang: Konfiguration + +Dieser Abschnitt ist die technische Referenz zu allen Konfigurationsarten in Ripster. + +## Inhalte
@@ -6,7 +10,7 @@ --- - Alle verfügbaren Einstellungen mit Typen, Standardwerten und Beschreibungen. + Vollständige Liste aller UI-Settings (Typ, Default, Hinweise). [:octicons-arrow-right-24: Einstellungsreferenz](settings-reference.md) @@ -14,8 +18,12 @@ --- - Umgebungsvariablen für Backend und Frontend. + `backend/.env` und `frontend/.env` inkl. Prioritäten. [:octicons-arrow-right-24: Umgebungsvariablen](environment.md)
+ +## Zurück zum Handbuch + +- [Benutzerhandbuch Überblick](../getting-started/index.md) diff --git a/docs/deployment/index.md b/docs/deployment/index.md index 01332cf..7bd90a2 100644 --- a/docs/deployment/index.md +++ b/docs/deployment/index.md @@ -1,4 +1,6 @@ -# Deployment +# Anhang: Deployment + +Technische Betriebsdokumentation für Entwicklung und Produktion.
@@ -6,7 +8,7 @@ --- - Lokale Entwicklungsumgebung einrichten. + Lokale Entwicklung mit Hot-Reload. [:octicons-arrow-right-24: Entwicklung](development.md) @@ -14,7 +16,7 @@ --- - Ripster auf einem Server dauerhaft betreiben. + Installation und Betrieb auf Servern. [:octicons-arrow-right-24: Produktion](production.md) diff --git a/docs/deployment/production.md b/docs/deployment/production.md index df96913..f15c56f 100644 --- a/docs/deployment/production.md +++ b/docs/deployment/production.md @@ -2,7 +2,117 @@ --- -## Empfohlene Architektur +## Automatische Installation (empfohlen) + +Das mitgelieferte `install.sh` richtet Ripster vollautomatisch auf Debian/Ubuntu ein – inklusive Node.js, MakeMKV, HandBrake, nginx und systemd-Dienst. + +**Unterstützte Systeme:** Debian 11/12, Ubuntu 22.04/24.04 +**Voraussetzung:** root-Rechte, Internetzugang + +### Schnellstart via curl + +```bash +curl -fsSL https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh | sudo bash +``` + +Oder mit wget: + +```bash +wget -qO- https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh | sudo bash +``` + +!!! warning "Optionen nur via Datei" + Beim Pipen von curl/wget können keine Argumente übergeben werden. Für benutzerdefinierte Optionen zuerst herunterladen und dann mit `sudo bash install.sh [Optionen]` ausführen. + +### Optionen + +| Option | Standard | Beschreibung | +|--------|----------|--------------| +| `--branch ` | `main` | Git-Branch für die Installation | +| `--dir ` | `/opt/ripster` | Installationsverzeichnis | +| `--user ` | `ripster` | Systembenutzer für den Dienst | +| `--port ` | `3001` | Backend-Port | +| `--host ` | Auto (Maschinen-IP) | Hostname/IP für die Weboberfläche | +| `--no-makemkv` | – | MakeMKV-Installation überspringen | +| `--no-handbrake` | – | HandBrake-Installation überspringen | +| `--no-nginx` | – | nginx-Einrichtung überspringen | +| `--reinstall` | – | Bestehende Installation aktualisieren (Daten bleiben erhalten) | +| `-h`, `--help` | – | Hilfe anzeigen | + +### Beispiele + +```bash +# Standard-Installation +sudo bash install.sh + +# Anderen Branch und Port verwenden +sudo bash install.sh --branch dev --port 8080 + +# Ohne MakeMKV (bereits installiert) +sudo bash install.sh --no-makemkv + +# Bestehende Installation aktualisieren +sudo bash install.sh --reinstall + +# Ohne nginx (eigener Reverse-Proxy) +sudo bash install.sh --no-nginx --host mein-server.local +``` + +### Was das Skript erledigt + +1. **Systemprüfung** – OS-Erkennung und Root-Check +2. **Systempakete** – `curl`, `wget`, `git`, `mediainfo`, `udev` u. a. +3. **Node.js 20** – via NodeSource, falls noch nicht installiert +4. **MakeMKV** – aktuelle Version wird aus dem offiziellen Forum ermittelt und aus dem Quellcode kompiliert (kann mit `--no-makemkv` übersprungen werden) +5. **HandBrake** – interaktive Auswahl: + - **Option 1**: Standard (`apt install handbrake-cli`) + - **Option 2**: Gebündelte GPU-Version mit NVDEC aus `bin/HandBrakeCLI` +6. **Systembenutzer** `ripster` – ohne Login-Shell, Gruppen: `cdrom`, `optical`, `disk`, `video`, `render` +7. **Repository** – klont Branch nach `--dir` (bei `--reinstall`: sichert DB, pullt, stellt DB wieder her) +8. **npm-Abhängigkeiten** – Root, Backend (nur production), Frontend +9. **Frontend-Build** – `npm run build` mit relativen API-URLs (nginx-kompatibel) +10. **Backend `.env`** – wird automatisch generiert (bei `--reinstall` bleibt bestehende erhalten) +11. **Berechtigungen** – `ripster:ripster` auf Installationsverzeichnis, `600` auf `.env` +12. **systemd-Dienst** – `ripster-backend.service` erstellt, aktiviert und gestartet +13. **nginx** – konfiguriert als Reverse-Proxy für Frontend, `/api/` und `/ws` (kann mit `--no-nginx` übersprungen werden) + +### Nach der Installation + +```bash +# Status prüfen +sudo systemctl status ripster-backend + +# Logs verfolgen +sudo journalctl -u ripster-backend -f + +# Neustart +sudo systemctl restart ripster-backend + +# Aktualisieren +sudo bash /opt/ripster/install.sh --reinstall +``` + +**Zugriff:** `http://` (oder der mit `--host` angegebene Hostname) + +### HandBrake-Modus (GPU/NVDEC) + +Bei nicht-interaktiver Ausführung (Pipe von curl) wird automatisch die Standard-Version gewählt. Für die GPU-Version zuerst herunterladen: + +```bash +curl -fsSL https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh -o install.sh +sudo bash install.sh +# → Interaktive Auswahl: Option 2 für NVDEC +``` + +Das gebündelte Binary liegt unter `bin/HandBrakeCLI` und wird nach `/usr/local/bin/HandBrakeCLI` kopiert. + +--- + +## Manuelle Installation + +Die folgenden Abschnitte beschreiben die einzelnen Schritte für manuelle oder angepasste Setups. + +### Empfohlene Architektur ```text Client diff --git a/docs/getting-started/configuration.md b/docs/getting-started/configuration.md index 21f72f3..e5becf5 100644 --- a/docs/getting-started/configuration.md +++ b/docs/getting-started/configuration.md @@ -1,99 +1,71 @@ -# Konfiguration +# Ersteinrichtung -Die Hauptkonfiguration erfolgt über die UI (`Settings`) und wird in SQLite gespeichert. +Nach der Installation erfolgt die tägliche Konfiguration fast vollständig in der GUI unter `Settings`. ---- +## Ziel -## Pflichteinstellungen vor dem ersten Rip +Vor dem ersten echten Job müssen Pfade, Tools und Metadatenzugriff sauber gesetzt sein. -### 1) Pfade +## Reihenfolge (empfohlen) -| Einstellung | Beschreibung | Beispiel | -|------------|-------------|---------| -| `raw_dir` | Basisverzeichnis für RAW-Rips | `/mnt/ripster/raw` | -| `movie_dir` | Basisverzeichnis für finale Encodes | `/mnt/ripster/movies` | -| `log_dir` | Verzeichnis für Prozess-/Backend-Logs | `/mnt/ripster/logs` | +### 1. `Settings` -> Tab `Konfiguration` -Optional profilspezifisch: +Setze zuerst diese Pflichtwerte: -- `raw_dir_bluray`, `raw_dir_dvd`, `raw_dir_other` -- `movie_dir_bluray`, `movie_dir_dvd`, `movie_dir_other` +| Bereich | Wichtige Felder | +|---|---| +| Pfade | `raw_dir`, `movie_dir`, `log_dir` | +| Tools | `makemkv_command`, `handbrake_command`, `mediainfo_command` | +| Metadaten | `omdb_api_key`, optional `omdb_default_type` | -### 2) Tools +Danach `Änderungen speichern`. -| Einstellung | Standard | -|------------|---------| -| `makemkv_command` | `makemkvcon` | -| `handbrake_command` | `HandBrakeCLI` | -| `mediainfo_command` | `mediainfo` | +### 2. Medienprofile prüfen -### 3) OMDb +Wenn du Blu-ray und DVD unterschiedlich behandeln willst, pflege die profilbezogenen Felder: -| Einstellung | Beschreibung | -|------------|-------------| -| `omdb_api_key` | API-Key von omdbapi.com | -| `omdb_default_type` | `movie`, `series`, `episode` | +- `*_bluray` +- `*_dvd` +- optional `*_other` ---- +Typische Beispiele: -## Encode-Konfiguration (wichtig) +- `handbrake_preset_bluray` und `handbrake_preset_dvd` +- `raw_dir_bluray` und `raw_dir_dvd` +- `filename_template_bluray` und `filename_template_dvd` -Ripster arbeitet profilspezifisch, typischerweise über: +### 3. Queue und Monitoring festlegen -- Blu-ray: `handbrake_preset_bluray`, `handbrake_extra_args_bluray`, `output_extension_bluray`, `filename_template_bluray` -- DVD: `handbrake_preset_dvd`, `handbrake_extra_args_dvd`, `output_extension_dvd`, `filename_template_dvd` +- `pipeline_max_parallel_jobs` für parallele Jobs +- `hardware_monitoring_enabled` und Intervall für Live-Metriken im Dashboard -### Template-Platzhalter +### 4. Optional: Push-Benachrichtigungen -Verfügbar in `filename_template_*` und `output_folder_template_*`: - -- `${title}` -- `${year}` -- `${imdbId}` - -Beispiel: - -```text -${title} (${year}) --> Inception (2010).mkv -``` - ---- - -## MakeMKV-spezifisch - -| Einstellung | Standard | Hinweis | -|------------|---------|--------| -| `makemkv_min_length_minutes` | `60` | Kandidaten-Filter | -| `makemkv_rip_mode_bluray` | `backup` | `mkv` oder `backup` | -| `makemkv_rip_mode_dvd` | `mkv` | `mkv` oder `backup` | -| `makemkv_registration_key` | leer | optional, wird via `makemkvcon reg` gesetzt | - ---- - -## Monitoring & Queue - -| Einstellung | Standard | -|------------|---------| -| `hardware_monitoring_enabled` | `true` | -| `hardware_monitoring_interval_ms` | `5000` | -| `pipeline_max_parallel_jobs` | `1` | - ---- - -## PushOver (optional) - -Basis: +In den Benachrichtigungsfeldern setzen: - `pushover_enabled` - `pushover_token` - `pushover_user` -Zusätzlich pro Event ein/aus (z. B. `pushover_notify_job_finished`). +Dann über `PushOver Test` direkt prüfen. ---- +## 2-Minuten-Funktionstest -## Verwandte Doku +1. `Dashboard` öffnen +2. Disc einlegen +3. `Analyse starten` +4. Metadaten übernehmen +5. Bis `READY_TO_ENCODE` laufen lassen -- [Einstellungsreferenz](../configuration/settings-reference.md) -- [Umgebungsvariablen](../configuration/environment.md) +Wenn diese Schritte funktionieren, ist die Grundkonfiguration korrekt. + +## Wenn Werte nicht gespeichert werden + +- Feld mit Fehler markieren lassen (rote Validierung im Formular) +- Pfadangaben und numerische Werte prüfen +- bei Tool-Pfaden direkt CLI-Aufruf im Terminal testen + +## Weiter + +- [Erster Lauf](quickstart.md) +- [GUI-Seiten im Detail](../gui/index.md) diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index da7ec91..61a2041 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -1,41 +1,33 @@ -# Erste Schritte +# Benutzerhandbuch Überblick -Dieser Abschnitt führt dich durch die Installation und Einrichtung von Ripster. +Dieses Kapitel ist für den **Betrieb von Ripster im Alltag** geschrieben. -## Überblick +## Zielgruppe -
+- Anwender, die Discs verarbeiten wollen +- Betreiber, die den täglichen Ablauf stabil fahren möchten +- Power-User, die Queue/Skripte/Cron im UI steuern möchten -- :material-list-check: **Voraussetzungen** +## Kapitelstruktur - --- +| Kapitel | Zweck | +|---|---| +| [Voraussetzungen](prerequisites.md) | Prüfen, ob System und Tools bereit sind | +| [Installation](installation.md) | Ripster aufsetzen und starten | +| [Ersteinrichtung](configuration.md) | Pfade, Tools und Metadaten korrekt setzen | +| [Erster Lauf](quickstart.md) | Ein kompletter Job von Disc bis Datei | +| [GUI-Seiten](../gui/index.md) | Alle Ansichten und Aktionen im Detail | +| [Workflows](../workflows/index.md) | Typische Abläufe und Entscheidungen aus User-Sicht | - Systemanforderungen und externe Tools, die vor der Installation benötigt werden. +## Wenn du neu startest - [:octicons-arrow-right-24: Voraussetzungen prüfen](prerequisites.md) +1. [Voraussetzungen](prerequisites.md) +2. [Installation](installation.md) +3. [Ersteinrichtung](configuration.md) +4. [Erster Lauf](quickstart.md) -- :material-download: **Installation** +## Wenn Ripster bereits läuft - --- - - Schritt-für-Schritt-Anleitung zur Installation von Ripster. - - [:octicons-arrow-right-24: Installation starten](installation.md) - -- :material-tune: **Konfiguration** - - --- - - Einrichten von Pfaden, API-Keys und Encoding-Presets. - - [:octicons-arrow-right-24: Konfigurieren](configuration.md) - -- :material-rocket-launch: **Schnellstart** - - --- - - Rippe deinen ersten Film in wenigen Minuten. - - [:octicons-arrow-right-24: Loslegen](quickstart.md) - -
+1. [GUI-Seiten](../gui/index.md) +2. [Workflows](../workflows/index.md) +3. Bei Detailfragen: [Technischer Anhang](../appendix/index.md) diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md index 1f1cd91..ea5c246 100644 --- a/docs/getting-started/installation.md +++ b/docs/getting-started/installation.md @@ -1,103 +1,84 @@ # Installation ---- +Die empfohlene Installation läuft über `install.sh` und richtet Ripster vollständig ein. -## Repository klonen +## Zielbild nach der Installation + +- Ripster-Backend als `systemd`-Dienst +- Frontend über nginx erreichbar +- UI auf `http://` + +## Schritt-für-Schritt + +### 1. Installationsskript herunterladen ```bash -git clone https://github.com/YOUR_GITHUB_USERNAME/ripster.git -cd ripster +wget -qO install.sh https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh ``` ---- - -## Dev-Start (empfohlen) +### 2. Installation ausführen ```bash -./start.sh +sudo bash install.sh ``` -`start.sh`: +Während der Installation wirst du nach dem HandBrake-Modus gefragt: -1. prüft Node-Version (`>= 20.19.0`) -2. installiert Dependencies (Root/Backend/Frontend) -3. startet Backend + Frontend parallel +- `1` Standard (`apt`) +- `2` GPU/NVDEC (gebündeltes Binary) -Danach: - -- Backend: `http://localhost:3001` -- Frontend: `http://localhost:5173` - -Stoppen: mit `Ctrl+C` im laufenden Terminal. - ---- - -## Manuell starten +### 3. Dienststatus prüfen ```bash -npm install -npm --prefix backend install -npm --prefix frontend install -npm run dev +sudo systemctl status ripster-backend ``` -Oder getrennt: +### 4. Weboberfläche öffnen + +- Mit nginx: `http://` +- Ohne nginx (`--no-nginx`): API auf `http://:3001/api` + +## Wichtige Optionen + +| Option | Zweck | +|---|---| +| `--branch ` | anderen Branch installieren | +| `--dir ` | Installationsverzeichnis ändern | +| `--port ` | Backend-Port setzen | +| `--host ` | Hostname/IP für nginx/CORS | +| `--no-makemkv` | MakeMKV nicht installieren | +| `--no-handbrake` | HandBrake nicht installieren | +| `--no-nginx` | nginx-Konfiguration überspringen | +| `--reinstall` | Update einer bestehenden Installation | + +Beispiele: ```bash -npm run dev:backend -npm run dev:frontend +sudo bash install.sh --branch dev +sudo bash install.sh --port 8080 --host ripster.local +sudo bash install.sh --reinstall ``` ---- - -## Optional: .env-Dateien anlegen - -### Backend +## Betrieb im Alltag ```bash -cp backend/.env.example backend/.env +# Logs live ansehen +sudo journalctl -u ripster-backend -f + +# Dienst neu starten +sudo systemctl restart ripster-backend + +# Update aus bestehender Installation +sudo bash /opt/ripster/install.sh --reinstall ``` -Beispiel: +## Häufige Stolperstellen -```env -PORT=3001 -DB_PATH=./data/ripster.db -LOG_DIR=./logs -CORS_ORIGIN=http://localhost:5173 -LOG_LEVEL=info -``` +- `Permission denied` am Laufwerk: Laufwerksrechte/Gruppen prüfen +- Tools nicht gefunden: `makemkvcon`, `HandBrakeCLI`, `mediainfo` im `PATH` prüfen +- UI nicht erreichbar: nginx-Status und Port/Firewall prüfen -### Frontend +## Danach weiter -```bash -cp frontend/.env.example frontend/.env -``` - -Beispiel: - -```env -VITE_API_BASE=/api -# optional: -# VITE_WS_URL=ws://localhost:3001/ws -``` - ---- - -## Datenbank - -SQLite wird automatisch beim Backend-Start initialisiert: - -```text -backend/data/ripster.db -``` - -Schema-Quelle: `db/schema.sql` - ---- - -## Nächste Schritte - -1. Browser öffnen: `http://localhost:5173` -2. In `Settings` Pfade/Tools/API-Keys prüfen -3. Erste Disc einlegen und Workflow starten +1. [Ersteinrichtung](configuration.md) +2. [Erster Lauf](quickstart.md) diff --git a/docs/getting-started/prerequisites.md b/docs/getting-started/prerequisites.md index 5bb7fef..8c5e9b3 100644 --- a/docs/getting-started/prerequisites.md +++ b/docs/getting-started/prerequisites.md @@ -1,157 +1,70 @@ # Voraussetzungen -Bevor du Ripster installierst, stelle sicher, dass folgende Software auf deinem System verfügbar ist. +Diese Seite ist die praktische Checkliste vor der Installation. ---- +## 1) System -## System-Anforderungen +| Punkt | Mindestwert | Empfehlung | +|---|---|---| +| Betriebssystem | Linux oder macOS | Ubuntu 22.04+ | +| Node.js | 20.19.0 | 20.x LTS | +| RAM | 4 GB | 8 GB+ | +| Freier Speicher | 50 GB | 500 GB+ | -| Anforderung | Mindestversion | Empfohlen | -|------------|----------------|-----------| -| **Betriebssystem** | Linux / macOS | Ubuntu 22.04+ | -| **Node.js** | 20.19.0 | 20.x LTS | -| **RAM** | 4 GB | 8 GB+ | -| **Festplatte** | 50 GB frei | 500 GB+ (für Roh-MKVs) | - ---- - -## Node.js - -Ripster benötigt **Node.js >= 20.19.0**. - -=== "nvm (empfohlen)" - - ```bash - # nvm installieren - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash - - # Node.js 20 installieren - nvm install 20 - nvm use 20 - - # Version prüfen - node --version # v20.x.x - ``` - -=== "Ubuntu/Debian" - - ```bash - curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - - sudo apt-get install -y nodejs - - node --version # v20.x.x - ``` - -=== "macOS (Homebrew)" - - ```bash - brew install node@20 - node --version # v20.x.x - ``` - ---- - -## Externe Tools - -### MakeMKV - -!!! warning "Lizenz erforderlich" - MakeMKV ist für den persönlichen Gebrauch kostenlos (Beta-Lizenz), benötigt aber eine gültige Lizenz. +Node-Version prüfen: ```bash -# Ubuntu/Debian - PPA verwenden -sudo add-apt-repository ppa:heyarje/makemkv-beta -sudo apt-get update -sudo apt-get install makemkv-bin makemkv-oss +node --version +``` -# Installierte Version prüfen +## 2) Externe Tools + +Ripster benötigt folgende CLI-Tools im `PATH`: + +- `makemkvcon` +- `HandBrakeCLI` +- `mediainfo` + +Schnell prüfen: + +```bash makemkvcon --version -``` - -[:octicons-link-external-24: MakeMKV Download](https://www.makemkv.com/download/){ .md-button } - -### HandBrake CLI - -```bash -# Ubuntu/Debian -sudo add-apt-repository ppa:stebbins/handbrake-releases -sudo apt-get update -sudo apt-get install handbrake-cli - -# Version prüfen HandBrakeCLI --version - -# macOS -brew install handbrake -``` - -[:octicons-link-external-24: HandBrake Download](https://handbrake.fr/downloads2.php){ .md-button } - -### MediaInfo - -```bash -# Ubuntu/Debian -sudo apt-get install mediainfo - -# macOS -brew install mediainfo - -# Version prüfen mediainfo --Version ``` ---- +## 3) Optisches Laufwerk -## Disc-Laufwerk - -Ripster benötigt ein physisches **DVD- oder Blu-ray-Laufwerk**. - -!!! danger "LibDriveIO-Modus erforderlich" - Das Laufwerk muss im **LibDriveIO-Modus** betrieben werden – MakeMKV greift direkt auf Rohdaten des Laufwerks zu. Ohne diesen Modus können verschlüsselte Blu-rays (insbesondere UHD) nicht gelesen werden. - - Nicht alle Laufwerke unterstützen den direkten Zugriff. Eine Anleitung zur Einrichtung und Liste kompatibler Laufwerke findet sich im [MakeMKV-Forum](https://www.makemkv.com/forum/viewtopic.php?t=18856). +Für Disc-Betrieb muss ein DVD/Blu-ray-Laufwerk erreichbar sein. ```bash -# Laufwerk prüfen ls /dev/sr* -# oder lsblk | grep rom +``` -# Laufwerk-Berechtigungen setzen (erforderlich für LibDriveIO) +Wenn nötig Rechte setzen (Beispiel): + +```bash sudo chmod a+rw /dev/sr0 ``` -!!! info "Blu-ray unter Linux" - MakeMKV bringt mit LibDriveIO eine eigene Entschlüsselung mit – externe Bibliotheken wie `libaacs` sind in der Regel nicht erforderlich. +## 4) OMDb API-Key ---- +Für automatische Metadaten (Titel, Poster, IMDb-ID): -## OMDb API-Key +1. Key unter [omdbapi.com](https://www.omdbapi.com/apikey.aspx) anlegen +2. in den `Settings` als `omdb_api_key` eintragen -Ripster verwendet die [OMDb API](https://www.omdbapi.com/) für Filmmetadaten. +## 5) Optional: PushOver -1. Registriere dich kostenlos auf [omdbapi.com](https://www.omdbapi.com/apikey.aspx) -2. Bestätige deine E-Mail-Adresse -3. Notiere deinen API-Key – du gibst ihn später in den Einstellungen ein +Für Push-Nachrichten bei Erfolg/Fehler: ---- +- Account/App auf [pushover.net](https://pushover.net) +- `pushover_token` und `pushover_user` später in den `Settings` setzen -## Optionale Voraussetzungen +## Abschluss-Checkliste -### PushOver (Benachrichtigungen) - -Für mobile Push-Benachrichtigungen bei Fertigstellung oder Fehlern: - -- App kaufen auf [pushover.net](https://pushover.net) (~5 USD einmalig) -- **User Key** und **API Token** notieren - ---- - -## Checkliste - -- [ ] Node.js >= 20.19.0 installiert (`node --version`) -- [ ] `makemkvcon` installiert (`makemkvcon --version`) -- [ ] `HandBrakeCLI` installiert (`HandBrakeCLI --version`) -- [ ] `mediainfo` installiert (`mediainfo --Version`) -- [ ] DVD/Blu-ray Laufwerk vorhanden (`ls /dev/sr*`) -- [ ] OMDb API-Key beschafft +- [ ] Node.js 20.x verfügbar +- [ ] `makemkvcon`, `HandBrakeCLI`, `mediainfo` ausführbar +- [ ] Laufwerk erkannt +- [ ] OMDb Key bereit diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md index 449cb3e..145d080 100644 --- a/docs/getting-started/quickstart.md +++ b/docs/getting-started/quickstart.md @@ -1,114 +1,70 @@ -# Schnellstart – Erster kompletter Job +# Erster Lauf -Diese Seite führt durch den typischen ersten Lauf. +Dieser Ablauf zeigt einen vollständigen Job aus Anwendersicht: von Disc-Erkennung bis fertiger Datei. ---- +## 1. Dashboard öffnen und Disc einlegen -## 1) Starten +Erwartung: -```bash -cd ripster -./start.sh -``` +- Status wechselt auf `DISC_DETECTED` bzw. `Medium erkannt` +- im Bereich `Disk-Information` sind Laufwerksdaten sichtbar -Öffne `http://localhost:5173`. +Wenn nichts passiert: `Laufwerk neu lesen`. ---- +## 2. Analyse starten -## 2) Disc einlegen +Aktion im Dashboard: -Pipeline wechselt auf `DISC_DETECTED`. +- `Analyse starten` -Falls nötig manuell neu scannen: +Erwartung: -```bash -curl -X POST http://localhost:3001/api/pipeline/rescan-disc -``` +- Status `ANALYZING` +- danach Metadaten-Dialog ---- +## 3. Metadaten auswählen -## 3) Analyse starten +Im Dialog `Metadaten auswählen`: -Klicke im Dashboard auf `Analyse starten`. +1. OMDb-Suche nutzen oder manuell eintragen +2. passenden Treffer markieren +3. `Auswahl übernehmen` -Intern: +## 4. Auf den nächsten Zustand reagieren -- Job wird angelegt -- MakeMKV-Analyse läuft (`ANALYZING`) -- UI wechselt in Metadatenauswahl (`METADATA_SELECTION`) +- Normalfall ohne vorhandenes RAW: `RIPPING` -> `MEDIAINFO_CHECK` -> `READY_TO_ENCODE` +- bei vorhandenem RAW: direkt `MEDIAINFO_CHECK` -> `READY_TO_ENCODE` +- bei unklarer Blu-ray-Playlist: `WAITING_FOR_USER_DECISION` (Playlist auswählen und übernehmen) ---- +## 5. Review in `READY_TO_ENCODE` -## 4) Metadaten bestätigen +Im aufgeklappten Job (`Pipeline-Status`): -Im Dialog: +- Encode-Titel wählen +- Audio-/Subtitle-Spuren prüfen +- optional User-Preset auswählen +- optional Pre-/Post-Skripte bzw. Ketten hinzufügen -- OMDb-Ergebnis wählen oder manuell eintragen -- bei Playlist-Abfrage ggf. `selectedPlaylist` wählen +Dann `Encoding starten`. -Nach Bestätigung startet Ripster automatisch weiter. +## 6. Encoding überwachen ---- +Während `ENCODING`: -## 5) Pipeline-Pfade +- Fortschritt + ETA im Dashboard +- Live-Log im `Pipeline-Status` +- Queue- und Skript/Cron-Status parallel beobachtbar -Abhängig von Job/RAW-Situation: +## 7. Ergebnis prüfen -- **kein RAW vorhanden** -> `RIPPING` -- **RAW vorhanden** -> `MEDIAINFO_CHECK` -- **mehrdeutige Playlist** -> `WAITING_FOR_USER_DECISION` +Bei `FINISHED`: -Wenn Parallel-Limit erreicht ist, wird der Job in die Queue eingereiht. +1. Seite `Historie` öffnen +2. Job in Details öffnen +3. Output-Pfad, Status und Log prüfen ---- +## Typische Folgeaktionen -## 6) Review (`READY_TO_ENCODE`) - -Im Review-Panel: - -- Titel auswählen (falls mehrere) -- Audio-/Subtitle-Tracks auswählen -- optional User-Preset anwenden -- optional Pre-/Post-Skripte und Ketten hinzufügen - -Mit `Encoding starten` wird `confirm-encode` + Start ausgelöst. - ---- - -## 7) Encoding (`ENCODING`) - -Während Encoding: - -- Live-Fortschritt/ETA über WebSocket -- Pre-Encode-Ausführungen laufen vor HandBrake -- Post-Encode-Ausführungen laufen nach HandBrake - -Wichtig: - -- Pre-Encode-Fehler -> Job endet in `ERROR` -- Post-Encode-Fehler -> Job kann `FINISHED` bleiben, aber mit Fehlerhinweis im Status/Log - ---- - -## 8) Abschluss (`FINISHED`) - -Ergebnis: - -- Ausgabe in `movie_dir` (ggf. profilspezifisch) -- Job in Historie sichtbar -- Logs im konfigurierten `log_dir` - ---- - -## Nützliche API-Shortcuts - -```bash -# Pipeline-Snapshot -curl http://localhost:3001/api/pipeline/state - -# Queue-Snapshot -curl http://localhost:3001/api/pipeline/queue - -# Jobs -curl http://localhost:3001/api/history -``` +- Falsches OMDb-Match: in `Historie` -> `OMDb neu zuordnen` +- Neue Encodierung aus RAW: `RAW neu encodieren` +- Prüfung komplett neu aufbauen: `Review neu starten` diff --git a/docs/gui/dashboard.md b/docs/gui/dashboard.md new file mode 100644 index 0000000..79ff3e7 --- /dev/null +++ b/docs/gui/dashboard.md @@ -0,0 +1,124 @@ +# Dashboard + +Das Dashboard ist die **Betriebszentrale** für laufende Jobs. + +## Aufbau der Seite + +Die Bereiche erscheinen in dieser Reihenfolge: + +1. `Hardware Monitoring` +2. `Job Queue` +3. `Skript- / Cron-Status` +4. `Job Übersicht` +5. `Disk-Information` + +--- + +## 1) Hardware Monitoring + +Zeigt live: + +- CPU (gesamt + optional pro Kern) +- RAM +- GPU-Auslastung/Temperatur/VRAM +- freien Speicher in den konfigurierten Pfaden + +Wichtig für den Betrieb: + +- Hohe Speicherauslastung oder fast volle Zielpfade früh erkennen +- über `Settings` aktivierbar/deaktivierbar (`hardware_monitoring_*`) + +## 2) Job Queue + +Zwei Spalten: + +- `Laufende Jobs` +- `Warteschlange` + +Mögliche Aktionen: + +- Queue per Drag-and-Drop umsortieren +- Queue-Job entfernen (`X`) +- zusätzliche Queue-Elemente einfügen (`+`): + - Skript + - Skriptkette + - Wartezeit + +Hinweis: + +- `Parallel` zeigt das aktuell konfigurierte Parallel-Limit (`pipeline_max_parallel_jobs`). + +## 3) Skript- / Cron-Status + +Zeigt: + +- aktive Ausführungen (Skripte, Ketten, Cron) +- zuletzt abgeschlossene Ausführungen + +Mögliche Aktionen: + +- laufende Ketten: `Nächster Schritt` +- laufende Einträge: `Abbrechen` +- Historie der Aktivitäten: `Liste leeren` + +## 4) Job Übersicht + +Kompakte Jobliste mit Status, Fortschritt, ETA. Klick auf einen Job klappt die Detailsteuerung auf. + +Im aufgeklappten Zustand erscheint die Karte `Pipeline-Status` mit allen zustandsabhängigen Aktionen. + +### Zustandsabhängige Hauptaktionen + +| Zustand | Typische Aktion | +|---|---| +| `DISC_DETECTED` / `IDLE` | `Analyse starten` | +| `METADATA_SELECTION` | `Metadaten öffnen` | +| `WAITING_FOR_USER_DECISION` | Playlist wählen und `Playlist übernehmen` | +| `READY_TO_START` | `Job starten` | +| `READY_TO_ENCODE` | Tracks/Skripte prüfen, dann `Encoding starten` | +| laufend (`ANALYZING`/`RIPPING`/`ENCODING`) | `Abbrechen` | +| `ERROR` / `CANCELLED` | `Retry Rippen`, `Disk-Analyse neu starten` | + +Zusätzlich je nach Job: + +- `Review neu starten` +- `Encode neu starten` +- `Aus Queue löschen` + +### Titel-/Spurprüfung (`READY_TO_ENCODE`) + +Im selben Block siehst du: + +- Auswahl des Encode-Titels +- Audio-/Subtitle-Trackauswahl +- User-Preset-Auswahl +- Pre-/Post-Encode-Skripte und Ketten +- Preview des finalen HandBrakeCLI-Befehls + +## 5) Disk-Information + +Zeigt aktuelles Laufwerk und Disc-Metadaten (`Pfad`, `Modell`, `Disc-Label`, `Mount`). + +Aktionen: + +- `Laufwerk neu lesen` +- `Disk neu analysieren` +- `Metadaten-Modal öffnen` + +--- + +## Wichtige Dialoge im Dashboard + +### Metadaten auswählen + +- OMDb-Suche + Ergebnisliste +- manuelle Eingabe als Fallback +- `Auswahl übernehmen` startet den nächsten Pipeline-Schritt + +### Abbruch-Bereinigung + +Nach Abbruch kann Ripster optional fragen, ob erzeugte RAW- oder Movie-Dateien gelöscht werden sollen. + +### Queue-Eintrag einfügen + +Erstellt gezielt einen Skript-, Ketten- oder Warte-Eintrag an einer bestimmten Queue-Position. diff --git a/docs/gui/database.md b/docs/gui/database.md new file mode 100644 index 0000000..aa11d22 --- /dev/null +++ b/docs/gui/database.md @@ -0,0 +1,39 @@ +# Database (Expert) + +`/database` ist eine erweiterte Ansicht für Power-User und Recovery-Fälle. + +## Zugriff + +- Route direkt aufrufen: `/database` +- nicht Teil der Standard-Navigation + +## Bereiche + +### 1) `Historie & Datenbank` + +Tabellarische Jobansicht mit: + +- ID, Poster, Medium, Titel +- Status +- Start/Ende + +Aktionen im Detaildialog entsprechen weitgehend der Seite `Historie` (inkl. Re-Encode, Review-Neustart, OMDb-Zuordnung, Dateilöschung). + +### 2) `RAW ohne Historie` + +Listet RAW-Ordner, die keinen zugehörigen Job-Eintrag haben. + +Aktionen: + +- `RAW prüfen` (Scan der konfigurierten RAW-Pfade) +- `Job anlegen` (Orphan-RAW in Historie importieren) + +## Typischer Einsatz + +- nach manuellen Dateioperationen +- nach Migrationen oder Recovery +- wenn RAW-Dateien vorhanden sind, aber kein Historieneintrag existiert + +## Vorsicht + +Diese Seite erlaubt Eingriffe mit direkter Auswirkung auf Datenbestand und Historie. Vor Lösch- oder Importaktionen Pfade und Zieljob sorgfältig prüfen. diff --git a/docs/gui/history.md b/docs/gui/history.md new file mode 100644 index 0000000..3f2b049 --- /dev/null +++ b/docs/gui/history.md @@ -0,0 +1,62 @@ +# Historie + +Die Seite `Historie` ist für Suche, Prüfung und Nachbearbeitung bestehender Jobs. + +## Hauptansicht + +Filter und Werkzeuge: + +- Suche (Titel/IMDb) +- Status-Filter +- Medium-Filter (`Blu-ray`, `DVD`, `Sonstiges`) +- Sortierung +- Listen-/Grid-Layout + +Jeder Eintrag zeigt: + +- Poster, Titel, Jahr, IMDb +- Medium-Indikator +- Status +- Start/Ende +- Verfügbarkeit von RAW/Movie +- Ratings (wenn OMDb-Daten vorhanden) + +Klick auf einen Eintrag öffnet die Detailansicht. + +--- + +## Job-Detaildialog + +Bereiche: + +- Film-Infos + OMDb-Details +- Job-Infos (Status, Pfade, Erfolgsflags, Fehler) +- hinterlegte Encode-Auswahl +- ausgeführter HandBrake-Befehl +- strukturierte JSON-Blöcke (OMDb/MakeMKV/MediaInfo/EncodePlan/HandBrake) +- Log-Ladefunktionen (`Tail`, `Vollständig`) + +## Typische Aktionen im Detaildialog + +- `OMDb neu zuordnen` +- `Encode neu starten` +- `Review neu starten` +- `RAW neu encodieren` +- `RAW löschen`, `Movie löschen`, `Beides löschen` +- `Historieneintrag löschen` +- bei Queue-Lock: `Aus Queue löschen` + +## Wann welche Aktion? + +| Ziel | Aktion | +|---|---| +| Metadaten korrigieren | `OMDb neu zuordnen` | +| mit gleicher bestätigter Auswahl neu encodieren | `Encode neu starten` | +| Titel-/Spurprüfung komplett neu berechnen | `Review neu starten` | +| aus vorhandenem RAW erneut encodieren | `RAW neu encodieren` | +| Speicher freigeben | Dateilöschaktionen | + +## Logs + +- `Tail laden (800)` für schnelle Fehleranalyse +- `Vollständiges Log laden` für vollständige Nachverfolgung diff --git a/docs/gui/index.md b/docs/gui/index.md new file mode 100644 index 0000000..3f9fcdc --- /dev/null +++ b/docs/gui/index.md @@ -0,0 +1,24 @@ +# GUI-Seiten + +Ripster hat drei Hauptseiten in der Navigation plus eine Expert-Seite. + +## Seitenüberblick + +| Seite | Zweck | +|---|---| +| [Dashboard](dashboard.md) | Live-Betrieb: Pipeline, Queue, Aktivitäten, Disc-Infos | +| [Settings](settings.md) | Konfiguration, Skripte, Ketten, Presets, Cronjobs | +| [Historie](history.md) | abgeschlossene/laufende Jobs durchsuchen und nachbearbeiten | +| [Database (Expert)](database.md) | tabellarische Rohsicht inkl. Orphan-RAW-Import | + +## Empfohlene Nutzung im Alltag + +1. **Start eines neuen Jobs:** `Dashboard` +2. **Regeln/Automatisierung anpassen:** `Settings` +3. **Ergebnisse prüfen oder Jobs nachbearbeiten:** `Historie` +4. **Sonderfälle/Recovery:** `Database` + +## Hinweise zur Navigation + +- `Dashboard`, `Settings`, `Historie` sind direkt in der Kopfnavigation. +- `Database` ist als Expert-Route verfügbar: `/database`. diff --git a/docs/gui/settings.md b/docs/gui/settings.md new file mode 100644 index 0000000..a914a20 --- /dev/null +++ b/docs/gui/settings.md @@ -0,0 +1,92 @@ +# Settings + +Die Seite `Settings` steuert Konfiguration und Automatisierung. + +## Tabs im Überblick + +| Tab | Zweck | +|---|---| +| `Konfiguration` | alle Kernsettings (Pfade, Tools, Monitoring, Metadaten, Queue, Benachrichtigungen) | +| `Scripte` | einzelne Bash-Skripte verwalten und testen | +| `Skriptketten` | Sequenzen aus Skript- und Warte-Schritten bauen | +| `Encode-Presets` | benutzerdefinierte Presets für das Review im Dashboard | +| `Cronjobs` | zeitgesteuerte Skript-/Kettenausführung | + +--- + +## Tab `Konfiguration` + +Wichtiges Bedienmuster: + +1. Werte ändern +2. `Änderungen speichern` +3. bei Bedarf `Änderungen verwerfen` oder `Neu laden` + +Zusätzlich: + +- `PushOver Test` sendet eine Testnachricht +- Änderungen werden erst nach Speichern wirksam +- Tool-Preset-Felder bieten HandBrake-Presetauswahl direkt im Formular + +## Tab `Scripte` + +Funktionen: + +- Skript anlegen, bearbeiten, löschen +- Skript testen (`Test`) +- Reihenfolge per Drag-and-Drop + +Praxis: + +- Reihenfolge ist wichtig, weil ausgewählte Skripte später sequentiell abgearbeitet werden. +- Testresultate zeigen Exit-Code, Dauer und stdout/stderr. + +## Tab `Skriptketten` + +Funktionen: + +- Kette anlegen/bearbeiten/löschen +- Kette testen +- Reihenfolge der Ketten per Drag-and-Drop + +Im Ketten-Editor: + +- Bausteine links (`Warten`, vorhandene Skripte) +- Schritte rechts per Klick oder Drag-and-Drop hinzufügen +- Schrittreihenfolge im Canvas ändern + +## Tab `Encode-Presets` + +Ein Preset bündelt: + +- optional HandBrake-Preset (`-Z`) +- optionale Extra-Args +- Medientyp (`Universell`, `Blu-ray`, `DVD`, `Sonstiges`) + +Verwendung: + +- Diese Presets erscheinen später im Dashboard im Review (`READY_TO_ENCODE`). + +## Tab `Cronjobs` + +Funktionen: + +- Cronjob anlegen und bearbeiten +- Quelle wählen: Skript oder Skriptkette +- Cron-Ausdruck validieren +- `Jetzt ausführen` +- Logs je Cronjob anzeigen +- `Aktiviert` und `Pushover` toggeln + +Hilfen: + +- Beispiele für Cron-Ausdrücke direkt im Dialog +- Link zu `crontab.guru` im Editor + +--- + +## Empfehlung für stabile Nutzung + +1. Erst `Konfiguration` sauber setzen +2. dann Skripte/Ketten testen +3. danach Cronjobs aktivieren diff --git a/docs/index.md b/docs/index.md index fc42eb6..4ca2142 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,141 +1,33 @@ -# Ripster +# Ripster Handbuch -**Halbautomatische Disc-Ripping-Plattform für DVDs und Blu-rays** +Dieses Dokumentationsset ist als **Benutzerhandbuch** aufgebaut: erst Bedienung und Alltag, dann Technik im Anhang. --- -
+## Schnellstart in 3 Schritten -- :material-disc: **Automatisiertes Ripping** - - --- - - Disc einlegen – Ripster erkennt sie automatisch und startet den Analyse-Workflow mit MakeMKV. - - [:octicons-arrow-right-24: Workflow verstehen](pipeline/workflow.md) - -- :material-movie-open: **Metadata-Integration** - - --- - - Automatische Suche in der OMDb-Datenbank für Filmtitel, Poster und IMDb-IDs. - - [:octicons-arrow-right-24: Konfiguration](getting-started/configuration.md) - -- :material-cog: **Flexibles Encoding** - - --- - - HandBrake-Encoding mit individueller Track-Auswahl für Audio- und Untertitelspuren. - - [:octicons-arrow-right-24: Encode-Planung](pipeline/encoding.md) - -- :material-history: **Job-Historie** - - --- - - Vollständiges Audit-Trail aller Ripping-Jobs mit Logs und Re-Encode-Funktion. - - [:octicons-arrow-right-24: History API](api/history.md) - -
+1. Voraussetzungen prüfen und installieren: [Installation](getting-started/installation.md) +2. Grundkonfiguration in der UI setzen: [Ersteinrichtung](getting-started/configuration.md) +3. Ersten vollständigen Job durchlaufen: [Erster Lauf](getting-started/quickstart.md) --- -## Was ist Ripster? +## Was du hier findest -Ripster ist eine webbasierte Anwendung zur **halbautomatischen Digitalisierung** von DVDs und Blu-rays. Die Anwendung kombiniert bewährte Open-Source-Tools zu einem durchgängigen, komfortablen Workflow: - -``` -Disc einlegen → Erkennung → Analyse → Metadaten wählen → Rippen → Encodieren → Fertig -``` - -### Kernfunktionen - -| Feature | Beschreibung | -|---------|-------------| -| **Echtzeit-Updates** | WebSocket-basierte Live-Statusanzeige ohne Reload | -| **Intelligente Playlist-Analyse** | Erkennt Blu-ray Playlist-Verschleierung (Fake-Playlists) | -| **Track-Auswahl** | Individuelle Auswahl von Audio- und Untertitelspuren | -| **Orphan-Recovery** | Import von bereits gerippten Dateien als Jobs | -| **PushOver-Benachrichtigungen** | Mobile Alerts bei Fertigstellung oder Fehlern | -| **DB-Korruptions-Recovery** | Automatische Quarantäne bei korrupten SQLite-Dateien | -| **Re-Encoding** | Erneutes Encodieren ohne neu rippen | +- **Benutzerhandbuch** + - Installation + - GUI-Seiten im Detail (`Dashboard`, `Settings`, `Historie`, `Database`) + - typische Arbeitsabläufe aus Anwendersicht +- **Technischer Anhang** + - vollständige Einstellungsreferenz + - Pipeline-/API-/Architekturdetails + - Deployment und Tool-Hintergründe --- -## Technologie-Stack +## Empfohlene Lesereihenfolge -=== "Backend" - - - **Node.js** >= 20.19.0 mit Express.js - - **SQLite3** mit automatischen Schema-Migrationen - - **WebSocket** (`ws`) für Echtzeit-Kommunikation - - Externe CLI-Tools: `makemkvcon`, `HandBrakeCLI`, `mediainfo` - -=== "Frontend" - - - **React** 18.3.1 mit React Router - - **Vite** 5.4.12 als Build-Tool - - **PrimeReact** 10.9.2 als UI-Bibliothek - - WebSocket-Client für Live-Updates - -=== "Externe Tools" - - | Tool | Zweck | - |------|-------| - | `makemkvcon` | Disc-Analyse & MKV/Backup-Ripping | - | `HandBrakeCLI` | Video-Encoding | - | `mediainfo` | Track-Informationen aus gerippten Dateien | - | OMDb API | Filmmetadaten (Titel, Poster, IMDb-ID) | - ---- - -## Schnellstart - -```bash -# 1. Repository klonen -git clone https://github.com/YOUR_GITHUB_USERNAME/ripster.git -cd ripster - -# 2. Starten (Node.js >= 20 erforderlich) -./start.sh - -# 3. Browser öffnen -open http://localhost:5173 -``` - -!!! tip "Erste Schritte" - Die vollständige Installationsanleitung mit allen Voraussetzungen findest du unter [Erste Schritte](getting-started/index.md). - ---- - -## Pipeline-Überblick - -
- -```mermaid -flowchart LR - IDLE --> DD[DISC_DETECTED] - DD --> META[METADATA\nSELECTION] - META --> RTS[READY_TO\nSTART] - RTS -->|Auto-Start| RIP[RIPPING] - RTS -->|Auto-Start mit RAW| MIC - RIP --> MIC[MEDIAINFO\nCHECK] - MIC -->|Playlist offen (Backup)| WUD[WAITING_FOR\nUSER_DECISION] - WUD --> MIC - MIC --> RTE[READY_TO\nENCODE] - RTE --> ENC[ENCODING] - ENC -->|inkl. Post-Skripte| FIN([FINISHED]) - ENC --> ERR([ERROR]) - RIP --> ERR - - style FIN fill:#e8f5e9,stroke:#66bb6a,color:#2e7d32 - style ERR fill:#ffebee,stroke:#ef5350,color:#c62828 - style WUD fill:#fff8e1,stroke:#ffa726,color:#e65100 - style ENC fill:#f3e5f5,stroke:#ab47bc,color:#6a1b9a -``` - -
- -`READY_TO_START` ist in der Praxis meist ein kurzer Übergangszustand: der Job wird nach Metadaten-Auswahl automatisch gestartet oder in die Queue eingeplant. +1. [Benutzerhandbuch Überblick](getting-started/index.md) +2. [GUI-Seiten](gui/index.md) +3. [Workflows aus Nutzersicht](workflows/index.md) +4. Bei Bedarf: [Technischer Anhang](appendix/index.md) diff --git a/docs/pipeline/index.md b/docs/pipeline/index.md index e18c035..413f924 100644 --- a/docs/pipeline/index.md +++ b/docs/pipeline/index.md @@ -1,6 +1,6 @@ -# Pipeline +# Anhang: Pipeline intern -Der Pipeline-Bereich beschreibt den Kern-Workflow von Ripster. +Dieser Abschnitt beschreibt die technische Pipeline-Logik hinter den UI-Workflows.
@@ -8,7 +8,7 @@ Der Pipeline-Bereich beschreibt den Kern-Workflow von Ripster. --- - Zustände, Übergänge und Queue-Verhalten. + Zustandsmodell, Übergänge, Queue-Verhalten. [:octicons-arrow-right-24: Workflow](workflow.md) @@ -16,7 +16,7 @@ Der Pipeline-Bereich beschreibt den Kern-Workflow von Ripster. --- - Wie Titel/Tracks für HandBrake vorbereitet und bestätigt werden. + Aufbereitung von Titeln/Tracks und Bestätigungslogik. [:octicons-arrow-right-24: Encoding](encoding.md) @@ -24,16 +24,20 @@ Der Pipeline-Bereich beschreibt den Kern-Workflow von Ripster. --- - Bewertung mehrdeutiger Blu-ray-Playlists und manuelle Entscheidung. + Bewertung mehrdeutiger Blu-ray-Playlists. [:octicons-arrow-right-24: Playlist-Analyse](playlist-analysis.md) -- :material-script-text: **Encode-Skripte (Pre & Post)** +- :material-script-text: **Pre-/Post-Encode-Ausführungen** --- - Skripte/Ketten vor und nach dem Encode ausführen. + Skript- und Kettenlauf vor/nach dem Encoding. [:octicons-arrow-right-24: Encode-Skripte](post-encode-scripts.md)
+ +## Zurück zum Handbuch + +- [Workflows aus Nutzersicht](../workflows/index.md) diff --git a/docs/tools/index.md b/docs/tools/index.md index da1b5b2..6af7003 100644 --- a/docs/tools/index.md +++ b/docs/tools/index.md @@ -1,6 +1,6 @@ -# Externe Tools +# Anhang: Externe Tools -Ripster ist ein **Orchestrator** – die eigentliche Arbeit erledigen diese bewährten Open-Source-Tools: +Ripster orchestriert externe CLI-Tools. Dieser Abschnitt erklärt deren Rolle im Gesamtsystem.
@@ -8,7 +8,7 @@ Ripster ist ein **Orchestrator** – die eigentliche Arbeit erledigen diese bew --- - Disc-Analyse und Ripping. Erstellt MKV-Dateien oder vollständige Backups. + Disc-Analyse und Ripping. [:octicons-arrow-right-24: MakeMKV](makemkv.md) @@ -16,7 +16,7 @@ Ripster ist ein **Orchestrator** – die eigentliche Arbeit erledigen diese bew --- - Video-Encoding mit umfangreichen Preset-Optionen. + Video-Encoding inklusive Preset-Logik. [:octicons-arrow-right-24: HandBrake](handbrake.md) @@ -24,7 +24,7 @@ Ripster ist ein **Orchestrator** – die eigentliche Arbeit erledigen diese bew --- - Analyse von Track-Informationen in Mediendateien. + Track-/Containeranalyse für Review und Auswahl. [:octicons-arrow-right-24: MediaInfo](mediainfo.md) diff --git a/docs/workflows/index.md b/docs/workflows/index.md new file mode 100644 index 0000000..aa6b0ec --- /dev/null +++ b/docs/workflows/index.md @@ -0,0 +1,61 @@ +# Workflows aus Nutzersicht + +Diese Seite beschreibt typische Abläufe mit den passenden UI-Aktionen. + +## Workflow 1: Standardlauf (Disc -> fertige Datei) + +1. `Dashboard`: Disc einlegen, `Analyse starten` +2. Metadaten im Dialog übernehmen +3. bei `READY_TO_ENCODE` Titel/Tracks prüfen +4. `Encoding starten` +5. Ergebnis in `Historie` kontrollieren + +## Workflow 2: Playlist-Entscheidung bei Blu-ray + +1. Job landet in `WAITING_FOR_USER_DECISION` +2. im `Pipeline-Status` Playlist-Kandidaten vergleichen +3. gewünschte Playlist auswählen +4. `Playlist übernehmen` +5. danach normal weiter bis `READY_TO_ENCODE` + +## Workflow 3: Mehrere Jobs mit Queue + +1. Parallel-Limit in `Settings` setzen (`pipeline_max_parallel_jobs`) +2. neue Jobs starten; überschüssige Starts gehen in `Job Queue` +3. Reihenfolge per Drag-and-Drop anpassen +4. bei Bedarf Skript/Kette/Warten als Queue-Eintrag ergänzen + +## Workflow 4: Nachbearbeitung eines bestehenden Jobs + +In `Historie` -> Detaildialog: + +- Metadaten korrigieren: `OMDb neu zuordnen` +- gleiche Einstellungen erneut nutzen: `Encode neu starten` +- Analyse neu aufbauen: `Review neu starten` +- aus RAW erneut encodieren: `RAW neu encodieren` + +## Workflow 5: Automatisierung mit Skripten und Cron + +1. `Settings` -> `Scripte`: Skripte anlegen und testen +2. `Settings` -> `Skriptketten`: Ketten bauen und testen +3. im Dashboard-Review Pre-/Post-Ausführungen pro Job auswählen +4. `Settings` -> `Cronjobs`: zeitgesteuerte Ausführung konfigurieren +5. Status im Dashboard (`Skript- / Cron-Status`) überwachen + +## Workflow 6: Abbruch und Recovery + +### Fall A: Job wurde abgebrochen + +- im Dashboard optional erzeugte RAW/Movie-Datei bereinigen +- anschließend je nach Ziel: `Retry Rippen` oder `Disk-Analyse neu starten` + +### Fall B: Job steht in `READY_TO_ENCODE`, ist aber nicht aktive Session + +- in `Historie` oder `Database`: `Im Dashboard öffnen` +- im Dashboard Review erneut prüfen und starten + +### Fall C: RAW ohne Historieneintrag + +- `/database` öffnen +- Bereich `RAW ohne Historie` +- `Job anlegen` diff --git a/mkdocs.yml b/mkdocs.yml index 006f501..cb7b29c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,5 @@ site_name: Ripster -site_description: Halbautomatische Disc-Ripping-Plattform für DVDs & Blu-rays mit HandBrake-Encoding +site_description: Benutzerhandbuch für den Betrieb von Ripster mit technischem Anhang site_author: Michael site_url: https://mboehmlaender.github.io/ripster/ @@ -45,45 +45,54 @@ theme: nav: - Home: index.md - - Erste Schritte: + - Benutzerhandbuch: - getting-started/index.md - Voraussetzungen: getting-started/prerequisites.md - Installation: getting-started/installation.md - - Konfiguration: getting-started/configuration.md - - Schnellstart: getting-started/quickstart.md - - Architektur: - - architecture/index.md - - Übersicht: architecture/overview.md - - Backend-Services: architecture/backend.md - - Frontend-Komponenten: architecture/frontend.md - - Datenbank: architecture/database.md - - Pipeline: - - pipeline/index.md - - Workflow & Zustände: pipeline/workflow.md - - Encode-Planung & Track-Auswahl: pipeline/encoding.md - - Playlist-Analyse: pipeline/playlist-analysis.md - - Encode-Skripte (Pre & Post): pipeline/post-encode-scripts.md - - API-Referenz: - - api/index.md - - Pipeline API: api/pipeline.md - - Settings API: api/settings.md - - History API: api/history.md - - Cron API: api/crons.md - - Runtime Activities API: api/runtime-activities.md - - WebSocket Events: api/websocket.md - - Konfiguration: - - configuration/index.md - - Alle Einstellungen: configuration/settings-reference.md - - Umgebungsvariablen: configuration/environment.md - - Deployment: - - deployment/index.md - - Entwicklungsumgebung: deployment/development.md - - Produktion: deployment/production.md - - Externe Tools: - - tools/index.md - - MakeMKV: tools/makemkv.md - - HandBrake: tools/handbrake.md - - MediaInfo: tools/mediainfo.md + - Ersteinrichtung: getting-started/configuration.md + - Erster Lauf: getting-started/quickstart.md + - GUI-Seiten: + - gui/index.md + - Dashboard: gui/dashboard.md + - Settings: gui/settings.md + - Historie: gui/history.md + - Database (Expert): gui/database.md + - Workflows aus Nutzersicht: workflows/index.md + - Technischer Anhang: + - appendix/index.md + - Konfiguration: + - configuration/index.md + - Alle Einstellungen: configuration/settings-reference.md + - Umgebungsvariablen: configuration/environment.md + - Pipeline intern: + - pipeline/index.md + - Workflow & Zustände: pipeline/workflow.md + - Encode-Planung & Track-Auswahl: pipeline/encoding.md + - Playlist-Analyse: pipeline/playlist-analysis.md + - Encode-Skripte (Pre & Post): pipeline/post-encode-scripts.md + - API-Referenz: + - api/index.md + - Pipeline API: api/pipeline.md + - Settings API: api/settings.md + - History API: api/history.md + - Cron API: api/crons.md + - Runtime Activities API: api/runtime-activities.md + - WebSocket Events: api/websocket.md + - Architektur: + - architecture/index.md + - Übersicht: architecture/overview.md + - Backend-Services: architecture/backend.md + - Frontend-Komponenten: architecture/frontend.md + - Datenbank: architecture/database.md + - Deployment: + - deployment/index.md + - Entwicklungsumgebung: deployment/development.md + - Produktion: deployment/production.md + - Externe Tools: + - tools/index.md + - MakeMKV: tools/makemkv.md + - HandBrake: tools/handbrake.md + - MediaInfo: tools/mediainfo.md plugins: - search: diff --git a/site/404.html b/site/404.html index 23596d9..c065753 100644 --- a/site/404.html +++ b/site/404.html @@ -1 +1 @@ - Ripster

404 - Not found

\ No newline at end of file + Ripster

404 - Not found

\ No newline at end of file diff --git a/site/api/crons/index.html b/site/api/crons/index.html index 47214d2..a75a1d1 100644 --- a/site/api/crons/index.html +++ b/site/api/crons/index.html @@ -1,4 +1,4 @@ - Cron API - Ripster

Cron API

Ripster enthält ein eingebautes Cron-System für Skripte und Skript-Ketten (sourceType: script|chain).


GET /api/crons

Listet alle Cron-Jobs.

{
+ Cron API - Ripster      

Cron API

Ripster enthält ein eingebautes Cron-System für Skripte und Skript-Ketten (sourceType: script|chain).


GET /api/crons

Listet alle Cron-Jobs.

{
   "jobs": [
     {
       "id": 1,
diff --git a/site/api/history/index.html b/site/api/history/index.html
index c337cc4..a7f68f4 100644
--- a/site/api/history/index.html
+++ b/site/api/history/index.html
@@ -1,4 +1,4 @@
- History API - Ripster      

History API

Endpunkte für Job-Historie, Orphan-Import und Löschoperationen.


GET /api/history

Liefert Jobs (optionale Filter).

Query-Parameter:

Parameter Typ Beschreibung
status string Filter nach Job-Status
search string Suche in Titel-Feldern

Beispiel:

GET /api/history?status=FINISHED&search=Inception
+ History API - Ripster      

History API

Endpunkte für Job-Historie, Orphan-Import und Löschoperationen.


GET /api/history

Liefert Jobs (optionale Filter).

Query-Parameter:

Parameter Typ Beschreibung
status string Filter nach Job-Status
search string Suche in Titel-Feldern

Beispiel:

GET /api/history?status=FINISHED&search=Inception
 

Response:

{
   "jobs": [
     {
diff --git a/site/api/index.html b/site/api/index.html
index eed6d63..4a9ad36 100644
--- a/site/api/index.html
+++ b/site/api/index.html
@@ -1,15 +1,2 @@
- API-Referenz - Ripster      

API-Referenz

Ripster bietet eine REST-API für Steuerung/Verwaltung sowie einen WebSocket-Endpunkt für Echtzeit-Updates.


Basis-URL

http://localhost:3001
-

API-Prefix: /api

Beispiele:

  • GET /api/health
  • GET /api/pipeline/state

API-Gruppen

  • Health


    Service-Liveness.

    GET /api/health

  • Pipeline API


    Analyse, Start/Retry/Cancel, Queue, Re-Encode.

    Pipeline API

  • Settings API


    Einstellungen, Skripte/Ketten, User-Presets.

    Settings API

  • History API


    Job-Historie, Orphan-Import, Löschoperationen.

    History API

  • Cron API


    Zeitgesteuerte Skript-/Kettenausführung.

    Cron API

  • WebSocket Events


    Pipeline-, Queue-, Disk-, Settings-, Cron- und Monitoring-Events.

    WebSocket


Authentifizierung

Es gibt keine eingebaute Authentifizierung. Ripster ist für lokalen Betrieb gedacht.


Fehlerformat

Fehler werden zentral als JSON geliefert:

{
-  "error": {
-    "message": "Job nicht gefunden.",
-    "statusCode": 404,
-    "reqId": "req_...",
-    "details": [
-      {
-        "field": "name",
-        "message": "Name darf nicht leer sein."
-      }
-    ]
-  }
-}
-

details ist optional (z. B. bei Validierungsfehlern).


Häufige Statuscodes

Code Bedeutung
200 Erfolg
201 Ressource erstellt
400 Ungültige Anfrage / Validierungsfehler
404 Ressource nicht gefunden
409 Konflikt (z. B. falscher Pipeline-Zustand, Job läuft bereits)
500 Interner Fehler
\ No newline at end of file + Anhang: API-Referenz - Ripster

Anhang: API-Referenz

REST- und WebSocket-Schnittstellen für Integration, Automatisierung und Debugging.

Basis-URL

http://localhost:3001
+

API-Prefix: /api

API-Gruppen

  • Health


    Service-Liveness.

    GET /api/health

  • Pipeline API


    Analyse, Start/Retry/Cancel, Queue, Re-Encode.

    Pipeline API

  • Settings API


    Einstellungen, Skripte/Ketten, User-Presets.

    Settings API

  • History API


    Job-Historie, Orphan-Import, Löschoperationen.

    History API

  • Cron API


    Zeitgesteuerte Skript-/Kettenausführung.

    Cron API

  • WebSocket Events


    Pipeline-, Queue-, Disk-, Settings-, Cron- und Monitoring-Events.

    WebSocket

Hinweis

Ripster hat keine eingebaute Authentifizierung und ist für lokalen, geschützten Betrieb gedacht.

\ No newline at end of file diff --git a/site/api/pipeline/index.html b/site/api/pipeline/index.html index 1830878..909c8a5 100644 --- a/site/api/pipeline/index.html +++ b/site/api/pipeline/index.html @@ -1,4 +1,4 @@ - Pipeline API - Ripster

Pipeline API

Endpunkte zur Steuerung des Pipeline-Workflows.


GET /api/pipeline/state

Liefert aktuellen Pipeline- und Hardware-Monitoring-Snapshot.

Response (Beispiel):

{
+ Pipeline API - Ripster      

Pipeline API

Endpunkte zur Steuerung des Pipeline-Workflows.


GET /api/pipeline/state

Liefert aktuellen Pipeline- und Hardware-Monitoring-Snapshot.

Response (Beispiel):

{
   "pipeline": {
     "state": "READY_TO_ENCODE",
     "activeJobId": 42,
diff --git a/site/api/runtime-activities/index.html b/site/api/runtime-activities/index.html
new file mode 100644
index 0000000..f553e66
--- /dev/null
+++ b/site/api/runtime-activities/index.html
@@ -0,0 +1,74 @@
+ Runtime Activities API - Ripster      

Runtime Activities API

Ripster verfolgt alle laufenden und kürzlich abgeschlossenen Aktivitäten (Skripte, Skript-Ketten, Cron-Jobs, interne Tasks) in Echtzeit über den RuntimeActivityService.


Übersicht

Aktivitäten entstehen, wenn Ripster intern Aktionen ausführt – z. B. beim Start eines Cron-Jobs, beim Ausführen einer Skript-Kette oder beim Durchlaufen von Pipeline-Schritten. Sie sind nicht persistent (kein DB-Speicher) und werden nur im Arbeitsspeicher gehalten.

  • Aktive Aktivitäten (active): Laufen gerade.
  • Letzte Aktivitäten (recent): Abgeschlossen, max. 120 Einträge.

Änderungen werden über WebSocket (RUNTIME_ACTIVITY_CHANGED) in Echtzeit gesendet.


Aktivitäts-Objekt

{
+  "id": 7,
+  "type": "chain",
+  "name": "Post-Encode Aufräumen",
+  "status": "running",
+  "source": "cron",
+  "message": "Schritt 2 von 3",
+  "currentStep": "cleanup.sh",
+  "currentStepType": "script",
+  "currentScriptName": "cleanup.sh",
+  "stepIndex": 2,
+  "stepTotal": 3,
+  "parentActivityId": null,
+  "jobId": 42,
+  "cronJobId": 3,
+  "chainId": 5,
+  "scriptId": null,
+  "canCancel": true,
+  "canNextStep": false,
+  "outcome": "running",
+  "errorMessage": null,
+  "output": null,
+  "stdout": null,
+  "stderr": null,
+  "stdoutTruncated": false,
+  "stderrTruncated": false,
+  "startedAt": "2026-03-10T10:00:00.000Z",
+  "finishedAt": null,
+  "durationMs": null,
+  "exitCode": null,
+  "success": null
+}
+

Felder

Feld Typ Beschreibung
id number Eindeutige ID (Laufzähler, nicht persistent)
type string Art der Aktivität: script | chain | cron | task
name string \| null Anzeigename der Aktivität
status string Aktueller Status: running | success | error
source string \| null Auslöser (z. B. cron, pipeline, manual)
message string \| null Kurztext zum aktuellen Zustand
currentStep string \| null Name des aktuell ausgeführten Schritts
currentStepType string \| null Typ des Schritts (z. B. script, wait)
currentScriptName string \| null Name des Skripts im aktuellen Schritt
stepIndex number \| null Aktueller Schritt (1-basiert)
stepTotal number \| null Gesamtanzahl Schritte
parentActivityId number \| null ID der übergeordneten Aktivität
jobId number \| null Verknüpfte Job-ID
cronJobId number \| null Verknüpfte Cron-Job-ID
chainId number \| null Verknüpfte Skript-Ketten-ID
scriptId number \| null Verknüpfte Skript-ID
canCancel boolean Abbrechen über API möglich
canNextStep boolean Nächster Schritt über API auslösbar
outcome string \| null Abschluss-Ergebnis: success | error | cancelled | skipped | running
errorMessage string \| null Fehlermeldung (max. 2.000 Zeichen)
output string \| null Allgemeine Ausgabe (max. 12.000 Zeichen)
stdout string \| null Standardausgabe des Prozesses (max. 12.000 Zeichen)
stderr string \| null Fehlerausgabe des Prozesses (max. 12.000 Zeichen)
stdoutTruncated boolean true, wenn stdout gekürzt wurde
stderrTruncated boolean true, wenn stderr gekürzt wurde
startedAt string ISO-8601-Zeitstempel des Starts
finishedAt string \| null ISO-8601-Zeitstempel des Endes
durationMs number \| null Laufzeit in Millisekunden
exitCode number \| null Exit-Code des Prozesses
success boolean \| null Erfolgsstatus (null bei laufender Aktivität)

Snapshot-Objekt

Alle Aktivitäts-Endpunkte geben einen Snapshot zurück:

{
+  "active": [ /* laufende Aktivitäten, nach startedAt absteigend */ ],
+  "recent": [ /* abgeschlossene Aktivitäten, nach finishedAt absteigend, max. 120 */ ],
+  "updatedAt": "2026-03-10T10:05:00.000Z"
+}
+

Endpunkte

GET /api/activities

Aktuellen Aktivitäts-Snapshot abrufen.

Antwort:

{
+  "active": [],
+  "recent": [
+    {
+      "id": 5,
+      "type": "script",
+      "name": "notify.sh",
+      "status": "success",
+      "outcome": "success",
+      "startedAt": "2026-03-10T09:58:00.000Z",
+      "finishedAt": "2026-03-10T09:58:02.000Z",
+      "durationMs": 2100,
+      "exitCode": 0,
+      "success": true,
+      "canCancel": false,
+      "canNextStep": false
+    }
+  ],
+  "updatedAt": "2026-03-10T10:05:00.000Z"
+}
+

POST /api/activities/:id/cancel

Aktive Aktivität abbrechen (nur wenn canCancel: true).

Parameter:

Name In Typ Beschreibung
id path number Aktivitäts-ID
reason body string Optionaler Abbruchgrund

Request Body:

{ "reason": "Manueller Abbruch durch Benutzer" }
+

Antwort (Erfolg):

{
+  "ok": true,
+  "action": null,
+  "snapshot": { "active": [], "recent": [], "updatedAt": "..." }
+}
+

Fehlercodes:

HTTP Bedeutung
404 Aktivität nicht gefunden oder bereits abgeschlossen
409 Abbrechen wird von dieser Aktivität nicht unterstützt

POST /api/activities/:id/next-step

Nächsten Schritt einer Aktivität auslösen (nur wenn canNextStep: true).

Parameter:

Name In Typ Beschreibung
id path number Aktivitäts-ID

Antwort (Erfolg):

{
+  "ok": true,
+  "action": null,
+  "snapshot": { "active": [], "recent": [], "updatedAt": "..." }
+}
+

Fehlercodes:

HTTP Bedeutung
404 Aktivität nicht gefunden
409 Nächster Schritt wird von dieser Aktivität nicht unterstützt

POST /api/activities/clear-recent

Alle abgeschlossenen Aktivitäten aus recent löschen.

Antwort:

{
+  "ok": true,
+  "removed": 14,
+  "snapshot": { "active": [], "recent": [], "updatedAt": "..." }
+}
+

Grenzwerte

Wert Limit
Maximale recent-Einträge 120
Maximale Länge stdout / stderr / output 12.000 Zeichen
Maximale Länge errorMessage / message 2.000 Zeichen
Maximale Länge outcome 40 Zeichen

Gekürzte Ausgaben erhalten den Suffix ...[gekürzt] (bei Inline-Text) bzw. \n...[gekürzt] (bei mehrzeiligem Output).


Echtzeit-Updates

Änderungen werden automatisch als RUNTIME_ACTIVITY_CHANGED WebSocket-Event gesendet. Die Frontend-Komponente braucht GET /api/activities nur beim initialen Laden aufzurufen.

\ No newline at end of file diff --git a/site/api/settings/index.html b/site/api/settings/index.html index adbb6b7..2837917 100644 --- a/site/api/settings/index.html +++ b/site/api/settings/index.html @@ -1,4 +1,4 @@ - Settings API - Ripster

Settings API

Endpunkte für Einstellungen, Skripte, Skript-Ketten und User-Presets.


GET /api/settings

Liefert alle Einstellungen kategorisiert.

Response (Struktur):

{
+ Settings API - Ripster      

Settings API

Endpunkte für Einstellungen, Skripte, Skript-Ketten und User-Presets.


GET /api/settings

Liefert alle Einstellungen kategorisiert.

Response (Struktur):

{
   "categories": [
     {
       "category": "Pfade",
diff --git a/site/api/websocket/index.html b/site/api/websocket/index.html
index 401f26f..527e18f 100644
--- a/site/api/websocket/index.html
+++ b/site/api/websocket/index.html
@@ -1,4 +1,4 @@
- WebSocket Events - Ripster      

WebSocket Events

Ripster sendet Echtzeit-Updates über /ws.


Verbindung

const ws = new WebSocket('ws://localhost:3001/ws');
+ WebSocket Events - Ripster      

WebSocket Events

Ripster sendet Echtzeit-Updates über /ws.


Verbindung

const ws = new WebSocket('ws://localhost:3001/ws');
 
 ws.onmessage = (event) => {
   const msg = JSON.parse(event.data);
@@ -95,4 +95,31 @@
     "nextRunAt": null
   }
 }
-

Reconnect-Verhalten

useWebSocket verbindet bei Abbruch automatisch neu:

  • Retry-Intervall: 1500ms
  • Wiederverbindung bis Komponente unmounted wird
\ No newline at end of file +

RUNTIME_ACTIVITY_CHANGED

Vollständiger Snapshot aller laufenden und kürzlich abgeschlossenen Aktivitäten.

Wird ausgelöst, wenn eine Aktivität gestartet, aktualisiert oder abgeschlossen wird sowie nach clear-recent.

{
+  "type": "RUNTIME_ACTIVITY_CHANGED",
+  "payload": {
+    "active": [
+      {
+        "id": 7,
+        "type": "chain",
+        "name": "Post-Encode Aufräumen",
+        "status": "running",
+        "source": "cron",
+        "message": "Schritt 2 von 3",
+        "currentStep": "cleanup.sh",
+        "currentStepType": "script",
+        "stepIndex": 2,
+        "stepTotal": 3,
+        "canCancel": true,
+        "canNextStep": false,
+        "outcome": "running",
+        "startedAt": "2026-03-10T10:00:00.000Z",
+        "finishedAt": null,
+        "durationMs": null
+      }
+    ],
+    "recent": [],
+    "updatedAt": "2026-03-10T10:00:05.000Z"
+  }
+}
+

Vollständige Feldbeschreibung: Runtime Activities API.


Reconnect-Verhalten

useWebSocket verbindet bei Abbruch automatisch neu:

  • Retry-Intervall: 1500ms
  • Wiederverbindung bis Komponente unmounted wird
\ No newline at end of file diff --git a/site/appendix/index.html b/site/appendix/index.html new file mode 100644 index 0000000..0054082 --- /dev/null +++ b/site/appendix/index.html @@ -0,0 +1 @@ + Technischer Anhang - Ripster

Technischer Anhang

Dieser Bereich enthält die technische Referenz hinter dem Benutzerhandbuch.

Inhalt

  • Konfiguration
  • komplette Feldreferenz
  • Umgebungsvariablen
  • Pipeline intern
  • Zustandsmodell
  • Encode-Planung
  • Playlist-Analyse
  • Pre-/Post-Encode-Ausführungen
  • API-Referenz
  • REST-Endpunkte
  • WebSocket-Events
  • Architektur
  • Backend-/Frontend-Aufbau
  • Datenbank
  • Deployment
  • Betrieb in Entwicklung und Produktion
  • Externe Tools
  • MakeMKV, HandBrake, MediaInfo

Wann du in den Anhang wechselst

  • du integrierst Ripster mit anderen Systemen
  • du betreibst mehrere Instanzen oder willst tiefer debuggen
  • du brauchst Feld-/API-/Schema-Details für Automatisierung
\ No newline at end of file diff --git a/site/architecture/backend/index.html b/site/architecture/backend/index.html index d80227f..d129c43 100644 --- a/site/architecture/backend/index.html +++ b/site/architecture/backend/index.html @@ -1 +1 @@ - Backend-Services - Ripster

Backend-Services

Das Backend ist in Services aufgeteilt, die von Express-Routen orchestriert werden.


pipelineService.js

Zentrale Workflow-Orchestrierung.

Aufgaben:

  • Pipeline-State-Machine + Persistenz (pipeline_state)
  • Disc-Analyse/Rip/Review/Encode
  • Queue-Management (Jobs + script|chain|wait Einträge)
  • Retry/Re-Encode/Restart-Flows
  • WebSocket-Broadcasts für State/Progress/Queue

Wichtige Methoden:

  • analyzeDisc()
  • selectMetadata()
  • startPreparedJob()
  • confirmEncodeReview()
  • cancel()
  • retry()
  • reencodeFromRaw()
  • restartReviewFromRaw()
  • restartEncodeWithLastSettings()
  • resumeReadyToEncodeJob()
  • enqueueNonJobEntry(), reorderQueue(), removeQueueEntry()

diskDetectionService.js

Pollt Laufwerk(e) und emittiert:

  • discInserted
  • discRemoved
  • error

Zusatz:

  • Modus auto oder explicit
  • heuristische mediaProfile-Erkennung (bluray/dvd/other)
  • rescanAndEmit() für manuellen Trigger

settingsService.js

Settings-Layer mit Validation/Serialisierung.

Features:

  • getCategorizedSettings() für UI-Form
  • setSettingValue() / setSettingsBulk()
  • profilspezifische Auflösung (resolveEffectiveToolSettings)
  • CLI-Config-Building für MakeMKV/HandBrake/MediaInfo
  • HandBrake-Preset-Liste via HandBrakeCLI -z
  • MakeMKV-Registration-Command aus makemkv_registration_key

historyService.js

Historie + Dateioperationen.

Features:

  • Job-Liste/Detail inkl. Log-Tail
  • Orphan-RAW-Erkennung und Import
  • OMDb-Nachzuweisung
  • Dateilöschung (raw|movie|both)
  • Job-Löschung (none|raw|movie|both)

cronService.js

Integriertes Cron-System ohne externe Parser-Library.

Features:

  • 5-Feld-Cron-Parser + nextRun-Berechnung
  • Quellen: script oder chain
  • Laufzeitlogs (cron_run_logs)
  • manuelles Triggern
  • WebSocket-Events: CRON_JOBS_UPDATED, CRON_JOB_UPDATED

Weitere Services

  • scriptService.js (CRUD + Test + Wrapper-Ausführung)
  • scriptChainService.js (CRUD + Step-Execution)
  • userPresetService.js (HandBrake User-Presets)
  • hardwareMonitorService.js (CPU/RAM/GPU/Storage)
  • websocketService.js (Client-Registry + Broadcast)
  • notificationService.js (PushOver)
  • logger.js (rotierende Datei-Logs)

Bootstrapping (src/index.js)

Beim Start:

  1. DB init/migrate
  2. Pipeline-Init
  3. Cron-Init
  4. Express-Routes + Error-Handler
  5. WebSocket-Server auf /ws
  6. Hardware-Monitoring-Init
  7. Disk-Detection-Start
\ No newline at end of file + Backend-Services - Ripster

Backend-Services

Das Backend ist in Services aufgeteilt, die von Express-Routen orchestriert werden.


pipelineService.js

Zentrale Workflow-Orchestrierung.

Aufgaben:

  • Pipeline-State-Machine + Persistenz (pipeline_state)
  • Disc-Analyse/Rip/Review/Encode
  • Queue-Management (Jobs + script|chain|wait Einträge)
  • Retry/Re-Encode/Restart-Flows
  • WebSocket-Broadcasts für State/Progress/Queue

Wichtige Methoden:

  • analyzeDisc()
  • selectMetadata()
  • startPreparedJob()
  • confirmEncodeReview()
  • cancel()
  • retry()
  • reencodeFromRaw()
  • restartReviewFromRaw()
  • restartEncodeWithLastSettings()
  • resumeReadyToEncodeJob()
  • enqueueNonJobEntry(), reorderQueue(), removeQueueEntry()

diskDetectionService.js

Pollt Laufwerk(e) und emittiert:

  • discInserted
  • discRemoved
  • error

Zusatz:

  • Modus auto oder explicit
  • heuristische mediaProfile-Erkennung (bluray/dvd/other)
  • rescanAndEmit() für manuellen Trigger

settingsService.js

Settings-Layer mit Validation/Serialisierung.

Features:

  • getCategorizedSettings() für UI-Form
  • setSettingValue() / setSettingsBulk()
  • profilspezifische Auflösung (resolveEffectiveToolSettings)
  • CLI-Config-Building für MakeMKV/HandBrake/MediaInfo
  • HandBrake-Preset-Liste via HandBrakeCLI -z
  • MakeMKV-Registration-Command aus makemkv_registration_key

historyService.js

Historie + Dateioperationen.

Features:

  • Job-Liste/Detail inkl. Log-Tail
  • Orphan-RAW-Erkennung und Import
  • OMDb-Nachzuweisung
  • Dateilöschung (raw|movie|both)
  • Job-Löschung (none|raw|movie|both)

cronService.js

Integriertes Cron-System ohne externe Parser-Library.

Features:

  • 5-Feld-Cron-Parser + nextRun-Berechnung
  • Quellen: script oder chain
  • Laufzeitlogs (cron_run_logs)
  • manuelles Triggern
  • WebSocket-Events: CRON_JOBS_UPDATED, CRON_JOB_UPDATED

runtimeActivityService.js

In-Memory-Tracking aller laufenden und kürzlich abgeschlossenen Aktivitäten (Skripte, Ketten, Cron-Jobs, Tasks).

Features:

  • startActivity(type, payload) → Aktivität registrieren, ID zurückgeben
  • updateActivity(id, patch) → Laufende Aktivität aktualisieren
  • completeActivity(id, payload) → Aktivität abschließen und in recent verschieben
  • setControls(id, { cancel, nextStep }) → Steuer-Handler registrieren (für canCancel/canNextStep)
  • requestCancel(id) / requestNextStep(id) → Steuer-Handler aufrufen
  • clearRecent() → Abgeschlossene Aktivitäten löschen
  • getSnapshot() → Snapshot mit active + recent + updatedAt
  • Broadcasts RUNTIME_ACTIVITY_CHANGED über WebSocket bei jeder Änderung

Limits:

  • recent max. 120 Einträge
  • stdout/stderr/output max. 12.000 Zeichen
  • message/errorMessage max. 2.000 Zeichen

Vollständige API-Dokumentation: Runtime Activities API


Weitere Services

  • scriptService.js (CRUD + Test + Wrapper-Ausführung)
  • scriptChainService.js (CRUD + Step-Execution)
  • userPresetService.js (HandBrake User-Presets)
  • hardwareMonitorService.js (CPU/RAM/GPU/Storage)
  • websocketService.js (Client-Registry + Broadcast)
  • notificationService.js (PushOver)
  • logger.js (rotierende Datei-Logs)

Bootstrapping (src/index.js)

Beim Start:

  1. DB init/migrate
  2. Pipeline-Init
  3. Cron-Init
  4. Express-Routes + Error-Handler
  5. WebSocket-Server auf /ws
  6. Hardware-Monitoring-Init
  7. Disk-Detection-Start
\ No newline at end of file diff --git a/site/architecture/database/index.html b/site/architecture/database/index.html index 2d1502d..f621bc9 100644 --- a/site/architecture/database/index.html +++ b/site/architecture/database/index.html @@ -1,4 +1,4 @@ - Datenbank - Ripster

Datenbank

Ripster verwendet SQLite (backend/data/ripster.db).


Tabellen

settings_schema
+ Datenbank - Ripster      

Datenbank

Ripster verwendet SQLite (backend/data/ripster.db).


Tabellen

settings_schema
 settings_values
 jobs
 pipeline_state
diff --git a/site/architecture/frontend/index.html b/site/architecture/frontend/index.html
index 4906e6d..a17d146 100644
--- a/site/architecture/frontend/index.html
+++ b/site/architecture/frontend/index.html
@@ -1,4 +1,4 @@
- Frontend-Komponenten - Ripster      

Frontend-Komponenten

Frontend: React + PrimeReact + Vite.


Hauptseiten

DashboardPage.jsx

Pipeline-Steuerung:

  • Status/Progress/ETA
  • Metadaten-Dialog
  • Playlist-Entscheidung
  • Review-Panel
  • Queue-Interaktion (reorder/add/remove)
  • Job-Aktionen (Start/Cancel/Retry/Re-Encode)
  • Hardware-Monitoring-Anzeige

SettingsPage.jsx

Konfiguration:

  • dynamisches Settings-Formular (DynamicSettingsForm)
  • Skripte/Ketten inkl. Reorder/Test
  • User-Presets
  • Cron-Jobs (CronJobsTab)

HistoryPage.jsx

Historie:

  • Job-Liste/Filter
  • Job-Details + Logs
  • OMDb-Nachzuweisung
  • Re-Encode/Restart-Workflows

Wichtige Komponenten

  • PipelineStatusCard.jsx
  • MetadataSelectionDialog.jsx
  • MediaInfoReviewPanel.jsx
  • JobDetailDialog.jsx
  • CronJobsTab.jsx

API-Client (api/client.js)

  • zentraler request() mit JSON-Handling
  • Fehlerobjekt aus API wird auf Error(message) gemappt
  • VITE_API_BASE default /api

WebSocket (hooks/useWebSocket.js)

  • URL: VITE_WS_URL oder automatisch ws(s)://<host>/ws
  • Auto-Reconnect mit 1500ms Intervall

In App.jsx werden u. a. verarbeitet:

  • PIPELINE_STATE_CHANGED
  • PIPELINE_PROGRESS
  • PIPELINE_QUEUE_CHANGED
  • DISC_DETECTED / DISC_REMOVED
  • HARDWARE_MONITOR_UPDATE

Build/Run

# dev
+ Frontend-Komponenten - Ripster      

Frontend-Komponenten

Frontend: React + PrimeReact + Vite.


Hauptseiten

DashboardPage.jsx

Pipeline-Steuerung:

  • Status/Progress/ETA
  • Metadaten-Dialog
  • Playlist-Entscheidung
  • Review-Panel
  • Queue-Interaktion (reorder/add/remove)
  • Job-Aktionen (Start/Cancel/Retry/Re-Encode)
  • Hardware-Monitoring-Anzeige

SettingsPage.jsx

Konfiguration:

  • dynamisches Settings-Formular (DynamicSettingsForm)
  • Skripte/Ketten inkl. Reorder/Test
  • User-Presets
  • Cron-Jobs (CronJobsTab)

HistoryPage.jsx

Historie:

  • Job-Liste/Filter
  • Job-Details + Logs
  • OMDb-Nachzuweisung
  • Re-Encode/Restart-Workflows

Wichtige Komponenten

  • PipelineStatusCard.jsx
  • MetadataSelectionDialog.jsx
  • MediaInfoReviewPanel.jsx
  • JobDetailDialog.jsx
  • CronJobsTab.jsx

API-Client (api/client.js)

  • zentraler request() mit JSON-Handling
  • Fehlerobjekt aus API wird auf Error(message) gemappt
  • VITE_API_BASE default /api

WebSocket (hooks/useWebSocket.js)

  • URL: VITE_WS_URL oder automatisch ws(s)://<host>/ws
  • Auto-Reconnect mit 1500ms Intervall

In App.jsx werden u. a. verarbeitet:

  • PIPELINE_STATE_CHANGED
  • PIPELINE_PROGRESS
  • PIPELINE_QUEUE_CHANGED
  • DISC_DETECTED / DISC_REMOVED
  • HARDWARE_MONITOR_UPDATE

Build/Run

# dev
 npm run dev --prefix frontend
 
 # prod build
diff --git a/site/architecture/index.html b/site/architecture/index.html
index 1a97434..813b039 100644
--- a/site/architecture/index.html
+++ b/site/architecture/index.html
@@ -1,4 +1,4 @@
- Architektur - Ripster      

Architektur

Ripster ist eine Client-Server-Anwendung mit REST + WebSocket.


Systemüberblick

graph TB
+ Anhang: Architektur - Ripster      

Anhang: Architektur

Ripster ist eine Client-Server-Anwendung mit REST + WebSocket und externen CLI-Tools.


Systemüberblick

graph TB
     subgraph Browser["Browser (React)"]
         Dashboard[Dashboard]
         Settings[Einstellungen]
@@ -26,4 +26,4 @@
     Pipeline --> MediaInfo
     API --> DB
     Pipeline --> DB
-    Cron --> DB

Schichten

Backend

  • src/index.js (Bootstrapping, Routes, WS, Services)
  • src/routes/* (Pipeline, Settings, History, Crons)
  • src/services/* (Business-Logik)
  • src/db/database.js (Init/Migration)
  • src/utils/* (Parser, Dateifunktionen, Validierung)

Frontend

  • App.jsx + pages/* (Dashboard, Settings, History)
  • components/* (Status-/Review-/Dialog-Komponenten)
  • api/client.js (REST-Client)
  • hooks/useWebSocket.js (WS-Reconnect)

Weiterführend

\ No newline at end of file + Cron --> DB

Details

\ No newline at end of file diff --git a/site/architecture/overview/index.html b/site/architecture/overview/index.html index 9673d13..8ffe17d 100644 --- a/site/architecture/overview/index.html +++ b/site/architecture/overview/index.html @@ -1,4 +1,4 @@ - Übersicht - Ripster

Architektur-Übersicht


Kernprinzipien

Event-getriebene Pipeline

pipelineService hält einen Snapshot der State-Machine und broadcastet Änderungen sofort via WebSocket.

State-Änderung -> PIPELINE_STATE_CHANGED/PIPELINE_PROGRESS -> Frontend-Update
+ Übersicht - Ripster      

Architektur-Übersicht


Kernprinzipien

Event-getriebene Pipeline

pipelineService hält einen Snapshot der State-Machine und broadcastet Änderungen sofort via WebSocket.

State-Änderung -> PIPELINE_STATE_CHANGED/PIPELINE_PROGRESS -> Frontend-Update
 

Service-Layer

Route -> Service -> DB/Tool-Execution
 

Routes enthalten kaum Business-Logik.

Schema-getriebene Settings

Settings sind DB-schema-getrieben (settings_schema + settings_values), UI rendert dynamisch aus diesen Daten.


Echtzeit-Kommunikation

WebSocket läuft auf /ws.

Wichtige Events:

  • PIPELINE_STATE_CHANGED, PIPELINE_PROGRESS, PIPELINE_QUEUE_CHANGED
  • DISC_DETECTED, DISC_REMOVED
  • HARDWARE_MONITOR_UPDATE
  • SETTINGS_UPDATED, SETTINGS_BULK_UPDATED
  • SETTINGS_SCRIPTS_UPDATED, SETTINGS_SCRIPT_CHAINS_UPDATED, USER_PRESETS_UPDATED
  • CRON_JOBS_UPDATED, CRON_JOB_UPDATED
  • PIPELINE_ERROR, DISK_DETECTION_ERROR

Prozessausführung

Externe Tools werden als Child-Processes gestartet (processRunner):

  • Streaming von stdout/stderr
  • Progress-Parsing (progressParsers.js)
  • kontrollierter Abbruch (SIGINT/SIGKILL-Fallback)

Persistenz

SQLite-Datei: backend/data/ripster.db

Kern-Tabellen:

  • jobs, pipeline_state
  • settings_schema, settings_values
  • scripts, script_chains, script_chain_steps
  • user_presets
  • cron_jobs, cron_run_logs

Beim Start werden Schema und Settings-Migrationen automatisch ausgeführt.


Fehlerbehandlung

Zentrales Error-Handling liefert:

{
   "error": {
diff --git a/site/configuration/environment/index.html b/site/configuration/environment/index.html
index ba611dd..3487186 100644
--- a/site/configuration/environment/index.html
+++ b/site/configuration/environment/index.html
@@ -1,4 +1,4 @@
- Umgebungsvariablen - Ripster      

Umgebungsvariablen

Umgebungsvariablen steuern Backend/Vite außerhalb der DB-basierten UI-Settings.


Backend (backend/.env)

Variable Default (Code) Beschreibung
PORT 3001 Express-Port
DB_PATH backend/data/ripster.db SQLite-Datei (relativ zu backend/)
LOG_DIR backend/logs Fallback-Logverzeichnis (wenn log_dir-Setting nicht gesetzt/lesbar)
CORS_ORIGIN * CORS-Origin für API
LOG_LEVEL info debug, info, warn, error

Beispiel:

PORT=3001
+ Umgebungsvariablen - Ripster      

Umgebungsvariablen

Umgebungsvariablen steuern Backend/Vite außerhalb der DB-basierten UI-Settings.


Backend (backend/.env)

Variable Default (Code) Beschreibung
PORT 3001 Express-Port
DB_PATH backend/data/ripster.db SQLite-Datei (relativ zu backend/)
LOG_DIR backend/logs Fallback-Logverzeichnis (wenn log_dir-Setting nicht gesetzt/lesbar)
CORS_ORIGIN * CORS-Origin für API
LOG_LEVEL info debug, info, warn, error

Beispiel:

PORT=3001
 DB_PATH=/var/lib/ripster/ripster.db
 LOG_DIR=/var/log/ripster
 CORS_ORIGIN=http://192.168.1.50:5173
diff --git a/site/configuration/index.html b/site/configuration/index.html
index a4c7ec5..f09203b 100644
--- a/site/configuration/index.html
+++ b/site/configuration/index.html
@@ -1 +1 @@
- Konfiguration - Ripster      

Konfiguration

  • Einstellungsreferenz


    Alle verfügbaren Einstellungen mit Typen, Standardwerten und Beschreibungen.

    Einstellungsreferenz

  • Umgebungsvariablen


    Umgebungsvariablen für Backend und Frontend.

    Umgebungsvariablen

\ No newline at end of file + Anhang: Konfiguration - Ripster

Anhang: Konfiguration

Dieser Abschnitt ist die technische Referenz zu allen Konfigurationsarten in Ripster.

Inhalte

Zurück zum Handbuch

\ No newline at end of file diff --git a/site/configuration/settings-reference/index.html b/site/configuration/settings-reference/index.html index f5e9733..1cdc558 100644 --- a/site/configuration/settings-reference/index.html +++ b/site/configuration/settings-reference/index.html @@ -1 +1 @@ - Alle Einstellungen - Ripster

Einstellungsreferenz

Alle Settings liegen in settings_schema/settings_values und werden über die UI verwaltet.


Profil-System

Ripster arbeitet mit Media-Profilen:

  • bluray
  • dvd
  • other

Viele Tool-/Pfad-Settings existieren als Profil-Varianten (*_bluray, *_dvd, *_other).

Wichtig:

  • Für raw_dir, movie_dir und die zugehörigen *_owner-Keys gibt es kein Cross-Profil-Fallback.
  • Für viele Tool-Keys werden profilspezifische Varianten bevorzugt.

Template-Platzhalter

Datei-/Ordner-Templates unterstützen:

  • ${title}
  • ${year}
  • ${imdbId}

Nicht gesetzte Werte werden zu unknown.


Kategorie: Pfade

Key Typ Default
raw_dir path data/output/raw
raw_dir_bluray path null
raw_dir_dvd path null
raw_dir_other path null
raw_dir_bluray_owner string null
raw_dir_dvd_owner string null
raw_dir_other_owner string null
movie_dir path data/output/movies
movie_dir_bluray path null
movie_dir_dvd path null
movie_dir_other path null
movie_dir_bluray_owner string null
movie_dir_dvd_owner string null
movie_dir_other_owner string null
log_dir path data/logs

Kategorie: Laufwerk

Key Typ Default Hinweis
drive_mode select auto auto oder explicit
drive_device path /dev/sr0 bei explicit relevant
makemkv_source_index number 0 MakeMKV Source-Index
disc_poll_interval_ms number 4000 1000..60000

Kategorie: Monitoring

Key Typ Default
hardware_monitoring_enabled boolean true
hardware_monitoring_interval_ms number 5000

Kategorie: Tools (global)

Key Typ Default
makemkv_command string makemkvcon
makemkv_registration_key string null
mediainfo_command string mediainfo
makemkv_min_length_minutes number 60
handbrake_command string HandBrakeCLI
handbrake_restart_delete_incomplete_output boolean true
pipeline_max_parallel_jobs number 1

Blu-ray-spezifisch

Key Typ Default
mediainfo_extra_args_bluray string null
makemkv_rip_mode_bluray select backup
makemkv_analyze_extra_args_bluray string null
makemkv_rip_extra_args_bluray string null
handbrake_preset_bluray string H.264 MKV 1080p30
handbrake_extra_args_bluray string null
output_extension_bluray select mkv
filename_template_bluray string ${title} (${year})
output_folder_template_bluray string null

DVD-spezifisch

Key Typ Default
mediainfo_extra_args_dvd string null
makemkv_rip_mode_dvd select mkv
makemkv_analyze_extra_args_dvd string null
makemkv_rip_extra_args_dvd string null
handbrake_preset_dvd string H.264 MKV 480p30
handbrake_extra_args_dvd string null
output_extension_dvd select mkv
filename_template_dvd string ${title} (${year})
output_folder_template_dvd string null

Kategorie: Metadaten

Key Typ Default
omdb_api_key string null
omdb_default_type select movie

Kategorie: Benachrichtigungen (PushOver)

Key Typ Default
pushover_enabled boolean false
pushover_token string null
pushover_user string null
pushover_device string null
pushover_title_prefix string Ripster
pushover_priority number 0
pushover_timeout_ms number 7000
pushover_notify_metadata_ready boolean true
pushover_notify_rip_started boolean true
pushover_notify_encoding_started boolean true
pushover_notify_job_finished boolean true
pushover_notify_job_error boolean true
pushover_notify_job_cancelled boolean true
pushover_notify_reencode_started boolean true
pushover_notify_reencode_finished boolean true

Entfernte Legacy-Keys

Diese Legacy-Keys werden bei Migration entfernt und sollten nicht mehr genutzt werden:

  • makemkv_backup_mode
  • mediainfo_extra_args
  • makemkv_rip_mode
  • makemkv_analyze_extra_args
  • makemkv_rip_extra_args
  • handbrake_preset
  • handbrake_extra_args
  • output_extension
  • filename_template
  • output_folder_template
  • pushover_notify_disc_detected
\ No newline at end of file + Alle Einstellungen - Ripster

Einstellungsreferenz

Alle Settings liegen in settings_schema/settings_values und werden über die UI verwaltet.


Profil-System

Ripster arbeitet mit Media-Profilen:

  • bluray
  • dvd
  • other

Viele Tool-/Pfad-Settings existieren als Profil-Varianten (*_bluray, *_dvd, *_other).

Wichtig:

  • Für raw_dir, movie_dir und die zugehörigen *_owner-Keys gibt es kein Cross-Profil-Fallback.
  • Für viele Tool-Keys werden profilspezifische Varianten bevorzugt.

Template-Platzhalter

Datei-/Ordner-Templates unterstützen:

  • ${title}
  • ${year}
  • ${imdbId}

Nicht gesetzte Werte werden zu unknown.


Kategorie: Pfade

Key Typ Default
raw_dir path data/output/raw
raw_dir_bluray path null
raw_dir_dvd path null
raw_dir_other path null
raw_dir_bluray_owner string null
raw_dir_dvd_owner string null
raw_dir_other_owner string null
movie_dir path data/output/movies
movie_dir_bluray path null
movie_dir_dvd path null
movie_dir_other path null
movie_dir_bluray_owner string null
movie_dir_dvd_owner string null
movie_dir_other_owner string null
log_dir path data/logs

Kategorie: Laufwerk

Key Typ Default Hinweis
drive_mode select auto auto oder explicit
drive_device path /dev/sr0 bei explicit relevant
makemkv_source_index number 0 MakeMKV Source-Index
disc_poll_interval_ms number 4000 1000..60000

Kategorie: Monitoring

Key Typ Default
hardware_monitoring_enabled boolean true
hardware_monitoring_interval_ms number 5000

Kategorie: Tools (global)

Key Typ Default
makemkv_command string makemkvcon
makemkv_registration_key string null
mediainfo_command string mediainfo
makemkv_min_length_minutes number 60
handbrake_command string HandBrakeCLI
handbrake_restart_delete_incomplete_output boolean true
pipeline_max_parallel_jobs number 1

Blu-ray-spezifisch

Key Typ Default
mediainfo_extra_args_bluray string null
makemkv_rip_mode_bluray select backup
makemkv_analyze_extra_args_bluray string null
makemkv_rip_extra_args_bluray string null
handbrake_preset_bluray string H.264 MKV 1080p30
handbrake_extra_args_bluray string null
output_extension_bluray select mkv
filename_template_bluray string ${title} (${year})
output_folder_template_bluray string null

DVD-spezifisch

Key Typ Default
mediainfo_extra_args_dvd string null
makemkv_rip_mode_dvd select mkv
makemkv_analyze_extra_args_dvd string null
makemkv_rip_extra_args_dvd string null
handbrake_preset_dvd string H.264 MKV 480p30
handbrake_extra_args_dvd string null
output_extension_dvd select mkv
filename_template_dvd string ${title} (${year})
output_folder_template_dvd string null

Kategorie: Metadaten

Key Typ Default
omdb_api_key string null
omdb_default_type select movie

Kategorie: Benachrichtigungen (PushOver)

Key Typ Default
pushover_enabled boolean false
pushover_token string null
pushover_user string null
pushover_device string null
pushover_title_prefix string Ripster
pushover_priority number 0
pushover_timeout_ms number 7000
pushover_notify_metadata_ready boolean true
pushover_notify_rip_started boolean true
pushover_notify_encoding_started boolean true
pushover_notify_job_finished boolean true
pushover_notify_job_error boolean true
pushover_notify_job_cancelled boolean true
pushover_notify_reencode_started boolean true
pushover_notify_reencode_finished boolean true

Entfernte Legacy-Keys

Diese Legacy-Keys werden bei Migration entfernt und sollten nicht mehr genutzt werden:

  • makemkv_backup_mode
  • mediainfo_extra_args
  • makemkv_rip_mode
  • makemkv_analyze_extra_args
  • makemkv_rip_extra_args
  • handbrake_preset
  • handbrake_extra_args
  • output_extension
  • filename_template
  • output_folder_template
  • pushover_notify_disc_detected
\ No newline at end of file diff --git a/site/deployment/development/index.html b/site/deployment/development/index.html index 5dcec5f..7b877aa 100644 --- a/site/deployment/development/index.html +++ b/site/deployment/development/index.html @@ -1,4 +1,4 @@ - Entwicklungsumgebung - Ripster

Entwicklungsumgebung


Voraussetzungen

  • Node.js >= 20.19.0
  • externe Tools installiert (makemkvcon, HandBrakeCLI, mediainfo)

Schnellstart

./start.sh
+ Entwicklungsumgebung - Ripster      

Entwicklungsumgebung


Voraussetzungen

  • Node.js >= 20.19.0
  • externe Tools installiert (makemkvcon, HandBrakeCLI, mediainfo)

Schnellstart

./start.sh
 

Startet:

  • Backend (http://localhost:3001, mit nodemon)
  • Frontend (http://localhost:5173, mit Vite HMR)

Stoppen: Ctrl+C.


Manuell

Backend

cd backend
 npm install
 npm run dev
@@ -21,4 +21,4 @@
 
 # Frontend Build
 npm run build:frontend
-

Deploy-Script (optional)

deploy-ripster.sh synchronisiert den lokalen Stand auf einen Remote-Host per rsync/SSH und schützt backend/data.

\ No newline at end of file +
\ No newline at end of file diff --git a/site/deployment/index.html b/site/deployment/index.html index d5d4f34..df1d62b 100644 --- a/site/deployment/index.html +++ b/site/deployment/index.html @@ -1 +1 @@ - Deployment - Ripster

Deployment

  • Entwicklungsumgebung


    Lokale Entwicklungsumgebung einrichten.

    Entwicklung

  • Produktion


    Ripster auf einem Server dauerhaft betreiben.

    Produktion

\ No newline at end of file + Anhang: Deployment - Ripster

Anhang: Deployment

Technische Betriebsdokumentation für Entwicklung und Produktion.

  • Entwicklungsumgebung


    Lokale Entwicklung mit Hot-Reload.

    Entwicklung

  • Produktion


    Installation und Betrieb auf Servern.

    Produktion

\ No newline at end of file diff --git a/site/deployment/production/index.html b/site/deployment/production/index.html index 8ba1805..3f23552 100644 --- a/site/deployment/production/index.html +++ b/site/deployment/production/index.html @@ -1,57 +1,87 @@ - Produktion - Ripster

Produktions-Deployment


Empfohlene Architektur

Client
-  -> nginx (Reverse Proxy + statisches Frontend)
-    -> Backend API/WebSocket (Node.js, Port 3001)
-

Wichtig: Das Backend serviert im aktuellen Stand keine frontend/dist-Dateien automatisch.


1) Frontend builden

cd frontend
-npm install
-npm run build
-

Artefakte liegen in frontend/dist/.


2) Backend als systemd-Service

Beispiel /etc/systemd/system/ripster-backend.service:

[Unit]
-Description=Ripster Backend
-After=network.target
-
-[Service]
-Type=simple
-User=ripster
-WorkingDirectory=/opt/ripster/backend
-ExecStart=/usr/bin/env node src/index.js
-Restart=on-failure
-RestartSec=5
-Environment=NODE_ENV=production
-Environment=PORT=3001
-Environment=LOG_LEVEL=info
-
-[Install]
-WantedBy=multi-user.target
-

Aktivieren:

sudo systemctl daemon-reload
-sudo systemctl enable --now ripster-backend
-sudo systemctl status ripster-backend
-

3) nginx konfigurieren

Beispiel /etc/nginx/sites-available/ripster:

server {
-    listen 80;
-    server_name ripster.local;
-
-    root /opt/ripster/frontend/dist;
-    index index.html;
-
-    location / {
-        try_files $uri $uri/ /index.html;
-    }
-
-    location /api/ {
-        proxy_pass http://127.0.0.1:3001;
-        proxy_set_header Host $host;
-        proxy_set_header X-Real-IP $remote_addr;
-    }
-
-    location /ws {
-        proxy_pass http://127.0.0.1:3001;
-        proxy_http_version 1.1;
-        proxy_set_header Upgrade $http_upgrade;
-        proxy_set_header Connection "upgrade";
-        proxy_set_header Host $host;
-    }
-}
-

Aktivieren:

sudo ln -s /etc/nginx/sites-available/ripster /etc/nginx/sites-enabled/
-sudo nginx -t
-sudo systemctl reload nginx
-

Datenbank-Backup

sqlite3 /opt/ripster/backend/data/ripster.db \
-  ".backup '/var/backups/ripster-$(date +%Y%m%d).db'"
+ Produktion - Ripster      

Produktions-Deployment


Automatische Installation (empfohlen)

Das mitgelieferte install.sh richtet Ripster vollautomatisch auf Debian/Ubuntu ein – inklusive Node.js, MakeMKV, HandBrake, nginx und systemd-Dienst.

Unterstützte Systeme: Debian 11/12, Ubuntu 22.04/24.04 Voraussetzung: root-Rechte, Internetzugang

Schnellstart via curl

curl -fsSL https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh | sudo bash
+

Oder mit wget:

wget -qO- https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh | sudo bash
+

Optionen nur via Datei

Beim Pipen von curl/wget können keine Argumente übergeben werden. Für benutzerdefinierte Optionen zuerst herunterladen und dann mit sudo bash install.sh [Optionen] ausführen.

Optionen

Option Standard Beschreibung
--branch <branch> main Git-Branch für die Installation
--dir <pfad> /opt/ripster Installationsverzeichnis
--user <benutzer> ripster Systembenutzer für den Dienst
--port <port> 3001 Backend-Port
--host <hostname> Auto (Maschinen-IP) Hostname/IP für die Weboberfläche
--no-makemkv MakeMKV-Installation überspringen
--no-handbrake HandBrake-Installation überspringen
--no-nginx nginx-Einrichtung überspringen
--reinstall Bestehende Installation aktualisieren (Daten bleiben erhalten)
-h, --help Hilfe anzeigen

Beispiele

# Standard-Installation
+sudo bash install.sh
+
+# Anderen Branch und Port verwenden
+sudo bash install.sh --branch dev --port 8080
+
+# Ohne MakeMKV (bereits installiert)
+sudo bash install.sh --no-makemkv
+
+# Bestehende Installation aktualisieren
+sudo bash install.sh --reinstall
+
+# Ohne nginx (eigener Reverse-Proxy)
+sudo bash install.sh --no-nginx --host mein-server.local
+

Was das Skript erledigt

  1. Systemprüfung – OS-Erkennung und Root-Check
  2. Systempaketecurl, wget, git, mediainfo, udev u. a.
  3. Node.js 20 – via NodeSource, falls noch nicht installiert
  4. MakeMKV – aktuelle Version wird aus dem offiziellen Forum ermittelt und aus dem Quellcode kompiliert (kann mit --no-makemkv übersprungen werden)
  5. HandBrake – interaktive Auswahl:
    • Option 1: Standard (apt install handbrake-cli)
    • Option 2: Gebündelte GPU-Version mit NVDEC aus bin/HandBrakeCLI
  6. Systembenutzer ripster – ohne Login-Shell, Gruppen: cdrom, optical, disk, video, render
  7. Repository – klont Branch nach --dir (bei --reinstall: sichert DB, pullt, stellt DB wieder her)
  8. npm-Abhängigkeiten – Root, Backend (nur production), Frontend
  9. Frontend-Buildnpm run build mit relativen API-URLs (nginx-kompatibel)
  10. Backend .env – wird automatisch generiert (bei --reinstall bleibt bestehende erhalten)
  11. Berechtigungenripster:ripster auf Installationsverzeichnis, 600 auf .env
  12. systemd-Dienstripster-backend.service erstellt, aktiviert und gestartet
  13. nginx – konfiguriert als Reverse-Proxy für Frontend, /api/ und /ws (kann mit --no-nginx übersprungen werden)

Nach der Installation

# Status prüfen
+sudo systemctl status ripster-backend
+
+# Logs verfolgen
+sudo journalctl -u ripster-backend -f
+
+# Neustart
+sudo systemctl restart ripster-backend
+
+# Aktualisieren
+sudo bash /opt/ripster/install.sh --reinstall
+

Zugriff: http://<Maschinen-IP> (oder der mit --host angegebene Hostname)

HandBrake-Modus (GPU/NVDEC)

Bei nicht-interaktiver Ausführung (Pipe von curl) wird automatisch die Standard-Version gewählt. Für die GPU-Version zuerst herunterladen:

curl -fsSL https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh -o install.sh
+sudo bash install.sh
+# → Interaktive Auswahl: Option 2 für NVDEC
+

Das gebündelte Binary liegt unter bin/HandBrakeCLI und wird nach /usr/local/bin/HandBrakeCLI kopiert.


Manuelle Installation

Die folgenden Abschnitte beschreiben die einzelnen Schritte für manuelle oder angepasste Setups.

Empfohlene Architektur

Client
+  -> nginx (Reverse Proxy + statisches Frontend)
+    -> Backend API/WebSocket (Node.js, Port 3001)
+

Wichtig: Das Backend serviert im aktuellen Stand keine frontend/dist-Dateien automatisch.


1) Frontend builden

cd frontend
+npm install
+npm run build
+

Artefakte liegen in frontend/dist/.


2) Backend als systemd-Service

Beispiel /etc/systemd/system/ripster-backend.service:

[Unit]
+Description=Ripster Backend
+After=network.target
+
+[Service]
+Type=simple
+User=ripster
+WorkingDirectory=/opt/ripster/backend
+ExecStart=/usr/bin/env node src/index.js
+Restart=on-failure
+RestartSec=5
+Environment=NODE_ENV=production
+Environment=PORT=3001
+Environment=LOG_LEVEL=info
+
+[Install]
+WantedBy=multi-user.target
+

Aktivieren:

sudo systemctl daemon-reload
+sudo systemctl enable --now ripster-backend
+sudo systemctl status ripster-backend
+

3) nginx konfigurieren

Beispiel /etc/nginx/sites-available/ripster:

server {
+    listen 80;
+    server_name ripster.local;
+
+    root /opt/ripster/frontend/dist;
+    index index.html;
+
+    location / {
+        try_files $uri $uri/ /index.html;
+    }
+
+    location /api/ {
+        proxy_pass http://127.0.0.1:3001;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+    }
+
+    location /ws {
+        proxy_pass http://127.0.0.1:3001;
+        proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "upgrade";
+        proxy_set_header Host $host;
+    }
+}
+

Aktivieren:

sudo ln -s /etc/nginx/sites-available/ripster /etc/nginx/sites-enabled/
+sudo nginx -t
+sudo systemctl reload nginx
+

Datenbank-Backup

sqlite3 /opt/ripster/backend/data/ripster.db \
+  ".backup '/var/backups/ripster-$(date +%Y%m%d).db'"
 

Sicherheit

  • Ripster hat keine eingebaute Authentifizierung.
  • Für externen Zugriff mindestens Basic Auth + TLS + Netzwerksegmentierung/VPN einsetzen.
  • Secrets nicht ins Repo committen (.env, Settings-Felder).
\ No newline at end of file diff --git a/site/getting-started/configuration/index.html b/site/getting-started/configuration/index.html index 95146a4..6439feb 100644 --- a/site/getting-started/configuration/index.html +++ b/site/getting-started/configuration/index.html @@ -1,3 +1 @@ - Konfiguration - Ripster

Konfiguration

Die Hauptkonfiguration erfolgt über die UI (Settings) und wird in SQLite gespeichert.


Pflichteinstellungen vor dem ersten Rip

1) Pfade

Einstellung Beschreibung Beispiel
raw_dir Basisverzeichnis für RAW-Rips /mnt/ripster/raw
movie_dir Basisverzeichnis für finale Encodes /mnt/ripster/movies
log_dir Verzeichnis für Prozess-/Backend-Logs /mnt/ripster/logs

Optional profilspezifisch:

  • raw_dir_bluray, raw_dir_dvd, raw_dir_other
  • movie_dir_bluray, movie_dir_dvd, movie_dir_other

2) Tools

Einstellung Standard
makemkv_command makemkvcon
handbrake_command HandBrakeCLI
mediainfo_command mediainfo

3) OMDb

Einstellung Beschreibung
omdb_api_key API-Key von omdbapi.com
omdb_default_type movie, series, episode

Encode-Konfiguration (wichtig)

Ripster arbeitet profilspezifisch, typischerweise über:

  • Blu-ray: handbrake_preset_bluray, handbrake_extra_args_bluray, output_extension_bluray, filename_template_bluray
  • DVD: handbrake_preset_dvd, handbrake_extra_args_dvd, output_extension_dvd, filename_template_dvd

Template-Platzhalter

Verfügbar in filename_template_* und output_folder_template_*:

  • ${title}
  • ${year}
  • ${imdbId}

Beispiel:

${title} (${year})
--> Inception (2010).mkv
-

MakeMKV-spezifisch

Einstellung Standard Hinweis
makemkv_min_length_minutes 60 Kandidaten-Filter
makemkv_rip_mode_bluray backup mkv oder backup
makemkv_rip_mode_dvd mkv mkv oder backup
makemkv_registration_key leer optional, wird via makemkvcon reg gesetzt

Monitoring & Queue

Einstellung Standard
hardware_monitoring_enabled true
hardware_monitoring_interval_ms 5000
pipeline_max_parallel_jobs 1

PushOver (optional)

Basis:

  • pushover_enabled
  • pushover_token
  • pushover_user

Zusätzlich pro Event ein/aus (z. B. pushover_notify_job_finished).


Verwandte Doku

\ No newline at end of file + Ersteinrichtung - Ripster

Ersteinrichtung

Nach der Installation erfolgt die tägliche Konfiguration fast vollständig in der GUI unter Settings.

Ziel

Vor dem ersten echten Job müssen Pfade, Tools und Metadatenzugriff sauber gesetzt sein.

Reihenfolge (empfohlen)

1. Settings -> Tab Konfiguration

Setze zuerst diese Pflichtwerte:

Bereich Wichtige Felder
Pfade raw_dir, movie_dir, log_dir
Tools makemkv_command, handbrake_command, mediainfo_command
Metadaten omdb_api_key, optional omdb_default_type

Danach Änderungen speichern.

2. Medienprofile prüfen

Wenn du Blu-ray und DVD unterschiedlich behandeln willst, pflege die profilbezogenen Felder:

  • *_bluray
  • *_dvd
  • optional *_other

Typische Beispiele:

  • handbrake_preset_bluray und handbrake_preset_dvd
  • raw_dir_bluray und raw_dir_dvd
  • filename_template_bluray und filename_template_dvd

3. Queue und Monitoring festlegen

  • pipeline_max_parallel_jobs für parallele Jobs
  • hardware_monitoring_enabled und Intervall für Live-Metriken im Dashboard

4. Optional: Push-Benachrichtigungen

In den Benachrichtigungsfeldern setzen:

  • pushover_enabled
  • pushover_token
  • pushover_user

Dann über PushOver Test direkt prüfen.

2-Minuten-Funktionstest

  1. Dashboard öffnen
  2. Disc einlegen
  3. Analyse starten
  4. Metadaten übernehmen
  5. Bis READY_TO_ENCODE laufen lassen

Wenn diese Schritte funktionieren, ist die Grundkonfiguration korrekt.

Wenn Werte nicht gespeichert werden

  • Feld mit Fehler markieren lassen (rote Validierung im Formular)
  • Pfadangaben und numerische Werte prüfen
  • bei Tool-Pfaden direkt CLI-Aufruf im Terminal testen

Weiter

\ No newline at end of file diff --git a/site/getting-started/index.html b/site/getting-started/index.html index a87b48a..902bbaf 100644 --- a/site/getting-started/index.html +++ b/site/getting-started/index.html @@ -1 +1 @@ - Erste Schritte - Ripster

Erste Schritte

Dieser Abschnitt führt dich durch die Installation und Einrichtung von Ripster.

Überblick

  • :material-list-check: Voraussetzungen


    Systemanforderungen und externe Tools, die vor der Installation benötigt werden.

    Voraussetzungen prüfen

  • Installation


    Schritt-für-Schritt-Anleitung zur Installation von Ripster.

    Installation starten

  • Konfiguration


    Einrichten von Pfaden, API-Keys und Encoding-Presets.

    Konfigurieren

  • Schnellstart


    Rippe deinen ersten Film in wenigen Minuten.

    Loslegen

\ No newline at end of file + Benutzerhandbuch Überblick - Ripster

Benutzerhandbuch Überblick

Dieses Kapitel ist für den Betrieb von Ripster im Alltag geschrieben.

Zielgruppe

  • Anwender, die Discs verarbeiten wollen
  • Betreiber, die den täglichen Ablauf stabil fahren möchten
  • Power-User, die Queue/Skripte/Cron im UI steuern möchten

Kapitelstruktur

Kapitel Zweck
Voraussetzungen Prüfen, ob System und Tools bereit sind
Installation Ripster aufsetzen und starten
Ersteinrichtung Pfade, Tools und Metadaten korrekt setzen
Erster Lauf Ein kompletter Job von Disc bis Datei
GUI-Seiten Alle Ansichten und Aktionen im Detail
Workflows Typische Abläufe und Entscheidungen aus User-Sicht

Wenn du neu startest

  1. Voraussetzungen
  2. Installation
  3. Ersteinrichtung
  4. Erster Lauf

Wenn Ripster bereits läuft

  1. GUI-Seiten
  2. Workflows
  3. Bei Detailfragen: Technischer Anhang
\ No newline at end of file diff --git a/site/getting-started/installation/index.html b/site/getting-started/installation/index.html index aacc36e..09a3cf2 100644 --- a/site/getting-started/installation/index.html +++ b/site/getting-started/installation/index.html @@ -1,21 +1,15 @@ - Installation - Ripster

Installation


Repository klonen

git clone https://github.com/YOUR_GITHUB_USERNAME/ripster.git
-cd ripster
-

Dev-Start (empfohlen)

./start.sh
-

start.sh:

  1. prüft Node-Version (>= 20.19.0)
  2. installiert Dependencies (Root/Backend/Frontend)
  3. startet Backend + Frontend parallel

Danach:

  • Backend: http://localhost:3001
  • Frontend: http://localhost:5173

Stoppen: mit Ctrl+C im laufenden Terminal.


Manuell starten

npm install
-npm --prefix backend install
-npm --prefix frontend install
-npm run dev
-

Oder getrennt:

npm run dev:backend
-npm run dev:frontend
-

Optional: .env-Dateien anlegen

Backend

cp backend/.env.example backend/.env
-

Beispiel:

PORT=3001
-DB_PATH=./data/ripster.db
-LOG_DIR=./logs
-CORS_ORIGIN=http://localhost:5173
-LOG_LEVEL=info
-

Frontend

cp frontend/.env.example frontend/.env
-

Beispiel:

VITE_API_BASE=/api
-# optional:
-# VITE_WS_URL=ws://localhost:3001/ws
-

Datenbank

SQLite wird automatisch beim Backend-Start initialisiert:

backend/data/ripster.db
-

Schema-Quelle: db/schema.sql


Nächste Schritte

  1. Browser öffnen: http://localhost:5173
  2. In Settings Pfade/Tools/API-Keys prüfen
  3. Erste Disc einlegen und Workflow starten
\ No newline at end of file + Installation - Ripster

Installation

Die empfohlene Installation läuft über install.sh und richtet Ripster vollständig ein.

Zielbild nach der Installation

  • Ripster-Backend als systemd-Dienst
  • Frontend über nginx erreichbar
  • UI auf http://<Server-IP>

Schritt-für-Schritt

1. Installationsskript herunterladen

wget -qO install.sh https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh
+

2. Installation ausführen

sudo bash install.sh
+

Während der Installation wirst du nach dem HandBrake-Modus gefragt:

  • 1 Standard (apt)
  • 2 GPU/NVDEC (gebündeltes Binary)

3. Dienststatus prüfen

sudo systemctl status ripster-backend
+

4. Weboberfläche öffnen

  • Mit nginx: http://<Server-IP>
  • Ohne nginx (--no-nginx): API auf http://<Server-IP>:3001/api

Wichtige Optionen

Option Zweck
--branch <branch> anderen Branch installieren
--dir <pfad> Installationsverzeichnis ändern
--port <port> Backend-Port setzen
--host <hostname> Hostname/IP für nginx/CORS
--no-makemkv MakeMKV nicht installieren
--no-handbrake HandBrake nicht installieren
--no-nginx nginx-Konfiguration überspringen
--reinstall Update einer bestehenden Installation

Beispiele:

sudo bash install.sh --branch dev
+sudo bash install.sh --port 8080 --host ripster.local
+sudo bash install.sh --reinstall
+

Betrieb im Alltag

# Logs live ansehen
+sudo journalctl -u ripster-backend -f
+
+# Dienst neu starten
+sudo systemctl restart ripster-backend
+
+# Update aus bestehender Installation
+sudo bash /opt/ripster/install.sh --reinstall
+

Häufige Stolperstellen

  • Permission denied am Laufwerk: Laufwerksrechte/Gruppen prüfen
  • Tools nicht gefunden: makemkvcon, HandBrakeCLI, mediainfo im PATH prüfen
  • UI nicht erreichbar: nginx-Status und Port/Firewall prüfen

Danach weiter

  1. Ersteinrichtung
  2. Erster Lauf
\ No newline at end of file diff --git a/site/getting-started/prerequisites/index.html b/site/getting-started/prerequisites/index.html index 30e8930..97065b0 100644 --- a/site/getting-started/prerequisites/index.html +++ b/site/getting-started/prerequisites/index.html @@ -1,50 +1,8 @@ - Voraussetzungen - Ripster

Voraussetzungen

Bevor du Ripster installierst, stelle sicher, dass folgende Software auf deinem System verfügbar ist.


System-Anforderungen

Anforderung Mindestversion Empfohlen
Betriebssystem Linux / macOS Ubuntu 22.04+
Node.js 20.19.0 20.x LTS
RAM 4 GB 8 GB+
Festplatte 50 GB frei 500 GB+ (für Roh-MKVs)

Node.js

Ripster benötigt Node.js >= 20.19.0.

# nvm installieren
-curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
-
-# Node.js 20 installieren
-nvm install 20
-nvm use 20
-
-# Version prüfen
-node --version  # v20.x.x
-
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
-sudo apt-get install -y nodejs
-
-node --version  # v20.x.x
-
brew install node@20
-node --version  # v20.x.x
-

Externe Tools

MakeMKV

Lizenz erforderlich

MakeMKV ist für den persönlichen Gebrauch kostenlos (Beta-Lizenz), benötigt aber eine gültige Lizenz.

# Ubuntu/Debian - PPA verwenden
-sudo add-apt-repository ppa:heyarje/makemkv-beta
-sudo apt-get update
-sudo apt-get install makemkv-bin makemkv-oss
-
-# Installierte Version prüfen
-makemkvcon --version
-

MakeMKV Download

HandBrake CLI

# Ubuntu/Debian
-sudo add-apt-repository ppa:stebbins/handbrake-releases
-sudo apt-get update
-sudo apt-get install handbrake-cli
-
-# Version prüfen
-HandBrakeCLI --version
-
-# macOS
-brew install handbrake
-

HandBrake Download

MediaInfo

# Ubuntu/Debian
-sudo apt-get install mediainfo
-
-# macOS
-brew install mediainfo
-
-# Version prüfen
-mediainfo --Version
-

Disc-Laufwerk

Ripster benötigt ein physisches DVD- oder Blu-ray-Laufwerk.

LibDriveIO-Modus erforderlich

Das Laufwerk muss im LibDriveIO-Modus betrieben werden – MakeMKV greift direkt auf Rohdaten des Laufwerks zu. Ohne diesen Modus können verschlüsselte Blu-rays (insbesondere UHD) nicht gelesen werden.

Nicht alle Laufwerke unterstützen den direkten Zugriff. Eine Anleitung zur Einrichtung und Liste kompatibler Laufwerke findet sich im MakeMKV-Forum.

# Laufwerk prüfen
-ls /dev/sr*
-# oder
-lsblk | grep rom
-
-# Laufwerk-Berechtigungen setzen (erforderlich für LibDriveIO)
-sudo chmod a+rw /dev/sr0
-

Blu-ray unter Linux

MakeMKV bringt mit LibDriveIO eine eigene Entschlüsselung mit – externe Bibliotheken wie libaacs sind in der Regel nicht erforderlich.


OMDb API-Key

Ripster verwendet die OMDb API für Filmmetadaten.

  1. Registriere dich kostenlos auf omdbapi.com
  2. Bestätige deine E-Mail-Adresse
  3. Notiere deinen API-Key – du gibst ihn später in den Einstellungen ein

Optionale Voraussetzungen

PushOver (Benachrichtigungen)

Für mobile Push-Benachrichtigungen bei Fertigstellung oder Fehlern:

  • App kaufen auf pushover.net (~5 USD einmalig)
  • User Key und API Token notieren

SSH-Zugang (Deployment)

Für Remote-Deployment via deploy-ripster.sh:

# sshpass installieren
-sudo apt-get install sshpass
-

Checkliste

  • [ ] Node.js >= 20.19.0 installiert (node --version)
  • [ ] makemkvcon installiert (makemkvcon --version)
  • [ ] HandBrakeCLI installiert (HandBrakeCLI --version)
  • [ ] mediainfo installiert (mediainfo --Version)
  • [ ] DVD/Blu-ray Laufwerk vorhanden (ls /dev/sr*)
  • [ ] OMDb API-Key beschafft
\ No newline at end of file + Voraussetzungen - Ripster

Voraussetzungen

Diese Seite ist die praktische Checkliste vor der Installation.

1) System

Punkt Mindestwert Empfehlung
Betriebssystem Linux oder macOS Ubuntu 22.04+
Node.js 20.19.0 20.x LTS
RAM 4 GB 8 GB+
Freier Speicher 50 GB 500 GB+

Node-Version prüfen:

node --version
+

2) Externe Tools

Ripster benötigt folgende CLI-Tools im PATH:

  • makemkvcon
  • HandBrakeCLI
  • mediainfo

Schnell prüfen:

makemkvcon --version
+HandBrakeCLI --version
+mediainfo --Version
+

3) Optisches Laufwerk

Für Disc-Betrieb muss ein DVD/Blu-ray-Laufwerk erreichbar sein.

ls /dev/sr*
+lsblk | grep rom
+

Wenn nötig Rechte setzen (Beispiel):

sudo chmod a+rw /dev/sr0
+

4) OMDb API-Key

Für automatische Metadaten (Titel, Poster, IMDb-ID):

  1. Key unter omdbapi.com anlegen
  2. in den Settings als omdb_api_key eintragen

5) Optional: PushOver

Für Push-Nachrichten bei Erfolg/Fehler:

  • Account/App auf pushover.net
  • pushover_token und pushover_user später in den Settings setzen

Abschluss-Checkliste

  • [ ] Node.js 20.x verfügbar
  • [ ] makemkvcon, HandBrakeCLI, mediainfo ausführbar
  • [ ] Laufwerk erkannt
  • [ ] OMDb Key bereit
\ No newline at end of file diff --git a/site/getting-started/quickstart/index.html b/site/getting-started/quickstart/index.html index 637ba2b..2ea2418 100644 --- a/site/getting-started/quickstart/index.html +++ b/site/getting-started/quickstart/index.html @@ -1,12 +1 @@ - Schnellstart - Ripster

Schnellstart – Erster kompletter Job

Diese Seite führt durch den typischen ersten Lauf.


1) Starten

cd ripster
-./start.sh
-

Öffne http://localhost:5173.


2) Disc einlegen

Pipeline wechselt auf DISC_DETECTED.

Falls nötig manuell neu scannen:

curl -X POST http://localhost:3001/api/pipeline/rescan-disc
-

3) Analyse starten

Klicke im Dashboard auf Analyse starten.

Intern:

  • Job wird angelegt
  • MakeMKV-Analyse läuft (ANALYZING)
  • UI wechselt in Metadatenauswahl (METADATA_SELECTION)

4) Metadaten bestätigen

Im Dialog:

  • OMDb-Ergebnis wählen oder manuell eintragen
  • bei Playlist-Abfrage ggf. selectedPlaylist wählen

Nach Bestätigung startet Ripster automatisch weiter.


5) Pipeline-Pfade

Abhängig von Job/RAW-Situation:

  • kein RAW vorhanden -> RIPPING
  • RAW vorhanden -> MEDIAINFO_CHECK
  • mehrdeutige Playlist -> WAITING_FOR_USER_DECISION

Wenn Parallel-Limit erreicht ist, wird der Job in die Queue eingereiht.


6) Review (READY_TO_ENCODE)

Im Review-Panel:

  • Titel auswählen (falls mehrere)
  • Audio-/Subtitle-Tracks auswählen
  • optional User-Preset anwenden
  • optional Pre-/Post-Skripte und Ketten hinzufügen

Mit Encoding starten wird confirm-encode + Start ausgelöst.


7) Encoding (ENCODING)

Während Encoding:

  • Live-Fortschritt/ETA über WebSocket
  • Pre-Encode-Ausführungen laufen vor HandBrake
  • Post-Encode-Ausführungen laufen nach HandBrake

Wichtig:

  • Pre-Encode-Fehler -> Job endet in ERROR
  • Post-Encode-Fehler -> Job kann FINISHED bleiben, aber mit Fehlerhinweis im Status/Log

8) Abschluss (FINISHED)

Ergebnis:

  • Ausgabe in movie_dir (ggf. profilspezifisch)
  • Job in Historie sichtbar
  • Logs im konfigurierten log_dir

Nützliche API-Shortcuts

# Pipeline-Snapshot
-curl http://localhost:3001/api/pipeline/state
-
-# Queue-Snapshot
-curl http://localhost:3001/api/pipeline/queue
-
-# Jobs
-curl http://localhost:3001/api/history
-
\ No newline at end of file + Erster Lauf - Ripster

Erster Lauf

Dieser Ablauf zeigt einen vollständigen Job aus Anwendersicht: von Disc-Erkennung bis fertiger Datei.

1. Dashboard öffnen und Disc einlegen

Erwartung:

  • Status wechselt auf DISC_DETECTED bzw. Medium erkannt
  • im Bereich Disk-Information sind Laufwerksdaten sichtbar

Wenn nichts passiert: Laufwerk neu lesen.

2. Analyse starten

Aktion im Dashboard:

  • Analyse starten

Erwartung:

  • Status ANALYZING
  • danach Metadaten-Dialog

3. Metadaten auswählen

Im Dialog Metadaten auswählen:

  1. OMDb-Suche nutzen oder manuell eintragen
  2. passenden Treffer markieren
  3. Auswahl übernehmen

4. Auf den nächsten Zustand reagieren

  • Normalfall ohne vorhandenes RAW: RIPPING -> MEDIAINFO_CHECK -> READY_TO_ENCODE
  • bei vorhandenem RAW: direkt MEDIAINFO_CHECK -> READY_TO_ENCODE
  • bei unklarer Blu-ray-Playlist: WAITING_FOR_USER_DECISION (Playlist auswählen und übernehmen)

5. Review in READY_TO_ENCODE

Im aufgeklappten Job (Pipeline-Status):

  • Encode-Titel wählen
  • Audio-/Subtitle-Spuren prüfen
  • optional User-Preset auswählen
  • optional Pre-/Post-Skripte bzw. Ketten hinzufügen

Dann Encoding starten.

6. Encoding überwachen

Während ENCODING:

  • Fortschritt + ETA im Dashboard
  • Live-Log im Pipeline-Status
  • Queue- und Skript/Cron-Status parallel beobachtbar

7. Ergebnis prüfen

Bei FINISHED:

  1. Seite Historie öffnen
  2. Job in Details öffnen
  3. Output-Pfad, Status und Log prüfen

Typische Folgeaktionen

  • Falsches OMDb-Match: in Historie -> OMDb neu zuordnen
  • Neue Encodierung aus RAW: RAW neu encodieren
  • Prüfung komplett neu aufbauen: Review neu starten
\ No newline at end of file diff --git a/site/gui/dashboard/index.html b/site/gui/dashboard/index.html new file mode 100644 index 0000000..55d6891 --- /dev/null +++ b/site/gui/dashboard/index.html @@ -0,0 +1 @@ + Dashboard - Ripster

Dashboard

Das Dashboard ist die Betriebszentrale für laufende Jobs.

Aufbau der Seite

Die Bereiche erscheinen in dieser Reihenfolge:

  1. Hardware Monitoring
  2. Job Queue
  3. Skript- / Cron-Status
  4. Job Übersicht
  5. Disk-Information

1) Hardware Monitoring

Zeigt live:

  • CPU (gesamt + optional pro Kern)
  • RAM
  • GPU-Auslastung/Temperatur/VRAM
  • freien Speicher in den konfigurierten Pfaden

Wichtig für den Betrieb:

  • Hohe Speicherauslastung oder fast volle Zielpfade früh erkennen
  • über Settings aktivierbar/deaktivierbar (hardware_monitoring_*)

2) Job Queue

Zwei Spalten:

  • Laufende Jobs
  • Warteschlange

Mögliche Aktionen:

  • Queue per Drag-and-Drop umsortieren
  • Queue-Job entfernen (X)
  • zusätzliche Queue-Elemente einfügen (+):
  • Skript
  • Skriptkette
  • Wartezeit

Hinweis:

  • Parallel zeigt das aktuell konfigurierte Parallel-Limit (pipeline_max_parallel_jobs).

3) Skript- / Cron-Status

Zeigt:

  • aktive Ausführungen (Skripte, Ketten, Cron)
  • zuletzt abgeschlossene Ausführungen

Mögliche Aktionen:

  • laufende Ketten: Nächster Schritt
  • laufende Einträge: Abbrechen
  • Historie der Aktivitäten: Liste leeren

4) Job Übersicht

Kompakte Jobliste mit Status, Fortschritt, ETA. Klick auf einen Job klappt die Detailsteuerung auf.

Im aufgeklappten Zustand erscheint die Karte Pipeline-Status mit allen zustandsabhängigen Aktionen.

Zustandsabhängige Hauptaktionen

Zustand Typische Aktion
DISC_DETECTED / IDLE Analyse starten
METADATA_SELECTION Metadaten öffnen
WAITING_FOR_USER_DECISION Playlist wählen und Playlist übernehmen
READY_TO_START Job starten
READY_TO_ENCODE Tracks/Skripte prüfen, dann Encoding starten
laufend (ANALYZING/RIPPING/ENCODING) Abbrechen
ERROR / CANCELLED Retry Rippen, Disk-Analyse neu starten

Zusätzlich je nach Job:

  • Review neu starten
  • Encode neu starten
  • Aus Queue löschen

Titel-/Spurprüfung (READY_TO_ENCODE)

Im selben Block siehst du:

  • Auswahl des Encode-Titels
  • Audio-/Subtitle-Trackauswahl
  • User-Preset-Auswahl
  • Pre-/Post-Encode-Skripte und Ketten
  • Preview des finalen HandBrakeCLI-Befehls

5) Disk-Information

Zeigt aktuelles Laufwerk und Disc-Metadaten (Pfad, Modell, Disc-Label, Mount).

Aktionen:

  • Laufwerk neu lesen
  • Disk neu analysieren
  • Metadaten-Modal öffnen

Wichtige Dialoge im Dashboard

Metadaten auswählen

  • OMDb-Suche + Ergebnisliste
  • manuelle Eingabe als Fallback
  • Auswahl übernehmen startet den nächsten Pipeline-Schritt

Abbruch-Bereinigung

Nach Abbruch kann Ripster optional fragen, ob erzeugte RAW- oder Movie-Dateien gelöscht werden sollen.

Queue-Eintrag einfügen

Erstellt gezielt einen Skript-, Ketten- oder Warte-Eintrag an einer bestimmten Queue-Position.

\ No newline at end of file diff --git a/site/gui/database/index.html b/site/gui/database/index.html new file mode 100644 index 0000000..ac6953a --- /dev/null +++ b/site/gui/database/index.html @@ -0,0 +1 @@ + Database (Expert) - Ripster

Database (Expert)

/database ist eine erweiterte Ansicht für Power-User und Recovery-Fälle.

Zugriff

  • Route direkt aufrufen: /database
  • nicht Teil der Standard-Navigation

Bereiche

1) Historie & Datenbank

Tabellarische Jobansicht mit:

  • ID, Poster, Medium, Titel
  • Status
  • Start/Ende

Aktionen im Detaildialog entsprechen weitgehend der Seite Historie (inkl. Re-Encode, Review-Neustart, OMDb-Zuordnung, Dateilöschung).

2) RAW ohne Historie

Listet RAW-Ordner, die keinen zugehörigen Job-Eintrag haben.

Aktionen:

  • RAW prüfen (Scan der konfigurierten RAW-Pfade)
  • Job anlegen (Orphan-RAW in Historie importieren)

Typischer Einsatz

  • nach manuellen Dateioperationen
  • nach Migrationen oder Recovery
  • wenn RAW-Dateien vorhanden sind, aber kein Historieneintrag existiert

Vorsicht

Diese Seite erlaubt Eingriffe mit direkter Auswirkung auf Datenbestand und Historie. Vor Lösch- oder Importaktionen Pfade und Zieljob sorgfältig prüfen.

\ No newline at end of file diff --git a/site/gui/history/index.html b/site/gui/history/index.html new file mode 100644 index 0000000..7f21074 --- /dev/null +++ b/site/gui/history/index.html @@ -0,0 +1 @@ + Historie - Ripster

Historie

Die Seite Historie ist für Suche, Prüfung und Nachbearbeitung bestehender Jobs.

Hauptansicht

Filter und Werkzeuge:

  • Suche (Titel/IMDb)
  • Status-Filter
  • Medium-Filter (Blu-ray, DVD, Sonstiges)
  • Sortierung
  • Listen-/Grid-Layout

Jeder Eintrag zeigt:

  • Poster, Titel, Jahr, IMDb
  • Medium-Indikator
  • Status
  • Start/Ende
  • Verfügbarkeit von RAW/Movie
  • Ratings (wenn OMDb-Daten vorhanden)

Klick auf einen Eintrag öffnet die Detailansicht.


Job-Detaildialog

Bereiche:

  • Film-Infos + OMDb-Details
  • Job-Infos (Status, Pfade, Erfolgsflags, Fehler)
  • hinterlegte Encode-Auswahl
  • ausgeführter HandBrake-Befehl
  • strukturierte JSON-Blöcke (OMDb/MakeMKV/MediaInfo/EncodePlan/HandBrake)
  • Log-Ladefunktionen (Tail, Vollständig)

Typische Aktionen im Detaildialog

  • OMDb neu zuordnen
  • Encode neu starten
  • Review neu starten
  • RAW neu encodieren
  • RAW löschen, Movie löschen, Beides löschen
  • Historieneintrag löschen
  • bei Queue-Lock: Aus Queue löschen

Wann welche Aktion?

Ziel Aktion
Metadaten korrigieren OMDb neu zuordnen
mit gleicher bestätigter Auswahl neu encodieren Encode neu starten
Titel-/Spurprüfung komplett neu berechnen Review neu starten
aus vorhandenem RAW erneut encodieren RAW neu encodieren
Speicher freigeben Dateilöschaktionen

Logs

  • Tail laden (800) für schnelle Fehleranalyse
  • Vollständiges Log laden für vollständige Nachverfolgung
\ No newline at end of file diff --git a/site/gui/index.html b/site/gui/index.html new file mode 100644 index 0000000..2452681 --- /dev/null +++ b/site/gui/index.html @@ -0,0 +1 @@ + GUI-Seiten - Ripster

GUI-Seiten

Ripster hat drei Hauptseiten in der Navigation plus eine Expert-Seite.

Seitenüberblick

Seite Zweck
Dashboard Live-Betrieb: Pipeline, Queue, Aktivitäten, Disc-Infos
Settings Konfiguration, Skripte, Ketten, Presets, Cronjobs
Historie abgeschlossene/laufende Jobs durchsuchen und nachbearbeiten
Database (Expert) tabellarische Rohsicht inkl. Orphan-RAW-Import

Empfohlene Nutzung im Alltag

  1. Start eines neuen Jobs: Dashboard
  2. Regeln/Automatisierung anpassen: Settings
  3. Ergebnisse prüfen oder Jobs nachbearbeiten: Historie
  4. Sonderfälle/Recovery: Database

Hinweise zur Navigation

  • Dashboard, Settings, Historie sind direkt in der Kopfnavigation.
  • Database ist als Expert-Route verfügbar: /database.
\ No newline at end of file diff --git a/site/gui/settings/index.html b/site/gui/settings/index.html new file mode 100644 index 0000000..27437ab --- /dev/null +++ b/site/gui/settings/index.html @@ -0,0 +1 @@ + Settings - Ripster

Settings

Die Seite Settings steuert Konfiguration und Automatisierung.

Tabs im Überblick

Tab Zweck
Konfiguration alle Kernsettings (Pfade, Tools, Monitoring, Metadaten, Queue, Benachrichtigungen)
Scripte einzelne Bash-Skripte verwalten und testen
Skriptketten Sequenzen aus Skript- und Warte-Schritten bauen
Encode-Presets benutzerdefinierte Presets für das Review im Dashboard
Cronjobs zeitgesteuerte Skript-/Kettenausführung

Tab Konfiguration

Wichtiges Bedienmuster:

  1. Werte ändern
  2. Änderungen speichern
  3. bei Bedarf Änderungen verwerfen oder Neu laden

Zusätzlich:

  • PushOver Test sendet eine Testnachricht
  • Änderungen werden erst nach Speichern wirksam
  • Tool-Preset-Felder bieten HandBrake-Presetauswahl direkt im Formular

Tab Scripte

Funktionen:

  • Skript anlegen, bearbeiten, löschen
  • Skript testen (Test)
  • Reihenfolge per Drag-and-Drop

Praxis:

  • Reihenfolge ist wichtig, weil ausgewählte Skripte später sequentiell abgearbeitet werden.
  • Testresultate zeigen Exit-Code, Dauer und stdout/stderr.

Tab Skriptketten

Funktionen:

  • Kette anlegen/bearbeiten/löschen
  • Kette testen
  • Reihenfolge der Ketten per Drag-and-Drop

Im Ketten-Editor:

  • Bausteine links (Warten, vorhandene Skripte)
  • Schritte rechts per Klick oder Drag-and-Drop hinzufügen
  • Schrittreihenfolge im Canvas ändern

Tab Encode-Presets

Ein Preset bündelt:

  • optional HandBrake-Preset (-Z)
  • optionale Extra-Args
  • Medientyp (Universell, Blu-ray, DVD, Sonstiges)

Verwendung:

  • Diese Presets erscheinen später im Dashboard im Review (READY_TO_ENCODE).

Tab Cronjobs

Funktionen:

  • Cronjob anlegen und bearbeiten
  • Quelle wählen: Skript oder Skriptkette
  • Cron-Ausdruck validieren
  • Jetzt ausführen
  • Logs je Cronjob anzeigen
  • Aktiviert und Pushover toggeln

Hilfen:

  • Beispiele für Cron-Ausdrücke direkt im Dialog
  • Link zu crontab.guru im Editor

Empfehlung für stabile Nutzung

  1. Erst Konfiguration sauber setzen
  2. dann Skripte/Ketten testen
  3. danach Cronjobs aktivieren
\ No newline at end of file diff --git a/site/index.html b/site/index.html index e439e9c..ba91522 100644 --- a/site/index.html +++ b/site/index.html @@ -1,29 +1 @@ - Ripster

Ripster

Halbautomatische Disc-Ripping-Plattform für DVDs und Blu-rays


  • Automatisiertes Ripping


    Disc einlegen – Ripster erkennt sie automatisch und startet den Analyse-Workflow mit MakeMKV.

    Workflow verstehen

  • Metadata-Integration


    Automatische Suche in der OMDb-Datenbank für Filmtitel, Poster und IMDb-IDs.

    Konfiguration

  • Flexibles Encoding


    HandBrake-Encoding mit individueller Track-Auswahl für Audio- und Untertitelspuren.

    Encode-Planung

  • Job-Historie


    Vollständiges Audit-Trail aller Ripping-Jobs mit Logs und Re-Encode-Funktion.

    History API


Was ist Ripster?

Ripster ist eine webbasierte Anwendung zur halbautomatischen Digitalisierung von DVDs und Blu-rays. Die Anwendung kombiniert bewährte Open-Source-Tools zu einem durchgängigen, komfortablen Workflow:

Disc einlegen → Erkennung → Analyse → Metadaten wählen → Rippen → Encodieren → Fertig
-

Kernfunktionen

Feature Beschreibung
Echtzeit-Updates WebSocket-basierte Live-Statusanzeige ohne Reload
Intelligente Playlist-Analyse Erkennt Blu-ray Playlist-Verschleierung (Fake-Playlists)
Track-Auswahl Individuelle Auswahl von Audio- und Untertitelspuren
Orphan-Recovery Import von bereits gerippten Dateien als Jobs
PushOver-Benachrichtigungen Mobile Alerts bei Fertigstellung oder Fehlern
DB-Korruptions-Recovery Automatische Quarantäne bei korrupten SQLite-Dateien
Re-Encoding Erneutes Encodieren ohne neu rippen

Technologie-Stack

  • Node.js >= 20.19.0 mit Express.js
  • SQLite3 mit automatischen Schema-Migrationen
  • WebSocket (ws) für Echtzeit-Kommunikation
  • Externe CLI-Tools: makemkvcon, HandBrakeCLI, mediainfo
  • React 18.3.1 mit React Router
  • Vite 5.4.12 als Build-Tool
  • PrimeReact 10.9.2 als UI-Bibliothek
  • WebSocket-Client für Live-Updates
Tool Zweck
makemkvcon Disc-Analyse & MKV/Backup-Ripping
HandBrakeCLI Video-Encoding
mediainfo Track-Informationen aus gerippten Dateien
OMDb API Filmmetadaten (Titel, Poster, IMDb-ID)

Schnellstart

# 1. Repository klonen
-git clone https://github.com/YOUR_GITHUB_USERNAME/ripster.git
-cd ripster
-
-# 2. Starten (Node.js >= 20 erforderlich)
-./start.sh
-
-# 3. Browser öffnen
-open http://localhost:5173
-

Erste Schritte

Die vollständige Installationsanleitung mit allen Voraussetzungen findest du unter Erste Schritte.


Pipeline-Überblick

flowchart LR
-    IDLE --> DD[DISC_DETECTED]
-    DD --> META[METADATA\nSELECTION]
-    META --> RTS[READY_TO\nSTART]
-    RTS -->|Auto-Start| RIP[RIPPING]
-    RTS -->|Auto-Start mit RAW| MIC
-    RIP --> MIC[MEDIAINFO\nCHECK]
-    MIC -->|Playlist offen (Backup)| WUD[WAITING_FOR\nUSER_DECISION]
-    WUD --> MIC
-    MIC --> RTE[READY_TO\nENCODE]
-    RTE --> ENC[ENCODING]
-    ENC -->|inkl. Post-Skripte| FIN([FINISHED])
-    ENC --> ERR([ERROR])
-    RIP --> ERR
-
-    style FIN fill:#e8f5e9,stroke:#66bb6a,color:#2e7d32
-    style ERR fill:#ffebee,stroke:#ef5350,color:#c62828
-    style WUD fill:#fff8e1,stroke:#ffa726,color:#e65100
-    style ENC fill:#f3e5f5,stroke:#ab47bc,color:#6a1b9a

READY_TO_START ist in der Praxis meist ein kurzer Übergangszustand: der Job wird nach Metadaten-Auswahl automatisch gestartet oder in die Queue eingeplant.

\ No newline at end of file + Ripster

Ripster Handbuch

Dieses Dokumentationsset ist als Benutzerhandbuch aufgebaut: erst Bedienung und Alltag, dann Technik im Anhang.


Schnellstart in 3 Schritten

  1. Voraussetzungen prüfen und installieren: Installation
  2. Grundkonfiguration in der UI setzen: Ersteinrichtung
  3. Ersten vollständigen Job durchlaufen: Erster Lauf

Was du hier findest

  • Benutzerhandbuch
  • Installation
  • GUI-Seiten im Detail (Dashboard, Settings, Historie, Database)
  • typische Arbeitsabläufe aus Anwendersicht
  • Technischer Anhang
  • vollständige Einstellungsreferenz
  • Pipeline-/API-/Architekturdetails
  • Deployment und Tool-Hintergründe

Empfohlene Lesereihenfolge

  1. Benutzerhandbuch Überblick
  2. GUI-Seiten
  3. Workflows aus Nutzersicht
  4. Bei Bedarf: Technischer Anhang
\ No newline at end of file diff --git a/site/pipeline/encoding/index.html b/site/pipeline/encoding/index.html index f5489d5..13e4449 100644 --- a/site/pipeline/encoding/index.html +++ b/site/pipeline/encoding/index.html @@ -1,4 +1,4 @@ - Encode-Planung & Track-Auswahl - Ripster

Encode-Planung & Track-Auswahl

Ripster erzeugt vor dem Encode einen encodePlan und lässt ihn im Review-Panel bestätigen.


Ablauf

Quelle bestimmen (Disc/RAW)
+ Encode-Planung & Track-Auswahl - Ripster      

Encode-Planung & Track-Auswahl

Ripster erzeugt vor dem Encode einen encodePlan und lässt ihn im Review-Panel bestätigen.


Ablauf

Quelle bestimmen (Disc/RAW)
   -> HandBrake-Scan (--scan --json)
   -> Plan erstellen (Titel, Audio, Untertitel)
   -> READY_TO_ENCODE
diff --git a/site/pipeline/index.html b/site/pipeline/index.html
index 304e95f..2fd5ce5 100644
--- a/site/pipeline/index.html
+++ b/site/pipeline/index.html
@@ -1 +1 @@
- Pipeline - Ripster      

Pipeline

Der Pipeline-Bereich beschreibt den Kern-Workflow von Ripster.

  • Workflow & Zustände


    Zustände, Übergänge und Queue-Verhalten.

    Workflow

  • Encode-Planung


    Wie Titel/Tracks für HandBrake vorbereitet und bestätigt werden.

    Encoding

  • Playlist-Analyse


    Bewertung mehrdeutiger Blu-ray-Playlists und manuelle Entscheidung.

    Playlist-Analyse

  • Encode-Skripte (Pre & Post)


    Skripte/Ketten vor und nach dem Encode ausführen.

    Encode-Skripte

\ No newline at end of file + Anhang: Pipeline intern - Ripster

Anhang: Pipeline intern

Dieser Abschnitt beschreibt die technische Pipeline-Logik hinter den UI-Workflows.

  • Workflow & Zustände


    Zustandsmodell, Übergänge, Queue-Verhalten.

    Workflow

  • Encode-Planung


    Aufbereitung von Titeln/Tracks und Bestätigungslogik.

    Encoding

  • Playlist-Analyse


    Bewertung mehrdeutiger Blu-ray-Playlists.

    Playlist-Analyse

  • Pre-/Post-Encode-Ausführungen


    Skript- und Kettenlauf vor/nach dem Encoding.

    Encode-Skripte

Zurück zum Handbuch

\ No newline at end of file diff --git a/site/pipeline/playlist-analysis/index.html b/site/pipeline/playlist-analysis/index.html index 447218a..15b0a92 100644 --- a/site/pipeline/playlist-analysis/index.html +++ b/site/pipeline/playlist-analysis/index.html @@ -1 +1 @@ - Playlist-Analyse - Ripster

Playlist-Analyse

Ripster analysiert bei Blu-ray-ähnlichen Quellen Playlists und fordert bei Mehrdeutigkeit eine manuelle Auswahl an.


Ziel

Erkennen, welche Playlist wahrscheinlich der Hauptfilm ist, statt versehentlich eine Fake-/Dummy-Playlist zu verwenden.


Eingabedaten

Die Analyse basiert auf MakeMKV-Infos (u. a. Playlist-/Segment-Struktur, Laufzeiten, Titelzuordnung).


Auswertung (vereinfacht)

Für Kandidaten werden u. a. berücksichtigt:

  • Laufzeit
  • Segment-Reihenfolge
  • Rückwärtssprünge/große Sprünge
  • Kohärenz linearer Segmentfolgen
  • Duplikatgruppen mit ähnlicher Laufzeit

Daraus entstehen:

  • candidates
  • evaluatedCandidates (inkl. Score/Label)
  • recommendation
  • manualDecisionRequired

Wann muss der Benutzer entscheiden?

Wenn nach Filterung mehr als ein relevanter Kandidat übrig bleibt, setzt Ripster manualDecisionRequired = true und wechselt auf:

  • WAITING_FOR_USER_DECISION

Dann muss eine Playlist bestätigt werden, bevor der Workflow weiterläuft.


Konfigurationseinfluss

Key Wirkung
makemkv_min_length_minutes Mindestlaufzeit für Kandidaten

Default ist aktuell 60 Minuten.


UI-Verhalten

Bei manueller Entscheidung zeigt das Dashboard Kandidaten inkl. Score/Bewertung und markiert eine Empfehlung.

Nach Bestätigung:

  • mit vorhandenem RAW -> zurück zu MEDIAINFO_CHECK
  • ohne RAW -> Startpfad über READY_TO_START/RIPPING
\ No newline at end of file + Playlist-Analyse - Ripster

Playlist-Analyse

Ripster analysiert bei Blu-ray-ähnlichen Quellen Playlists und fordert bei Mehrdeutigkeit eine manuelle Auswahl an.


Ziel

Erkennen, welche Playlist wahrscheinlich der Hauptfilm ist, statt versehentlich eine Fake-/Dummy-Playlist zu verwenden.


Eingabedaten

Die Analyse basiert auf MakeMKV-Infos (u. a. Playlist-/Segment-Struktur, Laufzeiten, Titelzuordnung).


Auswertung (vereinfacht)

Für Kandidaten werden u. a. berücksichtigt:

  • Laufzeit
  • Segment-Reihenfolge
  • Rückwärtssprünge/große Sprünge
  • Kohärenz linearer Segmentfolgen
  • Duplikatgruppen mit ähnlicher Laufzeit

Daraus entstehen:

  • candidates
  • evaluatedCandidates (inkl. Score/Label)
  • recommendation
  • manualDecisionRequired

Wann muss der Benutzer entscheiden?

Wenn nach Filterung mehr als ein relevanter Kandidat übrig bleibt, setzt Ripster manualDecisionRequired = true und wechselt auf:

  • WAITING_FOR_USER_DECISION

Dann muss eine Playlist bestätigt werden, bevor der Workflow weiterläuft.


Konfigurationseinfluss

Key Wirkung
makemkv_min_length_minutes Mindestlaufzeit für Kandidaten

Default ist aktuell 60 Minuten.


UI-Verhalten

Bei manueller Entscheidung zeigt das Dashboard Kandidaten inkl. Score/Bewertung und markiert eine Empfehlung.

Nach Bestätigung:

  • mit vorhandenem RAW -> zurück zu MEDIAINFO_CHECK
  • ohne RAW -> Startpfad über READY_TO_START/RIPPING
\ No newline at end of file diff --git a/site/pipeline/post-encode-scripts/index.html b/site/pipeline/post-encode-scripts/index.html index 6c227d5..0501b30 100644 --- a/site/pipeline/post-encode-scripts/index.html +++ b/site/pipeline/post-encode-scripts/index.html @@ -1,4 +1,4 @@ - Encode-Skripte (Pre & Post) - Ripster

Encode-Skripte (Pre & Post)

Ripster kann Skripte und Skript-Ketten vor und nach dem Encode ausführen.


Ablauf

READY_TO_ENCODE
+ Encode-Skripte (Pre & Post) - Ripster      

Encode-Skripte (Pre & Post)

Ripster kann Skripte und Skript-Ketten vor und nach dem Encode ausführen.


Ablauf

READY_TO_ENCODE
   -> Pre-Encode Skripte/Ketten
   -> HandBrake Encoding
   -> Post-Encode Skripte/Ketten
diff --git a/site/pipeline/workflow/index.html b/site/pipeline/workflow/index.html
index 83b0443..a9a814d 100644
--- a/site/pipeline/workflow/index.html
+++ b/site/pipeline/workflow/index.html
@@ -1,4 +1,4 @@
- Workflow & Zustände - Ripster      

Workflow & Zustände

Ripster steuert den Ablauf als State-Machine im pipelineService.


Zustandsdiagramm (vereinfacht)

flowchart LR
+ Workflow & Zustände - Ripster      

Workflow & Zustände

Ripster steuert den Ablauf als State-Machine im pipelineService.


Zustandsdiagramm (vereinfacht)

flowchart LR
     IDLE --> DISC_DETECTED
     DISC_DETECTED --> ANALYZING
     ANALYZING --> METADATA_SELECTION
diff --git a/site/search/search_index.json b/site/search/search_index.json
index 44dcf88..06dd2c9 100644
--- a/site/search/search_index.json
+++ b/site/search/search_index.json
@@ -1 +1 @@
-{"config":{"lang":["de"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Ripster","text":"

Halbautomatische Disc-Ripping-Plattform f\u00fcr DVDs und Blu-rays

  • Automatisiertes Ripping

    Disc einlegen \u2013 Ripster erkennt sie automatisch und startet den Analyse-Workflow mit MakeMKV.

    Workflow verstehen

  • Metadata-Integration

    Automatische Suche in der OMDb-Datenbank f\u00fcr Filmtitel, Poster und IMDb-IDs.

    Konfiguration

  • Flexibles Encoding

    HandBrake-Encoding mit individueller Track-Auswahl f\u00fcr Audio- und Untertitelspuren.

    Encode-Planung

  • Job-Historie

    Vollst\u00e4ndiges Audit-Trail aller Ripping-Jobs mit Logs und Re-Encode-Funktion.

    History API

"},{"location":"#was-ist-ripster","title":"Was ist Ripster?","text":"

Ripster ist eine webbasierte Anwendung zur halbautomatischen Digitalisierung von DVDs und Blu-rays. Die Anwendung kombiniert bew\u00e4hrte Open-Source-Tools zu einem durchg\u00e4ngigen, komfortablen Workflow:

Disc einlegen \u2192 Erkennung \u2192 Analyse \u2192 Metadaten w\u00e4hlen \u2192 Rippen \u2192 Encodieren \u2192 Fertig\n
"},{"location":"#kernfunktionen","title":"Kernfunktionen","text":"Feature Beschreibung Echtzeit-Updates WebSocket-basierte Live-Statusanzeige ohne Reload Intelligente Playlist-Analyse Erkennt Blu-ray Playlist-Verschleierung (Fake-Playlists) Track-Auswahl Individuelle Auswahl von Audio- und Untertitelspuren Orphan-Recovery Import von bereits gerippten Dateien als Jobs PushOver-Benachrichtigungen Mobile Alerts bei Fertigstellung oder Fehlern DB-Korruptions-Recovery Automatische Quarant\u00e4ne bei korrupten SQLite-Dateien Re-Encoding Erneutes Encodieren ohne neu rippen"},{"location":"#technologie-stack","title":"Technologie-Stack","text":"BackendFrontendExterne Tools
  • Node.js >= 20.19.0 mit Express.js
  • SQLite3 mit automatischen Schema-Migrationen
  • WebSocket (ws) f\u00fcr Echtzeit-Kommunikation
  • Externe CLI-Tools: makemkvcon, HandBrakeCLI, mediainfo
  • React 18.3.1 mit React Router
  • Vite 5.4.12 als Build-Tool
  • PrimeReact 10.9.2 als UI-Bibliothek
  • WebSocket-Client f\u00fcr Live-Updates
Tool Zweck makemkvcon Disc-Analyse & MKV/Backup-Ripping HandBrakeCLI Video-Encoding mediainfo Track-Informationen aus gerippten Dateien OMDb API Filmmetadaten (Titel, Poster, IMDb-ID)"},{"location":"#schnellstart","title":"Schnellstart","text":"
# 1. Repository klonen\ngit clone https://github.com/YOUR_GITHUB_USERNAME/ripster.git\ncd ripster\n\n# 2. Starten (Node.js >= 20 erforderlich)\n./start.sh\n\n# 3. Browser \u00f6ffnen\nopen http://localhost:5173\n

Erste Schritte

Die vollst\u00e4ndige Installationsanleitung mit allen Voraussetzungen findest du unter Erste Schritte.

"},{"location":"#pipeline-uberblick","title":"Pipeline-\u00dcberblick","text":"
flowchart LR\n    IDLE --> DD[DISC_DETECTED]\n    DD --> META[METADATA\\nSELECTION]\n    META --> RTS[READY_TO\\nSTART]\n    RTS -->|Auto-Start| RIP[RIPPING]\n    RTS -->|Auto-Start mit RAW| MIC\n    RIP --> MIC[MEDIAINFO\\nCHECK]\n    MIC -->|Playlist offen (Backup)| WUD[WAITING_FOR\\nUSER_DECISION]\n    WUD --> MIC\n    MIC --> RTE[READY_TO\\nENCODE]\n    RTE --> ENC[ENCODING]\n    ENC -->|inkl. Post-Skripte| FIN([FINISHED])\n    ENC --> ERR([ERROR])\n    RIP --> ERR\n\n    style FIN fill:#e8f5e9,stroke:#66bb6a,color:#2e7d32\n    style ERR fill:#ffebee,stroke:#ef5350,color:#c62828\n    style WUD fill:#fff8e1,stroke:#ffa726,color:#e65100\n    style ENC fill:#f3e5f5,stroke:#ab47bc,color:#6a1b9a

READY_TO_START ist in der Praxis meist ein kurzer \u00dcbergangszustand: der Job wird nach Metadaten-Auswahl automatisch gestartet oder in die Queue eingeplant.

"},{"location":"api/","title":"API-Referenz","text":"

Ripster bietet eine REST-API f\u00fcr Steuerung/Verwaltung sowie einen WebSocket-Endpunkt f\u00fcr Echtzeit-Updates.

"},{"location":"api/#basis-url","title":"Basis-URL","text":"
http://localhost:3001\n

API-Prefix: /api

Beispiele:

  • GET /api/health
  • GET /api/pipeline/state
"},{"location":"api/#api-gruppen","title":"API-Gruppen","text":"
  • Health

    Service-Liveness.

    GET /api/health

  • Pipeline API

    Analyse, Start/Retry/Cancel, Queue, Re-Encode.

    Pipeline API

  • Settings API

    Einstellungen, Skripte/Ketten, User-Presets.

    Settings API

  • History API

    Job-Historie, Orphan-Import, L\u00f6schoperationen.

    History API

  • Cron API

    Zeitgesteuerte Skript-/Kettenausf\u00fchrung.

    Cron API

  • WebSocket Events

    Pipeline-, Queue-, Disk-, Settings-, Cron- und Monitoring-Events.

    WebSocket

"},{"location":"api/#authentifizierung","title":"Authentifizierung","text":"

Es gibt keine eingebaute Authentifizierung. Ripster ist f\u00fcr lokalen Betrieb gedacht.

"},{"location":"api/#fehlerformat","title":"Fehlerformat","text":"

Fehler werden zentral als JSON geliefert:

{\n  \"error\": {\n    \"message\": \"Job nicht gefunden.\",\n    \"statusCode\": 404,\n    \"reqId\": \"req_...\",\n    \"details\": [\n      {\n        \"field\": \"name\",\n        \"message\": \"Name darf nicht leer sein.\"\n      }\n    ]\n  }\n}\n

details ist optional (z. B. bei Validierungsfehlern).

"},{"location":"api/#haufige-statuscodes","title":"H\u00e4ufige Statuscodes","text":"Code Bedeutung 200 Erfolg 201 Ressource erstellt 400 Ung\u00fcltige Anfrage / Validierungsfehler 404 Ressource nicht gefunden 409 Konflikt (z. B. falscher Pipeline-Zustand, Job l\u00e4uft bereits) 500 Interner Fehler"},{"location":"api/crons/","title":"Cron API","text":"

Ripster enth\u00e4lt ein eingebautes Cron-System f\u00fcr Skripte und Skript-Ketten (sourceType: script|chain).

"},{"location":"api/crons/#get-apicrons","title":"GET /api/crons","text":"

Listet alle Cron-Jobs.

{\n  \"jobs\": [\n    {\n      \"id\": 1,\n      \"name\": \"Nachtlauf Backup\",\n      \"cronExpression\": \"0 2 * * *\",\n      \"sourceType\": \"script\",\n      \"sourceId\": 3,\n      \"sourceName\": \"Backup-Skript\",\n      \"enabled\": true,\n      \"pushoverEnabled\": true,\n      \"lastRunAt\": \"2026-03-10T02:00:00.000Z\",\n      \"lastRunStatus\": \"success\",\n      \"nextRunAt\": \"2026-03-11T02:00:00.000Z\",\n      \"createdAt\": \"2026-03-01T10:00:00.000Z\",\n      \"updatedAt\": \"2026-03-10T02:00:05.000Z\"\n    }\n  ]\n}\n
"},{"location":"api/crons/#post-apicrons","title":"POST /api/crons","text":"

Erstellt Cron-Job.

{\n  \"name\": \"Nachtlauf Backup\",\n  \"cronExpression\": \"0 2 * * *\",\n  \"sourceType\": \"script\",\n  \"sourceId\": 3,\n  \"enabled\": true,\n  \"pushoverEnabled\": true\n}\n

Response: 201 mit { \"job\": { ... } }

"},{"location":"api/crons/#get-apicronsid","title":"GET /api/crons/:id","text":"

Response:

{ \"job\": { \"id\": 1, \"name\": \"...\" } }\n
"},{"location":"api/crons/#put-apicronsid","title":"PUT /api/crons/:id","text":"

Aktualisiert Cron-Job. Felder wie bei POST.

Response:

{ \"job\": { ... } }\n
"},{"location":"api/crons/#delete-apicronsid","title":"DELETE /api/crons/:id","text":"

Response:

{ \"removed\": { \"id\": 1, \"name\": \"Nachtlauf Backup\" } }\n
"},{"location":"api/crons/#get-apicronsidlogs","title":"GET /api/crons/:id/logs","text":"

Liefert Ausf\u00fchrungs-Logs.

Query-Parameter:

Parameter Typ Default Beschreibung limit number 20 Anzahl Eintr\u00e4ge, max. 100

Response:

{\n  \"logs\": [\n    {\n      \"id\": 42,\n      \"cronJobId\": 1,\n      \"startedAt\": \"2026-03-10T02:00:01.000Z\",\n      \"finishedAt\": \"2026-03-10T02:00:05.000Z\",\n      \"status\": \"success\",\n      \"output\": \"Backup abgeschlossen.\",\n      \"errorMessage\": null\n    }\n  ]\n}\n

status: running | success | error

"},{"location":"api/crons/#post-apicronsidrun","title":"POST /api/crons/:id/run","text":"

Triggert Job manuell (asynchron).

Response:

{ \"triggered\": true, \"cronJobId\": 1 }\n

Wenn Job bereits l\u00e4uft: 409.

"},{"location":"api/crons/#post-apicronsvalidate-expression","title":"POST /api/crons/validate-expression","text":"

Validiert 5-Felder-Cron-Ausdruck und berechnet n\u00e4chsten Lauf.

Request:

{ \"cronExpression\": \"*/15 * * * *\" }\n

G\u00fcltige Response:

{\n  \"valid\": true,\n  \"nextRunAt\": \"2026-03-10T14:15:00.000Z\"\n}\n

Ung\u00fcltige Response:

{\n  \"valid\": false,\n  \"error\": \"Cron-Ausdruck muss genau 5 Felder haben (Minute Stunde Tag Monat Wochentag).\",\n  \"nextRunAt\": null\n}\n
"},{"location":"api/crons/#cron-format","title":"Cron-Format","text":"

Ripster unterst\u00fctzt 5 Felder:

Minute Stunde Tag Monat Wochentag\n

Beispiele:

  • 0 2 * * * t\u00e4glich 02:00
  • */15 * * * * alle 15 Minuten
  • 0 6 * * 1-5 Mo-Fr 06:00
"},{"location":"api/crons/#websocket-events-zu-cron","title":"WebSocket-Events zu Cron","text":"
  • CRON_JOBS_UPDATED bei Create/Update/Delete
  • CRON_JOB_UPDATED bei Laufzeitstatus (running -> success|error)
"},{"location":"api/history/","title":"History API","text":"

Endpunkte f\u00fcr Job-Historie, Orphan-Import und L\u00f6schoperationen.

"},{"location":"api/history/#get-apihistory","title":"GET /api/history","text":"

Liefert Jobs (optionale Filter).

Query-Parameter:

Parameter Typ Beschreibung status string Filter nach Job-Status search string Suche in Titel-Feldern

Beispiel:

GET /api/history?status=FINISHED&search=Inception\n

Response:

{\n  \"jobs\": [\n    {\n      \"id\": 42,\n      \"status\": \"FINISHED\",\n      \"title\": \"Inception\",\n      \"raw_path\": \"/mnt/raw/Inception - RAW - job-42\",\n      \"output_path\": \"/mnt/movies/Inception (2010)/Inception (2010).mkv\",\n      \"mediaType\": \"bluray\",\n      \"ripSuccessful\": true,\n      \"encodeSuccess\": true,\n      \"created_at\": \"2026-03-10T08:00:00.000Z\",\n      \"updated_at\": \"2026-03-10T10:00:00.000Z\"\n    }\n  ]\n}\n
"},{"location":"api/history/#get-apihistoryid","title":"GET /api/history/:id","text":"

Liefert Job-Detail.

Query-Parameter:

Parameter Typ Standard Beschreibung includeLogs bool false Prozesslog laden includeLiveLog bool false alias-artig ebenfalls Prozesslog laden includeAllLogs bool false vollst\u00e4ndiges Log statt Tail logTailLines number 800 Tail-L\u00e4nge falls nicht includeAllLogs

Response:

{\n  \"job\": {\n    \"id\": 42,\n    \"status\": \"FINISHED\",\n    \"makemkvInfo\": {},\n    \"mediainfoInfo\": {},\n    \"handbrakeInfo\": {},\n    \"encodePlan\": {},\n    \"log\": \"...\",\n    \"log_count\": 1,\n    \"logMeta\": {\n      \"loaded\": true,\n      \"total\": 800,\n      \"returned\": 800,\n      \"truncated\": true\n    }\n  }\n}\n
"},{"location":"api/history/#get-apihistorydatabase","title":"GET /api/history/database","text":"

Debug-Ansicht der DB-Zeilen (angereichert).

Response:

{\n  \"rows\": [\n    {\n      \"id\": 42,\n      \"status\": \"FINISHED\",\n      \"rawFolderName\": \"Inception - RAW - job-42\"\n    }\n  ]\n}\n
"},{"location":"api/history/#get-apihistoryorphan-raw","title":"GET /api/history/orphan-raw","text":"

Sucht RAW-Ordner ohne zugeh\u00f6rigen Job.

Response:

{\n  \"rawDir\": \"/mnt/raw\",\n  \"rawDirs\": [\"/mnt/raw\", \"/mnt/raw-bluray\"],\n  \"rows\": [\n    {\n      \"rawPath\": \"/mnt/raw/Inception (2010) [tt1375666] - RAW - job-99\",\n      \"folderName\": \"Inception (2010) [tt1375666] - RAW - job-99\",\n      \"title\": \"Inception\",\n      \"year\": 2010,\n      \"imdbId\": \"tt1375666\",\n      \"folderJobId\": 99,\n      \"entryCount\": 4,\n      \"hasBlurayStructure\": true,\n      \"lastModifiedAt\": \"2026-03-10T09:00:00.000Z\"\n    }\n  ]\n}\n
"},{"location":"api/history/#post-apihistoryorphan-rawimport","title":"POST /api/history/orphan-raw/import","text":"

Importiert RAW-Ordner als FINISHED-Job.

Request:

{ \"rawPath\": \"/mnt/raw/Inception (2010) [tt1375666] - RAW - job-99\" }\n

Response:

{\n  \"job\": { \"id\": 77, \"status\": \"FINISHED\" },\n  \"uiReset\": { \"reset\": true, \"state\": \"IDLE\" }\n}\n
"},{"location":"api/history/#post-apihistoryidomdbassign","title":"POST /api/history/:id/omdb/assign","text":"

Weist OMDb-/Metadaten nachtr\u00e4glich zu.

Request:

{\n  \"imdbId\": \"tt1375666\",\n  \"title\": \"Inception\",\n  \"year\": 2010,\n  \"poster\": \"https://...\",\n  \"fromOmdb\": true\n}\n

Response:

{ \"job\": { \"id\": 42, \"imdb_id\": \"tt1375666\" } }\n
"},{"location":"api/history/#post-apihistoryiddelete-files","title":"POST /api/history/:id/delete-files","text":"

L\u00f6scht Dateien eines Jobs, beh\u00e4lt DB-Eintrag.

Request:

{ \"target\": \"both\" }\n

target: raw | movie | both

Response:

{\n  \"summary\": {\n    \"target\": \"both\",\n    \"raw\": { \"attempted\": true, \"deleted\": true, \"filesDeleted\": 12, \"dirsRemoved\": 3, \"reason\": null },\n    \"movie\": { \"attempted\": true, \"deleted\": false, \"filesDeleted\": 0, \"dirsRemoved\": 0, \"reason\": \"Movie-Datei/Pfad existiert nicht.\" }\n  },\n  \"job\": { \"id\": 42 }\n}\n
"},{"location":"api/history/#post-apihistoryiddelete","title":"POST /api/history/:id/delete","text":"

L\u00f6scht Job aus DB; optional auch Dateien.

Request:

{ \"target\": \"none\" }\n

target: none | raw | movie | both

Response:

{\n  \"deleted\": true,\n  \"jobId\": 42,\n  \"fileTarget\": \"both\",\n  \"fileSummary\": {\n    \"target\": \"both\",\n    \"raw\": { \"filesDeleted\": 10 },\n    \"movie\": { \"filesDeleted\": 1 }\n  },\n  \"uiReset\": {\n    \"reset\": true,\n    \"state\": \"IDLE\"\n  }\n}\n
"},{"location":"api/history/#hinweise","title":"Hinweise","text":"
  • Ein aktiver Pipeline-Job kann nicht gel\u00f6scht werden (409).
  • Alle L\u00f6schoperationen sind irreversibel.
"},{"location":"api/pipeline/","title":"Pipeline API","text":"

Endpunkte zur Steuerung des Pipeline-Workflows.

"},{"location":"api/pipeline/#get-apipipelinestate","title":"GET /api/pipeline/state","text":"

Liefert aktuellen Pipeline- und Hardware-Monitoring-Snapshot.

Response (Beispiel):

{\n  \"pipeline\": {\n    \"state\": \"READY_TO_ENCODE\",\n    \"activeJobId\": 42,\n    \"progress\": 0,\n    \"eta\": null,\n    \"statusText\": \"Mediainfo best\u00e4tigt - Encode manuell starten\",\n    \"context\": {\n      \"jobId\": 42\n    },\n    \"jobProgress\": {\n      \"42\": {\n        \"state\": \"MEDIAINFO_CHECK\",\n        \"progress\": 68.5,\n        \"eta\": null,\n        \"statusText\": \"MEDIAINFO_CHECK 68.50%\"\n      }\n    },\n    \"queue\": {\n      \"maxParallelJobs\": 1,\n      \"runningCount\": 1,\n      \"queuedCount\": 2,\n      \"runningJobs\": [],\n      \"queuedJobs\": []\n    }\n  },\n  \"hardwareMonitoring\": {\n    \"enabled\": true,\n    \"intervalMs\": 5000,\n    \"updatedAt\": \"2026-03-10T09:00:00.000Z\",\n    \"sample\": {\n      \"cpu\": {},\n      \"memory\": {},\n      \"gpu\": {},\n      \"storage\": {}\n    },\n    \"error\": null\n  }\n}\n
"},{"location":"api/pipeline/#post-apipipelineanalyze","title":"POST /api/pipeline/analyze","text":"

Startet Disc-Analyse und legt Job an.

Response:

{\n  \"result\": {\n    \"jobId\": 42,\n    \"detectedTitle\": \"INCEPTION\",\n    \"omdbCandidates\": []\n  }\n}\n
"},{"location":"api/pipeline/#post-apipipelinerescan-disc","title":"POST /api/pipeline/rescan-disc","text":"

Erzwingt erneute Laufwerkspr\u00fcfung.

Response (Beispiel):

{\n  \"result\": {\n    \"present\": true,\n    \"changed\": true,\n    \"emitted\": \"discInserted\",\n    \"device\": {\n      \"path\": \"/dev/sr0\",\n      \"discLabel\": \"INCEPTION\",\n      \"mediaProfile\": \"bluray\"\n    }\n  }\n}\n
"},{"location":"api/pipeline/#get-apipipelineomdbsearchq","title":"GET /api/pipeline/omdb/search?q=

OMDb-Titelsuche.

Response:

{\n  \"results\": [\n    {\n      \"imdbId\": \"tt1375666\",\n      \"title\": \"Inception\",\n      \"year\": \"2010\",\n      \"type\": \"movie\",\n      \"poster\": \"https://...\"\n    }\n  ]\n}\n
","text":""},{"location":"api/pipeline/#post-apipipelineselect-metadata","title":"POST /api/pipeline/select-metadata

Setzt Metadaten (und optional Playlist) f\u00fcr einen Job.

Request:

{\n  \"jobId\": 42,\n  \"title\": \"Inception\",\n  \"year\": 2010,\n  \"imdbId\": \"tt1375666\",\n  \"poster\": \"https://...\",\n  \"fromOmdb\": true,\n  \"selectedPlaylist\": \"00800\"\n}\n

Response:

{ \"job\": { \"id\": 42, \"status\": \"READY_TO_START\" } }\n
","text":""},{"location":"api/pipeline/#post-apipipelinestartjobid","title":"POST /api/pipeline/start/:jobId

Startet vorbereiteten Job oder queued ihn (je nach Parallel-Limit).

M\u00f6gliche Responses:

{ \"result\": { \"started\": true, \"stage\": \"RIPPING\" } }\n
{ \"result\": { \"queued\": true, \"started\": false, \"queuePosition\": 2, \"action\": \"START_PREPARED\" } }\n
","text":""},{"location":"api/pipeline/#post-apipipelineconfirm-encodejobid","title":"POST /api/pipeline/confirm-encode/:jobId

Best\u00e4tigt Review-Auswahl (Tracks, Pre/Post-Skripte/Ketten, User-Preset).

Request (typisch):

{\n  \"selectedEncodeTitleId\": 1,\n  \"selectedTrackSelection\": {\n    \"1\": {\n      \"audioTrackIds\": [1, 2],\n      \"subtitleTrackIds\": [3]\n    }\n  },\n  \"selectedPreEncodeScriptIds\": [1],\n  \"selectedPostEncodeScriptIds\": [2, 7],\n  \"selectedPreEncodeChainIds\": [3],\n  \"selectedPostEncodeChainIds\": [4],\n  \"selectedUserPresetId\": 5,\n  \"skipPipelineStateUpdate\": false\n}\n

Response:

{ \"job\": { \"id\": 42, \"encode_review_confirmed\": 1 } }\n
","text":""},{"location":"api/pipeline/#post-apipipelinecancel","title":"POST /api/pipeline/cancel

Bricht laufenden Job ab oder entfernt Queue-Eintrag.

Request (optional):

{ \"jobId\": 42 }\n

M\u00f6gliche Responses:

{ \"result\": { \"cancelled\": true, \"queuedOnly\": true, \"jobId\": 42 } }\n
{ \"result\": { \"cancelled\": true, \"queuedOnly\": false, \"jobId\": 42 } }\n
{ \"result\": { \"cancelled\": true, \"queuedOnly\": false, \"pending\": true, \"jobId\": 42 } }\n
","text":""},{"location":"api/pipeline/#post-apipipelineretryjobid","title":"POST /api/pipeline/retry/:jobId

Retry f\u00fcr ERROR/CANCELLED-Jobs (oder Queue-Einreihung).

","text":""},{"location":"api/pipeline/#post-apipipelinereencodejobid","title":"POST /api/pipeline/reencode/:jobId

Startet Re-Encode aus bestehendem RAW.

","text":""},{"location":"api/pipeline/#post-apipipelinerestart-reviewjobid","title":"POST /api/pipeline/restart-review/:jobId

Berechnet Review aus RAW neu.

","text":""},{"location":"api/pipeline/#post-apipipelinerestart-encodejobid","title":"POST /api/pipeline/restart-encode/:jobId

Startet Encoding mit letzter best\u00e4tigter Review neu.

","text":""},{"location":"api/pipeline/#post-apipipelineresume-readyjobid","title":"POST /api/pipeline/resume-ready/:jobId

L\u00e4dt READY_TO_ENCODE-Job nach Neustart wieder in aktive Session.

Alle Endpunkte liefern { result: ... } bzw. { job: ... }.

","text":""},{"location":"api/pipeline/#queue-endpunkte","title":"Queue-Endpunkte","text":""},{"location":"api/pipeline/#get-apipipelinequeue","title":"GET /api/pipeline/queue","text":"

Liefert Queue-Snapshot.

{\n  \"queue\": {\n    \"maxParallelJobs\": 1,\n    \"runningCount\": 1,\n    \"queuedCount\": 3,\n    \"runningJobs\": [\n      {\n        \"jobId\": 41,\n        \"title\": \"Inception\",\n        \"status\": \"ENCODING\",\n        \"lastState\": \"ENCODING\"\n      }\n    ],\n    \"queuedJobs\": [\n      {\n        \"entryId\": 11,\n        \"position\": 1,\n        \"type\": \"job\",\n        \"jobId\": 42,\n        \"action\": \"START_PREPARED\",\n        \"actionLabel\": \"Start\",\n        \"title\": \"Matrix\",\n        \"status\": \"READY_TO_ENCODE\",\n        \"lastState\": \"READY_TO_ENCODE\",\n        \"hasScripts\": true,\n        \"hasChains\": false,\n        \"enqueuedAt\": \"2026-03-10T09:00:00.000Z\"\n      },\n      {\n        \"entryId\": 12,\n        \"position\": 2,\n        \"type\": \"wait\",\n        \"waitSeconds\": 30,\n        \"title\": \"Warten 30s\",\n        \"status\": \"QUEUED\",\n        \"enqueuedAt\": \"2026-03-10T09:01:00.000Z\"\n      }\n    ],\n    \"updatedAt\": \"2026-03-10T09:01:02.000Z\"\n  }\n}\n
"},{"location":"api/pipeline/#post-apipipelinequeuereorder","title":"POST /api/pipeline/queue/reorder","text":"

Sortiert Queue-Eintr\u00e4ge neu.

Request:

{\n  \"orderedEntryIds\": [12, 11]\n}\n

Legacy fallback wird akzeptiert:

{\n  \"orderedJobIds\": [42, 43]\n}\n
"},{"location":"api/pipeline/#post-apipipelinequeueentry","title":"POST /api/pipeline/queue/entry","text":"

F\u00fcgt Nicht-Job-Queue-Eintrag hinzu (script, chain, wait).

Request-Beispiele:

{ \"type\": \"script\", \"scriptId\": 3 }\n
{ \"type\": \"chain\", \"chainId\": 2, \"insertAfterEntryId\": 11 }\n
{ \"type\": \"wait\", \"waitSeconds\": 45 }\n

Response:

{\n  \"result\": { \"entryId\": 12, \"type\": \"wait\", \"position\": 2 },\n  \"queue\": { \"...\": \"...\" }\n}\n
"},{"location":"api/pipeline/#delete-apipipelinequeueentryentryid","title":"DELETE /api/pipeline/queue/entry/:entryId","text":"

Entfernt Queue-Eintrag.

Response:

{ \"queue\": { \"...\": \"...\" } }\n
"},{"location":"api/pipeline/#pipeline-zustande","title":"Pipeline-Zust\u00e4nde State Bedeutung IDLE Wartet auf Medium DISC_DETECTED Medium erkannt ANALYZING MakeMKV-Analyse l\u00e4uft METADATA_SELECTION Metadaten-Auswahl WAITING_FOR_USER_DECISION Playlist-Entscheidung erforderlich READY_TO_START \u00dcbergang vor Start RIPPING MakeMKV-Rip l\u00e4uft MEDIAINFO_CHECK Titel-/Track-Auswertung READY_TO_ENCODE Review bereit ENCODING HandBrake-Encoding l\u00e4uft FINISHED Abgeschlossen CANCELLED Abgebrochen ERROR Fehler","text":""},{"location":"api/settings/","title":"Settings API","text":"

Endpunkte f\u00fcr Einstellungen, Skripte, Skript-Ketten und User-Presets.

"},{"location":"api/settings/#get-apisettings","title":"GET /api/settings","text":"

Liefert alle Einstellungen kategorisiert.

Response (Struktur):

{\n  \"categories\": [\n    {\n      \"category\": \"Pfade\",\n      \"settings\": [\n        {\n          \"key\": \"raw_dir\",\n          \"label\": \"Raw Ausgabeordner\",\n          \"type\": \"path\",\n          \"required\": true,\n          \"description\": \"...\",\n          \"defaultValue\": \"data/output/raw\",\n          \"options\": [],\n          \"validation\": { \"minLength\": 1 },\n          \"value\": \"data/output/raw\",\n          \"orderIndex\": 100\n        }\n      ]\n    }\n  ]\n}\n
"},{"location":"api/settings/#put-apisettingskey","title":"PUT /api/settings/:key","text":"

Aktualisiert eine einzelne Einstellung.

Request:

{ \"value\": \"/mnt/storage/raw\" }\n

Response:

{\n  \"setting\": {\n    \"key\": \"raw_dir\",\n    \"value\": \"/mnt/storage/raw\"\n  },\n  \"reviewRefresh\": {\n    \"triggered\": false,\n    \"reason\": \"not_ready\"\n  }\n}\n

reviewRefresh ist null oder ein Objekt mit Status der optionalen Review-Neuberechnung.

"},{"location":"api/settings/#put-apisettings","title":"PUT /api/settings","text":"

Aktualisiert mehrere Einstellungen atomar.

Request:

{\n  \"settings\": {\n    \"raw_dir\": \"/mnt/storage/raw\",\n    \"movie_dir\": \"/mnt/storage/movies\",\n    \"handbrake_preset_bluray\": \"H.264 MKV 1080p30\"\n  }\n}\n

Response:

{\n  \"changes\": [\n    { \"key\": \"raw_dir\", \"value\": \"/mnt/storage/raw\" },\n    { \"key\": \"movie_dir\", \"value\": \"/mnt/storage/movies\" }\n  ],\n  \"reviewRefresh\": {\n    \"triggered\": true,\n    \"jobId\": 42,\n    \"relevantKeys\": [\"handbrake_preset_bluray\"]\n  }\n}\n

Bei Validierungsfehlern kommt 400 mit error.details[].

"},{"location":"api/settings/#get-apisettingshandbrake-presets","title":"GET /api/settings/handbrake-presets","text":"

Liest Preset-Liste via HandBrakeCLI -z (mit Fallback auf konfigurierte Presets).

Response (Beispiel):

{\n  \"source\": \"handbrake-cli\",\n  \"message\": null,\n  \"options\": [\n    { \"label\": \"General/\", \"value\": \"__group__general\", \"disabled\": true, \"category\": \"General\" },\n    { \"label\": \"   Fast 1080p30\", \"value\": \"Fast 1080p30\", \"category\": \"General\" }\n  ]\n}\n
"},{"location":"api/settings/#post-apisettingspushovertest","title":"POST /api/settings/pushover/test","text":"

Sendet Testnachricht \u00fcber aktuelle PushOver-Settings.

Request (optional):

{\n  \"title\": \"Test\",\n  \"message\": \"Ripster Test\"\n}\n

Response:

{\n  \"result\": {\n    \"sent\": true,\n    \"eventKey\": \"test\",\n    \"requestId\": \"...\"\n  }\n}\n

Wenn PushOver deaktiviert ist oder Credentials fehlen, kommt i. d. R. ebenfalls 200 mit sent: false + reason.

"},{"location":"api/settings/#skripte","title":"Skripte","text":"

Basis: /api/settings/scripts

"},{"location":"api/settings/#get-apisettingsscripts","title":"GET /api/settings/scripts","text":"
{ \"scripts\": [ { \"id\": 1, \"name\": \"...\", \"scriptBody\": \"...\", \"orderIndex\": 1, \"createdAt\": \"...\", \"updatedAt\": \"...\" } ] }\n
"},{"location":"api/settings/#post-apisettingsscripts","title":"POST /api/settings/scripts","text":"
{ \"name\": \"Move\", \"scriptBody\": \"mv \\\"$RIPSTER_OUTPUT_PATH\\\" /mnt/movies/\" }\n

Response: 201 mit { \"script\": { ... } }

"},{"location":"api/settings/#put-apisettingsscriptsid","title":"PUT /api/settings/scripts/:id","text":"

Body wie POST, Response { \"script\": { ... } }.

"},{"location":"api/settings/#delete-apisettingsscriptsid","title":"DELETE /api/settings/scripts/:id","text":"

Response { \"removed\": { ... } }.

"},{"location":"api/settings/#post-apisettingsscriptsreorder","title":"POST /api/settings/scripts/reorder","text":"
{ \"orderedScriptIds\": [3, 1, 2] }\n

Response { \"scripts\": [ ... ] }.

"},{"location":"api/settings/#post-apisettingsscriptsidtest","title":"POST /api/settings/scripts/:id/test","text":"

F\u00fchrt Skript als Testlauf aus.

{\n  \"result\": {\n    \"scriptId\": 1,\n    \"scriptName\": \"Move\",\n    \"success\": true,\n    \"exitCode\": 0,\n    \"signal\": null,\n    \"timedOut\": false,\n    \"durationMs\": 120,\n    \"stdout\": \"...\",\n    \"stderr\": \"...\",\n    \"stdoutTruncated\": false,\n    \"stderrTruncated\": false\n  }\n}\n
"},{"location":"api/settings/#umgebungsvariablen-fur-skripte","title":"Umgebungsvariablen f\u00fcr Skripte","text":"

Diese Variablen werden beim Ausf\u00fchren gesetzt:

  • RIPSTER_SCRIPT_RUN_AT
  • RIPSTER_JOB_ID
  • RIPSTER_JOB_TITLE
  • RIPSTER_MODE
  • RIPSTER_INPUT_PATH
  • RIPSTER_OUTPUT_PATH
  • RIPSTER_RAW_PATH
  • RIPSTER_SCRIPT_ID
  • RIPSTER_SCRIPT_NAME
  • RIPSTER_SCRIPT_SOURCE
"},{"location":"api/settings/#skript-ketten","title":"Skript-Ketten","text":"

Basis: /api/settings/script-chains

Eine Kette hat Schritte vom Typ:

  • script (scriptId erforderlich)
  • wait (waitSeconds 1..3600)
"},{"location":"api/settings/#get-apisettingsscript-chains","title":"GET /api/settings/script-chains","text":"

Response { \"chains\": [ ... ] } (inkl. steps[]).

"},{"location":"api/settings/#get-apisettingsscript-chainsid","title":"GET /api/settings/script-chains/:id","text":"

Response { \"chain\": { ... } }.

"},{"location":"api/settings/#post-apisettingsscript-chains","title":"POST /api/settings/script-chains","text":"
{\n  \"name\": \"After Encode\",\n  \"steps\": [\n    { \"stepType\": \"script\", \"scriptId\": 1 },\n    { \"stepType\": \"wait\", \"waitSeconds\": 15 },\n    { \"stepType\": \"script\", \"scriptId\": 2 }\n  ]\n}\n

Response: 201 mit { \"chain\": { ... } }

"},{"location":"api/settings/#put-apisettingsscript-chainsid","title":"PUT /api/settings/script-chains/:id","text":"

Body wie POST, Response { \"chain\": { ... } }.

"},{"location":"api/settings/#delete-apisettingsscript-chainsid","title":"DELETE /api/settings/script-chains/:id","text":"

Response { \"removed\": { ... } }.

"},{"location":"api/settings/#post-apisettingsscript-chainsreorder","title":"POST /api/settings/script-chains/reorder","text":"
{ \"orderedChainIds\": [2, 1, 3] }\n

Response { \"chains\": [ ... ] }.

"},{"location":"api/settings/#post-apisettingsscript-chainsidtest","title":"POST /api/settings/script-chains/:id/test","text":"

Response:

{\n  \"result\": {\n    \"chainId\": 2,\n    \"chainName\": \"After Encode\",\n    \"steps\": 3,\n    \"succeeded\": 3,\n    \"failed\": 0,\n    \"aborted\": false,\n    \"results\": []\n  }\n}\n
"},{"location":"api/settings/#user-presets","title":"User-Presets","text":"

Basis: /api/settings/user-presets

"},{"location":"api/settings/#get-apisettingsuser-presets","title":"GET /api/settings/user-presets","text":"

Optionaler Query-Parameter: media_type=bluray|dvd|other|all

{\n  \"presets\": [\n    {\n      \"id\": 1,\n      \"name\": \"Blu-ray HQ\",\n      \"mediaType\": \"bluray\",\n      \"handbrakePreset\": \"H.264 MKV 1080p30\",\n      \"extraArgs\": \"--encoder-preset slow\",\n      \"description\": \"...\",\n      \"createdAt\": \"...\",\n      \"updatedAt\": \"...\"\n    }\n  ]\n}\n
"},{"location":"api/settings/#post-apisettingsuser-presets","title":"POST /api/settings/user-presets","text":"
{\n  \"name\": \"Blu-ray HQ\",\n  \"mediaType\": \"bluray\",\n  \"handbrakePreset\": \"H.264 MKV 1080p30\",\n  \"extraArgs\": \"--encoder-preset slow\",\n  \"description\": \"optional\"\n}\n

Response: 201 mit { \"preset\": { ... } }

"},{"location":"api/settings/#put-apisettingsuser-presetsid","title":"PUT /api/settings/user-presets/:id","text":"

Body mit beliebigen Feldern aus POST, Response { \"preset\": { ... } }.

"},{"location":"api/settings/#delete-apisettingsuser-presetsid","title":"DELETE /api/settings/user-presets/:id","text":"

Response { \"removed\": { ... } }.

"},{"location":"api/websocket/","title":"WebSocket Events","text":"

Ripster sendet Echtzeit-Updates \u00fcber /ws.

"},{"location":"api/websocket/#verbindung","title":"Verbindung","text":"
const ws = new WebSocket('ws://localhost:3001/ws');\n\nws.onmessage = (event) => {\n  const msg = JSON.parse(event.data);\n  console.log(msg.type, msg.payload);\n};\n
"},{"location":"api/websocket/#nachrichtenformat","title":"Nachrichtenformat","text":"

Die meisten Broadcasts haben dieses Schema:

{\n  \"type\": \"EVENT_TYPE\",\n  \"payload\": {},\n  \"timestamp\": \"2026-03-10T09:00:00.000Z\"\n}\n

Ausnahme: WS_CONNECTED beim Verbindungsaufbau enth\u00e4lt kein timestamp.

"},{"location":"api/websocket/#event-typen","title":"Event-Typen","text":""},{"location":"api/websocket/#ws_connected","title":"WS_CONNECTED","text":"

Sofort nach erfolgreicher Verbindung.

{\n  \"type\": \"WS_CONNECTED\",\n  \"payload\": {\n    \"connectedAt\": \"2026-03-10T09:00:00.000Z\"\n  }\n}\n
"},{"location":"api/websocket/#pipeline_state_changed","title":"PIPELINE_STATE_CHANGED","text":"

Neuer Pipeline-Snapshot.

{\n  \"type\": \"PIPELINE_STATE_CHANGED\",\n  \"payload\": {\n    \"state\": \"ENCODING\",\n    \"activeJobId\": 42,\n    \"progress\": 62.5,\n    \"eta\": \"00:12:34\",\n    \"statusText\": \"ENCODING 62.50%\",\n    \"context\": {},\n    \"jobProgress\": {\n      \"42\": {\n        \"state\": \"ENCODING\",\n        \"progress\": 62.5,\n        \"eta\": \"00:12:34\",\n        \"statusText\": \"ENCODING 62.50%\"\n      }\n    },\n    \"queue\": {\n      \"maxParallelJobs\": 1,\n      \"runningCount\": 1,\n      \"queuedCount\": 2,\n      \"runningJobs\": [],\n      \"queuedJobs\": []\n    }\n  }\n}\n
"},{"location":"api/websocket/#pipeline_progress","title":"PIPELINE_PROGRESS","text":"

Laufende Fortschrittsupdates.

{\n  \"type\": \"PIPELINE_PROGRESS\",\n  \"payload\": {\n    \"state\": \"ENCODING\",\n    \"activeJobId\": 42,\n    \"progress\": 62.5,\n    \"eta\": \"00:12:34\",\n    \"statusText\": \"ENCODING 62.50%\"\n  }\n}\n
"},{"location":"api/websocket/#pipeline_queue_changed","title":"PIPELINE_QUEUE_CHANGED","text":"

Queue-Snapshot aktualisiert.

"},{"location":"api/websocket/#disc_detected-disc_removed","title":"DISC_DETECTED / DISC_REMOVED","text":"

Disc-Insertion/-Removal.

{\n  \"type\": \"DISC_DETECTED\",\n  \"payload\": {\n    \"device\": {\n      \"path\": \"/dev/sr0\",\n      \"discLabel\": \"INCEPTION\",\n      \"model\": \"ASUS BW-16D1HT\",\n      \"fstype\": \"udf\",\n      \"mountpoint\": null,\n      \"mediaProfile\": \"bluray\"\n    }\n  }\n}\n

mediaProfile: bluray | dvd | other | null

"},{"location":"api/websocket/#hardware_monitor_update","title":"HARDWARE_MONITOR_UPDATE","text":"

Snapshot aus Hardware-Monitoring.

{\n  \"type\": \"HARDWARE_MONITOR_UPDATE\",\n  \"payload\": {\n    \"enabled\": true,\n    \"intervalMs\": 5000,\n    \"updatedAt\": \"2026-03-10T09:00:00.000Z\",\n    \"sample\": {\n      \"cpu\": {},\n      \"memory\": {},\n      \"gpu\": {},\n      \"storage\": {}\n    },\n    \"error\": null\n  }\n}\n
"},{"location":"api/websocket/#pipeline_error","title":"PIPELINE_ERROR","text":"

Fehler bei Disc-Event-Verarbeitung in Pipeline.

"},{"location":"api/websocket/#disk_detection_error","title":"DISK_DETECTION_ERROR","text":"

Fehler in Laufwerkserkennung.

"},{"location":"api/websocket/#settings_updated","title":"SETTINGS_UPDATED","text":"

Einzelnes Setting wurde gespeichert.

"},{"location":"api/websocket/#settings_bulk_updated","title":"SETTINGS_BULK_UPDATED","text":"

Bulk-Settings gespeichert.

{\n  \"type\": \"SETTINGS_BULK_UPDATED\",\n  \"payload\": {\n    \"count\": 3,\n    \"keys\": [\"raw_dir\", \"movie_dir\", \"handbrake_preset_bluray\"]\n  }\n}\n
"},{"location":"api/websocket/#settings_scripts_updated","title":"SETTINGS_SCRIPTS_UPDATED","text":"

Skript ge\u00e4ndert (created|updated|deleted|reordered).

"},{"location":"api/websocket/#settings_script_chains_updated","title":"SETTINGS_SCRIPT_CHAINS_UPDATED","text":"

Skript-Kette ge\u00e4ndert (created|updated|deleted|reordered).

"},{"location":"api/websocket/#user_presets_updated","title":"USER_PRESETS_UPDATED","text":"

User-Preset ge\u00e4ndert (created|updated|deleted).

"},{"location":"api/websocket/#cron_jobs_updated","title":"CRON_JOBS_UPDATED","text":"

Cron-Config ge\u00e4ndert (created|updated|deleted).

"},{"location":"api/websocket/#cron_job_updated","title":"CRON_JOB_UPDATED","text":"

Laufzeitstatus eines Cron-Jobs ge\u00e4ndert.

{\n  \"type\": \"CRON_JOB_UPDATED\",\n  \"payload\": {\n    \"id\": 1,\n    \"lastRunStatus\": \"running\",\n    \"lastRunAt\": \"2026-03-10T10:00:00.000Z\",\n    \"nextRunAt\": null\n  }\n}\n
"},{"location":"api/websocket/#reconnect-verhalten","title":"Reconnect-Verhalten","text":"

useWebSocket verbindet bei Abbruch automatisch neu:

  • Retry-Intervall: 1500ms
  • Wiederverbindung bis Komponente unmounted wird
"},{"location":"architecture/","title":"Architektur","text":"

Ripster ist eine Client-Server-Anwendung mit REST + WebSocket.

"},{"location":"architecture/#systemuberblick","title":"System\u00fcberblick","text":"
graph TB\n    subgraph Browser[\"Browser (React)\"]\n        Dashboard[Dashboard]\n        Settings[Einstellungen]\n        History[Historie]\n    end\n\n    subgraph Backend[\"Node.js Backend\"]\n        API[REST API\\nExpress]\n        WS[WebSocket\\n/ws]\n        Pipeline[pipelineService]\n        Cron[cronService]\n        DB[(SQLite)]\n    end\n\n    subgraph Tools[\"Externe Tools\"]\n        MakeMKV[makemkvcon]\n        HandBrake[HandBrakeCLI]\n        MediaInfo[mediainfo]\n    end\n\n    Browser <-->|HTTP| API\n    Browser <-->|WebSocket| WS\n    Pipeline --> MakeMKV\n    Pipeline --> HandBrake\n    Pipeline --> MediaInfo\n    API --> DB\n    Pipeline --> DB\n    Cron --> DB
"},{"location":"architecture/#schichten","title":"Schichten","text":""},{"location":"architecture/#backend","title":"Backend","text":"
  • src/index.js (Bootstrapping, Routes, WS, Services)
  • src/routes/* (Pipeline, Settings, History, Crons)
  • src/services/* (Business-Logik)
  • src/db/database.js (Init/Migration)
  • src/utils/* (Parser, Dateifunktionen, Validierung)
"},{"location":"architecture/#frontend","title":"Frontend","text":"
  • App.jsx + pages/* (Dashboard, Settings, History)
  • components/* (Status-/Review-/Dialog-Komponenten)
  • api/client.js (REST-Client)
  • hooks/useWebSocket.js (WS-Reconnect)
"},{"location":"architecture/#weiterfuhrend","title":"Weiterf\u00fchrend","text":"
  • \u00dcbersicht
  • Backend-Services
  • Frontend-Komponenten
  • Datenbank
"},{"location":"architecture/backend/","title":"Backend-Services","text":"

Das Backend ist in Services aufgeteilt, die von Express-Routen orchestriert werden.

"},{"location":"architecture/backend/#pipelineservicejs","title":"pipelineService.js","text":"

Zentrale Workflow-Orchestrierung.

Aufgaben:

  • Pipeline-State-Machine + Persistenz (pipeline_state)
  • Disc-Analyse/Rip/Review/Encode
  • Queue-Management (Jobs + script|chain|wait Eintr\u00e4ge)
  • Retry/Re-Encode/Restart-Flows
  • WebSocket-Broadcasts f\u00fcr State/Progress/Queue

Wichtige Methoden:

  • analyzeDisc()
  • selectMetadata()
  • startPreparedJob()
  • confirmEncodeReview()
  • cancel()
  • retry()
  • reencodeFromRaw()
  • restartReviewFromRaw()
  • restartEncodeWithLastSettings()
  • resumeReadyToEncodeJob()
  • enqueueNonJobEntry(), reorderQueue(), removeQueueEntry()
"},{"location":"architecture/backend/#diskdetectionservicejs","title":"diskDetectionService.js","text":"

Pollt Laufwerk(e) und emittiert:

  • discInserted
  • discRemoved
  • error

Zusatz:

  • Modus auto oder explicit
  • heuristische mediaProfile-Erkennung (bluray/dvd/other)
  • rescanAndEmit() f\u00fcr manuellen Trigger
"},{"location":"architecture/backend/#settingsservicejs","title":"settingsService.js","text":"

Settings-Layer mit Validation/Serialisierung.

Features:

  • getCategorizedSettings() f\u00fcr UI-Form
  • setSettingValue() / setSettingsBulk()
  • profilspezifische Aufl\u00f6sung (resolveEffectiveToolSettings)
  • CLI-Config-Building f\u00fcr MakeMKV/HandBrake/MediaInfo
  • HandBrake-Preset-Liste via HandBrakeCLI -z
  • MakeMKV-Registration-Command aus makemkv_registration_key
"},{"location":"architecture/backend/#historyservicejs","title":"historyService.js","text":"

Historie + Dateioperationen.

Features:

  • Job-Liste/Detail inkl. Log-Tail
  • Orphan-RAW-Erkennung und Import
  • OMDb-Nachzuweisung
  • Dateil\u00f6schung (raw|movie|both)
  • Job-L\u00f6schung (none|raw|movie|both)
"},{"location":"architecture/backend/#cronservicejs","title":"cronService.js","text":"

Integriertes Cron-System ohne externe Parser-Library.

Features:

  • 5-Feld-Cron-Parser + nextRun-Berechnung
  • Quellen: script oder chain
  • Laufzeitlogs (cron_run_logs)
  • manuelles Triggern
  • WebSocket-Events: CRON_JOBS_UPDATED, CRON_JOB_UPDATED
"},{"location":"architecture/backend/#weitere-services","title":"Weitere Services","text":"
  • scriptService.js (CRUD + Test + Wrapper-Ausf\u00fchrung)
  • scriptChainService.js (CRUD + Step-Execution)
  • userPresetService.js (HandBrake User-Presets)
  • hardwareMonitorService.js (CPU/RAM/GPU/Storage)
  • websocketService.js (Client-Registry + Broadcast)
  • notificationService.js (PushOver)
  • logger.js (rotierende Datei-Logs)
"},{"location":"architecture/backend/#bootstrapping-srcindexjs","title":"Bootstrapping (src/index.js)","text":"

Beim Start:

  1. DB init/migrate
  2. Pipeline-Init
  3. Cron-Init
  4. Express-Routes + Error-Handler
  5. WebSocket-Server auf /ws
  6. Hardware-Monitoring-Init
  7. Disk-Detection-Start
"},{"location":"architecture/database/","title":"Datenbank","text":"

Ripster verwendet SQLite (backend/data/ripster.db).

"},{"location":"architecture/database/#tabellen","title":"Tabellen","text":"
settings_schema\nsettings_values\njobs\npipeline_state\nscripts\nscript_chains\nscript_chain_steps\nuser_presets\ncron_jobs\ncron_run_logs\n
"},{"location":"architecture/database/#jobs","title":"jobs","text":"

Speichert Pipeline-Lifecycle und Artefakte pro Job.

Zentrale Felder:

  • Metadaten: title, year, imdb_id, poster_url, omdb_json, selected_from_omdb
  • Laufzeit: start_time, end_time, status, last_state
  • Pfade: raw_path, output_path, encode_input_path
  • Tool-Ausgaben: makemkv_info_json, handbrake_info_json, mediainfo_info_json, encode_plan_json
  • Kontrolle: encode_review_confirmed, rip_successful, error_message
  • Audit: created_at, updated_at
"},{"location":"architecture/database/#pipeline_state","title":"pipeline_state","text":"

Singleton-Tabelle (id = 1) f\u00fcr aktiven Snapshot:

  • state
  • active_job_id
  • progress
  • eta
  • status_text
  • context_json
  • updated_at
"},{"location":"architecture/database/#settings_schema-settings_values","title":"settings_schema + settings_values","text":"
  • settings_schema: Definition (Typ, Default, Validation, Reihenfolge)
  • settings_values: aktueller Wert pro Key
"},{"location":"architecture/database/#scripts-script_chains-script_chain_steps","title":"scripts, script_chains, script_chain_steps","text":"
  • scripts: Shell-Skripte (name, script_body, order_index)
  • script_chains: Ketten (name, order_index)
  • script_chain_steps: Schritte je Kette
  • step_type: script oder wait
  • script_id oder wait_seconds
"},{"location":"architecture/database/#user_presets","title":"user_presets","text":"

Benannte HandBrake-Preset-Sets:

  • name
  • media_type (bluray|dvd|other|all)
  • handbrake_preset
  • extra_args
  • description
"},{"location":"architecture/database/#cron_jobs-cron_run_logs","title":"cron_jobs + cron_run_logs","text":"
  • cron_jobs: Zeitplan + Status
  • cron_run_logs: einzelne L\u00e4ufe
  • status: running|success|error
  • output
  • error_message
"},{"location":"architecture/database/#migrationrecovery","title":"Migration/Recovery","text":"

Beim Start werden Schema und Settings-Metadaten automatisch abgeglichen.

Bei korruptem SQLite-File:

  1. Datei wird nach backend/data/corrupt-backups/ verschoben
  2. neue DB wird initialisiert
  3. Schema wird neu aufgebaut
"},{"location":"architecture/database/#direkte-inspektion","title":"Direkte Inspektion","text":"
sqlite3 backend/data/ripster.db\n\n.mode table\nSELECT id, status, title, created_at FROM jobs ORDER BY created_at DESC;\nSELECT key, value FROM settings_values ORDER BY key;\n
"},{"location":"architecture/frontend/","title":"Frontend-Komponenten","text":"

Frontend: React + PrimeReact + Vite.

"},{"location":"architecture/frontend/#hauptseiten","title":"Hauptseiten","text":""},{"location":"architecture/frontend/#dashboardpagejsx","title":"DashboardPage.jsx","text":"

Pipeline-Steuerung:

  • Status/Progress/ETA
  • Metadaten-Dialog
  • Playlist-Entscheidung
  • Review-Panel
  • Queue-Interaktion (reorder/add/remove)
  • Job-Aktionen (Start/Cancel/Retry/Re-Encode)
  • Hardware-Monitoring-Anzeige
"},{"location":"architecture/frontend/#settingspagejsx","title":"SettingsPage.jsx","text":"

Konfiguration:

  • dynamisches Settings-Formular (DynamicSettingsForm)
  • Skripte/Ketten inkl. Reorder/Test
  • User-Presets
  • Cron-Jobs (CronJobsTab)
"},{"location":"architecture/frontend/#historypagejsx","title":"HistoryPage.jsx","text":"

Historie:

  • Job-Liste/Filter
  • Job-Details + Logs
  • OMDb-Nachzuweisung
  • Re-Encode/Restart-Workflows
"},{"location":"architecture/frontend/#wichtige-komponenten","title":"Wichtige Komponenten","text":"
  • PipelineStatusCard.jsx
  • MetadataSelectionDialog.jsx
  • MediaInfoReviewPanel.jsx
  • JobDetailDialog.jsx
  • CronJobsTab.jsx
"},{"location":"architecture/frontend/#api-client-apiclientjs","title":"API-Client (api/client.js)","text":"
  • zentraler request() mit JSON-Handling
  • Fehlerobjekt aus API wird auf Error(message) gemappt
  • VITE_API_BASE default /api
"},{"location":"architecture/frontend/#websocket-hooksusewebsocketjs","title":"WebSocket (hooks/useWebSocket.js)","text":"
  • URL: VITE_WS_URL oder automatisch ws(s)://<host>/ws
  • Auto-Reconnect mit 1500ms Intervall

In App.jsx werden u. a. verarbeitet:

  • PIPELINE_STATE_CHANGED
  • PIPELINE_PROGRESS
  • PIPELINE_QUEUE_CHANGED
  • DISC_DETECTED / DISC_REMOVED
  • HARDWARE_MONITOR_UPDATE
"},{"location":"architecture/frontend/#buildrun","title":"Build/Run","text":"
# dev\nnpm run dev --prefix frontend\n\n# prod build\nnpm run build --prefix frontend\n
"},{"location":"architecture/overview/","title":"Architektur-\u00dcbersicht","text":""},{"location":"architecture/overview/#kernprinzipien","title":"Kernprinzipien","text":""},{"location":"architecture/overview/#event-getriebene-pipeline","title":"Event-getriebene Pipeline","text":"

pipelineService h\u00e4lt einen Snapshot der State-Machine und broadcastet \u00c4nderungen sofort via WebSocket.

State-\u00c4nderung -> PIPELINE_STATE_CHANGED/PIPELINE_PROGRESS -> Frontend-Update\n
"},{"location":"architecture/overview/#service-layer","title":"Service-Layer","text":"
Route -> Service -> DB/Tool-Execution\n

Routes enthalten kaum Business-Logik.

"},{"location":"architecture/overview/#schema-getriebene-settings","title":"Schema-getriebene Settings","text":"

Settings sind DB-schema-getrieben (settings_schema + settings_values), UI rendert dynamisch aus diesen Daten.

"},{"location":"architecture/overview/#echtzeit-kommunikation","title":"Echtzeit-Kommunikation","text":"

WebSocket l\u00e4uft auf /ws.

Wichtige Events:

  • PIPELINE_STATE_CHANGED, PIPELINE_PROGRESS, PIPELINE_QUEUE_CHANGED
  • DISC_DETECTED, DISC_REMOVED
  • HARDWARE_MONITOR_UPDATE
  • SETTINGS_UPDATED, SETTINGS_BULK_UPDATED
  • SETTINGS_SCRIPTS_UPDATED, SETTINGS_SCRIPT_CHAINS_UPDATED, USER_PRESETS_UPDATED
  • CRON_JOBS_UPDATED, CRON_JOB_UPDATED
  • PIPELINE_ERROR, DISK_DETECTION_ERROR
"},{"location":"architecture/overview/#prozessausfuhrung","title":"Prozessausf\u00fchrung","text":"

Externe Tools werden als Child-Processes gestartet (processRunner):

  • Streaming von stdout/stderr
  • Progress-Parsing (progressParsers.js)
  • kontrollierter Abbruch (SIGINT/SIGKILL-Fallback)
"},{"location":"architecture/overview/#persistenz","title":"Persistenz","text":"

SQLite-Datei: backend/data/ripster.db

Kern-Tabellen:

  • jobs, pipeline_state
  • settings_schema, settings_values
  • scripts, script_chains, script_chain_steps
  • user_presets
  • cron_jobs, cron_run_logs

Beim Start werden Schema und Settings-Migrationen automatisch ausgef\u00fchrt.

"},{"location":"architecture/overview/#fehlerbehandlung","title":"Fehlerbehandlung","text":"

Zentrales Error-Handling liefert:

{\n  \"error\": {\n    \"message\": \"...\",\n    \"statusCode\": 400,\n    \"reqId\": \"...\",\n    \"details\": []\n  }\n}\n

Fehlgeschlagene Jobs bleiben in der Historie (ERROR oder CANCELLED) und k\u00f6nnen erneut gestartet werden.

"},{"location":"architecture/overview/#cors-runtime-konfig","title":"CORS & Runtime-Konfig","text":"
  • CORS_ORIGIN default: *
  • LOG_LEVEL default: info
  • DB-/Log-Pfade \u00fcber DB_PATH/LOG_DIR konfigurierbar
"},{"location":"configuration/","title":"Konfiguration","text":"
  • Einstellungsreferenz

    Alle verf\u00fcgbaren Einstellungen mit Typen, Standardwerten und Beschreibungen.

    Einstellungsreferenz

  • Umgebungsvariablen

    Umgebungsvariablen f\u00fcr Backend und Frontend.

    Umgebungsvariablen

"},{"location":"configuration/environment/","title":"Umgebungsvariablen","text":"

Umgebungsvariablen steuern Backend/Vite au\u00dferhalb der DB-basierten UI-Settings.

"},{"location":"configuration/environment/#backend-backendenv","title":"Backend (backend/.env)","text":"Variable Default (Code) Beschreibung PORT 3001 Express-Port DB_PATH backend/data/ripster.db SQLite-Datei (relativ zu backend/) LOG_DIR backend/logs Fallback-Logverzeichnis (wenn log_dir-Setting nicht gesetzt/lesbar) CORS_ORIGIN * CORS-Origin f\u00fcr API LOG_LEVEL info debug, info, warn, error

Beispiel:

PORT=3001\nDB_PATH=/var/lib/ripster/ripster.db\nLOG_DIR=/var/log/ripster\nCORS_ORIGIN=http://192.168.1.50:5173\nLOG_LEVEL=info\n

Hinweis: backend/.env.example enth\u00e4lt bewusst dev-freundliche Werte (z. B. lokaler CORS_ORIGIN).

"},{"location":"configuration/environment/#frontend-frontendenv","title":"Frontend (frontend/.env)","text":"Variable Default Beschreibung VITE_API_BASE /api API-Basis f\u00fcr Fetch-Client VITE_WS_URL automatisch aus window.location + /ws Optional explizite WebSocket-URL VITE_PUBLIC_ORIGIN leer \u00d6ffentliche Vite-Origin (Remote-Dev) VITE_ALLOWED_HOSTS true Komma-separierte Hostliste f\u00fcr Vite allowedHosts VITE_HMR_PROTOCOL abgeleitet aus VITE_PUBLIC_ORIGIN HMR-Protokoll (ws/wss) VITE_HMR_HOST abgeleitet aus VITE_PUBLIC_ORIGIN HMR-Host VITE_HMR_CLIENT_PORT abgeleitet aus VITE_PUBLIC_ORIGIN HMR-Client-Port

Beispiele:

# lokal (mit Vite-Proxy)\nVITE_API_BASE=/api\n
# remote dev\nVITE_API_BASE=http://192.168.1.50:3001/api\nVITE_WS_URL=ws://192.168.1.50:3001/ws\nVITE_PUBLIC_ORIGIN=http://192.168.1.50:5173\nVITE_ALLOWED_HOSTS=192.168.1.50,ripster.local\nVITE_HMR_PROTOCOL=ws\nVITE_HMR_HOST=192.168.1.50\nVITE_HMR_CLIENT_PORT=5173\n
"},{"location":"configuration/environment/#prioritat","title":"Priorit\u00e4t","text":"
  1. Prozess-Umgebungsvariablen
  2. .env
  3. Code-Defaults
"},{"location":"configuration/settings-reference/","title":"Einstellungsreferenz","text":"

Alle Settings liegen in settings_schema/settings_values und werden \u00fcber die UI verwaltet.

"},{"location":"configuration/settings-reference/#profil-system","title":"Profil-System","text":"

Ripster arbeitet mit Media-Profilen:

  • bluray
  • dvd
  • other

Viele Tool-/Pfad-Settings existieren als Profil-Varianten (*_bluray, *_dvd, *_other).

Wichtig:

  • F\u00fcr raw_dir, movie_dir und die zugeh\u00f6rigen *_owner-Keys gibt es kein Cross-Profil-Fallback.
  • F\u00fcr viele Tool-Keys werden profilspezifische Varianten bevorzugt.
"},{"location":"configuration/settings-reference/#template-platzhalter","title":"Template-Platzhalter","text":"

Datei-/Ordner-Templates unterst\u00fctzen:

  • ${title}
  • ${year}
  • ${imdbId}

Nicht gesetzte Werte werden zu unknown.

"},{"location":"configuration/settings-reference/#kategorie-pfade","title":"Kategorie: Pfade","text":"Key Typ Default raw_dir path data/output/raw raw_dir_bluray path null raw_dir_dvd path null raw_dir_other path null raw_dir_bluray_owner string null raw_dir_dvd_owner string null raw_dir_other_owner string null movie_dir path data/output/movies movie_dir_bluray path null movie_dir_dvd path null movie_dir_other path null movie_dir_bluray_owner string null movie_dir_dvd_owner string null movie_dir_other_owner string null log_dir path data/logs"},{"location":"configuration/settings-reference/#kategorie-laufwerk","title":"Kategorie: Laufwerk","text":"Key Typ Default Hinweis drive_mode select auto auto oder explicit drive_device path /dev/sr0 bei explicit relevant makemkv_source_index number 0 MakeMKV Source-Index disc_poll_interval_ms number 4000 1000..60000"},{"location":"configuration/settings-reference/#kategorie-monitoring","title":"Kategorie: Monitoring","text":"Key Typ Default hardware_monitoring_enabled boolean true hardware_monitoring_interval_ms number 5000"},{"location":"configuration/settings-reference/#kategorie-tools-global","title":"Kategorie: Tools (global)","text":"Key Typ Default makemkv_command string makemkvcon makemkv_registration_key string null mediainfo_command string mediainfo makemkv_min_length_minutes number 60 handbrake_command string HandBrakeCLI handbrake_restart_delete_incomplete_output boolean true pipeline_max_parallel_jobs number 1"},{"location":"configuration/settings-reference/#blu-ray-spezifisch","title":"Blu-ray-spezifisch","text":"Key Typ Default mediainfo_extra_args_bluray string null makemkv_rip_mode_bluray select backup makemkv_analyze_extra_args_bluray string null makemkv_rip_extra_args_bluray string null handbrake_preset_bluray string H.264 MKV 1080p30 handbrake_extra_args_bluray string null output_extension_bluray select mkv filename_template_bluray string ${title} (${year}) output_folder_template_bluray string null"},{"location":"configuration/settings-reference/#dvd-spezifisch","title":"DVD-spezifisch","text":"Key Typ Default mediainfo_extra_args_dvd string null makemkv_rip_mode_dvd select mkv makemkv_analyze_extra_args_dvd string null makemkv_rip_extra_args_dvd string null handbrake_preset_dvd string H.264 MKV 480p30 handbrake_extra_args_dvd string null output_extension_dvd select mkv filename_template_dvd string ${title} (${year}) output_folder_template_dvd string null"},{"location":"configuration/settings-reference/#kategorie-metadaten","title":"Kategorie: Metadaten","text":"Key Typ Default omdb_api_key string null omdb_default_type select movie"},{"location":"configuration/settings-reference/#kategorie-benachrichtigungen-pushover","title":"Kategorie: Benachrichtigungen (PushOver)","text":"Key Typ Default pushover_enabled boolean false pushover_token string null pushover_user string null pushover_device string null pushover_title_prefix string Ripster pushover_priority number 0 pushover_timeout_ms number 7000 pushover_notify_metadata_ready boolean true pushover_notify_rip_started boolean true pushover_notify_encoding_started boolean true pushover_notify_job_finished boolean true pushover_notify_job_error boolean true pushover_notify_job_cancelled boolean true pushover_notify_reencode_started boolean true pushover_notify_reencode_finished boolean true"},{"location":"configuration/settings-reference/#entfernte-legacy-keys","title":"Entfernte Legacy-Keys","text":"

Diese Legacy-Keys werden bei Migration entfernt und sollten nicht mehr genutzt werden:

  • makemkv_backup_mode
  • mediainfo_extra_args
  • makemkv_rip_mode
  • makemkv_analyze_extra_args
  • makemkv_rip_extra_args
  • handbrake_preset
  • handbrake_extra_args
  • output_extension
  • filename_template
  • output_folder_template
  • pushover_notify_disc_detected
"},{"location":"deployment/","title":"Deployment","text":"
  • Entwicklungsumgebung

    Lokale Entwicklungsumgebung einrichten.

    Entwicklung

  • Produktion

    Ripster auf einem Server dauerhaft betreiben.

    Produktion

"},{"location":"deployment/development/","title":"Entwicklungsumgebung","text":""},{"location":"deployment/development/#voraussetzungen","title":"Voraussetzungen","text":"
  • Node.js >= 20.19.0
  • externe Tools installiert (makemkvcon, HandBrakeCLI, mediainfo)
"},{"location":"deployment/development/#schnellstart","title":"Schnellstart","text":"
./start.sh\n

Startet:

  • Backend (http://localhost:3001, mit nodemon)
  • Frontend (http://localhost:5173, mit Vite HMR)

Stoppen: Ctrl+C.

"},{"location":"deployment/development/#manuell","title":"Manuell","text":""},{"location":"deployment/development/#backend","title":"Backend","text":"
cd backend\nnpm install\nnpm run dev\n
"},{"location":"deployment/development/#frontend","title":"Frontend","text":"
cd frontend\nnpm install\nnpm run dev\n
"},{"location":"deployment/development/#vite-proxy-dev","title":"Vite-Proxy (Dev)","text":"

frontend/vite.config.js proxied standardm\u00e4\u00dfig:

  • /api -> http://127.0.0.1:3001
  • /ws -> ws://127.0.0.1:3001
"},{"location":"deployment/development/#remote-dev-optional","title":"Remote-Dev (optional)","text":"

Beispiel frontend/.env.local:

VITE_API_BASE=http://192.168.1.100:3001/api\nVITE_WS_URL=ws://192.168.1.100:3001/ws\nVITE_PUBLIC_ORIGIN=http://192.168.1.100:5173\nVITE_ALLOWED_HOSTS=192.168.1.100,ripster.local\nVITE_HMR_PROTOCOL=ws\nVITE_HMR_HOST=192.168.1.100\nVITE_HMR_CLIENT_PORT=5173\n
"},{"location":"deployment/development/#nutzliche-kommandos","title":"N\u00fctzliche Kommandos","text":"
# Root dev (backend + frontend)\nnpm run dev\n\n# einzeln\nnpm run dev:backend\nnpm run dev:frontend\n\n# Frontend Build\nnpm run build:frontend\n
"},{"location":"deployment/development/#deploy-script-optional","title":"Deploy-Script (optional)","text":"

deploy-ripster.sh synchronisiert den lokalen Stand auf einen Remote-Host per rsync/SSH und sch\u00fctzt backend/data.

"},{"location":"deployment/production/","title":"Produktions-Deployment","text":""},{"location":"deployment/production/#empfohlene-architektur","title":"Empfohlene Architektur","text":"
Client\n  -> nginx (Reverse Proxy + statisches Frontend)\n    -> Backend API/WebSocket (Node.js, Port 3001)\n

Wichtig: Das Backend serviert im aktuellen Stand keine frontend/dist-Dateien automatisch.

"},{"location":"deployment/production/#1-frontend-builden","title":"1) Frontend builden","text":"
cd frontend\nnpm install\nnpm run build\n

Artefakte liegen in frontend/dist/.

"},{"location":"deployment/production/#2-backend-als-systemd-service","title":"2) Backend als systemd-Service","text":"

Beispiel /etc/systemd/system/ripster-backend.service:

[Unit]\nDescription=Ripster Backend\nAfter=network.target\n\n[Service]\nType=simple\nUser=ripster\nWorkingDirectory=/opt/ripster/backend\nExecStart=/usr/bin/env node src/index.js\nRestart=on-failure\nRestartSec=5\nEnvironment=NODE_ENV=production\nEnvironment=PORT=3001\nEnvironment=LOG_LEVEL=info\n\n[Install]\nWantedBy=multi-user.target\n

Aktivieren:

sudo systemctl daemon-reload\nsudo systemctl enable --now ripster-backend\nsudo systemctl status ripster-backend\n
"},{"location":"deployment/production/#3-nginx-konfigurieren","title":"3) nginx konfigurieren","text":"

Beispiel /etc/nginx/sites-available/ripster:

server {\n    listen 80;\n    server_name ripster.local;\n\n    root /opt/ripster/frontend/dist;\n    index index.html;\n\n    location / {\n        try_files $uri $uri/ /index.html;\n    }\n\n    location /api/ {\n        proxy_pass http://127.0.0.1:3001;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n\n    location /ws {\n        proxy_pass http://127.0.0.1:3001;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $host;\n    }\n}\n

Aktivieren:

sudo ln -s /etc/nginx/sites-available/ripster /etc/nginx/sites-enabled/\nsudo nginx -t\nsudo systemctl reload nginx\n
"},{"location":"deployment/production/#datenbank-backup","title":"Datenbank-Backup","text":"
sqlite3 /opt/ripster/backend/data/ripster.db \\\n  \".backup '/var/backups/ripster-$(date +%Y%m%d).db'\"\n
"},{"location":"deployment/production/#sicherheit","title":"Sicherheit","text":"
  • Ripster hat keine eingebaute Authentifizierung.
  • F\u00fcr externen Zugriff mindestens Basic Auth + TLS + Netzwerksegmentierung/VPN einsetzen.
  • Secrets nicht ins Repo committen (.env, Settings-Felder).
"},{"location":"getting-started/","title":"Erste Schritte","text":"

Dieser Abschnitt f\u00fchrt dich durch die Installation und Einrichtung von Ripster.

"},{"location":"getting-started/#uberblick","title":"\u00dcberblick","text":"
  • :material-list-check: Voraussetzungen

    Systemanforderungen und externe Tools, die vor der Installation ben\u00f6tigt werden.

    Voraussetzungen pr\u00fcfen

  • Installation

    Schritt-f\u00fcr-Schritt-Anleitung zur Installation von Ripster.

    Installation starten

  • Konfiguration

    Einrichten von Pfaden, API-Keys und Encoding-Presets.

    Konfigurieren

  • Schnellstart

    Rippe deinen ersten Film in wenigen Minuten.

    Loslegen

"},{"location":"getting-started/configuration/","title":"Konfiguration","text":"

Die Hauptkonfiguration erfolgt \u00fcber die UI (Settings) und wird in SQLite gespeichert.

"},{"location":"getting-started/configuration/#pflichteinstellungen-vor-dem-ersten-rip","title":"Pflichteinstellungen vor dem ersten Rip","text":""},{"location":"getting-started/configuration/#1-pfade","title":"1) Pfade","text":"Einstellung Beschreibung Beispiel raw_dir Basisverzeichnis f\u00fcr RAW-Rips /mnt/ripster/raw movie_dir Basisverzeichnis f\u00fcr finale Encodes /mnt/ripster/movies log_dir Verzeichnis f\u00fcr Prozess-/Backend-Logs /mnt/ripster/logs

Optional profilspezifisch:

  • raw_dir_bluray, raw_dir_dvd, raw_dir_other
  • movie_dir_bluray, movie_dir_dvd, movie_dir_other
"},{"location":"getting-started/configuration/#2-tools","title":"2) Tools","text":"Einstellung Standard makemkv_command makemkvcon handbrake_command HandBrakeCLI mediainfo_command mediainfo"},{"location":"getting-started/configuration/#3-omdb","title":"3) OMDb","text":"Einstellung Beschreibung omdb_api_key API-Key von omdbapi.com omdb_default_type movie, series, episode"},{"location":"getting-started/configuration/#encode-konfiguration-wichtig","title":"Encode-Konfiguration (wichtig)","text":"

Ripster arbeitet profilspezifisch, typischerweise \u00fcber:

  • Blu-ray: handbrake_preset_bluray, handbrake_extra_args_bluray, output_extension_bluray, filename_template_bluray
  • DVD: handbrake_preset_dvd, handbrake_extra_args_dvd, output_extension_dvd, filename_template_dvd
"},{"location":"getting-started/configuration/#template-platzhalter","title":"Template-Platzhalter","text":"

Verf\u00fcgbar in filename_template_* und output_folder_template_*:

  • ${title}
  • ${year}
  • ${imdbId}

Beispiel:

${title} (${year})\n-> Inception (2010).mkv\n
"},{"location":"getting-started/configuration/#makemkv-spezifisch","title":"MakeMKV-spezifisch","text":"Einstellung Standard Hinweis makemkv_min_length_minutes 60 Kandidaten-Filter makemkv_rip_mode_bluray backup mkv oder backup makemkv_rip_mode_dvd mkv mkv oder backup makemkv_registration_key leer optional, wird via makemkvcon reg gesetzt"},{"location":"getting-started/configuration/#monitoring-queue","title":"Monitoring & Queue","text":"Einstellung Standard hardware_monitoring_enabled true hardware_monitoring_interval_ms 5000 pipeline_max_parallel_jobs 1"},{"location":"getting-started/configuration/#pushover-optional","title":"PushOver (optional)","text":"

Basis:

  • pushover_enabled
  • pushover_token
  • pushover_user

Zus\u00e4tzlich pro Event ein/aus (z. B. pushover_notify_job_finished).

"},{"location":"getting-started/configuration/#verwandte-doku","title":"Verwandte Doku","text":"
  • Einstellungsreferenz
  • Umgebungsvariablen
"},{"location":"getting-started/installation/","title":"Installation","text":""},{"location":"getting-started/installation/#repository-klonen","title":"Repository klonen","text":"
git clone https://github.com/YOUR_GITHUB_USERNAME/ripster.git\ncd ripster\n
"},{"location":"getting-started/installation/#dev-start-empfohlen","title":"Dev-Start (empfohlen)","text":"
./start.sh\n

start.sh:

  1. pr\u00fcft Node-Version (>= 20.19.0)
  2. installiert Dependencies (Root/Backend/Frontend)
  3. startet Backend + Frontend parallel

Danach:

  • Backend: http://localhost:3001
  • Frontend: http://localhost:5173

Stoppen: mit Ctrl+C im laufenden Terminal.

"},{"location":"getting-started/installation/#manuell-starten","title":"Manuell starten","text":"
npm install\nnpm --prefix backend install\nnpm --prefix frontend install\nnpm run dev\n

Oder getrennt:

npm run dev:backend\nnpm run dev:frontend\n
"},{"location":"getting-started/installation/#optional-env-dateien-anlegen","title":"Optional: .env-Dateien anlegen","text":""},{"location":"getting-started/installation/#backend","title":"Backend","text":"
cp backend/.env.example backend/.env\n

Beispiel:

PORT=3001\nDB_PATH=./data/ripster.db\nLOG_DIR=./logs\nCORS_ORIGIN=http://localhost:5173\nLOG_LEVEL=info\n
"},{"location":"getting-started/installation/#frontend","title":"Frontend","text":"
cp frontend/.env.example frontend/.env\n

Beispiel:

VITE_API_BASE=/api\n# optional:\n# VITE_WS_URL=ws://localhost:3001/ws\n
"},{"location":"getting-started/installation/#datenbank","title":"Datenbank","text":"

SQLite wird automatisch beim Backend-Start initialisiert:

backend/data/ripster.db\n

Schema-Quelle: db/schema.sql

"},{"location":"getting-started/installation/#nachste-schritte","title":"N\u00e4chste Schritte","text":"
  1. Browser \u00f6ffnen: http://localhost:5173
  2. In Settings Pfade/Tools/API-Keys pr\u00fcfen
  3. Erste Disc einlegen und Workflow starten
"},{"location":"getting-started/prerequisites/","title":"Voraussetzungen","text":"

Bevor du Ripster installierst, stelle sicher, dass folgende Software auf deinem System verf\u00fcgbar ist.

"},{"location":"getting-started/prerequisites/#system-anforderungen","title":"System-Anforderungen","text":"Anforderung Mindestversion Empfohlen Betriebssystem Linux / macOS Ubuntu 22.04+ Node.js 20.19.0 20.x LTS RAM 4 GB 8 GB+ Festplatte 50 GB frei 500 GB+ (f\u00fcr Roh-MKVs)"},{"location":"getting-started/prerequisites/#nodejs","title":"Node.js","text":"

Ripster ben\u00f6tigt Node.js >= 20.19.0.

nvm (empfohlen)Ubuntu/DebianmacOS (Homebrew)
# nvm installieren\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash\n\n# Node.js 20 installieren\nnvm install 20\nnvm use 20\n\n# Version pr\u00fcfen\nnode --version  # v20.x.x\n
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -\nsudo apt-get install -y nodejs\n\nnode --version  # v20.x.x\n
brew install node@20\nnode --version  # v20.x.x\n
"},{"location":"getting-started/prerequisites/#externe-tools","title":"Externe Tools","text":""},{"location":"getting-started/prerequisites/#makemkv","title":"MakeMKV","text":"

Lizenz erforderlich

MakeMKV ist f\u00fcr den pers\u00f6nlichen Gebrauch kostenlos (Beta-Lizenz), ben\u00f6tigt aber eine g\u00fcltige Lizenz.

# Ubuntu/Debian - PPA verwenden\nsudo add-apt-repository ppa:heyarje/makemkv-beta\nsudo apt-get update\nsudo apt-get install makemkv-bin makemkv-oss\n\n# Installierte Version pr\u00fcfen\nmakemkvcon --version\n

MakeMKV Download

"},{"location":"getting-started/prerequisites/#handbrake-cli","title":"HandBrake CLI","text":"
# Ubuntu/Debian\nsudo add-apt-repository ppa:stebbins/handbrake-releases\nsudo apt-get update\nsudo apt-get install handbrake-cli\n\n# Version pr\u00fcfen\nHandBrakeCLI --version\n\n# macOS\nbrew install handbrake\n

HandBrake Download

"},{"location":"getting-started/prerequisites/#mediainfo","title":"MediaInfo","text":"
# Ubuntu/Debian\nsudo apt-get install mediainfo\n\n# macOS\nbrew install mediainfo\n\n# Version pr\u00fcfen\nmediainfo --Version\n
"},{"location":"getting-started/prerequisites/#disc-laufwerk","title":"Disc-Laufwerk","text":"

Ripster ben\u00f6tigt ein physisches DVD- oder Blu-ray-Laufwerk.

LibDriveIO-Modus erforderlich

Das Laufwerk muss im LibDriveIO-Modus betrieben werden \u2013 MakeMKV greift direkt auf Rohdaten des Laufwerks zu. Ohne diesen Modus k\u00f6nnen verschl\u00fcsselte Blu-rays (insbesondere UHD) nicht gelesen werden.

Nicht alle Laufwerke unterst\u00fctzen den direkten Zugriff. Eine Anleitung zur Einrichtung und Liste kompatibler Laufwerke findet sich im MakeMKV-Forum.

# Laufwerk pr\u00fcfen\nls /dev/sr*\n# oder\nlsblk | grep rom\n\n# Laufwerk-Berechtigungen setzen (erforderlich f\u00fcr LibDriveIO)\nsudo chmod a+rw /dev/sr0\n

Blu-ray unter Linux

MakeMKV bringt mit LibDriveIO eine eigene Entschl\u00fcsselung mit \u2013 externe Bibliotheken wie libaacs sind in der Regel nicht erforderlich.

"},{"location":"getting-started/prerequisites/#omdb-api-key","title":"OMDb API-Key","text":"

Ripster verwendet die OMDb API f\u00fcr Filmmetadaten.

  1. Registriere dich kostenlos auf omdbapi.com
  2. Best\u00e4tige deine E-Mail-Adresse
  3. Notiere deinen API-Key \u2013 du gibst ihn sp\u00e4ter in den Einstellungen ein
"},{"location":"getting-started/prerequisites/#optionale-voraussetzungen","title":"Optionale Voraussetzungen","text":""},{"location":"getting-started/prerequisites/#pushover-benachrichtigungen","title":"PushOver (Benachrichtigungen)","text":"

F\u00fcr mobile Push-Benachrichtigungen bei Fertigstellung oder Fehlern:

  • App kaufen auf pushover.net (~5 USD einmalig)
  • User Key und API Token notieren
"},{"location":"getting-started/prerequisites/#ssh-zugang-deployment","title":"SSH-Zugang (Deployment)","text":"

F\u00fcr Remote-Deployment via deploy-ripster.sh:

# sshpass installieren\nsudo apt-get install sshpass\n
"},{"location":"getting-started/prerequisites/#checkliste","title":"Checkliste","text":"
  • [ ] Node.js >= 20.19.0 installiert (node --version)
  • [ ] makemkvcon installiert (makemkvcon --version)
  • [ ] HandBrakeCLI installiert (HandBrakeCLI --version)
  • [ ] mediainfo installiert (mediainfo --Version)
  • [ ] DVD/Blu-ray Laufwerk vorhanden (ls /dev/sr*)
  • [ ] OMDb API-Key beschafft
"},{"location":"getting-started/quickstart/","title":"Schnellstart \u2013 Erster kompletter Job","text":"

Diese Seite f\u00fchrt durch den typischen ersten Lauf.

"},{"location":"getting-started/quickstart/#1-starten","title":"1) Starten","text":"
cd ripster\n./start.sh\n

\u00d6ffne http://localhost:5173.

"},{"location":"getting-started/quickstart/#2-disc-einlegen","title":"2) Disc einlegen","text":"

Pipeline wechselt auf DISC_DETECTED.

Falls n\u00f6tig manuell neu scannen:

curl -X POST http://localhost:3001/api/pipeline/rescan-disc\n
"},{"location":"getting-started/quickstart/#3-analyse-starten","title":"3) Analyse starten","text":"

Klicke im Dashboard auf Analyse starten.

Intern:

  • Job wird angelegt
  • MakeMKV-Analyse l\u00e4uft (ANALYZING)
  • UI wechselt in Metadatenauswahl (METADATA_SELECTION)
"},{"location":"getting-started/quickstart/#4-metadaten-bestatigen","title":"4) Metadaten best\u00e4tigen","text":"

Im Dialog:

  • OMDb-Ergebnis w\u00e4hlen oder manuell eintragen
  • bei Playlist-Abfrage ggf. selectedPlaylist w\u00e4hlen

Nach Best\u00e4tigung startet Ripster automatisch weiter.

"},{"location":"getting-started/quickstart/#5-pipeline-pfade","title":"5) Pipeline-Pfade","text":"

Abh\u00e4ngig von Job/RAW-Situation:

  • kein RAW vorhanden -> RIPPING
  • RAW vorhanden -> MEDIAINFO_CHECK
  • mehrdeutige Playlist -> WAITING_FOR_USER_DECISION

Wenn Parallel-Limit erreicht ist, wird der Job in die Queue eingereiht.

"},{"location":"getting-started/quickstart/#6-review-ready_to_encode","title":"6) Review (READY_TO_ENCODE)","text":"

Im Review-Panel:

  • Titel ausw\u00e4hlen (falls mehrere)
  • Audio-/Subtitle-Tracks ausw\u00e4hlen
  • optional User-Preset anwenden
  • optional Pre-/Post-Skripte und Ketten hinzuf\u00fcgen

Mit Encoding starten wird confirm-encode + Start ausgel\u00f6st.

"},{"location":"getting-started/quickstart/#7-encoding-encoding","title":"7) Encoding (ENCODING)","text":"

W\u00e4hrend Encoding:

  • Live-Fortschritt/ETA \u00fcber WebSocket
  • Pre-Encode-Ausf\u00fchrungen laufen vor HandBrake
  • Post-Encode-Ausf\u00fchrungen laufen nach HandBrake

Wichtig:

  • Pre-Encode-Fehler -> Job endet in ERROR
  • Post-Encode-Fehler -> Job kann FINISHED bleiben, aber mit Fehlerhinweis im Status/Log
"},{"location":"getting-started/quickstart/#8-abschluss-finished","title":"8) Abschluss (FINISHED)","text":"

Ergebnis:

  • Ausgabe in movie_dir (ggf. profilspezifisch)
  • Job in Historie sichtbar
  • Logs im konfigurierten log_dir
"},{"location":"getting-started/quickstart/#nutzliche-api-shortcuts","title":"N\u00fctzliche API-Shortcuts","text":"
# Pipeline-Snapshot\ncurl http://localhost:3001/api/pipeline/state\n\n# Queue-Snapshot\ncurl http://localhost:3001/api/pipeline/queue\n\n# Jobs\ncurl http://localhost:3001/api/history\n
"},{"location":"pipeline/","title":"Pipeline","text":"

Der Pipeline-Bereich beschreibt den Kern-Workflow von Ripster.

  • Workflow & Zust\u00e4nde

    Zust\u00e4nde, \u00dcberg\u00e4nge und Queue-Verhalten.

    Workflow

  • Encode-Planung

    Wie Titel/Tracks f\u00fcr HandBrake vorbereitet und best\u00e4tigt werden.

    Encoding

  • Playlist-Analyse

    Bewertung mehrdeutiger Blu-ray-Playlists und manuelle Entscheidung.

    Playlist-Analyse

  • Encode-Skripte (Pre & Post)

    Skripte/Ketten vor und nach dem Encode ausf\u00fchren.

    Encode-Skripte

"},{"location":"pipeline/encoding/","title":"Encode-Planung & Track-Auswahl","text":"

Ripster erzeugt vor dem Encode einen encodePlan und l\u00e4sst ihn im Review-Panel best\u00e4tigen.

"},{"location":"pipeline/encoding/#ablauf","title":"Ablauf","text":"
Quelle bestimmen (Disc/RAW)\n  -> HandBrake-Scan (--scan --json)\n  -> Plan erstellen (Titel, Audio, Untertitel)\n  -> READY_TO_ENCODE\n  -> Benutzer best\u00e4tigt Auswahl\n  -> finaler HandBrake-Aufruf\n
"},{"location":"pipeline/encoding/#review-inhalt-ready_to_encode","title":"Review-Inhalt (READY_TO_ENCODE)","text":"
  • ausw\u00e4hlbarer Encode-Titel
  • Audio-Track-Selektion
  • Untertitel-Track-Selektion inkl. Flags
  • burnIn
  • forced
  • defaultTrack
  • optionale User-Presets (HandBrake-Preset + Extra-Args)
  • optionale Pre-/Post-Skripte und Ketten
"},{"location":"pipeline/encoding/#bestatigung-confirm-encode","title":"Best\u00e4tigung (confirm-encode)","text":"

Typischer Payload:

{\n  \"selectedEncodeTitleId\": 1,\n  \"selectedTrackSelection\": {\n    \"1\": {\n      \"audioTrackIds\": [1, 2],\n      \"subtitleTrackIds\": [3]\n    }\n  },\n  \"selectedPreEncodeScriptIds\": [1],\n  \"selectedPostEncodeScriptIds\": [2],\n  \"selectedPreEncodeChainIds\": [3],\n  \"selectedPostEncodeChainIds\": [4],\n  \"selectedUserPresetId\": 5\n}\n

Ripster speichert die best\u00e4tigte Auswahl in jobs.encode_plan_json und markiert encode_review_confirmed = 1.

"},{"location":"pipeline/encoding/#handbrake-aufruf","title":"HandBrake-Aufruf","text":"

Grundstruktur:

HandBrakeCLI \\\n  -i <input> \\\n  -o <output> \\\n  -t <titleId> \\\n  -Z \"<preset>\" \\\n  <extra-args> \\\n  -a <audioTrackIds|none> \\\n  -s <subtitleTrackIds|none>\n

Untertitel-Flags werden bei Bedarf erg\u00e4nzt:

  • --subtitle-burned=<id>
  • --subtitle-default=<id>
  • --subtitle-forced=<id> oder --subtitle-forced
"},{"location":"pipeline/encoding/#pre-post-encode-ausfuhrungen","title":"Pre-/Post-Encode-Ausf\u00fchrungen","text":"
  • Pre-Encode l\u00e4uft vor HandBrake
  • Post-Encode l\u00e4uft nach HandBrake

Verhalten bei Fehlern:

  • Pre-Encode-Fehler: Job wird als ERROR beendet (Encode startet nicht)
  • Post-Encode-Fehler: Job kann FINISHED bleiben, enth\u00e4lt aber Fehlerhinweis/Script-Summary
"},{"location":"pipeline/encoding/#dateinamenordner","title":"Dateinamen/Ordner","text":"

Der finale Outputpfad wird aus Settings-Templates aufgebaut.

Platzhalter:

  • ${title}
  • ${year}
  • ${imdbId}

Ung\u00fcltige Dateizeichen werden sanitisiert.

"},{"location":"pipeline/playlist-analysis/","title":"Playlist-Analyse","text":"

Ripster analysiert bei Blu-ray-\u00e4hnlichen Quellen Playlists und fordert bei Mehrdeutigkeit eine manuelle Auswahl an.

"},{"location":"pipeline/playlist-analysis/#ziel","title":"Ziel","text":"

Erkennen, welche Playlist wahrscheinlich der Hauptfilm ist, statt versehentlich eine Fake-/Dummy-Playlist zu verwenden.

"},{"location":"pipeline/playlist-analysis/#eingabedaten","title":"Eingabedaten","text":"

Die Analyse basiert auf MakeMKV-Infos (u. a. Playlist-/Segment-Struktur, Laufzeiten, Titelzuordnung).

"},{"location":"pipeline/playlist-analysis/#auswertung-vereinfacht","title":"Auswertung (vereinfacht)","text":"

F\u00fcr Kandidaten werden u. a. ber\u00fccksichtigt:

  • Laufzeit
  • Segment-Reihenfolge
  • R\u00fcckw\u00e4rtsspr\u00fcnge/gro\u00dfe Spr\u00fcnge
  • Koh\u00e4renz linearer Segmentfolgen
  • Duplikatgruppen mit \u00e4hnlicher Laufzeit

Daraus entstehen:

  • candidates
  • evaluatedCandidates (inkl. Score/Label)
  • recommendation
  • manualDecisionRequired
"},{"location":"pipeline/playlist-analysis/#wann-muss-der-benutzer-entscheiden","title":"Wann muss der Benutzer entscheiden?","text":"

Wenn nach Filterung mehr als ein relevanter Kandidat \u00fcbrig bleibt, setzt Ripster manualDecisionRequired = true und wechselt auf:

  • WAITING_FOR_USER_DECISION

Dann muss eine Playlist best\u00e4tigt werden, bevor der Workflow weiterl\u00e4uft.

"},{"location":"pipeline/playlist-analysis/#konfigurationseinfluss","title":"Konfigurationseinfluss","text":"Key Wirkung makemkv_min_length_minutes Mindestlaufzeit f\u00fcr Kandidaten

Default ist aktuell 60 Minuten.

"},{"location":"pipeline/playlist-analysis/#ui-verhalten","title":"UI-Verhalten","text":"

Bei manueller Entscheidung zeigt das Dashboard Kandidaten inkl. Score/Bewertung und markiert eine Empfehlung.

Nach Best\u00e4tigung:

  • mit vorhandenem RAW -> zur\u00fcck zu MEDIAINFO_CHECK
  • ohne RAW -> Startpfad \u00fcber READY_TO_START/RIPPING
"},{"location":"pipeline/post-encode-scripts/","title":"Encode-Skripte (Pre & Post)","text":"

Ripster kann Skripte und Skript-Ketten vor und nach dem Encode ausf\u00fchren.

"},{"location":"pipeline/post-encode-scripts/#ablauf","title":"Ablauf","text":"
READY_TO_ENCODE\n  -> Pre-Encode Skripte/Ketten\n  -> HandBrake Encoding\n  -> Post-Encode Skripte/Ketten\n  -> FINISHED oder ERROR\n
"},{"location":"pipeline/post-encode-scripts/#auswahl-im-review","title":"Auswahl im Review","text":"

Im Review-Panel kannst du getrennt w\u00e4hlen:

  • selectedPreEncodeScriptIds
  • selectedPostEncodeScriptIds
  • selectedPreEncodeChainIds
  • selectedPostEncodeChainIds
"},{"location":"pipeline/post-encode-scripts/#fehlerverhalten","title":"Fehlerverhalten","text":"
  • Pre-Encode-Fehler stoppen die Kette und f\u00fchren zu ERROR.
  • Post-Encode-Fehler stoppen die restlichen Post-Schritte; Job kann dennoch FINISHED sein (mit Fehlerzusatz im Status/Log).
"},{"location":"pipeline/post-encode-scripts/#verfugbare-umgebungsvariablen","title":"Verf\u00fcgbare Umgebungsvariablen","text":"

Beim Script-Run werden gesetzt:

  • RIPSTER_SCRIPT_RUN_AT
  • RIPSTER_JOB_ID
  • RIPSTER_JOB_TITLE
  • RIPSTER_MODE
  • RIPSTER_INPUT_PATH
  • RIPSTER_OUTPUT_PATH
  • RIPSTER_RAW_PATH
  • RIPSTER_SCRIPT_ID
  • RIPSTER_SCRIPT_NAME
  • RIPSTER_SCRIPT_SOURCE
"},{"location":"pipeline/post-encode-scripts/#skript-ketten","title":"Skript-Ketten","text":"

Ketten unterst\u00fctzen zwei Step-Typen:

  • script (f\u00fchrt ein hinterlegtes Skript aus)
  • wait (wartet waitSeconds)

Bei Fehler in einem Script-Step wird die Kette abgebrochen.

"},{"location":"pipeline/post-encode-scripts/#testlaufe","title":"Testl\u00e4ufe","text":"
  • Skript testen: POST /api/settings/scripts/:id/test
  • Kette testen: POST /api/settings/script-chains/:id/test

Ergebnisse enthalten Erfolg/Exit-Code, Laufzeit und stdout/stderr.

"},{"location":"pipeline/workflow/","title":"Workflow & Zust\u00e4nde","text":"

Ripster steuert den Ablauf als State-Machine im pipelineService.

"},{"location":"pipeline/workflow/#zustandsdiagramm-vereinfacht","title":"Zustandsdiagramm (vereinfacht)","text":"
flowchart LR\n    IDLE --> DISC_DETECTED\n    DISC_DETECTED --> ANALYZING\n    ANALYZING --> METADATA_SELECTION\n    METADATA_SELECTION --> READY_TO_START\n    READY_TO_START --> RIPPING\n    READY_TO_START --> MEDIAINFO_CHECK\n    MEDIAINFO_CHECK --> WAITING_FOR_USER_DECISION\n    WAITING_FOR_USER_DECISION --> MEDIAINFO_CHECK\n    MEDIAINFO_CHECK --> READY_TO_ENCODE\n    READY_TO_ENCODE --> ENCODING\n    ENCODING --> FINISHED\n    ENCODING --> ERROR\n    RIPPING --> ERROR\n    RIPPING --> CANCELLED
"},{"location":"pipeline/workflow/#state-liste","title":"State-Liste","text":"State Bedeutung IDLE Wartet auf Disc DISC_DETECTED Disc erkannt ANALYZING MakeMKV-Analyse l\u00e4uft METADATA_SELECTION Benutzer w\u00e4hlt Metadaten WAITING_FOR_USER_DECISION Playlist-Auswahl n\u00f6tig READY_TO_START \u00dcbergangszustand vor Start RIPPING MakeMKV-Rip l\u00e4uft MEDIAINFO_CHECK Quelle/Tracks werden ausgewertet READY_TO_ENCODE Review ist bereit ENCODING HandBrake l\u00e4uft FINISHED erfolgreich abgeschlossen CANCELLED abgebrochen ERROR fehlgeschlagen"},{"location":"pipeline/workflow/#typische-pfade","title":"Typische Pfade","text":""},{"location":"pipeline/workflow/#standardfall-kein-vorhandenes-raw","title":"Standardfall (kein vorhandenes RAW)","text":"
  1. Disc erkannt
  2. Analyse + Metadaten
  3. RIPPING
  4. MEDIAINFO_CHECK
  5. READY_TO_ENCODE
  6. ENCODING
  7. FINISHED
"},{"location":"pipeline/workflow/#vorhandenes-raw","title":"Vorhandenes RAW","text":"

READY_TO_START springt direkt zu MEDIAINFO_CHECK (kein neuer Rip).

"},{"location":"pipeline/workflow/#mehrdeutige-blu-ray-playlist","title":"Mehrdeutige Blu-ray-Playlist","text":"

MEDIAINFO_CHECK -> WAITING_FOR_USER_DECISION bis Benutzer Playlist best\u00e4tigt.

"},{"location":"pipeline/workflow/#queue-verhalten","title":"Queue-Verhalten","text":"

Wenn pipeline_max_parallel_jobs erreicht ist:

  • Job-Aktionen werden als Queue-Eintr\u00e4ge abgelegt
  • Queue kann zus\u00e4tzlich Nicht-Job-Eintr\u00e4ge enthalten (script, chain, wait)
  • Reihenfolge ist per API/UI \u00e4nderbar
"},{"location":"pipeline/workflow/#abbruch-retry-restart","title":"Abbruch, Retry, Restart","text":"
  • cancel: laufenden Job abbrechen oder Queue-Eintrag entfernen
  • retry: Fehler-/Abbruch-Job neu starten
  • reencode: aus vorhandenem RAW neu encodieren
  • restart-review: Review aus RAW neu aufbauen
  • restart-encode: Encoding mit letzter best\u00e4tigter Auswahl neu starten
"},{"location":"tools/","title":"Externe Tools","text":"

Ripster ist ein Orchestrator \u2013 die eigentliche Arbeit erledigen diese bew\u00e4hrten Open-Source-Tools:

  • MakeMKV

    Disc-Analyse und Ripping. Erstellt MKV-Dateien oder vollst\u00e4ndige Backups.

    MakeMKV

  • HandBrake

    Video-Encoding mit umfangreichen Preset-Optionen.

    HandBrake

  • MediaInfo

    Analyse von Track-Informationen in Mediendateien.

    MediaInfo

"},{"location":"tools/handbrake/","title":"HandBrake","text":"

Ripster verwendet HandBrakeCLI f\u00fcr Scan und Encode.

"},{"location":"tools/handbrake/#verwendete-aufrufe","title":"Verwendete Aufrufe","text":""},{"location":"tools/handbrake/#scan-review-aufbau","title":"Scan (Review-Aufbau)","text":"
HandBrakeCLI --scan --json -i <input> -t 0\n
"},{"location":"tools/handbrake/#encode-vereinfacht","title":"Encode (vereinfacht)","text":"
HandBrakeCLI \\\n  -i <input> \\\n  -o <output> \\\n  -t <titleId> \\\n  -Z \"<preset>\" \\\n  <extra-args> \\\n  -a <audioTrackIds|none> \\\n  -s <subtitleTrackIds|none>\n

Optional erg\u00e4nzt Ripster:

  • --subtitle-burned=<id>
  • --subtitle-default=<id>
  • --subtitle-forced=<id> oder --subtitle-forced
"},{"location":"tools/handbrake/#presets-auslesen","title":"Presets auslesen","text":"

Ripster liest Presets mit:

HandBrakeCLI -z\n
"},{"location":"tools/handbrake/#relevante-settings","title":"Relevante Settings","text":"Key Bedeutung handbrake_command CLI-Binary handbrake_preset_bluray / handbrake_preset_dvd profilspezifisches Preset handbrake_extra_args_bluray / handbrake_extra_args_dvd profilspezifische Zusatzargumente output_extension_bluray / output_extension_dvd Ausgabeformat handbrake_restart_delete_incomplete_output unvollst\u00e4ndige Ausgabe bei Neustart l\u00f6schen"},{"location":"tools/handbrake/#fortschritts-parsing","title":"Fortschritts-Parsing","text":"

Ripster parst HandBrake-Stderr (Prozent/ETA/Detail) und sendet WebSocket-Progress (PIPELINE_PROGRESS).

"},{"location":"tools/handbrake/#troubleshooting","title":"Troubleshooting","text":"
  • Preset nicht gefunden: Preset-Namen mit HandBrakeCLI -z pr\u00fcfen
  • sehr langsames Encoding: Preset/Extra-Args pr\u00fcfen (z. B. --encoder-preset)
"},{"location":"tools/makemkv/","title":"MakeMKV","text":"

Ripster nutzt makemkvcon f\u00fcr Disc-Analyse und Rip.

"},{"location":"tools/makemkv/#verwendete-aufrufe","title":"Verwendete Aufrufe","text":""},{"location":"tools/makemkv/#analyse","title":"Analyse","text":"
makemkvcon -r info <source>\n

<source> ist typischerweise:

  • disc:<index> (Auto-Modus)
  • dev:/dev/sr0 (explicit)
  • file:<path> (Datei/Ordner-Analyse)
"},{"location":"tools/makemkv/#rip-mkv-modus","title":"Rip (MKV-Modus)","text":"
makemkvcon mkv <source> <title-or-all> <rawDir> [--minlength=...] [...extraArgs]\n
"},{"location":"tools/makemkv/#rip-backup-modus","title":"Rip (Backup-Modus)","text":"
makemkvcon backup <source> <rawDir> --decrypt\n
"},{"location":"tools/makemkv/#registrierungsschlussel-optional","title":"Registrierungsschl\u00fcssel (optional)","text":"

Wenn makemkv_registration_key gesetzt ist, f\u00fchrt Ripster vor Analyse/Rip aus:

makemkvcon reg <key>\n
"},{"location":"tools/makemkv/#relevante-settings","title":"Relevante Settings","text":"Key Bedeutung makemkv_command CLI-Binary makemkv_source_index Source-Index im Auto-Modus makemkv_min_length_minutes Mindestlaufzeitfilter makemkv_rip_mode_bluray / makemkv_rip_mode_dvd mkv oder backup makemkv_analyze_extra_args_bluray / _dvd Zusatzargs Analyse makemkv_rip_extra_args_bluray / _dvd Zusatzargs Rip"},{"location":"tools/makemkv/#hinweise","title":"Hinweise","text":"
  • Blu-ray-Backups werden oft f\u00fcr robuste Playlist-Analyse genutzt.
  • MakeMKV-Ausgaben werden geparst und als makemkvInfo im Job gespeichert.
"},{"location":"tools/mediainfo/","title":"MediaInfo","text":"

Ripster nutzt mediainfo zur JSON-Analyse von Medien-Dateien.

"},{"location":"tools/mediainfo/#aufruf","title":"Aufruf","text":"
mediainfo --Output=JSON <input>\n

Der Input ist typischerweise eine RAW-Datei oder ein vom Workflow gew\u00e4hlter Inputpfad.

"},{"location":"tools/mediainfo/#verwendung-in-ripster","title":"Verwendung in Ripster","text":"
  • Track-/Codec-Metadaten f\u00fcr Review-Plan
  • Fallback-Informationen in bestimmten Analysepfaden
  • Persistenz als mediainfoInfo im Job
"},{"location":"tools/mediainfo/#relevante-settings","title":"Relevante Settings","text":"Key Bedeutung mediainfo_command CLI-Binary mediainfo_extra_args_bluray / _dvd profilspezifische Zusatzargumente"},{"location":"tools/mediainfo/#troubleshooting","title":"Troubleshooting","text":"
  • JSON-Test: mediainfo --Output=JSON <datei>
  • unbekannte Sprache erscheint oft als und (undetermined)
"}]} \ No newline at end of file +{"config":{"lang":["de"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Ripster Handbuch","text":"

Dieses Dokumentationsset ist als Benutzerhandbuch aufgebaut: erst Bedienung und Alltag, dann Technik im Anhang.

"},{"location":"#schnellstart-in-3-schritten","title":"Schnellstart in 3 Schritten","text":"
  1. Voraussetzungen pr\u00fcfen und installieren: Installation
  2. Grundkonfiguration in der UI setzen: Ersteinrichtung
  3. Ersten vollst\u00e4ndigen Job durchlaufen: Erster Lauf
"},{"location":"#was-du-hier-findest","title":"Was du hier findest","text":"
  • Benutzerhandbuch
  • Installation
  • GUI-Seiten im Detail (Dashboard, Settings, Historie, Database)
  • typische Arbeitsabl\u00e4ufe aus Anwendersicht
  • Technischer Anhang
  • vollst\u00e4ndige Einstellungsreferenz
  • Pipeline-/API-/Architekturdetails
  • Deployment und Tool-Hintergr\u00fcnde
"},{"location":"#empfohlene-lesereihenfolge","title":"Empfohlene Lesereihenfolge","text":"
  1. Benutzerhandbuch \u00dcberblick
  2. GUI-Seiten
  3. Workflows aus Nutzersicht
  4. Bei Bedarf: Technischer Anhang
"},{"location":"api/","title":"Anhang: API-Referenz","text":"

REST- und WebSocket-Schnittstellen f\u00fcr Integration, Automatisierung und Debugging.

"},{"location":"api/#basis-url","title":"Basis-URL","text":"
http://localhost:3001\n

API-Prefix: /api

"},{"location":"api/#api-gruppen","title":"API-Gruppen","text":"
  • Health

    Service-Liveness.

    GET /api/health

  • Pipeline API

    Analyse, Start/Retry/Cancel, Queue, Re-Encode.

    Pipeline API

  • Settings API

    Einstellungen, Skripte/Ketten, User-Presets.

    Settings API

  • History API

    Job-Historie, Orphan-Import, L\u00f6schoperationen.

    History API

  • Cron API

    Zeitgesteuerte Skript-/Kettenausf\u00fchrung.

    Cron API

  • WebSocket Events

    Pipeline-, Queue-, Disk-, Settings-, Cron- und Monitoring-Events.

    WebSocket

"},{"location":"api/#hinweis","title":"Hinweis","text":"

Ripster hat keine eingebaute Authentifizierung und ist f\u00fcr lokalen, gesch\u00fctzten Betrieb gedacht.

"},{"location":"api/crons/","title":"Cron API","text":"

Ripster enth\u00e4lt ein eingebautes Cron-System f\u00fcr Skripte und Skript-Ketten (sourceType: script|chain).

"},{"location":"api/crons/#get-apicrons","title":"GET /api/crons","text":"

Listet alle Cron-Jobs.

{\n  \"jobs\": [\n    {\n      \"id\": 1,\n      \"name\": \"Nachtlauf Backup\",\n      \"cronExpression\": \"0 2 * * *\",\n      \"sourceType\": \"script\",\n      \"sourceId\": 3,\n      \"sourceName\": \"Backup-Skript\",\n      \"enabled\": true,\n      \"pushoverEnabled\": true,\n      \"lastRunAt\": \"2026-03-10T02:00:00.000Z\",\n      \"lastRunStatus\": \"success\",\n      \"nextRunAt\": \"2026-03-11T02:00:00.000Z\",\n      \"createdAt\": \"2026-03-01T10:00:00.000Z\",\n      \"updatedAt\": \"2026-03-10T02:00:05.000Z\"\n    }\n  ]\n}\n
"},{"location":"api/crons/#post-apicrons","title":"POST /api/crons","text":"

Erstellt Cron-Job.

{\n  \"name\": \"Nachtlauf Backup\",\n  \"cronExpression\": \"0 2 * * *\",\n  \"sourceType\": \"script\",\n  \"sourceId\": 3,\n  \"enabled\": true,\n  \"pushoverEnabled\": true\n}\n

Response: 201 mit { \"job\": { ... } }

"},{"location":"api/crons/#get-apicronsid","title":"GET /api/crons/:id","text":"

Response:

{ \"job\": { \"id\": 1, \"name\": \"...\" } }\n
"},{"location":"api/crons/#put-apicronsid","title":"PUT /api/crons/:id","text":"

Aktualisiert Cron-Job. Felder wie bei POST.

Response:

{ \"job\": { ... } }\n
"},{"location":"api/crons/#delete-apicronsid","title":"DELETE /api/crons/:id","text":"

Response:

{ \"removed\": { \"id\": 1, \"name\": \"Nachtlauf Backup\" } }\n
"},{"location":"api/crons/#get-apicronsidlogs","title":"GET /api/crons/:id/logs","text":"

Liefert Ausf\u00fchrungs-Logs.

Query-Parameter:

Parameter Typ Default Beschreibung limit number 20 Anzahl Eintr\u00e4ge, max. 100

Response:

{\n  \"logs\": [\n    {\n      \"id\": 42,\n      \"cronJobId\": 1,\n      \"startedAt\": \"2026-03-10T02:00:01.000Z\",\n      \"finishedAt\": \"2026-03-10T02:00:05.000Z\",\n      \"status\": \"success\",\n      \"output\": \"Backup abgeschlossen.\",\n      \"errorMessage\": null\n    }\n  ]\n}\n

status: running | success | error

"},{"location":"api/crons/#post-apicronsidrun","title":"POST /api/crons/:id/run","text":"

Triggert Job manuell (asynchron).

Response:

{ \"triggered\": true, \"cronJobId\": 1 }\n

Wenn Job bereits l\u00e4uft: 409.

"},{"location":"api/crons/#post-apicronsvalidate-expression","title":"POST /api/crons/validate-expression","text":"

Validiert 5-Felder-Cron-Ausdruck und berechnet n\u00e4chsten Lauf.

Request:

{ \"cronExpression\": \"*/15 * * * *\" }\n

G\u00fcltige Response:

{\n  \"valid\": true,\n  \"nextRunAt\": \"2026-03-10T14:15:00.000Z\"\n}\n

Ung\u00fcltige Response:

{\n  \"valid\": false,\n  \"error\": \"Cron-Ausdruck muss genau 5 Felder haben (Minute Stunde Tag Monat Wochentag).\",\n  \"nextRunAt\": null\n}\n
"},{"location":"api/crons/#cron-format","title":"Cron-Format","text":"

Ripster unterst\u00fctzt 5 Felder:

Minute Stunde Tag Monat Wochentag\n

Beispiele:

  • 0 2 * * * t\u00e4glich 02:00
  • */15 * * * * alle 15 Minuten
  • 0 6 * * 1-5 Mo-Fr 06:00
"},{"location":"api/crons/#websocket-events-zu-cron","title":"WebSocket-Events zu Cron","text":"
  • CRON_JOBS_UPDATED bei Create/Update/Delete
  • CRON_JOB_UPDATED bei Laufzeitstatus (running -> success|error)
"},{"location":"api/history/","title":"History API","text":"

Endpunkte f\u00fcr Job-Historie, Orphan-Import und L\u00f6schoperationen.

"},{"location":"api/history/#get-apihistory","title":"GET /api/history","text":"

Liefert Jobs (optionale Filter).

Query-Parameter:

Parameter Typ Beschreibung status string Filter nach Job-Status search string Suche in Titel-Feldern

Beispiel:

GET /api/history?status=FINISHED&search=Inception\n

Response:

{\n  \"jobs\": [\n    {\n      \"id\": 42,\n      \"status\": \"FINISHED\",\n      \"title\": \"Inception\",\n      \"raw_path\": \"/mnt/raw/Inception - RAW - job-42\",\n      \"output_path\": \"/mnt/movies/Inception (2010)/Inception (2010).mkv\",\n      \"mediaType\": \"bluray\",\n      \"ripSuccessful\": true,\n      \"encodeSuccess\": true,\n      \"created_at\": \"2026-03-10T08:00:00.000Z\",\n      \"updated_at\": \"2026-03-10T10:00:00.000Z\"\n    }\n  ]\n}\n
"},{"location":"api/history/#get-apihistoryid","title":"GET /api/history/:id","text":"

Liefert Job-Detail.

Query-Parameter:

Parameter Typ Standard Beschreibung includeLogs bool false Prozesslog laden includeLiveLog bool false alias-artig ebenfalls Prozesslog laden includeAllLogs bool false vollst\u00e4ndiges Log statt Tail logTailLines number 800 Tail-L\u00e4nge falls nicht includeAllLogs

Response:

{\n  \"job\": {\n    \"id\": 42,\n    \"status\": \"FINISHED\",\n    \"makemkvInfo\": {},\n    \"mediainfoInfo\": {},\n    \"handbrakeInfo\": {},\n    \"encodePlan\": {},\n    \"log\": \"...\",\n    \"log_count\": 1,\n    \"logMeta\": {\n      \"loaded\": true,\n      \"total\": 800,\n      \"returned\": 800,\n      \"truncated\": true\n    }\n  }\n}\n
"},{"location":"api/history/#get-apihistorydatabase","title":"GET /api/history/database","text":"

Debug-Ansicht der DB-Zeilen (angereichert).

Response:

{\n  \"rows\": [\n    {\n      \"id\": 42,\n      \"status\": \"FINISHED\",\n      \"rawFolderName\": \"Inception - RAW - job-42\"\n    }\n  ]\n}\n
"},{"location":"api/history/#get-apihistoryorphan-raw","title":"GET /api/history/orphan-raw","text":"

Sucht RAW-Ordner ohne zugeh\u00f6rigen Job.

Response:

{\n  \"rawDir\": \"/mnt/raw\",\n  \"rawDirs\": [\"/mnt/raw\", \"/mnt/raw-bluray\"],\n  \"rows\": [\n    {\n      \"rawPath\": \"/mnt/raw/Inception (2010) [tt1375666] - RAW - job-99\",\n      \"folderName\": \"Inception (2010) [tt1375666] - RAW - job-99\",\n      \"title\": \"Inception\",\n      \"year\": 2010,\n      \"imdbId\": \"tt1375666\",\n      \"folderJobId\": 99,\n      \"entryCount\": 4,\n      \"hasBlurayStructure\": true,\n      \"lastModifiedAt\": \"2026-03-10T09:00:00.000Z\"\n    }\n  ]\n}\n
"},{"location":"api/history/#post-apihistoryorphan-rawimport","title":"POST /api/history/orphan-raw/import","text":"

Importiert RAW-Ordner als FINISHED-Job.

Request:

{ \"rawPath\": \"/mnt/raw/Inception (2010) [tt1375666] - RAW - job-99\" }\n

Response:

{\n  \"job\": { \"id\": 77, \"status\": \"FINISHED\" },\n  \"uiReset\": { \"reset\": true, \"state\": \"IDLE\" }\n}\n
"},{"location":"api/history/#post-apihistoryidomdbassign","title":"POST /api/history/:id/omdb/assign","text":"

Weist OMDb-/Metadaten nachtr\u00e4glich zu.

Request:

{\n  \"imdbId\": \"tt1375666\",\n  \"title\": \"Inception\",\n  \"year\": 2010,\n  \"poster\": \"https://...\",\n  \"fromOmdb\": true\n}\n

Response:

{ \"job\": { \"id\": 42, \"imdb_id\": \"tt1375666\" } }\n
"},{"location":"api/history/#post-apihistoryiddelete-files","title":"POST /api/history/:id/delete-files","text":"

L\u00f6scht Dateien eines Jobs, beh\u00e4lt DB-Eintrag.

Request:

{ \"target\": \"both\" }\n

target: raw | movie | both

Response:

{\n  \"summary\": {\n    \"target\": \"both\",\n    \"raw\": { \"attempted\": true, \"deleted\": true, \"filesDeleted\": 12, \"dirsRemoved\": 3, \"reason\": null },\n    \"movie\": { \"attempted\": true, \"deleted\": false, \"filesDeleted\": 0, \"dirsRemoved\": 0, \"reason\": \"Movie-Datei/Pfad existiert nicht.\" }\n  },\n  \"job\": { \"id\": 42 }\n}\n
"},{"location":"api/history/#post-apihistoryiddelete","title":"POST /api/history/:id/delete","text":"

L\u00f6scht Job aus DB; optional auch Dateien.

Request:

{ \"target\": \"none\" }\n

target: none | raw | movie | both

Response:

{\n  \"deleted\": true,\n  \"jobId\": 42,\n  \"fileTarget\": \"both\",\n  \"fileSummary\": {\n    \"target\": \"both\",\n    \"raw\": { \"filesDeleted\": 10 },\n    \"movie\": { \"filesDeleted\": 1 }\n  },\n  \"uiReset\": {\n    \"reset\": true,\n    \"state\": \"IDLE\"\n  }\n}\n
"},{"location":"api/history/#hinweise","title":"Hinweise","text":"
  • Ein aktiver Pipeline-Job kann nicht gel\u00f6scht werden (409).
  • Alle L\u00f6schoperationen sind irreversibel.
"},{"location":"api/pipeline/","title":"Pipeline API","text":"

Endpunkte zur Steuerung des Pipeline-Workflows.

"},{"location":"api/pipeline/#get-apipipelinestate","title":"GET /api/pipeline/state","text":"

Liefert aktuellen Pipeline- und Hardware-Monitoring-Snapshot.

Response (Beispiel):

{\n  \"pipeline\": {\n    \"state\": \"READY_TO_ENCODE\",\n    \"activeJobId\": 42,\n    \"progress\": 0,\n    \"eta\": null,\n    \"statusText\": \"Mediainfo best\u00e4tigt - Encode manuell starten\",\n    \"context\": {\n      \"jobId\": 42\n    },\n    \"jobProgress\": {\n      \"42\": {\n        \"state\": \"MEDIAINFO_CHECK\",\n        \"progress\": 68.5,\n        \"eta\": null,\n        \"statusText\": \"MEDIAINFO_CHECK 68.50%\"\n      }\n    },\n    \"queue\": {\n      \"maxParallelJobs\": 1,\n      \"runningCount\": 1,\n      \"queuedCount\": 2,\n      \"runningJobs\": [],\n      \"queuedJobs\": []\n    }\n  },\n  \"hardwareMonitoring\": {\n    \"enabled\": true,\n    \"intervalMs\": 5000,\n    \"updatedAt\": \"2026-03-10T09:00:00.000Z\",\n    \"sample\": {\n      \"cpu\": {},\n      \"memory\": {},\n      \"gpu\": {},\n      \"storage\": {}\n    },\n    \"error\": null\n  }\n}\n
"},{"location":"api/pipeline/#post-apipipelineanalyze","title":"POST /api/pipeline/analyze","text":"

Startet Disc-Analyse und legt Job an.

Response:

{\n  \"result\": {\n    \"jobId\": 42,\n    \"detectedTitle\": \"INCEPTION\",\n    \"omdbCandidates\": []\n  }\n}\n
"},{"location":"api/pipeline/#post-apipipelinerescan-disc","title":"POST /api/pipeline/rescan-disc","text":"

Erzwingt erneute Laufwerkspr\u00fcfung.

Response (Beispiel):

{\n  \"result\": {\n    \"present\": true,\n    \"changed\": true,\n    \"emitted\": \"discInserted\",\n    \"device\": {\n      \"path\": \"/dev/sr0\",\n      \"discLabel\": \"INCEPTION\",\n      \"mediaProfile\": \"bluray\"\n    }\n  }\n}\n
"},{"location":"api/pipeline/#get-apipipelineomdbsearchq","title":"GET /api/pipeline/omdb/search?q=

OMDb-Titelsuche.

Response:

{\n  \"results\": [\n    {\n      \"imdbId\": \"tt1375666\",\n      \"title\": \"Inception\",\n      \"year\": \"2010\",\n      \"type\": \"movie\",\n      \"poster\": \"https://...\"\n    }\n  ]\n}\n
","text":""},{"location":"api/pipeline/#post-apipipelineselect-metadata","title":"POST /api/pipeline/select-metadata

Setzt Metadaten (und optional Playlist) f\u00fcr einen Job.

Request:

{\n  \"jobId\": 42,\n  \"title\": \"Inception\",\n  \"year\": 2010,\n  \"imdbId\": \"tt1375666\",\n  \"poster\": \"https://...\",\n  \"fromOmdb\": true,\n  \"selectedPlaylist\": \"00800\"\n}\n

Response:

{ \"job\": { \"id\": 42, \"status\": \"READY_TO_START\" } }\n
","text":""},{"location":"api/pipeline/#post-apipipelinestartjobid","title":"POST /api/pipeline/start/:jobId

Startet vorbereiteten Job oder queued ihn (je nach Parallel-Limit).

M\u00f6gliche Responses:

{ \"result\": { \"started\": true, \"stage\": \"RIPPING\" } }\n
{ \"result\": { \"queued\": true, \"started\": false, \"queuePosition\": 2, \"action\": \"START_PREPARED\" } }\n
","text":""},{"location":"api/pipeline/#post-apipipelineconfirm-encodejobid","title":"POST /api/pipeline/confirm-encode/:jobId

Best\u00e4tigt Review-Auswahl (Tracks, Pre/Post-Skripte/Ketten, User-Preset).

Request (typisch):

{\n  \"selectedEncodeTitleId\": 1,\n  \"selectedTrackSelection\": {\n    \"1\": {\n      \"audioTrackIds\": [1, 2],\n      \"subtitleTrackIds\": [3]\n    }\n  },\n  \"selectedPreEncodeScriptIds\": [1],\n  \"selectedPostEncodeScriptIds\": [2, 7],\n  \"selectedPreEncodeChainIds\": [3],\n  \"selectedPostEncodeChainIds\": [4],\n  \"selectedUserPresetId\": 5,\n  \"skipPipelineStateUpdate\": false\n}\n

Response:

{ \"job\": { \"id\": 42, \"encode_review_confirmed\": 1 } }\n
","text":""},{"location":"api/pipeline/#post-apipipelinecancel","title":"POST /api/pipeline/cancel

Bricht laufenden Job ab oder entfernt Queue-Eintrag.

Request (optional):

{ \"jobId\": 42 }\n

M\u00f6gliche Responses:

{ \"result\": { \"cancelled\": true, \"queuedOnly\": true, \"jobId\": 42 } }\n
{ \"result\": { \"cancelled\": true, \"queuedOnly\": false, \"jobId\": 42 } }\n
{ \"result\": { \"cancelled\": true, \"queuedOnly\": false, \"pending\": true, \"jobId\": 42 } }\n
","text":""},{"location":"api/pipeline/#post-apipipelineretryjobid","title":"POST /api/pipeline/retry/:jobId

Retry f\u00fcr ERROR/CANCELLED-Jobs (oder Queue-Einreihung).

","text":""},{"location":"api/pipeline/#post-apipipelinereencodejobid","title":"POST /api/pipeline/reencode/:jobId

Startet Re-Encode aus bestehendem RAW.

","text":""},{"location":"api/pipeline/#post-apipipelinerestart-reviewjobid","title":"POST /api/pipeline/restart-review/:jobId

Berechnet Review aus RAW neu.

","text":""},{"location":"api/pipeline/#post-apipipelinerestart-encodejobid","title":"POST /api/pipeline/restart-encode/:jobId

Startet Encoding mit letzter best\u00e4tigter Review neu.

","text":""},{"location":"api/pipeline/#post-apipipelineresume-readyjobid","title":"POST /api/pipeline/resume-ready/:jobId

L\u00e4dt READY_TO_ENCODE-Job nach Neustart wieder in aktive Session.

Alle Endpunkte liefern { result: ... } bzw. { job: ... }.

","text":""},{"location":"api/pipeline/#queue-endpunkte","title":"Queue-Endpunkte","text":""},{"location":"api/pipeline/#get-apipipelinequeue","title":"GET /api/pipeline/queue","text":"

Liefert Queue-Snapshot.

{\n  \"queue\": {\n    \"maxParallelJobs\": 1,\n    \"runningCount\": 1,\n    \"queuedCount\": 3,\n    \"runningJobs\": [\n      {\n        \"jobId\": 41,\n        \"title\": \"Inception\",\n        \"status\": \"ENCODING\",\n        \"lastState\": \"ENCODING\"\n      }\n    ],\n    \"queuedJobs\": [\n      {\n        \"entryId\": 11,\n        \"position\": 1,\n        \"type\": \"job\",\n        \"jobId\": 42,\n        \"action\": \"START_PREPARED\",\n        \"actionLabel\": \"Start\",\n        \"title\": \"Matrix\",\n        \"status\": \"READY_TO_ENCODE\",\n        \"lastState\": \"READY_TO_ENCODE\",\n        \"hasScripts\": true,\n        \"hasChains\": false,\n        \"enqueuedAt\": \"2026-03-10T09:00:00.000Z\"\n      },\n      {\n        \"entryId\": 12,\n        \"position\": 2,\n        \"type\": \"wait\",\n        \"waitSeconds\": 30,\n        \"title\": \"Warten 30s\",\n        \"status\": \"QUEUED\",\n        \"enqueuedAt\": \"2026-03-10T09:01:00.000Z\"\n      }\n    ],\n    \"updatedAt\": \"2026-03-10T09:01:02.000Z\"\n  }\n}\n
"},{"location":"api/pipeline/#post-apipipelinequeuereorder","title":"POST /api/pipeline/queue/reorder","text":"

Sortiert Queue-Eintr\u00e4ge neu.

Request:

{\n  \"orderedEntryIds\": [12, 11]\n}\n

Legacy fallback wird akzeptiert:

{\n  \"orderedJobIds\": [42, 43]\n}\n
"},{"location":"api/pipeline/#post-apipipelinequeueentry","title":"POST /api/pipeline/queue/entry","text":"

F\u00fcgt Nicht-Job-Queue-Eintrag hinzu (script, chain, wait).

Request-Beispiele:

{ \"type\": \"script\", \"scriptId\": 3 }\n
{ \"type\": \"chain\", \"chainId\": 2, \"insertAfterEntryId\": 11 }\n
{ \"type\": \"wait\", \"waitSeconds\": 45 }\n

Response:

{\n  \"result\": { \"entryId\": 12, \"type\": \"wait\", \"position\": 2 },\n  \"queue\": { \"...\": \"...\" }\n}\n
"},{"location":"api/pipeline/#delete-apipipelinequeueentryentryid","title":"DELETE /api/pipeline/queue/entry/:entryId","text":"

Entfernt Queue-Eintrag.

Response:

{ \"queue\": { \"...\": \"...\" } }\n
"},{"location":"api/pipeline/#pipeline-zustande","title":"Pipeline-Zust\u00e4nde State Bedeutung IDLE Wartet auf Medium DISC_DETECTED Medium erkannt ANALYZING MakeMKV-Analyse l\u00e4uft METADATA_SELECTION Metadaten-Auswahl WAITING_FOR_USER_DECISION Playlist-Entscheidung erforderlich READY_TO_START \u00dcbergang vor Start RIPPING MakeMKV-Rip l\u00e4uft MEDIAINFO_CHECK Titel-/Track-Auswertung READY_TO_ENCODE Review bereit ENCODING HandBrake-Encoding l\u00e4uft FINISHED Abgeschlossen CANCELLED Abgebrochen ERROR Fehler","text":""},{"location":"api/runtime-activities/","title":"Runtime Activities API","text":"

Ripster verfolgt alle laufenden und k\u00fcrzlich abgeschlossenen Aktivit\u00e4ten (Skripte, Skript-Ketten, Cron-Jobs, interne Tasks) in Echtzeit \u00fcber den RuntimeActivityService.

"},{"location":"api/runtime-activities/#ubersicht","title":"\u00dcbersicht","text":"

Aktivit\u00e4ten entstehen, wenn Ripster intern Aktionen ausf\u00fchrt \u2013 z. B. beim Start eines Cron-Jobs, beim Ausf\u00fchren einer Skript-Kette oder beim Durchlaufen von Pipeline-Schritten. Sie sind nicht persistent (kein DB-Speicher) und werden nur im Arbeitsspeicher gehalten.

  • Aktive Aktivit\u00e4ten (active): Laufen gerade.
  • Letzte Aktivit\u00e4ten (recent): Abgeschlossen, max. 120 Eintr\u00e4ge.

\u00c4nderungen werden \u00fcber WebSocket (RUNTIME_ACTIVITY_CHANGED) in Echtzeit gesendet.

"},{"location":"api/runtime-activities/#aktivitats-objekt","title":"Aktivit\u00e4ts-Objekt","text":"
{\n  \"id\": 7,\n  \"type\": \"chain\",\n  \"name\": \"Post-Encode Aufr\u00e4umen\",\n  \"status\": \"running\",\n  \"source\": \"cron\",\n  \"message\": \"Schritt 2 von 3\",\n  \"currentStep\": \"cleanup.sh\",\n  \"currentStepType\": \"script\",\n  \"currentScriptName\": \"cleanup.sh\",\n  \"stepIndex\": 2,\n  \"stepTotal\": 3,\n  \"parentActivityId\": null,\n  \"jobId\": 42,\n  \"cronJobId\": 3,\n  \"chainId\": 5,\n  \"scriptId\": null,\n  \"canCancel\": true,\n  \"canNextStep\": false,\n  \"outcome\": \"running\",\n  \"errorMessage\": null,\n  \"output\": null,\n  \"stdout\": null,\n  \"stderr\": null,\n  \"stdoutTruncated\": false,\n  \"stderrTruncated\": false,\n  \"startedAt\": \"2026-03-10T10:00:00.000Z\",\n  \"finishedAt\": null,\n  \"durationMs\": null,\n  \"exitCode\": null,\n  \"success\": null\n}\n
"},{"location":"api/runtime-activities/#felder","title":"Felder","text":"Feld Typ Beschreibung id number Eindeutige ID (Laufz\u00e4hler, nicht persistent) type string Art der Aktivit\u00e4t: script | chain | cron | task name string \\| null Anzeigename der Aktivit\u00e4t status string Aktueller Status: running | success | error source string \\| null Ausl\u00f6ser (z. B. cron, pipeline, manual) message string \\| null Kurztext zum aktuellen Zustand currentStep string \\| null Name des aktuell ausgef\u00fchrten Schritts currentStepType string \\| null Typ des Schritts (z. B. script, wait) currentScriptName string \\| null Name des Skripts im aktuellen Schritt stepIndex number \\| null Aktueller Schritt (1-basiert) stepTotal number \\| null Gesamtanzahl Schritte parentActivityId number \\| null ID der \u00fcbergeordneten Aktivit\u00e4t jobId number \\| null Verkn\u00fcpfte Job-ID cronJobId number \\| null Verkn\u00fcpfte Cron-Job-ID chainId number \\| null Verkn\u00fcpfte Skript-Ketten-ID scriptId number \\| null Verkn\u00fcpfte Skript-ID canCancel boolean Abbrechen \u00fcber API m\u00f6glich canNextStep boolean N\u00e4chster Schritt \u00fcber API ausl\u00f6sbar outcome string \\| null Abschluss-Ergebnis: success | error | cancelled | skipped | running errorMessage string \\| null Fehlermeldung (max. 2.000 Zeichen) output string \\| null Allgemeine Ausgabe (max. 12.000 Zeichen) stdout string \\| null Standardausgabe des Prozesses (max. 12.000 Zeichen) stderr string \\| null Fehlerausgabe des Prozesses (max. 12.000 Zeichen) stdoutTruncated boolean true, wenn stdout gek\u00fcrzt wurde stderrTruncated boolean true, wenn stderr gek\u00fcrzt wurde startedAt string ISO-8601-Zeitstempel des Starts finishedAt string \\| null ISO-8601-Zeitstempel des Endes durationMs number \\| null Laufzeit in Millisekunden exitCode number \\| null Exit-Code des Prozesses success boolean \\| null Erfolgsstatus (null bei laufender Aktivit\u00e4t)"},{"location":"api/runtime-activities/#snapshot-objekt","title":"Snapshot-Objekt","text":"

Alle Aktivit\u00e4ts-Endpunkte geben einen Snapshot zur\u00fcck:

{\n  \"active\": [ /* laufende Aktivit\u00e4ten, nach startedAt absteigend */ ],\n  \"recent\": [ /* abgeschlossene Aktivit\u00e4ten, nach finishedAt absteigend, max. 120 */ ],\n  \"updatedAt\": \"2026-03-10T10:05:00.000Z\"\n}\n
"},{"location":"api/runtime-activities/#endpunkte","title":"Endpunkte","text":""},{"location":"api/runtime-activities/#get-apiactivities","title":"GET /api/activities","text":"

Aktuellen Aktivit\u00e4ts-Snapshot abrufen.

Antwort:

{\n  \"active\": [],\n  \"recent\": [\n    {\n      \"id\": 5,\n      \"type\": \"script\",\n      \"name\": \"notify.sh\",\n      \"status\": \"success\",\n      \"outcome\": \"success\",\n      \"startedAt\": \"2026-03-10T09:58:00.000Z\",\n      \"finishedAt\": \"2026-03-10T09:58:02.000Z\",\n      \"durationMs\": 2100,\n      \"exitCode\": 0,\n      \"success\": true,\n      \"canCancel\": false,\n      \"canNextStep\": false\n    }\n  ],\n  \"updatedAt\": \"2026-03-10T10:05:00.000Z\"\n}\n
"},{"location":"api/runtime-activities/#post-apiactivitiesidcancel","title":"POST /api/activities/:id/cancel","text":"

Aktive Aktivit\u00e4t abbrechen (nur wenn canCancel: true).

Parameter:

Name In Typ Beschreibung id path number Aktivit\u00e4ts-ID reason body string Optionaler Abbruchgrund

Request Body:

{ \"reason\": \"Manueller Abbruch durch Benutzer\" }\n

Antwort (Erfolg):

{\n  \"ok\": true,\n  \"action\": null,\n  \"snapshot\": { \"active\": [], \"recent\": [], \"updatedAt\": \"...\" }\n}\n

Fehlercodes:

HTTP Bedeutung 404 Aktivit\u00e4t nicht gefunden oder bereits abgeschlossen 409 Abbrechen wird von dieser Aktivit\u00e4t nicht unterst\u00fctzt"},{"location":"api/runtime-activities/#post-apiactivitiesidnext-step","title":"POST /api/activities/:id/next-step","text":"

N\u00e4chsten Schritt einer Aktivit\u00e4t ausl\u00f6sen (nur wenn canNextStep: true).

Parameter:

Name In Typ Beschreibung id path number Aktivit\u00e4ts-ID

Antwort (Erfolg):

{\n  \"ok\": true,\n  \"action\": null,\n  \"snapshot\": { \"active\": [], \"recent\": [], \"updatedAt\": \"...\" }\n}\n

Fehlercodes:

HTTP Bedeutung 404 Aktivit\u00e4t nicht gefunden 409 N\u00e4chster Schritt wird von dieser Aktivit\u00e4t nicht unterst\u00fctzt"},{"location":"api/runtime-activities/#post-apiactivitiesclear-recent","title":"POST /api/activities/clear-recent","text":"

Alle abgeschlossenen Aktivit\u00e4ten aus recent l\u00f6schen.

Antwort:

{\n  \"ok\": true,\n  \"removed\": 14,\n  \"snapshot\": { \"active\": [], \"recent\": [], \"updatedAt\": \"...\" }\n}\n
"},{"location":"api/runtime-activities/#grenzwerte","title":"Grenzwerte","text":"Wert Limit Maximale recent-Eintr\u00e4ge 120 Maximale L\u00e4nge stdout / stderr / output 12.000 Zeichen Maximale L\u00e4nge errorMessage / message 2.000 Zeichen Maximale L\u00e4nge outcome 40 Zeichen

Gek\u00fcrzte Ausgaben erhalten den Suffix ...[gek\u00fcrzt] (bei Inline-Text) bzw. \\n...[gek\u00fcrzt] (bei mehrzeiligem Output).

"},{"location":"api/runtime-activities/#echtzeit-updates","title":"Echtzeit-Updates","text":"

\u00c4nderungen werden automatisch als RUNTIME_ACTIVITY_CHANGED WebSocket-Event gesendet. Die Frontend-Komponente braucht GET /api/activities nur beim initialen Laden aufzurufen.

"},{"location":"api/settings/","title":"Settings API","text":"

Endpunkte f\u00fcr Einstellungen, Skripte, Skript-Ketten und User-Presets.

"},{"location":"api/settings/#get-apisettings","title":"GET /api/settings","text":"

Liefert alle Einstellungen kategorisiert.

Response (Struktur):

{\n  \"categories\": [\n    {\n      \"category\": \"Pfade\",\n      \"settings\": [\n        {\n          \"key\": \"raw_dir\",\n          \"label\": \"Raw Ausgabeordner\",\n          \"type\": \"path\",\n          \"required\": true,\n          \"description\": \"...\",\n          \"defaultValue\": \"data/output/raw\",\n          \"options\": [],\n          \"validation\": { \"minLength\": 1 },\n          \"value\": \"data/output/raw\",\n          \"orderIndex\": 100\n        }\n      ]\n    }\n  ]\n}\n
"},{"location":"api/settings/#put-apisettingskey","title":"PUT /api/settings/:key","text":"

Aktualisiert eine einzelne Einstellung.

Request:

{ \"value\": \"/mnt/storage/raw\" }\n

Response:

{\n  \"setting\": {\n    \"key\": \"raw_dir\",\n    \"value\": \"/mnt/storage/raw\"\n  },\n  \"reviewRefresh\": {\n    \"triggered\": false,\n    \"reason\": \"not_ready\"\n  }\n}\n

reviewRefresh ist null oder ein Objekt mit Status der optionalen Review-Neuberechnung.

"},{"location":"api/settings/#put-apisettings","title":"PUT /api/settings","text":"

Aktualisiert mehrere Einstellungen atomar.

Request:

{\n  \"settings\": {\n    \"raw_dir\": \"/mnt/storage/raw\",\n    \"movie_dir\": \"/mnt/storage/movies\",\n    \"handbrake_preset_bluray\": \"H.264 MKV 1080p30\"\n  }\n}\n

Response:

{\n  \"changes\": [\n    { \"key\": \"raw_dir\", \"value\": \"/mnt/storage/raw\" },\n    { \"key\": \"movie_dir\", \"value\": \"/mnt/storage/movies\" }\n  ],\n  \"reviewRefresh\": {\n    \"triggered\": true,\n    \"jobId\": 42,\n    \"relevantKeys\": [\"handbrake_preset_bluray\"]\n  }\n}\n

Bei Validierungsfehlern kommt 400 mit error.details[].

"},{"location":"api/settings/#get-apisettingshandbrake-presets","title":"GET /api/settings/handbrake-presets","text":"

Liest Preset-Liste via HandBrakeCLI -z (mit Fallback auf konfigurierte Presets).

Response (Beispiel):

{\n  \"source\": \"handbrake-cli\",\n  \"message\": null,\n  \"options\": [\n    { \"label\": \"General/\", \"value\": \"__group__general\", \"disabled\": true, \"category\": \"General\" },\n    { \"label\": \"   Fast 1080p30\", \"value\": \"Fast 1080p30\", \"category\": \"General\" }\n  ]\n}\n
"},{"location":"api/settings/#post-apisettingspushovertest","title":"POST /api/settings/pushover/test","text":"

Sendet Testnachricht \u00fcber aktuelle PushOver-Settings.

Request (optional):

{\n  \"title\": \"Test\",\n  \"message\": \"Ripster Test\"\n}\n

Response:

{\n  \"result\": {\n    \"sent\": true,\n    \"eventKey\": \"test\",\n    \"requestId\": \"...\"\n  }\n}\n

Wenn PushOver deaktiviert ist oder Credentials fehlen, kommt i. d. R. ebenfalls 200 mit sent: false + reason.

"},{"location":"api/settings/#skripte","title":"Skripte","text":"

Basis: /api/settings/scripts

"},{"location":"api/settings/#get-apisettingsscripts","title":"GET /api/settings/scripts","text":"
{ \"scripts\": [ { \"id\": 1, \"name\": \"...\", \"scriptBody\": \"...\", \"orderIndex\": 1, \"createdAt\": \"...\", \"updatedAt\": \"...\" } ] }\n
"},{"location":"api/settings/#post-apisettingsscripts","title":"POST /api/settings/scripts","text":"
{ \"name\": \"Move\", \"scriptBody\": \"mv \\\"$RIPSTER_OUTPUT_PATH\\\" /mnt/movies/\" }\n

Response: 201 mit { \"script\": { ... } }

"},{"location":"api/settings/#put-apisettingsscriptsid","title":"PUT /api/settings/scripts/:id","text":"

Body wie POST, Response { \"script\": { ... } }.

"},{"location":"api/settings/#delete-apisettingsscriptsid","title":"DELETE /api/settings/scripts/:id","text":"

Response { \"removed\": { ... } }.

"},{"location":"api/settings/#post-apisettingsscriptsreorder","title":"POST /api/settings/scripts/reorder","text":"
{ \"orderedScriptIds\": [3, 1, 2] }\n

Response { \"scripts\": [ ... ] }.

"},{"location":"api/settings/#post-apisettingsscriptsidtest","title":"POST /api/settings/scripts/:id/test","text":"

F\u00fchrt Skript als Testlauf aus.

{\n  \"result\": {\n    \"scriptId\": 1,\n    \"scriptName\": \"Move\",\n    \"success\": true,\n    \"exitCode\": 0,\n    \"signal\": null,\n    \"timedOut\": false,\n    \"durationMs\": 120,\n    \"stdout\": \"...\",\n    \"stderr\": \"...\",\n    \"stdoutTruncated\": false,\n    \"stderrTruncated\": false\n  }\n}\n
"},{"location":"api/settings/#umgebungsvariablen-fur-skripte","title":"Umgebungsvariablen f\u00fcr Skripte","text":"

Diese Variablen werden beim Ausf\u00fchren gesetzt:

  • RIPSTER_SCRIPT_RUN_AT
  • RIPSTER_JOB_ID
  • RIPSTER_JOB_TITLE
  • RIPSTER_MODE
  • RIPSTER_INPUT_PATH
  • RIPSTER_OUTPUT_PATH
  • RIPSTER_RAW_PATH
  • RIPSTER_SCRIPT_ID
  • RIPSTER_SCRIPT_NAME
  • RIPSTER_SCRIPT_SOURCE
"},{"location":"api/settings/#skript-ketten","title":"Skript-Ketten","text":"

Basis: /api/settings/script-chains

Eine Kette hat Schritte vom Typ:

  • script (scriptId erforderlich)
  • wait (waitSeconds 1..3600)
"},{"location":"api/settings/#get-apisettingsscript-chains","title":"GET /api/settings/script-chains","text":"

Response { \"chains\": [ ... ] } (inkl. steps[]).

"},{"location":"api/settings/#get-apisettingsscript-chainsid","title":"GET /api/settings/script-chains/:id","text":"

Response { \"chain\": { ... } }.

"},{"location":"api/settings/#post-apisettingsscript-chains","title":"POST /api/settings/script-chains","text":"
{\n  \"name\": \"After Encode\",\n  \"steps\": [\n    { \"stepType\": \"script\", \"scriptId\": 1 },\n    { \"stepType\": \"wait\", \"waitSeconds\": 15 },\n    { \"stepType\": \"script\", \"scriptId\": 2 }\n  ]\n}\n

Response: 201 mit { \"chain\": { ... } }

"},{"location":"api/settings/#put-apisettingsscript-chainsid","title":"PUT /api/settings/script-chains/:id","text":"

Body wie POST, Response { \"chain\": { ... } }.

"},{"location":"api/settings/#delete-apisettingsscript-chainsid","title":"DELETE /api/settings/script-chains/:id","text":"

Response { \"removed\": { ... } }.

"},{"location":"api/settings/#post-apisettingsscript-chainsreorder","title":"POST /api/settings/script-chains/reorder","text":"
{ \"orderedChainIds\": [2, 1, 3] }\n

Response { \"chains\": [ ... ] }.

"},{"location":"api/settings/#post-apisettingsscript-chainsidtest","title":"POST /api/settings/script-chains/:id/test","text":"

Response:

{\n  \"result\": {\n    \"chainId\": 2,\n    \"chainName\": \"After Encode\",\n    \"steps\": 3,\n    \"succeeded\": 3,\n    \"failed\": 0,\n    \"aborted\": false,\n    \"results\": []\n  }\n}\n
"},{"location":"api/settings/#user-presets","title":"User-Presets","text":"

Basis: /api/settings/user-presets

"},{"location":"api/settings/#get-apisettingsuser-presets","title":"GET /api/settings/user-presets","text":"

Optionaler Query-Parameter: media_type=bluray|dvd|other|all

{\n  \"presets\": [\n    {\n      \"id\": 1,\n      \"name\": \"Blu-ray HQ\",\n      \"mediaType\": \"bluray\",\n      \"handbrakePreset\": \"H.264 MKV 1080p30\",\n      \"extraArgs\": \"--encoder-preset slow\",\n      \"description\": \"...\",\n      \"createdAt\": \"...\",\n      \"updatedAt\": \"...\"\n    }\n  ]\n}\n
"},{"location":"api/settings/#post-apisettingsuser-presets","title":"POST /api/settings/user-presets","text":"
{\n  \"name\": \"Blu-ray HQ\",\n  \"mediaType\": \"bluray\",\n  \"handbrakePreset\": \"H.264 MKV 1080p30\",\n  \"extraArgs\": \"--encoder-preset slow\",\n  \"description\": \"optional\"\n}\n

Response: 201 mit { \"preset\": { ... } }

"},{"location":"api/settings/#put-apisettingsuser-presetsid","title":"PUT /api/settings/user-presets/:id","text":"

Body mit beliebigen Feldern aus POST, Response { \"preset\": { ... } }.

"},{"location":"api/settings/#delete-apisettingsuser-presetsid","title":"DELETE /api/settings/user-presets/:id","text":"

Response { \"removed\": { ... } }.

"},{"location":"api/websocket/","title":"WebSocket Events","text":"

Ripster sendet Echtzeit-Updates \u00fcber /ws.

"},{"location":"api/websocket/#verbindung","title":"Verbindung","text":"
const ws = new WebSocket('ws://localhost:3001/ws');\n\nws.onmessage = (event) => {\n  const msg = JSON.parse(event.data);\n  console.log(msg.type, msg.payload);\n};\n
"},{"location":"api/websocket/#nachrichtenformat","title":"Nachrichtenformat","text":"

Die meisten Broadcasts haben dieses Schema:

{\n  \"type\": \"EVENT_TYPE\",\n  \"payload\": {},\n  \"timestamp\": \"2026-03-10T09:00:00.000Z\"\n}\n

Ausnahme: WS_CONNECTED beim Verbindungsaufbau enth\u00e4lt kein timestamp.

"},{"location":"api/websocket/#event-typen","title":"Event-Typen","text":""},{"location":"api/websocket/#ws_connected","title":"WS_CONNECTED","text":"

Sofort nach erfolgreicher Verbindung.

{\n  \"type\": \"WS_CONNECTED\",\n  \"payload\": {\n    \"connectedAt\": \"2026-03-10T09:00:00.000Z\"\n  }\n}\n
"},{"location":"api/websocket/#pipeline_state_changed","title":"PIPELINE_STATE_CHANGED","text":"

Neuer Pipeline-Snapshot.

{\n  \"type\": \"PIPELINE_STATE_CHANGED\",\n  \"payload\": {\n    \"state\": \"ENCODING\",\n    \"activeJobId\": 42,\n    \"progress\": 62.5,\n    \"eta\": \"00:12:34\",\n    \"statusText\": \"ENCODING 62.50%\",\n    \"context\": {},\n    \"jobProgress\": {\n      \"42\": {\n        \"state\": \"ENCODING\",\n        \"progress\": 62.5,\n        \"eta\": \"00:12:34\",\n        \"statusText\": \"ENCODING 62.50%\"\n      }\n    },\n    \"queue\": {\n      \"maxParallelJobs\": 1,\n      \"runningCount\": 1,\n      \"queuedCount\": 2,\n      \"runningJobs\": [],\n      \"queuedJobs\": []\n    }\n  }\n}\n
"},{"location":"api/websocket/#pipeline_progress","title":"PIPELINE_PROGRESS","text":"

Laufende Fortschrittsupdates.

{\n  \"type\": \"PIPELINE_PROGRESS\",\n  \"payload\": {\n    \"state\": \"ENCODING\",\n    \"activeJobId\": 42,\n    \"progress\": 62.5,\n    \"eta\": \"00:12:34\",\n    \"statusText\": \"ENCODING 62.50%\"\n  }\n}\n
"},{"location":"api/websocket/#pipeline_queue_changed","title":"PIPELINE_QUEUE_CHANGED","text":"

Queue-Snapshot aktualisiert.

"},{"location":"api/websocket/#disc_detected-disc_removed","title":"DISC_DETECTED / DISC_REMOVED","text":"

Disc-Insertion/-Removal.

{\n  \"type\": \"DISC_DETECTED\",\n  \"payload\": {\n    \"device\": {\n      \"path\": \"/dev/sr0\",\n      \"discLabel\": \"INCEPTION\",\n      \"model\": \"ASUS BW-16D1HT\",\n      \"fstype\": \"udf\",\n      \"mountpoint\": null,\n      \"mediaProfile\": \"bluray\"\n    }\n  }\n}\n

mediaProfile: bluray | dvd | other | null

"},{"location":"api/websocket/#hardware_monitor_update","title":"HARDWARE_MONITOR_UPDATE","text":"

Snapshot aus Hardware-Monitoring.

{\n  \"type\": \"HARDWARE_MONITOR_UPDATE\",\n  \"payload\": {\n    \"enabled\": true,\n    \"intervalMs\": 5000,\n    \"updatedAt\": \"2026-03-10T09:00:00.000Z\",\n    \"sample\": {\n      \"cpu\": {},\n      \"memory\": {},\n      \"gpu\": {},\n      \"storage\": {}\n    },\n    \"error\": null\n  }\n}\n
"},{"location":"api/websocket/#pipeline_error","title":"PIPELINE_ERROR","text":"

Fehler bei Disc-Event-Verarbeitung in Pipeline.

"},{"location":"api/websocket/#disk_detection_error","title":"DISK_DETECTION_ERROR","text":"

Fehler in Laufwerkserkennung.

"},{"location":"api/websocket/#settings_updated","title":"SETTINGS_UPDATED","text":"

Einzelnes Setting wurde gespeichert.

"},{"location":"api/websocket/#settings_bulk_updated","title":"SETTINGS_BULK_UPDATED","text":"

Bulk-Settings gespeichert.

{\n  \"type\": \"SETTINGS_BULK_UPDATED\",\n  \"payload\": {\n    \"count\": 3,\n    \"keys\": [\"raw_dir\", \"movie_dir\", \"handbrake_preset_bluray\"]\n  }\n}\n
"},{"location":"api/websocket/#settings_scripts_updated","title":"SETTINGS_SCRIPTS_UPDATED","text":"

Skript ge\u00e4ndert (created|updated|deleted|reordered).

"},{"location":"api/websocket/#settings_script_chains_updated","title":"SETTINGS_SCRIPT_CHAINS_UPDATED","text":"

Skript-Kette ge\u00e4ndert (created|updated|deleted|reordered).

"},{"location":"api/websocket/#user_presets_updated","title":"USER_PRESETS_UPDATED","text":"

User-Preset ge\u00e4ndert (created|updated|deleted).

"},{"location":"api/websocket/#cron_jobs_updated","title":"CRON_JOBS_UPDATED","text":"

Cron-Config ge\u00e4ndert (created|updated|deleted).

"},{"location":"api/websocket/#cron_job_updated","title":"CRON_JOB_UPDATED","text":"

Laufzeitstatus eines Cron-Jobs ge\u00e4ndert.

{\n  \"type\": \"CRON_JOB_UPDATED\",\n  \"payload\": {\n    \"id\": 1,\n    \"lastRunStatus\": \"running\",\n    \"lastRunAt\": \"2026-03-10T10:00:00.000Z\",\n    \"nextRunAt\": null\n  }\n}\n
"},{"location":"api/websocket/#runtime_activity_changed","title":"RUNTIME_ACTIVITY_CHANGED","text":"

Vollst\u00e4ndiger Snapshot aller laufenden und k\u00fcrzlich abgeschlossenen Aktivit\u00e4ten.

Wird ausgel\u00f6st, wenn eine Aktivit\u00e4t gestartet, aktualisiert oder abgeschlossen wird sowie nach clear-recent.

{\n  \"type\": \"RUNTIME_ACTIVITY_CHANGED\",\n  \"payload\": {\n    \"active\": [\n      {\n        \"id\": 7,\n        \"type\": \"chain\",\n        \"name\": \"Post-Encode Aufr\u00e4umen\",\n        \"status\": \"running\",\n        \"source\": \"cron\",\n        \"message\": \"Schritt 2 von 3\",\n        \"currentStep\": \"cleanup.sh\",\n        \"currentStepType\": \"script\",\n        \"stepIndex\": 2,\n        \"stepTotal\": 3,\n        \"canCancel\": true,\n        \"canNextStep\": false,\n        \"outcome\": \"running\",\n        \"startedAt\": \"2026-03-10T10:00:00.000Z\",\n        \"finishedAt\": null,\n        \"durationMs\": null\n      }\n    ],\n    \"recent\": [],\n    \"updatedAt\": \"2026-03-10T10:00:05.000Z\"\n  }\n}\n

Vollst\u00e4ndige Feldbeschreibung: Runtime Activities API.

"},{"location":"api/websocket/#reconnect-verhalten","title":"Reconnect-Verhalten","text":"

useWebSocket verbindet bei Abbruch automatisch neu:

  • Retry-Intervall: 1500ms
  • Wiederverbindung bis Komponente unmounted wird
"},{"location":"appendix/","title":"Technischer Anhang","text":"

Dieser Bereich enth\u00e4lt die technische Referenz hinter dem Benutzerhandbuch.

"},{"location":"appendix/#inhalt","title":"Inhalt","text":"
  • Konfiguration
  • komplette Feldreferenz
  • Umgebungsvariablen
  • Pipeline intern
  • Zustandsmodell
  • Encode-Planung
  • Playlist-Analyse
  • Pre-/Post-Encode-Ausf\u00fchrungen
  • API-Referenz
  • REST-Endpunkte
  • WebSocket-Events
  • Architektur
  • Backend-/Frontend-Aufbau
  • Datenbank
  • Deployment
  • Betrieb in Entwicklung und Produktion
  • Externe Tools
  • MakeMKV, HandBrake, MediaInfo
"},{"location":"appendix/#wann-du-in-den-anhang-wechselst","title":"Wann du in den Anhang wechselst","text":"
  • du integrierst Ripster mit anderen Systemen
  • du betreibst mehrere Instanzen oder willst tiefer debuggen
  • du brauchst Feld-/API-/Schema-Details f\u00fcr Automatisierung
"},{"location":"architecture/","title":"Anhang: Architektur","text":"

Ripster ist eine Client-Server-Anwendung mit REST + WebSocket und externen CLI-Tools.

"},{"location":"architecture/#systemuberblick","title":"System\u00fcberblick","text":"
graph TB\n    subgraph Browser[\"Browser (React)\"]\n        Dashboard[Dashboard]\n        Settings[Einstellungen]\n        History[Historie]\n    end\n\n    subgraph Backend[\"Node.js Backend\"]\n        API[REST API\\nExpress]\n        WS[WebSocket\\n/ws]\n        Pipeline[pipelineService]\n        Cron[cronService]\n        DB[(SQLite)]\n    end\n\n    subgraph Tools[\"Externe Tools\"]\n        MakeMKV[makemkvcon]\n        HandBrake[HandBrakeCLI]\n        MediaInfo[mediainfo]\n    end\n\n    Browser <-->|HTTP| API\n    Browser <-->|WebSocket| WS\n    Pipeline --> MakeMKV\n    Pipeline --> HandBrake\n    Pipeline --> MediaInfo\n    API --> DB\n    Pipeline --> DB\n    Cron --> DB
"},{"location":"architecture/#details","title":"Details","text":"
  • \u00dcbersicht
  • Backend-Services
  • Frontend-Komponenten
  • Datenbank
"},{"location":"architecture/backend/","title":"Backend-Services","text":"

Das Backend ist in Services aufgeteilt, die von Express-Routen orchestriert werden.

"},{"location":"architecture/backend/#pipelineservicejs","title":"pipelineService.js","text":"

Zentrale Workflow-Orchestrierung.

Aufgaben:

  • Pipeline-State-Machine + Persistenz (pipeline_state)
  • Disc-Analyse/Rip/Review/Encode
  • Queue-Management (Jobs + script|chain|wait Eintr\u00e4ge)
  • Retry/Re-Encode/Restart-Flows
  • WebSocket-Broadcasts f\u00fcr State/Progress/Queue

Wichtige Methoden:

  • analyzeDisc()
  • selectMetadata()
  • startPreparedJob()
  • confirmEncodeReview()
  • cancel()
  • retry()
  • reencodeFromRaw()
  • restartReviewFromRaw()
  • restartEncodeWithLastSettings()
  • resumeReadyToEncodeJob()
  • enqueueNonJobEntry(), reorderQueue(), removeQueueEntry()
"},{"location":"architecture/backend/#diskdetectionservicejs","title":"diskDetectionService.js","text":"

Pollt Laufwerk(e) und emittiert:

  • discInserted
  • discRemoved
  • error

Zusatz:

  • Modus auto oder explicit
  • heuristische mediaProfile-Erkennung (bluray/dvd/other)
  • rescanAndEmit() f\u00fcr manuellen Trigger
"},{"location":"architecture/backend/#settingsservicejs","title":"settingsService.js","text":"

Settings-Layer mit Validation/Serialisierung.

Features:

  • getCategorizedSettings() f\u00fcr UI-Form
  • setSettingValue() / setSettingsBulk()
  • profilspezifische Aufl\u00f6sung (resolveEffectiveToolSettings)
  • CLI-Config-Building f\u00fcr MakeMKV/HandBrake/MediaInfo
  • HandBrake-Preset-Liste via HandBrakeCLI -z
  • MakeMKV-Registration-Command aus makemkv_registration_key
"},{"location":"architecture/backend/#historyservicejs","title":"historyService.js","text":"

Historie + Dateioperationen.

Features:

  • Job-Liste/Detail inkl. Log-Tail
  • Orphan-RAW-Erkennung und Import
  • OMDb-Nachzuweisung
  • Dateil\u00f6schung (raw|movie|both)
  • Job-L\u00f6schung (none|raw|movie|both)
"},{"location":"architecture/backend/#cronservicejs","title":"cronService.js","text":"

Integriertes Cron-System ohne externe Parser-Library.

Features:

  • 5-Feld-Cron-Parser + nextRun-Berechnung
  • Quellen: script oder chain
  • Laufzeitlogs (cron_run_logs)
  • manuelles Triggern
  • WebSocket-Events: CRON_JOBS_UPDATED, CRON_JOB_UPDATED
"},{"location":"architecture/backend/#runtimeactivityservicejs","title":"runtimeActivityService.js","text":"

In-Memory-Tracking aller laufenden und k\u00fcrzlich abgeschlossenen Aktivit\u00e4ten (Skripte, Ketten, Cron-Jobs, Tasks).

Features:

  • startActivity(type, payload) \u2192 Aktivit\u00e4t registrieren, ID zur\u00fcckgeben
  • updateActivity(id, patch) \u2192 Laufende Aktivit\u00e4t aktualisieren
  • completeActivity(id, payload) \u2192 Aktivit\u00e4t abschlie\u00dfen und in recent verschieben
  • setControls(id, { cancel, nextStep }) \u2192 Steuer-Handler registrieren (f\u00fcr canCancel/canNextStep)
  • requestCancel(id) / requestNextStep(id) \u2192 Steuer-Handler aufrufen
  • clearRecent() \u2192 Abgeschlossene Aktivit\u00e4ten l\u00f6schen
  • getSnapshot() \u2192 Snapshot mit active + recent + updatedAt
  • Broadcasts RUNTIME_ACTIVITY_CHANGED \u00fcber WebSocket bei jeder \u00c4nderung

Limits:

  • recent max. 120 Eintr\u00e4ge
  • stdout/stderr/output max. 12.000 Zeichen
  • message/errorMessage max. 2.000 Zeichen

Vollst\u00e4ndige API-Dokumentation: Runtime Activities API

"},{"location":"architecture/backend/#weitere-services","title":"Weitere Services","text":"
  • scriptService.js (CRUD + Test + Wrapper-Ausf\u00fchrung)
  • scriptChainService.js (CRUD + Step-Execution)
  • userPresetService.js (HandBrake User-Presets)
  • hardwareMonitorService.js (CPU/RAM/GPU/Storage)
  • websocketService.js (Client-Registry + Broadcast)
  • notificationService.js (PushOver)
  • logger.js (rotierende Datei-Logs)
"},{"location":"architecture/backend/#bootstrapping-srcindexjs","title":"Bootstrapping (src/index.js)","text":"

Beim Start:

  1. DB init/migrate
  2. Pipeline-Init
  3. Cron-Init
  4. Express-Routes + Error-Handler
  5. WebSocket-Server auf /ws
  6. Hardware-Monitoring-Init
  7. Disk-Detection-Start
"},{"location":"architecture/database/","title":"Datenbank","text":"

Ripster verwendet SQLite (backend/data/ripster.db).

"},{"location":"architecture/database/#tabellen","title":"Tabellen","text":"
settings_schema\nsettings_values\njobs\npipeline_state\nscripts\nscript_chains\nscript_chain_steps\nuser_presets\ncron_jobs\ncron_run_logs\n
"},{"location":"architecture/database/#jobs","title":"jobs","text":"

Speichert Pipeline-Lifecycle und Artefakte pro Job.

Zentrale Felder:

  • Metadaten: title, year, imdb_id, poster_url, omdb_json, selected_from_omdb
  • Laufzeit: start_time, end_time, status, last_state
  • Pfade: raw_path, output_path, encode_input_path
  • Tool-Ausgaben: makemkv_info_json, handbrake_info_json, mediainfo_info_json, encode_plan_json
  • Kontrolle: encode_review_confirmed, rip_successful, error_message
  • Audit: created_at, updated_at
"},{"location":"architecture/database/#pipeline_state","title":"pipeline_state","text":"

Singleton-Tabelle (id = 1) f\u00fcr aktiven Snapshot:

  • state
  • active_job_id
  • progress
  • eta
  • status_text
  • context_json
  • updated_at
"},{"location":"architecture/database/#settings_schema-settings_values","title":"settings_schema + settings_values","text":"
  • settings_schema: Definition (Typ, Default, Validation, Reihenfolge)
  • settings_values: aktueller Wert pro Key
"},{"location":"architecture/database/#scripts-script_chains-script_chain_steps","title":"scripts, script_chains, script_chain_steps","text":"
  • scripts: Shell-Skripte (name, script_body, order_index)
  • script_chains: Ketten (name, order_index)
  • script_chain_steps: Schritte je Kette
  • step_type: script oder wait
  • script_id oder wait_seconds
"},{"location":"architecture/database/#user_presets","title":"user_presets","text":"

Benannte HandBrake-Preset-Sets:

  • name
  • media_type (bluray|dvd|other|all)
  • handbrake_preset
  • extra_args
  • description
"},{"location":"architecture/database/#cron_jobs-cron_run_logs","title":"cron_jobs + cron_run_logs","text":"
  • cron_jobs: Zeitplan + Status
  • cron_run_logs: einzelne L\u00e4ufe
  • status: running|success|error
  • output
  • error_message
"},{"location":"architecture/database/#migrationrecovery","title":"Migration/Recovery","text":"

Beim Start werden Schema und Settings-Metadaten automatisch abgeglichen.

Bei korruptem SQLite-File:

  1. Datei wird nach backend/data/corrupt-backups/ verschoben
  2. neue DB wird initialisiert
  3. Schema wird neu aufgebaut
"},{"location":"architecture/database/#direkte-inspektion","title":"Direkte Inspektion","text":"
sqlite3 backend/data/ripster.db\n\n.mode table\nSELECT id, status, title, created_at FROM jobs ORDER BY created_at DESC;\nSELECT key, value FROM settings_values ORDER BY key;\n
"},{"location":"architecture/frontend/","title":"Frontend-Komponenten","text":"

Frontend: React + PrimeReact + Vite.

"},{"location":"architecture/frontend/#hauptseiten","title":"Hauptseiten","text":""},{"location":"architecture/frontend/#dashboardpagejsx","title":"DashboardPage.jsx","text":"

Pipeline-Steuerung:

  • Status/Progress/ETA
  • Metadaten-Dialog
  • Playlist-Entscheidung
  • Review-Panel
  • Queue-Interaktion (reorder/add/remove)
  • Job-Aktionen (Start/Cancel/Retry/Re-Encode)
  • Hardware-Monitoring-Anzeige
"},{"location":"architecture/frontend/#settingspagejsx","title":"SettingsPage.jsx","text":"

Konfiguration:

  • dynamisches Settings-Formular (DynamicSettingsForm)
  • Skripte/Ketten inkl. Reorder/Test
  • User-Presets
  • Cron-Jobs (CronJobsTab)
"},{"location":"architecture/frontend/#historypagejsx","title":"HistoryPage.jsx","text":"

Historie:

  • Job-Liste/Filter
  • Job-Details + Logs
  • OMDb-Nachzuweisung
  • Re-Encode/Restart-Workflows
"},{"location":"architecture/frontend/#wichtige-komponenten","title":"Wichtige Komponenten","text":"
  • PipelineStatusCard.jsx
  • MetadataSelectionDialog.jsx
  • MediaInfoReviewPanel.jsx
  • JobDetailDialog.jsx
  • CronJobsTab.jsx
"},{"location":"architecture/frontend/#api-client-apiclientjs","title":"API-Client (api/client.js)","text":"
  • zentraler request() mit JSON-Handling
  • Fehlerobjekt aus API wird auf Error(message) gemappt
  • VITE_API_BASE default /api
"},{"location":"architecture/frontend/#websocket-hooksusewebsocketjs","title":"WebSocket (hooks/useWebSocket.js)","text":"
  • URL: VITE_WS_URL oder automatisch ws(s)://<host>/ws
  • Auto-Reconnect mit 1500ms Intervall

In App.jsx werden u. a. verarbeitet:

  • PIPELINE_STATE_CHANGED
  • PIPELINE_PROGRESS
  • PIPELINE_QUEUE_CHANGED
  • DISC_DETECTED / DISC_REMOVED
  • HARDWARE_MONITOR_UPDATE
"},{"location":"architecture/frontend/#buildrun","title":"Build/Run","text":"
# dev\nnpm run dev --prefix frontend\n\n# prod build\nnpm run build --prefix frontend\n
"},{"location":"architecture/overview/","title":"Architektur-\u00dcbersicht","text":""},{"location":"architecture/overview/#kernprinzipien","title":"Kernprinzipien","text":""},{"location":"architecture/overview/#event-getriebene-pipeline","title":"Event-getriebene Pipeline","text":"

pipelineService h\u00e4lt einen Snapshot der State-Machine und broadcastet \u00c4nderungen sofort via WebSocket.

State-\u00c4nderung -> PIPELINE_STATE_CHANGED/PIPELINE_PROGRESS -> Frontend-Update\n
"},{"location":"architecture/overview/#service-layer","title":"Service-Layer","text":"
Route -> Service -> DB/Tool-Execution\n

Routes enthalten kaum Business-Logik.

"},{"location":"architecture/overview/#schema-getriebene-settings","title":"Schema-getriebene Settings","text":"

Settings sind DB-schema-getrieben (settings_schema + settings_values), UI rendert dynamisch aus diesen Daten.

"},{"location":"architecture/overview/#echtzeit-kommunikation","title":"Echtzeit-Kommunikation","text":"

WebSocket l\u00e4uft auf /ws.

Wichtige Events:

  • PIPELINE_STATE_CHANGED, PIPELINE_PROGRESS, PIPELINE_QUEUE_CHANGED
  • DISC_DETECTED, DISC_REMOVED
  • HARDWARE_MONITOR_UPDATE
  • SETTINGS_UPDATED, SETTINGS_BULK_UPDATED
  • SETTINGS_SCRIPTS_UPDATED, SETTINGS_SCRIPT_CHAINS_UPDATED, USER_PRESETS_UPDATED
  • CRON_JOBS_UPDATED, CRON_JOB_UPDATED
  • PIPELINE_ERROR, DISK_DETECTION_ERROR
"},{"location":"architecture/overview/#prozessausfuhrung","title":"Prozessausf\u00fchrung","text":"

Externe Tools werden als Child-Processes gestartet (processRunner):

  • Streaming von stdout/stderr
  • Progress-Parsing (progressParsers.js)
  • kontrollierter Abbruch (SIGINT/SIGKILL-Fallback)
"},{"location":"architecture/overview/#persistenz","title":"Persistenz","text":"

SQLite-Datei: backend/data/ripster.db

Kern-Tabellen:

  • jobs, pipeline_state
  • settings_schema, settings_values
  • scripts, script_chains, script_chain_steps
  • user_presets
  • cron_jobs, cron_run_logs

Beim Start werden Schema und Settings-Migrationen automatisch ausgef\u00fchrt.

"},{"location":"architecture/overview/#fehlerbehandlung","title":"Fehlerbehandlung","text":"

Zentrales Error-Handling liefert:

{\n  \"error\": {\n    \"message\": \"...\",\n    \"statusCode\": 400,\n    \"reqId\": \"...\",\n    \"details\": []\n  }\n}\n

Fehlgeschlagene Jobs bleiben in der Historie (ERROR oder CANCELLED) und k\u00f6nnen erneut gestartet werden.

"},{"location":"architecture/overview/#cors-runtime-konfig","title":"CORS & Runtime-Konfig","text":"
  • CORS_ORIGIN default: *
  • LOG_LEVEL default: info
  • DB-/Log-Pfade \u00fcber DB_PATH/LOG_DIR konfigurierbar
"},{"location":"configuration/","title":"Anhang: Konfiguration","text":"

Dieser Abschnitt ist die technische Referenz zu allen Konfigurationsarten in Ripster.

"},{"location":"configuration/#inhalte","title":"Inhalte","text":"
  • Einstellungsreferenz

    Vollst\u00e4ndige Liste aller UI-Settings (Typ, Default, Hinweise).

    Einstellungsreferenz

  • Umgebungsvariablen

    backend/.env und frontend/.env inkl. Priorit\u00e4ten.

    Umgebungsvariablen

"},{"location":"configuration/#zuruck-zum-handbuch","title":"Zur\u00fcck zum Handbuch","text":"
  • Benutzerhandbuch \u00dcberblick
"},{"location":"configuration/environment/","title":"Umgebungsvariablen","text":"

Umgebungsvariablen steuern Backend/Vite au\u00dferhalb der DB-basierten UI-Settings.

"},{"location":"configuration/environment/#backend-backendenv","title":"Backend (backend/.env)","text":"Variable Default (Code) Beschreibung PORT 3001 Express-Port DB_PATH backend/data/ripster.db SQLite-Datei (relativ zu backend/) LOG_DIR backend/logs Fallback-Logverzeichnis (wenn log_dir-Setting nicht gesetzt/lesbar) CORS_ORIGIN * CORS-Origin f\u00fcr API LOG_LEVEL info debug, info, warn, error

Beispiel:

PORT=3001\nDB_PATH=/var/lib/ripster/ripster.db\nLOG_DIR=/var/log/ripster\nCORS_ORIGIN=http://192.168.1.50:5173\nLOG_LEVEL=info\n

Hinweis: backend/.env.example enth\u00e4lt bewusst dev-freundliche Werte (z. B. lokaler CORS_ORIGIN).

"},{"location":"configuration/environment/#frontend-frontendenv","title":"Frontend (frontend/.env)","text":"Variable Default Beschreibung VITE_API_BASE /api API-Basis f\u00fcr Fetch-Client VITE_WS_URL automatisch aus window.location + /ws Optional explizite WebSocket-URL VITE_PUBLIC_ORIGIN leer \u00d6ffentliche Vite-Origin (Remote-Dev) VITE_ALLOWED_HOSTS true Komma-separierte Hostliste f\u00fcr Vite allowedHosts VITE_HMR_PROTOCOL abgeleitet aus VITE_PUBLIC_ORIGIN HMR-Protokoll (ws/wss) VITE_HMR_HOST abgeleitet aus VITE_PUBLIC_ORIGIN HMR-Host VITE_HMR_CLIENT_PORT abgeleitet aus VITE_PUBLIC_ORIGIN HMR-Client-Port

Beispiele:

# lokal (mit Vite-Proxy)\nVITE_API_BASE=/api\n
# remote dev\nVITE_API_BASE=http://192.168.1.50:3001/api\nVITE_WS_URL=ws://192.168.1.50:3001/ws\nVITE_PUBLIC_ORIGIN=http://192.168.1.50:5173\nVITE_ALLOWED_HOSTS=192.168.1.50,ripster.local\nVITE_HMR_PROTOCOL=ws\nVITE_HMR_HOST=192.168.1.50\nVITE_HMR_CLIENT_PORT=5173\n
"},{"location":"configuration/environment/#prioritat","title":"Priorit\u00e4t","text":"
  1. Prozess-Umgebungsvariablen
  2. .env
  3. Code-Defaults
"},{"location":"configuration/settings-reference/","title":"Einstellungsreferenz","text":"

Alle Settings liegen in settings_schema/settings_values und werden \u00fcber die UI verwaltet.

"},{"location":"configuration/settings-reference/#profil-system","title":"Profil-System","text":"

Ripster arbeitet mit Media-Profilen:

  • bluray
  • dvd
  • other

Viele Tool-/Pfad-Settings existieren als Profil-Varianten (*_bluray, *_dvd, *_other).

Wichtig:

  • F\u00fcr raw_dir, movie_dir und die zugeh\u00f6rigen *_owner-Keys gibt es kein Cross-Profil-Fallback.
  • F\u00fcr viele Tool-Keys werden profilspezifische Varianten bevorzugt.
"},{"location":"configuration/settings-reference/#template-platzhalter","title":"Template-Platzhalter","text":"

Datei-/Ordner-Templates unterst\u00fctzen:

  • ${title}
  • ${year}
  • ${imdbId}

Nicht gesetzte Werte werden zu unknown.

"},{"location":"configuration/settings-reference/#kategorie-pfade","title":"Kategorie: Pfade","text":"Key Typ Default raw_dir path data/output/raw raw_dir_bluray path null raw_dir_dvd path null raw_dir_other path null raw_dir_bluray_owner string null raw_dir_dvd_owner string null raw_dir_other_owner string null movie_dir path data/output/movies movie_dir_bluray path null movie_dir_dvd path null movie_dir_other path null movie_dir_bluray_owner string null movie_dir_dvd_owner string null movie_dir_other_owner string null log_dir path data/logs"},{"location":"configuration/settings-reference/#kategorie-laufwerk","title":"Kategorie: Laufwerk","text":"Key Typ Default Hinweis drive_mode select auto auto oder explicit drive_device path /dev/sr0 bei explicit relevant makemkv_source_index number 0 MakeMKV Source-Index disc_poll_interval_ms number 4000 1000..60000"},{"location":"configuration/settings-reference/#kategorie-monitoring","title":"Kategorie: Monitoring","text":"Key Typ Default hardware_monitoring_enabled boolean true hardware_monitoring_interval_ms number 5000"},{"location":"configuration/settings-reference/#kategorie-tools-global","title":"Kategorie: Tools (global)","text":"Key Typ Default makemkv_command string makemkvcon makemkv_registration_key string null mediainfo_command string mediainfo makemkv_min_length_minutes number 60 handbrake_command string HandBrakeCLI handbrake_restart_delete_incomplete_output boolean true pipeline_max_parallel_jobs number 1"},{"location":"configuration/settings-reference/#blu-ray-spezifisch","title":"Blu-ray-spezifisch","text":"Key Typ Default mediainfo_extra_args_bluray string null makemkv_rip_mode_bluray select backup makemkv_analyze_extra_args_bluray string null makemkv_rip_extra_args_bluray string null handbrake_preset_bluray string H.264 MKV 1080p30 handbrake_extra_args_bluray string null output_extension_bluray select mkv filename_template_bluray string ${title} (${year}) output_folder_template_bluray string null"},{"location":"configuration/settings-reference/#dvd-spezifisch","title":"DVD-spezifisch","text":"Key Typ Default mediainfo_extra_args_dvd string null makemkv_rip_mode_dvd select mkv makemkv_analyze_extra_args_dvd string null makemkv_rip_extra_args_dvd string null handbrake_preset_dvd string H.264 MKV 480p30 handbrake_extra_args_dvd string null output_extension_dvd select mkv filename_template_dvd string ${title} (${year}) output_folder_template_dvd string null"},{"location":"configuration/settings-reference/#kategorie-metadaten","title":"Kategorie: Metadaten","text":"Key Typ Default omdb_api_key string null omdb_default_type select movie"},{"location":"configuration/settings-reference/#kategorie-benachrichtigungen-pushover","title":"Kategorie: Benachrichtigungen (PushOver)","text":"Key Typ Default pushover_enabled boolean false pushover_token string null pushover_user string null pushover_device string null pushover_title_prefix string Ripster pushover_priority number 0 pushover_timeout_ms number 7000 pushover_notify_metadata_ready boolean true pushover_notify_rip_started boolean true pushover_notify_encoding_started boolean true pushover_notify_job_finished boolean true pushover_notify_job_error boolean true pushover_notify_job_cancelled boolean true pushover_notify_reencode_started boolean true pushover_notify_reencode_finished boolean true"},{"location":"configuration/settings-reference/#entfernte-legacy-keys","title":"Entfernte Legacy-Keys","text":"

Diese Legacy-Keys werden bei Migration entfernt und sollten nicht mehr genutzt werden:

  • makemkv_backup_mode
  • mediainfo_extra_args
  • makemkv_rip_mode
  • makemkv_analyze_extra_args
  • makemkv_rip_extra_args
  • handbrake_preset
  • handbrake_extra_args
  • output_extension
  • filename_template
  • output_folder_template
  • pushover_notify_disc_detected
"},{"location":"deployment/","title":"Anhang: Deployment","text":"

Technische Betriebsdokumentation f\u00fcr Entwicklung und Produktion.

  • Entwicklungsumgebung

    Lokale Entwicklung mit Hot-Reload.

    Entwicklung

  • Produktion

    Installation und Betrieb auf Servern.

    Produktion

"},{"location":"deployment/development/","title":"Entwicklungsumgebung","text":""},{"location":"deployment/development/#voraussetzungen","title":"Voraussetzungen","text":"
  • Node.js >= 20.19.0
  • externe Tools installiert (makemkvcon, HandBrakeCLI, mediainfo)
"},{"location":"deployment/development/#schnellstart","title":"Schnellstart","text":"
./start.sh\n

Startet:

  • Backend (http://localhost:3001, mit nodemon)
  • Frontend (http://localhost:5173, mit Vite HMR)

Stoppen: Ctrl+C.

"},{"location":"deployment/development/#manuell","title":"Manuell","text":""},{"location":"deployment/development/#backend","title":"Backend","text":"
cd backend\nnpm install\nnpm run dev\n
"},{"location":"deployment/development/#frontend","title":"Frontend","text":"
cd frontend\nnpm install\nnpm run dev\n
"},{"location":"deployment/development/#vite-proxy-dev","title":"Vite-Proxy (Dev)","text":"

frontend/vite.config.js proxied standardm\u00e4\u00dfig:

  • /api -> http://127.0.0.1:3001
  • /ws -> ws://127.0.0.1:3001
"},{"location":"deployment/development/#remote-dev-optional","title":"Remote-Dev (optional)","text":"

Beispiel frontend/.env.local:

VITE_API_BASE=http://192.168.1.100:3001/api\nVITE_WS_URL=ws://192.168.1.100:3001/ws\nVITE_PUBLIC_ORIGIN=http://192.168.1.100:5173\nVITE_ALLOWED_HOSTS=192.168.1.100,ripster.local\nVITE_HMR_PROTOCOL=ws\nVITE_HMR_HOST=192.168.1.100\nVITE_HMR_CLIENT_PORT=5173\n
"},{"location":"deployment/development/#nutzliche-kommandos","title":"N\u00fctzliche Kommandos","text":"
# Root dev (backend + frontend)\nnpm run dev\n\n# einzeln\nnpm run dev:backend\nnpm run dev:frontend\n\n# Frontend Build\nnpm run build:frontend\n
"},{"location":"deployment/production/","title":"Produktions-Deployment","text":""},{"location":"deployment/production/#automatische-installation-empfohlen","title":"Automatische Installation (empfohlen)","text":"

Das mitgelieferte install.sh richtet Ripster vollautomatisch auf Debian/Ubuntu ein \u2013 inklusive Node.js, MakeMKV, HandBrake, nginx und systemd-Dienst.

Unterst\u00fctzte Systeme: Debian 11/12, Ubuntu 22.04/24.04 Voraussetzung: root-Rechte, Internetzugang

"},{"location":"deployment/production/#schnellstart-via-curl","title":"Schnellstart via curl","text":"
curl -fsSL https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh | sudo bash\n

Oder mit wget:

wget -qO- https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh | sudo bash\n

Optionen nur via Datei

Beim Pipen von curl/wget k\u00f6nnen keine Argumente \u00fcbergeben werden. F\u00fcr benutzerdefinierte Optionen zuerst herunterladen und dann mit sudo bash install.sh [Optionen] ausf\u00fchren.

"},{"location":"deployment/production/#optionen","title":"Optionen","text":"Option Standard Beschreibung --branch <branch> main Git-Branch f\u00fcr die Installation --dir <pfad> /opt/ripster Installationsverzeichnis --user <benutzer> ripster Systembenutzer f\u00fcr den Dienst --port <port> 3001 Backend-Port --host <hostname> Auto (Maschinen-IP) Hostname/IP f\u00fcr die Weboberfl\u00e4che --no-makemkv \u2013 MakeMKV-Installation \u00fcberspringen --no-handbrake \u2013 HandBrake-Installation \u00fcberspringen --no-nginx \u2013 nginx-Einrichtung \u00fcberspringen --reinstall \u2013 Bestehende Installation aktualisieren (Daten bleiben erhalten) -h, --help \u2013 Hilfe anzeigen"},{"location":"deployment/production/#beispiele","title":"Beispiele","text":"
# Standard-Installation\nsudo bash install.sh\n\n# Anderen Branch und Port verwenden\nsudo bash install.sh --branch dev --port 8080\n\n# Ohne MakeMKV (bereits installiert)\nsudo bash install.sh --no-makemkv\n\n# Bestehende Installation aktualisieren\nsudo bash install.sh --reinstall\n\n# Ohne nginx (eigener Reverse-Proxy)\nsudo bash install.sh --no-nginx --host mein-server.local\n
"},{"location":"deployment/production/#was-das-skript-erledigt","title":"Was das Skript erledigt","text":"
  1. Systempr\u00fcfung \u2013 OS-Erkennung und Root-Check
  2. Systempakete \u2013 curl, wget, git, mediainfo, udev u. a.
  3. Node.js 20 \u2013 via NodeSource, falls noch nicht installiert
  4. MakeMKV \u2013 aktuelle Version wird aus dem offiziellen Forum ermittelt und aus dem Quellcode kompiliert (kann mit --no-makemkv \u00fcbersprungen werden)
  5. HandBrake \u2013 interaktive Auswahl:
    • Option 1: Standard (apt install handbrake-cli)
    • Option 2: Geb\u00fcndelte GPU-Version mit NVDEC aus bin/HandBrakeCLI
  6. Systembenutzer ripster \u2013 ohne Login-Shell, Gruppen: cdrom, optical, disk, video, render
  7. Repository \u2013 klont Branch nach --dir (bei --reinstall: sichert DB, pullt, stellt DB wieder her)
  8. npm-Abh\u00e4ngigkeiten \u2013 Root, Backend (nur production), Frontend
  9. Frontend-Build \u2013 npm run build mit relativen API-URLs (nginx-kompatibel)
  10. Backend .env \u2013 wird automatisch generiert (bei --reinstall bleibt bestehende erhalten)
  11. Berechtigungen \u2013 ripster:ripster auf Installationsverzeichnis, 600 auf .env
  12. systemd-Dienst \u2013 ripster-backend.service erstellt, aktiviert und gestartet
  13. nginx \u2013 konfiguriert als Reverse-Proxy f\u00fcr Frontend, /api/ und /ws (kann mit --no-nginx \u00fcbersprungen werden)
"},{"location":"deployment/production/#nach-der-installation","title":"Nach der Installation","text":"
# Status pr\u00fcfen\nsudo systemctl status ripster-backend\n\n# Logs verfolgen\nsudo journalctl -u ripster-backend -f\n\n# Neustart\nsudo systemctl restart ripster-backend\n\n# Aktualisieren\nsudo bash /opt/ripster/install.sh --reinstall\n

Zugriff: http://<Maschinen-IP> (oder der mit --host angegebene Hostname)

"},{"location":"deployment/production/#handbrake-modus-gpunvdec","title":"HandBrake-Modus (GPU/NVDEC)","text":"

Bei nicht-interaktiver Ausf\u00fchrung (Pipe von curl) wird automatisch die Standard-Version gew\u00e4hlt. F\u00fcr die GPU-Version zuerst herunterladen:

curl -fsSL https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh -o install.sh\nsudo bash install.sh\n# \u2192 Interaktive Auswahl: Option 2 f\u00fcr NVDEC\n

Das geb\u00fcndelte Binary liegt unter bin/HandBrakeCLI und wird nach /usr/local/bin/HandBrakeCLI kopiert.

"},{"location":"deployment/production/#manuelle-installation","title":"Manuelle Installation","text":"

Die folgenden Abschnitte beschreiben die einzelnen Schritte f\u00fcr manuelle oder angepasste Setups.

"},{"location":"deployment/production/#empfohlene-architektur","title":"Empfohlene Architektur","text":"
Client\n  -> nginx (Reverse Proxy + statisches Frontend)\n    -> Backend API/WebSocket (Node.js, Port 3001)\n

Wichtig: Das Backend serviert im aktuellen Stand keine frontend/dist-Dateien automatisch.

"},{"location":"deployment/production/#1-frontend-builden","title":"1) Frontend builden","text":"
cd frontend\nnpm install\nnpm run build\n

Artefakte liegen in frontend/dist/.

"},{"location":"deployment/production/#2-backend-als-systemd-service","title":"2) Backend als systemd-Service","text":"

Beispiel /etc/systemd/system/ripster-backend.service:

[Unit]\nDescription=Ripster Backend\nAfter=network.target\n\n[Service]\nType=simple\nUser=ripster\nWorkingDirectory=/opt/ripster/backend\nExecStart=/usr/bin/env node src/index.js\nRestart=on-failure\nRestartSec=5\nEnvironment=NODE_ENV=production\nEnvironment=PORT=3001\nEnvironment=LOG_LEVEL=info\n\n[Install]\nWantedBy=multi-user.target\n

Aktivieren:

sudo systemctl daemon-reload\nsudo systemctl enable --now ripster-backend\nsudo systemctl status ripster-backend\n
"},{"location":"deployment/production/#3-nginx-konfigurieren","title":"3) nginx konfigurieren","text":"

Beispiel /etc/nginx/sites-available/ripster:

server {\n    listen 80;\n    server_name ripster.local;\n\n    root /opt/ripster/frontend/dist;\n    index index.html;\n\n    location / {\n        try_files $uri $uri/ /index.html;\n    }\n\n    location /api/ {\n        proxy_pass http://127.0.0.1:3001;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n\n    location /ws {\n        proxy_pass http://127.0.0.1:3001;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $host;\n    }\n}\n

Aktivieren:

sudo ln -s /etc/nginx/sites-available/ripster /etc/nginx/sites-enabled/\nsudo nginx -t\nsudo systemctl reload nginx\n
"},{"location":"deployment/production/#datenbank-backup","title":"Datenbank-Backup","text":"
sqlite3 /opt/ripster/backend/data/ripster.db \\\n  \".backup '/var/backups/ripster-$(date +%Y%m%d).db'\"\n
"},{"location":"deployment/production/#sicherheit","title":"Sicherheit","text":"
  • Ripster hat keine eingebaute Authentifizierung.
  • F\u00fcr externen Zugriff mindestens Basic Auth + TLS + Netzwerksegmentierung/VPN einsetzen.
  • Secrets nicht ins Repo committen (.env, Settings-Felder).
"},{"location":"getting-started/","title":"Benutzerhandbuch \u00dcberblick","text":"

Dieses Kapitel ist f\u00fcr den Betrieb von Ripster im Alltag geschrieben.

"},{"location":"getting-started/#zielgruppe","title":"Zielgruppe","text":"
  • Anwender, die Discs verarbeiten wollen
  • Betreiber, die den t\u00e4glichen Ablauf stabil fahren m\u00f6chten
  • Power-User, die Queue/Skripte/Cron im UI steuern m\u00f6chten
"},{"location":"getting-started/#kapitelstruktur","title":"Kapitelstruktur","text":"Kapitel Zweck Voraussetzungen Pr\u00fcfen, ob System und Tools bereit sind Installation Ripster aufsetzen und starten Ersteinrichtung Pfade, Tools und Metadaten korrekt setzen Erster Lauf Ein kompletter Job von Disc bis Datei GUI-Seiten Alle Ansichten und Aktionen im Detail Workflows Typische Abl\u00e4ufe und Entscheidungen aus User-Sicht"},{"location":"getting-started/#wenn-du-neu-startest","title":"Wenn du neu startest","text":"
  1. Voraussetzungen
  2. Installation
  3. Ersteinrichtung
  4. Erster Lauf
"},{"location":"getting-started/#wenn-ripster-bereits-lauft","title":"Wenn Ripster bereits l\u00e4uft","text":"
  1. GUI-Seiten
  2. Workflows
  3. Bei Detailfragen: Technischer Anhang
"},{"location":"getting-started/configuration/","title":"Ersteinrichtung","text":"

Nach der Installation erfolgt die t\u00e4gliche Konfiguration fast vollst\u00e4ndig in der GUI unter Settings.

"},{"location":"getting-started/configuration/#ziel","title":"Ziel","text":"

Vor dem ersten echten Job m\u00fcssen Pfade, Tools und Metadatenzugriff sauber gesetzt sein.

"},{"location":"getting-started/configuration/#reihenfolge-empfohlen","title":"Reihenfolge (empfohlen)","text":""},{"location":"getting-started/configuration/#1-settings-tab-konfiguration","title":"1. Settings -> Tab Konfiguration","text":"

Setze zuerst diese Pflichtwerte:

Bereich Wichtige Felder Pfade raw_dir, movie_dir, log_dir Tools makemkv_command, handbrake_command, mediainfo_command Metadaten omdb_api_key, optional omdb_default_type

Danach \u00c4nderungen speichern.

"},{"location":"getting-started/configuration/#2-medienprofile-prufen","title":"2. Medienprofile pr\u00fcfen","text":"

Wenn du Blu-ray und DVD unterschiedlich behandeln willst, pflege die profilbezogenen Felder:

  • *_bluray
  • *_dvd
  • optional *_other

Typische Beispiele:

  • handbrake_preset_bluray und handbrake_preset_dvd
  • raw_dir_bluray und raw_dir_dvd
  • filename_template_bluray und filename_template_dvd
"},{"location":"getting-started/configuration/#3-queue-und-monitoring-festlegen","title":"3. Queue und Monitoring festlegen","text":"
  • pipeline_max_parallel_jobs f\u00fcr parallele Jobs
  • hardware_monitoring_enabled und Intervall f\u00fcr Live-Metriken im Dashboard
"},{"location":"getting-started/configuration/#4-optional-push-benachrichtigungen","title":"4. Optional: Push-Benachrichtigungen","text":"

In den Benachrichtigungsfeldern setzen:

  • pushover_enabled
  • pushover_token
  • pushover_user

Dann \u00fcber PushOver Test direkt pr\u00fcfen.

"},{"location":"getting-started/configuration/#2-minuten-funktionstest","title":"2-Minuten-Funktionstest","text":"
  1. Dashboard \u00f6ffnen
  2. Disc einlegen
  3. Analyse starten
  4. Metadaten \u00fcbernehmen
  5. Bis READY_TO_ENCODE laufen lassen

Wenn diese Schritte funktionieren, ist die Grundkonfiguration korrekt.

"},{"location":"getting-started/configuration/#wenn-werte-nicht-gespeichert-werden","title":"Wenn Werte nicht gespeichert werden","text":"
  • Feld mit Fehler markieren lassen (rote Validierung im Formular)
  • Pfadangaben und numerische Werte pr\u00fcfen
  • bei Tool-Pfaden direkt CLI-Aufruf im Terminal testen
"},{"location":"getting-started/configuration/#weiter","title":"Weiter","text":"
  • Erster Lauf
  • GUI-Seiten im Detail
"},{"location":"getting-started/installation/","title":"Installation","text":"

Die empfohlene Installation l\u00e4uft \u00fcber install.sh und richtet Ripster vollst\u00e4ndig ein.

"},{"location":"getting-started/installation/#zielbild-nach-der-installation","title":"Zielbild nach der Installation","text":"
  • Ripster-Backend als systemd-Dienst
  • Frontend \u00fcber nginx erreichbar
  • UI auf http://<Server-IP>
"},{"location":"getting-started/installation/#schritt-fur-schritt","title":"Schritt-f\u00fcr-Schritt","text":""},{"location":"getting-started/installation/#1-installationsskript-herunterladen","title":"1. Installationsskript herunterladen","text":"
wget -qO install.sh https://raw.githubusercontent.com/Mboehmlaender/ripster/main/install.sh\n
"},{"location":"getting-started/installation/#2-installation-ausfuhren","title":"2. Installation ausf\u00fchren","text":"
sudo bash install.sh\n

W\u00e4hrend der Installation wirst du nach dem HandBrake-Modus gefragt:

  • 1 Standard (apt)
  • 2 GPU/NVDEC (geb\u00fcndeltes Binary)
"},{"location":"getting-started/installation/#3-dienststatus-prufen","title":"3. Dienststatus pr\u00fcfen","text":"
sudo systemctl status ripster-backend\n
"},{"location":"getting-started/installation/#4-weboberflache-offnen","title":"4. Weboberfl\u00e4che \u00f6ffnen","text":"
  • Mit nginx: http://<Server-IP>
  • Ohne nginx (--no-nginx): API auf http://<Server-IP>:3001/api
"},{"location":"getting-started/installation/#wichtige-optionen","title":"Wichtige Optionen","text":"Option Zweck --branch <branch> anderen Branch installieren --dir <pfad> Installationsverzeichnis \u00e4ndern --port <port> Backend-Port setzen --host <hostname> Hostname/IP f\u00fcr nginx/CORS --no-makemkv MakeMKV nicht installieren --no-handbrake HandBrake nicht installieren --no-nginx nginx-Konfiguration \u00fcberspringen --reinstall Update einer bestehenden Installation

Beispiele:

sudo bash install.sh --branch dev\nsudo bash install.sh --port 8080 --host ripster.local\nsudo bash install.sh --reinstall\n
"},{"location":"getting-started/installation/#betrieb-im-alltag","title":"Betrieb im Alltag","text":"
# Logs live ansehen\nsudo journalctl -u ripster-backend -f\n\n# Dienst neu starten\nsudo systemctl restart ripster-backend\n\n# Update aus bestehender Installation\nsudo bash /opt/ripster/install.sh --reinstall\n
"},{"location":"getting-started/installation/#haufige-stolperstellen","title":"H\u00e4ufige Stolperstellen","text":"
  • Permission denied am Laufwerk: Laufwerksrechte/Gruppen pr\u00fcfen
  • Tools nicht gefunden: makemkvcon, HandBrakeCLI, mediainfo im PATH pr\u00fcfen
  • UI nicht erreichbar: nginx-Status und Port/Firewall pr\u00fcfen
"},{"location":"getting-started/installation/#danach-weiter","title":"Danach weiter","text":"
  1. Ersteinrichtung
  2. Erster Lauf
"},{"location":"getting-started/prerequisites/","title":"Voraussetzungen","text":"

Diese Seite ist die praktische Checkliste vor der Installation.

"},{"location":"getting-started/prerequisites/#1-system","title":"1) System","text":"Punkt Mindestwert Empfehlung Betriebssystem Linux oder macOS Ubuntu 22.04+ Node.js 20.19.0 20.x LTS RAM 4 GB 8 GB+ Freier Speicher 50 GB 500 GB+

Node-Version pr\u00fcfen:

node --version\n
"},{"location":"getting-started/prerequisites/#2-externe-tools","title":"2) Externe Tools","text":"

Ripster ben\u00f6tigt folgende CLI-Tools im PATH:

  • makemkvcon
  • HandBrakeCLI
  • mediainfo

Schnell pr\u00fcfen:

makemkvcon --version\nHandBrakeCLI --version\nmediainfo --Version\n
"},{"location":"getting-started/prerequisites/#3-optisches-laufwerk","title":"3) Optisches Laufwerk","text":"

F\u00fcr Disc-Betrieb muss ein DVD/Blu-ray-Laufwerk erreichbar sein.

ls /dev/sr*\nlsblk | grep rom\n

Wenn n\u00f6tig Rechte setzen (Beispiel):

sudo chmod a+rw /dev/sr0\n
"},{"location":"getting-started/prerequisites/#4-omdb-api-key","title":"4) OMDb API-Key","text":"

F\u00fcr automatische Metadaten (Titel, Poster, IMDb-ID):

  1. Key unter omdbapi.com anlegen
  2. in den Settings als omdb_api_key eintragen
"},{"location":"getting-started/prerequisites/#5-optional-pushover","title":"5) Optional: PushOver","text":"

F\u00fcr Push-Nachrichten bei Erfolg/Fehler:

  • Account/App auf pushover.net
  • pushover_token und pushover_user sp\u00e4ter in den Settings setzen
"},{"location":"getting-started/prerequisites/#abschluss-checkliste","title":"Abschluss-Checkliste","text":"
  • [ ] Node.js 20.x verf\u00fcgbar
  • [ ] makemkvcon, HandBrakeCLI, mediainfo ausf\u00fchrbar
  • [ ] Laufwerk erkannt
  • [ ] OMDb Key bereit
"},{"location":"getting-started/quickstart/","title":"Erster Lauf","text":"

Dieser Ablauf zeigt einen vollst\u00e4ndigen Job aus Anwendersicht: von Disc-Erkennung bis fertiger Datei.

"},{"location":"getting-started/quickstart/#1-dashboard-offnen-und-disc-einlegen","title":"1. Dashboard \u00f6ffnen und Disc einlegen","text":"

Erwartung:

  • Status wechselt auf DISC_DETECTED bzw. Medium erkannt
  • im Bereich Disk-Information sind Laufwerksdaten sichtbar

Wenn nichts passiert: Laufwerk neu lesen.

"},{"location":"getting-started/quickstart/#2-analyse-starten","title":"2. Analyse starten","text":"

Aktion im Dashboard:

  • Analyse starten

Erwartung:

  • Status ANALYZING
  • danach Metadaten-Dialog
"},{"location":"getting-started/quickstart/#3-metadaten-auswahlen","title":"3. Metadaten ausw\u00e4hlen","text":"

Im Dialog Metadaten ausw\u00e4hlen:

  1. OMDb-Suche nutzen oder manuell eintragen
  2. passenden Treffer markieren
  3. Auswahl \u00fcbernehmen
"},{"location":"getting-started/quickstart/#4-auf-den-nachsten-zustand-reagieren","title":"4. Auf den n\u00e4chsten Zustand reagieren","text":"
  • Normalfall ohne vorhandenes RAW: RIPPING -> MEDIAINFO_CHECK -> READY_TO_ENCODE
  • bei vorhandenem RAW: direkt MEDIAINFO_CHECK -> READY_TO_ENCODE
  • bei unklarer Blu-ray-Playlist: WAITING_FOR_USER_DECISION (Playlist ausw\u00e4hlen und \u00fcbernehmen)
"},{"location":"getting-started/quickstart/#5-review-in-ready_to_encode","title":"5. Review in READY_TO_ENCODE","text":"

Im aufgeklappten Job (Pipeline-Status):

  • Encode-Titel w\u00e4hlen
  • Audio-/Subtitle-Spuren pr\u00fcfen
  • optional User-Preset ausw\u00e4hlen
  • optional Pre-/Post-Skripte bzw. Ketten hinzuf\u00fcgen

Dann Encoding starten.

"},{"location":"getting-started/quickstart/#6-encoding-uberwachen","title":"6. Encoding \u00fcberwachen","text":"

W\u00e4hrend ENCODING:

  • Fortschritt + ETA im Dashboard
  • Live-Log im Pipeline-Status
  • Queue- und Skript/Cron-Status parallel beobachtbar
"},{"location":"getting-started/quickstart/#7-ergebnis-prufen","title":"7. Ergebnis pr\u00fcfen","text":"

Bei FINISHED:

  1. Seite Historie \u00f6ffnen
  2. Job in Details \u00f6ffnen
  3. Output-Pfad, Status und Log pr\u00fcfen
"},{"location":"getting-started/quickstart/#typische-folgeaktionen","title":"Typische Folgeaktionen","text":"
  • Falsches OMDb-Match: in Historie -> OMDb neu zuordnen
  • Neue Encodierung aus RAW: RAW neu encodieren
  • Pr\u00fcfung komplett neu aufbauen: Review neu starten
"},{"location":"gui/","title":"GUI-Seiten","text":"

Ripster hat drei Hauptseiten in der Navigation plus eine Expert-Seite.

"},{"location":"gui/#seitenuberblick","title":"Seiten\u00fcberblick","text":"Seite Zweck Dashboard Live-Betrieb: Pipeline, Queue, Aktivit\u00e4ten, Disc-Infos Settings Konfiguration, Skripte, Ketten, Presets, Cronjobs Historie abgeschlossene/laufende Jobs durchsuchen und nachbearbeiten Database (Expert) tabellarische Rohsicht inkl. Orphan-RAW-Import"},{"location":"gui/#empfohlene-nutzung-im-alltag","title":"Empfohlene Nutzung im Alltag","text":"
  1. Start eines neuen Jobs: Dashboard
  2. Regeln/Automatisierung anpassen: Settings
  3. Ergebnisse pr\u00fcfen oder Jobs nachbearbeiten: Historie
  4. Sonderf\u00e4lle/Recovery: Database
"},{"location":"gui/#hinweise-zur-navigation","title":"Hinweise zur Navigation","text":"
  • Dashboard, Settings, Historie sind direkt in der Kopfnavigation.
  • Database ist als Expert-Route verf\u00fcgbar: /database.
"},{"location":"gui/dashboard/","title":"Dashboard","text":"

Das Dashboard ist die Betriebszentrale f\u00fcr laufende Jobs.

"},{"location":"gui/dashboard/#aufbau-der-seite","title":"Aufbau der Seite","text":"

Die Bereiche erscheinen in dieser Reihenfolge:

  1. Hardware Monitoring
  2. Job Queue
  3. Skript- / Cron-Status
  4. Job \u00dcbersicht
  5. Disk-Information
"},{"location":"gui/dashboard/#1-hardware-monitoring","title":"1) Hardware Monitoring","text":"

Zeigt live:

  • CPU (gesamt + optional pro Kern)
  • RAM
  • GPU-Auslastung/Temperatur/VRAM
  • freien Speicher in den konfigurierten Pfaden

Wichtig f\u00fcr den Betrieb:

  • Hohe Speicherauslastung oder fast volle Zielpfade fr\u00fch erkennen
  • \u00fcber Settings aktivierbar/deaktivierbar (hardware_monitoring_*)
"},{"location":"gui/dashboard/#2-job-queue","title":"2) Job Queue","text":"

Zwei Spalten:

  • Laufende Jobs
  • Warteschlange

M\u00f6gliche Aktionen:

  • Queue per Drag-and-Drop umsortieren
  • Queue-Job entfernen (X)
  • zus\u00e4tzliche Queue-Elemente einf\u00fcgen (+):
  • Skript
  • Skriptkette
  • Wartezeit

Hinweis:

  • Parallel zeigt das aktuell konfigurierte Parallel-Limit (pipeline_max_parallel_jobs).
"},{"location":"gui/dashboard/#3-skript-cron-status","title":"3) Skript- / Cron-Status","text":"

Zeigt:

  • aktive Ausf\u00fchrungen (Skripte, Ketten, Cron)
  • zuletzt abgeschlossene Ausf\u00fchrungen

M\u00f6gliche Aktionen:

  • laufende Ketten: N\u00e4chster Schritt
  • laufende Eintr\u00e4ge: Abbrechen
  • Historie der Aktivit\u00e4ten: Liste leeren
"},{"location":"gui/dashboard/#4-job-ubersicht","title":"4) Job \u00dcbersicht","text":"

Kompakte Jobliste mit Status, Fortschritt, ETA. Klick auf einen Job klappt die Detailsteuerung auf.

Im aufgeklappten Zustand erscheint die Karte Pipeline-Status mit allen zustandsabh\u00e4ngigen Aktionen.

"},{"location":"gui/dashboard/#zustandsabhangige-hauptaktionen","title":"Zustandsabh\u00e4ngige Hauptaktionen","text":"Zustand Typische Aktion DISC_DETECTED / IDLE Analyse starten METADATA_SELECTION Metadaten \u00f6ffnen WAITING_FOR_USER_DECISION Playlist w\u00e4hlen und Playlist \u00fcbernehmen READY_TO_START Job starten READY_TO_ENCODE Tracks/Skripte pr\u00fcfen, dann Encoding starten laufend (ANALYZING/RIPPING/ENCODING) Abbrechen ERROR / CANCELLED Retry Rippen, Disk-Analyse neu starten

Zus\u00e4tzlich je nach Job:

  • Review neu starten
  • Encode neu starten
  • Aus Queue l\u00f6schen
"},{"location":"gui/dashboard/#titel-spurprufung-ready_to_encode","title":"Titel-/Spurpr\u00fcfung (READY_TO_ENCODE)","text":"

Im selben Block siehst du:

  • Auswahl des Encode-Titels
  • Audio-/Subtitle-Trackauswahl
  • User-Preset-Auswahl
  • Pre-/Post-Encode-Skripte und Ketten
  • Preview des finalen HandBrakeCLI-Befehls
"},{"location":"gui/dashboard/#5-disk-information","title":"5) Disk-Information","text":"

Zeigt aktuelles Laufwerk und Disc-Metadaten (Pfad, Modell, Disc-Label, Mount).

Aktionen:

  • Laufwerk neu lesen
  • Disk neu analysieren
  • Metadaten-Modal \u00f6ffnen
"},{"location":"gui/dashboard/#wichtige-dialoge-im-dashboard","title":"Wichtige Dialoge im Dashboard","text":""},{"location":"gui/dashboard/#metadaten-auswahlen","title":"Metadaten ausw\u00e4hlen","text":"
  • OMDb-Suche + Ergebnisliste
  • manuelle Eingabe als Fallback
  • Auswahl \u00fcbernehmen startet den n\u00e4chsten Pipeline-Schritt
"},{"location":"gui/dashboard/#abbruch-bereinigung","title":"Abbruch-Bereinigung","text":"

Nach Abbruch kann Ripster optional fragen, ob erzeugte RAW- oder Movie-Dateien gel\u00f6scht werden sollen.

"},{"location":"gui/dashboard/#queue-eintrag-einfugen","title":"Queue-Eintrag einf\u00fcgen","text":"

Erstellt gezielt einen Skript-, Ketten- oder Warte-Eintrag an einer bestimmten Queue-Position.

"},{"location":"gui/database/","title":"Database (Expert)","text":"

/database ist eine erweiterte Ansicht f\u00fcr Power-User und Recovery-F\u00e4lle.

"},{"location":"gui/database/#zugriff","title":"Zugriff","text":"
  • Route direkt aufrufen: /database
  • nicht Teil der Standard-Navigation
"},{"location":"gui/database/#bereiche","title":"Bereiche","text":""},{"location":"gui/database/#1-historie-datenbank","title":"1) Historie & Datenbank","text":"

Tabellarische Jobansicht mit:

  • ID, Poster, Medium, Titel
  • Status
  • Start/Ende

Aktionen im Detaildialog entsprechen weitgehend der Seite Historie (inkl. Re-Encode, Review-Neustart, OMDb-Zuordnung, Dateil\u00f6schung).

"},{"location":"gui/database/#2-raw-ohne-historie","title":"2) RAW ohne Historie","text":"

Listet RAW-Ordner, die keinen zugeh\u00f6rigen Job-Eintrag haben.

Aktionen:

  • RAW pr\u00fcfen (Scan der konfigurierten RAW-Pfade)
  • Job anlegen (Orphan-RAW in Historie importieren)
"},{"location":"gui/database/#typischer-einsatz","title":"Typischer Einsatz","text":"
  • nach manuellen Dateioperationen
  • nach Migrationen oder Recovery
  • wenn RAW-Dateien vorhanden sind, aber kein Historieneintrag existiert
"},{"location":"gui/database/#vorsicht","title":"Vorsicht","text":"

Diese Seite erlaubt Eingriffe mit direkter Auswirkung auf Datenbestand und Historie. Vor L\u00f6sch- oder Importaktionen Pfade und Zieljob sorgf\u00e4ltig pr\u00fcfen.

"},{"location":"gui/history/","title":"Historie","text":"

Die Seite Historie ist f\u00fcr Suche, Pr\u00fcfung und Nachbearbeitung bestehender Jobs.

"},{"location":"gui/history/#hauptansicht","title":"Hauptansicht","text":"

Filter und Werkzeuge:

  • Suche (Titel/IMDb)
  • Status-Filter
  • Medium-Filter (Blu-ray, DVD, Sonstiges)
  • Sortierung
  • Listen-/Grid-Layout

Jeder Eintrag zeigt:

  • Poster, Titel, Jahr, IMDb
  • Medium-Indikator
  • Status
  • Start/Ende
  • Verf\u00fcgbarkeit von RAW/Movie
  • Ratings (wenn OMDb-Daten vorhanden)

Klick auf einen Eintrag \u00f6ffnet die Detailansicht.

"},{"location":"gui/history/#job-detaildialog","title":"Job-Detaildialog","text":"

Bereiche:

  • Film-Infos + OMDb-Details
  • Job-Infos (Status, Pfade, Erfolgsflags, Fehler)
  • hinterlegte Encode-Auswahl
  • ausgef\u00fchrter HandBrake-Befehl
  • strukturierte JSON-Bl\u00f6cke (OMDb/MakeMKV/MediaInfo/EncodePlan/HandBrake)
  • Log-Ladefunktionen (Tail, Vollst\u00e4ndig)
"},{"location":"gui/history/#typische-aktionen-im-detaildialog","title":"Typische Aktionen im Detaildialog","text":"
  • OMDb neu zuordnen
  • Encode neu starten
  • Review neu starten
  • RAW neu encodieren
  • RAW l\u00f6schen, Movie l\u00f6schen, Beides l\u00f6schen
  • Historieneintrag l\u00f6schen
  • bei Queue-Lock: Aus Queue l\u00f6schen
"},{"location":"gui/history/#wann-welche-aktion","title":"Wann welche Aktion?","text":"Ziel Aktion Metadaten korrigieren OMDb neu zuordnen mit gleicher best\u00e4tigter Auswahl neu encodieren Encode neu starten Titel-/Spurpr\u00fcfung komplett neu berechnen Review neu starten aus vorhandenem RAW erneut encodieren RAW neu encodieren Speicher freigeben Dateil\u00f6schaktionen"},{"location":"gui/history/#logs","title":"Logs","text":"
  • Tail laden (800) f\u00fcr schnelle Fehleranalyse
  • Vollst\u00e4ndiges Log laden f\u00fcr vollst\u00e4ndige Nachverfolgung
"},{"location":"gui/settings/","title":"Settings","text":"

Die Seite Settings steuert Konfiguration und Automatisierung.

"},{"location":"gui/settings/#tabs-im-uberblick","title":"Tabs im \u00dcberblick","text":"Tab Zweck Konfiguration alle Kernsettings (Pfade, Tools, Monitoring, Metadaten, Queue, Benachrichtigungen) Scripte einzelne Bash-Skripte verwalten und testen Skriptketten Sequenzen aus Skript- und Warte-Schritten bauen Encode-Presets benutzerdefinierte Presets f\u00fcr das Review im Dashboard Cronjobs zeitgesteuerte Skript-/Kettenausf\u00fchrung"},{"location":"gui/settings/#tab-konfiguration","title":"Tab Konfiguration","text":"

Wichtiges Bedienmuster:

  1. Werte \u00e4ndern
  2. \u00c4nderungen speichern
  3. bei Bedarf \u00c4nderungen verwerfen oder Neu laden

Zus\u00e4tzlich:

  • PushOver Test sendet eine Testnachricht
  • \u00c4nderungen werden erst nach Speichern wirksam
  • Tool-Preset-Felder bieten HandBrake-Presetauswahl direkt im Formular
"},{"location":"gui/settings/#tab-scripte","title":"Tab Scripte","text":"

Funktionen:

  • Skript anlegen, bearbeiten, l\u00f6schen
  • Skript testen (Test)
  • Reihenfolge per Drag-and-Drop

Praxis:

  • Reihenfolge ist wichtig, weil ausgew\u00e4hlte Skripte sp\u00e4ter sequentiell abgearbeitet werden.
  • Testresultate zeigen Exit-Code, Dauer und stdout/stderr.
"},{"location":"gui/settings/#tab-skriptketten","title":"Tab Skriptketten","text":"

Funktionen:

  • Kette anlegen/bearbeiten/l\u00f6schen
  • Kette testen
  • Reihenfolge der Ketten per Drag-and-Drop

Im Ketten-Editor:

  • Bausteine links (Warten, vorhandene Skripte)
  • Schritte rechts per Klick oder Drag-and-Drop hinzuf\u00fcgen
  • Schrittreihenfolge im Canvas \u00e4ndern
"},{"location":"gui/settings/#tab-encode-presets","title":"Tab Encode-Presets","text":"

Ein Preset b\u00fcndelt:

  • optional HandBrake-Preset (-Z)
  • optionale Extra-Args
  • Medientyp (Universell, Blu-ray, DVD, Sonstiges)

Verwendung:

  • Diese Presets erscheinen sp\u00e4ter im Dashboard im Review (READY_TO_ENCODE).
"},{"location":"gui/settings/#tab-cronjobs","title":"Tab Cronjobs","text":"

Funktionen:

  • Cronjob anlegen und bearbeiten
  • Quelle w\u00e4hlen: Skript oder Skriptkette
  • Cron-Ausdruck validieren
  • Jetzt ausf\u00fchren
  • Logs je Cronjob anzeigen
  • Aktiviert und Pushover toggeln

Hilfen:

  • Beispiele f\u00fcr Cron-Ausdr\u00fccke direkt im Dialog
  • Link zu crontab.guru im Editor
"},{"location":"gui/settings/#empfehlung-fur-stabile-nutzung","title":"Empfehlung f\u00fcr stabile Nutzung","text":"
  1. Erst Konfiguration sauber setzen
  2. dann Skripte/Ketten testen
  3. danach Cronjobs aktivieren
"},{"location":"pipeline/","title":"Anhang: Pipeline intern","text":"

Dieser Abschnitt beschreibt die technische Pipeline-Logik hinter den UI-Workflows.

  • Workflow & Zust\u00e4nde

    Zustandsmodell, \u00dcberg\u00e4nge, Queue-Verhalten.

    Workflow

  • Encode-Planung

    Aufbereitung von Titeln/Tracks und Best\u00e4tigungslogik.

    Encoding

  • Playlist-Analyse

    Bewertung mehrdeutiger Blu-ray-Playlists.

    Playlist-Analyse

  • Pre-/Post-Encode-Ausf\u00fchrungen

    Skript- und Kettenlauf vor/nach dem Encoding.

    Encode-Skripte

"},{"location":"pipeline/#zuruck-zum-handbuch","title":"Zur\u00fcck zum Handbuch","text":"
  • Workflows aus Nutzersicht
"},{"location":"pipeline/encoding/","title":"Encode-Planung & Track-Auswahl","text":"

Ripster erzeugt vor dem Encode einen encodePlan und l\u00e4sst ihn im Review-Panel best\u00e4tigen.

"},{"location":"pipeline/encoding/#ablauf","title":"Ablauf","text":"
Quelle bestimmen (Disc/RAW)\n  -> HandBrake-Scan (--scan --json)\n  -> Plan erstellen (Titel, Audio, Untertitel)\n  -> READY_TO_ENCODE\n  -> Benutzer best\u00e4tigt Auswahl\n  -> finaler HandBrake-Aufruf\n
"},{"location":"pipeline/encoding/#review-inhalt-ready_to_encode","title":"Review-Inhalt (READY_TO_ENCODE)","text":"
  • ausw\u00e4hlbarer Encode-Titel
  • Audio-Track-Selektion
  • Untertitel-Track-Selektion inkl. Flags
  • burnIn
  • forced
  • defaultTrack
  • optionale User-Presets (HandBrake-Preset + Extra-Args)
  • optionale Pre-/Post-Skripte und Ketten
"},{"location":"pipeline/encoding/#bestatigung-confirm-encode","title":"Best\u00e4tigung (confirm-encode)","text":"

Typischer Payload:

{\n  \"selectedEncodeTitleId\": 1,\n  \"selectedTrackSelection\": {\n    \"1\": {\n      \"audioTrackIds\": [1, 2],\n      \"subtitleTrackIds\": [3]\n    }\n  },\n  \"selectedPreEncodeScriptIds\": [1],\n  \"selectedPostEncodeScriptIds\": [2],\n  \"selectedPreEncodeChainIds\": [3],\n  \"selectedPostEncodeChainIds\": [4],\n  \"selectedUserPresetId\": 5\n}\n

Ripster speichert die best\u00e4tigte Auswahl in jobs.encode_plan_json und markiert encode_review_confirmed = 1.

"},{"location":"pipeline/encoding/#handbrake-aufruf","title":"HandBrake-Aufruf","text":"

Grundstruktur:

HandBrakeCLI \\\n  -i <input> \\\n  -o <output> \\\n  -t <titleId> \\\n  -Z \"<preset>\" \\\n  <extra-args> \\\n  -a <audioTrackIds|none> \\\n  -s <subtitleTrackIds|none>\n

Untertitel-Flags werden bei Bedarf erg\u00e4nzt:

  • --subtitle-burned=<id>
  • --subtitle-default=<id>
  • --subtitle-forced=<id> oder --subtitle-forced
"},{"location":"pipeline/encoding/#pre-post-encode-ausfuhrungen","title":"Pre-/Post-Encode-Ausf\u00fchrungen","text":"
  • Pre-Encode l\u00e4uft vor HandBrake
  • Post-Encode l\u00e4uft nach HandBrake

Verhalten bei Fehlern:

  • Pre-Encode-Fehler: Job wird als ERROR beendet (Encode startet nicht)
  • Post-Encode-Fehler: Job kann FINISHED bleiben, enth\u00e4lt aber Fehlerhinweis/Script-Summary
"},{"location":"pipeline/encoding/#dateinamenordner","title":"Dateinamen/Ordner","text":"

Der finale Outputpfad wird aus Settings-Templates aufgebaut.

Platzhalter:

  • ${title}
  • ${year}
  • ${imdbId}

Ung\u00fcltige Dateizeichen werden sanitisiert.

"},{"location":"pipeline/playlist-analysis/","title":"Playlist-Analyse","text":"

Ripster analysiert bei Blu-ray-\u00e4hnlichen Quellen Playlists und fordert bei Mehrdeutigkeit eine manuelle Auswahl an.

"},{"location":"pipeline/playlist-analysis/#ziel","title":"Ziel","text":"

Erkennen, welche Playlist wahrscheinlich der Hauptfilm ist, statt versehentlich eine Fake-/Dummy-Playlist zu verwenden.

"},{"location":"pipeline/playlist-analysis/#eingabedaten","title":"Eingabedaten","text":"

Die Analyse basiert auf MakeMKV-Infos (u. a. Playlist-/Segment-Struktur, Laufzeiten, Titelzuordnung).

"},{"location":"pipeline/playlist-analysis/#auswertung-vereinfacht","title":"Auswertung (vereinfacht)","text":"

F\u00fcr Kandidaten werden u. a. ber\u00fccksichtigt:

  • Laufzeit
  • Segment-Reihenfolge
  • R\u00fcckw\u00e4rtsspr\u00fcnge/gro\u00dfe Spr\u00fcnge
  • Koh\u00e4renz linearer Segmentfolgen
  • Duplikatgruppen mit \u00e4hnlicher Laufzeit

Daraus entstehen:

  • candidates
  • evaluatedCandidates (inkl. Score/Label)
  • recommendation
  • manualDecisionRequired
"},{"location":"pipeline/playlist-analysis/#wann-muss-der-benutzer-entscheiden","title":"Wann muss der Benutzer entscheiden?","text":"

Wenn nach Filterung mehr als ein relevanter Kandidat \u00fcbrig bleibt, setzt Ripster manualDecisionRequired = true und wechselt auf:

  • WAITING_FOR_USER_DECISION

Dann muss eine Playlist best\u00e4tigt werden, bevor der Workflow weiterl\u00e4uft.

"},{"location":"pipeline/playlist-analysis/#konfigurationseinfluss","title":"Konfigurationseinfluss","text":"Key Wirkung makemkv_min_length_minutes Mindestlaufzeit f\u00fcr Kandidaten

Default ist aktuell 60 Minuten.

"},{"location":"pipeline/playlist-analysis/#ui-verhalten","title":"UI-Verhalten","text":"

Bei manueller Entscheidung zeigt das Dashboard Kandidaten inkl. Score/Bewertung und markiert eine Empfehlung.

Nach Best\u00e4tigung:

  • mit vorhandenem RAW -> zur\u00fcck zu MEDIAINFO_CHECK
  • ohne RAW -> Startpfad \u00fcber READY_TO_START/RIPPING
"},{"location":"pipeline/post-encode-scripts/","title":"Encode-Skripte (Pre & Post)","text":"

Ripster kann Skripte und Skript-Ketten vor und nach dem Encode ausf\u00fchren.

"},{"location":"pipeline/post-encode-scripts/#ablauf","title":"Ablauf","text":"
READY_TO_ENCODE\n  -> Pre-Encode Skripte/Ketten\n  -> HandBrake Encoding\n  -> Post-Encode Skripte/Ketten\n  -> FINISHED oder ERROR\n
"},{"location":"pipeline/post-encode-scripts/#auswahl-im-review","title":"Auswahl im Review","text":"

Im Review-Panel kannst du getrennt w\u00e4hlen:

  • selectedPreEncodeScriptIds
  • selectedPostEncodeScriptIds
  • selectedPreEncodeChainIds
  • selectedPostEncodeChainIds
"},{"location":"pipeline/post-encode-scripts/#fehlerverhalten","title":"Fehlerverhalten","text":"
  • Pre-Encode-Fehler stoppen die Kette und f\u00fchren zu ERROR.
  • Post-Encode-Fehler stoppen die restlichen Post-Schritte; Job kann dennoch FINISHED sein (mit Fehlerzusatz im Status/Log).
"},{"location":"pipeline/post-encode-scripts/#verfugbare-umgebungsvariablen","title":"Verf\u00fcgbare Umgebungsvariablen","text":"

Beim Script-Run werden gesetzt:

  • RIPSTER_SCRIPT_RUN_AT
  • RIPSTER_JOB_ID
  • RIPSTER_JOB_TITLE
  • RIPSTER_MODE
  • RIPSTER_INPUT_PATH
  • RIPSTER_OUTPUT_PATH
  • RIPSTER_RAW_PATH
  • RIPSTER_SCRIPT_ID
  • RIPSTER_SCRIPT_NAME
  • RIPSTER_SCRIPT_SOURCE
"},{"location":"pipeline/post-encode-scripts/#skript-ketten","title":"Skript-Ketten","text":"

Ketten unterst\u00fctzen zwei Step-Typen:

  • script (f\u00fchrt ein hinterlegtes Skript aus)
  • wait (wartet waitSeconds)

Bei Fehler in einem Script-Step wird die Kette abgebrochen.

"},{"location":"pipeline/post-encode-scripts/#testlaufe","title":"Testl\u00e4ufe","text":"
  • Skript testen: POST /api/settings/scripts/:id/test
  • Kette testen: POST /api/settings/script-chains/:id/test

Ergebnisse enthalten Erfolg/Exit-Code, Laufzeit und stdout/stderr.

"},{"location":"pipeline/workflow/","title":"Workflow & Zust\u00e4nde","text":"

Ripster steuert den Ablauf als State-Machine im pipelineService.

"},{"location":"pipeline/workflow/#zustandsdiagramm-vereinfacht","title":"Zustandsdiagramm (vereinfacht)","text":"
flowchart LR\n    IDLE --> DISC_DETECTED\n    DISC_DETECTED --> ANALYZING\n    ANALYZING --> METADATA_SELECTION\n    METADATA_SELECTION --> READY_TO_START\n    READY_TO_START --> RIPPING\n    READY_TO_START --> MEDIAINFO_CHECK\n    MEDIAINFO_CHECK --> WAITING_FOR_USER_DECISION\n    WAITING_FOR_USER_DECISION --> MEDIAINFO_CHECK\n    MEDIAINFO_CHECK --> READY_TO_ENCODE\n    READY_TO_ENCODE --> ENCODING\n    ENCODING --> FINISHED\n    ENCODING --> ERROR\n    RIPPING --> ERROR\n    RIPPING --> CANCELLED
"},{"location":"pipeline/workflow/#state-liste","title":"State-Liste","text":"State Bedeutung IDLE Wartet auf Disc DISC_DETECTED Disc erkannt ANALYZING MakeMKV-Analyse l\u00e4uft METADATA_SELECTION Benutzer w\u00e4hlt Metadaten WAITING_FOR_USER_DECISION Playlist-Auswahl n\u00f6tig READY_TO_START \u00dcbergangszustand vor Start RIPPING MakeMKV-Rip l\u00e4uft MEDIAINFO_CHECK Quelle/Tracks werden ausgewertet READY_TO_ENCODE Review ist bereit ENCODING HandBrake l\u00e4uft FINISHED erfolgreich abgeschlossen CANCELLED abgebrochen ERROR fehlgeschlagen"},{"location":"pipeline/workflow/#typische-pfade","title":"Typische Pfade","text":""},{"location":"pipeline/workflow/#standardfall-kein-vorhandenes-raw","title":"Standardfall (kein vorhandenes RAW)","text":"
  1. Disc erkannt
  2. Analyse + Metadaten
  3. RIPPING
  4. MEDIAINFO_CHECK
  5. READY_TO_ENCODE
  6. ENCODING
  7. FINISHED
"},{"location":"pipeline/workflow/#vorhandenes-raw","title":"Vorhandenes RAW","text":"

READY_TO_START springt direkt zu MEDIAINFO_CHECK (kein neuer Rip).

"},{"location":"pipeline/workflow/#mehrdeutige-blu-ray-playlist","title":"Mehrdeutige Blu-ray-Playlist","text":"

MEDIAINFO_CHECK -> WAITING_FOR_USER_DECISION bis Benutzer Playlist best\u00e4tigt.

"},{"location":"pipeline/workflow/#queue-verhalten","title":"Queue-Verhalten","text":"

Wenn pipeline_max_parallel_jobs erreicht ist:

  • Job-Aktionen werden als Queue-Eintr\u00e4ge abgelegt
  • Queue kann zus\u00e4tzlich Nicht-Job-Eintr\u00e4ge enthalten (script, chain, wait)
  • Reihenfolge ist per API/UI \u00e4nderbar
"},{"location":"pipeline/workflow/#abbruch-retry-restart","title":"Abbruch, Retry, Restart","text":"
  • cancel: laufenden Job abbrechen oder Queue-Eintrag entfernen
  • retry: Fehler-/Abbruch-Job neu starten
  • reencode: aus vorhandenem RAW neu encodieren
  • restart-review: Review aus RAW neu aufbauen
  • restart-encode: Encoding mit letzter best\u00e4tigter Auswahl neu starten
"},{"location":"tools/","title":"Anhang: Externe Tools","text":"

Ripster orchestriert externe CLI-Tools. Dieser Abschnitt erkl\u00e4rt deren Rolle im Gesamtsystem.

  • MakeMKV

    Disc-Analyse und Ripping.

    MakeMKV

  • HandBrake

    Video-Encoding inklusive Preset-Logik.

    HandBrake

  • MediaInfo

    Track-/Containeranalyse f\u00fcr Review und Auswahl.

    MediaInfo

"},{"location":"tools/handbrake/","title":"HandBrake","text":"

Ripster verwendet HandBrakeCLI f\u00fcr Scan und Encode.

"},{"location":"tools/handbrake/#verwendete-aufrufe","title":"Verwendete Aufrufe","text":""},{"location":"tools/handbrake/#scan-review-aufbau","title":"Scan (Review-Aufbau)","text":"
HandBrakeCLI --scan --json -i <input> -t 0\n
"},{"location":"tools/handbrake/#encode-vereinfacht","title":"Encode (vereinfacht)","text":"
HandBrakeCLI \\\n  -i <input> \\\n  -o <output> \\\n  -t <titleId> \\\n  -Z \"<preset>\" \\\n  <extra-args> \\\n  -a <audioTrackIds|none> \\\n  -s <subtitleTrackIds|none>\n

Optional erg\u00e4nzt Ripster:

  • --subtitle-burned=<id>
  • --subtitle-default=<id>
  • --subtitle-forced=<id> oder --subtitle-forced
"},{"location":"tools/handbrake/#presets-auslesen","title":"Presets auslesen","text":"

Ripster liest Presets mit:

HandBrakeCLI -z\n
"},{"location":"tools/handbrake/#relevante-settings","title":"Relevante Settings","text":"Key Bedeutung handbrake_command CLI-Binary handbrake_preset_bluray / handbrake_preset_dvd profilspezifisches Preset handbrake_extra_args_bluray / handbrake_extra_args_dvd profilspezifische Zusatzargumente output_extension_bluray / output_extension_dvd Ausgabeformat handbrake_restart_delete_incomplete_output unvollst\u00e4ndige Ausgabe bei Neustart l\u00f6schen"},{"location":"tools/handbrake/#fortschritts-parsing","title":"Fortschritts-Parsing","text":"

Ripster parst HandBrake-Stderr (Prozent/ETA/Detail) und sendet WebSocket-Progress (PIPELINE_PROGRESS).

"},{"location":"tools/handbrake/#troubleshooting","title":"Troubleshooting","text":"
  • Preset nicht gefunden: Preset-Namen mit HandBrakeCLI -z pr\u00fcfen
  • sehr langsames Encoding: Preset/Extra-Args pr\u00fcfen (z. B. --encoder-preset)

Das Produktions-Installer-Script install.sh bietet eine Option zur Installation eines geb\u00fcndelten HandBrakeCLI-Binaries mit NVDEC-Unterst\u00fctzung (NVIDIA GPU-Dekodierung). Diese Option erscheint interaktiv w\u00e4hrend der Installation.

"},{"location":"tools/makemkv/","title":"MakeMKV","text":"

Ripster nutzt makemkvcon f\u00fcr Disc-Analyse und Rip.

"},{"location":"tools/makemkv/#verwendete-aufrufe","title":"Verwendete Aufrufe","text":""},{"location":"tools/makemkv/#analyse","title":"Analyse","text":"
makemkvcon -r info <source>\n

<source> ist typischerweise:

  • disc:<index> (Auto-Modus)
  • dev:/dev/sr0 (explicit)
  • file:<path> (Datei/Ordner-Analyse)
"},{"location":"tools/makemkv/#rip-mkv-modus","title":"Rip (MKV-Modus)","text":"
makemkvcon mkv <source> <title-or-all> <rawDir> [--minlength=...] [...extraArgs]\n
"},{"location":"tools/makemkv/#rip-backup-modus","title":"Rip (Backup-Modus)","text":"
makemkvcon backup <source> <rawDir> --decrypt\n
"},{"location":"tools/makemkv/#registrierungsschlussel-optional","title":"Registrierungsschl\u00fcssel (optional)","text":"

Wenn makemkv_registration_key gesetzt ist, f\u00fchrt Ripster vor Analyse/Rip aus:

makemkvcon reg <key>\n
"},{"location":"tools/makemkv/#relevante-settings","title":"Relevante Settings","text":"Key Bedeutung makemkv_command CLI-Binary makemkv_source_index Source-Index im Auto-Modus makemkv_min_length_minutes Mindestlaufzeitfilter makemkv_rip_mode_bluray / makemkv_rip_mode_dvd mkv oder backup makemkv_analyze_extra_args_bluray / _dvd Zusatzargs Analyse makemkv_rip_extra_args_bluray / _dvd Zusatzargs Rip"},{"location":"tools/makemkv/#hinweise","title":"Hinweise","text":"
  • Blu-ray-Backups werden oft f\u00fcr robuste Playlist-Analyse genutzt.
  • MakeMKV-Ausgaben werden geparst und als makemkvInfo im Job gespeichert.
"},{"location":"tools/mediainfo/","title":"MediaInfo","text":"

Ripster nutzt mediainfo zur JSON-Analyse von Medien-Dateien.

"},{"location":"tools/mediainfo/#aufruf","title":"Aufruf","text":"
mediainfo --Output=JSON <input>\n

Der Input ist typischerweise eine RAW-Datei oder ein vom Workflow gew\u00e4hlter Inputpfad.

"},{"location":"tools/mediainfo/#verwendung-in-ripster","title":"Verwendung in Ripster","text":"
  • Track-/Codec-Metadaten f\u00fcr Review-Plan
  • Fallback-Informationen in bestimmten Analysepfaden
  • Persistenz als mediainfoInfo im Job
"},{"location":"tools/mediainfo/#relevante-settings","title":"Relevante Settings","text":"Key Bedeutung mediainfo_command CLI-Binary mediainfo_extra_args_bluray / _dvd profilspezifische Zusatzargumente"},{"location":"tools/mediainfo/#troubleshooting","title":"Troubleshooting","text":"
  • JSON-Test: mediainfo --Output=JSON <datei>
  • unbekannte Sprache erscheint oft als und (undetermined)
"},{"location":"workflows/","title":"Workflows aus Nutzersicht","text":"

Diese Seite beschreibt typische Abl\u00e4ufe mit den passenden UI-Aktionen.

"},{"location":"workflows/#workflow-1-standardlauf-disc-fertige-datei","title":"Workflow 1: Standardlauf (Disc -> fertige Datei)","text":"
  1. Dashboard: Disc einlegen, Analyse starten
  2. Metadaten im Dialog \u00fcbernehmen
  3. bei READY_TO_ENCODE Titel/Tracks pr\u00fcfen
  4. Encoding starten
  5. Ergebnis in Historie kontrollieren
"},{"location":"workflows/#workflow-2-playlist-entscheidung-bei-blu-ray","title":"Workflow 2: Playlist-Entscheidung bei Blu-ray","text":"
  1. Job landet in WAITING_FOR_USER_DECISION
  2. im Pipeline-Status Playlist-Kandidaten vergleichen
  3. gew\u00fcnschte Playlist ausw\u00e4hlen
  4. Playlist \u00fcbernehmen
  5. danach normal weiter bis READY_TO_ENCODE
"},{"location":"workflows/#workflow-3-mehrere-jobs-mit-queue","title":"Workflow 3: Mehrere Jobs mit Queue","text":"
  1. Parallel-Limit in Settings setzen (pipeline_max_parallel_jobs)
  2. neue Jobs starten; \u00fcbersch\u00fcssige Starts gehen in Job Queue
  3. Reihenfolge per Drag-and-Drop anpassen
  4. bei Bedarf Skript/Kette/Warten als Queue-Eintrag erg\u00e4nzen
"},{"location":"workflows/#workflow-4-nachbearbeitung-eines-bestehenden-jobs","title":"Workflow 4: Nachbearbeitung eines bestehenden Jobs","text":"

In Historie -> Detaildialog:

  • Metadaten korrigieren: OMDb neu zuordnen
  • gleiche Einstellungen erneut nutzen: Encode neu starten
  • Analyse neu aufbauen: Review neu starten
  • aus RAW erneut encodieren: RAW neu encodieren
"},{"location":"workflows/#workflow-5-automatisierung-mit-skripten-und-cron","title":"Workflow 5: Automatisierung mit Skripten und Cron","text":"
  1. Settings -> Scripte: Skripte anlegen und testen
  2. Settings -> Skriptketten: Ketten bauen und testen
  3. im Dashboard-Review Pre-/Post-Ausf\u00fchrungen pro Job ausw\u00e4hlen
  4. Settings -> Cronjobs: zeitgesteuerte Ausf\u00fchrung konfigurieren
  5. Status im Dashboard (Skript- / Cron-Status) \u00fcberwachen
"},{"location":"workflows/#workflow-6-abbruch-und-recovery","title":"Workflow 6: Abbruch und Recovery","text":""},{"location":"workflows/#fall-a-job-wurde-abgebrochen","title":"Fall A: Job wurde abgebrochen","text":"
  • im Dashboard optional erzeugte RAW/Movie-Datei bereinigen
  • anschlie\u00dfend je nach Ziel: Retry Rippen oder Disk-Analyse neu starten
"},{"location":"workflows/#fall-b-job-steht-in-ready_to_encode-ist-aber-nicht-aktive-session","title":"Fall B: Job steht in READY_TO_ENCODE, ist aber nicht aktive Session","text":"
  • in Historie oder Database: Im Dashboard \u00f6ffnen
  • im Dashboard Review erneut pr\u00fcfen und starten
"},{"location":"workflows/#fall-c-raw-ohne-historieneintrag","title":"Fall C: RAW ohne Historieneintrag","text":"
  • /database \u00f6ffnen
  • Bereich RAW ohne Historie
  • Job anlegen
"}]} \ No newline at end of file diff --git a/site/sitemap.xml b/site/sitemap.xml index 863a7d1..b2e3ec3 100644 --- a/site/sitemap.xml +++ b/site/sitemap.xml @@ -2,130 +2,162 @@ https://mboehmlaender.github.io/ripster/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/api/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/api/crons/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/api/history/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/api/pipeline/ - 2026-03-10 + 2026-03-11 + + + https://mboehmlaender.github.io/ripster/api/runtime-activities/ + 2026-03-11 https://mboehmlaender.github.io/ripster/api/settings/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/api/websocket/ - 2026-03-10 + 2026-03-11 + + + https://mboehmlaender.github.io/ripster/appendix/ + 2026-03-11 https://mboehmlaender.github.io/ripster/architecture/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/architecture/backend/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/architecture/database/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/architecture/frontend/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/architecture/overview/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/configuration/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/configuration/environment/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/configuration/settings-reference/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/deployment/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/deployment/development/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/deployment/production/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/getting-started/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/getting-started/configuration/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/getting-started/installation/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/getting-started/prerequisites/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/getting-started/quickstart/ - 2026-03-10 + 2026-03-11 + + + https://mboehmlaender.github.io/ripster/gui/ + 2026-03-11 + + + https://mboehmlaender.github.io/ripster/gui/dashboard/ + 2026-03-11 + + + https://mboehmlaender.github.io/ripster/gui/database/ + 2026-03-11 + + + https://mboehmlaender.github.io/ripster/gui/history/ + 2026-03-11 + + + https://mboehmlaender.github.io/ripster/gui/settings/ + 2026-03-11 https://mboehmlaender.github.io/ripster/pipeline/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/pipeline/encoding/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/pipeline/playlist-analysis/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/pipeline/post-encode-scripts/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/pipeline/workflow/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/tools/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/tools/handbrake/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/tools/makemkv/ - 2026-03-10 + 2026-03-11 https://mboehmlaender.github.io/ripster/tools/mediainfo/ - 2026-03-10 + 2026-03-11 + + + https://mboehmlaender.github.io/ripster/workflows/ + 2026-03-11 \ No newline at end of file diff --git a/site/sitemap.xml.gz b/site/sitemap.xml.gz index 9a79c564195bbfdc3fd13676b3e38e0f3ddaa2cc..a26ee40c1485bcdb347cf5952ce15e5a0f9df38a 100644 GIT binary patch literal 501 zcmV0Ep}WW2TN^n7o1DAT>SmFn0}7n=odE)E?Vy_ve>Q=84?-dH?*q-hZnP2ifvI zcbC?Fi2I6Q6H!;VO%$>&!ho46U3DQMM(`Lwmm} zI|6HBL|MW&MS^4piFuai1cgv^MvM|%AvDgg=}ay~ITs16T#j}~KEMmYs)u7KT(F;$ zVaWqZ!GN%!7;1vRr64_GZk^x)Niroxk9H6}U3IndiNV1Fo?c-WNs{lU()J8Mm?~mxColcDxM~nP$`#?o1v!GRbLUXy-Q@g?h2J zLFkty`sLyW!Q)>_0VvU%s}~2UO)&nNu>=D}5}uompw3p7xdf_}(s=Qtn2s}%&)VV# r6I_?f2-+Z%Fihj3jsXr0h70L|JUsIYzHxg=kD&fCQrZz5e{^!Cg%7{seRuYatw=()L^@B8E$w@PzXh@ z#U;TOLSr@SUQ;Q~8RQt@a=e3b-E0o_d^iTf;Kns+mRqkB3<#T(jandZDM%kDUY%fo zBy~Z?h_(-WNs{lcf5e z)m@5sDhEr5%zPc>W6EELeiD2<(h5L{UZ1@@6KWl_Ka-;pm{54GK7yKz{N@s?N05?+J1ONa4 diff --git a/site/tools/handbrake/index.html b/site/tools/handbrake/index.html index ffa42bb..af48af1 100644 --- a/site/tools/handbrake/index.html +++ b/site/tools/handbrake/index.html @@ -1,4 +1,4 @@ - HandBrake - Ripster

HandBrake

Ripster verwendet HandBrakeCLI für Scan und Encode.


Verwendete Aufrufe

Scan (Review-Aufbau)

HandBrakeCLI --scan --json -i <input> -t 0
+ HandBrake - Ripster      

HandBrake

Ripster verwendet HandBrakeCLI für Scan und Encode.


Verwendete Aufrufe

Scan (Review-Aufbau)

HandBrakeCLI --scan --json -i <input> -t 0
 

Encode (vereinfacht)

HandBrakeCLI \
   -i <input> \
   -o <output> \
@@ -8,4 +8,4 @@
   -a <audioTrackIds|none> \
   -s <subtitleTrackIds|none>
 

Optional ergänzt Ripster:

  • --subtitle-burned=<id>
  • --subtitle-default=<id>
  • --subtitle-forced=<id> oder --subtitle-forced

Presets auslesen

Ripster liest Presets mit:

HandBrakeCLI -z
-

Relevante Settings

Key Bedeutung
handbrake_command CLI-Binary
handbrake_preset_bluray / handbrake_preset_dvd profilspezifisches Preset
handbrake_extra_args_bluray / handbrake_extra_args_dvd profilspezifische Zusatzargumente
output_extension_bluray / output_extension_dvd Ausgabeformat
handbrake_restart_delete_incomplete_output unvollständige Ausgabe bei Neustart löschen

Fortschritts-Parsing

Ripster parst HandBrake-Stderr (Prozent/ETA/Detail) und sendet WebSocket-Progress (PIPELINE_PROGRESS).


Troubleshooting

  • Preset nicht gefunden: Preset-Namen mit HandBrakeCLI -z prüfen
  • sehr langsames Encoding: Preset/Extra-Args prüfen (z. B. --encoder-preset)
\ No newline at end of file +

Relevante Settings

Key Bedeutung
handbrake_command CLI-Binary
handbrake_preset_bluray / handbrake_preset_dvd profilspezifisches Preset
handbrake_extra_args_bluray / handbrake_extra_args_dvd profilspezifische Zusatzargumente
output_extension_bluray / output_extension_dvd Ausgabeformat
handbrake_restart_delete_incomplete_output unvollständige Ausgabe bei Neustart löschen

Fortschritts-Parsing

Ripster parst HandBrake-Stderr (Prozent/ETA/Detail) und sendet WebSocket-Progress (PIPELINE_PROGRESS).


Troubleshooting

  • Preset nicht gefunden: Preset-Namen mit HandBrakeCLI -z prüfen
  • sehr langsames Encoding: Preset/Extra-Args prüfen (z. B. --encoder-preset)

Das Produktions-Installer-Script install.sh bietet eine Option zur Installation eines gebündelten HandBrakeCLI-Binaries mit NVDEC-Unterstützung (NVIDIA GPU-Dekodierung). Diese Option erscheint interaktiv während der Installation.

\ No newline at end of file diff --git a/site/tools/index.html b/site/tools/index.html index a0fcb78..e614fe4 100644 --- a/site/tools/index.html +++ b/site/tools/index.html @@ -1 +1 @@ - Externe Tools - Ripster

Externe Tools

Ripster ist ein Orchestrator – die eigentliche Arbeit erledigen diese bewährten Open-Source-Tools:

  • MakeMKV


    Disc-Analyse und Ripping. Erstellt MKV-Dateien oder vollständige Backups.

    MakeMKV

  • HandBrake


    Video-Encoding mit umfangreichen Preset-Optionen.

    HandBrake

  • MediaInfo


    Analyse von Track-Informationen in Mediendateien.

    MediaInfo

\ No newline at end of file + Anhang: Externe Tools - Ripster

Anhang: Externe Tools

Ripster orchestriert externe CLI-Tools. Dieser Abschnitt erklärt deren Rolle im Gesamtsystem.

  • MakeMKV


    Disc-Analyse und Ripping.

    MakeMKV

  • HandBrake


    Video-Encoding inklusive Preset-Logik.

    HandBrake

  • MediaInfo


    Track-/Containeranalyse für Review und Auswahl.

    MediaInfo

\ No newline at end of file diff --git a/site/tools/makemkv/index.html b/site/tools/makemkv/index.html index 68bdd2b..ff6e55f 100644 --- a/site/tools/makemkv/index.html +++ b/site/tools/makemkv/index.html @@ -1,4 +1,4 @@ - MakeMKV - Ripster

MakeMKV

Ripster nutzt makemkvcon für Disc-Analyse und Rip.


Verwendete Aufrufe

Analyse

makemkvcon -r info <source>
+ MakeMKV - Ripster      

MakeMKV

Ripster nutzt makemkvcon für Disc-Analyse und Rip.


Verwendete Aufrufe

Analyse

makemkvcon -r info <source>
 

<source> ist typischerweise:

  • disc:<index> (Auto-Modus)
  • dev:/dev/sr0 (explicit)
  • file:<path> (Datei/Ordner-Analyse)

Rip (MKV-Modus)

makemkvcon mkv <source> <title-or-all> <rawDir> [--minlength=...] [...extraArgs]
 

Rip (Backup-Modus)

makemkvcon backup <source> <rawDir> --decrypt
 

Registrierungsschlüssel (optional)

Wenn makemkv_registration_key gesetzt ist, führt Ripster vor Analyse/Rip aus:

makemkvcon reg <key>
diff --git a/site/tools/mediainfo/index.html b/site/tools/mediainfo/index.html
index 25871b9..01c3baa 100644
--- a/site/tools/mediainfo/index.html
+++ b/site/tools/mediainfo/index.html
@@ -1,2 +1,2 @@
- MediaInfo - Ripster      

MediaInfo

Ripster nutzt mediainfo zur JSON-Analyse von Medien-Dateien.


Aufruf

mediainfo --Output=JSON <input>
+ MediaInfo - Ripster      

MediaInfo

Ripster nutzt mediainfo zur JSON-Analyse von Medien-Dateien.


Aufruf

mediainfo --Output=JSON <input>
 

Der Input ist typischerweise eine RAW-Datei oder ein vom Workflow gewählter Inputpfad.


Verwendung in Ripster

  • Track-/Codec-Metadaten für Review-Plan
  • Fallback-Informationen in bestimmten Analysepfaden
  • Persistenz als mediainfoInfo im Job

Relevante Settings

Key Bedeutung
mediainfo_command CLI-Binary
mediainfo_extra_args_bluray / _dvd profilspezifische Zusatzargumente

Troubleshooting

  • JSON-Test: mediainfo --Output=JSON <datei>
  • unbekannte Sprache erscheint oft als und (undetermined)
\ No newline at end of file diff --git a/site/workflows/index.html b/site/workflows/index.html new file mode 100644 index 0000000..8f86a3c --- /dev/null +++ b/site/workflows/index.html @@ -0,0 +1 @@ + Workflows aus Nutzersicht - Ripster

Workflows aus Nutzersicht

Diese Seite beschreibt typische Abläufe mit den passenden UI-Aktionen.

Workflow 1: Standardlauf (Disc -> fertige Datei)

  1. Dashboard: Disc einlegen, Analyse starten
  2. Metadaten im Dialog übernehmen
  3. bei READY_TO_ENCODE Titel/Tracks prüfen
  4. Encoding starten
  5. Ergebnis in Historie kontrollieren

Workflow 2: Playlist-Entscheidung bei Blu-ray

  1. Job landet in WAITING_FOR_USER_DECISION
  2. im Pipeline-Status Playlist-Kandidaten vergleichen
  3. gewünschte Playlist auswählen
  4. Playlist übernehmen
  5. danach normal weiter bis READY_TO_ENCODE

Workflow 3: Mehrere Jobs mit Queue

  1. Parallel-Limit in Settings setzen (pipeline_max_parallel_jobs)
  2. neue Jobs starten; überschüssige Starts gehen in Job Queue
  3. Reihenfolge per Drag-and-Drop anpassen
  4. bei Bedarf Skript/Kette/Warten als Queue-Eintrag ergänzen

Workflow 4: Nachbearbeitung eines bestehenden Jobs

In Historie -> Detaildialog:

  • Metadaten korrigieren: OMDb neu zuordnen
  • gleiche Einstellungen erneut nutzen: Encode neu starten
  • Analyse neu aufbauen: Review neu starten
  • aus RAW erneut encodieren: RAW neu encodieren

Workflow 5: Automatisierung mit Skripten und Cron

  1. Settings -> Scripte: Skripte anlegen und testen
  2. Settings -> Skriptketten: Ketten bauen und testen
  3. im Dashboard-Review Pre-/Post-Ausführungen pro Job auswählen
  4. Settings -> Cronjobs: zeitgesteuerte Ausführung konfigurieren
  5. Status im Dashboard (Skript- / Cron-Status) überwachen

Workflow 6: Abbruch und Recovery

Fall A: Job wurde abgebrochen

  • im Dashboard optional erzeugte RAW/Movie-Datei bereinigen
  • anschließend je nach Ziel: Retry Rippen oder Disk-Analyse neu starten

Fall B: Job steht in READY_TO_ENCODE, ist aber nicht aktive Session

  • in Historie oder Database: Im Dashboard öffnen
  • im Dashboard Review erneut prüfen und starten

Fall C: RAW ohne Historieneintrag

  • /database öffnen
  • Bereich RAW ohne Historie
  • Job anlegen
\ No newline at end of file