From ccd6c3ab2aa6e06ce35b84b92dddecad0f33e3f1 Mon Sep 17 00:00:00 2001 From: mboehmlaender Date: Tue, 21 Apr 2026 14:52:30 +0000 Subject: [PATCH] 0.14.0-4 Docs --- docs/configuration/settings-reference.md | 361 ++++++++++-------- docs/getting-started/configuration.md | 147 ++++--- docs/getting-started/quickstart.md | 92 +++-- docs/gui/audiobooks.md | 72 ++-- docs/gui/converter.md | 127 +++--- docs/gui/database.md | 36 +- docs/gui/downloads.md | 65 ++-- docs/gui/history.md | 113 +++--- docs/gui/index.md | 48 +-- docs/gui/jobs.md | 48 ++- docs/gui/ripper.md | 164 ++++---- docs/gui/settings.md | 115 +++--- docs/index.md | 33 +- docs/workflows/index.md | 239 +++++++++--- .../settings-reference/index.html | 2 +- site/getting-started/configuration/index.html | 2 +- site/getting-started/quickstart/index.html | 2 +- site/gui/audiobooks/index.html | 2 +- site/gui/converter/index.html | 2 +- site/gui/database/index.html | 2 +- site/gui/downloads/index.html | 2 +- site/gui/history/index.html | 2 +- site/gui/index.html | 2 +- site/gui/jobs/index.html | 2 +- site/gui/ripper/index.html | 2 +- site/gui/settings/index.html | 2 +- site/index.html | 2 +- site/search/search_index.json | 2 +- site/workflows/index.html | 2 +- 29 files changed, 999 insertions(+), 691 deletions(-) diff --git a/docs/configuration/settings-reference.md b/docs/configuration/settings-reference.md index d92784b..32040a2 100644 --- a/docs/configuration/settings-reference.md +++ b/docs/configuration/settings-reference.md @@ -1,181 +1,238 @@ # Einstellungsreferenz -Diese Seite listet die Felder so, wie sie in der GUI unter `Settings` angezeigt werden. +Diese Seite dokumentiert **alle** UI-Settings mit ihrer Wirkung auf Flows, Pfade, Queue und Automatisierung. -Hinweis: Interne Schlüsselnamen werden hier bewusst nicht verwendet. Falls du sie für Integrationen brauchst, nutze die API-Dokumentation. +## Wie Ripster Settings auflöst ---- +Ripster arbeitet intern mit profilspezifischen Settings (`bluray`, `dvd`, `cd`, `audiobook`) und bildet sie auf effektive Laufzeitwerte ab. -## Profil-System +Wichtige Regeln: -Viele Felder sind pro Medientyp getrennt vorhanden: +1. Für `bluray` wird bei fehlenden profilierten Toolwerten auf `dvd` zurückgefallen, und umgekehrt. +2. Für `cd` und `audiobook` gibt es nur das eigene Profil. +3. Strikt profilgebundene Pfadkeys (`raw_dir`, `movie_dir`, `series_dir` plus Owner) fallen bei leeren Werten auf Installationsdefaults zurück. -- Blu-ray -- DVD -- Sonstiges -- Audiobook (neu ab v0.12.0) +Installationsdefaults: ---- +- RAW: `data/output/raw` +- Movies: `data/output/movies` +- Series: `data/output/series` +- CD: `data/output/cd` +- Audiobook RAW: `data/output/audiobook-raw` +- Audiobook Output: `data/output/audiobooks` +- Converter RAW: `data/output/converter-raw` +- Converter Video: `data/output/converted-movies` +- Converter Audio: `data/output/converted-audio` + +## Kritische Wirkungsbereiche + +### 1) Pfad- und Template-Einstellungen + +Diese Settings bestimmen direkt: + +- wo RAW landet +- wo finale Ausgaben landen +- wie Ordner/Dateinamen gerendert werden + +Relevante Besonderheiten: + +- Serien-RAW nutzt bei Serienworkflow bevorzugt `raw_dir_*_series`. +- Serien-Ausgabe nutzt `series_dir_*` und Serien-Templates (Episode/Multi-Episode). +- Film-Ausgabe nutzt `movie_dir_*` und Film-Template. +- Encode schreibt zunächst in `Incomplete_job-` und finalisiert danach in den Zielpfad. + +### 2) Queue- und Parallelitäts-Settings + +Die vier Limits greifen kombiniert: + +- `pipeline_max_parallel_jobs` (Film/Video-Lane) +- `pipeline_max_parallel_cd_encodes` (Audio/CD-Lane) +- `pipeline_max_total_encodes` (globaler Deckel) +- `pipeline_cd_bypasses_queue` (Audio-Lane darf Filmwarteschlange umgehen) + +Effekt: + +- Film und Audio haben getrennte Lane-Limits. +- Das Gesamtlimit überstimmt beide, sobald erreicht. +- Queue kann zusätzlich Nicht-Job-Einträge (`Skript`, `Kette`, `Warten`) enthalten. + +### 3) Serien-Metadaten-Settings + +Diese steuern die Serienqualität direkt: + +- TMDb-Token aktiviert TMDb-gestützte Serienmetadaten. +- Sprache/Fallback-Sprachen beeinflussen Titel- und Episodenauflösung. +- Ordnungspräferenz steuert Episode-Order. +- Disc-Profile-Reuse verbessert automatische Zuordnung über mehrere Discs. + +### 4) Tool-Settings + +Toolfelder (`makemkv_*`, `mediainfo_*`, `handbrake_*`, `ffmpeg_*`, `ffprobe_*`, `cdparanoia_*`) wirken unmittelbar auf die tatsächlich ausgeführten CLI-Aufrufe. + +Typische Auswirkungen: + +- falscher Toolpfad => früher Pipelinefehler +- geänderte Extra-Args => anderes Analyze-/Encode-Verhalten +- geänderte Presets => andere HandBrake-Ausgaben ## Template-Platzhalter -### Video-Templates -- `${title}` — Titel -- `${year}` — Erscheinungsjahr -- `${imdbId}` — IMDb-ID +### Film-Templates + +- `${title}`, `${year}`, `${imdbId}` + +### Serien-Templates + +- `{seriesTitle}`, `{seasonNr}`, `{episodeNr}`, `{episodeNoStart}`, `{episodeNoEnd}` +- `{episodeRange}`, `{episodeTitle}`, `{parts}`, `{discNr}`, `{year}`, `{language}` +- führende Null möglich mit `{0:seasonNr}` etc. ### Audiobook-Templates -- `{author}` — Autor -- `{title}` — Titel -- `{year}` — Erscheinungsjahr -- `{narrator}` — Sprecher -- `{series}` — Buchreihe -- `{part}` — Teil-Nummer -- `{format}` — Ausgabeformat -### Converter-Templates (Video) -- `{title}`, `{year}` +- `{author}`, `{title}`, `{year}`, `{narrator}`, `{series}`, `{part}`, `{format}` -### Converter-Templates (Audio) -- `{artist}`, `{title}`, `{album}`, `{year}`, `{trackNr}` +### Converter-Templates -Nicht gesetzte Werte werden zu `unknown`. +- Video: `{title}`, `{year}` +- Audio: `{artist}`, `{title}`, `{album}`, `{year}`, `{trackNr}` ---- +## Vollständige Feldliste -## Kategorie: Pfade +## Kategorie: Benachrichtigungen -| Feldname in der GUI | Typ | Default | -|---|---|---| -| `Raw Ausgabeordner` | path | `data/output/raw` | -| `Raw Ausgabeordner (Blu-ray)` | path | `null` | -| `Raw Ausgabeordner (DVD)` | path | `null` | -| `Raw Ausgabeordner (Sonstiges)` | path | `null` | -| `Eigentümer Raw-Ordner (Blu-ray)` | string | `null` | -| `Eigentümer Raw-Ordner (DVD)` | string | `null` | -| `Eigentümer Raw-Ordner (Sonstiges)` | string | `null` | -| `Film Ausgabeordner` | path | `data/output/movies` | -| `Film Ausgabeordner (Blu-ray)` | path | `null` | -| `Film Ausgabeordner (DVD)` | path | `null` | -| `Film Ausgabeordner (Sonstiges)` | path | `null` | -| `Eigentümer Film-Ordner (Blu-ray)` | string | `null` | -| `Eigentümer Film-Ordner (DVD)` | string | `null` | -| `Eigentümer Film-Ordner (Sonstiges)` | string | `null` | -| `Log Ordner` | path | `data/logs` | -| `Audiobook RAW-Ordner` | path | `null` | -| `Eigentümer Audiobook RAW-Ordner` | string | `null` | -| `Audiobook Output-Ordner` | path | `null` | -| `Eigentümer Audiobook Output-Ordner` | string | `null` | -| `Output Template (Audiobook)` | string | `{author}/{author} - {title} ({year})` | -| `Audiobook RAW Template` | string | `{author} - {title} ({year})` | -| `Converter Raw-Ordner` | path | `null` | -| `Converter Ausgabe (Video)` | path | `null` | -| `Converter Ausgabe (Audio)` | path | `null` | -| `Output-Template (Video)` | string | `{title}` | -| `Output-Template (Audio)` | string | `{artist} - {title}` | - ---- - -## Kategorie: Laufwerk - -| Feldname in der GUI | Typ | Default | Hinweis | -|---|---|---|---| -| `Laufwerksmodus` | select | `auto` | `Auto Discovery` oder `Explizites Device` | -| `Device Pfad` | path | `/dev/sr0` | relevant bei `Explizites Device` | -| `MakeMKV Source Index` | number | `0` | Disc-Index im Auto-Modus | -| `Disc Auto-Erkennung aktiviert` | boolean | `true` | Automatische Disc-Erkennung per Polling | -| `Polling Intervall (ms)` | number | `4000` | 1000..60000 | - ---- - -## Kategorie: Monitoring - -| Feldname in der GUI | Typ | Default | -|---|---|---| -| `Hardware Monitoring aktiviert` | boolean | `true` | -| `Hardware Monitoring Intervall (ms)` | number | `5000` | - ---- - -## Kategorie: Tools (global) - -| Feldname in der GUI | Typ | Default | -|---|---|---| -| `MakeMKV Kommando` | string | `makemkvcon` | -| `MakeMKV Key` | string | `null` | -| `Mediainfo Kommando` | string | `mediainfo` | -| `Minimale Titellaenge (Minuten)` | number | `60` | -| `HandBrake Kommando` | string | `HandBrakeCLI` | -| `FFmpeg Kommando` | string | `ffmpeg` | -| `FFprobe Kommando` | string | `ffprobe` | -| `Encode-Neustart: unvollständige Ausgabe löschen` | boolean | `true` | -| `Parallele Jobs` | number | `1` | - -### Blu-ray-spezifisch - -| Feldname in der GUI | Typ | Default | -|---|---|---| -| `Mediainfo Extra Args` (Blu-ray) | string | `null` | -| `MakeMKV Rip Modus` (Blu-ray) | select | `backup` | -| `MakeMKV Analyze Extra Args` (Blu-ray) | string | `null` | -| `MakeMKV Rip Extra Args` (Blu-ray) | string | `null` | -| `HandBrake Preset` (Blu-ray) | string | `H.264 MKV 1080p30` | -| `HandBrake Extra Args` (Blu-ray) | string | `null` | -| `Ausgabeformat` (Blu-ray) | select | `mkv` | -| `Dateiname Template` (Blu-ray) | string | `${title} (${year})` | -| `Ordnername Template` (Blu-ray) | string | `null` | - -### DVD-spezifisch - -| Feldname in der GUI | Typ | Default | -|---|---|---| -| `Mediainfo Extra Args` (DVD) | string | `null` | -| `MakeMKV Rip Modus` (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` | -| `Ausgabeformat` (DVD) | select | `mkv` | -| `Dateiname Template` (DVD) | string | `${title} (${year})` | -| `Ordnername Template` (DVD) | string | `null` | - ---- +| GUI-Feld | Key | Typ | Default | Wirkung im System | +|---|---|---|---|---| +| `Expertenmodus` | `ui_expert_mode` | `boolean` | `false` | Schaltet erweiterte Einstellungen in der UI ein. | +| `PushOver aktiviert` | `pushover_enabled` | `boolean` | `false` | Master-Schalter für PushOver Versand. | +| `PushOver Token` | `pushover_token` | `string` | `leer` | Application Token für PushOver. | +| `PushOver User` | `pushover_user` | `string` | `leer` | User-Key für PushOver. | +| `PushOver Device (optional)` | `pushover_device` | `string` | `leer` | Optionales Ziel-Device in PushOver. | +| `PushOver Titel-Präfix` | `pushover_title_prefix` | `string` | `Ripster` | Prefix im PushOver Titel. | +| `PushOver Priority` | `pushover_priority` | `number` | `0` | Priorität -2 bis 2. | +| `PushOver Timeout (ms)` | `pushover_timeout_ms` | `number` | `7000` | HTTP Timeout für PushOver Requests. | +| `Bei Metadaten-Auswahl senden` | `pushover_notify_metadata_ready` | `boolean` | `true` | Sendet wenn Metadaten zur Auswahl bereitstehen. | +| `Bei Rip-Start senden` | `pushover_notify_rip_started` | `boolean` | `true` | Sendet beim Start des MakeMKV-Rips. | +| `Bei Encode-Start senden` | `pushover_notify_encoding_started` | `boolean` | `true` | Sendet beim Start von HandBrake. | +| `Bei Erfolg senden` | `pushover_notify_job_finished` | `boolean` | `true` | Sendet bei erfolgreich abgeschlossenem Job. | +| `Bei Fehler senden` | `pushover_notify_job_error` | `boolean` | `true` | Sendet bei Fehlern in der Pipeline. | +| `Bei Abbruch senden` | `pushover_notify_job_cancelled` | `boolean` | `true` | Sendet wenn Job manuell abgebrochen wurde. | +| `Bei Re-Encode Start senden` | `pushover_notify_reencode_started` | `boolean` | `true` | Sendet beim Start von RAW Re-Encode. | +| `Bei Re-Encode Erfolg senden` | `pushover_notify_reencode_finished` | `boolean` | `true` | Sendet bei erfolgreichem RAW Re-Encode. | ## Kategorie: Converter -| Feldname in der GUI | Typ | Default | Hinweis | -|---|---|---|---| -| `Erlaubte Datei-Endungen*` | string | `mkv,mp4,m2ts,iso,avi,mov,flac,mp3,wav,m4a,ogg,opus` | In der UI als Checkbox-Liste, ohne Punkt | -| `Auto-Scan (Polling)` | boolean | `false` | Converter-Ordner automatisch scannen | -| `Polling-Intervall (Sekunden)` | number | `300` | 30..86400 | +| GUI-Feld | Key | Typ | Default | Wirkung im System | +|---|---|---|---|---| +| `Erlaubte Datei-Endungen*` | `converter_scan_extensions` | `string` | `mkv,mp4,m2ts,iso,avi,mov,flac,mp3,wav,m4a,ogg,opus` | Erlaubte Datei-Endungen für den Converter-Scan (ohne Punkt). Wird in der UI als Checkbox-Liste gepflegt. | +| `Auto-Scan (Polling)` | `converter_polling_enabled` | `boolean` | `false` | Converter Raw-Ordner automatisch in regelmäßigen Abständen scannen. | +| `Polling-Intervall (Sekunden)` | `converter_polling_interval` | `number` | `300` | Intervall für automatischen Scan des Converter-Ordners. | ---- +## Kategorie: Laufwerk + +| GUI-Feld | Key | Typ | Default | Wirkung im System | +|---|---|---|---|---| +| `Laufwerksmodus` | `drive_mode` | `select` | `auto` | Auto-Discovery oder explizites Device. | +| `Device Pfad` | `drive_device` | `path` | `/dev/sr0` | Nur für expliziten Modus, z.B. /dev/sr0. | +| `MakeMKV Source Index` | `makemkv_source_index` | `number` | `0` | Disc Index im Auto-Modus. | +| `Automatische Disk-Erkennung` | `disc_auto_detection_enabled` | `boolean` | `true` | Wenn deaktiviert, findet keine automatische Laufwerksprüfung statt. Neue Disks werden nur per "Laufwerk neu lesen" erkannt. | +| `Polling Intervall (ms)` | `disc_poll_interval_ms` | `number` | `4000` | Intervall für Disk-Erkennung. | ## Kategorie: Metadaten -| Feldname in der GUI | Typ | Default | -|---|---|---| -| `OMDb API Key` | string | `null` | -| `OMDb Typ` | select | `movie` | +| GUI-Feld | Key | Typ | Default | Wirkung im System | +|---|---|---|---|---| +| `OMDb API Key` | `omdb_api_key` | `string` | `leer` | API Key für Metadatensuche. | +| `TMDb Read Access Token` | `tmdb_api_read_access_token` | `string` | `leer` | Read Access Token für Serien-Metadaten über TheMovieDB (TMDb). | +| `DVD Serien-Sprache` | `dvd_series_language` | `string` | `de-DE` | Bevorzugte Sprache für Serien-Metadaten im TMDb-Format, z.B. de-DE oder en-US. | +| `DVD Serien-Fallback-Sprachen` | `dvd_series_fallback_languages` | `string` | `de-DE,en-US` | Kommagetrennte TMDb-Sprachen für Fallback-Titel, z.B. de-DE,en-US,fr-FR. | +| `DVD Serien-Ordnung` | `dvd_series_order_preference` | `select` | `episode_group` | Bevorzugte Episodenordnung für DVD-Serien. Episode Groups nutzen TMDb Alternate Orders, falls vorhanden. | +| `DVD Disc-Profile wiederverwenden` | `dvd_series_reuse_disc_profiles` | `boolean` | `true` | Verwendet zuvor bestätigte Disc-Profile erneut, um Episoden automatischer zuzuordnen. | +| `OMDb Typ` | `omdb_default_type` | `select` | `movie` | Vorauswahl für Suche. | +| `MusicBrainz aktiviert` | `musicbrainz_enabled` | `boolean` | `true` | MusicBrainz-Metadatensuche für CDs aktivieren. | +| `Coverart-Nachladen aktiv` | `coverart_recovery_enabled` | `boolean` | `true` | Wenn aktiv, werden fehlende Coverarts automatisch in Intervallen geprüft und nachgeladen. | +| `Coverart-Prüfintervall (Stunden)` | `coverart_recovery_interval_hours` | `number` | `6` | Intervall für automatische Prüfung fehlender Coverarts in Stunden. | ---- +## Kategorie: Monitoring -## Kategorie: Benachrichtigungen (PushOver) +| GUI-Feld | Key | Typ | Default | Wirkung im System | +|---|---|---|---|---| +| `Hardware Monitoring aktiviert` | `hardware_monitoring_enabled` | `boolean` | `true` | Master-Schalter: aktiviert/deaktiviert das komplette Hardware-Monitoring (Polling + Berechnung + WebSocket-Updates). | +| `Hardware Monitoring Intervall (ms)` | `hardware_monitoring_interval_ms` | `number` | `5000` | Polling-Intervall für CPU/RAM/GPU/Storage-Metriken. | -| Feldname in der GUI | Typ | Default | -|---|---|---| -| `PushOver aktiviert` | boolean | `false` | -| `PushOver Token` | string | `null` | -| `PushOver User` | string | `null` | -| `PushOver Device (optional)` | string | `null` | -| `PushOver Titel-Präfix` | string | `Ripster` | -| `PushOver Priority` | number | `0` | -| `PushOver Timeout (ms)` | number | `7000` | -| `Bei Metadaten-Auswahl senden` | boolean | `true` | -| `Bei Rip-Start senden` | boolean | `true` | -| `Bei Encode-Start senden` | boolean | `true` | -| `Bei Erfolg senden` | boolean | `true` | -| `Bei Fehler senden` | boolean | `true` | -| `Bei Abbruch senden` | boolean | `true` | -| `Bei Re-Encode Start senden` | boolean | `true` | -| `Bei Re-Encode Erfolg senden` | boolean | `true` | +## Kategorie: Pfade + +| GUI-Feld | Key | Typ | Default | Wirkung im System | +|---|---|---|---|---| +| `Raw-Ordner (Blu-ray)` | `raw_dir_bluray` | `path` | `leer` | RAW-Zielpfad für Blu-ray. Leer = Standardpfad (data/output/raw). | +| `Raw-Ordner (DVD)` | `raw_dir_dvd` | `path` | `leer` | RAW-Zielpfad für DVD. Leer = Standardpfad (data/output/raw). | +| `CD RAW-Ordner` | `raw_dir_cd` | `path` | `leer` | Basisordner für rohe CD-WAV-Dateien (cdparanoia-Output). Leer = Standardpfad (data/output/cd). | +| `Audiobook RAW-Ordner` | `raw_dir_audiobook` | `path` | `leer` | Basisordner für hochgeladene AAX-Dateien. Leer = Standardpfad (data/output/audiobook-raw). | +| `Serien-Ordner (Blu-ray)` | `series_dir_bluray` | `path` | `leer` | Zielordner für Blu-ray-Serienfolgen. Leer = Standardpfad (data/output/series). | +| `Film-Ordner (Blu-ray)` | `movie_dir_bluray` | `path` | `leer` | Encode-Zielpfad für Blu-ray. Leer = Standardpfad (data/output/movies). | +| `Film-Ordner (DVD)` | `movie_dir_dvd` | `path` | `leer` | Encode-Zielpfad für DVD. Leer = Standardpfad (data/output/movies). | +| `Serien-Ordner (DVD)` | `series_dir_dvd` | `path` | `leer` | Zielordner für DVD-Serienfolgen. Leer = Standardpfad (data/output/series). | +| `CD Output-Ordner` | `movie_dir_cd` | `path` | `leer` | Zielordner für encodierte CD-Ausgaben (FLAC, MP3 usw.). Leer = gleicher Ordner wie CD RAW-Ordner. | +| `Audiobook Output-Ordner` | `movie_dir_audiobook` | `path` | `leer` | Zielordner für encodierte Audiobook-Dateien. Leer = Standardpfad (data/output/audiobooks). | +| `Externe Speicher` | `external_storage_paths` | `path` | `[]` | Wird links unter "Freie Speicher" angezeigt. | +| `Log Ordner` | `log_dir` | `path` | `data/logs` | Basisordner für Logs. Job-Logs liegen direkt hier, Backend-Logs in /backend. | +| `CD Output Template` | `cd_output_template` | `string` | `{artist} - {album} ({year})/{trackNr} {artist} - {title}` | Template für relative CD-Ausgabepfade ohne Dateiendung. Platzhalter: {artist}, {album}, {year}, {title}, {trackNr}, {trackNo}. Unterordner sind über "/" möglich – alles nach dem letzten "/" ist der Dateiname. Die Endung wird über das gewählte Ausgabeformat gesetzt. | +| `Output Template (Blu-ray)` | `output_template_bluray` | `string` | `${title} (${year})/${title} (${year})` | Template für Ordner und Dateiname. Platzhalter: ${title}, ${year}, ${imdbId}. Unterordner über "/" möglich – alles nach dem letzten "/" ist der Dateiname. Die Endung wird über das gewählte Ausgabeformat gesetzt. | +| `Output Template (Blu-ray Serie, Episode)` | `output_template_bluray_series_episode` | `string` | `{seriesTitle}/Staffel {seasonNr}/S{seasonNr}E{episodeNr} - {episodeTitle}` | Template für einzelne Blu-ray-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNr}, {episodeTitle}, {discNr}, {year}, {language}. Optional mit führender Null: {0:seasonNr}, {0:episodeNr}. | +| `Output Template (Blu-ray Serie, Multi-Episode)` | `output_template_bluray_series_multi_episode` | `string` | `{seriesTitle}/Staffel {seasonNr}/S{0:seasonNr}E{episodeRange} - {episodeTitle} (Teil {parts})` | Template für zusammengefasste Blu-ray-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNoStart}, {episodeNoEnd}, {episodeRange}, {episodeTitle}, {parts}, {discNr}, {year}, {language}. Optional mit führender Null: {0:seasonNr}, {0:episodeNoStart}, {0:episodeNoEnd}. | +| `Output Template (DVD)` | `output_template_dvd` | `string` | `${title} (${year})/${title} (${year})` | Template für Ordner und Dateiname. Platzhalter: ${title}, ${year}, ${imdbId}. Unterordner über "/" möglich – alles nach dem letzten "/" ist der Dateiname. Die Endung wird über das gewählte Ausgabeformat gesetzt. | +| `Output Template (DVD Serie, Episode)` | `output_template_dvd_series_episode` | `string` | `{seriesTitle}/Staffel {seasonNr}/S{seasonNr}E{episodeNr} - {episodeTitle}` | Template für einzelne DVD-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNr}, {episodeTitle}, {discNr}, {year}, {language}. Optional mit führender Null: {0:seasonNr}, {0:episodeNr}. | +| `Output Template (DVD Serie, Multi-Episode)` | `output_template_dvd_series_multi_episode` | `string` | `{seriesTitle}/Staffel {seasonNr}/S{0:seasonNr}E{episodeRange} - {episodeTitle} (Teil {parts})` | Template für zusammengefasste DVD-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNoStart}, {episodeNoEnd}, {episodeRange}, {episodeTitle}, {parts}, {discNr}, {year}, {language}. Optional mit führender Null: {0:seasonNr}, {0:episodeNoStart}, {0:episodeNoEnd}. | +| `Output Template (Audiobook)` | `output_template_audiobook` | `string` | `{author}/{author} - {title} ({year})` | Template für relative Audiobook-Ausgabepfade ohne Dateiendung. Platzhalter: {author}, {title}, {year}, {narrator}, {series}, {part}, {format}. Unterordner sind über "/" möglich. | +| `Audiobook RAW Template` | `audiobook_raw_template` | `string` | `{author} - {title} ({year})` | Template für relative Audiobook-RAW-Ordner. Platzhalter: {author}, {title}, {year}, {narrator}, {series}, {part}. | +| `Converter Raw-Ordner` | `converter_raw_dir` | `path` | `leer` | Eingangsordner für den Converter (Import-Scan und Datei-Uploads). Jeder Upload erhält einen Unterordner. Leer = Standardpfad (data/output/converter-raw). | +| `Converter Ausgabe (Video)` | `converter_movie_dir` | `path` | `leer` | Ausgabepfad für konvertierte Video-Dateien. Leer = Standardpfad (data/output/converted-movies). | +| `Converter Ausgabe (Audio)` | `converter_audio_dir` | `path` | `leer` | Ausgabepfad für konvertierte Audio-Dateien. Leer = Standardpfad (data/output/converted-audio). | +| `Output-Template (Video)` | `converter_output_template_video` | `string` | `{title}` | Dateiname-Template für konvertierte Video-Dateien (ohne Endung). Platzhalter: {title}, {year}. | +| `Output-Template (Audio)` | `converter_output_template_audio` | `string` | `{artist} - {title}` | Dateiname-Template für konvertierte Audio-Dateien (ohne Endung). Platzhalter: {artist}, {title}, {album}, {year}, {trackNr}. | +| `RAW-Ordner (Blu-ray Serie)` | `raw_dir_bluray_series` | `path` | `leer` | RAW-Zielpfad für Blu-ray-Serien. Leer = gleicher Pfad wie RAW-Ordner (Blu-ray). | +| `Eigentümer RAW-Ordner (Blu-ray Serie)` | `raw_dir_bluray_series_owner` | `string` | `leer` | Eigentümer der Dateien im Format user:gruppe für Blu-ray-Serien-RAW. Leer = Eigentümer Raw-Ordner (Blu-ray). | +| `Eigentümer Raw-Ordner (Blu-ray)` | `raw_dir_bluray_owner` | `string` | `leer` | Eigentümer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. | +| `RAW-Ordner (DVD Serie)` | `raw_dir_dvd_series` | `path` | `leer` | RAW-Zielpfad für DVD-Serien. Leer = gleicher Pfad wie RAW-Ordner (DVD). | +| `Eigentümer RAW-Ordner (DVD Serie)` | `raw_dir_dvd_series_owner` | `string` | `leer` | Eigentümer der Dateien im Format user:gruppe für DVD-Serien-RAW. Leer = Eigentümer Raw-Ordner (DVD). | +| `Eigentümer Raw-Ordner (DVD)` | `raw_dir_dvd_owner` | `string` | `leer` | Eigentümer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. | +| `Eigentümer CD RAW-Ordner` | `raw_dir_cd_owner` | `string` | `leer` | Eigentümer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. | +| `Eigentümer Audiobook RAW-Ordner` | `raw_dir_audiobook_owner` | `string` | `leer` | Eigentümer der Audiobook-RAW-Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. | +| `Eigentümer Serien-Ordner (Blu-ray)` | `series_dir_bluray_owner` | `string` | `leer` | Eigentümer der Blu-ray-Serienausgaben im Format user:gruppe. Leer = Standardbenutzer des Dienstes. | +| `Eigentümer Film-Ordner (Blu-ray)` | `movie_dir_bluray_owner` | `string` | `leer` | Eigentümer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. | +| `Eigentümer Film-Ordner (DVD)` | `movie_dir_dvd_owner` | `string` | `leer` | Eigentümer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. | +| `Eigentümer Serien-Ordner (DVD)` | `series_dir_dvd_owner` | `string` | `leer` | Eigentümer der DVD-Serienausgaben im Format user:gruppe. Leer = Standardbenutzer des Dienstes. | +| `Eigentümer CD Output-Ordner` | `movie_dir_cd_owner` | `string` | `leer` | Eigentümer der encodierten CD-Ausgaben im Format user:gruppe. Leer = Standardbenutzer des Dienstes. | +| `Eigentümer Audiobook Output-Ordner` | `movie_dir_audiobook_owner` | `string` | `leer` | Eigentümer der encodierten Audiobook-Dateien im Format user:gruppe. Leer = Standardbenutzer des Dienstes. | + +## Kategorie: Tools + +| GUI-Feld | Key | Typ | Default | Wirkung im System | +|---|---|---|---|---| +| `MakeMKV Kommando` | `makemkv_command` | `string` | `makemkvcon` | Pfad oder Befehl für makemkvcon. | +| `MakeMKV Key` | `makemkv_registration_key` | `string` | `leer` | Optionaler Registrierungsschlüssel. Wird vor Analyze/Rip automatisch per "makemkvcon reg" gesetzt. | +| `Mediainfo Kommando` | `mediainfo_command` | `string` | `mediainfo` | Pfad oder Befehl für mediainfo. | +| `Minimale Titellänge (Minuten)` | `makemkv_min_length_minutes` | `number` | `60` | Filtert kurze Titel beim Rip. | +| `HandBrake Kommando` | `handbrake_command` | `string` | `HandBrakeCLI` | Pfad oder Befehl für HandBrakeCLI. | +| `Encode-Neustart: unvollständige Ausgabe löschen` | `handbrake_restart_delete_incomplete_output` | `boolean` | `true` | Wenn aktiv, wird bei "Encode neu starten" der bisherige (nicht erfolgreiche) Output vor Start entfernt. | +| `Max. parallele Film/Video Encodes` | `pipeline_max_parallel_jobs` | `number` | `1` | Maximale Anzahl parallel laufender Film/Video Encode-Jobs. Gilt zusätzlich zum Gesamtlimit. | +| `Max. parallele Audio CD Jobs` | `pipeline_max_parallel_cd_encodes` | `number` | `2` | Maximale Anzahl parallel laufender Audio CD Jobs (Rip + Encode als Einheit). Gilt zusätzlich zum Gesamtlimit. | +| `Max. Encodes gesamt (medienunabhängig)` | `pipeline_max_total_encodes` | `number` | `3` | Gesamtlimit für alle parallel laufenden Encode-Jobs (Film + Audio CD). Dieses Limit hat Vorrang vor den Einzellimits. | +| `Audio CDs: Queue-Reihenfolge überspringen` | `pipeline_cd_bypasses_queue` | `boolean` | `false` | Wenn aktiv, können Audio CD Jobs unabhängig von Film-Jobs starten (überspringen die Film-Queue-Reihenfolge). Einzellimits und Gesamtlimit gelten weiterhin. | +| `Script-Test Timeout (ms)` | `script_test_timeout_ms` | `number` | `0` | Timeout fuer Script-Tests in den Settings. 0 = kein Timeout. | +| `cdparanoia Kommando` | `cdparanoia_command` | `string` | `cdparanoia` | Pfad oder Befehl für cdparanoia. Wird als Fallback genutzt wenn kein individuelles Kommando gesetzt ist. | +| `FFmpeg Kommando` | `ffmpeg_command` | `string` | `ffmpeg` | Pfad oder Befehl für ffmpeg. Wird für Audiobook-Encoding genutzt. | +| `FFprobe Kommando` | `ffprobe_command` | `string` | `ffprobe` | Pfad oder Befehl für ffprobe. Wird für Audiobook-Metadaten und Kapitel genutzt. | +| `Mediainfo Extra Args` | `mediainfo_extra_args_bluray` | `string` | `leer` | Zusätzliche CLI-Parameter für mediainfo (Blu-ray). | +| `MakeMKV Rip Modus` | `makemkv_rip_mode_bluray` | `select` | `backup` | backup: vollständige Blu-ray Struktur im RAW-Ordner (empfohlen, ermöglicht --decrypt). | +| `MakeMKV Analyze Extra Args` | `makemkv_analyze_extra_args_bluray` | `string` | `leer` | Zusätzliche CLI-Parameter für Analyze (Blu-ray). | +| `MakeMKV Rip Extra Args` | `makemkv_rip_extra_args_bluray` | `string` | `leer` | Zusätzliche CLI-Parameter für Rip (Blu-ray). | +| `HandBrake Preset` | `handbrake_preset_bluray` | `string` | `H.264 MKV 1080p30` | Preset Name für -Z (Blu-ray). Leer = kein Preset, nur CLI-Parameter werden verwendet. | +| `HandBrake Extra Args` | `handbrake_extra_args_bluray` | `string` | `leer` | Zusätzliche CLI-Argumente (Blu-ray). | +| `Ausgabeformat` | `output_extension_bluray` | `select` | `mkv` | Dateiendung für finale Datei (Blu-ray). | +| `Mediainfo Extra Args` | `mediainfo_extra_args_dvd` | `string` | `leer` | Zusätzliche CLI-Parameter für mediainfo (DVD). | +| `MakeMKV Rip Modus` | `makemkv_rip_mode_dvd` | `select` | `backup` | backup: vollständige Disc-Struktur im RAW-Ordner (einzig gültige Option für DVDs). | +| `MakeMKV Analyze Extra Args` | `makemkv_analyze_extra_args_dvd` | `string` | `leer` | Zusätzliche CLI-Parameter für Analyze (DVD). | +| `MakeMKV Rip Extra Args` | `makemkv_rip_extra_args_dvd` | `string` | `leer` | Zusätzliche CLI-Parameter für Rip (DVD). | +| `HandBrake Preset` | `handbrake_preset_dvd` | `string` | `H.264 MKV 480p30` | Preset Name für -Z (DVD). Leer = kein Preset, nur CLI-Parameter werden verwendet. | +| `HandBrake Extra Args` | `handbrake_extra_args_dvd` | `string` | `leer` | Zusätzliche CLI-Argumente (DVD). | +| `Ausgabeformat` | `output_extension_dvd` | `select` | `mkv` | Dateiendung für finale Datei (DVD). | diff --git a/docs/getting-started/configuration.md b/docs/getting-started/configuration.md index c190141..0f9fb09 100644 --- a/docs/getting-started/configuration.md +++ b/docs/getting-started/configuration.md @@ -1,71 +1,102 @@ # Ersteinrichtung -Nach der Installation erfolgt die tägliche Konfiguration fast vollständig in der GUI unter `Settings`. +Diese Seite ist die Betriebs-Checkliste vor dem ersten produktiven Lauf. -## Ziel +## Ziel der Ersteinrichtung -Vor dem ersten echten Job müssen Pfade, Tools und Metadatenzugriff sauber gesetzt sein. +Vor dem ersten Job müssen drei Dinge stabil sein: -## Reihenfolge (empfohlen) +1. Pfade stimmen (RAW, Output, Logs) +2. Tools sind aufrufbar (MakeMKV, HandBrake, MediaInfo) +3. Metadatenzugänge funktionieren (OMDb, optional TMDb/MusicBrainz) -### 1. `Settings` -> Tab `Konfiguration` +## Empfohlene Reihenfolge -Setze zuerst diese Pflichtwerte: +### 1) Basis in `Settings -> Konfiguration` -| Bereich | Wichtige Felder | +Setze zuerst: + +- `Raw-Ordner` und `Film-/Serien-Ordner` +- `Log Ordner` +- `MakeMKV Kommando`, `HandBrake Kommando`, `Mediainfo Kommando` +- `OMDb API Key` + +Dann speichern. + +### 2) Profile pro Medium festziehen + +Ripster löst viele Werte profilspezifisch auf (`bluray`, `dvd`, `cd`, `audiobook`). + +Pflichtprüfung: + +- RAW-Pfade je Profil +- Output-Pfade je Profil +- HandBrake-Preset je Profil +- Output-Templates je Profil + +Für Serien zusätzlich: + +- `RAW-Ordner (Blu-ray/DVD Serie)` +- `Serien-Ordner (Blu-ray/DVD)` +- Serien-Templates (Episode/Multi-Episode) + +### 3) Queue-Verhalten definieren + +Stelle ein: + +- `Max. parallele Film/Video Encodes` +- `Max. parallele Audio CD Jobs` +- `Max. Encodes gesamt` +- optional `Audio CDs: Queue-Reihenfolge überspringen` + +Damit steuerst du Durchsatz, Priorität und Lastverteilung. + +### 4) Metadatenquellen absichern + +Film: + +- OMDb-Key prüfen + +Serien: + +- TMDb Read Access Token setzen +- Sprache/Fallback-Sprachen festlegen + +CD/Audiodaten: + +- `MusicBrainz aktiviert` nach Bedarf + +### 5) Optional: Benachrichtigungen + +- PushOver-Zugangsdaten setzen +- `PushOver Test` ausführen +- Event-Toggles pro Phase prüfen + +### 6) Optional: Automatisierung + +1. Skripte testen +2. Skriptketten bauen/testen +3. Cronjobs erst danach aktivieren + +## Funktionsprüfung (Kurztest) + +1. Disc in `Ripper` erkennen lassen. +2. `Analyse starten`. +3. Metadaten übernehmen. +4. Bis `Bereit zum Encodieren` laufen. +5. Encode starten und Abschluss in `Historie` prüfen. + +## Typische Konfigurationsfehler + +| Symptom | Häufige Ursache | |---|---| -| Pfade | `Raw Ausgabeordner`, `Film Ausgabeordner`, `Log Ordner` | -| Tools | `MakeMKV Kommando`, `HandBrake Kommando`, `Mediainfo Kommando` | -| Metadaten | `OMDb API Key`, optional `OMDb Typ` | - -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` (Blu-ray und DVD) -- `Raw Ausgabeordner` (Blu-ray und DVD) -- `Dateiname Template` (Blu-ray und DVD) - -### 3. Queue und Monitoring festlegen - -- `Parallele Jobs` für den gleichzeitigen Durchsatz -- `Hardware Monitoring aktiviert` + `Hardware Monitoring Intervall (ms)` für Live-Metriken im Ripper - -### 4. Optional: Push-Benachrichtigungen - -In den Benachrichtigungsfeldern setzen: - -- `PushOver aktiviert` -- `PushOver Token` -- `PushOver User` - -Dann über `PushOver Test` direkt prüfen. - -## 2-Minuten-Funktionstest - -1. `Ripper` öffnen -2. Disc einlegen -3. `Analyse starten` -4. Metadaten übernehmen -5. Bis `Bereit zum Encodieren` 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 +| Job bleibt früh auf Fehler | Toolkommando falsch oder nicht im PATH | +| RAW/Output landet am falschen Ort | Profilpfade nicht gesetzt, Fallback greift | +| Serienausgabe landet bei Filmen | Serienpfade/Serientemplates fehlen | +| Queue verhält sich unerwartet | Gesamtlimit und Lane-Limits widersprechen sich | ## Weiter - [Erster Lauf](quickstart.md) -- [GUI-Seiten im Detail](../gui/index.md) +- [GUI-Seiten](../gui/index.md) +- [Workflows aus Nutzersicht](../workflows/index.md) diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md index 03560bb..2401403 100644 --- a/docs/getting-started/quickstart.md +++ b/docs/getting-started/quickstart.md @@ -1,19 +1,21 @@ # Erster Lauf -Dieser Ablauf zeigt einen vollständigen Job aus Anwendersicht: von Disc-Erkennung bis fertiger Datei. +Dieser Ablauf führt einen vollständigen Disc-Job von Erkennung bis fertiger Datei durch. -## 1. Ripper öffnen und Disc einlegen +## 1) Disc erkennen -Erwartung: +1. `Ripper` öffnen. +2. Disc einlegen. +3. Auf `Medium erkannt` warten. -- Status wechselt auf `Medium erkannt` -- im Bereich `Disk-Information` sind Laufwerksdaten sichtbar +Prüfen: -Wenn nichts passiert: `Laufwerk neu lesen`. +- `Disk-Information` zeigt Device/Label. +- Falls nicht: `Laufwerk neu lesen`. -## 2. Analyse starten +## 2) Analyse starten -Aktion im Ripper: +Aktion: - `Analyse starten` @@ -22,49 +24,67 @@ Erwartung: - Status `Analyse` - danach Metadaten-Dialog -## 3. Metadaten auswählen +## 3) Metadaten bestätigen -Im Dialog `Metadaten auswählen`: +Im Dialog: -1. OMDb-Suche nutzen oder manuell eintragen -2. passenden Treffer markieren -3. `Auswahl übernehmen` +1. Treffer suchen/auswählen. +2. Bei Serie zusätzlich Disc-Nummer setzen. +3. `Auswahl übernehmen`. -## 4. Auf den nächsten Zustand reagieren +Mögliche Abzweigungen: -- Normalfall ohne vorhandenes RAW: `Rippen` -> `Mediainfo-Pruefung` -> `Bereit zum Encodieren` -- bei vorhandenem RAW: direkt `Mediainfo-Pruefung` -> `Bereit zum Encodieren` -- bei unklarer Blu-ray-Playlist: `Warte auf Auswahl` (Playlist auswählen und übernehmen) +- Duplikatfilm -> `Übernahme erzwingen` oder `Multipart movie` +- vorhandenes RAW -> Entscheidungsdialog (weiterverwenden oder neu rippen) -## 5. Review in `Bereit zum Encodieren` +## 4) Rip/Review-Phase -Im aufgeklappten Job (`Pipeline-Status`): +Normalfall: -- Encode-Titel wählen +- `Startbereit` -> `Rippen` -> `Mediainfo-Pruefung` + +Mögliche Alternativen: + +- vorhandenes RAW: direkter Sprung in Prüfung +- Blu-ray/DVD-Entscheidung nötig: `Warte auf Auswahl` für Playlist/Titel + +## 5) Encode-Review abschließen + +Bei `Bereit zum Encodieren`: + +- Titel festlegen - Audio-/Subtitle-Spuren prüfen -- optional User-Preset auswählen -- optional Pre-/Post-Skripte bzw. Ketten hinzufügen +- optional Preset auswählen +- optional Pre-/Post-Skripte wählen -Dann `Encoding starten`. +Dann: -## 6. Encoding überwachen +- `Encoding starten` + +## 6) Encoding überwachen Während `Encodieren`: -- Fortschritt + ETA im Ripper -- Live-Log im `Pipeline-Status` -- Queue- und Skript/Cron-Status parallel beobachtbar +- Fortschritt/ETA im Ripper +- Queue- und Runtime-Status beobachten +- optional Logkontrolle in Historie -## 7. Ergebnis prüfen +## 7) Ergebnis verifizieren -Bei `Fertig`: +Nach `Fertig`: -1. Seite `Historie` öffnen -2. Job in Details öffnen -3. Output-Pfad, Status und Log prüfen +1. `Historie` öffnen. +2. Jobdetail prüfen. +3. Output-Pfad und Log plausibilisieren. -## Typische Folgeaktionen +Kontrollpunkte: -- Falsches OMDb-Match: in `Historie` -> `OMDb neu zuordnen` -- Neue Encodierung aus RAW: `RAW neu encodieren` -- Prüfung komplett neu aufbauen: `Review neu starten` +- finale Datei am erwarteten Template-Pfad +- RAW-Ordnerzustand finalisiert (kein `Incomplete_`) + +## 8) Typische Folgeaktionen + +- falsche Metadaten: `OMDb neu zuordnen` +- andere Trackauswahl: `Review neu starten` +- erneuter Encode aus RAW: `RAW neu encodieren` +- gleicher Plan erneut: `Encode neu starten` diff --git a/docs/gui/audiobooks.md b/docs/gui/audiobooks.md index 82b5414..258617c 100644 --- a/docs/gui/audiobooks.md +++ b/docs/gui/audiobooks.md @@ -1,60 +1,68 @@ # Audiobooks -Die Seite `Audiobooks` ist die dedizierte Oberfläche für AAX- und Audiobook-Jobs. +Die Seite `Audiobooks` ist der spezialisierte AAX-Workflow. ---- +## Ablaufübersicht -## Aufbau +Die Oberfläche ist in drei Bereiche gegliedert: 1. `Audiobooks Upload` 2. `Audiobook Jobs` 3. `Audiobook Output Explorer` ---- - ## 1) Audiobooks Upload -Hier werden AAX-Dateien hochgeladen und als Job vorbereitet. +Der Upload verarbeitet ausschließlich AAX-Dateien. -Typische Schritte: +Direkt nach Upload passieren im Hintergrund: -1. Datei auswählen -2. optional Format/Startverhalten setzen -3. Upload starten +- Probe/Metadatenanalyse (ffprobe) +- Anlage eines RAW-Ordners per `Audiobook RAW Template` +- Ablage der AAX-Datei im RAW-Pfad +- Initiale Jobkonfiguration (Format, Kapitel, Metadaten) -Während des Uploads zeigt die Seite Fortschritt und Status an. +Wichtige Parameter: ---- +- Zielformat (`m4b`, `mp3`, `flac`) +- optionaler Sofortstart + +Toolabhängigkeit: + +- `ffprobe_command` für Metadaten/Kapitel +- `ffmpeg_command` für Encode/Cover-Extraktion ## 2) Audiobook Jobs -Aktive Audiobook-Jobs werden als Karten dargestellt (mit Status und Fortschritt). +Jobkarten zeigen Zustand, Fortschritt und verfügbare Aktionen. -Pro Job sind je nach Zustand Aktionen verfügbar: +Typische Aktionen: -- Starten (mit aktueller Audiobook-Konfiguration) -- Abbrechen -- Retry -- Löschen +- `Starten` +- `Abbrechen` +- `Retry` +- `Löschen` +- `Im Ripper` (Kontextwechsel) -Zusätzlich: - -- `Im Ripper` springt in die Hauptansicht -- Jobs laden periodisch nach und reagieren auf WebSocket-Updates - ---- +Die Karten werden regelmäßig aktualisiert und durch WebSocket-Ereignisse ergänzt. ## 3) Audiobook Output Explorer -Read-only Baumansicht des konfigurierten Audiobook-Ausgabeordners: +Read-only Explorer des Audiobook-Outputpfads: -- Ordner- und Dateiansicht -- Größen-/Zeitstempelübersicht -- schnelle Kontrolle der erzeugten Ergebnisse +- Ordner-/Dateistruktur +- Zeitstempel/Größen +- schnelle Ergebnisprüfung ohne Dateisystemwechsel ---- +## Pfad- und Template-Logik -## Abgrenzung zum Converter +| Bereich | Gesteuert durch | +|---|---| +| RAW-Ablage | `raw_dir_audiobook` + `audiobook_raw_template` | +| Finale Ausgabe | `movie_dir_audiobook` + `output_template_audiobook` | +| Dateiformat | Jobkonfiguration (`m4b`, `mp3`, `flac`) | -Audio/Video-Datei-Konvertierung läuft weiterhin auf der Seite `Converter`. -Der AAX-spezifische Flow (Upload, Start, Jobsteuerung, Output-Explorer) liegt auf `Audiobooks`. +## Typische Probleme + +- Upload wird abgelehnt: Eingabedatei ist keine AAX-Datei. +- Start schlägt fehl: `ffmpeg`/`ffprobe` nicht aufrufbar. +- Unerwartete Pfade: Templates enthalten ungültige oder zu generische Platzhalter. diff --git a/docs/gui/converter.md b/docs/gui/converter.md index b7318bd..cdcca56 100644 --- a/docs/gui/converter.md +++ b/docs/gui/converter.md @@ -1,85 +1,108 @@ # Converter -Die Converter-Seite ermöglicht das Konvertieren vorhandener Audio- und Video-Dateien. +Die Seite `Converter` verarbeitet bereits vorhandene Dateien (Video, Audio, ISO) ohne Laufwerks-Rip. ---- +## Betriebsmodell -## Überblick +Der Converter arbeitet auf dem Eingangspfad `converter_raw_dir`: -Der Converter arbeitet mit einem konfigurierbaren Eingangsordner (`converter_raw_dir`). Dateien werden dort abgelegt (manuell oder per Upload) und dann als Converter-Jobs in die Pipeline eingereiht. +- Uploads landen dort +- Explorer-Aktionen arbeiten dort +- daraus werden Converter-Jobs erstellt ---- +Wichtig: + +- Upload erzeugt nicht automatisch einen Job. +- Joberstellung erfolgt explizit über Auswahl im Explorer. ## Datei-Explorer -Der Datei-Explorer zeigt den Inhalt des `converter_raw_dir` als Baumstruktur. +Der Explorer zeigt den kompletten Baum unter `converter_raw_dir`. -### Verfügbare Aktionen +Aktionen: -| Aktion | Beschreibung | +| Aktion | Wirkung | |---|---| -| **Upload** | Dateien direkt aus dem Browser hochladen (bis zu 50 Dateien) | -| **Ordner erstellen** | Neuen Unterordner anlegen | -| **Umbenennen** | Datei oder Ordner umbenennen | -| **Verschieben** | Datei oder Ordner in einen anderen Unterordner verschieben | -| **Löschen** | Datei oder Ordner löschen (unwiderruflich) | -| **Scannen** | Eingangsordner manuell neu scannen | +| `Upload` | Dateien werden in den Raw-Baum geschrieben | +| `Ordner erstellen` | legt Unterordner im Raw-Baum an | +| `Umbenennen` | benennt Datei/Ordner im Raw-Baum um | +| `Verschieben` | verschiebt innerhalb des Raw-Baums | +| `Löschen` | entfernt Datei/Ordner dauerhaft | +| `Scannen` | synchronisiert Explorer und DB-Zuordnungen | -### Dateiauswahl +Upload-Regeln: -Dateien können per Checkbox ausgewählt werden. Aus der Auswahl lassen sich Jobs erstellen: +- Dateiendung muss in `Erlaubte Datei-Endungen*` enthalten sein +- bei Verstoß wird der Upload abgelehnt -- **Ein Job pro Datei** — jede Datei wird als eigenständiger Job angelegt -- **Gemeinsamer Job (Audio)** — mehrere Audio-Dateien werden zu einem gemeinsamen Job zusammengefasst +## Joberstellung aus Explorer-Auswahl -Erlaubte Dateiendungen werden in den Settings unter `Converter > Erlaubte Datei-Endungen*` als Checkboxen konfiguriert. +Es gibt zwei Audio-Strategien: ---- +1. `Ein Job pro Datei` +2. `Gemeinsamer Job (Audio)` -## Jobs erstellen und konfigurieren +Verhalten: -Nach der Auswahl und Job-Erstellung erscheinen die Jobs in der Job-Liste. +- Video/ISO werden grundsätzlich als Einzeljobs angelegt. +- Audio kann als Shared-Job mit mehreren Eingabedateien erzeugt werden. -### Job-Konfiguration +Shared-Audio-Job: -Jeder Job kann konfiguriert werden: +- hält mehrere `inputPaths` +- kann vor Start erweitert/reduziert werden (nur Audio-Dateien) -- **Medientyp:** Video, Audio oder Audiobook -- **Ausgabeformat:** z. B. `mkv`, `mp4`, `m4b`, `mp3`, `flac` -- **HandBrake-Preset:** für Video-Konvertierung -- **Track-Auswahl:** Video-, Audio- und Untertitel-Spuren -- **Metadaten:** Titel, Autor, Jahr (für Audiobooks) -- **MusicBrainz-Suche:** automatische Metadaten-Suche für Audiodateien +## Job-Konfiguration -### Job-Start +Vor Start je Job einstellbar: -Jobs starten sofort oder reihen sich in die Queue ein (abhängig von `Parallele Jobs`). +- `converterMediaType` (`video`, `audio`, `iso`) +- `outputFormat` +- Metadaten +- Track-/Titelwahl (bei video/iso) +- Pre-/Post-Encode-Skripte und Ketten ---- +Spezifika: + +- Video/ISO laufen durch Mediainfo/Review ähnlich zum Disc-Flow. +- Audio kann direkt mit Formatoptionen konfiguriert werden. + +## Ausgabe-Pfade + +### Video/ISO + +- Root: `converter_movie_dir` +- Dateiname: `Output-Template (Video)` +- Endung: aus gewähltem Output-Format + +### Audio + +- Root: `converter_audio_dir` +- Dateiname/Ordner: `Output-Template (Audio)` +- bei Shared-/Folder-Job: Ausgabe als Ordnerstruktur mit Trackdateien + +## Queue und Start + +Converter-Jobs laufen über dieselbe Pipeline-/Queue-Logik: + +- sofortiger Start wenn Limits frei +- sonst Queue-Eintrag + +Parallelität richtet sich nach den globalen Encode-Limits in `Settings`. ## Auto-Scan (Polling) -Wenn in den Settings `Converter > Auto-Scan (Polling)` aktiviert ist, wird der Eingangsordner automatisch in regelmäßigen Abständen gescannt. Neue Dateien werden in der DB erfasst und im Explorer angezeigt. +Mit aktiviertem Polling: -Das Scan-Intervall wird unter `Converter > Polling-Intervall (Sekunden)` konfiguriert (Standard: 300 Sekunden). +- `converter_raw_dir` wird zyklisch gescannt +- neue Dateien erscheinen automatisch im Explorer ---- +Relevante Settings: -## Hinweis zu Audiobooks +- `Auto-Scan (Polling)` +- `Polling-Intervall (Sekunden)` -Der dedizierte AAX-/Audiobook-Flow ist auf der Seite [Audiobooks](audiobooks.md) dokumentiert. +## Abgrenzung zu Audiobooks ---- - -## Einstellungen - -| Setting | Pfad in GUI | -|---|---| -| Eingangsordner | `Settings > Pfade > Converter Raw-Ordner` | -| Videoausgabe | `Settings > Pfade > Converter Ausgabe (Video)` | -| Audioausgabe | `Settings > Pfade > Converter Ausgabe (Audio)` | -| Erlaubte Endungen | `Settings > Converter > Erlaubte Datei-Endungen*` | -| Auto-Scan | `Settings > Converter > Auto-Scan (Polling)` | -| Scan-Intervall | `Settings > Converter > Polling-Intervall (Sekunden)` | -| Output-Template Video | `Settings > Pfade > Output-Template (Video)` | -| Output-Template Audio | `Settings > Pfade > Output-Template (Audio)` | +- `Converter`: beliebige Audio/Video/ISO-Dateien +- `Audiobooks`: dedizierter AAX-Workflow mit Kapitel-/Audiobook-Metadaten diff --git a/docs/gui/database.md b/docs/gui/database.md index 5eb451f..7ee6e3d 100644 --- a/docs/gui/database.md +++ b/docs/gui/database.md @@ -1,29 +1,35 @@ # Database (Expert) -`/database` ist eine erweiterte Ansicht für Power-User und Recovery-Fälle. +`/database` ist die Recovery- und Expertensicht für Fälle, in denen Dateisystem und Historie nicht mehr sauber zusammenpassen. ## Zugriff -- Route direkt aufrufen: `/database` -- nicht Teil der Standard-Navigation +- direkte Route: `/database` +- nicht Teil der Standardnavigation -## Bereiche +## Bereich `Gefundene RAW-Einträge` -### `Gefundene RAW-Einträge` - -Listet RAW-Ordner, die keinen zugehörigen Job-Eintrag haben. +Dieser Bereich listet RAW-Verzeichnisse ohne zugeordneten Historie-Job. Aktionen: -- `RAW prüfen` (Scan der konfigurierten RAW-Pfade) -- `Job anlegen` (Orphan-RAW in Historie importieren) +- `RAW prüfen`: scannt konfigurierte RAW-Wurzeln +- `Job anlegen`: erstellt aus einem orphan RAW einen neuen Historie-Job -## Typischer Einsatz +## Was bei `Job anlegen` passiert -- nach manuellen Dateioperationen -- nach Migrationen oder Recovery -- wenn RAW-Dateien vorhanden sind, aber kein Historieneintrag existiert +- RAW-Pfad wird als Importquelle registriert +- Job wird in die Historie geschrieben +- anschließende Analyse läuft als RAW-basierter Einstieg (ohne klassischen Disc-Read) -## Vorsicht +Typischer Einsatz: -Diese Seite erlaubt Eingriffe mit direkter Auswirkung auf Datenbestand und Historie. Vor Lösch- oder Importaktionen Pfade und Zieljob sorgfältig prüfen. +- manuelle Dateioperationen außerhalb der UI +- Migrationen +- Wiederherstellung nach abgebrochenen Läufen + +## Sicherheits- und Betriebsregeln + +- Aktionen wirken direkt auf produktive Historie/Dateipfade. +- Vor Import oder Löschung immer Pfad und Ziel prüfen. +- Diese Seite nur für Recovery-Szenarien nutzen, nicht für normalen Tagesbetrieb. diff --git a/docs/gui/downloads.md b/docs/gui/downloads.md index 10e79f9..9849378 100644 --- a/docs/gui/downloads.md +++ b/docs/gui/downloads.md @@ -1,53 +1,58 @@ # Downloads -Die Downloads-Seite ermöglicht es, Ausgabedateien aus abgeschlossenen Jobs als ZIP-Archiv herunterzuladen. +Auf `Downloads` werden ZIP-Archive für Historie-Artefakte erstellt und bereitgestellt. ---- +## Was heruntergeladen werden kann -## Überblick +Ein Download-Eintrag referenziert immer einen Historie-Job und genau ein Ziel: -Jobs, die in der Historie abgeschlossen sind, können in die Download-Queue eingereiht werden. Ripster erstellt daraus ein ZIP-Archiv, das direkt im Browser heruntergeladen werden kann. +- `RAW` +- `Output` ---- +Erzeugt wird ein ZIP-Archiv im Download-Verzeichnis des Backends. -## Download-Queue +## Statusmodell -Die Queue zeigt alle aktuellen Download-Einträge mit ihrem Status: - -| Status | Beschreibung | +| Status | Bedeutung | |---|---| -| **Ausstehend** | In der Queue, ZIP-Erstellung noch nicht gestartet | -| **Wird verarbeitet** | ZIP-Archiv wird gerade erstellt | -| **Bereit** | ZIP fertig, Download-Button verfügbar | -| **Fehlgeschlagen** | Fehler bei der ZIP-Erstellung | +| `queued` | Eintrag erstellt, wartet auf Verarbeitung | +| `processing` | ZIP wird gerade gebaut | +| `ready` | Archiv fertig, Download-Link aktiv | +| `failed` | Erzeugung oder Zugriff fehlgeschlagen | ---- +## Eintrag anlegen -## Download einreihen +Startpunkt ist die `Historie`: -Downloads können über die **Historie** eingereiht werden: +1. Job öffnen. +2. Download einreihen. +3. Ziel (`RAW` oder `Output`) wählen. +4. Status in `Downloads` verfolgen. -1. Job in der Historie öffnen -2. **Download einreihen** wählen -3. Ziel auswählen: `RAW-Dateien` oder `Ausgabedateien` -4. Den Eintrag in der Downloads-Queue verfolgen +## Wichtige Laufzeitdetails ---- +- Wenn bereits ein passendes, aktuelles Archiv existiert, kann der Eintrag wiederverwendet werden. +- Nach Backend-Neustart werden unterbrochene `queued`/`processing`-Einträge geprüft und fortgesetzt. +- Fehlt eine erwartete ZIP-Datei bei `ready`, wird der Eintrag auf `failed` gesetzt. -## Download starten +## Download auslösen -Sobald der Status **Bereit** angezeigt wird, kann die ZIP-Datei mit dem Download-Button heruntergeladen werden. +Bei Status `ready`: -ZIP-Dateinamen folgen dem Muster: `Job__.zip` +- Download-Button lädt die ZIP direkt aus `/api/downloads/:id/file`. ---- +## Einträge entfernen -## Einträge löschen +`Löschen` entfernt: -Abgeschlossene oder fehlerhafte Einträge können einzeln gelöscht werden. Die dazugehörige ZIP-Datei wird dabei ebenfalls vom Server entfernt. +- Queue-Metadaten +- zugehörige Archivdatei ---- +Nicht erlaubt: -## Echtzeit-Updates +- Löschen während `queued`/`processing` -Die Downloads-Seite aktualisiert sich automatisch per WebSocket (`DOWNLOADS_UPDATED`). Statusänderungen (z. B. von `Wird verarbeitet` zu `Bereit`) werden ohne Seiten-Reload angezeigt. +## Echtzeitaktualisierung + +Die Seite reagiert auf `DOWNLOADS_UPDATED` per WebSocket. +Dadurch sind Statuswechsel ohne Reload sichtbar. diff --git a/docs/gui/history.md b/docs/gui/history.md index 41344f4..33ac752 100644 --- a/docs/gui/history.md +++ b/docs/gui/history.md @@ -1,88 +1,89 @@ # Historie -Die Seite `Historie` ist für Suche, Prüfung und Nachbearbeitung bestehender Jobs. +`Historie` ist die Kontroll- und Nachbearbeitungsoberfläche für alle bereits angelegten Jobs. ## Hauptansicht -Filter und Werkzeuge: +Filter und Arbeitsmittel: -- Suche (Titel/IMDb) -- Status-Filter -- Medium-Filter (`Blu-ray`, `DVD`, `Sonstiges`) +- Suche (Titel, IMDb, Kontextbegriffe) +- Statusfilter +- Mediumfilter - Sortierung - Listen-/Grid-Layout -Jeder Eintrag zeigt: +Jeder Eintrag zeigt auf einen Blick: -- Poster, Titel, Jahr, IMDb -- Medium-Indikator -- Status -- Start/Ende -- Verfügbarkeit von RAW/Movie -- Ratings (wenn OMDb-Daten vorhanden) +- Titel, Jahr, Poster +- Status und Zeitstempel +- RAW-/Output-Verfügbarkeit +- Medien- und ggf. Containerhinweise -Klick auf einen Eintrag öffnet die Detailansicht. +## Detaildialog: Was dort zusammenläuft ---- +Der Detaildialog bündelt: -## Job-Detaildialog +- Metadaten (Film oder Serie) +- Jobstatus und Fehlertexte +- RAW-/Output-Pfade +- Encode-Plan und Trackauswahl +- ausgeführte Kommandodetails +- Prozesslog (`Tail` oder vollständig) -Bereiche: +Bei Seriencontainern wird disk-/child-orientiert dargestellt, nicht nur als Einzeljob. -- 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`) +## Nachbearbeitungsaktionen und Wirkung -Bei Serien-Containern zeigt der Dialog statt eines globalen Log-Blocks einen `Disks`-Bereich mit einzelnen Disk-Akkordeons. -Jede Disk kann dort separat geprüft und bearbeitet werden. +| Aktion | Typischer Einsatz | Technische Wirkung | +|---|---|---| +| `OMDb neu zuordnen` | falsches Match, Titel/Jahr korrigieren | Metadatenfelder werden neu geschrieben; Folder-Rename wird best effort angestoßen | +| `Review neu starten` | neue Track-/Titelbewertung nötig | Mediainfo/Review wird aus RAW neu aufgebaut | +| `RAW neu encodieren` | neuer Encode aus vorhandenem RAW | startet Encode ohne neuen Laufwerks-Rip | +| `Encode neu starten` | gleiche bestätigte Auswahl erneut fahren | letzter bestätigter Plan wird geladen, optional mit Bereinigung unvollständiger Ausgabe | +| `Retry Rippen` | Rip/Analyse neu anstoßen | neuer Rip-Lauf, inkl. erneuter RAW-Phase | -## Typische Aktionen im Detaildialog +Löschaktionen im Dialog: -- `OMDb neu zuordnen` -- `Encode neu starten` -- `Review neu starten` -- `RAW neu encodieren` -- `RAW löschen`, `Movie löschen`, `Beides löschen` +- `RAW löschen` +- `Movie löschen` +- `Beides löschen` - `Historieneintrag löschen` -- bei Queue-Lock: `Aus Queue löschen` -Zusätzlich bei Serien-Container-Disks: +## Löschvorschau und selektives Löschen -- `Im Ripper öffnen` (für `READY_TO_ENCODE`-Kinder) -- diskbezogene Löschaktionen (`RAW`, `Folgen`, `Beides`) mit Child-/Subjob-Scope -- diskbezogenes Löschen des Historieneintrags (inkl. Subjobs) +Vor endgültigem Löschen zeigt Ripster eine Vorschau mit: -## Wann welche Aktion? +- `RAW`-Kandidaten +- `Movie`-/Episoden-Kandidaten +- Related-Scope (Container/Kinder/verbundene Jobs) -| 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 | +Wichtige Punkte: ---- +- Pfade sind selektierbar. +- Für RAW-Löschung muss bei Mehrfachkandidaten mindestens ein RAW-Pfad gewählt werden. +- Schutzlogik verhindert Löschungen außerhalb erlaubter Root-Verzeichnisse. -## Löschen mit Vorschau +## Serien- und Multipart-Sicht in der Historie -Beim Löschen eines Historieneintrags (`Eintrag löschen`) gibt es eine Pfadvorschau: +### Serien -- getrennt nach `RAW` und Ausgabe (`Movie`/`Folgen`) -- für Serien-/Multipart-Fälle mit Scope auf verknüpfte Jobs -- selektierbare Pfade vor dem finalen Löschen +- Container zeigt aggregierten Zustand aus Child-Jobs. +- Disk-/Episode-Aktionen können child-spezifisch ausgeführt werden. +- `Im Ripper öffnen` hilft bei `Bereit zum Encodieren`-Kindern. -Neu im RAW-Bereich: +### Multipart -- bei mehreren RAW-Kandidaten kann pro Pfad gewählt werden, was entfernt wird -- mindestens ein RAW-Pfad muss gewählt sein, wenn RAW-Löschung Teil der Aktion ist +- gemeinsamer Container mit Disc-Childs +- Disc-Nummern bleiben pro Child nachvollziehbar +- Delete-Preview kann Related-Pfade gemeinsam auflösen -Die Buttons (`Eintrag + nur RAW`, `Eintrag + nur ...`, `Eintrag + RAW + ...`) berücksichtigen die aktuelle Pfadauswahl und deaktivieren sich bei unvollständiger Auswahl. +## Logs sinnvoll nutzen -## Logs +- `Tail laden (800)` für schnellen Fehlerkontext +- `Vollständiges Log laden` für forensische Analyse -- `Tail laden (800)` für schnelle Fehleranalyse -- `Vollständiges Log laden` für vollständige Nachverfolgung +Empfehlung: + +1. Erst Tail prüfen. +2. Bei Pfad-/Toolproblemen vollständiges Log laden. +3. Danach passende Wiederanlauf-Aktion wählen. diff --git a/docs/gui/index.md b/docs/gui/index.md index 2d346b5..276386b 100644 --- a/docs/gui/index.md +++ b/docs/gui/index.md @@ -1,32 +1,34 @@ # GUI-Seiten -Ripster hat sieben Hauptseiten in der Navigation plus eine Expert-Seite. +Dieses Kapitel ist das Bedienhandbuch für die Oberflächen im Alltag. ## Seitenüberblick -| Seite | Zweck | -|---|---| -| [Jobs](jobs.md) | zentrale Inbox mit allen Jobs (Ripper, Converter, Audiobooks) | -| [Ripper](ripper.md) | Live-Betrieb: Pipeline, Queue, Aktivitäten, Disc-Infos | -| [Audiobooks](audiobooks.md) | AAX-Upload, Audiobook-Jobsteuerung und Output-Explorer | -| [Settings](settings.md) | Konfiguration, Skripte, Ketten, Presets, Cronjobs | -| [Historie](history.md) | abgeschlossene/laufende Jobs durchsuchen und nachbearbeiten | -| [Converter](converter.md) | Audio/Video-Dateien konvertieren, Datei-Explorer, Upload | -| [Downloads](downloads.md) | Ausgabedateien als ZIP herunterladen | -| [Database (Expert)](database.md) | tabellarische Rohsicht inkl. Orphan-RAW-Import | +| Seite | Rolle im Betrieb | Typischer Einsatz | +|---|---|---| +| [Jobs](jobs.md) | zentrale Inbox | Gesamtlage prüfen und in Fachseite springen | +| [Ripper](ripper.md) | Live-Steuerung der Pipeline | Disc-Flow starten, Queue steuern, Review freigeben | +| [Audiobooks](audiobooks.md) | AAX-Spezialflow | Upload, Konfiguration und Encode von Audiobooks | +| [Settings](settings.md) | Konfiguration/Automatisierung | Pfade, Tools, Queue-Limits, Skripte, Cron | +| [Historie](history.md) | Nachbearbeitung und Kontrolle | Logs, Re-Encode, Löschvorschau, Recovery-Aktionen | +| [Converter](converter.md) | dateibasierte Konvertierung | Video/Audio/ISO ohne Disc-Rip verarbeiten | +| [Downloads](downloads.md) | ZIP-Exports | RAW/Output aus Historie bereitstellen | +| [Database (Expert)](database.md) | Recovery-Sicht | orphan RAW finden und importieren | -## Empfohlene Nutzung im Alltag +## Empfohlener Tagesablauf -1. **Ersten Überblick über alle Jobs:** `Jobs` -2. **Start eines neuen Disc-Jobs:** `Ripper` -3. **Audio/Video-Dateien konvertieren:** `Converter` -4. **AAX/Audiobook-Flow:** `Audiobooks` -5. **Regeln/Automatisierung anpassen:** `Settings` -6. **Ergebnisse prüfen oder Jobs nachbearbeiten:** `Historie` -7. **Dateien herunterladen:** `Downloads` -8. **Sonderfälle/Recovery:** `Database` +1. `Jobs`: Statuslage und Auffälligkeiten prüfen. +2. `Ripper` oder `Converter`/`Audiobooks`: neue Arbeit starten. +3. `Historie`: Ergebnisse validieren und ggf. nachbearbeiten. +4. `Downloads`: Exporte für externe Übergabe erzeugen. +5. `Settings`: Regeln und Limits nur kontrolliert anpassen. -## Hinweise zur Navigation +## Navigation -- `Jobs`, `Ripper`, `Converter`, `Audiobooks`, `Settings`, `Historie` und `Downloads` sind direkt in der Kopfnavigation. -- `Database` ist als Expert-Route verfügbar: `/database`. +Direkt in der Top-Navigation: + +- `Jobs`, `Ripper`, `Converter`, `Audiobooks`, `Settings`, `Historie`, `Downloads` + +Nur per URL: + +- `Database` unter `/database` diff --git a/docs/gui/jobs.md b/docs/gui/jobs.md index 8e5858e..b790faf 100644 --- a/docs/gui/jobs.md +++ b/docs/gui/jobs.md @@ -1,22 +1,18 @@ # Jobs -Die Seite `Jobs` ist die zentrale Inbox über alle Job-Typen. +`Jobs` ist die zentrale Inbox über alle Jobarten und dient als schneller Einstieg in den Tagesbetrieb. ---- +## Zweck der Seite -## Zweck +Die Liste vereinheitlicht: -`Jobs` zeigt denselben Datenbestand in einer einheitlichen Liste: - -- Ripper-Jobs (Blu-ray/DVD/CD) -- Converter-Jobs (Audio/Video/ISO) +- Disc-/Ripper-Jobs +- Converter-Jobs - Audiobook-Jobs -Die Seite eignet sich als schneller Einstieg, bevor man in den jeweiligen Fachbereich springt. +Dadurch kannst du unabhängig von der Fachseite zuerst den Gesamtzustand prüfen. ---- - -## Filter und Ansicht +## Filterlogik ### View-Filter @@ -31,26 +27,28 @@ Die Seite eignet sich als schneller Einstieg, bevor man in den jeweiligen Fachbe - `Aktiv` - `Fehler/Abbruch` -Zusätzlich gibt es eine Freitextsuche (Titel, Status, IMDb, Job-Kind etc.) und eine Paginierung. +Zusätzlich: ---- +- Freitextsuche +- Paginierung -## Was ein Eintrag zeigt +## Was ein Jobeintrag zeigt - Job-ID und Titel -- Status-Badge (inkl. Queue-Berücksichtigung) -- Job-Typ-Badge (z. B. Blu-ray, Converter Audio, Audiobook) -- Zeitstempel der letzten Aktualisierung +- Statusbadge +- Jobtypbadge (z. B. Blu-ray, DVD, Converter Audio, Audiobook) +- Aktualisierungszeit -Die Liste aktualisiert sich zyklisch automatisch. +Die Ansicht wird periodisch aktualisiert und ergänzt sich mit WebSocket-Events. ---- +## Schnellaktion pro Zeile -## Aktion - -Pro Eintrag gibt es einen Schnellzugriff: - -- `Im Ripper öffnen` für Disc-/Audiobook-orientierte Jobs +- `Im Ripper öffnen` für Disc-/Audiobook-nahe Jobs - `Im Converter öffnen` für Converter-Jobs -So gelangst du mit einem Klick in die passende Detailoberfläche. +So kommst du ohne Umwege in die Oberfläche mit den passenden Detailaktionen. + +## Empfohlener Einsatz + +1. In `Jobs` Störungen und Auslastung identifizieren. +2. Danach gezielt in `Ripper`, `Converter` oder `Historie` springen. diff --git a/docs/gui/ripper.md b/docs/gui/ripper.md index f0054f7..b1edc8d 100644 --- a/docs/gui/ripper.md +++ b/docs/gui/ripper.md @@ -1,8 +1,8 @@ # Ripper -Das Ripper ist die **Betriebszentrale** für laufende Jobs. +Die Seite `Ripper` ist die Live-Steuerung der Pipeline. Hier laufen Disc-Erkennung, Queue-Steuerung, Review und Encode-Start zusammen. -## Aufbau der Seite +## Seitenaufbau und Betriebslogik Die Bereiche erscheinen in dieser Reihenfolge: @@ -12,129 +12,157 @@ Die Bereiche erscheinen in dieser Reihenfolge: 4. `Job Übersicht` 5. `Disk-Information` ---- - ## 1) Hardware Monitoring -Zeigt live: +Zeigt kontinuierlich: -- CPU (gesamt + optional pro Kern) -- RAM -- GPU-Auslastung/Temperatur/VRAM -- freien Speicher in den konfigurierten Pfaden +- CPU / RAM +- GPU (wenn verfügbar) +- freie Speicherstände konfigurierter Pfade -Wichtig für den Betrieb: +Nutzen im Betrieb: -- Hohe Speicherauslastung oder fast volle Zielpfade früh erkennen -- über `Settings` aktivierbar/deaktivierbar (`Hardware Monitoring aktiviert`) +- Engpässe vor Jobfehlern erkennen +- Pfadfüllstände vor Start großer Batchs prüfen + +Gesteuert über `Settings`: + +- `Hardware Monitoring aktiviert` +- `Hardware Monitoring Intervall (ms)` ## 2) Job Queue -Zwei Spalten: +Es gibt zwei operative Zonen: - `Laufende Jobs` - `Warteschlange` -Mögliche Aktionen: +Mögliche Queue-Einträge: -- Queue per Drag-and-Drop umsortieren -- Queue-Job entfernen (`X`) -- zusätzliche Queue-Elemente einfügen (`+`): - - Skript - - Skriptkette - - Wartezeit +- Job-Startaktionen (`Start`, `Retry Rippen`, `RAW neu encodieren`, `Encode neu starten`, `Review neu berechnen`, `Audio CD starten`) +- Nicht-Job-Einträge (`Skript`, `Skriptkette`, `Warten`) -Hinweis: +Wichtige Regeln: -- `Parallel` zeigt den Wert aus `Settings` -> `Parallele Jobs`. +- Queue-Reihenfolge ist per Drag-and-Drop änderbar. +- `Warten` blockiert nachfolgende Queue-Starts bis kein aktiver Prozess mehr läuft. +- `Skript` und `Skriptkette` werden als Queue-Einträge mitgeführt. + +Parallelität kommt aus `Settings`: + +- `Max. parallele Film/Video Encodes` +- `Max. parallele Audio CD Jobs` +- `Max. Encodes gesamt` +- optional `Audio CDs: Queue-Reihenfolge überspringen` ## 3) Skript- / Cron-Status -Zeigt: +Zeigt Runtime-Aktivitäten: -- aktive Ausführungen (Skripte, Ketten, Cron) -- zuletzt abgeschlossene Ausführungen +- laufende Skripte +- laufende Ketten +- Cron-Ausführungen +- letzte abgeschlossene Aktivitäten -Mögliche Aktionen: +Aktionen: -- laufende Ketten: `Nächster Schritt` -- laufende Einträge: `Abbrechen` -- Historie der Aktivitäten: `Liste leeren` +- `Nächster Schritt` bei Ketten +- `Abbrechen` +- `Liste leeren` ## 4) Job Übersicht -Kompakte Jobliste mit Status, Fortschritt, ETA. Klick auf einen Job klappt die Detailsteuerung auf. +Die Jobliste ist der zentrale Arbeitsbereich. Ein Klick öffnet den jeweiligen `Pipeline-Status`. -Zusätzliche Kennzeichnungen in der Liste: +### Badges und Kontext -- `Serien-Container`/`Serien-Disk` für Staffel-Workflows -- `Multipart Movie` bei zusammengeführten Film-Discs -- Untertitel mit Disc-/Container-Infos (z. B. `Disc 2 | Container #123`) +Neben Status/Fortschritt zeigt die Liste je nach Job: -Im aufgeklappten Zustand erscheint die Karte `Pipeline-Status` mit allen zustandsabhängigen Aktionen. +- Serienkontext (`Serien-Container`, Staffel/Disk) +- Multipart-Kontext (`Multipart Movie`, Disc-Nr.) +- Queue-/Subjob-Kontext bei Serien-Episoden -### Zustandsabhängige Hauptaktionen +### Zustandsabhängige Aktionen -| Zustand | Typische Aktion | -|---|---| -| `Medium erkannt` / `Bereit` | `Analyse starten` | -| `Metadatenauswahl` | `Metadaten öffnen` | -| `Warte auf Auswahl` | Playlist wählen und `Playlist übernehmen` | -| `Startbereit` | `Job starten` | -| `Bereit zum Encodieren` | Tracks/Skripte prüfen, dann `Encoding starten` | -| laufend (`Analyse`/`Rippen`/`Encodieren`) | `Abbrechen` | -| `Fehler` / `Abgebrochen` | `Retry Rippen`, `Disk-Analyse neu starten` | +| Zustand | Hauptaktion im Ripper | Ergebnis | +|---|---|---| +| `Medium erkannt`, `Bereit` | `Analyse starten` | startet MakeMKV-Analyse | +| `Metadatenauswahl` | `Metadaten öffnen` | Film/Serie auswählen, Provider festlegen | +| `Warte auf Auswahl` | Playlist/Titel/RAW-Entscheidung bestätigen | setzt Flow fort zur Prüfung | +| `Startbereit` | `Job starten` | startet Rip oder RAW-basierte Prüfung | +| `Bereit zum Encodieren` | `Encoding starten` | startet HandBrake mit bestätigter Auswahl | +| Laufend (`Analyse`, `Rippen`, `Encodieren`) | `Abbrechen` | setzt Job auf `Abgebrochen` | +| `Fehler`, `Abgebrochen` | `Retry Rippen` | neuer Rip-Anlauf | -Zusätzlich je nach Job: +Zusatzaktionen je nach Zustand und Jobtyp: - `Review neu starten` - `Encode neu starten` +- `RAW neu encodieren` - `Aus Queue löschen` -### Titel-/Spurprüfung (`Bereit zum Encodieren`) +### Review-Bereich (`Bereit zum Encodieren`) -Im selben Block siehst du: +Hier wird die effektive Encode-Entscheidung festgelegt: -- Auswahl des Encode-Titels -- Audio-/Subtitle-Trackauswahl -- User-Preset-Auswahl +- Titelwahl +- Audio-/Subtitle-Trackselektion +- User-Preset - Pre-/Post-Encode-Skripte und Ketten -- Preview des finalen HandBrakeCLI-Befehls +- HandBrake-Kommandovorschau + +Ohne Bestätigung dieses Blocks startet kein produktiver Encode. + +### RAW-Ordnerphasen (sichtbar über Logs/Details) + +Der Ripper arbeitet mit drei RAW-Zuständen: + +- `Incomplete_...` während unvollständigem Rip +- `Rip_Complete_...` nach erfolgreich abgeschlossenem Rip, vor Encode +- ohne Prefix nach erfolgreichem Encode + +Das ist wichtig für Recovery und Delete-Vorschau. ## 5) Disk-Information -Zeigt aktuelles Laufwerk und Disc-Metadaten (`Pfad`, `Modell`, `Disc-Label`, `Mount`). +Zeigt aktuelle Laufwerksdaten: + +- Device-Pfad +- Modell +- Disc-Label / Mount Aktionen: - `Laufwerk neu lesen` - `Disk neu analysieren` -- `Metadaten-Modal öffnen` +- Metadaten-Dialog öffnen Hinweis: -- `Laufwerk neu lesen` ist nicht mehr an einen festen Pipeline-State gebunden und kann genutzt werden, solange kein Rescan-Request läuft. +- `Laufwerk neu lesen` ist nicht mehr an einen festen Pipeline-State gebunden. ---- - -## Wichtige Dialoge im Ripper +## Wichtige Dialoge ### Metadaten auswählen -- OMDb-Suche + Ergebnisliste -- manuelle Eingabe als Fallback -- `Auswahl übernehmen` startet den nächsten Pipeline-Schritt +Im Dialog werden Film-/Serienmetadaten bestätigt. -Bei Film-Duplikaten in der Historie öffnet sich ein Konfliktdialog: +Sonderfälle: -- `Übernahme erzwingen`: legt trotzdem einen neuen Job mit denselben Metadaten an -- `Multipart movie`: verknüpft bestehenden und neuen Job in einem Multipart-Container (mit separaten Disc-Nummern) -- `Zurück zur Auswahl`: zurück in die Metadatenliste +- Film-Duplikat: `Übernahme erzwingen` oder `Multipart movie` +- Serie: `Disc-Nummer` ist Pflicht -### Abbruch-Bereinigung +### Vorhandenes RAW erkannt -Nach Abbruch kann Ripster optional fragen, ob erzeugte RAW- oder Movie-Dateien gelöscht werden sollen. +Wenn passendes RAW existiert, fordert der Dialog eine explizite Entscheidung: + +- vorhandenes RAW verwenden +- RAW verwerfen/löschen und neu rippen ### Queue-Eintrag einfügen -Erstellt gezielt einen Skript-, Ketten- oder Warte-Eintrag an einer bestimmten Queue-Position. +Du kannst gezielt ab Position einfügen: + +- Skript +- Skriptkette +- Wartezeit diff --git a/docs/gui/settings.md b/docs/gui/settings.md index c8f8d1c..ef34b1e 100644 --- a/docs/gui/settings.md +++ b/docs/gui/settings.md @@ -1,92 +1,107 @@ # Settings -Die Seite `Settings` steuert Konfiguration und Automatisierung. +Die Seite `Settings` steuert alle Betriebsparameter von Ripster: Pfade, Tools, Queue-Limits, Metadatenquellen, Automatisierung. -## Tabs im Überblick +## Tab-Überblick -| Tab | Zweck | +| Tab | Hauptzweck | |---|---| -| `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 Ripper | -| `Cronjobs` | zeitgesteuerte Skript-/Kettenausführung | - ---- +| `Konfiguration` | globale und profilspezifische Laufzeitsettings | +| `Scripte` | einzelne Skripte verwalten und testen | +| `Skriptketten` | mehrstufige Abläufe aus Skript/Warten | +| `Encode-Presets` | wiederverwendbare HandBrake-Profile für Review | +| `Cronjobs` | zeitgesteuerte Ausführung von Skript/Kette | ## Tab `Konfiguration` -Wichtiges Bedienmuster: +### Bedienprinzip -1. Werte ändern -2. `Änderungen speichern` -3. bei Bedarf `Änderungen verwerfen` oder `Neu laden` +1. Werte ändern. +2. `Änderungen speichern`. +3. erst danach sind Werte für neue Aktionen wirksam. -Zusätzlich: +Zusätzliche Bedienhilfen: -- `PushOver Test` sendet eine Testnachricht -- Änderungen werden erst nach Speichern wirksam -- Tool-Preset-Felder bieten HandBrake-Presetauswahl direkt im Formular +- `Neu laden` verwirft lokale Formzustände +- `Änderungen verwerfen` setzt auf zuletzt gespeicherten Stand +- `PushOver Test` validiert Benachrichtigungszugang sofort + +### Was wirkt unmittelbar, was erst bei neuem Job? + +- Queue-/Parallelität wirkt auf neue Queue-Entscheidungen und Pump-Läufe. +- Tool-/Pfad-/Template-Änderungen wirken vollständig auf neu gestartete Schritte. +- Bereits laufende Prozesse übernehmen Änderungen in der Regel nicht rückwirkend. + +### Welche Bereiche im Alltag kritisch sind + +| Bereich | Kritisch für | +|---|---| +| `Pfade` | wo RAW, finale Ausgaben, Converter/Audiobook-Dateien landen | +| `Tools` | ob Analyze/Rip/Encode ausführbar sind | +| `Metadaten` | Film-/Serienzuordnung und Episode-Mapping | +| `Queue-Limits` | Durchsatz und Reihenfolgeverhalten | +| `Monitoring` | Sichtbarkeit von Last und Speicherengpässen | +| `Benachrichtigungen` | PushOver-Ereignisse je Pipelinephase | ## Tab `Scripte` Funktionen: -- Skript anlegen, bearbeiten, löschen -- Skript testen (`Test`) -- Reihenfolge per Drag-and-Drop +- anlegen, bearbeiten, löschen +- testen (`Test`) +- sortieren -Praxis: +Testausführung liefert: -- Reihenfolge ist wichtig, weil ausgewählte Skripte später sequentiell abgearbeitet werden. -- Testresultate zeigen Exit-Code, Dauer und stdout/stderr. +- Exit-Code +- Dauer +- stdout/stderr + +Wichtig: + +- Nur erfolgreiche Skripte sollten in produktive Pre-/Post-Listen übernommen werden. ## Tab `Skriptketten` -Funktionen: +Ketten bestehen aus Schritten: -- Kette anlegen/bearbeiten/löschen -- Kette testen -- Reihenfolge der Ketten per Drag-and-Drop +- `Skript` +- `Warten` -Im Ketten-Editor: +Typischer Einsatz: -- Bausteine links (`Warten`, vorhandene Skripte) -- Schritte rechts per Klick oder Drag-and-Drop hinzufügen -- Schrittreihenfolge im Canvas ändern +- externe Hooks vor/nach Encode +- gestaffelte Abläufe mit Pausen + +In der Queue erscheinen Ketten als eigene Einträge und werden dort ausgeführt. ## Tab `Encode-Presets` Ein Preset bündelt: -- optional HandBrake-Preset (`-Z`) +- optionales HandBrake-Preset (`-Z`) - optionale Extra-Args -- Medientyp (`Universell`, `Blu-ray`, `DVD`, `Sonstiges`) +- Medienziel (Universell/Blu-ray/DVD/Sonstiges) -Verwendung: - -- Diese Presets erscheinen später im Ripper im Review (`Bereit zum Encodieren`). +Im Ripper-Review kannst du Presets pro Job auswählen, statt Parameter jedes Mal neu zu setzen. ## Tab `Cronjobs` Funktionen: - Cronjob anlegen und bearbeiten -- Quelle wählen: Skript oder Skriptkette -- Cron-Ausdruck validieren +- Quelle wählen (`Skript` oder `Skriptkette`) +- Cron-Ausdruck prüfen - `Jetzt ausführen` -- Logs je Cronjob anzeigen -- `Aktiviert` und `Pushover` toggeln +- Job-Logs ansehen +- Aktivierung/Pushover toggeln -Hilfen: +Empfehlung: -- Beispiele für Cron-Ausdrücke direkt im Dialog -- Link zu `crontab.guru` im Editor +1. Skript/Kette manuell testen. +2. Dann Cron aktivieren. +3. Erste automatische Läufe aktiv im Runtime-Status kontrollieren. ---- +## Verbindung zur Einstellungsreferenz -## Empfehlung für stabile Nutzung - -1. Erst `Konfiguration` sauber setzen -2. dann Skripte/Ketten testen -3. danach Cronjobs aktivieren +Die vollständige Wirkung jeder einzelnen Einstellung steht in [Einstellungsreferenz](../configuration/settings-reference.md). diff --git a/docs/index.md b/docs/index.md index c422a0d..eb8df67 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,33 +1,24 @@ # Ripster Handbuch -Dieses Dokumentationsset ist als **Benutzerhandbuch** aufgebaut: erst Bedienung und Alltag, dann Technik im Anhang. +Diese Dokumentation ist als vollständiges Benutzerhandbuch aufgebaut: tägliche Bedienung zuerst, technische Referenz danach. ---- +## Einstieg in 3 Schritten -## Schnellstart in 3 Schritten +1. Installation: [Installation](getting-started/installation.md) +2. Betriebskonfiguration: [Ersteinrichtung](getting-started/configuration.md) +3. erster End-to-End-Lauf: [Erster Lauf](getting-started/quickstart.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 das Handbuch abdeckt ---- - -## Was du hier findest - -- **Benutzerhandbuch** - - Installation - - GUI-Seiten im Detail (`Jobs`, `Ripper`, `Converter`, `Audiobooks`, `Settings`, `Historie`, `Downloads`, `Database`) - - typische Arbeitsabläufe aus Anwendersicht -- **Technischer Anhang** - - vollständige Einstellungsreferenz - - Pipeline-/API-/Architekturdetails - - Deployment und Tool-Hintergründe - ---- +- alle GUI-Seiten mit Aktionen und Wirkung +- vollständige Workflows für Film, Serie und Multipart +- Queue-, Job-, Container- und Recovery-Verhalten +- detaillierte Settings-Wirkung inklusive Fallbacks ## Empfohlene Lesereihenfolge 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) +4. [Einstellungsreferenz](configuration/settings-reference.md) +5. bei Bedarf technischer Tiefgang im [Anhang](appendix/index.md) diff --git a/docs/workflows/index.md b/docs/workflows/index.md index f0c3735..ee35034 100644 --- a/docs/workflows/index.md +++ b/docs/workflows/index.md @@ -1,84 +1,207 @@ # Workflows aus Nutzersicht -Diese Seite beschreibt typische Abläufe mit den passenden UI-Aktionen. +Diese Seite beschreibt die produktiven Abläufe als Handbuch: welche Entscheidung an welcher Stelle fällt, welche Objekte dabei entstehen (Job, Container, Child-Job) und welche Dateien in welchen Ordnern landen. -## Workflow 1: Standardlauf (Disc -> fertige Datei) +## Gemeinsame Grundlagen -1. `Ripper`: Disc einlegen, `Analyse starten` -2. Metadaten im Dialog übernehmen -3. bei `Bereit zum Encodieren` Titel/Tracks prüfen -4. `Encoding starten` -5. Ergebnis in `Historie` kontrollieren +### Statuskette im Normalfall -## Workflow 2: Playlist-Entscheidung bei Blu-ray +`Medium erkannt` -> `Analyse` -> `Metadatenauswahl` -> `Startbereit` -> `Rippen` -> `Mediainfo-Pruefung` -> `Bereit zum Encodieren` -> `Encodieren` -> `Fertig` -1. Job landet in `Warte auf Auswahl` -2. im `Pipeline-Status` Playlist-Kandidaten vergleichen -3. gewünschte Playlist auswählen -4. `Playlist übernehmen` -5. danach normal weiter bis `Bereit zum Encodieren` +Abweichungen: -## Workflow 3: Mehrere Jobs mit Queue +- bei Blu-ray/DVD mit nötiger Playlistwahl: `Mediainfo-Pruefung` -> `Warte auf Auswahl` -> zurück in `Mediainfo-Pruefung` +- bei vorhandenem RAW: `Startbereit` springt direkt in Review/Prüfung ohne neuen Laufwerks-Rip +- bei Fehler/Abbruch: `Fehler` oder `Abgebrochen` mit Wiederanlauf-Aktionen -1. Parallel-Limit in `Settings` über `Parallele Jobs` setzen -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 +### Job- und Container-Typen -## Workflow 4: Nachbearbeitung eines bestehenden Jobs +| Typ | Zweck | Was enthält der Typ? | +|---|---|---| +| Normaler Disc-Job | Einzel-Film oder einzelne Disc | RAW-Pfad, Output-Pfad, Logs, Review | +| `dvd_series_container` | logischer Serien-Container (pro Serie/Staffel) | Metadatenanker, aggregierter Status über Kinder | +| `dvd_series_child` | einzelne Serien-Disc oder Serien-Episode-Job | eigentliche RAW-/Encode-Arbeit | +| `multipart_movie_container` | logischer Multipart-Film-Container | Zusammenfassung für mehrere Film-Discs | +| `multipart_movie_child` | einzelne Disc innerhalb Multipart-Film | Disc-spezifische RAW-/Encode-Daten | -In `Historie` -> Detaildialog: +Wichtig: -- 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` +- Container sind primär Ordnungs- und Statusobjekte. +- Dateien (RAW/Output) hängen an den Child-Jobs. -## Workflow 5: Automatisierung mit Skripten und Cron +## Workflow A: Film (Blu-ray/DVD) -1. `Settings` -> `Scripte`: Skripte anlegen und testen -2. `Settings` -> `Skriptketten`: Ketten bauen und testen -3. im Ripper-Review Pre-/Post-Ausführungen pro Job auswählen -4. `Settings` -> `Cronjobs`: zeitgesteuerte Ausführung konfigurieren -5. Status im Ripper (`Skript- / Cron-Status`) überwachen +### 1) Disc analysieren und Film-Metadaten wählen -## Workflow 6: Abbruch und Recovery +1. Im `Ripper` `Analyse starten`. +2. Im Metadaten-Dialog Film auswählen (OMDb bzw. manuelle Film-Metadaten). +3. `Auswahl übernehmen`. -### Fall A: Job wurde abgebrochen +Wirkung: -- im Ripper optional erzeugte RAW/Movie-Datei bereinigen -- anschließend je nach Ziel: `Retry Rippen` oder `Disk-Analyse neu starten` +- der Job wird als Film-Workflow geführt +- Film-Fingerprint für Duplikaterkennung wird gebildet (IMDb oder Titel/Jahr) -### Fall B: Job steht in `Bereit zum Encodieren`, ist aber nicht aktive Session +### 2) Duplikatfall entscheiden -- in `Historie`: `Im Ripper öffnen` -- im Ripper Review erneut prüfen und starten +Wenn Film mit gleichem Fingerprint bereits existiert, gibt es zwei Wege: -### Fall C: RAW ohne Historieneintrag +1. `Übernahme erzwingen` (`allow_new`): neuer unabhängiger Film-Job +2. `Multipart movie`: neuer Job wird mit bestehendem Job in einem Multipart-Container verknüpft -- `/database` öffnen -- Bereich `Gefundene RAW-Einträge` -- `Job anlegen` +Bei Multipart gilt: -## Workflow 7: Duplikat als Multipart Movie zusammenführen +- beide Discs brauchen unterschiedliche `Disc-Nummer` +- gleiche Disc-Nummer blockiert den Vorgang (`MULTIPART_DISC_ALREADY_EXISTS`) -1. `Ripper` -> `Metadaten auswählen` für einen Film-Job -2. bei Duplikat-Konflikt `Multipart movie` wählen -3. Disc-Nummern für bestehenden und neuen Job setzen (jeweils >= 1, unterschiedlich) -4. Metadaten übernehmen -5. in `Historie` den gemeinsamen Multipart-Container prüfen +### 3) RAW-Verzeichnis entsteht -## Workflow 8: Selektives Löschen in der Historie +Ordnername basiert auf Metadaten plus Job-ID: -1. in `Historie` einen Job öffnen und `Historieneintrag löschen` -2. Löschvorschau prüfen (`RAW` + Ausgabe) -3. gewünschte RAW-/Ausgabepfade gezielt auswählen -4. passende Aktion ausführen (`Eintrag + nur RAW`, `Eintrag + nur ...`, `Eintrag + RAW + ...`) +- `Incomplete_ () - RAW - job-` -## Workflow 9: Audiobook (AAX) verarbeiten +Zustandswechsel des RAW-Ordners: -1. Seite `Audiobooks` öffnen -2. AAX-Datei hochladen -3. Job-Konfiguration prüfen und starten -4. Fortschritt im Job-Panel verfolgen -5. Ergebnis im `Audiobook Output Explorer` und in der `Historie` prüfen +- beim Start: `Incomplete_...` +- nach erfolgreichem Rip: `Rip_Complete_...` +- nach erfolgreichem Encode: Prefix wird entfernt (final) + +### 4) Review und Encode + +In `Bereit zum Encodieren`: + +- Titel wählen +- Audio-/Subtitle-Spuren festlegen +- optional User-Preset +- optional Pre-/Post-Encode-Skripte oder Ketten + +Beim Start: + +- temporäre Ausgabe in `Incomplete_job-/.` +- nach Erfolg Verschiebung in finalen Zielpfad aus Film-Template + +## Workflow B: Serie (Blu-ray/DVD) + +### 1) Serienmodus aktivieren + +1. Disc analysieren. +2. Im Metadaten-Dialog Serienmetadaten wählen (TMDb-basiert). +3. `Disc-Nummer` setzen (Pflicht, ab 1). + +Wirkung: + +- Workflow-Kind wird `series` +- Seriencontainer wird gesucht/angelegt +- aktueller Job wird als `dvd_series_child` darunter geführt + +### 2) Seriencontainer und Disc-Konflikte + +Beim Speichern wird geprüft: + +- existiert für Serie/Staffel bereits ein Container? +- existiert in diesem Container bereits dieselbe `Disc-Nummer`? + +Wenn ja, wird blockiert (`SERIES_DISC_ALREADY_EXISTS`). + +### 3) Serien-RAW-Pfad + +Für Serien wird ein eigener RAW-Pfad bevorzugt: + +- Blu-ray: `raw_dir_bluray_series` (Fallback: `raw_dir_bluray`) +- DVD: `raw_dir_dvd_series` (Fallback: `raw_dir_dvd`) + +RAW-Namensbasis enthält Staffel/Disc (`SxDy`) und wird ebenfalls mit den Prefix-Phasen geführt: + +- `Incomplete_...` -> `Rip_Complete_...` -> final + +### 4) Serien-Review und Episoden-Ausgabe + +Beim Review werden Episoden-/Titelzuordnungen genutzt. Je nach Auswahl: + +- Einzel-Episode: Episode-Template +- Multi-Episode-Titel: Multi-Episode-Template + +Ausgabepfad: + +- Root: `series_dir_*` (Fallback auf `movie_dir_*`) +- Dateiname/Unterordner aus Serien-Template + +### 5) Multi-Episode-Disc als Batch + +Wenn mehrere Episoden-Titel aus einer Disc encodiert werden: + +- Ripster erzeugt Episode-Child-Jobs +- der ursprüngliche Disc-Job dient als Batch-Anker +- RAW-Finalisierung erfolgt erst, wenn alle Episode-Encodes abgeschlossen sind + +## Workflow C: Multipart-Film + +### Wann dieser Flow gedacht ist + +- gleicher Film auf mehreren Discs (z. B. Disc 1/Disc 2) +- Zusammengehörigkeit soll in Historie und Detailansichten sichtbar sein + +### Ablauf + +1. Film-Metadaten wählen. +2. Duplikatdialog -> `Multipart movie`. +3. Disc-Nummern für bestehenden und neuen Job festlegen. + +Wirkung: + +- `multipart_movie_container` wird angelegt oder wiederverwendet +- beteiligte Jobs werden `multipart_movie_child` +- Container führt gemeinsame Metadaten, Kinder führen je Disc die eigentlichen Artefakte + +## Workflow D: Vorhandenes RAW / RAW-Import + +### Fall 1: RAW bereits vorhanden bei Metadatenübernahme + +Nach Metadaten-Übernahme erkennt Ripster passende RAW-Ordner und setzt den Job auf Entscheidungsstatus. + +Möglichkeiten: + +- vorhandenes RAW weiterverwenden (kein neuer Rip) +- RAW löschen/ignorieren und neu rippen + +### Fall 2: Orphan-RAW aus `/database` + +1. In `Database` `RAW prüfen`. +2. Bei orphan RAW `Job anlegen`. +3. Job wird in Historie erzeugt und wie "Disk analysieren aus RAW" weiterverarbeitet. + +## Workflow E: Nachbearbeitung bestehender Jobs + +In `Historie` (Detaildialog): + +| Aktion | Wirkung | +|---|---| +| `OMDb neu zuordnen` | Metadaten neu schreiben, Folder-Rename wird best effort angestoßen | +| `Review neu starten` | Titel-/Spurprüfung aus aktuellem RAW neu aufbauen | +| `RAW neu encodieren` | Encode erneut aus vorhandenem RAW starten | +| `Encode neu starten` | letzte bestätigte Review-Einstellungen wiederverwenden | +| `Retry Rippen` | Rip/Analyse neu starten; alter Job-RAW kann bereinigt werden | + +## Wo landet was? (Artefakt-Matrix) + +| Artefakt | Film | Serie | Multipart | +|---|---|---|---| +| RAW | `raw_dir_*` | bevorzugt `raw_dir_*_series` | pro Child-Job im normalen Film-RAW-Schema | +| Finale Ausgabe | `movie_dir_*` + Film-Template | `series_dir_*` (Fallback `movie_dir_*`) + Serien-Templates | pro Child-Job normaler Film-Output | +| Container-Datensatz | nein | ja (`dvd_series_container`) | ja (`multipart_movie_container`) | +| Löschvorschau in Historie | einzelner Job oder Related Scope | Container-/Child-bezogen mit Pfadauswahl | Container-/Child-bezogen mit Pfadauswahl | + +## Queue-Verhalten im Alltag + +Die Startfreigabe hängt an vier Settings: + +- `Max. parallele Film/Video Encodes` +- `Max. parallele Audio CD Jobs` +- `Max. Encodes gesamt` +- `Audio CDs: Queue-Reihenfolge überspringen` + +Praxis: + +- Film/Video- und Audio/CD laufen in getrennten Lanes +- Gesamtlimit begrenzt beide gemeinsam +- Queue kann neben Jobs auch `Skript`, `Kette`, `Warten` enthalten diff --git a/site/configuration/settings-reference/index.html b/site/configuration/settings-reference/index.html index f7abbfb..5cfd72c 100644 --- a/site/configuration/settings-reference/index.html +++ b/site/configuration/settings-reference/index.html @@ -1 +1 @@ - Alle Einstellungen - Ripster

Einstellungsreferenz

Diese Seite listet die Felder so, wie sie in der GUI unter Settings angezeigt werden.

Hinweis: Interne Schlüsselnamen werden hier bewusst nicht verwendet. Falls du sie für Integrationen brauchst, nutze die API-Dokumentation.


Profil-System

Viele Felder sind pro Medientyp getrennt vorhanden:

  • Blu-ray
  • DVD
  • Sonstiges
  • Audiobook (neu ab v0.12.0)

Template-Platzhalter

Video-Templates

  • ${title} — Titel
  • ${year} — Erscheinungsjahr
  • ${imdbId} — IMDb-ID

Audiobook-Templates

  • {author} — Autor
  • {title} — Titel
  • {year} — Erscheinungsjahr
  • {narrator} — Sprecher
  • {series} — Buchreihe
  • {part} — Teil-Nummer
  • {format} — Ausgabeformat

Converter-Templates (Video)

  • {title}, {year}

Converter-Templates (Audio)

  • {artist}, {title}, {album}, {year}, {trackNr}

Nicht gesetzte Werte werden zu unknown.


Kategorie: Pfade

Feldname in der GUI Typ Default
Raw Ausgabeordner path data/output/raw
Raw Ausgabeordner (Blu-ray) path null
Raw Ausgabeordner (DVD) path null
Raw Ausgabeordner (Sonstiges) path null
Eigentümer Raw-Ordner (Blu-ray) string null
Eigentümer Raw-Ordner (DVD) string null
Eigentümer Raw-Ordner (Sonstiges) string null
Film Ausgabeordner path data/output/movies
Film Ausgabeordner (Blu-ray) path null
Film Ausgabeordner (DVD) path null
Film Ausgabeordner (Sonstiges) path null
Eigentümer Film-Ordner (Blu-ray) string null
Eigentümer Film-Ordner (DVD) string null
Eigentümer Film-Ordner (Sonstiges) string null
Log Ordner path data/logs
Audiobook RAW-Ordner path null
Eigentümer Audiobook RAW-Ordner string null
Audiobook Output-Ordner path null
Eigentümer Audiobook Output-Ordner string null
Output Template (Audiobook) string {author}/{author} - {title} ({year})
Audiobook RAW Template string {author} - {title} ({year})
Converter Raw-Ordner path null
Converter Ausgabe (Video) path null
Converter Ausgabe (Audio) path null
Output-Template (Video) string {title}
Output-Template (Audio) string {artist} - {title}

Kategorie: Laufwerk

Feldname in der GUI Typ Default Hinweis
Laufwerksmodus select auto Auto Discovery oder Explizites Device
Device Pfad path /dev/sr0 relevant bei Explizites Device
MakeMKV Source Index number 0 Disc-Index im Auto-Modus
Disc Auto-Erkennung aktiviert boolean true Automatische Disc-Erkennung per Polling
Polling Intervall (ms) number 4000 1000..60000

Kategorie: Monitoring

Feldname in der GUI Typ Default
Hardware Monitoring aktiviert boolean true
Hardware Monitoring Intervall (ms) number 5000

Kategorie: Tools (global)

Feldname in der GUI Typ Default
MakeMKV Kommando string makemkvcon
MakeMKV Key string null
Mediainfo Kommando string mediainfo
Minimale Titellaenge (Minuten) number 60
HandBrake Kommando string HandBrakeCLI
FFmpeg Kommando string ffmpeg
FFprobe Kommando string ffprobe
Encode-Neustart: unvollständige Ausgabe löschen boolean true
Parallele Jobs number 1

Blu-ray-spezifisch

Feldname in der GUI Typ Default
Mediainfo Extra Args (Blu-ray) string null
MakeMKV Rip Modus (Blu-ray) select backup
MakeMKV Analyze Extra Args (Blu-ray) string null
MakeMKV Rip Extra Args (Blu-ray) string null
HandBrake Preset (Blu-ray) string H.264 MKV 1080p30
HandBrake Extra Args (Blu-ray) string null
Ausgabeformat (Blu-ray) select mkv
Dateiname Template (Blu-ray) string ${title} (${year})
Ordnername Template (Blu-ray) string null

DVD-spezifisch

Feldname in der GUI Typ Default
Mediainfo Extra Args (DVD) string null
MakeMKV Rip Modus (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
Ausgabeformat (DVD) select mkv
Dateiname Template (DVD) string ${title} (${year})
Ordnername Template (DVD) string null

Kategorie: Converter

Feldname in der GUI Typ Default Hinweis
Erlaubte Datei-Endungen* string mkv,mp4,m2ts,iso,avi,mov,flac,mp3,wav,m4a,ogg,opus In der UI als Checkbox-Liste, ohne Punkt
Auto-Scan (Polling) boolean false Converter-Ordner automatisch scannen
Polling-Intervall (Sekunden) number 300 30..86400

Kategorie: Metadaten

Feldname in der GUI Typ Default
OMDb API Key string null
OMDb Typ select movie

Kategorie: Benachrichtigungen (PushOver)

Feldname in der GUI Typ Default
PushOver aktiviert boolean false
PushOver Token string null
PushOver User string null
PushOver Device (optional) string null
PushOver Titel-Präfix string Ripster
PushOver Priority number 0
PushOver Timeout (ms) number 7000
Bei Metadaten-Auswahl senden boolean true
Bei Rip-Start senden boolean true
Bei Encode-Start senden boolean true
Bei Erfolg senden boolean true
Bei Fehler senden boolean true
Bei Abbruch senden boolean true
Bei Re-Encode Start senden boolean true
Bei Re-Encode Erfolg senden boolean true
\ No newline at end of file + Alle Einstellungen - Ripster

Einstellungsreferenz

Diese Seite dokumentiert alle UI-Settings mit ihrer Wirkung auf Flows, Pfade, Queue und Automatisierung.

Wie Ripster Settings auflöst

Ripster arbeitet intern mit profilspezifischen Settings (bluray, dvd, cd, audiobook) und bildet sie auf effektive Laufzeitwerte ab.

Wichtige Regeln:

  1. Für bluray wird bei fehlenden profilierten Toolwerten auf dvd zurückgefallen, und umgekehrt.
  2. Für cd und audiobook gibt es nur das eigene Profil.
  3. Strikt profilgebundene Pfadkeys (raw_dir, movie_dir, series_dir plus Owner) fallen bei leeren Werten auf Installationsdefaults zurück.

Installationsdefaults:

  • RAW: data/output/raw
  • Movies: data/output/movies
  • Series: data/output/series
  • CD: data/output/cd
  • Audiobook RAW: data/output/audiobook-raw
  • Audiobook Output: data/output/audiobooks
  • Converter RAW: data/output/converter-raw
  • Converter Video: data/output/converted-movies
  • Converter Audio: data/output/converted-audio

Kritische Wirkungsbereiche

1) Pfad- und Template-Einstellungen

Diese Settings bestimmen direkt:

  • wo RAW landet
  • wo finale Ausgaben landen
  • wie Ordner/Dateinamen gerendert werden

Relevante Besonderheiten:

  • Serien-RAW nutzt bei Serienworkflow bevorzugt raw_dir_*_series.
  • Serien-Ausgabe nutzt series_dir_* und Serien-Templates (Episode/Multi-Episode).
  • Film-Ausgabe nutzt movie_dir_* und Film-Template.
  • Encode schreibt zunächst in Incomplete_job-<id> und finalisiert danach in den Zielpfad.

2) Queue- und Parallelitäts-Settings

Die vier Limits greifen kombiniert:

  • pipeline_max_parallel_jobs (Film/Video-Lane)
  • pipeline_max_parallel_cd_encodes (Audio/CD-Lane)
  • pipeline_max_total_encodes (globaler Deckel)
  • pipeline_cd_bypasses_queue (Audio-Lane darf Filmwarteschlange umgehen)

Effekt:

  • Film und Audio haben getrennte Lane-Limits.
  • Das Gesamtlimit überstimmt beide, sobald erreicht.
  • Queue kann zusätzlich Nicht-Job-Einträge (Skript, Kette, Warten) enthalten.

3) Serien-Metadaten-Settings

Diese steuern die Serienqualität direkt:

  • TMDb-Token aktiviert TMDb-gestützte Serienmetadaten.
  • Sprache/Fallback-Sprachen beeinflussen Titel- und Episodenauflösung.
  • Ordnungspräferenz steuert Episode-Order.
  • Disc-Profile-Reuse verbessert automatische Zuordnung über mehrere Discs.

4) Tool-Settings

Toolfelder (makemkv_*, mediainfo_*, handbrake_*, ffmpeg_*, ffprobe_*, cdparanoia_*) wirken unmittelbar auf die tatsächlich ausgeführten CLI-Aufrufe.

Typische Auswirkungen:

  • falscher Toolpfad => früher Pipelinefehler
  • geänderte Extra-Args => anderes Analyze-/Encode-Verhalten
  • geänderte Presets => andere HandBrake-Ausgaben

Template-Platzhalter

Film-Templates

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

Serien-Templates

  • {seriesTitle}, {seasonNr}, {episodeNr}, {episodeNoStart}, {episodeNoEnd}
  • {episodeRange}, {episodeTitle}, {parts}, {discNr}, {year}, {language}
  • führende Null möglich mit {0:seasonNr} etc.

Audiobook-Templates

  • {author}, {title}, {year}, {narrator}, {series}, {part}, {format}

Converter-Templates

  • Video: {title}, {year}
  • Audio: {artist}, {title}, {album}, {year}, {trackNr}

Vollständige Feldliste

Kategorie: Benachrichtigungen

GUI-Feld Key Typ Default Wirkung im System
Expertenmodus ui_expert_mode boolean false Schaltet erweiterte Einstellungen in der UI ein.
PushOver aktiviert pushover_enabled boolean false Master-Schalter für PushOver Versand.
PushOver Token pushover_token string leer Application Token für PushOver.
PushOver User pushover_user string leer User-Key für PushOver.
PushOver Device (optional) pushover_device string leer Optionales Ziel-Device in PushOver.
PushOver Titel-Präfix pushover_title_prefix string Ripster Prefix im PushOver Titel.
PushOver Priority pushover_priority number 0 Priorität -2 bis 2.
PushOver Timeout (ms) pushover_timeout_ms number 7000 HTTP Timeout für PushOver Requests.
Bei Metadaten-Auswahl senden pushover_notify_metadata_ready boolean true Sendet wenn Metadaten zur Auswahl bereitstehen.
Bei Rip-Start senden pushover_notify_rip_started boolean true Sendet beim Start des MakeMKV-Rips.
Bei Encode-Start senden pushover_notify_encoding_started boolean true Sendet beim Start von HandBrake.
Bei Erfolg senden pushover_notify_job_finished boolean true Sendet bei erfolgreich abgeschlossenem Job.
Bei Fehler senden pushover_notify_job_error boolean true Sendet bei Fehlern in der Pipeline.
Bei Abbruch senden pushover_notify_job_cancelled boolean true Sendet wenn Job manuell abgebrochen wurde.
Bei Re-Encode Start senden pushover_notify_reencode_started boolean true Sendet beim Start von RAW Re-Encode.
Bei Re-Encode Erfolg senden pushover_notify_reencode_finished boolean true Sendet bei erfolgreichem RAW Re-Encode.

Kategorie: Converter

GUI-Feld Key Typ Default Wirkung im System
Erlaubte Datei-Endungen* converter_scan_extensions string mkv,mp4,m2ts,iso,avi,mov,flac,mp3,wav,m4a,ogg,opus Erlaubte Datei-Endungen für den Converter-Scan (ohne Punkt). Wird in der UI als Checkbox-Liste gepflegt.
Auto-Scan (Polling) converter_polling_enabled boolean false Converter Raw-Ordner automatisch in regelmäßigen Abständen scannen.
Polling-Intervall (Sekunden) converter_polling_interval number 300 Intervall für automatischen Scan des Converter-Ordners.

Kategorie: Laufwerk

GUI-Feld Key Typ Default Wirkung im System
Laufwerksmodus drive_mode select auto Auto-Discovery oder explizites Device.
Device Pfad drive_device path /dev/sr0 Nur für expliziten Modus, z.B. /dev/sr0.
MakeMKV Source Index makemkv_source_index number 0 Disc Index im Auto-Modus.
Automatische Disk-Erkennung disc_auto_detection_enabled boolean true Wenn deaktiviert, findet keine automatische Laufwerksprüfung statt. Neue Disks werden nur per "Laufwerk neu lesen" erkannt.
Polling Intervall (ms) disc_poll_interval_ms number 4000 Intervall für Disk-Erkennung.

Kategorie: Metadaten

GUI-Feld Key Typ Default Wirkung im System
OMDb API Key omdb_api_key string leer API Key für Metadatensuche.
TMDb Read Access Token tmdb_api_read_access_token string leer Read Access Token für Serien-Metadaten über TheMovieDB (TMDb).
DVD Serien-Sprache dvd_series_language string de-DE Bevorzugte Sprache für Serien-Metadaten im TMDb-Format, z.B. de-DE oder en-US.
DVD Serien-Fallback-Sprachen dvd_series_fallback_languages string de-DE,en-US Kommagetrennte TMDb-Sprachen für Fallback-Titel, z.B. de-DE,en-US,fr-FR.
DVD Serien-Ordnung dvd_series_order_preference select episode_group Bevorzugte Episodenordnung für DVD-Serien. Episode Groups nutzen TMDb Alternate Orders, falls vorhanden.
DVD Disc-Profile wiederverwenden dvd_series_reuse_disc_profiles boolean true Verwendet zuvor bestätigte Disc-Profile erneut, um Episoden automatischer zuzuordnen.
OMDb Typ omdb_default_type select movie Vorauswahl für Suche.
MusicBrainz aktiviert musicbrainz_enabled boolean true MusicBrainz-Metadatensuche für CDs aktivieren.
Coverart-Nachladen aktiv coverart_recovery_enabled boolean true Wenn aktiv, werden fehlende Coverarts automatisch in Intervallen geprüft und nachgeladen.
Coverart-Prüfintervall (Stunden) coverart_recovery_interval_hours number 6 Intervall für automatische Prüfung fehlender Coverarts in Stunden.

Kategorie: Monitoring

GUI-Feld Key Typ Default Wirkung im System
Hardware Monitoring aktiviert hardware_monitoring_enabled boolean true Master-Schalter: aktiviert/deaktiviert das komplette Hardware-Monitoring (Polling + Berechnung + WebSocket-Updates).
Hardware Monitoring Intervall (ms) hardware_monitoring_interval_ms number 5000 Polling-Intervall für CPU/RAM/GPU/Storage-Metriken.

Kategorie: Pfade

GUI-Feld Key Typ Default Wirkung im System
Raw-Ordner (Blu-ray) raw_dir_bluray path leer RAW-Zielpfad für Blu-ray. Leer = Standardpfad (data/output/raw).
Raw-Ordner (DVD) raw_dir_dvd path leer RAW-Zielpfad für DVD. Leer = Standardpfad (data/output/raw).
CD RAW-Ordner raw_dir_cd path leer Basisordner für rohe CD-WAV-Dateien (cdparanoia-Output). Leer = Standardpfad (data/output/cd).
Audiobook RAW-Ordner raw_dir_audiobook path leer Basisordner für hochgeladene AAX-Dateien. Leer = Standardpfad (data/output/audiobook-raw).
Serien-Ordner (Blu-ray) series_dir_bluray path leer Zielordner für Blu-ray-Serienfolgen. Leer = Standardpfad (data/output/series).
Film-Ordner (Blu-ray) movie_dir_bluray path leer Encode-Zielpfad für Blu-ray. Leer = Standardpfad (data/output/movies).
Film-Ordner (DVD) movie_dir_dvd path leer Encode-Zielpfad für DVD. Leer = Standardpfad (data/output/movies).
Serien-Ordner (DVD) series_dir_dvd path leer Zielordner für DVD-Serienfolgen. Leer = Standardpfad (data/output/series).
CD Output-Ordner movie_dir_cd path leer Zielordner für encodierte CD-Ausgaben (FLAC, MP3 usw.). Leer = gleicher Ordner wie CD RAW-Ordner.
Audiobook Output-Ordner movie_dir_audiobook path leer Zielordner für encodierte Audiobook-Dateien. Leer = Standardpfad (data/output/audiobooks).
Externe Speicher external_storage_paths path [] Wird links unter "Freie Speicher" angezeigt.
Log Ordner log_dir path data/logs Basisordner für Logs. Job-Logs liegen direkt hier, Backend-Logs in /backend.
CD Output Template cd_output_template string {artist} - {album} ({year})/{trackNr} {artist} - {title} Template für relative CD-Ausgabepfade ohne Dateiendung. Platzhalter: {artist}, {album}, {year}, {title}, {trackNr}, {trackNo}. Unterordner sind über "/" möglich – alles nach dem letzten "/" ist der Dateiname. Die Endung wird über das gewählte Ausgabeformat gesetzt.
Output Template (Blu-ray) output_template_bluray string ${title} (${year})/${title} (${year}) Template für Ordner und Dateiname. Platzhalter: ${title}, ${year}, ${imdbId}. Unterordner über "/" möglich – alles nach dem letzten "/" ist der Dateiname. Die Endung wird über das gewählte Ausgabeformat gesetzt.
Output Template (Blu-ray Serie, Episode) output_template_bluray_series_episode string {seriesTitle}/Staffel {seasonNr}/S{seasonNr}E{episodeNr} - {episodeTitle} Template für einzelne Blu-ray-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNr}, {episodeTitle}, {discNr}, {year}, {language}. Optional mit führender Null: {0:seasonNr}, {0:episodeNr}.
Output Template (Blu-ray Serie, Multi-Episode) output_template_bluray_series_multi_episode string {seriesTitle}/Staffel {seasonNr}/S{0:seasonNr}E{episodeRange} - {episodeTitle} (Teil {parts}) Template für zusammengefasste Blu-ray-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNoStart}, {episodeNoEnd}, {episodeRange}, {episodeTitle}, {parts}, {discNr}, {year}, {language}. Optional mit führender Null: {0:seasonNr}, {0:episodeNoStart}, {0:episodeNoEnd}.
Output Template (DVD) output_template_dvd string ${title} (${year})/${title} (${year}) Template für Ordner und Dateiname. Platzhalter: ${title}, ${year}, ${imdbId}. Unterordner über "/" möglich – alles nach dem letzten "/" ist der Dateiname. Die Endung wird über das gewählte Ausgabeformat gesetzt.
Output Template (DVD Serie, Episode) output_template_dvd_series_episode string {seriesTitle}/Staffel {seasonNr}/S{seasonNr}E{episodeNr} - {episodeTitle} Template für einzelne DVD-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNr}, {episodeTitle}, {discNr}, {year}, {language}. Optional mit führender Null: {0:seasonNr}, {0:episodeNr}.
Output Template (DVD Serie, Multi-Episode) output_template_dvd_series_multi_episode string {seriesTitle}/Staffel {seasonNr}/S{0:seasonNr}E{episodeRange} - {episodeTitle} (Teil {parts}) Template für zusammengefasste DVD-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNoStart}, {episodeNoEnd}, {episodeRange}, {episodeTitle}, {parts}, {discNr}, {year}, {language}. Optional mit führender Null: {0:seasonNr}, {0:episodeNoStart}, {0:episodeNoEnd}.
Output Template (Audiobook) output_template_audiobook string {author}/{author} - {title} ({year}) Template für relative Audiobook-Ausgabepfade ohne Dateiendung. Platzhalter: {author}, {title}, {year}, {narrator}, {series}, {part}, {format}. Unterordner sind über "/" möglich.
Audiobook RAW Template audiobook_raw_template string {author} - {title} ({year}) Template für relative Audiobook-RAW-Ordner. Platzhalter: {author}, {title}, {year}, {narrator}, {series}, {part}.
Converter Raw-Ordner converter_raw_dir path leer Eingangsordner für den Converter (Import-Scan und Datei-Uploads). Jeder Upload erhält einen Unterordner. Leer = Standardpfad (data/output/converter-raw).
Converter Ausgabe (Video) converter_movie_dir path leer Ausgabepfad für konvertierte Video-Dateien. Leer = Standardpfad (data/output/converted-movies).
Converter Ausgabe (Audio) converter_audio_dir path leer Ausgabepfad für konvertierte Audio-Dateien. Leer = Standardpfad (data/output/converted-audio).
Output-Template (Video) converter_output_template_video string {title} Dateiname-Template für konvertierte Video-Dateien (ohne Endung). Platzhalter: {title}, {year}.
Output-Template (Audio) converter_output_template_audio string {artist} - {title} Dateiname-Template für konvertierte Audio-Dateien (ohne Endung). Platzhalter: {artist}, {title}, {album}, {year}, {trackNr}.
RAW-Ordner (Blu-ray Serie) raw_dir_bluray_series path leer RAW-Zielpfad für Blu-ray-Serien. Leer = gleicher Pfad wie RAW-Ordner (Blu-ray).
Eigentümer RAW-Ordner (Blu-ray Serie) raw_dir_bluray_series_owner string leer Eigentümer der Dateien im Format user:gruppe für Blu-ray-Serien-RAW. Leer = Eigentümer Raw-Ordner (Blu-ray).
Eigentümer Raw-Ordner (Blu-ray) raw_dir_bluray_owner string leer Eigentümer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes.
RAW-Ordner (DVD Serie) raw_dir_dvd_series path leer RAW-Zielpfad für DVD-Serien. Leer = gleicher Pfad wie RAW-Ordner (DVD).
Eigentümer RAW-Ordner (DVD Serie) raw_dir_dvd_series_owner string leer Eigentümer der Dateien im Format user:gruppe für DVD-Serien-RAW. Leer = Eigentümer Raw-Ordner (DVD).
Eigentümer Raw-Ordner (DVD) raw_dir_dvd_owner string leer Eigentümer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes.
Eigentümer CD RAW-Ordner raw_dir_cd_owner string leer Eigentümer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes.
Eigentümer Audiobook RAW-Ordner raw_dir_audiobook_owner string leer Eigentümer der Audiobook-RAW-Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes.
Eigentümer Serien-Ordner (Blu-ray) series_dir_bluray_owner string leer Eigentümer der Blu-ray-Serienausgaben im Format user:gruppe. Leer = Standardbenutzer des Dienstes.
Eigentümer Film-Ordner (Blu-ray) movie_dir_bluray_owner string leer Eigentümer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes.
Eigentümer Film-Ordner (DVD) movie_dir_dvd_owner string leer Eigentümer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes.
Eigentümer Serien-Ordner (DVD) series_dir_dvd_owner string leer Eigentümer der DVD-Serienausgaben im Format user:gruppe. Leer = Standardbenutzer des Dienstes.
Eigentümer CD Output-Ordner movie_dir_cd_owner string leer Eigentümer der encodierten CD-Ausgaben im Format user:gruppe. Leer = Standardbenutzer des Dienstes.
Eigentümer Audiobook Output-Ordner movie_dir_audiobook_owner string leer Eigentümer der encodierten Audiobook-Dateien im Format user:gruppe. Leer = Standardbenutzer des Dienstes.

Kategorie: Tools

GUI-Feld Key Typ Default Wirkung im System
MakeMKV Kommando makemkv_command string makemkvcon Pfad oder Befehl für makemkvcon.
MakeMKV Key makemkv_registration_key string leer Optionaler Registrierungsschlüssel. Wird vor Analyze/Rip automatisch per "makemkvcon reg" gesetzt.
Mediainfo Kommando mediainfo_command string mediainfo Pfad oder Befehl für mediainfo.
Minimale Titellänge (Minuten) makemkv_min_length_minutes number 60 Filtert kurze Titel beim Rip.
HandBrake Kommando handbrake_command string HandBrakeCLI Pfad oder Befehl für HandBrakeCLI.
Encode-Neustart: unvollständige Ausgabe löschen handbrake_restart_delete_incomplete_output boolean true Wenn aktiv, wird bei "Encode neu starten" der bisherige (nicht erfolgreiche) Output vor Start entfernt.
Max. parallele Film/Video Encodes pipeline_max_parallel_jobs number 1 Maximale Anzahl parallel laufender Film/Video Encode-Jobs. Gilt zusätzlich zum Gesamtlimit.
Max. parallele Audio CD Jobs pipeline_max_parallel_cd_encodes number 2 Maximale Anzahl parallel laufender Audio CD Jobs (Rip + Encode als Einheit). Gilt zusätzlich zum Gesamtlimit.
Max. Encodes gesamt (medienunabhängig) pipeline_max_total_encodes number 3 Gesamtlimit für alle parallel laufenden Encode-Jobs (Film + Audio CD). Dieses Limit hat Vorrang vor den Einzellimits.
Audio CDs: Queue-Reihenfolge überspringen pipeline_cd_bypasses_queue boolean false Wenn aktiv, können Audio CD Jobs unabhängig von Film-Jobs starten (überspringen die Film-Queue-Reihenfolge). Einzellimits und Gesamtlimit gelten weiterhin.
Script-Test Timeout (ms) script_test_timeout_ms number 0 Timeout fuer Script-Tests in den Settings. 0 = kein Timeout.
cdparanoia Kommando cdparanoia_command string cdparanoia Pfad oder Befehl für cdparanoia. Wird als Fallback genutzt wenn kein individuelles Kommando gesetzt ist.
FFmpeg Kommando ffmpeg_command string ffmpeg Pfad oder Befehl für ffmpeg. Wird für Audiobook-Encoding genutzt.
FFprobe Kommando ffprobe_command string ffprobe Pfad oder Befehl für ffprobe. Wird für Audiobook-Metadaten und Kapitel genutzt.
Mediainfo Extra Args mediainfo_extra_args_bluray string leer Zusätzliche CLI-Parameter für mediainfo (Blu-ray).
MakeMKV Rip Modus makemkv_rip_mode_bluray select backup backup: vollständige Blu-ray Struktur im RAW-Ordner (empfohlen, ermöglicht --decrypt).
MakeMKV Analyze Extra Args makemkv_analyze_extra_args_bluray string leer Zusätzliche CLI-Parameter für Analyze (Blu-ray).
MakeMKV Rip Extra Args makemkv_rip_extra_args_bluray string leer Zusätzliche CLI-Parameter für Rip (Blu-ray).
HandBrake Preset handbrake_preset_bluray string H.264 MKV 1080p30 Preset Name für -Z (Blu-ray). Leer = kein Preset, nur CLI-Parameter werden verwendet.
HandBrake Extra Args handbrake_extra_args_bluray string leer Zusätzliche CLI-Argumente (Blu-ray).
Ausgabeformat output_extension_bluray select mkv Dateiendung für finale Datei (Blu-ray).
Mediainfo Extra Args mediainfo_extra_args_dvd string leer Zusätzliche CLI-Parameter für mediainfo (DVD).
MakeMKV Rip Modus makemkv_rip_mode_dvd select backup backup: vollständige Disc-Struktur im RAW-Ordner (einzig gültige Option für DVDs).
MakeMKV Analyze Extra Args makemkv_analyze_extra_args_dvd string leer Zusätzliche CLI-Parameter für Analyze (DVD).
MakeMKV Rip Extra Args makemkv_rip_extra_args_dvd string leer Zusätzliche CLI-Parameter für Rip (DVD).
HandBrake Preset handbrake_preset_dvd string H.264 MKV 480p30 Preset Name für -Z (DVD). Leer = kein Preset, nur CLI-Parameter werden verwendet.
HandBrake Extra Args handbrake_extra_args_dvd string leer Zusätzliche CLI-Argumente (DVD).
Ausgabeformat output_extension_dvd select mkv Dateiendung für finale Datei (DVD).
\ No newline at end of file diff --git a/site/getting-started/configuration/index.html b/site/getting-started/configuration/index.html index 500db51..29f600a 100644 --- a/site/getting-started/configuration/index.html +++ b/site/getting-started/configuration/index.html @@ -1 +1 @@ - 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 Ausgabeordner, Film Ausgabeordner, Log Ordner
Tools MakeMKV Kommando, HandBrake Kommando, Mediainfo Kommando
Metadaten OMDb API Key, optional OMDb Typ

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 (Blu-ray und DVD)
  • Raw Ausgabeordner (Blu-ray und DVD)
  • Dateiname Template (Blu-ray und DVD)

3. Queue und Monitoring festlegen

  • Parallele Jobs für den gleichzeitigen Durchsatz
  • Hardware Monitoring aktiviert + Hardware Monitoring Intervall (ms) für Live-Metriken im Ripper

4. Optional: Push-Benachrichtigungen

In den Benachrichtigungsfeldern setzen:

  • PushOver aktiviert
  • PushOver Token
  • PushOver User

Dann über PushOver Test direkt prüfen.

2-Minuten-Funktionstest

  1. Ripper öffnen
  2. Disc einlegen
  3. Analyse starten
  4. Metadaten übernehmen
  5. Bis Bereit zum Encodieren 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 + Ersteinrichtung - Ripster

Ersteinrichtung

Diese Seite ist die Betriebs-Checkliste vor dem ersten produktiven Lauf.

Ziel der Ersteinrichtung

Vor dem ersten Job müssen drei Dinge stabil sein:

  1. Pfade stimmen (RAW, Output, Logs)
  2. Tools sind aufrufbar (MakeMKV, HandBrake, MediaInfo)
  3. Metadatenzugänge funktionieren (OMDb, optional TMDb/MusicBrainz)

Empfohlene Reihenfolge

1) Basis in Settings -> Konfiguration

Setze zuerst:

  • Raw-Ordner und Film-/Serien-Ordner
  • Log Ordner
  • MakeMKV Kommando, HandBrake Kommando, Mediainfo Kommando
  • OMDb API Key

Dann speichern.

2) Profile pro Medium festziehen

Ripster löst viele Werte profilspezifisch auf (bluray, dvd, cd, audiobook).

Pflichtprüfung:

  • RAW-Pfade je Profil
  • Output-Pfade je Profil
  • HandBrake-Preset je Profil
  • Output-Templates je Profil

Für Serien zusätzlich:

  • RAW-Ordner (Blu-ray/DVD Serie)
  • Serien-Ordner (Blu-ray/DVD)
  • Serien-Templates (Episode/Multi-Episode)

3) Queue-Verhalten definieren

Stelle ein:

  • Max. parallele Film/Video Encodes
  • Max. parallele Audio CD Jobs
  • Max. Encodes gesamt
  • optional Audio CDs: Queue-Reihenfolge überspringen

Damit steuerst du Durchsatz, Priorität und Lastverteilung.

4) Metadatenquellen absichern

Film:

  • OMDb-Key prüfen

Serien:

  • TMDb Read Access Token setzen
  • Sprache/Fallback-Sprachen festlegen

CD/Audiodaten:

  • MusicBrainz aktiviert nach Bedarf

5) Optional: Benachrichtigungen

  • PushOver-Zugangsdaten setzen
  • PushOver Test ausführen
  • Event-Toggles pro Phase prüfen

6) Optional: Automatisierung

  1. Skripte testen
  2. Skriptketten bauen/testen
  3. Cronjobs erst danach aktivieren

Funktionsprüfung (Kurztest)

  1. Disc in Ripper erkennen lassen.
  2. Analyse starten.
  3. Metadaten übernehmen.
  4. Bis Bereit zum Encodieren laufen.
  5. Encode starten und Abschluss in Historie prüfen.

Typische Konfigurationsfehler

Symptom Häufige Ursache
Job bleibt früh auf Fehler Toolkommando falsch oder nicht im PATH
RAW/Output landet am falschen Ort Profilpfade nicht gesetzt, Fallback greift
Serienausgabe landet bei Filmen Serienpfade/Serientemplates fehlen
Queue verhält sich unerwartet Gesamtlimit und Lane-Limits widersprechen sich

Weiter

\ No newline at end of file diff --git a/site/getting-started/quickstart/index.html b/site/getting-started/quickstart/index.html index 4b8d29c..0ce5b80 100644 --- a/site/getting-started/quickstart/index.html +++ b/site/getting-started/quickstart/index.html @@ -1 +1 @@ - Erster Lauf - Ripster

Erster Lauf

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

1. Ripper öffnen und Disc einlegen

Erwartung:

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

Wenn nichts passiert: Laufwerk neu lesen.

2. Analyse starten

Aktion im Ripper:

  • Analyse starten

Erwartung:

  • Status Analyse
  • 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: Rippen -> Mediainfo-Pruefung -> Bereit zum Encodieren
  • bei vorhandenem RAW: direkt Mediainfo-Pruefung -> Bereit zum Encodieren
  • bei unklarer Blu-ray-Playlist: Warte auf Auswahl (Playlist auswählen und übernehmen)

5. Review in Bereit zum Encodieren

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 Encodieren:

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

7. Ergebnis prüfen

Bei Fertig:

  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 + Erster Lauf - Ripster

Erster Lauf

Dieser Ablauf führt einen vollständigen Disc-Job von Erkennung bis fertiger Datei durch.

1) Disc erkennen

  1. Ripper öffnen.
  2. Disc einlegen.
  3. Auf Medium erkannt warten.

Prüfen:

  • Disk-Information zeigt Device/Label.
  • Falls nicht: Laufwerk neu lesen.

2) Analyse starten

Aktion:

  • Analyse starten

Erwartung:

  • Status Analyse
  • danach Metadaten-Dialog

3) Metadaten bestätigen

Im Dialog:

  1. Treffer suchen/auswählen.
  2. Bei Serie zusätzlich Disc-Nummer setzen.
  3. Auswahl übernehmen.

Mögliche Abzweigungen:

  • Duplikatfilm -> Übernahme erzwingen oder Multipart movie
  • vorhandenes RAW -> Entscheidungsdialog (weiterverwenden oder neu rippen)

4) Rip/Review-Phase

Normalfall:

  • Startbereit -> Rippen -> Mediainfo-Pruefung

Mögliche Alternativen:

  • vorhandenes RAW: direkter Sprung in Prüfung
  • Blu-ray/DVD-Entscheidung nötig: Warte auf Auswahl für Playlist/Titel

5) Encode-Review abschließen

Bei Bereit zum Encodieren:

  • Titel festlegen
  • Audio-/Subtitle-Spuren prüfen
  • optional Preset auswählen
  • optional Pre-/Post-Skripte wählen

Dann:

  • Encoding starten

6) Encoding überwachen

Während Encodieren:

  • Fortschritt/ETA im Ripper
  • Queue- und Runtime-Status beobachten
  • optional Logkontrolle in Historie

7) Ergebnis verifizieren

Nach Fertig:

  1. Historie öffnen.
  2. Jobdetail prüfen.
  3. Output-Pfad und Log plausibilisieren.

Kontrollpunkte:

  • finale Datei am erwarteten Template-Pfad
  • RAW-Ordnerzustand finalisiert (kein Incomplete_)

8) Typische Folgeaktionen

  • falsche Metadaten: OMDb neu zuordnen
  • andere Trackauswahl: Review neu starten
  • erneuter Encode aus RAW: RAW neu encodieren
  • gleicher Plan erneut: Encode neu starten
\ No newline at end of file diff --git a/site/gui/audiobooks/index.html b/site/gui/audiobooks/index.html index c876305..054e646 100644 --- a/site/gui/audiobooks/index.html +++ b/site/gui/audiobooks/index.html @@ -1 +1 @@ - Audiobooks - Ripster

Audiobooks

Die Seite Audiobooks ist die dedizierte Oberfläche für AAX- und Audiobook-Jobs.


Aufbau

  1. Audiobooks Upload
  2. Audiobook Jobs
  3. Audiobook Output Explorer

1) Audiobooks Upload

Hier werden AAX-Dateien hochgeladen und als Job vorbereitet.

Typische Schritte:

  1. Datei auswählen
  2. optional Format/Startverhalten setzen
  3. Upload starten

Während des Uploads zeigt die Seite Fortschritt und Status an.


2) Audiobook Jobs

Aktive Audiobook-Jobs werden als Karten dargestellt (mit Status und Fortschritt).

Pro Job sind je nach Zustand Aktionen verfügbar:

  • Starten (mit aktueller Audiobook-Konfiguration)
  • Abbrechen
  • Retry
  • Löschen

Zusätzlich:

  • Im Ripper springt in die Hauptansicht
  • Jobs laden periodisch nach und reagieren auf WebSocket-Updates

3) Audiobook Output Explorer

Read-only Baumansicht des konfigurierten Audiobook-Ausgabeordners:

  • Ordner- und Dateiansicht
  • Größen-/Zeitstempelübersicht
  • schnelle Kontrolle der erzeugten Ergebnisse

Abgrenzung zum Converter

Audio/Video-Datei-Konvertierung läuft weiterhin auf der Seite Converter. Der AAX-spezifische Flow (Upload, Start, Jobsteuerung, Output-Explorer) liegt auf Audiobooks.

\ No newline at end of file + Audiobooks - Ripster

Audiobooks

Die Seite Audiobooks ist der spezialisierte AAX-Workflow.

Ablaufübersicht

Die Oberfläche ist in drei Bereiche gegliedert:

  1. Audiobooks Upload
  2. Audiobook Jobs
  3. Audiobook Output Explorer

1) Audiobooks Upload

Der Upload verarbeitet ausschließlich AAX-Dateien.

Direkt nach Upload passieren im Hintergrund:

  • Probe/Metadatenanalyse (ffprobe)
  • Anlage eines RAW-Ordners per Audiobook RAW Template
  • Ablage der AAX-Datei im RAW-Pfad
  • Initiale Jobkonfiguration (Format, Kapitel, Metadaten)

Wichtige Parameter:

  • Zielformat (m4b, mp3, flac)
  • optionaler Sofortstart

Toolabhängigkeit:

  • ffprobe_command für Metadaten/Kapitel
  • ffmpeg_command für Encode/Cover-Extraktion

2) Audiobook Jobs

Jobkarten zeigen Zustand, Fortschritt und verfügbare Aktionen.

Typische Aktionen:

  • Starten
  • Abbrechen
  • Retry
  • Löschen
  • Im Ripper (Kontextwechsel)

Die Karten werden regelmäßig aktualisiert und durch WebSocket-Ereignisse ergänzt.

3) Audiobook Output Explorer

Read-only Explorer des Audiobook-Outputpfads:

  • Ordner-/Dateistruktur
  • Zeitstempel/Größen
  • schnelle Ergebnisprüfung ohne Dateisystemwechsel

Pfad- und Template-Logik

Bereich Gesteuert durch
RAW-Ablage raw_dir_audiobook + audiobook_raw_template
Finale Ausgabe movie_dir_audiobook + output_template_audiobook
Dateiformat Jobkonfiguration (m4b, mp3, flac)

Typische Probleme

  • Upload wird abgelehnt: Eingabedatei ist keine AAX-Datei.
  • Start schlägt fehl: ffmpeg/ffprobe nicht aufrufbar.
  • Unerwartete Pfade: Templates enthalten ungültige oder zu generische Platzhalter.
\ No newline at end of file diff --git a/site/gui/converter/index.html b/site/gui/converter/index.html index 85f47f9..224e05f 100644 --- a/site/gui/converter/index.html +++ b/site/gui/converter/index.html @@ -1 +1 @@ - Converter - Ripster

Converter

Die Converter-Seite ermöglicht das Konvertieren vorhandener Audio- und Video-Dateien.


Überblick

Der Converter arbeitet mit einem konfigurierbaren Eingangsordner (converter_raw_dir). Dateien werden dort abgelegt (manuell oder per Upload) und dann als Converter-Jobs in die Pipeline eingereiht.


Datei-Explorer

Der Datei-Explorer zeigt den Inhalt des converter_raw_dir als Baumstruktur.

Verfügbare Aktionen

Aktion Beschreibung
Upload Dateien direkt aus dem Browser hochladen (bis zu 50 Dateien)
Ordner erstellen Neuen Unterordner anlegen
Umbenennen Datei oder Ordner umbenennen
Verschieben Datei oder Ordner in einen anderen Unterordner verschieben
Löschen Datei oder Ordner löschen (unwiderruflich)
Scannen Eingangsordner manuell neu scannen

Dateiauswahl

Dateien können per Checkbox ausgewählt werden. Aus der Auswahl lassen sich Jobs erstellen:

  • Ein Job pro Datei — jede Datei wird als eigenständiger Job angelegt
  • Gemeinsamer Job (Audio) — mehrere Audio-Dateien werden zu einem gemeinsamen Job zusammengefasst

Erlaubte Dateiendungen werden in den Settings unter Converter > Erlaubte Datei-Endungen* als Checkboxen konfiguriert.


Jobs erstellen und konfigurieren

Nach der Auswahl und Job-Erstellung erscheinen die Jobs in der Job-Liste.

Job-Konfiguration

Jeder Job kann konfiguriert werden:

  • Medientyp: Video, Audio oder Audiobook
  • Ausgabeformat: z. B. mkv, mp4, m4b, mp3, flac
  • HandBrake-Preset: für Video-Konvertierung
  • Track-Auswahl: Video-, Audio- und Untertitel-Spuren
  • Metadaten: Titel, Autor, Jahr (für Audiobooks)
  • MusicBrainz-Suche: automatische Metadaten-Suche für Audiodateien

Job-Start

Jobs starten sofort oder reihen sich in die Queue ein (abhängig von Parallele Jobs).


Auto-Scan (Polling)

Wenn in den Settings Converter > Auto-Scan (Polling) aktiviert ist, wird der Eingangsordner automatisch in regelmäßigen Abständen gescannt. Neue Dateien werden in der DB erfasst und im Explorer angezeigt.

Das Scan-Intervall wird unter Converter > Polling-Intervall (Sekunden) konfiguriert (Standard: 300 Sekunden).


Hinweis zu Audiobooks

Der dedizierte AAX-/Audiobook-Flow ist auf der Seite Audiobooks dokumentiert.


Einstellungen

Setting Pfad in GUI
Eingangsordner Settings > Pfade > Converter Raw-Ordner
Videoausgabe Settings > Pfade > Converter Ausgabe (Video)
Audioausgabe Settings > Pfade > Converter Ausgabe (Audio)
Erlaubte Endungen Settings > Converter > Erlaubte Datei-Endungen*
Auto-Scan Settings > Converter > Auto-Scan (Polling)
Scan-Intervall Settings > Converter > Polling-Intervall (Sekunden)
Output-Template Video Settings > Pfade > Output-Template (Video)
Output-Template Audio Settings > Pfade > Output-Template (Audio)
\ No newline at end of file + Converter - Ripster

Converter

Die Seite Converter verarbeitet bereits vorhandene Dateien (Video, Audio, ISO) ohne Laufwerks-Rip.

Betriebsmodell

Der Converter arbeitet auf dem Eingangspfad converter_raw_dir:

  • Uploads landen dort
  • Explorer-Aktionen arbeiten dort
  • daraus werden Converter-Jobs erstellt

Wichtig:

  • Upload erzeugt nicht automatisch einen Job.
  • Joberstellung erfolgt explizit über Auswahl im Explorer.

Datei-Explorer

Der Explorer zeigt den kompletten Baum unter converter_raw_dir.

Aktionen:

Aktion Wirkung
Upload Dateien werden in den Raw-Baum geschrieben
Ordner erstellen legt Unterordner im Raw-Baum an
Umbenennen benennt Datei/Ordner im Raw-Baum um
Verschieben verschiebt innerhalb des Raw-Baums
Löschen entfernt Datei/Ordner dauerhaft
Scannen synchronisiert Explorer und DB-Zuordnungen

Upload-Regeln:

  • Dateiendung muss in Erlaubte Datei-Endungen* enthalten sein
  • bei Verstoß wird der Upload abgelehnt

Joberstellung aus Explorer-Auswahl

Es gibt zwei Audio-Strategien:

  1. Ein Job pro Datei
  2. Gemeinsamer Job (Audio)

Verhalten:

  • Video/ISO werden grundsätzlich als Einzeljobs angelegt.
  • Audio kann als Shared-Job mit mehreren Eingabedateien erzeugt werden.

Shared-Audio-Job:

  • hält mehrere inputPaths
  • kann vor Start erweitert/reduziert werden (nur Audio-Dateien)

Job-Konfiguration

Vor Start je Job einstellbar:

  • converterMediaType (video, audio, iso)
  • outputFormat
  • Metadaten
  • Track-/Titelwahl (bei video/iso)
  • Pre-/Post-Encode-Skripte und Ketten

Spezifika:

  • Video/ISO laufen durch Mediainfo/Review ähnlich zum Disc-Flow.
  • Audio kann direkt mit Formatoptionen konfiguriert werden.

Ausgabe-Pfade

Video/ISO

  • Root: converter_movie_dir
  • Dateiname: Output-Template (Video)
  • Endung: aus gewähltem Output-Format

Audio

  • Root: converter_audio_dir
  • Dateiname/Ordner: Output-Template (Audio)
  • bei Shared-/Folder-Job: Ausgabe als Ordnerstruktur mit Trackdateien

Queue und Start

Converter-Jobs laufen über dieselbe Pipeline-/Queue-Logik:

  • sofortiger Start wenn Limits frei
  • sonst Queue-Eintrag

Parallelität richtet sich nach den globalen Encode-Limits in Settings.

Auto-Scan (Polling)

Mit aktiviertem Polling:

  • converter_raw_dir wird zyklisch gescannt
  • neue Dateien erscheinen automatisch im Explorer

Relevante Settings:

  • Auto-Scan (Polling)
  • Polling-Intervall (Sekunden)

Abgrenzung zu Audiobooks

  • Converter: beliebige Audio/Video/ISO-Dateien
  • Audiobooks: dedizierter AAX-Workflow mit Kapitel-/Audiobook-Metadaten
\ No newline at end of file diff --git a/site/gui/database/index.html b/site/gui/database/index.html index f1a90f4..e20db40 100644 --- a/site/gui/database/index.html +++ b/site/gui/database/index.html @@ -1 +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

Gefundene RAW-Einträge

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 + Database (Expert) - Ripster

Database (Expert)

/database ist die Recovery- und Expertensicht für Fälle, in denen Dateisystem und Historie nicht mehr sauber zusammenpassen.

Zugriff

  • direkte Route: /database
  • nicht Teil der Standardnavigation

Bereich Gefundene RAW-Einträge

Dieser Bereich listet RAW-Verzeichnisse ohne zugeordneten Historie-Job.

Aktionen:

  • RAW prüfen: scannt konfigurierte RAW-Wurzeln
  • Job anlegen: erstellt aus einem orphan RAW einen neuen Historie-Job

Was bei Job anlegen passiert

  • RAW-Pfad wird als Importquelle registriert
  • Job wird in die Historie geschrieben
  • anschließende Analyse läuft als RAW-basierter Einstieg (ohne klassischen Disc-Read)

Typischer Einsatz:

  • manuelle Dateioperationen außerhalb der UI
  • Migrationen
  • Wiederherstellung nach abgebrochenen Läufen

Sicherheits- und Betriebsregeln

  • Aktionen wirken direkt auf produktive Historie/Dateipfade.
  • Vor Import oder Löschung immer Pfad und Ziel prüfen.
  • Diese Seite nur für Recovery-Szenarien nutzen, nicht für normalen Tagesbetrieb.
\ No newline at end of file diff --git a/site/gui/downloads/index.html b/site/gui/downloads/index.html index 99ca953..cbe158f 100644 --- a/site/gui/downloads/index.html +++ b/site/gui/downloads/index.html @@ -1 +1 @@ - Downloads - Ripster

Downloads

Die Downloads-Seite ermöglicht es, Ausgabedateien aus abgeschlossenen Jobs als ZIP-Archiv herunterzuladen.


Überblick

Jobs, die in der Historie abgeschlossen sind, können in die Download-Queue eingereiht werden. Ripster erstellt daraus ein ZIP-Archiv, das direkt im Browser heruntergeladen werden kann.


Download-Queue

Die Queue zeigt alle aktuellen Download-Einträge mit ihrem Status:

Status Beschreibung
Ausstehend In der Queue, ZIP-Erstellung noch nicht gestartet
Wird verarbeitet ZIP-Archiv wird gerade erstellt
Bereit ZIP fertig, Download-Button verfügbar
Fehlgeschlagen Fehler bei der ZIP-Erstellung

Download einreihen

Downloads können über die Historie eingereiht werden:

  1. Job in der Historie öffnen
  2. Download einreihen wählen
  3. Ziel auswählen: RAW-Dateien oder Ausgabedateien
  4. Den Eintrag in der Downloads-Queue verfolgen

Download starten

Sobald der Status Bereit angezeigt wird, kann die ZIP-Datei mit dem Download-Button heruntergeladen werden.

ZIP-Dateinamen folgen dem Muster: Job_<id>_<target>.zip


Einträge löschen

Abgeschlossene oder fehlerhafte Einträge können einzeln gelöscht werden. Die dazugehörige ZIP-Datei wird dabei ebenfalls vom Server entfernt.


Echtzeit-Updates

Die Downloads-Seite aktualisiert sich automatisch per WebSocket (DOWNLOADS_UPDATED). Statusänderungen (z. B. von Wird verarbeitet zu Bereit) werden ohne Seiten-Reload angezeigt.

\ No newline at end of file + Downloads - Ripster

Downloads

Auf Downloads werden ZIP-Archive für Historie-Artefakte erstellt und bereitgestellt.

Was heruntergeladen werden kann

Ein Download-Eintrag referenziert immer einen Historie-Job und genau ein Ziel:

  • RAW
  • Output

Erzeugt wird ein ZIP-Archiv im Download-Verzeichnis des Backends.

Statusmodell

Status Bedeutung
queued Eintrag erstellt, wartet auf Verarbeitung
processing ZIP wird gerade gebaut
ready Archiv fertig, Download-Link aktiv
failed Erzeugung oder Zugriff fehlgeschlagen

Eintrag anlegen

Startpunkt ist die Historie:

  1. Job öffnen.
  2. Download einreihen.
  3. Ziel (RAW oder Output) wählen.
  4. Status in Downloads verfolgen.

Wichtige Laufzeitdetails

  • Wenn bereits ein passendes, aktuelles Archiv existiert, kann der Eintrag wiederverwendet werden.
  • Nach Backend-Neustart werden unterbrochene queued/processing-Einträge geprüft und fortgesetzt.
  • Fehlt eine erwartete ZIP-Datei bei ready, wird der Eintrag auf failed gesetzt.

Download auslösen

Bei Status ready:

  • Download-Button lädt die ZIP direkt aus /api/downloads/:id/file.

Einträge entfernen

Löschen entfernt:

  • Queue-Metadaten
  • zugehörige Archivdatei

Nicht erlaubt:

  • Löschen während queued/processing

Echtzeitaktualisierung

Die Seite reagiert auf DOWNLOADS_UPDATED per WebSocket. Dadurch sind Statuswechsel ohne Reload sichtbar.

\ No newline at end of file diff --git a/site/gui/history/index.html b/site/gui/history/index.html index 13ac860..21a9bfe 100644 --- a/site/gui/history/index.html +++ b/site/gui/history/index.html @@ -1 +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)

Bei Serien-Containern zeigt der Dialog statt eines globalen Log-Blocks einen Disks-Bereich mit einzelnen Disk-Akkordeons. Jede Disk kann dort separat geprüft und bearbeitet werden.

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

Zusätzlich bei Serien-Container-Disks:

  • Im Ripper öffnen (für READY_TO_ENCODE-Kinder)
  • diskbezogene Löschaktionen (RAW, Folgen, Beides) mit Child-/Subjob-Scope
  • diskbezogenes Löschen des Historieneintrags (inkl. Subjobs)

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

Löschen mit Vorschau

Beim Löschen eines Historieneintrags (Eintrag löschen) gibt es eine Pfadvorschau:

  • getrennt nach RAW und Ausgabe (Movie/Folgen)
  • für Serien-/Multipart-Fälle mit Scope auf verknüpfte Jobs
  • selektierbare Pfade vor dem finalen Löschen

Neu im RAW-Bereich:

  • bei mehreren RAW-Kandidaten kann pro Pfad gewählt werden, was entfernt wird
  • mindestens ein RAW-Pfad muss gewählt sein, wenn RAW-Löschung Teil der Aktion ist

Die Buttons (Eintrag + nur RAW, Eintrag + nur ..., Eintrag + RAW + ...) berücksichtigen die aktuelle Pfadauswahl und deaktivieren sich bei unvollständiger Auswahl.

Logs

  • Tail laden (800) für schnelle Fehleranalyse
  • Vollständiges Log laden für vollständige Nachverfolgung
\ No newline at end of file + Historie - Ripster

Historie

Historie ist die Kontroll- und Nachbearbeitungsoberfläche für alle bereits angelegten Jobs.

Hauptansicht

Filter und Arbeitsmittel:

  • Suche (Titel, IMDb, Kontextbegriffe)
  • Statusfilter
  • Mediumfilter
  • Sortierung
  • Listen-/Grid-Layout

Jeder Eintrag zeigt auf einen Blick:

  • Titel, Jahr, Poster
  • Status und Zeitstempel
  • RAW-/Output-Verfügbarkeit
  • Medien- und ggf. Containerhinweise

Detaildialog: Was dort zusammenläuft

Der Detaildialog bündelt:

  • Metadaten (Film oder Serie)
  • Jobstatus und Fehlertexte
  • RAW-/Output-Pfade
  • Encode-Plan und Trackauswahl
  • ausgeführte Kommandodetails
  • Prozesslog (Tail oder vollständig)

Bei Seriencontainern wird disk-/child-orientiert dargestellt, nicht nur als Einzeljob.

Nachbearbeitungsaktionen und Wirkung

Aktion Typischer Einsatz Technische Wirkung
OMDb neu zuordnen falsches Match, Titel/Jahr korrigieren Metadatenfelder werden neu geschrieben; Folder-Rename wird best effort angestoßen
Review neu starten neue Track-/Titelbewertung nötig Mediainfo/Review wird aus RAW neu aufgebaut
RAW neu encodieren neuer Encode aus vorhandenem RAW startet Encode ohne neuen Laufwerks-Rip
Encode neu starten gleiche bestätigte Auswahl erneut fahren letzter bestätigter Plan wird geladen, optional mit Bereinigung unvollständiger Ausgabe
Retry Rippen Rip/Analyse neu anstoßen neuer Rip-Lauf, inkl. erneuter RAW-Phase

Löschaktionen im Dialog:

  • RAW löschen
  • Movie löschen
  • Beides löschen
  • Historieneintrag löschen

Löschvorschau und selektives Löschen

Vor endgültigem Löschen zeigt Ripster eine Vorschau mit:

  • RAW-Kandidaten
  • Movie-/Episoden-Kandidaten
  • Related-Scope (Container/Kinder/verbundene Jobs)

Wichtige Punkte:

  • Pfade sind selektierbar.
  • Für RAW-Löschung muss bei Mehrfachkandidaten mindestens ein RAW-Pfad gewählt werden.
  • Schutzlogik verhindert Löschungen außerhalb erlaubter Root-Verzeichnisse.

Serien- und Multipart-Sicht in der Historie

Serien

  • Container zeigt aggregierten Zustand aus Child-Jobs.
  • Disk-/Episode-Aktionen können child-spezifisch ausgeführt werden.
  • Im Ripper öffnen hilft bei Bereit zum Encodieren-Kindern.

Multipart

  • gemeinsamer Container mit Disc-Childs
  • Disc-Nummern bleiben pro Child nachvollziehbar
  • Delete-Preview kann Related-Pfade gemeinsam auflösen

Logs sinnvoll nutzen

  • Tail laden (800) für schnellen Fehlerkontext
  • Vollständiges Log laden für forensische Analyse

Empfehlung:

  1. Erst Tail prüfen.
  2. Bei Pfad-/Toolproblemen vollständiges Log laden.
  3. Danach passende Wiederanlauf-Aktion wählen.
\ No newline at end of file diff --git a/site/gui/index.html b/site/gui/index.html index ac9a08b..d2adea0 100644 --- a/site/gui/index.html +++ b/site/gui/index.html @@ -1 +1 @@ - GUI-Seiten - Ripster

GUI-Seiten

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

Seitenüberblick

Seite Zweck
Jobs zentrale Inbox mit allen Jobs (Ripper, Converter, Audiobooks)
Ripper Live-Betrieb: Pipeline, Queue, Aktivitäten, Disc-Infos
Audiobooks AAX-Upload, Audiobook-Jobsteuerung und Output-Explorer
Settings Konfiguration, Skripte, Ketten, Presets, Cronjobs
Historie abgeschlossene/laufende Jobs durchsuchen und nachbearbeiten
Converter Audio/Video-Dateien konvertieren, Datei-Explorer, Upload
Downloads Ausgabedateien als ZIP herunterladen
Database (Expert) tabellarische Rohsicht inkl. Orphan-RAW-Import

Empfohlene Nutzung im Alltag

  1. Ersten Überblick über alle Jobs: Jobs
  2. Start eines neuen Disc-Jobs: Ripper
  3. Audio/Video-Dateien konvertieren: Converter
  4. AAX/Audiobook-Flow: Audiobooks
  5. Regeln/Automatisierung anpassen: Settings
  6. Ergebnisse prüfen oder Jobs nachbearbeiten: Historie
  7. Dateien herunterladen: Downloads
  8. Sonderfälle/Recovery: Database

Hinweise zur Navigation

  • Jobs, Ripper, Converter, Audiobooks, Settings, Historie und Downloads sind direkt in der Kopfnavigation.
  • Database ist als Expert-Route verfügbar: /database.
\ No newline at end of file + GUI-Seiten - Ripster

GUI-Seiten

Dieses Kapitel ist das Bedienhandbuch für die Oberflächen im Alltag.

Seitenüberblick

Seite Rolle im Betrieb Typischer Einsatz
Jobs zentrale Inbox Gesamtlage prüfen und in Fachseite springen
Ripper Live-Steuerung der Pipeline Disc-Flow starten, Queue steuern, Review freigeben
Audiobooks AAX-Spezialflow Upload, Konfiguration und Encode von Audiobooks
Settings Konfiguration/Automatisierung Pfade, Tools, Queue-Limits, Skripte, Cron
Historie Nachbearbeitung und Kontrolle Logs, Re-Encode, Löschvorschau, Recovery-Aktionen
Converter dateibasierte Konvertierung Video/Audio/ISO ohne Disc-Rip verarbeiten
Downloads ZIP-Exports RAW/Output aus Historie bereitstellen
Database (Expert) Recovery-Sicht orphan RAW finden und importieren

Empfohlener Tagesablauf

  1. Jobs: Statuslage und Auffälligkeiten prüfen.
  2. Ripper oder Converter/Audiobooks: neue Arbeit starten.
  3. Historie: Ergebnisse validieren und ggf. nachbearbeiten.
  4. Downloads: Exporte für externe Übergabe erzeugen.
  5. Settings: Regeln und Limits nur kontrolliert anpassen.

Direkt in der Top-Navigation:

  • Jobs, Ripper, Converter, Audiobooks, Settings, Historie, Downloads

Nur per URL:

  • Database unter /database
\ No newline at end of file diff --git a/site/gui/jobs/index.html b/site/gui/jobs/index.html index 87ac208..7c6f266 100644 --- a/site/gui/jobs/index.html +++ b/site/gui/jobs/index.html @@ -1 +1 @@ - Jobs - Ripster

Jobs

Die Seite Jobs ist die zentrale Inbox über alle Job-Typen.


Zweck

Jobs zeigt denselben Datenbestand in einer einheitlichen Liste:

  • Ripper-Jobs (Blu-ray/DVD/CD)
  • Converter-Jobs (Audio/Video/ISO)
  • Audiobook-Jobs

Die Seite eignet sich als schneller Einstieg, bevor man in den jeweiligen Fachbereich springt.


Filter und Ansicht

View-Filter

  • Alle Jobs
  • Ripper-View
  • Converter-View
  • Audiobooks

Status-Filter

  • Alle
  • Aktiv
  • Fehler/Abbruch

Zusätzlich gibt es eine Freitextsuche (Titel, Status, IMDb, Job-Kind etc.) und eine Paginierung.


Was ein Eintrag zeigt

  • Job-ID und Titel
  • Status-Badge (inkl. Queue-Berücksichtigung)
  • Job-Typ-Badge (z. B. Blu-ray, Converter Audio, Audiobook)
  • Zeitstempel der letzten Aktualisierung

Die Liste aktualisiert sich zyklisch automatisch.


Aktion

Pro Eintrag gibt es einen Schnellzugriff:

  • Im Ripper öffnen für Disc-/Audiobook-orientierte Jobs
  • Im Converter öffnen für Converter-Jobs

So gelangst du mit einem Klick in die passende Detailoberfläche.

\ No newline at end of file + Jobs - Ripster

Jobs

Jobs ist die zentrale Inbox über alle Jobarten und dient als schneller Einstieg in den Tagesbetrieb.

Zweck der Seite

Die Liste vereinheitlicht:

  • Disc-/Ripper-Jobs
  • Converter-Jobs
  • Audiobook-Jobs

Dadurch kannst du unabhängig von der Fachseite zuerst den Gesamtzustand prüfen.

Filterlogik

View-Filter

  • Alle Jobs
  • Ripper-View
  • Converter-View
  • Audiobooks

Status-Filter

  • Alle
  • Aktiv
  • Fehler/Abbruch

Zusätzlich:

  • Freitextsuche
  • Paginierung

Was ein Jobeintrag zeigt

  • Job-ID und Titel
  • Statusbadge
  • Jobtypbadge (z. B. Blu-ray, DVD, Converter Audio, Audiobook)
  • Aktualisierungszeit

Die Ansicht wird periodisch aktualisiert und ergänzt sich mit WebSocket-Events.

Schnellaktion pro Zeile

  • Im Ripper öffnen für Disc-/Audiobook-nahe Jobs
  • Im Converter öffnen für Converter-Jobs

So kommst du ohne Umwege in die Oberfläche mit den passenden Detailaktionen.

Empfohlener Einsatz

  1. In Jobs Störungen und Auslastung identifizieren.
  2. Danach gezielt in Ripper, Converter oder Historie springen.
\ No newline at end of file diff --git a/site/gui/ripper/index.html b/site/gui/ripper/index.html index 12ba8ea..7b5d1bd 100644 --- a/site/gui/ripper/index.html +++ b/site/gui/ripper/index.html @@ -1 +1 @@ - Ripper - Ripster

Ripper

Das Ripper 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 aktiviert)

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 den Wert aus Settings -> Parallele 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.

Zusätzliche Kennzeichnungen in der Liste:

  • Serien-Container/Serien-Disk für Staffel-Workflows
  • Multipart Movie bei zusammengeführten Film-Discs
  • Untertitel mit Disc-/Container-Infos (z. B. Disc 2 | Container #123)

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

Zustandsabhängige Hauptaktionen

Zustand Typische Aktion
Medium erkannt / Bereit Analyse starten
Metadatenauswahl Metadaten öffnen
Warte auf Auswahl Playlist wählen und Playlist übernehmen
Startbereit Job starten
Bereit zum Encodieren Tracks/Skripte prüfen, dann Encoding starten
laufend (Analyse/Rippen/Encodieren) Abbrechen
Fehler / Abgebrochen Retry Rippen, Disk-Analyse neu starten

Zusätzlich je nach Job:

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

Titel-/Spurprüfung (Bereit zum Encodieren)

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

Hinweis:

  • Laufwerk neu lesen ist nicht mehr an einen festen Pipeline-State gebunden und kann genutzt werden, solange kein Rescan-Request läuft.

Wichtige Dialoge im Ripper

Metadaten auswählen

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

Bei Film-Duplikaten in der Historie öffnet sich ein Konfliktdialog:

  • Übernahme erzwingen: legt trotzdem einen neuen Job mit denselben Metadaten an
  • Multipart movie: verknüpft bestehenden und neuen Job in einem Multipart-Container (mit separaten Disc-Nummern)
  • Zurück zur Auswahl: zurück in die Metadatenliste

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 + Ripper - Ripster

Ripper

Die Seite Ripper ist die Live-Steuerung der Pipeline. Hier laufen Disc-Erkennung, Queue-Steuerung, Review und Encode-Start zusammen.

Seitenaufbau und Betriebslogik

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 kontinuierlich:

  • CPU / RAM
  • GPU (wenn verfügbar)
  • freie Speicherstände konfigurierter Pfade

Nutzen im Betrieb:

  • Engpässe vor Jobfehlern erkennen
  • Pfadfüllstände vor Start großer Batchs prüfen

Gesteuert über Settings:

  • Hardware Monitoring aktiviert
  • Hardware Monitoring Intervall (ms)

2) Job Queue

Es gibt zwei operative Zonen:

  • Laufende Jobs
  • Warteschlange

Mögliche Queue-Einträge:

  • Job-Startaktionen (Start, Retry Rippen, RAW neu encodieren, Encode neu starten, Review neu berechnen, Audio CD starten)
  • Nicht-Job-Einträge (Skript, Skriptkette, Warten)

Wichtige Regeln:

  • Queue-Reihenfolge ist per Drag-and-Drop änderbar.
  • Warten blockiert nachfolgende Queue-Starts bis kein aktiver Prozess mehr läuft.
  • Skript und Skriptkette werden als Queue-Einträge mitgeführt.

Parallelität kommt aus Settings:

  • Max. parallele Film/Video Encodes
  • Max. parallele Audio CD Jobs
  • Max. Encodes gesamt
  • optional Audio CDs: Queue-Reihenfolge überspringen

3) Skript- / Cron-Status

Zeigt Runtime-Aktivitäten:

  • laufende Skripte
  • laufende Ketten
  • Cron-Ausführungen
  • letzte abgeschlossene Aktivitäten

Aktionen:

  • Nächster Schritt bei Ketten
  • Abbrechen
  • Liste leeren

4) Job Übersicht

Die Jobliste ist der zentrale Arbeitsbereich. Ein Klick öffnet den jeweiligen Pipeline-Status.

Badges und Kontext

Neben Status/Fortschritt zeigt die Liste je nach Job:

  • Serienkontext (Serien-Container, Staffel/Disk)
  • Multipart-Kontext (Multipart Movie, Disc-Nr.)
  • Queue-/Subjob-Kontext bei Serien-Episoden

Zustandsabhängige Aktionen

Zustand Hauptaktion im Ripper Ergebnis
Medium erkannt, Bereit Analyse starten startet MakeMKV-Analyse
Metadatenauswahl Metadaten öffnen Film/Serie auswählen, Provider festlegen
Warte auf Auswahl Playlist/Titel/RAW-Entscheidung bestätigen setzt Flow fort zur Prüfung
Startbereit Job starten startet Rip oder RAW-basierte Prüfung
Bereit zum Encodieren Encoding starten startet HandBrake mit bestätigter Auswahl
Laufend (Analyse, Rippen, Encodieren) Abbrechen setzt Job auf Abgebrochen
Fehler, Abgebrochen Retry Rippen neuer Rip-Anlauf

Zusatzaktionen je nach Zustand und Jobtyp:

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

Review-Bereich (Bereit zum Encodieren)

Hier wird die effektive Encode-Entscheidung festgelegt:

  • Titelwahl
  • Audio-/Subtitle-Trackselektion
  • User-Preset
  • Pre-/Post-Encode-Skripte und Ketten
  • HandBrake-Kommandovorschau

Ohne Bestätigung dieses Blocks startet kein produktiver Encode.

RAW-Ordnerphasen (sichtbar über Logs/Details)

Der Ripper arbeitet mit drei RAW-Zuständen:

  • Incomplete_... während unvollständigem Rip
  • Rip_Complete_... nach erfolgreich abgeschlossenem Rip, vor Encode
  • ohne Prefix nach erfolgreichem Encode

Das ist wichtig für Recovery und Delete-Vorschau.

5) Disk-Information

Zeigt aktuelle Laufwerksdaten:

  • Device-Pfad
  • Modell
  • Disc-Label / Mount

Aktionen:

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

Hinweis:

  • Laufwerk neu lesen ist nicht mehr an einen festen Pipeline-State gebunden.

Wichtige Dialoge

Metadaten auswählen

Im Dialog werden Film-/Serienmetadaten bestätigt.

Sonderfälle:

  • Film-Duplikat: Übernahme erzwingen oder Multipart movie
  • Serie: Disc-Nummer ist Pflicht

Vorhandenes RAW erkannt

Wenn passendes RAW existiert, fordert der Dialog eine explizite Entscheidung:

  • vorhandenes RAW verwenden
  • RAW verwerfen/löschen und neu rippen

Queue-Eintrag einfügen

Du kannst gezielt ab Position einfügen:

  • Skript
  • Skriptkette
  • Wartezeit
\ No newline at end of file diff --git a/site/gui/settings/index.html b/site/gui/settings/index.html index fa8e504..03f24ac 100644 --- a/site/gui/settings/index.html +++ b/site/gui/settings/index.html @@ -1 +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 Ripper
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 Ripper im Review (Bereit zum Encodieren).

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 + Settings - Ripster

Settings

Die Seite Settings steuert alle Betriebsparameter von Ripster: Pfade, Tools, Queue-Limits, Metadatenquellen, Automatisierung.

Tab-Überblick

Tab Hauptzweck
Konfiguration globale und profilspezifische Laufzeitsettings
Scripte einzelne Skripte verwalten und testen
Skriptketten mehrstufige Abläufe aus Skript/Warten
Encode-Presets wiederverwendbare HandBrake-Profile für Review
Cronjobs zeitgesteuerte Ausführung von Skript/Kette

Tab Konfiguration

Bedienprinzip

  1. Werte ändern.
  2. Änderungen speichern.
  3. erst danach sind Werte für neue Aktionen wirksam.

Zusätzliche Bedienhilfen:

  • Neu laden verwirft lokale Formzustände
  • Änderungen verwerfen setzt auf zuletzt gespeicherten Stand
  • PushOver Test validiert Benachrichtigungszugang sofort

Was wirkt unmittelbar, was erst bei neuem Job?

  • Queue-/Parallelität wirkt auf neue Queue-Entscheidungen und Pump-Läufe.
  • Tool-/Pfad-/Template-Änderungen wirken vollständig auf neu gestartete Schritte.
  • Bereits laufende Prozesse übernehmen Änderungen in der Regel nicht rückwirkend.

Welche Bereiche im Alltag kritisch sind

Bereich Kritisch für
Pfade wo RAW, finale Ausgaben, Converter/Audiobook-Dateien landen
Tools ob Analyze/Rip/Encode ausführbar sind
Metadaten Film-/Serienzuordnung und Episode-Mapping
Queue-Limits Durchsatz und Reihenfolgeverhalten
Monitoring Sichtbarkeit von Last und Speicherengpässen
Benachrichtigungen PushOver-Ereignisse je Pipelinephase

Tab Scripte

Funktionen:

  • anlegen, bearbeiten, löschen
  • testen (Test)
  • sortieren

Testausführung liefert:

  • Exit-Code
  • Dauer
  • stdout/stderr

Wichtig:

  • Nur erfolgreiche Skripte sollten in produktive Pre-/Post-Listen übernommen werden.

Tab Skriptketten

Ketten bestehen aus Schritten:

  • Skript
  • Warten

Typischer Einsatz:

  • externe Hooks vor/nach Encode
  • gestaffelte Abläufe mit Pausen

In der Queue erscheinen Ketten als eigene Einträge und werden dort ausgeführt.

Tab Encode-Presets

Ein Preset bündelt:

  • optionales HandBrake-Preset (-Z)
  • optionale Extra-Args
  • Medienziel (Universell/Blu-ray/DVD/Sonstiges)

Im Ripper-Review kannst du Presets pro Job auswählen, statt Parameter jedes Mal neu zu setzen.

Tab Cronjobs

Funktionen:

  • Cronjob anlegen und bearbeiten
  • Quelle wählen (Skript oder Skriptkette)
  • Cron-Ausdruck prüfen
  • Jetzt ausführen
  • Job-Logs ansehen
  • Aktivierung/Pushover toggeln

Empfehlung:

  1. Skript/Kette manuell testen.
  2. Dann Cron aktivieren.
  3. Erste automatische Läufe aktiv im Runtime-Status kontrollieren.

Verbindung zur Einstellungsreferenz

Die vollständige Wirkung jeder einzelnen Einstellung steht in Einstellungsreferenz.

\ No newline at end of file diff --git a/site/index.html b/site/index.html index 98bee30..2919169 100644 --- a/site/index.html +++ b/site/index.html @@ -1 +1 @@ - 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 (Jobs, Ripper, Converter, Audiobooks, Settings, Historie, Downloads, 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 + Ripster

Ripster Handbuch

Diese Dokumentation ist als vollständiges Benutzerhandbuch aufgebaut: tägliche Bedienung zuerst, technische Referenz danach.

Einstieg in 3 Schritten

  1. Installation: Installation
  2. Betriebskonfiguration: Ersteinrichtung
  3. erster End-to-End-Lauf: Erster Lauf

Was das Handbuch abdeckt

  • alle GUI-Seiten mit Aktionen und Wirkung
  • vollständige Workflows für Film, Serie und Multipart
  • Queue-, Job-, Container- und Recovery-Verhalten
  • detaillierte Settings-Wirkung inklusive Fallbacks

Empfohlene Lesereihenfolge

  1. Benutzerhandbuch Überblick
  2. GUI-Seiten
  3. Workflows aus Nutzersicht
  4. Einstellungsreferenz
  5. bei Bedarf technischer Tiefgang im Anhang
\ No newline at end of file diff --git a/site/search/search_index.json b/site/search/search_index.json index c2791cd..154378a 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 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 (Jobs, Ripper, Converter, Audiobooks, Settings, Historie, Downloads, 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

  • Converter API

    Datei-Explorer, Upload, Job-Verwaltung f\u00fcr den Converter.

    Converter API

  • Downloads API

    Download-Queue f\u00fcr Ausgabedateien aus der Job-Historie.

    Downloads API

  • Runtime Activities API

    Laufende und abgeschlossene Aktivit\u00e4ten (Skripte, Ketten, Cron, Tasks).

    Runtime Activities

  • :material-websocket: WebSocket Events

    Pipeline-, Queue-, Disk-, Settings-, Cron-, Converter- und Download-Events.

    WebSocket

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

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

"},{"location":"api/converter/","title":"Converter API","text":"

Endpunkte f\u00fcr den Datei-Converter: Datei-Explorer, Upload, Job-Verwaltung.

Basis-Pfad: /api/converter

"},{"location":"api/converter/#scan-explorer","title":"Scan & Explorer","text":""},{"location":"api/converter/#get-apiconvertertree","title":"GET /api/converter/tree","text":"

Vollst\u00e4ndiger Verzeichnisbaum des converter_raw_dir (FS-basiert, keine DB).

Response:

{\n  \"tree\": [\n    {\n      \"name\": \"filme\",\n      \"relPath\": \"filme\",\n      \"isDir\": true,\n      \"children\": [\n        {\n          \"name\": \"film.mkv\",\n          \"relPath\": \"filme/film.mkv\",\n          \"isDir\": false,\n          \"size\": 10485760\n        }\n      ]\n    }\n  ]\n}\n
"},{"location":"api/converter/#get-apiconverterbrowseparentrelpath","title":"GET /api/converter/browse?parent=relPath","text":"

DB-basierter Datei-Explorer. Gibt Eintr\u00e4ge f\u00fcr einen Unterordner zur\u00fcck.

Query-Parameter:

Parameter Typ Beschreibung parent string Relativer Pfad zum Unterordner (leer = Root)

Response:

{\n  \"entries\": [\n    {\n      \"id\": 1,\n      \"rel_path\": \"filme/film.mkv\",\n      \"is_dir\": false,\n      \"size\": 10485760,\n      \"job_id\": null\n    }\n  ],\n  \"rawDir\": \"/data/output/converter-raw\"\n}\n
"},{"location":"api/converter/#post-apiconverterscan","title":"POST /api/converter/scan","text":"

Manuellen Scan des converter_raw_dir ausl\u00f6sen. Aktualisiert converter_scan_entries in der DB.

Response:

{ \"result\": { \"added\": 3, \"removed\": 1 } }\n
"},{"location":"api/converter/#jobs-erstellen","title":"Jobs erstellen","text":""},{"location":"api/converter/#post-apiconverterjobsfrom-selection","title":"POST /api/converter/jobs/from-selection","text":"

Jobs aus im Datei-Explorer ausgew\u00e4hlten Dateien erstellen.

Body:

{\n  \"relPaths\": [\"filme/film.mkv\", \"musik/track.flac\"],\n  \"audioMode\": \"individual\"\n}\n
Feld Typ Beschreibung relPaths string[] Relative Pfade der ausgew\u00e4hlten Dateien audioMode string individual (ein Job pro Datei) oder shared (ein gemeinsamer Job)

Response:

{ \"jobs\": [{ \"id\": 42, \"status\": \"READY_TO_START\" }] }\n
"},{"location":"api/converter/#post-apiconvertercreate-jobs","title":"POST /api/converter/create-jobs","text":"

Jobs aus DB-Scan-Eintr\u00e4gen erstellen.

Body:

{\n  \"entries\": [\n    { \"relPath\": \"filme/film.mkv\", \"converterMediaType\": \"video\" }\n  ]\n}\n
"},{"location":"api/converter/#post-apiconverterupload","title":"POST /api/converter/upload","text":"

Dateien hochladen (Multipart, max. 50 Dateien).

Form-Felder:

Feld Typ Beschreibung files File[] Hochzuladende Dateien folderName string (Optional) Ziel-Unterordner

Response:

{\n  \"folders\": [{ \"folderRelPath\": \"upload-2026-03-30\", \"fileCount\": 2 }]\n}\n
"},{"location":"api/converter/#job-verwaltung","title":"Job-Verwaltung","text":""},{"location":"api/converter/#get-apiconverterjobs","title":"GET /api/converter/jobs","text":"

Alle Converter-Jobs zur\u00fcckgeben.

Response:

{ \"jobs\": [{ \"id\": 42, \"status\": \"READY_TO_START\", \"title\": \"film.mkv\" }] }\n
"},{"location":"api/converter/#get-apiconverterjobsjobid","title":"GET /api/converter/jobs/:jobId","text":"

Einzelnen Converter-Job abrufen.

"},{"location":"api/converter/#post-apiconverterjobsjobidconfig","title":"POST /api/converter/jobs/:jobId/config","text":"

Konfigurationsentwurf f\u00fcr einen Job speichern (persistiert in encode_plan_json).

Body: Partielles Konfig-Objekt (Ausgabeformat, Presets, Metadaten, Track-Auswahl).

"},{"location":"api/converter/#post-apiconverterjobsjobidassign-files","title":"POST /api/converter/jobs/:jobId/assign-files","text":"

Dateien einem bestehenden (noch nicht gestarteten) Job hinzuf\u00fcgen.

Body:

{ \"relPaths\": [\"musik/track2.flac\"] }\n
"},{"location":"api/converter/#post-apiconverterjobsjobidremove-file","title":"POST /api/converter/jobs/:jobId/remove-file","text":"

Datei aus einem Job entfernen (per relativer Pfad).

Body:

{ \"relPath\": \"musik/track2.flac\" }\n
"},{"location":"api/converter/#post-apiconverterjobsjobidremove-input","title":"POST /api/converter/jobs/:jobId/remove-input","text":"

Datei aus einem Job entfernen (per absolutem Eingabepfad).

Body:

{ \"inputPath\": \"/data/output/converter-raw/musik/track2.flac\" }\n
"},{"location":"api/converter/#post-apiconverterjobsjobidstart","title":"POST /api/converter/jobs/:jobId/start","text":"

Job mit finaler Konfiguration starten.

Body:

{\n  \"converterMediaType\": \"video\",\n  \"outputFormat\": \"mkv\",\n  \"userPreset\": \"H.264 MKV 1080p30\",\n  \"trackSelection\": {},\n  \"handBrakeTitleId\": 1,\n  \"audioFormatOptions\": {}\n}\n
"},{"location":"api/converter/#post-apiconverterjobsjobidcancel","title":"POST /api/converter/jobs/:jobId/cancel","text":"

Laufenden Job abbrechen.

"},{"location":"api/converter/#delete-apiconverterjobsjobid","title":"DELETE /api/converter/jobs/:jobId","text":"

Job aus der DB l\u00f6schen.

"},{"location":"api/converter/#datei-operationen","title":"Datei-Operationen","text":"

Alle Datei-Operationen arbeiten direkt auf dem Dateisystem (ohne DB-Aktualisierung). Ein anschlie\u00dfender Scan-Aufruf synchronisiert die DB.

"},{"location":"api/converter/#delete-apiconverterfiles","title":"DELETE /api/converter/files","text":"

Datei oder Ordner l\u00f6schen.

Body:

{ \"relPath\": \"filme/film.mkv\" }\n
"},{"location":"api/converter/#post-apiconverterfilesrename","title":"POST /api/converter/files/rename","text":"

Datei oder Ordner umbenennen.

Body:

{ \"relPath\": \"filme/film.mkv\", \"newName\": \"film-neu.mkv\" }\n
"},{"location":"api/converter/#post-apiconverterfilesmove","title":"POST /api/converter/files/move","text":"

Datei oder Ordner verschieben.

Body:

{ \"relPath\": \"filme/film.mkv\", \"targetParentRelPath\": \"archiv\" }\n

targetParentRelPath = \"\" verschiebt in das Root-Verzeichnis.

"},{"location":"api/converter/#post-apiconverterfilesfolder","title":"POST /api/converter/files/folder","text":"

Neuen Ordner anlegen.

Body:

{ \"parentRelPath\": \"filme\", \"name\": \"neu\" }\n
"},{"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/downloads/","title":"Downloads API","text":"

Endpunkte f\u00fcr die Download-Queue. Ausgabedateien aus der Job-Historie k\u00f6nnen als ZIP heruntergeladen werden.

Basis-Pfad: /api/downloads

"},{"location":"api/downloads/#get-apidownloads","title":"GET /api/downloads","text":"

Liste aller Download-Eintr\u00e4ge plus Zusammenfassung.

Response:

{\n  \"items\": [\n    {\n      \"id\": \"dl-42-raw\",\n      \"jobId\": 42,\n      \"target\": \"raw\",\n      \"status\": \"ready\",\n      \"archiveName\": \"Job_42_raw.zip\",\n      \"outputPath\": null,\n      \"createdAt\": \"2026-03-30T10:00:00.000Z\",\n      \"updatedAt\": \"2026-03-30T10:01:00.000Z\",\n      \"errorMessage\": null\n    }\n  ],\n  \"summary\": {\n    \"total\": 3,\n    \"pending\": 1,\n    \"processing\": 0,\n    \"ready\": 1,\n    \"failed\": 1\n  }\n}\n

Status-Werte:

Status Beschreibung pending In der Queue, noch nicht gestartet processing ZIP wird gerade erstellt ready ZIP fertig, Download verf\u00fcgbar failed Fehler bei der Erstellung"},{"location":"api/downloads/#get-apidownloadssummary","title":"GET /api/downloads/summary","text":"

Nur die Zusammenfassung der Download-Queue (ohne Item-Liste).

Response:

{\n  \"summary\": {\n    \"total\": 3,\n    \"pending\": 1,\n    \"processing\": 0,\n    \"ready\": 1,\n    \"failed\": 1\n  }\n}\n
"},{"location":"api/downloads/#post-apidownloadshistoryjobid","title":"POST /api/downloads/history/:jobId","text":"

Job-Ausgabe in die Download-Queue einreihen.

Parameter:

Parameter Typ Beschreibung jobId number ID des Jobs in der Historie

Body:

{\n  \"target\": \"raw\",\n  \"outputPath\": null\n}\n
Feld Typ Default Beschreibung target string raw raw (RAW-Dateien) oder movie (Ausgabedateien) outputPath string null Optionaler expliziter Ausgabepfad

Response (201 Created):

{\n  \"created\": true,\n  \"id\": \"dl-42-raw\",\n  \"status\": \"pending\",\n  \"summary\": { \"total\": 1, \"pending\": 1, \"processing\": 0, \"ready\": 0, \"failed\": 0 }\n}\n

Ist der Eintrag bereits vorhanden, wird 201 durch 200 ersetzt und created: false zur\u00fcckgegeben.

"},{"location":"api/downloads/#get-apidownloadsidfile","title":"GET /api/downloads/:id/file","text":"

Fertige ZIP-Datei herunterladen.

Parameter:

Parameter Typ Beschreibung id string Download-ID (z. B. dl-42-raw)

Response: Datei-Download (Content-Disposition: attachment).

Schl\u00e4gt fehl mit 404, wenn kein Download-Eintrag mit dieser ID existiert oder die Datei noch nicht bereit ist.

"},{"location":"api/downloads/#delete-apidownloadsid","title":"DELETE /api/downloads/:id","text":"

Download-Eintrag l\u00f6schen (auch fertige ZIP-Dateien werden vom Dateisystem entfernt).

Response:

{\n  \"ok\": true,\n  \"summary\": { \"total\": 2, \"pending\": 0, \"processing\": 0, \"ready\": 2, \"failed\": 0 }\n}\n
"},{"location":"api/downloads/#websocket","title":"WebSocket","text":"

Status\u00e4nderungen werden \u00fcber DOWNLOADS_UPDATED in Echtzeit gemeldet. Vollst\u00e4ndige Dokumentation: WebSocket Events.

"},{"location":"api/history/","title":"History API","text":"

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

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

Liefert Jobs mit optionalen Filtern.

Query-Parameter:

Parameter Typ Beschreibung status string Einzelstatus-Filter (legacy-kompatibel). statuses string Mehrfachstatus als CSV, z. B. FINISHED,ERROR. search string Suche in Titel-/IMDb-Feldern. limit number Maximale Anzahl Ergebnisse. lite bool Ohne Dateisystem-Checks (schneller). includeChildren bool Child-Jobs (z. B. Serien-/Multipart-Kinder) explizit einbeziehen.

Beispiel:

GET /api/history?statuses=FINISHED,ERROR&search=Inception&limit=50&lite=1\n

Response (Beispiel):

{\n  \"jobs\": [\n    {\n      \"id\": 42,\n      \"status\": \"FINISHED\",\n      \"title\": \"Inception\",\n      \"job_kind\": \"bluray\",\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 Live-/Tail-Log laden. includeAllLogs bool false vollst\u00e4ndiges Log statt Tail. logTailLines number 800 Tail-L\u00e4nge falls nicht includeAllLogs. lite bool false Detailantwort ohne FS-Checks.

Response (Beispiel):

{\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-apihistoryorphan-raw","title":"GET /api/history/orphan-raw","text":"

Sucht RAW-Ordner ohne zugeh\u00f6rigen Job.

"},{"location":"api/history/#post-apihistoryorphan-rawimport","title":"POST /api/history/orphan-raw/import","text":"

Importiert einen RAW-Ordner als Job und triggert optional die Analyse des Imports.

Request:

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

Response (Beispiel):

{\n  \"job\": { \"id\": 77, \"status\": \"FINISHED\" },\n  \"activation\": { \"started\": true },\n  \"activationError\": null\n}\n
"},{"location":"api/history/#post-apihistoryidomdbassign","title":"POST /api/history/:id/omdb/assign","text":"

Weist OMDb-/Filmdaten nachtr\u00e4glich zu.

"},{"location":"api/history/#post-apihistoryidcdassign","title":"POST /api/history/:id/cd/assign","text":"

Weist CD-Metadaten (z. B. MusicBrainz) nachtr\u00e4glich zu.

"},{"location":"api/history/#post-apihistoryiderrorack","title":"POST /api/history/:id/error/ack","text":"

Quittiert einen Fehlerzustand im Historieneintrag.

"},{"location":"api/history/#get-apihistoryiddelete-preview","title":"GET /api/history/:id/delete-preview","text":"

Liefert eine Vorschau der l\u00f6schbaren Pfade (inkl. Scope auf verkn\u00fcpfte Jobs).

Query-Parameter:

Parameter Typ Standard Beschreibung includeRelated bool true Verkn\u00fcpfte Jobs in die Vorschau einbeziehen.

Response (Beispiel):

{\n  \"preview\": {\n    \"jobId\": 42,\n    \"relatedJobs\": [{ \"id\": 42 }, { \"id\": 73 }],\n    \"pathCandidates\": {\n      \"raw\": [{ \"path\": \"/mnt/raw/...\", \"exists\": true, \"isDirectory\": true }],\n      \"movie\": [{ \"path\": \"/mnt/movies/...\", \"exists\": true, \"isDirectory\": true }]\n    }\n  }\n}\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:

{\n  \"target\": \"both\",\n  \"includeRelated\": true,\n  \"selectedRawPaths\": [\"/mnt/raw/Inception - RAW - Disc1\"],\n  \"selectedMoviePaths\": [\"/mnt/movies/Inception (2010)\"]\n}\n

target: raw | movie | both

selectedRawPaths / selectedMoviePaths sind optional und begrenzen die L\u00f6schung auf ausgew\u00e4hlte Pfade aus der Vorschau.

"},{"location":"api/history/#post-apihistoryiddelete","title":"POST /api/history/:id/delete","text":"

L\u00f6scht Job aus DB; optional auch Dateien.

Request:

{\n  \"target\": \"both\",\n  \"includeRelated\": true,\n  \"resetDriveState\": false,\n  \"keepDetectedDevice\": true,\n  \"preserveRawForImportJobs\": false,\n  \"selectedRawPaths\": [\"/mnt/raw/Inception - RAW - Disc1\"],\n  \"selectedMoviePaths\": [\"/mnt/movies/Inception (2010)\"]\n}\n

target: none | raw | movie | both

Response (Beispiel):

{\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  \"safeguards\": {\n    \"containsOrphanRawImportJob\": false,\n    \"resetDriveStateApplied\": false,\n    \"keepDetectedDeviceApplied\": true\n  }\n}\n
"},{"location":"api/history/#hinweise","title":"Hinweise","text":"
  • Ein aktiver Pipeline-Job kann nicht gel\u00f6scht werden (409).
  • L\u00f6schoperationen sind irreversibel.
  • Bei Serien-/Multipart-Containern steuern includeRelated und Pfadselektionen den genauen Scope.
"},{"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/#post-apipipelinerescan-drive","title":"POST /api/pipeline/rescan-drive","text":"

Erzwingt Rescan f\u00fcr ein konkretes Laufwerk.

Request:

{ \"devicePath\": \"/dev/sr0\" }\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/#get-apipipelinetmdbseriessearchqseason","title":"GET /api/pipeline/tmdb/series/search?q=&season=

TMDb-Seriensuche (f\u00fcr Serien-Workflow bei DVD/Blu-ray).

","text":""},{"location":"api/pipeline/#get-apipipelinecddrives","title":"GET /api/pipeline/cd/drives

Liefert Snapshot der aktuell bekannten CD-Laufwerke.

","text":""},{"location":"api/pipeline/#get-apipipelinecdmusicbrainzsearchq","title":"GET /api/pipeline/cd/musicbrainz/search?q=

MusicBrainz-Suche f\u00fcr CD-Metadaten.

","text":""},{"location":"api/pipeline/#get-apipipelinecdmusicbrainzreleasembid","title":"GET /api/pipeline/cd/musicbrainz/release/:mbId

L\u00e4dt Release-Details zu einer MusicBrainz-ID.

","text":""},{"location":"api/pipeline/#post-apipipelinecdselect-metadata","title":"POST /api/pipeline/cd/select-metadata

\u00dcbernimmt CD-Metadaten f\u00fcr einen Job.

Request (Beispiel):

{\n  \"jobId\": 91,\n  \"title\": \"Album\",\n  \"artist\": \"Artist\",\n  \"year\": 2020,\n  \"mbId\": \"f5093c06-23e3-404f-aeaa-40f72885ee3a\",\n  \"coverUrl\": \"https://...\",\n  \"tracks\": []\n}\n
","text":""},{"location":"api/pipeline/#post-apipipelinecdstartjobid","title":"POST /api/pipeline/cd/start/:jobId

Startet/queued CD-Rip mit Format-/Script-/Chain-Konfiguration.

","text":""},{"location":"api/pipeline/#post-apipipelineaudiobookupload","title":"POST /api/pipeline/audiobook/upload

Upload von AAX-Datei (Multipart/FormData).

FormData-Felder:

  • file (Pflicht)
  • format (optional)
  • startImmediately (optional)
","text":""},{"location":"api/pipeline/#get-apipipelineaudiobookpending-activation","title":"GET /api/pipeline/audiobook/pending-activation

Zeigt AAX-Jobs mit fehlenden Activation-Bytes.

","text":""},{"location":"api/pipeline/#post-apipipelineaudiobookstartjobid","title":"POST /api/pipeline/audiobook/start/:jobId

Startet Audiobook-Job mit optionaler Konfiguration.

","text":""},{"location":"api/pipeline/#get-apipipelineaudiobookjobs","title":"GET /api/pipeline/audiobook/jobs

Liefert Audiobook-Jobliste.

","text":""},{"location":"api/pipeline/#get-apipipelineaudiobookoutput-tree","title":"GET /api/pipeline/audiobook/output-tree

Read-only Baumansicht des Audiobook-Ausgabeordners.

","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

Wichtige optionale Felder:

  • selectedHandBrakeTitleId / selectedHandBrakeTitleIds: Titel-Auswahl f\u00fcr Review/MediaInfo.
  • metadataProvider: omdb oder tmdb.
  • workflowKind: bei Disc-Jobs typischerweise film oder series.
  • discNumber: Pflicht f\u00fcr Serien-Disc-Zuordnung (workflowKind=series).
  • duplicateAction: Duplikatverhalten bei Film-Metadaten (allow_new oder multipart_movie).
  • existingJobId: optionaler Referenzjob f\u00fcr multipart_movie.
  • existingDiscNumber: Disc-Nummer des bestehenden Jobs f\u00fcr multipart_movie.

Response:

{ \"job\": { \"id\": 42, \"status\": \"READY_TO_START\" } }\n

Konflikt-Response (Beispiel, HTTP 409):

{\n  \"message\": \"Metadaten bereits in der Historie gefunden. Bitte Auswahl \u00fcbernehmen oder Multipart movie w\u00e4hlen.\",\n  \"details\": [\n    {\n      \"code\": \"METADATA_DUPLICATE_FOUND\",\n      \"mediaProfile\": \"bluray\",\n      \"existingJob\": {\n        \"id\": 17,\n        \"title\": \"Inception\",\n        \"year\": 2010,\n        \"status\": \"FINISHED\",\n        \"jobKind\": \"bluray\",\n        \"discNumber\": 1,\n        \"isMultipartMovie\": false\n      }\n    }\n  ]\n}\n

Relevante Fehlercodes (POST /api/pipeline/select-metadata):

Code Bedeutung METADATA_DUPLICATE_FOUND Film-Metadaten existieren bereits in der Historie (Konfliktdialog im UI). MULTIPART_DISC_REQUIRED F\u00fcr Multipart fehlen Disc-Nummern (discNumber/existingDiscNumber). MULTIPART_DISC_ALREADY_EXISTS Disc-Nummer im Multipart-Container bereits vergeben oder doppelt. MULTIPART_MEDIA_MISMATCH Multipart nur bei gleichem Medientyp (DVD oder Blu-ray). MULTIPART_SERIES_NOT_ALLOWED Multipart ist nur f\u00fcr Film-Jobs erlaubt, nicht f\u00fcr Serien-Workflow. MULTIPART_METADATA_MISMATCH Ausgew\u00e4hlter bestehender Job passt nicht zu den Film-Metadaten. SERIES_DISC_ALREADY_EXISTS Serien-Disc-Nummer innerhalb einer Staffel bereits vorhanden.","text":""},{"location":"api/pipeline/#post-apipipelinejobsjobidraw-decision","title":"POST /api/pipeline/jobs/:jobId/raw-decision

Trifft Entscheidung bei vorhandenem RAW (continue oder restart je nach Dialogfluss).

Request:

{ \"decision\": \"continue\" }\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-apipipelinerestart-cd-reviewjobid","title":"POST /api/pipeline/restart-cd-review/:jobId

Berechnet CD-Review aus vorhandenem RAW 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.

","text":""},{"location":"api/pipeline/#get-apipipelineoutput-foldersjobid","title":"GET /api/pipeline/output-folders/:jobId

Liefert bekannte Output-Ordner entlang der Job-Lineage.

","text":""},{"location":"api/pipeline/#post-apipipelinedelete-output-foldersjobid","title":"POST /api/pipeline/delete-output-folders/:jobId

L\u00f6scht ausgew\u00e4hlte Output-Ordner.

Request:

{ \"folderPaths\": [\"/mnt/movies/Inception (2010)\"] }\n

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 Nutzerentscheidung erforderlich (Playlist-Auswahl oder RAW-Entscheidung) 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 CD_METADATA_SELECTION CD-Metadatenauswahl aktiv CD_READY_TO_RIP CD-Job ist startbereit CD_ANALYZING CD-Struktur/Tracks werden vorbereitet CD_RIPPING CD-Ripping l\u00e4uft CD_ENCODING CD-Encode l\u00e4uft FINISHED Abgeschlossen DONE Abgeschlossen (v. a. Audiobook/Converter/CD-Varianten) 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-apiruntimeactivities","title":"GET /api/runtime/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-apiruntimeactivitiesidcancel","title":"POST /api/runtime/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-apiruntimeactivitiesidnext-step","title":"POST /api/runtime/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-apiruntimeactivitiesclear-recent","title":"POST /api/runtime/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/runtime/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/settings/#weitere-endpunkte","title":"Weitere Endpunkte","text":""},{"location":"api/settings/#get-apisettingseffective-paths","title":"GET /api/settings/effective-paths","text":"

Liefert aufgel\u00f6ste, effektiv genutzte Pfade aus den Settings (f\u00fcr UI- und Diagnosezwecke).

"},{"location":"api/settings/#post-apisettingscoverartrecover","title":"POST /api/settings/coverart/recover","text":"

Startet eine manuelle Coverart-Recovery.

Response (Beispiel):

{\n  \"result\": { \"started\": true },\n  \"scheduler\": { \"enabled\": true }\n}\n
"},{"location":"api/settings/#activation-bytes-aax","title":"Activation Bytes (AAX)","text":""},{"location":"api/settings/#get-apisettingsactivation-bytes","title":"GET /api/settings/activation-bytes","text":"

Liest gecachte AAX-Activation-Bytes.

"},{"location":"api/settings/#post-apisettingsactivation-bytes","title":"POST /api/settings/activation-bytes","text":"

Speichert Activation-Bytes.

Request:

{\n  \"checksum\": \"abc123...\",\n  \"activationBytes\": \"1a2b3c4d\"\n}\n
"},{"location":"api/settings/#laufwerke","title":"Laufwerke","text":""},{"location":"api/settings/#get-apisettingsdrives","title":"GET /api/settings/drives","text":"

Liefert erkannte optische Laufwerke (/dev/...) inkl. MakeMKV-Disc-Index.

"},{"location":"api/settings/#post-apisettingsdrivesforce-unlock","title":"POST /api/settings/drives/force-unlock","text":"

Erzwingt Entsperren aktiver Laufwerkslocks.

Hinweis: Expertenmodus (ui_expert_mode) ist erforderlich, sonst 403.

Request (ein Laufwerk):

{ \"devicePath\": \"/dev/sr0\" }\n

Request (alle):

{ \"all\": true }\n
"},{"location":"api/settings/#ui-preferences","title":"UI Preferences","text":""},{"location":"api/settings/#get-apisettingsprefskey","title":"GET /api/settings/prefs/:key","text":"

Liest einen persistierten UI-Preference-Wert.

"},{"location":"api/settings/#put-apisettingsprefskey","title":"PUT /api/settings/prefs/:key","text":"

Speichert einen persistierten UI-Preference-Wert.

Request:

{ \"value\": \"{\\\"columns\\\":[\\\"id\\\",\\\"status\\\"]}\" }\n
"},{"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/#converter_scan_update","title":"CONVERTER_SCAN_UPDATE","text":"

Wird nach einem Scan des Converter-Eingangsordners gesendet (manuell oder per Polling).

{\n  \"type\": \"CONVERTER_SCAN_UPDATE\",\n  \"payload\": {\n    \"entryCount\": 12\n  }\n}\n
"},{"location":"api/websocket/#downloads_updated","title":"DOWNLOADS_UPDATED","text":"

Wird bei jeder Status\u00e4nderung in der Download-Queue gesendet.

{\n  \"type\": \"DOWNLOADS_UPDATED\",\n  \"payload\": {\n    \"reason\": \"ready\",\n    \"item\": {\n      \"id\": \"dl-1\",\n      \"jobId\": 42,\n      \"status\": \"ready\",\n      \"archiveName\": \"Job_42_movie.zip\",\n      \"createdAt\": \"2026-03-30T10:00:00.000Z\"\n    },\n    \"summary\": {\n      \"total\": 3,\n      \"pending\": 1,\n      \"processing\": 0,\n      \"ready\": 1,\n      \"failed\": 1\n    }\n  }\n}\n

M\u00f6gliche reason-Werte: queued, processing, ready, failed, deleted.

"},{"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        Ripper[Ripper]\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. Seit v0.12.0 erfolgt die Medienverarbeitung \u00fcber ein Plugin-System.

"},{"location":"architecture/backend/#plugin-system-srcplugins","title":"Plugin-System (src/plugins/)","text":"

Ab v0.12.0 ist die Pipeline modular aufgebaut. Jeder Medientyp wird von einem eigenen Plugin verwaltet.

"},{"location":"architecture/backend/#basisklassen","title":"Basisklassen","text":"
  • PluginBase.js \u2014 Abstrakte Basisklasse SourcePlugin mit Lifecycle-Methoden
  • PluginRegistry.js \u2014 Dynamische Plugin-Erkennung, priorit\u00e4tsbasierte Auswahl, Settings-Schema-Aggregation
  • PluginContext.js \u2014 Ausf\u00fchrungskontext (Logger, Callbacks, Signals) f\u00fcr Plugin-Aufrufe
"},{"location":"architecture/backend/#plugin-lifecycle","title":"Plugin-Lifecycle","text":"

Jedes Plugin implementiert die folgenden Methoden:

Methode Beschreibung detect(discInfo) Medientyp-Erkennung analyze(devicePath, job, ctx) Analyse / Metadaten-Extraktion rip(job, ctx) Rohdaten-Extraktion review(job, ctx) Optionale Vorschau-Vorbereitung encode(job, ctx) Finales Encoding/Konvertierung finalize(job, ctx) Nachbearbeitung onCancel(job, ctx) Bereinigung bei Abbruch onRetry(job, ctx) Zustand-Reset vor Retry"},{"location":"architecture/backend/#implementierte-plugins","title":"Implementierte Plugins","text":"
  • BluRayPlugin.js \u2014 Blu-ray via MakeMKV (Backup-Modus)
  • DVDPlugin.js \u2014 DVD via MakeMKV (MKV-Modus)
  • CdPlugin.js \u2014 Audio-CD via cdparanoia + FFmpeg (experimentell)
  • AudiobookPlugin.js \u2014 AAX/M4B via FFmpeg mit Kapitel-Splitting
  • ConverterPlugin.js \u2014 Generische Audio/Video-Konvertierung via FFmpeg
  • VideoDiscPlugin.js \u2014 Gemeinsame Basis f\u00fcr Blu-ray/DVD (MediaInfo-Parsing)
"},{"location":"architecture/backend/#pipelineservicejs","title":"pipelineService.js","text":"

Zentrale Workflow-Orchestrierung.

Aufgaben:

  • Pipeline-State-Machine + Persistenz (pipeline_state)
  • Disc-Analyse/Rip/Review/Encode via Plugin-Delegation
  • Queue-Management (Jobs + script|chain|wait Eintr\u00e4ge)
  • Retry/Re-Encode/Restart-Flows
  • WebSocket-Broadcasts f\u00fcr State/Progress/Queue
  • Converter-Job-Verwaltung (createConverterJobFromEntry, uploadConverterFiles, startConverterJob)

Wichtige Methoden:

  • analyzeDisc()
  • selectMetadata()
  • startPreparedJob()
  • confirmEncodeReview()
  • cancel()
  • retry()
  • reencodeFromRaw()
  • restartReviewFromRaw()
  • restartEncodeWithLastSettings()
  • resumeReadyToEncodeJob()
  • enqueueNonJobEntry(), reorderQueue(), removeQueueEntry()
  • createConverterJobFromEntry(), createConverterJobsFromSelection()
  • uploadConverterFiles(), startConverterJob()
"},{"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/FFmpeg
  • HandBrake-Preset-Liste via HandBrakeCLI -z
  • MakeMKV-Registration-Command aus makemkv_registration_key
  • Pfadaufl\u00f6sung f\u00fcr alle Medienprofile inkl. Audiobook und Converter
"},{"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/#audiobookservicejs","title":"audiobookService.js","text":"

Audiobook-Verarbeitung (AAX/M4B).

Features:

  • FFprobe-basierte Analyse (Kapitel, Metadaten)
  • FFmpeg-basiertes Encoding mit Kapitel-Splitting
  • Ausgabeformate: M4B, MP3, FLAC
  • Template-basierte Pfade ({author}, {title}, {year}, {narrator}, {series}, {part})
"},{"location":"architecture/backend/#activationbytesservicejs","title":"activationBytesService.js","text":"

Verwaltung von Audible-Activation-Bytes f\u00fcr AAX-DRM-Handling.

Features:

  • SHA-1-Pr\u00fcfsumme der AAX-Datei berechnen
  • Activation Bytes in aax_activation_bytes-Tabelle cachen
  • Lookup via audnexService (wenn konfiguriert)
"},{"location":"architecture/backend/#converterscanservicejs","title":"converterScanService.js","text":"

Dateisystem-\u00dcberwachung des Converter-Eingangsordners.

Features:

  • Vollst\u00e4ndiger FS-Baum (getTree())
  • DB-basierter Datei-Explorer (getEntries())
  • Manueller und automatischer Scan (Polling)
  • Pfad-Normalisierung mit Traversal-Schutz
  • WebSocket-Broadcast: CONVERTER_SCAN_UPDATE
"},{"location":"architecture/backend/#downloadservicejs","title":"downloadService.js","text":"

Download-Queue f\u00fcr Ausgabedateien aus der Historie.

Features:

  • Job in Download-Queue einreihen (enqueueHistoryJob)
  • ZIP-Archiv aus Ausgabedateien erstellen (archiver)
  • Datei-Streaming via res.download()
  • WebSocket-Broadcast: DOWNLOADS_UPDATED bei Status-\u00c4nderungen
  • Download-Item l\u00f6schen
"},{"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)
  • cdRipService.js (CD-Ripping mit cdparanoia)
  • musicBrainzService.js (MusicBrainz-Metadaten-Lookup)
  • audnexService.js (Audnex-API f\u00fcr Audiobook-Metadaten)
  • coverArtRecoveryService.js (Cover-Art-Wiederherstellung)
  • thumbnailService.js (Vorschaubild-Generierung)
  • omdbService.js (OMDb-Metadaten-Suche)
  • 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 (inkl. Plugin-Registry)
  3. Cron-Init
  4. Express-Routes + Error-Handler
  5. WebSocket-Server auf /ws
  6. Hardware-Monitoring-Init
  7. Disk-Detection-Start
  8. Converter-Scan-Service-Init (Polling falls aktiviert)
"},{"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\njob_lineage_artifacts\njob_output_folders\npipeline_state\nscripts\nscript_chains\nscript_chain_steps\nuser_presets\ncron_jobs\ncron_run_logs\naax_activation_bytes\nuser_prefs\nconverter_scan_entries\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
  • Medientyp: media_type (bluray|dvd|cd|audiobook|converter)
  • Job-Typ/Beziehung: job_kind, parent_job_id
  • Multipart-/Disc-Merkmale: is_multipart_movie, disc_number, metadata_fingerprint
  • Pr\u00fcfsumme: aax_checksum (f\u00fcr AAX-Dateien)
  • Audit: created_at, updated_at

Typische job_kind-Werte:

  • Standard: bluray, dvd, cd, audiobook, converter_audio, converter_video, converter_iso
  • Serien: dvd_series_container, dvd_series_child
  • Multipart Film: multipart_movie_container, multipart_movie_child

Wichtige Indizes:

  • idx_jobs_status
  • idx_jobs_parent_job_id
  • idx_jobs_job_kind
  • idx_jobs_disc_number
  • idx_jobs_metadata_fingerprint
"},{"location":"architecture/database/#job_lineage_artifacts","title":"job_lineage_artifacts","text":"

Verkn\u00fcpft Jobs mit ihren Quell-Jobs (z. B. Re-Encode aus einem vorherigen Rip).

Felder:

  • job_id \u2014 der abgeleitete Job
  • source_job_id \u2014 der Quell-Job
  • artifact_type \u2014 Art der Verkn\u00fcpfung (z. B. reencode, restart_review)
  • created_at
"},{"location":"architecture/database/#job_output_folders","title":"job_output_folders","text":"

Verfolgt Ausgabepfade pro Job (mehrere Ausgaben m\u00f6glich, z. B. bei Kapitel-Splitting).

Felder:

  • job_id
  • folder_path
  • label \u2014 optionaler Bezeichner
  • created_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/#aax_activation_bytes","title":"aax_activation_bytes","text":"

Cache f\u00fcr Audible-Activation-Bytes (AAX-DRM).

Felder:

  • checksum \u2014 SHA-1-Pr\u00fcfsumme der AAX-Datei (Prim\u00e4rschl\u00fcssel)
  • activation_bytes \u2014 Hex-String der Activation Bytes
  • created_at
"},{"location":"architecture/database/#user_prefs","title":"user_prefs","text":"

Benutzer-spezifische Einstellungen (Key-Value).

Felder:

  • key
  • value
  • updated_at
"},{"location":"architecture/database/#converter_scan_entries","title":"converter_scan_entries","text":"

DB-seitige Erfassung gescannter Dateien im Converter-Eingangsordner.

Felder:

  • rel_path \u2014 relativer Pfad zum converter_raw_dir
  • is_dir \u2014 Verzeichnis-Flag
  • size \u2014 Dateigr\u00f6\u00dfe in Bytes
  • modified_at \u2014 Datei-\u00c4nderungsdatum
  • job_id \u2014 zugewiesener Converter-Job (falls vorhanden)
  • scanned_at
"},{"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, media_type, created_at FROM jobs ORDER BY created_at DESC;\nSELECT id, parent_job_id, job_kind, is_multipart_movie, disc_number FROM jobs ORDER BY created_at DESC;\nSELECT key, value FROM settings_values ORDER BY key;\nSELECT checksum, activation_bytes FROM aax_activation_bytes;\nSELECT rel_path, job_id FROM converter_scan_entries;\n
"},{"location":"architecture/frontend/","title":"Frontend-Komponenten","text":"

Frontend: React + PrimeReact + Vite.

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

Zentrale Job-Inbox:

  • einheitliche Liste \u00fcber Ripper-, Converter- und Audiobook-Jobs
  • View-/Status-Filter, Suche, Paginierung
  • Schnellsprung in passende Detailseite (Ripper/Converter)
"},{"location":"architecture/frontend/#ripperpagejsx","title":"RipperPage.jsx","text":"

Pipeline-Steuerung:

  • Status/Progress/ETA
  • Metadaten-Dialog
  • Playlist-Entscheidung
  • Review-Panel (Track-Auswahl)
  • Queue-Interaktion (reorder/add/remove)
  • Job-Aktionen (Start/Cancel/Retry/Re-Encode)
  • Hardware-Monitoring-Anzeige
  • Aktivit\u00e4ts-Tracking (Skripte, Ketten, Cron)
"},{"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/#converterpagejsx","title":"ConverterPage.jsx","text":"

Datei-Converter:

  • Datei-Explorer des Converter-Eingangsordners (Baum-Ansicht)
  • Upload von Audio/Video-Dateien (bis zu 50 Dateien gleichzeitig)
  • Dateiverwaltung: Umbenennen, Verschieben, L\u00f6schen, Ordner erstellen
  • Jobs aus Dateiauswahl erstellen
  • Converter-Job-Konfiguration (Ausgabeformat, Preset, Tracks)
  • Job-Start, Abbruch, L\u00f6schung
  • Automatischer Scan-Status
"},{"location":"architecture/frontend/#audiobookspagejsx","title":"AudiobooksPage.jsx","text":"

Dedizierter AAX-/Audiobook-Flow:

  • Upload-Panel f\u00fcr AAX-Dateien
  • aktive Audiobook-Jobkarten mit Start/Cancel/Retry/Delete
  • Audiobook-Konfigurationspanel und Output-Explorer
"},{"location":"architecture/frontend/#downloadspagejsx","title":"DownloadsPage.jsx","text":"

Download-Queue:

  • Ausgabedateien aus der Job-Historie in die Queue einreihen
  • Download-Status verfolgen (ausstehend, wird verarbeitet, bereit, fehlgeschlagen)
  • Dateien als ZIP herunterladen
  • Download-Eintr\u00e4ge l\u00f6schen
"},{"location":"architecture/frontend/#databasepagejsx","title":"DatabasePage.jsx","text":"

Expert-Modus:

  • Tabellarische Rohsicht der Job-Datenbank
  • Orphan-RAW-Import
"},{"location":"architecture/frontend/#wichtige-komponenten","title":"Wichtige Komponenten","text":"
  • PipelineStatusCard.jsx \u2014 Pipeline-Status-Anzeige mit Progress
  • MetadataSelectionDialog.jsx \u2014 OMDb-Metadaten-Auswahl
  • MediaInfoReviewPanel.jsx \u2014 Track-Auswahl-Interface (Video/Audio/Untertitel)
  • JobDetailDialog.jsx \u2014 Job-Detailansicht mit Logs
  • CronJobsTab.jsx \u2014 Cron-Job-Verwaltung
  • DynamicSettingsForm.jsx \u2014 Schema-gesteuertes Einstellungsformular
  • ConverterJobCard.jsx \u2014 Converter-Job-Darstellung
  • CdRipConfigPanel.jsx \u2014 Konfiguration f\u00fcr Audio-CD-Ripping
"},{"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
  • Disk erkannt / Disk entfernt
  • HARDWARE_MONITOR_UPDATE
  • DOWNLOADS_UPDATED
  • CONVERTER_SCAN_UPDATE
  • RUNTIME_ACTIVITY_CHANGED
"},{"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
  • Disk erkannt, Disk entfernt
  • 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 (Fehler oder Abgebrochen) 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":"

Diese Seite listet die Felder so, wie sie in der GUI unter Settings angezeigt werden.

Hinweis: Interne Schl\u00fcsselnamen werden hier bewusst nicht verwendet. Falls du sie f\u00fcr Integrationen brauchst, nutze die API-Dokumentation.

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

Viele Felder sind pro Medientyp getrennt vorhanden:

  • Blu-ray
  • DVD
  • Sonstiges
  • Audiobook (neu ab v0.12.0)
"},{"location":"configuration/settings-reference/#template-platzhalter","title":"Template-Platzhalter","text":""},{"location":"configuration/settings-reference/#video-templates","title":"Video-Templates","text":"
  • ${title} \u2014 Titel
  • ${year} \u2014 Erscheinungsjahr
  • ${imdbId} \u2014 IMDb-ID
"},{"location":"configuration/settings-reference/#audiobook-templates","title":"Audiobook-Templates","text":"
  • {author} \u2014 Autor
  • {title} \u2014 Titel
  • {year} \u2014 Erscheinungsjahr
  • {narrator} \u2014 Sprecher
  • {series} \u2014 Buchreihe
  • {part} \u2014 Teil-Nummer
  • {format} \u2014 Ausgabeformat
"},{"location":"configuration/settings-reference/#converter-templates-video","title":"Converter-Templates (Video)","text":"
  • {title}, {year}
"},{"location":"configuration/settings-reference/#converter-templates-audio","title":"Converter-Templates (Audio)","text":"
  • {artist}, {title}, {album}, {year}, {trackNr}

Nicht gesetzte Werte werden zu unknown.

"},{"location":"configuration/settings-reference/#kategorie-pfade","title":"Kategorie: Pfade","text":"Feldname in der GUI Typ Default Raw Ausgabeordner path data/output/raw Raw Ausgabeordner (Blu-ray) path null Raw Ausgabeordner (DVD) path null Raw Ausgabeordner (Sonstiges) path null Eigent\u00fcmer Raw-Ordner (Blu-ray) string null Eigent\u00fcmer Raw-Ordner (DVD) string null Eigent\u00fcmer Raw-Ordner (Sonstiges) string null Film Ausgabeordner path data/output/movies Film Ausgabeordner (Blu-ray) path null Film Ausgabeordner (DVD) path null Film Ausgabeordner (Sonstiges) path null Eigent\u00fcmer Film-Ordner (Blu-ray) string null Eigent\u00fcmer Film-Ordner (DVD) string null Eigent\u00fcmer Film-Ordner (Sonstiges) string null Log Ordner path data/logs Audiobook RAW-Ordner path null Eigent\u00fcmer Audiobook RAW-Ordner string null Audiobook Output-Ordner path null Eigent\u00fcmer Audiobook Output-Ordner string null Output Template (Audiobook) string {author}/{author} - {title} ({year}) Audiobook RAW Template string {author} - {title} ({year}) Converter Raw-Ordner path null Converter Ausgabe (Video) path null Converter Ausgabe (Audio) path null Output-Template (Video) string {title} Output-Template (Audio) string {artist} - {title}"},{"location":"configuration/settings-reference/#kategorie-laufwerk","title":"Kategorie: Laufwerk","text":"Feldname in der GUI Typ Default Hinweis Laufwerksmodus select auto Auto Discovery oder Explizites Device Device Pfad path /dev/sr0 relevant bei Explizites Device MakeMKV Source Index number 0 Disc-Index im Auto-Modus Disc Auto-Erkennung aktiviert boolean true Automatische Disc-Erkennung per Polling Polling Intervall (ms) number 4000 1000..60000"},{"location":"configuration/settings-reference/#kategorie-monitoring","title":"Kategorie: Monitoring","text":"Feldname in der GUI Typ Default Hardware Monitoring aktiviert boolean true Hardware Monitoring Intervall (ms) number 5000"},{"location":"configuration/settings-reference/#kategorie-tools-global","title":"Kategorie: Tools (global)","text":"Feldname in der GUI Typ Default MakeMKV Kommando string makemkvcon MakeMKV Key string null Mediainfo Kommando string mediainfo Minimale Titellaenge (Minuten) number 60 HandBrake Kommando string HandBrakeCLI FFmpeg Kommando string ffmpeg FFprobe Kommando string ffprobe Encode-Neustart: unvollst\u00e4ndige Ausgabe l\u00f6schen boolean true Parallele Jobs number 1"},{"location":"configuration/settings-reference/#blu-ray-spezifisch","title":"Blu-ray-spezifisch","text":"Feldname in der GUI Typ Default Mediainfo Extra Args (Blu-ray) string null MakeMKV Rip Modus (Blu-ray) select backup MakeMKV Analyze Extra Args (Blu-ray) string null MakeMKV Rip Extra Args (Blu-ray) string null HandBrake Preset (Blu-ray) string H.264 MKV 1080p30 HandBrake Extra Args (Blu-ray) string null Ausgabeformat (Blu-ray) select mkv Dateiname Template (Blu-ray) string ${title} (${year}) Ordnername Template (Blu-ray) string null"},{"location":"configuration/settings-reference/#dvd-spezifisch","title":"DVD-spezifisch","text":"Feldname in der GUI Typ Default Mediainfo Extra Args (DVD) string null MakeMKV Rip Modus (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 Ausgabeformat (DVD) select mkv Dateiname Template (DVD) string ${title} (${year}) Ordnername Template (DVD) string null"},{"location":"configuration/settings-reference/#kategorie-converter","title":"Kategorie: Converter","text":"Feldname in der GUI Typ Default Hinweis Erlaubte Datei-Endungen* string mkv,mp4,m2ts,iso,avi,mov,flac,mp3,wav,m4a,ogg,opus In der UI als Checkbox-Liste, ohne Punkt Auto-Scan (Polling) boolean false Converter-Ordner automatisch scannen Polling-Intervall (Sekunden) number 300 30..86400"},{"location":"configuration/settings-reference/#kategorie-metadaten","title":"Kategorie: Metadaten","text":"Feldname in der GUI Typ Default OMDb API Key string null OMDb Typ select movie"},{"location":"configuration/settings-reference/#kategorie-benachrichtigungen-pushover","title":"Kategorie: Benachrichtigungen (PushOver)","text":"Feldname in der GUI Typ Default PushOver aktiviert boolean false PushOver Token string null PushOver User string null PushOver Device (optional) string null PushOver Titel-Pr\u00e4fix string Ripster PushOver Priority number 0 PushOver Timeout (ms) number 7000 Bei Metadaten-Auswahl senden boolean true Bei Rip-Start senden boolean true Bei Encode-Start senden boolean true Bei Erfolg senden boolean true Bei Fehler senden boolean true Bei Abbruch senden boolean true Bei Re-Encode Start senden boolean true Bei Re-Encode Erfolg senden boolean true"},{"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 ein \u2013 inklusive Node.js, MakeMKV, HandBrake, nginx und systemd-Dienst.

Unterst\u00fctzte Systeme laut Script: Debian, Ubuntu, Linux Mint, Pop!_OS 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> dev 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 und ohne Home-Verzeichnis; Gruppen werden (falls vorhanden) erg\u00e4nzt: cdrom, optical, disk, video, render
  7. Repository \u2013 klont Branch nach --dir (bei --reinstall: sichert backend/data, aktualisiert Repo, stellt Daten wieder her)
  8. Verzeichnisse \u2013 stellt u. a. sicher: backend/data, backend/logs, backend/data/output/raw, backend/data/output/movies, backend/data/logs
  9. npm-Abh\u00e4ngigkeiten \u2013 Root, Backend (nur production), Frontend
  10. Frontend-Build \u2013 npm run build mit relativen API-URLs (nginx-kompatibel)
  11. Backend .env \u2013 wird automatisch generiert (bei --reinstall bleibt bestehende .env erhalten)
  12. Berechtigungen \u2013 zun\u00e4chst ripster:ripster auf Installationsverzeichnis; bei sudo-Aufruf werden Output-/Log-Ordner auf <aufrufender user>:ripster mit 775 gesetzt; .env wird auf 600 gesetzt
  13. MakeMKV User-Ordner \u2013 erstellt bei sudo-Aufruf ~/.MakeMKV f\u00fcr den aufrufenden Benutzer
  14. systemd-Dienst \u2013 ripster-backend.service erstellt, aktiviert und gestartet
  15. 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    client_max_body_size 8G;\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

Hinweis: Fuer groessere Uploads wie .aax-Audiobooks muss client_max_body_size ausreichend hoch gesetzt sein. Im mitgelieferten Beispiel sind 8G hinterlegt.

"},{"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 Produktions- vs. Dev-Voraussetzungen klar trennen 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 Ausgabeordner, Film Ausgabeordner, Log Ordner Tools MakeMKV Kommando, HandBrake Kommando, Mediainfo Kommando Metadaten OMDb API Key, optional OMDb Typ

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 (Blu-ray und DVD)
  • Raw Ausgabeordner (Blu-ray und DVD)
  • Dateiname Template (Blu-ray und DVD)
"},{"location":"getting-started/configuration/#3-queue-und-monitoring-festlegen","title":"3. Queue und Monitoring festlegen","text":"
  • Parallele Jobs f\u00fcr den gleichzeitigen Durchsatz
  • Hardware Monitoring aktiviert + Hardware Monitoring Intervall (ms) f\u00fcr Live-Metriken im Ripper
"},{"location":"getting-started/configuration/#4-optional-push-benachrichtigungen","title":"4. Optional: Push-Benachrichtigungen","text":"

In den Benachrichtigungsfeldern setzen:

  • PushOver aktiviert
  • PushOver Token
  • PushOver User

Dann \u00fcber PushOver Test direkt pr\u00fcfen.

"},{"location":"getting-started/configuration/#2-minuten-funktionstest","title":"2-Minuten-Funktionstest","text":"
  1. Ripper \u00f6ffnen
  2. Disc einlegen
  3. Analyse starten
  4. Metadaten \u00fcbernehmen
  5. Bis Bereit zum Encodieren 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.

Du musst daf\u00fcr keine Tools manuell vorinstallieren. Das Skript installiert die ben\u00f6tigten Abh\u00e4ngigkeiten automatisch, sofern sie nicht explizit mit --no-* \u00fcbersprungen werden.

"},{"location":"getting-started/installation/#unterstutzte-systeme-und-anforderungen","title":"Unterst\u00fctzte Systeme und Anforderungen","text":"
  • unterst\u00fctzt laut Script: debian, ubuntu, linuxmint, pop
  • Ausf\u00fchrung als root (oder via sudo)
  • Internetzugang w\u00e4hrend der Installation
"},{"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 w\u00e4hlst du den HandBrake-Modus:

  • 1 Standard (Paketinstallation)
  • 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 (Standard): http://<Server-IP>
  • ohne nginx (--no-nginx): API auf http://<Server-IP>:3001/api
"},{"location":"getting-started/installation/#was-installsh-konkret-einrichtet","title":"Was install.sh konkret einrichtet","text":"
  1. pr\u00fcft Betriebssystem, Root-Rechte und ermittelt Host/IP
  2. aktualisiert Paketquellen und installiert Basispakete (curl, wget, git, mediainfo, udev ...)
  3. installiert Node.js 20 (falls nicht passend vorhanden)
  4. installiert optional MakeMKV (Build aus den offiziellen Quellen)
  5. installiert optional HandBrakeCLI (Standard oder GPU/NVDEC)
  6. installiert optional nginx
  7. legt den Systembenutzer ripster an (ohne Login-Shell, ohne Home) und erg\u00e4nzt Gruppen (cdrom, optical, disk, video, render, falls vorhanden)
  8. klont das Repository nach /opt/ripster (oder aktualisiert bei --reinstall)
  9. legt Verzeichnisse an:
  10. /opt/ripster/backend/data
  11. /opt/ripster/backend/logs
  12. /opt/ripster/backend/data/output/raw
  13. /opt/ripster/backend/data/output/movies
  14. /opt/ripster/backend/data/logs
  15. installiert npm-Abh\u00e4ngigkeiten (Root, Backend, Frontend) und baut das Frontend
  16. erzeugt backend/.env (bei --reinstall bleibt bestehende .env erhalten)
  17. setzt Rechte/Besitz und erstellt bei sudo-Installation zus\u00e4tzlich ~/.MakeMKV f\u00fcr den aufrufenden Benutzer
  18. erzeugt und startet ripster-backend.service
  19. konfiguriert und startet nginx (falls nicht \u00fcbersprungen)
"},{"location":"getting-started/installation/#wichtige-optionen","title":"Wichtige Optionen","text":"Option Default laut Script Zweck --branch <branch> dev Branch f\u00fcr die Installation --dir <pfad> /opt/ripster Installationsverzeichnis --user <benutzer> ripster Service-Benutzer --port <port> 3001 Backend-Port --host <hostname> automatisch ermittelte Host-IP Hostname/IP f\u00fcr Webzugriff/CORS --no-makemkv aus MakeMKV-Installation \u00fcberspringen --no-handbrake aus HandBrake-Installation \u00fcberspringen --no-nginx aus nginx-Setup \u00fcberspringen --reinstall aus bestehende Installation aktualisieren

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":"
  • Laufwerk nicht zugreifbar: Laufwerksrechte/Gruppen pr\u00fcfen
  • CLI-Tool fehlt wegen --no-*: Tool nachinstallieren oder Befehl in Settings korrigieren
  • UI nicht erreichbar: nginx-Status und 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":"

Die Voraussetzungen h\u00e4ngen davon ab, wie du Ripster betreibst.

"},{"location":"getting-started/prerequisites/#produktionsbetrieb-mit-installsh-standard","title":"Produktionsbetrieb mit install.sh (Standard)","text":"

F\u00fcr den normalen Betrieb sind nur wenige Punkte vorab n\u00f6tig.

"},{"location":"getting-started/prerequisites/#pflicht","title":"Pflicht","text":"
  • unterst\u00fctztes Linux-System (laut Script: Debian, Ubuntu, Linux Mint, Pop!_OS)
  • root-Rechte
  • Internetzugang w\u00e4hrend der Installation
  • optisches Laufwerk f\u00fcr Disc-Betrieb

install.sh installiert die ben\u00f6tigten Tools selbst (u. a. Node.js, MakeMKV, HandBrakeCLI, MediaInfo), sofern sie nicht explizit per --no-* \u00fcbersprungen werden.

"},{"location":"getting-started/prerequisites/#laufwerk-kurz-prufen","title":"Laufwerk kurz pr\u00fcfen","text":"
ls /dev/sr*\nlsblk | grep rom\n

Wenn n\u00f6tig Rechte setzen (Beispiel):

sudo chmod a+rw /dev/sr0\n
"},{"location":"getting-started/prerequisites/#optional-vorab","title":"Optional vorab","text":"
  • OMDb API-Key (kann auch nach Installation in den Settings gesetzt werden)
  • PushOver-Zugangsdaten (optional)
"},{"location":"getting-started/prerequisites/#entwicklungsmodus-nur-fur-dev","title":"Entwicklungsmodus (nur f\u00fcr Dev)","text":"

Wenn du lokal entwickelst (./start.sh, npm run dev), gelten zus\u00e4tzliche Voraussetzungen:

  • Node.js >= 20.19.0
  • makemkvcon, HandBrakeCLI, mediainfo im PATH

Details: Entwicklungsumgebung

"},{"location":"getting-started/prerequisites/#abschluss-checkliste","title":"Abschluss-Checkliste","text":"
  • [ ] Produktionsbetrieb: Linux + root + Internet + Laufwerk vorhanden
  • [ ] Dev-Modus (nur falls ben\u00f6tigt): Node.js und CLI-Tools verf\u00fcgbar
"},{"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-ripper-offnen-und-disc-einlegen","title":"1. Ripper \u00f6ffnen und Disc einlegen","text":"

Erwartung:

  • Status wechselt auf 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 Ripper:

  • Analyse starten

Erwartung:

  • Status Analyse
  • 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: Rippen -> Mediainfo-Pruefung -> Bereit zum Encodieren
  • bei vorhandenem RAW: direkt Mediainfo-Pruefung -> Bereit zum Encodieren
  • bei unklarer Blu-ray-Playlist: Warte auf Auswahl (Playlist ausw\u00e4hlen und \u00fcbernehmen)
"},{"location":"getting-started/quickstart/#5-review-in-bereit-zum-encodieren","title":"5. Review in Bereit zum Encodieren","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 Encodieren:

  • Fortschritt + ETA im Ripper
  • 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 Fertig:

  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 sieben Hauptseiten in der Navigation plus eine Expert-Seite.

"},{"location":"gui/#seitenuberblick","title":"Seiten\u00fcberblick","text":"Seite Zweck Jobs zentrale Inbox mit allen Jobs (Ripper, Converter, Audiobooks) Ripper Live-Betrieb: Pipeline, Queue, Aktivit\u00e4ten, Disc-Infos Audiobooks AAX-Upload, Audiobook-Jobsteuerung und Output-Explorer Settings Konfiguration, Skripte, Ketten, Presets, Cronjobs Historie abgeschlossene/laufende Jobs durchsuchen und nachbearbeiten Converter Audio/Video-Dateien konvertieren, Datei-Explorer, Upload Downloads Ausgabedateien als ZIP herunterladen Database (Expert) tabellarische Rohsicht inkl. Orphan-RAW-Import"},{"location":"gui/#empfohlene-nutzung-im-alltag","title":"Empfohlene Nutzung im Alltag","text":"
  1. Ersten \u00dcberblick \u00fcber alle Jobs: Jobs
  2. Start eines neuen Disc-Jobs: Ripper
  3. Audio/Video-Dateien konvertieren: Converter
  4. AAX/Audiobook-Flow: Audiobooks
  5. Regeln/Automatisierung anpassen: Settings
  6. Ergebnisse pr\u00fcfen oder Jobs nachbearbeiten: Historie
  7. Dateien herunterladen: Downloads
  8. Sonderf\u00e4lle/Recovery: Database
"},{"location":"gui/#hinweise-zur-navigation","title":"Hinweise zur Navigation","text":"
  • Jobs, Ripper, Converter, Audiobooks, Settings, Historie und Downloads sind direkt in der Kopfnavigation.
  • Database ist als Expert-Route verf\u00fcgbar: /database.
"},{"location":"gui/audiobooks/","title":"Audiobooks","text":"

Die Seite Audiobooks ist die dedizierte Oberfl\u00e4che f\u00fcr AAX- und Audiobook-Jobs.

"},{"location":"gui/audiobooks/#aufbau","title":"Aufbau","text":"
  1. Audiobooks Upload
  2. Audiobook Jobs
  3. Audiobook Output Explorer
"},{"location":"gui/audiobooks/#1-audiobooks-upload","title":"1) Audiobooks Upload","text":"

Hier werden AAX-Dateien hochgeladen und als Job vorbereitet.

Typische Schritte:

  1. Datei ausw\u00e4hlen
  2. optional Format/Startverhalten setzen
  3. Upload starten

W\u00e4hrend des Uploads zeigt die Seite Fortschritt und Status an.

"},{"location":"gui/audiobooks/#2-audiobook-jobs","title":"2) Audiobook Jobs","text":"

Aktive Audiobook-Jobs werden als Karten dargestellt (mit Status und Fortschritt).

Pro Job sind je nach Zustand Aktionen verf\u00fcgbar:

  • Starten (mit aktueller Audiobook-Konfiguration)
  • Abbrechen
  • Retry
  • L\u00f6schen

Zus\u00e4tzlich:

  • Im Ripper springt in die Hauptansicht
  • Jobs laden periodisch nach und reagieren auf WebSocket-Updates
"},{"location":"gui/audiobooks/#3-audiobook-output-explorer","title":"3) Audiobook Output Explorer","text":"

Read-only Baumansicht des konfigurierten Audiobook-Ausgabeordners:

  • Ordner- und Dateiansicht
  • Gr\u00f6\u00dfen-/Zeitstempel\u00fcbersicht
  • schnelle Kontrolle der erzeugten Ergebnisse
"},{"location":"gui/audiobooks/#abgrenzung-zum-converter","title":"Abgrenzung zum Converter","text":"

Audio/Video-Datei-Konvertierung l\u00e4uft weiterhin auf der Seite Converter. Der AAX-spezifische Flow (Upload, Start, Jobsteuerung, Output-Explorer) liegt auf Audiobooks.

"},{"location":"gui/converter/","title":"Converter","text":"

Die Converter-Seite erm\u00f6glicht das Konvertieren vorhandener Audio- und Video-Dateien.

"},{"location":"gui/converter/#uberblick","title":"\u00dcberblick","text":"

Der Converter arbeitet mit einem konfigurierbaren Eingangsordner (converter_raw_dir). Dateien werden dort abgelegt (manuell oder per Upload) und dann als Converter-Jobs in die Pipeline eingereiht.

"},{"location":"gui/converter/#datei-explorer","title":"Datei-Explorer","text":"

Der Datei-Explorer zeigt den Inhalt des converter_raw_dir als Baumstruktur.

"},{"location":"gui/converter/#verfugbare-aktionen","title":"Verf\u00fcgbare Aktionen","text":"Aktion Beschreibung Upload Dateien direkt aus dem Browser hochladen (bis zu 50 Dateien) Ordner erstellen Neuen Unterordner anlegen Umbenennen Datei oder Ordner umbenennen Verschieben Datei oder Ordner in einen anderen Unterordner verschieben L\u00f6schen Datei oder Ordner l\u00f6schen (unwiderruflich) Scannen Eingangsordner manuell neu scannen"},{"location":"gui/converter/#dateiauswahl","title":"Dateiauswahl","text":"

Dateien k\u00f6nnen per Checkbox ausgew\u00e4hlt werden. Aus der Auswahl lassen sich Jobs erstellen:

  • Ein Job pro Datei \u2014 jede Datei wird als eigenst\u00e4ndiger Job angelegt
  • Gemeinsamer Job (Audio) \u2014 mehrere Audio-Dateien werden zu einem gemeinsamen Job zusammengefasst

Erlaubte Dateiendungen werden in den Settings unter Converter > Erlaubte Datei-Endungen* als Checkboxen konfiguriert.

"},{"location":"gui/converter/#jobs-erstellen-und-konfigurieren","title":"Jobs erstellen und konfigurieren","text":"

Nach der Auswahl und Job-Erstellung erscheinen die Jobs in der Job-Liste.

"},{"location":"gui/converter/#job-konfiguration","title":"Job-Konfiguration","text":"

Jeder Job kann konfiguriert werden:

  • Medientyp: Video, Audio oder Audiobook
  • Ausgabeformat: z. B. mkv, mp4, m4b, mp3, flac
  • HandBrake-Preset: f\u00fcr Video-Konvertierung
  • Track-Auswahl: Video-, Audio- und Untertitel-Spuren
  • Metadaten: Titel, Autor, Jahr (f\u00fcr Audiobooks)
  • MusicBrainz-Suche: automatische Metadaten-Suche f\u00fcr Audiodateien
"},{"location":"gui/converter/#job-start","title":"Job-Start","text":"

Jobs starten sofort oder reihen sich in die Queue ein (abh\u00e4ngig von Parallele Jobs).

"},{"location":"gui/converter/#auto-scan-polling","title":"Auto-Scan (Polling)","text":"

Wenn in den Settings Converter > Auto-Scan (Polling) aktiviert ist, wird der Eingangsordner automatisch in regelm\u00e4\u00dfigen Abst\u00e4nden gescannt. Neue Dateien werden in der DB erfasst und im Explorer angezeigt.

Das Scan-Intervall wird unter Converter > Polling-Intervall (Sekunden) konfiguriert (Standard: 300 Sekunden).

"},{"location":"gui/converter/#hinweis-zu-audiobooks","title":"Hinweis zu Audiobooks","text":"

Der dedizierte AAX-/Audiobook-Flow ist auf der Seite Audiobooks dokumentiert.

"},{"location":"gui/converter/#einstellungen","title":"Einstellungen","text":"Setting Pfad in GUI Eingangsordner Settings > Pfade > Converter Raw-Ordner Videoausgabe Settings > Pfade > Converter Ausgabe (Video) Audioausgabe Settings > Pfade > Converter Ausgabe (Audio) Erlaubte Endungen Settings > Converter > Erlaubte Datei-Endungen* Auto-Scan Settings > Converter > Auto-Scan (Polling) Scan-Intervall Settings > Converter > Polling-Intervall (Sekunden) Output-Template Video Settings > Pfade > Output-Template (Video) Output-Template Audio Settings > Pfade > Output-Template (Audio)"},{"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/#gefundene-raw-eintrage","title":"Gefundene RAW-Eintr\u00e4ge","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/downloads/","title":"Downloads","text":"

Die Downloads-Seite erm\u00f6glicht es, Ausgabedateien aus abgeschlossenen Jobs als ZIP-Archiv herunterzuladen.

"},{"location":"gui/downloads/#uberblick","title":"\u00dcberblick","text":"

Jobs, die in der Historie abgeschlossen sind, k\u00f6nnen in die Download-Queue eingereiht werden. Ripster erstellt daraus ein ZIP-Archiv, das direkt im Browser heruntergeladen werden kann.

"},{"location":"gui/downloads/#download-queue","title":"Download-Queue","text":"

Die Queue zeigt alle aktuellen Download-Eintr\u00e4ge mit ihrem Status:

Status Beschreibung Ausstehend In der Queue, ZIP-Erstellung noch nicht gestartet Wird verarbeitet ZIP-Archiv wird gerade erstellt Bereit ZIP fertig, Download-Button verf\u00fcgbar Fehlgeschlagen Fehler bei der ZIP-Erstellung"},{"location":"gui/downloads/#download-einreihen","title":"Download einreihen","text":"

Downloads k\u00f6nnen \u00fcber die Historie eingereiht werden:

  1. Job in der Historie \u00f6ffnen
  2. Download einreihen w\u00e4hlen
  3. Ziel ausw\u00e4hlen: RAW-Dateien oder Ausgabedateien
  4. Den Eintrag in der Downloads-Queue verfolgen
"},{"location":"gui/downloads/#download-starten","title":"Download starten","text":"

Sobald der Status Bereit angezeigt wird, kann die ZIP-Datei mit dem Download-Button heruntergeladen werden.

ZIP-Dateinamen folgen dem Muster: Job_<id>_<target>.zip

"},{"location":"gui/downloads/#eintrage-loschen","title":"Eintr\u00e4ge l\u00f6schen","text":"

Abgeschlossene oder fehlerhafte Eintr\u00e4ge k\u00f6nnen einzeln gel\u00f6scht werden. Die dazugeh\u00f6rige ZIP-Datei wird dabei ebenfalls vom Server entfernt.

"},{"location":"gui/downloads/#echtzeit-updates","title":"Echtzeit-Updates","text":"

Die Downloads-Seite aktualisiert sich automatisch per WebSocket (DOWNLOADS_UPDATED). Status\u00e4nderungen (z. B. von Wird verarbeitet zu Bereit) werden ohne Seiten-Reload angezeigt.

"},{"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)

Bei Serien-Containern zeigt der Dialog statt eines globalen Log-Blocks einen Disks-Bereich mit einzelnen Disk-Akkordeons. Jede Disk kann dort separat gepr\u00fcft und bearbeitet werden.

"},{"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

Zus\u00e4tzlich bei Serien-Container-Disks:

  • Im Ripper \u00f6ffnen (f\u00fcr READY_TO_ENCODE-Kinder)
  • diskbezogene L\u00f6schaktionen (RAW, Folgen, Beides) mit Child-/Subjob-Scope
  • diskbezogenes L\u00f6schen des Historieneintrags (inkl. Subjobs)
"},{"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/#loschen-mit-vorschau","title":"L\u00f6schen mit Vorschau","text":"

Beim L\u00f6schen eines Historieneintrags (Eintrag l\u00f6schen) gibt es eine Pfadvorschau:

  • getrennt nach RAW und Ausgabe (Movie/Folgen)
  • f\u00fcr Serien-/Multipart-F\u00e4lle mit Scope auf verkn\u00fcpfte Jobs
  • selektierbare Pfade vor dem finalen L\u00f6schen

Neu im RAW-Bereich:

  • bei mehreren RAW-Kandidaten kann pro Pfad gew\u00e4hlt werden, was entfernt wird
  • mindestens ein RAW-Pfad muss gew\u00e4hlt sein, wenn RAW-L\u00f6schung Teil der Aktion ist

Die Buttons (Eintrag + nur RAW, Eintrag + nur ..., Eintrag + RAW + ...) ber\u00fccksichtigen die aktuelle Pfadauswahl und deaktivieren sich bei unvollst\u00e4ndiger Auswahl.

"},{"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/jobs/","title":"Jobs","text":"

Die Seite Jobs ist die zentrale Inbox \u00fcber alle Job-Typen.

"},{"location":"gui/jobs/#zweck","title":"Zweck","text":"

Jobs zeigt denselben Datenbestand in einer einheitlichen Liste:

  • Ripper-Jobs (Blu-ray/DVD/CD)
  • Converter-Jobs (Audio/Video/ISO)
  • Audiobook-Jobs

Die Seite eignet sich als schneller Einstieg, bevor man in den jeweiligen Fachbereich springt.

"},{"location":"gui/jobs/#filter-und-ansicht","title":"Filter und Ansicht","text":""},{"location":"gui/jobs/#view-filter","title":"View-Filter","text":"
  • Alle Jobs
  • Ripper-View
  • Converter-View
  • Audiobooks
"},{"location":"gui/jobs/#status-filter","title":"Status-Filter","text":"
  • Alle
  • Aktiv
  • Fehler/Abbruch

Zus\u00e4tzlich gibt es eine Freitextsuche (Titel, Status, IMDb, Job-Kind etc.) und eine Paginierung.

"},{"location":"gui/jobs/#was-ein-eintrag-zeigt","title":"Was ein Eintrag zeigt","text":"
  • Job-ID und Titel
  • Status-Badge (inkl. Queue-Ber\u00fccksichtigung)
  • Job-Typ-Badge (z. B. Blu-ray, Converter Audio, Audiobook)
  • Zeitstempel der letzten Aktualisierung

Die Liste aktualisiert sich zyklisch automatisch.

"},{"location":"gui/jobs/#aktion","title":"Aktion","text":"

Pro Eintrag gibt es einen Schnellzugriff:

  • Im Ripper \u00f6ffnen f\u00fcr Disc-/Audiobook-orientierte Jobs
  • Im Converter \u00f6ffnen f\u00fcr Converter-Jobs

So gelangst du mit einem Klick in die passende Detailoberfl\u00e4che.

"},{"location":"gui/ripper/","title":"Ripper","text":"

Das Ripper ist die Betriebszentrale f\u00fcr laufende Jobs.

"},{"location":"gui/ripper/#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/ripper/#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 aktiviert)
"},{"location":"gui/ripper/#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 den Wert aus Settings -> Parallele Jobs.
"},{"location":"gui/ripper/#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/ripper/#4-job-ubersicht","title":"4) Job \u00dcbersicht","text":"

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

Zus\u00e4tzliche Kennzeichnungen in der Liste:

  • Serien-Container/Serien-Disk f\u00fcr Staffel-Workflows
  • Multipart Movie bei zusammengef\u00fchrten Film-Discs
  • Untertitel mit Disc-/Container-Infos (z. B. Disc 2 | Container #123)

Im aufgeklappten Zustand erscheint die Karte Pipeline-Status mit allen zustandsabh\u00e4ngigen Aktionen.

"},{"location":"gui/ripper/#zustandsabhangige-hauptaktionen","title":"Zustandsabh\u00e4ngige Hauptaktionen","text":"Zustand Typische Aktion Medium erkannt / Bereit Analyse starten Metadatenauswahl Metadaten \u00f6ffnen Warte auf Auswahl Playlist w\u00e4hlen und Playlist \u00fcbernehmen Startbereit Job starten Bereit zum Encodieren Tracks/Skripte pr\u00fcfen, dann Encoding starten laufend (Analyse/Rippen/Encodieren) Abbrechen Fehler / Abgebrochen Retry Rippen, Disk-Analyse neu starten

Zus\u00e4tzlich je nach Job:

  • Review neu starten
  • Encode neu starten
  • Aus Queue l\u00f6schen
"},{"location":"gui/ripper/#titel-spurprufung-bereit-zum-encodieren","title":"Titel-/Spurpr\u00fcfung (Bereit zum Encodieren)","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/ripper/#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

Hinweis:

  • Laufwerk neu lesen ist nicht mehr an einen festen Pipeline-State gebunden und kann genutzt werden, solange kein Rescan-Request l\u00e4uft.
"},{"location":"gui/ripper/#wichtige-dialoge-im-ripper","title":"Wichtige Dialoge im Ripper","text":""},{"location":"gui/ripper/#metadaten-auswahlen","title":"Metadaten ausw\u00e4hlen","text":"
  • OMDb-Suche + Ergebnisliste
  • manuelle Eingabe als Fallback
  • Auswahl \u00fcbernehmen startet den n\u00e4chsten Pipeline-Schritt

Bei Film-Duplikaten in der Historie \u00f6ffnet sich ein Konfliktdialog:

  • \u00dcbernahme erzwingen: legt trotzdem einen neuen Job mit denselben Metadaten an
  • Multipart movie: verkn\u00fcpft bestehenden und neuen Job in einem Multipart-Container (mit separaten Disc-Nummern)
  • Zur\u00fcck zur Auswahl: zur\u00fcck in die Metadatenliste
"},{"location":"gui/ripper/#abbruch-bereinigung","title":"Abbruch-Bereinigung","text":"

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

"},{"location":"gui/ripper/#queue-eintrag-einfugen","title":"Queue-Eintrag einf\u00fcgen","text":"

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

"},{"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 Ripper 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 Ripper im Review (Bereit zum Encodieren).
"},{"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":"

Vor dem eigentlichen Encoding erstellt Ripster einen Encode-Plan und zeigt ihn im Review an.

"},{"location":"pipeline/encoding/#ablauf","title":"Ablauf","text":"
Quelle bestimmen (Disc/RAW)\n  -> HandBrake-Scan (--scan --json)\n  -> Plan erstellen (Titel, Audio, Untertitel)\n  -> Status: Bereit zum Encodieren\n  -> Benutzer bestaetigt Auswahl\n  -> finaler HandBrake-Aufruf\n
"},{"location":"pipeline/encoding/#review-inhalt-status-bereit-zum-encodieren","title":"Review-Inhalt (Status: Bereit zum Encodieren)","text":"
  • ausw\u00e4hlbarer Encode-Titel
  • Audio-Track-Auswahl
  • Untertitel-Track-Auswahl inkl. Flags
  • burnIn
  • forced
  • defaultTrack
  • optionale User-Presets (HandBrake Preset + Extra Args)
  • optionale Pre-/Post-Skripte und Ketten
"},{"location":"pipeline/encoding/#bestaetigung-confirm-encode","title":"Bestaetigung (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

Die best\u00e4tigte Auswahl wird im Job gespeichert und f\u00fcr Neustarts wiederverwendet.

"},{"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

Fehlerverhalten:

  • Pre-Encode-Fehler: Job endet mit Status Fehler (Encode startet nicht)
  • Post-Encode-Fehler: Job kann Fertig bleiben, enth\u00e4lt aber Fehlerhinweis/Script-Summary
"},{"location":"pipeline/encoding/#dateinamenordner","title":"Dateinamen/Ordner","text":"

Der finale Outputpfad wird aus den Templates in den Settings aufgebaut.

Platzhalter:

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

Ung\u00fcltige Dateizeichen werden bereinigt.

"},{"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 sehr 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 intern Kandidatenlisten, Bewertungen und eine Empfehlung.

"},{"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, wechselt der Job in der GUI auf:

  • Warte auf Auswahl

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

"},{"location":"pipeline/playlist-analysis/#konfigurationseinfluss","title":"Konfigurationseinfluss","text":"Feld in Settings Wirkung Minimale Titellaenge (Minuten) Mindestlaufzeit f\u00fcr Kandidaten

Default ist aktuell 60 Minuten.

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

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

Nach Best\u00e4tigung:

  • mit vorhandenem RAW -> zur\u00fcck zu Mediainfo-Pruefung
  • ohne RAW -> Startpfad \u00fcber Startbereit / Rippen
"},{"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":"
Bereit zum Encodieren\n  -> Pre-Encode Skripte/Ketten\n  -> HandBrake Encoding\n  -> Post-Encode Skripte/Ketten\n  -> Fertig oder Fehler\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 Fehler.
  • Post-Encode-Fehler stoppen die restlichen Post-Schritte; Job kann dennoch Fertig 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 Zustandsmaschine.

"},{"location":"pipeline/workflow/#zustandsdiagramm-vereinfacht","title":"Zustandsdiagramm (vereinfacht)","text":"
flowchart LR\n    A[Bereit] --> B[Medium erkannt]\n    B --> C[Analyse]\n    C --> D[Metadatenauswahl]\n    D --> E[Startbereit]\n    E --> F[Rippen]\n    E --> G[Mediainfo-Pruefung]\n    G --> H[Warte auf Auswahl]\n    H --> G\n    G --> I[Bereit zum Encodieren]\n    I --> J[Encodieren]\n    J --> K[Fertig]\n    J --> L[Fehler]\n    F --> L\n    F --> M[Abgebrochen]
"},{"location":"pipeline/workflow/#statusliste-gui-anzeige","title":"Statusliste (GUI-Anzeige)","text":"Status in der GUI Bedeutung Bereit Wartet auf Disc Medium erkannt Disc wurde erkannt Analyse MakeMKV-Analyse l\u00e4uft Metadatenauswahl Metadaten m\u00fcssen best\u00e4tigt werden Warte auf Auswahl Playlist-Auswahl ist erforderlich Warte auf Auswahl auch f\u00fcr RAW-Entscheidung bei vorhandenen Quelldaten genutzt Startbereit kurzer \u00dcbergang vor Start Rippen MakeMKV-Rip l\u00e4uft Mediainfo-Pruefung Titel/Spuren werden ausgewertet Bereit zum Encodieren Review ist bereit Encodieren HandBrake l\u00e4uft CD-Metadatenauswahl CD-Metadaten m\u00fcssen best\u00e4tigt werden CD-Startbereit CD-Job wartet auf Start CD-Analyse CD-Track-/Strukturaufbereitung CD-Rippen Audio-CD-Rip l\u00e4uft CD-Encodieren CD-Encode l\u00e4uft Fertig erfolgreich abgeschlossen Abgebrochen manuell oder technisch abgebrochen Fehler fehlgeschlagen"},{"location":"pipeline/workflow/#typische-pfade","title":"Typische Pfade","text":""},{"location":"pipeline/workflow/#standardfall-kein-vorhandenes-raw","title":"Standardfall (kein vorhandenes RAW)","text":"
  1. Medium erkannt
  2. Analyse + Metadaten
  3. Rippen
  4. Mediainfo-Pruefung
  5. Bereit zum Encodieren
  6. Encodieren
  7. Fertig
"},{"location":"pipeline/workflow/#vorhandenes-raw","title":"Vorhandenes RAW","text":"

Startbereit springt direkt zu Mediainfo-Pruefung (kein neuer Rip).

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

Mediainfo-Pruefung -> Warte auf Auswahl bis Playlist best\u00e4tigt wurde.

"},{"location":"pipeline/workflow/#vorhandenes-raw-mit-nutzerentscheidung","title":"Vorhandenes RAW mit Nutzerentscheidung","text":"

Metadatenauswahl -> Warte auf Auswahl bis Entscheidung f\u00fcr Weiterverarbeitung (continue) oder Neustart getroffen wurde.

"},{"location":"pipeline/workflow/#cd-flow","title":"CD-Flow","text":"

CD-Metadatenauswahl -> CD-Startbereit -> CD-Rippen -> CD-Encodieren -> Fertig

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

Wenn der Wert Parallele Jobs erreicht ist:

  • neue Starts werden als Queue-Eintr\u00e4ge abgelegt
  • die Queue kann zus\u00e4tzlich Nicht-Job-Eintr\u00e4ge enthalten (Skript, Kette, Warten)
  • Reihenfolge ist per UI/API \u00e4nderbar
"},{"location":"pipeline/workflow/#abbruch-wiederaufnahme-neustart","title":"Abbruch, Wiederaufnahme, Neustart","text":"
  • Abbrechen: laufenden Job stoppen oder Queue-Eintrag entfernen
  • Retry Rippen: Fehler-/Abbruch-Job erneut starten
  • RAW neu encodieren: aus vorhandenem RAW neu encodieren
  • Review neu starten: Review aus RAW neu aufbauen
  • Encode neu starten: 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-felder-in-settings","title":"Relevante Felder in Settings","text":"Feldname in der GUI Bedeutung HandBrake Kommando CLI-Binary HandBrake Preset (Blu-ray/DVD) profilspezifisches Preset HandBrake Extra Args (Blu-ray/DVD) profilspezifische Zusatzargumente Ausgabeformat (Blu-ray/DVD) Dateiendung der finalen Datei Encode-Neustart: unvollst\u00e4ndige Ausgabe l\u00f6schen 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 in Settings ein MakeMKV Key gesetzt ist, f\u00fchrt Ripster vor Analyse/Rip aus:

makemkvcon reg <key>\n
"},{"location":"tools/makemkv/#relevante-felder-in-settings","title":"Relevante Felder in Settings","text":"Feldname in der GUI Bedeutung MakeMKV Kommando CLI-Binary MakeMKV Source Index Source-Index im Auto-Modus Minimale Titellaenge (Minuten) Mindestlaufzeitfilter MakeMKV Rip Modus (Blu-ray/DVD) mkv oder backup MakeMKV Analyze Extra Args (Blu-ray/DVD) Zusatzargumente f\u00fcr Analyse MakeMKV Rip Extra Args (Blu-ray/DVD) Zusatzargumente f\u00fcr 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. Ripper: Disc einlegen, Analyse starten
  2. Metadaten im Dialog \u00fcbernehmen
  3. bei Bereit zum Encodieren 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 Warte auf Auswahl
  2. im Pipeline-Status Playlist-Kandidaten vergleichen
  3. gew\u00fcnschte Playlist ausw\u00e4hlen
  4. Playlist \u00fcbernehmen
  5. danach normal weiter bis Bereit zum Encodieren
"},{"location":"workflows/#workflow-3-mehrere-jobs-mit-queue","title":"Workflow 3: Mehrere Jobs mit Queue","text":"
  1. Parallel-Limit in Settings \u00fcber Parallele Jobs setzen
  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 Ripper-Review Pre-/Post-Ausf\u00fchrungen pro Job ausw\u00e4hlen
  4. Settings -> Cronjobs: zeitgesteuerte Ausf\u00fchrung konfigurieren
  5. Status im Ripper (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 Ripper 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-bereit-zum-encodieren-ist-aber-nicht-aktive-session","title":"Fall B: Job steht in Bereit zum Encodieren, ist aber nicht aktive Session","text":"
  • in Historie: Im Ripper \u00f6ffnen
  • im Ripper Review erneut pr\u00fcfen und starten
"},{"location":"workflows/#fall-c-raw-ohne-historieneintrag","title":"Fall C: RAW ohne Historieneintrag","text":"
  • /database \u00f6ffnen
  • Bereich Gefundene RAW-Eintr\u00e4ge
  • Job anlegen
"},{"location":"workflows/#workflow-7-duplikat-als-multipart-movie-zusammenfuhren","title":"Workflow 7: Duplikat als Multipart Movie zusammenf\u00fchren","text":"
  1. Ripper -> Metadaten ausw\u00e4hlen f\u00fcr einen Film-Job
  2. bei Duplikat-Konflikt Multipart movie w\u00e4hlen
  3. Disc-Nummern f\u00fcr bestehenden und neuen Job setzen (jeweils >= 1, unterschiedlich)
  4. Metadaten \u00fcbernehmen
  5. in Historie den gemeinsamen Multipart-Container pr\u00fcfen
"},{"location":"workflows/#workflow-8-selektives-loschen-in-der-historie","title":"Workflow 8: Selektives L\u00f6schen in der Historie","text":"
  1. in Historie einen Job \u00f6ffnen und Historieneintrag l\u00f6schen
  2. L\u00f6schvorschau pr\u00fcfen (RAW + Ausgabe)
  3. gew\u00fcnschte RAW-/Ausgabepfade gezielt ausw\u00e4hlen
  4. passende Aktion ausf\u00fchren (Eintrag + nur RAW, Eintrag + nur ..., Eintrag + RAW + ...)
"},{"location":"workflows/#workflow-9-audiobook-aax-verarbeiten","title":"Workflow 9: Audiobook (AAX) verarbeiten","text":"
  1. Seite Audiobooks \u00f6ffnen
  2. AAX-Datei hochladen
  3. Job-Konfiguration pr\u00fcfen und starten
  4. Fortschritt im Job-Panel verfolgen
  5. Ergebnis im Audiobook Output Explorer und in der Historie pr\u00fcfen
"}]} \ 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":"

Diese Dokumentation ist als vollst\u00e4ndiges Benutzerhandbuch aufgebaut: t\u00e4gliche Bedienung zuerst, technische Referenz danach.

"},{"location":"#einstieg-in-3-schritten","title":"Einstieg in 3 Schritten","text":"
  1. Installation: Installation
  2. Betriebskonfiguration: Ersteinrichtung
  3. erster End-to-End-Lauf: Erster Lauf
"},{"location":"#was-das-handbuch-abdeckt","title":"Was das Handbuch abdeckt","text":"
  • alle GUI-Seiten mit Aktionen und Wirkung
  • vollst\u00e4ndige Workflows f\u00fcr Film, Serie und Multipart
  • Queue-, Job-, Container- und Recovery-Verhalten
  • detaillierte Settings-Wirkung inklusive Fallbacks
"},{"location":"#empfohlene-lesereihenfolge","title":"Empfohlene Lesereihenfolge","text":"
  1. Benutzerhandbuch \u00dcberblick
  2. GUI-Seiten
  3. Workflows aus Nutzersicht
  4. Einstellungsreferenz
  5. bei Bedarf technischer Tiefgang im 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

  • Converter API

    Datei-Explorer, Upload, Job-Verwaltung f\u00fcr den Converter.

    Converter API

  • Downloads API

    Download-Queue f\u00fcr Ausgabedateien aus der Job-Historie.

    Downloads API

  • Runtime Activities API

    Laufende und abgeschlossene Aktivit\u00e4ten (Skripte, Ketten, Cron, Tasks).

    Runtime Activities

  • :material-websocket: WebSocket Events

    Pipeline-, Queue-, Disk-, Settings-, Cron-, Converter- und Download-Events.

    WebSocket

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

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

"},{"location":"api/converter/","title":"Converter API","text":"

Endpunkte f\u00fcr den Datei-Converter: Datei-Explorer, Upload, Job-Verwaltung.

Basis-Pfad: /api/converter

"},{"location":"api/converter/#scan-explorer","title":"Scan & Explorer","text":""},{"location":"api/converter/#get-apiconvertertree","title":"GET /api/converter/tree","text":"

Vollst\u00e4ndiger Verzeichnisbaum des converter_raw_dir (FS-basiert, keine DB).

Response:

{\n  \"tree\": [\n    {\n      \"name\": \"filme\",\n      \"relPath\": \"filme\",\n      \"isDir\": true,\n      \"children\": [\n        {\n          \"name\": \"film.mkv\",\n          \"relPath\": \"filme/film.mkv\",\n          \"isDir\": false,\n          \"size\": 10485760\n        }\n      ]\n    }\n  ]\n}\n
"},{"location":"api/converter/#get-apiconverterbrowseparentrelpath","title":"GET /api/converter/browse?parent=relPath","text":"

DB-basierter Datei-Explorer. Gibt Eintr\u00e4ge f\u00fcr einen Unterordner zur\u00fcck.

Query-Parameter:

Parameter Typ Beschreibung parent string Relativer Pfad zum Unterordner (leer = Root)

Response:

{\n  \"entries\": [\n    {\n      \"id\": 1,\n      \"rel_path\": \"filme/film.mkv\",\n      \"is_dir\": false,\n      \"size\": 10485760,\n      \"job_id\": null\n    }\n  ],\n  \"rawDir\": \"/data/output/converter-raw\"\n}\n
"},{"location":"api/converter/#post-apiconverterscan","title":"POST /api/converter/scan","text":"

Manuellen Scan des converter_raw_dir ausl\u00f6sen. Aktualisiert converter_scan_entries in der DB.

Response:

{ \"result\": { \"added\": 3, \"removed\": 1 } }\n
"},{"location":"api/converter/#jobs-erstellen","title":"Jobs erstellen","text":""},{"location":"api/converter/#post-apiconverterjobsfrom-selection","title":"POST /api/converter/jobs/from-selection","text":"

Jobs aus im Datei-Explorer ausgew\u00e4hlten Dateien erstellen.

Body:

{\n  \"relPaths\": [\"filme/film.mkv\", \"musik/track.flac\"],\n  \"audioMode\": \"individual\"\n}\n
Feld Typ Beschreibung relPaths string[] Relative Pfade der ausgew\u00e4hlten Dateien audioMode string individual (ein Job pro Datei) oder shared (ein gemeinsamer Job)

Response:

{ \"jobs\": [{ \"id\": 42, \"status\": \"READY_TO_START\" }] }\n
"},{"location":"api/converter/#post-apiconvertercreate-jobs","title":"POST /api/converter/create-jobs","text":"

Jobs aus DB-Scan-Eintr\u00e4gen erstellen.

Body:

{\n  \"entries\": [\n    { \"relPath\": \"filme/film.mkv\", \"converterMediaType\": \"video\" }\n  ]\n}\n
"},{"location":"api/converter/#post-apiconverterupload","title":"POST /api/converter/upload","text":"

Dateien hochladen (Multipart, max. 50 Dateien).

Form-Felder:

Feld Typ Beschreibung files File[] Hochzuladende Dateien folderName string (Optional) Ziel-Unterordner

Response:

{\n  \"folders\": [{ \"folderRelPath\": \"upload-2026-03-30\", \"fileCount\": 2 }]\n}\n
"},{"location":"api/converter/#job-verwaltung","title":"Job-Verwaltung","text":""},{"location":"api/converter/#get-apiconverterjobs","title":"GET /api/converter/jobs","text":"

Alle Converter-Jobs zur\u00fcckgeben.

Response:

{ \"jobs\": [{ \"id\": 42, \"status\": \"READY_TO_START\", \"title\": \"film.mkv\" }] }\n
"},{"location":"api/converter/#get-apiconverterjobsjobid","title":"GET /api/converter/jobs/:jobId","text":"

Einzelnen Converter-Job abrufen.

"},{"location":"api/converter/#post-apiconverterjobsjobidconfig","title":"POST /api/converter/jobs/:jobId/config","text":"

Konfigurationsentwurf f\u00fcr einen Job speichern (persistiert in encode_plan_json).

Body: Partielles Konfig-Objekt (Ausgabeformat, Presets, Metadaten, Track-Auswahl).

"},{"location":"api/converter/#post-apiconverterjobsjobidassign-files","title":"POST /api/converter/jobs/:jobId/assign-files","text":"

Dateien einem bestehenden (noch nicht gestarteten) Job hinzuf\u00fcgen.

Body:

{ \"relPaths\": [\"musik/track2.flac\"] }\n
"},{"location":"api/converter/#post-apiconverterjobsjobidremove-file","title":"POST /api/converter/jobs/:jobId/remove-file","text":"

Datei aus einem Job entfernen (per relativer Pfad).

Body:

{ \"relPath\": \"musik/track2.flac\" }\n
"},{"location":"api/converter/#post-apiconverterjobsjobidremove-input","title":"POST /api/converter/jobs/:jobId/remove-input","text":"

Datei aus einem Job entfernen (per absolutem Eingabepfad).

Body:

{ \"inputPath\": \"/data/output/converter-raw/musik/track2.flac\" }\n
"},{"location":"api/converter/#post-apiconverterjobsjobidstart","title":"POST /api/converter/jobs/:jobId/start","text":"

Job mit finaler Konfiguration starten.

Body:

{\n  \"converterMediaType\": \"video\",\n  \"outputFormat\": \"mkv\",\n  \"userPreset\": \"H.264 MKV 1080p30\",\n  \"trackSelection\": {},\n  \"handBrakeTitleId\": 1,\n  \"audioFormatOptions\": {}\n}\n
"},{"location":"api/converter/#post-apiconverterjobsjobidcancel","title":"POST /api/converter/jobs/:jobId/cancel","text":"

Laufenden Job abbrechen.

"},{"location":"api/converter/#delete-apiconverterjobsjobid","title":"DELETE /api/converter/jobs/:jobId","text":"

Job aus der DB l\u00f6schen.

"},{"location":"api/converter/#datei-operationen","title":"Datei-Operationen","text":"

Alle Datei-Operationen arbeiten direkt auf dem Dateisystem (ohne DB-Aktualisierung). Ein anschlie\u00dfender Scan-Aufruf synchronisiert die DB.

"},{"location":"api/converter/#delete-apiconverterfiles","title":"DELETE /api/converter/files","text":"

Datei oder Ordner l\u00f6schen.

Body:

{ \"relPath\": \"filme/film.mkv\" }\n
"},{"location":"api/converter/#post-apiconverterfilesrename","title":"POST /api/converter/files/rename","text":"

Datei oder Ordner umbenennen.

Body:

{ \"relPath\": \"filme/film.mkv\", \"newName\": \"film-neu.mkv\" }\n
"},{"location":"api/converter/#post-apiconverterfilesmove","title":"POST /api/converter/files/move","text":"

Datei oder Ordner verschieben.

Body:

{ \"relPath\": \"filme/film.mkv\", \"targetParentRelPath\": \"archiv\" }\n

targetParentRelPath = \"\" verschiebt in das Root-Verzeichnis.

"},{"location":"api/converter/#post-apiconverterfilesfolder","title":"POST /api/converter/files/folder","text":"

Neuen Ordner anlegen.

Body:

{ \"parentRelPath\": \"filme\", \"name\": \"neu\" }\n
"},{"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/downloads/","title":"Downloads API","text":"

Endpunkte f\u00fcr die Download-Queue. Ausgabedateien aus der Job-Historie k\u00f6nnen als ZIP heruntergeladen werden.

Basis-Pfad: /api/downloads

"},{"location":"api/downloads/#get-apidownloads","title":"GET /api/downloads","text":"

Liste aller Download-Eintr\u00e4ge plus Zusammenfassung.

Response:

{\n  \"items\": [\n    {\n      \"id\": \"dl-42-raw\",\n      \"jobId\": 42,\n      \"target\": \"raw\",\n      \"status\": \"ready\",\n      \"archiveName\": \"Job_42_raw.zip\",\n      \"outputPath\": null,\n      \"createdAt\": \"2026-03-30T10:00:00.000Z\",\n      \"updatedAt\": \"2026-03-30T10:01:00.000Z\",\n      \"errorMessage\": null\n    }\n  ],\n  \"summary\": {\n    \"total\": 3,\n    \"pending\": 1,\n    \"processing\": 0,\n    \"ready\": 1,\n    \"failed\": 1\n  }\n}\n

Status-Werte:

Status Beschreibung pending In der Queue, noch nicht gestartet processing ZIP wird gerade erstellt ready ZIP fertig, Download verf\u00fcgbar failed Fehler bei der Erstellung"},{"location":"api/downloads/#get-apidownloadssummary","title":"GET /api/downloads/summary","text":"

Nur die Zusammenfassung der Download-Queue (ohne Item-Liste).

Response:

{\n  \"summary\": {\n    \"total\": 3,\n    \"pending\": 1,\n    \"processing\": 0,\n    \"ready\": 1,\n    \"failed\": 1\n  }\n}\n
"},{"location":"api/downloads/#post-apidownloadshistoryjobid","title":"POST /api/downloads/history/:jobId","text":"

Job-Ausgabe in die Download-Queue einreihen.

Parameter:

Parameter Typ Beschreibung jobId number ID des Jobs in der Historie

Body:

{\n  \"target\": \"raw\",\n  \"outputPath\": null\n}\n
Feld Typ Default Beschreibung target string raw raw (RAW-Dateien) oder movie (Ausgabedateien) outputPath string null Optionaler expliziter Ausgabepfad

Response (201 Created):

{\n  \"created\": true,\n  \"id\": \"dl-42-raw\",\n  \"status\": \"pending\",\n  \"summary\": { \"total\": 1, \"pending\": 1, \"processing\": 0, \"ready\": 0, \"failed\": 0 }\n}\n

Ist der Eintrag bereits vorhanden, wird 201 durch 200 ersetzt und created: false zur\u00fcckgegeben.

"},{"location":"api/downloads/#get-apidownloadsidfile","title":"GET /api/downloads/:id/file","text":"

Fertige ZIP-Datei herunterladen.

Parameter:

Parameter Typ Beschreibung id string Download-ID (z. B. dl-42-raw)

Response: Datei-Download (Content-Disposition: attachment).

Schl\u00e4gt fehl mit 404, wenn kein Download-Eintrag mit dieser ID existiert oder die Datei noch nicht bereit ist.

"},{"location":"api/downloads/#delete-apidownloadsid","title":"DELETE /api/downloads/:id","text":"

Download-Eintrag l\u00f6schen (auch fertige ZIP-Dateien werden vom Dateisystem entfernt).

Response:

{\n  \"ok\": true,\n  \"summary\": { \"total\": 2, \"pending\": 0, \"processing\": 0, \"ready\": 2, \"failed\": 0 }\n}\n
"},{"location":"api/downloads/#websocket","title":"WebSocket","text":"

Status\u00e4nderungen werden \u00fcber DOWNLOADS_UPDATED in Echtzeit gemeldet. Vollst\u00e4ndige Dokumentation: WebSocket Events.

"},{"location":"api/history/","title":"History API","text":"

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

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

Liefert Jobs mit optionalen Filtern.

Query-Parameter:

Parameter Typ Beschreibung status string Einzelstatus-Filter (legacy-kompatibel). statuses string Mehrfachstatus als CSV, z. B. FINISHED,ERROR. search string Suche in Titel-/IMDb-Feldern. limit number Maximale Anzahl Ergebnisse. lite bool Ohne Dateisystem-Checks (schneller). includeChildren bool Child-Jobs (z. B. Serien-/Multipart-Kinder) explizit einbeziehen.

Beispiel:

GET /api/history?statuses=FINISHED,ERROR&search=Inception&limit=50&lite=1\n

Response (Beispiel):

{\n  \"jobs\": [\n    {\n      \"id\": 42,\n      \"status\": \"FINISHED\",\n      \"title\": \"Inception\",\n      \"job_kind\": \"bluray\",\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 Live-/Tail-Log laden. includeAllLogs bool false vollst\u00e4ndiges Log statt Tail. logTailLines number 800 Tail-L\u00e4nge falls nicht includeAllLogs. lite bool false Detailantwort ohne FS-Checks.

Response (Beispiel):

{\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-apihistoryorphan-raw","title":"GET /api/history/orphan-raw","text":"

Sucht RAW-Ordner ohne zugeh\u00f6rigen Job.

"},{"location":"api/history/#post-apihistoryorphan-rawimport","title":"POST /api/history/orphan-raw/import","text":"

Importiert einen RAW-Ordner als Job und triggert optional die Analyse des Imports.

Request:

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

Response (Beispiel):

{\n  \"job\": { \"id\": 77, \"status\": \"FINISHED\" },\n  \"activation\": { \"started\": true },\n  \"activationError\": null\n}\n
"},{"location":"api/history/#post-apihistoryidomdbassign","title":"POST /api/history/:id/omdb/assign","text":"

Weist OMDb-/Filmdaten nachtr\u00e4glich zu.

"},{"location":"api/history/#post-apihistoryidcdassign","title":"POST /api/history/:id/cd/assign","text":"

Weist CD-Metadaten (z. B. MusicBrainz) nachtr\u00e4glich zu.

"},{"location":"api/history/#post-apihistoryiderrorack","title":"POST /api/history/:id/error/ack","text":"

Quittiert einen Fehlerzustand im Historieneintrag.

"},{"location":"api/history/#get-apihistoryiddelete-preview","title":"GET /api/history/:id/delete-preview","text":"

Liefert eine Vorschau der l\u00f6schbaren Pfade (inkl. Scope auf verkn\u00fcpfte Jobs).

Query-Parameter:

Parameter Typ Standard Beschreibung includeRelated bool true Verkn\u00fcpfte Jobs in die Vorschau einbeziehen.

Response (Beispiel):

{\n  \"preview\": {\n    \"jobId\": 42,\n    \"relatedJobs\": [{ \"id\": 42 }, { \"id\": 73 }],\n    \"pathCandidates\": {\n      \"raw\": [{ \"path\": \"/mnt/raw/...\", \"exists\": true, \"isDirectory\": true }],\n      \"movie\": [{ \"path\": \"/mnt/movies/...\", \"exists\": true, \"isDirectory\": true }]\n    }\n  }\n}\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:

{\n  \"target\": \"both\",\n  \"includeRelated\": true,\n  \"selectedRawPaths\": [\"/mnt/raw/Inception - RAW - Disc1\"],\n  \"selectedMoviePaths\": [\"/mnt/movies/Inception (2010)\"]\n}\n

target: raw | movie | both

selectedRawPaths / selectedMoviePaths sind optional und begrenzen die L\u00f6schung auf ausgew\u00e4hlte Pfade aus der Vorschau.

"},{"location":"api/history/#post-apihistoryiddelete","title":"POST /api/history/:id/delete","text":"

L\u00f6scht Job aus DB; optional auch Dateien.

Request:

{\n  \"target\": \"both\",\n  \"includeRelated\": true,\n  \"resetDriveState\": false,\n  \"keepDetectedDevice\": true,\n  \"preserveRawForImportJobs\": false,\n  \"selectedRawPaths\": [\"/mnt/raw/Inception - RAW - Disc1\"],\n  \"selectedMoviePaths\": [\"/mnt/movies/Inception (2010)\"]\n}\n

target: none | raw | movie | both

Response (Beispiel):

{\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  \"safeguards\": {\n    \"containsOrphanRawImportJob\": false,\n    \"resetDriveStateApplied\": false,\n    \"keepDetectedDeviceApplied\": true\n  }\n}\n
"},{"location":"api/history/#hinweise","title":"Hinweise","text":"
  • Ein aktiver Pipeline-Job kann nicht gel\u00f6scht werden (409).
  • L\u00f6schoperationen sind irreversibel.
  • Bei Serien-/Multipart-Containern steuern includeRelated und Pfadselektionen den genauen Scope.
"},{"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/#post-apipipelinerescan-drive","title":"POST /api/pipeline/rescan-drive","text":"

Erzwingt Rescan f\u00fcr ein konkretes Laufwerk.

Request:

{ \"devicePath\": \"/dev/sr0\" }\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/#get-apipipelinetmdbseriessearchqseason","title":"GET /api/pipeline/tmdb/series/search?q=&season=

TMDb-Seriensuche (f\u00fcr Serien-Workflow bei DVD/Blu-ray).

","text":""},{"location":"api/pipeline/#get-apipipelinecddrives","title":"GET /api/pipeline/cd/drives

Liefert Snapshot der aktuell bekannten CD-Laufwerke.

","text":""},{"location":"api/pipeline/#get-apipipelinecdmusicbrainzsearchq","title":"GET /api/pipeline/cd/musicbrainz/search?q=

MusicBrainz-Suche f\u00fcr CD-Metadaten.

","text":""},{"location":"api/pipeline/#get-apipipelinecdmusicbrainzreleasembid","title":"GET /api/pipeline/cd/musicbrainz/release/:mbId

L\u00e4dt Release-Details zu einer MusicBrainz-ID.

","text":""},{"location":"api/pipeline/#post-apipipelinecdselect-metadata","title":"POST /api/pipeline/cd/select-metadata

\u00dcbernimmt CD-Metadaten f\u00fcr einen Job.

Request (Beispiel):

{\n  \"jobId\": 91,\n  \"title\": \"Album\",\n  \"artist\": \"Artist\",\n  \"year\": 2020,\n  \"mbId\": \"f5093c06-23e3-404f-aeaa-40f72885ee3a\",\n  \"coverUrl\": \"https://...\",\n  \"tracks\": []\n}\n
","text":""},{"location":"api/pipeline/#post-apipipelinecdstartjobid","title":"POST /api/pipeline/cd/start/:jobId

Startet/queued CD-Rip mit Format-/Script-/Chain-Konfiguration.

","text":""},{"location":"api/pipeline/#post-apipipelineaudiobookupload","title":"POST /api/pipeline/audiobook/upload

Upload von AAX-Datei (Multipart/FormData).

FormData-Felder:

  • file (Pflicht)
  • format (optional)
  • startImmediately (optional)
","text":""},{"location":"api/pipeline/#get-apipipelineaudiobookpending-activation","title":"GET /api/pipeline/audiobook/pending-activation

Zeigt AAX-Jobs mit fehlenden Activation-Bytes.

","text":""},{"location":"api/pipeline/#post-apipipelineaudiobookstartjobid","title":"POST /api/pipeline/audiobook/start/:jobId

Startet Audiobook-Job mit optionaler Konfiguration.

","text":""},{"location":"api/pipeline/#get-apipipelineaudiobookjobs","title":"GET /api/pipeline/audiobook/jobs

Liefert Audiobook-Jobliste.

","text":""},{"location":"api/pipeline/#get-apipipelineaudiobookoutput-tree","title":"GET /api/pipeline/audiobook/output-tree

Read-only Baumansicht des Audiobook-Ausgabeordners.

","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

Wichtige optionale Felder:

  • selectedHandBrakeTitleId / selectedHandBrakeTitleIds: Titel-Auswahl f\u00fcr Review/MediaInfo.
  • metadataProvider: omdb oder tmdb.
  • workflowKind: bei Disc-Jobs typischerweise film oder series.
  • discNumber: Pflicht f\u00fcr Serien-Disc-Zuordnung (workflowKind=series).
  • duplicateAction: Duplikatverhalten bei Film-Metadaten (allow_new oder multipart_movie).
  • existingJobId: optionaler Referenzjob f\u00fcr multipart_movie.
  • existingDiscNumber: Disc-Nummer des bestehenden Jobs f\u00fcr multipart_movie.

Response:

{ \"job\": { \"id\": 42, \"status\": \"READY_TO_START\" } }\n

Konflikt-Response (Beispiel, HTTP 409):

{\n  \"message\": \"Metadaten bereits in der Historie gefunden. Bitte Auswahl \u00fcbernehmen oder Multipart movie w\u00e4hlen.\",\n  \"details\": [\n    {\n      \"code\": \"METADATA_DUPLICATE_FOUND\",\n      \"mediaProfile\": \"bluray\",\n      \"existingJob\": {\n        \"id\": 17,\n        \"title\": \"Inception\",\n        \"year\": 2010,\n        \"status\": \"FINISHED\",\n        \"jobKind\": \"bluray\",\n        \"discNumber\": 1,\n        \"isMultipartMovie\": false\n      }\n    }\n  ]\n}\n

Relevante Fehlercodes (POST /api/pipeline/select-metadata):

Code Bedeutung METADATA_DUPLICATE_FOUND Film-Metadaten existieren bereits in der Historie (Konfliktdialog im UI). MULTIPART_DISC_REQUIRED F\u00fcr Multipart fehlen Disc-Nummern (discNumber/existingDiscNumber). MULTIPART_DISC_ALREADY_EXISTS Disc-Nummer im Multipart-Container bereits vergeben oder doppelt. MULTIPART_MEDIA_MISMATCH Multipart nur bei gleichem Medientyp (DVD oder Blu-ray). MULTIPART_SERIES_NOT_ALLOWED Multipart ist nur f\u00fcr Film-Jobs erlaubt, nicht f\u00fcr Serien-Workflow. MULTIPART_METADATA_MISMATCH Ausgew\u00e4hlter bestehender Job passt nicht zu den Film-Metadaten. SERIES_DISC_ALREADY_EXISTS Serien-Disc-Nummer innerhalb einer Staffel bereits vorhanden.","text":""},{"location":"api/pipeline/#post-apipipelinejobsjobidraw-decision","title":"POST /api/pipeline/jobs/:jobId/raw-decision

Trifft Entscheidung bei vorhandenem RAW (continue oder restart je nach Dialogfluss).

Request:

{ \"decision\": \"continue\" }\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-apipipelinerestart-cd-reviewjobid","title":"POST /api/pipeline/restart-cd-review/:jobId

Berechnet CD-Review aus vorhandenem RAW 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.

","text":""},{"location":"api/pipeline/#get-apipipelineoutput-foldersjobid","title":"GET /api/pipeline/output-folders/:jobId

Liefert bekannte Output-Ordner entlang der Job-Lineage.

","text":""},{"location":"api/pipeline/#post-apipipelinedelete-output-foldersjobid","title":"POST /api/pipeline/delete-output-folders/:jobId

L\u00f6scht ausgew\u00e4hlte Output-Ordner.

Request:

{ \"folderPaths\": [\"/mnt/movies/Inception (2010)\"] }\n

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 Nutzerentscheidung erforderlich (Playlist-Auswahl oder RAW-Entscheidung) 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 CD_METADATA_SELECTION CD-Metadatenauswahl aktiv CD_READY_TO_RIP CD-Job ist startbereit CD_ANALYZING CD-Struktur/Tracks werden vorbereitet CD_RIPPING CD-Ripping l\u00e4uft CD_ENCODING CD-Encode l\u00e4uft FINISHED Abgeschlossen DONE Abgeschlossen (v. a. Audiobook/Converter/CD-Varianten) 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-apiruntimeactivities","title":"GET /api/runtime/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-apiruntimeactivitiesidcancel","title":"POST /api/runtime/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-apiruntimeactivitiesidnext-step","title":"POST /api/runtime/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-apiruntimeactivitiesclear-recent","title":"POST /api/runtime/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/runtime/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/settings/#weitere-endpunkte","title":"Weitere Endpunkte","text":""},{"location":"api/settings/#get-apisettingseffective-paths","title":"GET /api/settings/effective-paths","text":"

Liefert aufgel\u00f6ste, effektiv genutzte Pfade aus den Settings (f\u00fcr UI- und Diagnosezwecke).

"},{"location":"api/settings/#post-apisettingscoverartrecover","title":"POST /api/settings/coverart/recover","text":"

Startet eine manuelle Coverart-Recovery.

Response (Beispiel):

{\n  \"result\": { \"started\": true },\n  \"scheduler\": { \"enabled\": true }\n}\n
"},{"location":"api/settings/#activation-bytes-aax","title":"Activation Bytes (AAX)","text":""},{"location":"api/settings/#get-apisettingsactivation-bytes","title":"GET /api/settings/activation-bytes","text":"

Liest gecachte AAX-Activation-Bytes.

"},{"location":"api/settings/#post-apisettingsactivation-bytes","title":"POST /api/settings/activation-bytes","text":"

Speichert Activation-Bytes.

Request:

{\n  \"checksum\": \"abc123...\",\n  \"activationBytes\": \"1a2b3c4d\"\n}\n
"},{"location":"api/settings/#laufwerke","title":"Laufwerke","text":""},{"location":"api/settings/#get-apisettingsdrives","title":"GET /api/settings/drives","text":"

Liefert erkannte optische Laufwerke (/dev/...) inkl. MakeMKV-Disc-Index.

"},{"location":"api/settings/#post-apisettingsdrivesforce-unlock","title":"POST /api/settings/drives/force-unlock","text":"

Erzwingt Entsperren aktiver Laufwerkslocks.

Hinweis: Expertenmodus (ui_expert_mode) ist erforderlich, sonst 403.

Request (ein Laufwerk):

{ \"devicePath\": \"/dev/sr0\" }\n

Request (alle):

{ \"all\": true }\n
"},{"location":"api/settings/#ui-preferences","title":"UI Preferences","text":""},{"location":"api/settings/#get-apisettingsprefskey","title":"GET /api/settings/prefs/:key","text":"

Liest einen persistierten UI-Preference-Wert.

"},{"location":"api/settings/#put-apisettingsprefskey","title":"PUT /api/settings/prefs/:key","text":"

Speichert einen persistierten UI-Preference-Wert.

Request:

{ \"value\": \"{\\\"columns\\\":[\\\"id\\\",\\\"status\\\"]}\" }\n
"},{"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/#converter_scan_update","title":"CONVERTER_SCAN_UPDATE","text":"

Wird nach einem Scan des Converter-Eingangsordners gesendet (manuell oder per Polling).

{\n  \"type\": \"CONVERTER_SCAN_UPDATE\",\n  \"payload\": {\n    \"entryCount\": 12\n  }\n}\n
"},{"location":"api/websocket/#downloads_updated","title":"DOWNLOADS_UPDATED","text":"

Wird bei jeder Status\u00e4nderung in der Download-Queue gesendet.

{\n  \"type\": \"DOWNLOADS_UPDATED\",\n  \"payload\": {\n    \"reason\": \"ready\",\n    \"item\": {\n      \"id\": \"dl-1\",\n      \"jobId\": 42,\n      \"status\": \"ready\",\n      \"archiveName\": \"Job_42_movie.zip\",\n      \"createdAt\": \"2026-03-30T10:00:00.000Z\"\n    },\n    \"summary\": {\n      \"total\": 3,\n      \"pending\": 1,\n      \"processing\": 0,\n      \"ready\": 1,\n      \"failed\": 1\n    }\n  }\n}\n

M\u00f6gliche reason-Werte: queued, processing, ready, failed, deleted.

"},{"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        Ripper[Ripper]\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. Seit v0.12.0 erfolgt die Medienverarbeitung \u00fcber ein Plugin-System.

"},{"location":"architecture/backend/#plugin-system-srcplugins","title":"Plugin-System (src/plugins/)","text":"

Ab v0.12.0 ist die Pipeline modular aufgebaut. Jeder Medientyp wird von einem eigenen Plugin verwaltet.

"},{"location":"architecture/backend/#basisklassen","title":"Basisklassen","text":"
  • PluginBase.js \u2014 Abstrakte Basisklasse SourcePlugin mit Lifecycle-Methoden
  • PluginRegistry.js \u2014 Dynamische Plugin-Erkennung, priorit\u00e4tsbasierte Auswahl, Settings-Schema-Aggregation
  • PluginContext.js \u2014 Ausf\u00fchrungskontext (Logger, Callbacks, Signals) f\u00fcr Plugin-Aufrufe
"},{"location":"architecture/backend/#plugin-lifecycle","title":"Plugin-Lifecycle","text":"

Jedes Plugin implementiert die folgenden Methoden:

Methode Beschreibung detect(discInfo) Medientyp-Erkennung analyze(devicePath, job, ctx) Analyse / Metadaten-Extraktion rip(job, ctx) Rohdaten-Extraktion review(job, ctx) Optionale Vorschau-Vorbereitung encode(job, ctx) Finales Encoding/Konvertierung finalize(job, ctx) Nachbearbeitung onCancel(job, ctx) Bereinigung bei Abbruch onRetry(job, ctx) Zustand-Reset vor Retry"},{"location":"architecture/backend/#implementierte-plugins","title":"Implementierte Plugins","text":"
  • BluRayPlugin.js \u2014 Blu-ray via MakeMKV (Backup-Modus)
  • DVDPlugin.js \u2014 DVD via MakeMKV (MKV-Modus)
  • CdPlugin.js \u2014 Audio-CD via cdparanoia + FFmpeg (experimentell)
  • AudiobookPlugin.js \u2014 AAX/M4B via FFmpeg mit Kapitel-Splitting
  • ConverterPlugin.js \u2014 Generische Audio/Video-Konvertierung via FFmpeg
  • VideoDiscPlugin.js \u2014 Gemeinsame Basis f\u00fcr Blu-ray/DVD (MediaInfo-Parsing)
"},{"location":"architecture/backend/#pipelineservicejs","title":"pipelineService.js","text":"

Zentrale Workflow-Orchestrierung.

Aufgaben:

  • Pipeline-State-Machine + Persistenz (pipeline_state)
  • Disc-Analyse/Rip/Review/Encode via Plugin-Delegation
  • Queue-Management (Jobs + script|chain|wait Eintr\u00e4ge)
  • Retry/Re-Encode/Restart-Flows
  • WebSocket-Broadcasts f\u00fcr State/Progress/Queue
  • Converter-Job-Verwaltung (createConverterJobFromEntry, uploadConverterFiles, startConverterJob)

Wichtige Methoden:

  • analyzeDisc()
  • selectMetadata()
  • startPreparedJob()
  • confirmEncodeReview()
  • cancel()
  • retry()
  • reencodeFromRaw()
  • restartReviewFromRaw()
  • restartEncodeWithLastSettings()
  • resumeReadyToEncodeJob()
  • enqueueNonJobEntry(), reorderQueue(), removeQueueEntry()
  • createConverterJobFromEntry(), createConverterJobsFromSelection()
  • uploadConverterFiles(), startConverterJob()
"},{"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/FFmpeg
  • HandBrake-Preset-Liste via HandBrakeCLI -z
  • MakeMKV-Registration-Command aus makemkv_registration_key
  • Pfadaufl\u00f6sung f\u00fcr alle Medienprofile inkl. Audiobook und Converter
"},{"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/#audiobookservicejs","title":"audiobookService.js","text":"

Audiobook-Verarbeitung (AAX/M4B).

Features:

  • FFprobe-basierte Analyse (Kapitel, Metadaten)
  • FFmpeg-basiertes Encoding mit Kapitel-Splitting
  • Ausgabeformate: M4B, MP3, FLAC
  • Template-basierte Pfade ({author}, {title}, {year}, {narrator}, {series}, {part})
"},{"location":"architecture/backend/#activationbytesservicejs","title":"activationBytesService.js","text":"

Verwaltung von Audible-Activation-Bytes f\u00fcr AAX-DRM-Handling.

Features:

  • SHA-1-Pr\u00fcfsumme der AAX-Datei berechnen
  • Activation Bytes in aax_activation_bytes-Tabelle cachen
  • Lookup via audnexService (wenn konfiguriert)
"},{"location":"architecture/backend/#converterscanservicejs","title":"converterScanService.js","text":"

Dateisystem-\u00dcberwachung des Converter-Eingangsordners.

Features:

  • Vollst\u00e4ndiger FS-Baum (getTree())
  • DB-basierter Datei-Explorer (getEntries())
  • Manueller und automatischer Scan (Polling)
  • Pfad-Normalisierung mit Traversal-Schutz
  • WebSocket-Broadcast: CONVERTER_SCAN_UPDATE
"},{"location":"architecture/backend/#downloadservicejs","title":"downloadService.js","text":"

Download-Queue f\u00fcr Ausgabedateien aus der Historie.

Features:

  • Job in Download-Queue einreihen (enqueueHistoryJob)
  • ZIP-Archiv aus Ausgabedateien erstellen (archiver)
  • Datei-Streaming via res.download()
  • WebSocket-Broadcast: DOWNLOADS_UPDATED bei Status-\u00c4nderungen
  • Download-Item l\u00f6schen
"},{"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)
  • cdRipService.js (CD-Ripping mit cdparanoia)
  • musicBrainzService.js (MusicBrainz-Metadaten-Lookup)
  • audnexService.js (Audnex-API f\u00fcr Audiobook-Metadaten)
  • coverArtRecoveryService.js (Cover-Art-Wiederherstellung)
  • thumbnailService.js (Vorschaubild-Generierung)
  • omdbService.js (OMDb-Metadaten-Suche)
  • 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 (inkl. Plugin-Registry)
  3. Cron-Init
  4. Express-Routes + Error-Handler
  5. WebSocket-Server auf /ws
  6. Hardware-Monitoring-Init
  7. Disk-Detection-Start
  8. Converter-Scan-Service-Init (Polling falls aktiviert)
"},{"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\njob_lineage_artifacts\njob_output_folders\npipeline_state\nscripts\nscript_chains\nscript_chain_steps\nuser_presets\ncron_jobs\ncron_run_logs\naax_activation_bytes\nuser_prefs\nconverter_scan_entries\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
  • Medientyp: media_type (bluray|dvd|cd|audiobook|converter)
  • Job-Typ/Beziehung: job_kind, parent_job_id
  • Multipart-/Disc-Merkmale: is_multipart_movie, disc_number, metadata_fingerprint
  • Pr\u00fcfsumme: aax_checksum (f\u00fcr AAX-Dateien)
  • Audit: created_at, updated_at

Typische job_kind-Werte:

  • Standard: bluray, dvd, cd, audiobook, converter_audio, converter_video, converter_iso
  • Serien: dvd_series_container, dvd_series_child
  • Multipart Film: multipart_movie_container, multipart_movie_child

Wichtige Indizes:

  • idx_jobs_status
  • idx_jobs_parent_job_id
  • idx_jobs_job_kind
  • idx_jobs_disc_number
  • idx_jobs_metadata_fingerprint
"},{"location":"architecture/database/#job_lineage_artifacts","title":"job_lineage_artifacts","text":"

Verkn\u00fcpft Jobs mit ihren Quell-Jobs (z. B. Re-Encode aus einem vorherigen Rip).

Felder:

  • job_id \u2014 der abgeleitete Job
  • source_job_id \u2014 der Quell-Job
  • artifact_type \u2014 Art der Verkn\u00fcpfung (z. B. reencode, restart_review)
  • created_at
"},{"location":"architecture/database/#job_output_folders","title":"job_output_folders","text":"

Verfolgt Ausgabepfade pro Job (mehrere Ausgaben m\u00f6glich, z. B. bei Kapitel-Splitting).

Felder:

  • job_id
  • folder_path
  • label \u2014 optionaler Bezeichner
  • created_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/#aax_activation_bytes","title":"aax_activation_bytes","text":"

Cache f\u00fcr Audible-Activation-Bytes (AAX-DRM).

Felder:

  • checksum \u2014 SHA-1-Pr\u00fcfsumme der AAX-Datei (Prim\u00e4rschl\u00fcssel)
  • activation_bytes \u2014 Hex-String der Activation Bytes
  • created_at
"},{"location":"architecture/database/#user_prefs","title":"user_prefs","text":"

Benutzer-spezifische Einstellungen (Key-Value).

Felder:

  • key
  • value
  • updated_at
"},{"location":"architecture/database/#converter_scan_entries","title":"converter_scan_entries","text":"

DB-seitige Erfassung gescannter Dateien im Converter-Eingangsordner.

Felder:

  • rel_path \u2014 relativer Pfad zum converter_raw_dir
  • is_dir \u2014 Verzeichnis-Flag
  • size \u2014 Dateigr\u00f6\u00dfe in Bytes
  • modified_at \u2014 Datei-\u00c4nderungsdatum
  • job_id \u2014 zugewiesener Converter-Job (falls vorhanden)
  • scanned_at
"},{"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, media_type, created_at FROM jobs ORDER BY created_at DESC;\nSELECT id, parent_job_id, job_kind, is_multipart_movie, disc_number FROM jobs ORDER BY created_at DESC;\nSELECT key, value FROM settings_values ORDER BY key;\nSELECT checksum, activation_bytes FROM aax_activation_bytes;\nSELECT rel_path, job_id FROM converter_scan_entries;\n
"},{"location":"architecture/frontend/","title":"Frontend-Komponenten","text":"

Frontend: React + PrimeReact + Vite.

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

Zentrale Job-Inbox:

  • einheitliche Liste \u00fcber Ripper-, Converter- und Audiobook-Jobs
  • View-/Status-Filter, Suche, Paginierung
  • Schnellsprung in passende Detailseite (Ripper/Converter)
"},{"location":"architecture/frontend/#ripperpagejsx","title":"RipperPage.jsx","text":"

Pipeline-Steuerung:

  • Status/Progress/ETA
  • Metadaten-Dialog
  • Playlist-Entscheidung
  • Review-Panel (Track-Auswahl)
  • Queue-Interaktion (reorder/add/remove)
  • Job-Aktionen (Start/Cancel/Retry/Re-Encode)
  • Hardware-Monitoring-Anzeige
  • Aktivit\u00e4ts-Tracking (Skripte, Ketten, Cron)
"},{"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/#converterpagejsx","title":"ConverterPage.jsx","text":"

Datei-Converter:

  • Datei-Explorer des Converter-Eingangsordners (Baum-Ansicht)
  • Upload von Audio/Video-Dateien (bis zu 50 Dateien gleichzeitig)
  • Dateiverwaltung: Umbenennen, Verschieben, L\u00f6schen, Ordner erstellen
  • Jobs aus Dateiauswahl erstellen
  • Converter-Job-Konfiguration (Ausgabeformat, Preset, Tracks)
  • Job-Start, Abbruch, L\u00f6schung
  • Automatischer Scan-Status
"},{"location":"architecture/frontend/#audiobookspagejsx","title":"AudiobooksPage.jsx","text":"

Dedizierter AAX-/Audiobook-Flow:

  • Upload-Panel f\u00fcr AAX-Dateien
  • aktive Audiobook-Jobkarten mit Start/Cancel/Retry/Delete
  • Audiobook-Konfigurationspanel und Output-Explorer
"},{"location":"architecture/frontend/#downloadspagejsx","title":"DownloadsPage.jsx","text":"

Download-Queue:

  • Ausgabedateien aus der Job-Historie in die Queue einreihen
  • Download-Status verfolgen (ausstehend, wird verarbeitet, bereit, fehlgeschlagen)
  • Dateien als ZIP herunterladen
  • Download-Eintr\u00e4ge l\u00f6schen
"},{"location":"architecture/frontend/#databasepagejsx","title":"DatabasePage.jsx","text":"

Expert-Modus:

  • Tabellarische Rohsicht der Job-Datenbank
  • Orphan-RAW-Import
"},{"location":"architecture/frontend/#wichtige-komponenten","title":"Wichtige Komponenten","text":"
  • PipelineStatusCard.jsx \u2014 Pipeline-Status-Anzeige mit Progress
  • MetadataSelectionDialog.jsx \u2014 OMDb-Metadaten-Auswahl
  • MediaInfoReviewPanel.jsx \u2014 Track-Auswahl-Interface (Video/Audio/Untertitel)
  • JobDetailDialog.jsx \u2014 Job-Detailansicht mit Logs
  • CronJobsTab.jsx \u2014 Cron-Job-Verwaltung
  • DynamicSettingsForm.jsx \u2014 Schema-gesteuertes Einstellungsformular
  • ConverterJobCard.jsx \u2014 Converter-Job-Darstellung
  • CdRipConfigPanel.jsx \u2014 Konfiguration f\u00fcr Audio-CD-Ripping
"},{"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
  • Disk erkannt / Disk entfernt
  • HARDWARE_MONITOR_UPDATE
  • DOWNLOADS_UPDATED
  • CONVERTER_SCAN_UPDATE
  • RUNTIME_ACTIVITY_CHANGED
"},{"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
  • Disk erkannt, Disk entfernt
  • 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 (Fehler oder Abgebrochen) 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":"

Diese Seite dokumentiert alle UI-Settings mit ihrer Wirkung auf Flows, Pfade, Queue und Automatisierung.

"},{"location":"configuration/settings-reference/#wie-ripster-settings-auflost","title":"Wie Ripster Settings aufl\u00f6st","text":"

Ripster arbeitet intern mit profilspezifischen Settings (bluray, dvd, cd, audiobook) und bildet sie auf effektive Laufzeitwerte ab.

Wichtige Regeln:

  1. F\u00fcr bluray wird bei fehlenden profilierten Toolwerten auf dvd zur\u00fcckgefallen, und umgekehrt.
  2. F\u00fcr cd und audiobook gibt es nur das eigene Profil.
  3. Strikt profilgebundene Pfadkeys (raw_dir, movie_dir, series_dir plus Owner) fallen bei leeren Werten auf Installationsdefaults zur\u00fcck.

Installationsdefaults:

  • RAW: data/output/raw
  • Movies: data/output/movies
  • Series: data/output/series
  • CD: data/output/cd
  • Audiobook RAW: data/output/audiobook-raw
  • Audiobook Output: data/output/audiobooks
  • Converter RAW: data/output/converter-raw
  • Converter Video: data/output/converted-movies
  • Converter Audio: data/output/converted-audio
"},{"location":"configuration/settings-reference/#kritische-wirkungsbereiche","title":"Kritische Wirkungsbereiche","text":""},{"location":"configuration/settings-reference/#1-pfad-und-template-einstellungen","title":"1) Pfad- und Template-Einstellungen","text":"

Diese Settings bestimmen direkt:

  • wo RAW landet
  • wo finale Ausgaben landen
  • wie Ordner/Dateinamen gerendert werden

Relevante Besonderheiten:

  • Serien-RAW nutzt bei Serienworkflow bevorzugt raw_dir_*_series.
  • Serien-Ausgabe nutzt series_dir_* und Serien-Templates (Episode/Multi-Episode).
  • Film-Ausgabe nutzt movie_dir_* und Film-Template.
  • Encode schreibt zun\u00e4chst in Incomplete_job-<id> und finalisiert danach in den Zielpfad.
"},{"location":"configuration/settings-reference/#2-queue-und-parallelitats-settings","title":"2) Queue- und Parallelit\u00e4ts-Settings","text":"

Die vier Limits greifen kombiniert:

  • pipeline_max_parallel_jobs (Film/Video-Lane)
  • pipeline_max_parallel_cd_encodes (Audio/CD-Lane)
  • pipeline_max_total_encodes (globaler Deckel)
  • pipeline_cd_bypasses_queue (Audio-Lane darf Filmwarteschlange umgehen)

Effekt:

  • Film und Audio haben getrennte Lane-Limits.
  • Das Gesamtlimit \u00fcberstimmt beide, sobald erreicht.
  • Queue kann zus\u00e4tzlich Nicht-Job-Eintr\u00e4ge (Skript, Kette, Warten) enthalten.
"},{"location":"configuration/settings-reference/#3-serien-metadaten-settings","title":"3) Serien-Metadaten-Settings","text":"

Diese steuern die Serienqualit\u00e4t direkt:

  • TMDb-Token aktiviert TMDb-gest\u00fctzte Serienmetadaten.
  • Sprache/Fallback-Sprachen beeinflussen Titel- und Episodenaufl\u00f6sung.
  • Ordnungspr\u00e4ferenz steuert Episode-Order.
  • Disc-Profile-Reuse verbessert automatische Zuordnung \u00fcber mehrere Discs.
"},{"location":"configuration/settings-reference/#4-tool-settings","title":"4) Tool-Settings","text":"

Toolfelder (makemkv_*, mediainfo_*, handbrake_*, ffmpeg_*, ffprobe_*, cdparanoia_*) wirken unmittelbar auf die tats\u00e4chlich ausgef\u00fchrten CLI-Aufrufe.

Typische Auswirkungen:

  • falscher Toolpfad => fr\u00fcher Pipelinefehler
  • ge\u00e4nderte Extra-Args => anderes Analyze-/Encode-Verhalten
  • ge\u00e4nderte Presets => andere HandBrake-Ausgaben
"},{"location":"configuration/settings-reference/#template-platzhalter","title":"Template-Platzhalter","text":""},{"location":"configuration/settings-reference/#film-templates","title":"Film-Templates","text":"
  • ${title}, ${year}, ${imdbId}
"},{"location":"configuration/settings-reference/#serien-templates","title":"Serien-Templates","text":"
  • {seriesTitle}, {seasonNr}, {episodeNr}, {episodeNoStart}, {episodeNoEnd}
  • {episodeRange}, {episodeTitle}, {parts}, {discNr}, {year}, {language}
  • f\u00fchrende Null m\u00f6glich mit {0:seasonNr} etc.
"},{"location":"configuration/settings-reference/#audiobook-templates","title":"Audiobook-Templates","text":"
  • {author}, {title}, {year}, {narrator}, {series}, {part}, {format}
"},{"location":"configuration/settings-reference/#converter-templates","title":"Converter-Templates","text":"
  • Video: {title}, {year}
  • Audio: {artist}, {title}, {album}, {year}, {trackNr}
"},{"location":"configuration/settings-reference/#vollstandige-feldliste","title":"Vollst\u00e4ndige Feldliste","text":""},{"location":"configuration/settings-reference/#kategorie-benachrichtigungen","title":"Kategorie: Benachrichtigungen","text":"GUI-Feld Key Typ Default Wirkung im System Expertenmodus ui_expert_mode boolean false Schaltet erweiterte Einstellungen in der UI ein. PushOver aktiviert pushover_enabled boolean false Master-Schalter f\u00fcr PushOver Versand. PushOver Token pushover_token string leer Application Token f\u00fcr PushOver. PushOver User pushover_user string leer User-Key f\u00fcr PushOver. PushOver Device (optional) pushover_device string leer Optionales Ziel-Device in PushOver. PushOver Titel-Pr\u00e4fix pushover_title_prefix string Ripster Prefix im PushOver Titel. PushOver Priority pushover_priority number 0 Priorit\u00e4t -2 bis 2. PushOver Timeout (ms) pushover_timeout_ms number 7000 HTTP Timeout f\u00fcr PushOver Requests. Bei Metadaten-Auswahl senden pushover_notify_metadata_ready boolean true Sendet wenn Metadaten zur Auswahl bereitstehen. Bei Rip-Start senden pushover_notify_rip_started boolean true Sendet beim Start des MakeMKV-Rips. Bei Encode-Start senden pushover_notify_encoding_started boolean true Sendet beim Start von HandBrake. Bei Erfolg senden pushover_notify_job_finished boolean true Sendet bei erfolgreich abgeschlossenem Job. Bei Fehler senden pushover_notify_job_error boolean true Sendet bei Fehlern in der Pipeline. Bei Abbruch senden pushover_notify_job_cancelled boolean true Sendet wenn Job manuell abgebrochen wurde. Bei Re-Encode Start senden pushover_notify_reencode_started boolean true Sendet beim Start von RAW Re-Encode. Bei Re-Encode Erfolg senden pushover_notify_reencode_finished boolean true Sendet bei erfolgreichem RAW Re-Encode."},{"location":"configuration/settings-reference/#kategorie-converter","title":"Kategorie: Converter","text":"GUI-Feld Key Typ Default Wirkung im System Erlaubte Datei-Endungen* converter_scan_extensions string mkv,mp4,m2ts,iso,avi,mov,flac,mp3,wav,m4a,ogg,opus Erlaubte Datei-Endungen f\u00fcr den Converter-Scan (ohne Punkt). Wird in der UI als Checkbox-Liste gepflegt. Auto-Scan (Polling) converter_polling_enabled boolean false Converter Raw-Ordner automatisch in regelm\u00e4\u00dfigen Abst\u00e4nden scannen. Polling-Intervall (Sekunden) converter_polling_interval number 300 Intervall f\u00fcr automatischen Scan des Converter-Ordners."},{"location":"configuration/settings-reference/#kategorie-laufwerk","title":"Kategorie: Laufwerk","text":"GUI-Feld Key Typ Default Wirkung im System Laufwerksmodus drive_mode select auto Auto-Discovery oder explizites Device. Device Pfad drive_device path /dev/sr0 Nur f\u00fcr expliziten Modus, z.B. /dev/sr0. MakeMKV Source Index makemkv_source_index number 0 Disc Index im Auto-Modus. Automatische Disk-Erkennung disc_auto_detection_enabled boolean true Wenn deaktiviert, findet keine automatische Laufwerkspr\u00fcfung statt. Neue Disks werden nur per \"Laufwerk neu lesen\" erkannt. Polling Intervall (ms) disc_poll_interval_ms number 4000 Intervall f\u00fcr Disk-Erkennung."},{"location":"configuration/settings-reference/#kategorie-metadaten","title":"Kategorie: Metadaten","text":"GUI-Feld Key Typ Default Wirkung im System OMDb API Key omdb_api_key string leer API Key f\u00fcr Metadatensuche. TMDb Read Access Token tmdb_api_read_access_token string leer Read Access Token f\u00fcr Serien-Metadaten \u00fcber TheMovieDB (TMDb). DVD Serien-Sprache dvd_series_language string de-DE Bevorzugte Sprache f\u00fcr Serien-Metadaten im TMDb-Format, z.B. de-DE oder en-US. DVD Serien-Fallback-Sprachen dvd_series_fallback_languages string de-DE,en-US Kommagetrennte TMDb-Sprachen f\u00fcr Fallback-Titel, z.B. de-DE,en-US,fr-FR. DVD Serien-Ordnung dvd_series_order_preference select episode_group Bevorzugte Episodenordnung f\u00fcr DVD-Serien. Episode Groups nutzen TMDb Alternate Orders, falls vorhanden. DVD Disc-Profile wiederverwenden dvd_series_reuse_disc_profiles boolean true Verwendet zuvor best\u00e4tigte Disc-Profile erneut, um Episoden automatischer zuzuordnen. OMDb Typ omdb_default_type select movie Vorauswahl f\u00fcr Suche. MusicBrainz aktiviert musicbrainz_enabled boolean true MusicBrainz-Metadatensuche f\u00fcr CDs aktivieren. Coverart-Nachladen aktiv coverart_recovery_enabled boolean true Wenn aktiv, werden fehlende Coverarts automatisch in Intervallen gepr\u00fcft und nachgeladen. Coverart-Pr\u00fcfintervall (Stunden) coverart_recovery_interval_hours number 6 Intervall f\u00fcr automatische Pr\u00fcfung fehlender Coverarts in Stunden."},{"location":"configuration/settings-reference/#kategorie-monitoring","title":"Kategorie: Monitoring","text":"GUI-Feld Key Typ Default Wirkung im System Hardware Monitoring aktiviert hardware_monitoring_enabled boolean true Master-Schalter: aktiviert/deaktiviert das komplette Hardware-Monitoring (Polling + Berechnung + WebSocket-Updates). Hardware Monitoring Intervall (ms) hardware_monitoring_interval_ms number 5000 Polling-Intervall f\u00fcr CPU/RAM/GPU/Storage-Metriken."},{"location":"configuration/settings-reference/#kategorie-pfade","title":"Kategorie: Pfade","text":"GUI-Feld Key Typ Default Wirkung im System Raw-Ordner (Blu-ray) raw_dir_bluray path leer RAW-Zielpfad f\u00fcr Blu-ray. Leer = Standardpfad (data/output/raw). Raw-Ordner (DVD) raw_dir_dvd path leer RAW-Zielpfad f\u00fcr DVD. Leer = Standardpfad (data/output/raw). CD RAW-Ordner raw_dir_cd path leer Basisordner f\u00fcr rohe CD-WAV-Dateien (cdparanoia-Output). Leer = Standardpfad (data/output/cd). Audiobook RAW-Ordner raw_dir_audiobook path leer Basisordner f\u00fcr hochgeladene AAX-Dateien. Leer = Standardpfad (data/output/audiobook-raw). Serien-Ordner (Blu-ray) series_dir_bluray path leer Zielordner f\u00fcr Blu-ray-Serienfolgen. Leer = Standardpfad (data/output/series). Film-Ordner (Blu-ray) movie_dir_bluray path leer Encode-Zielpfad f\u00fcr Blu-ray. Leer = Standardpfad (data/output/movies). Film-Ordner (DVD) movie_dir_dvd path leer Encode-Zielpfad f\u00fcr DVD. Leer = Standardpfad (data/output/movies). Serien-Ordner (DVD) series_dir_dvd path leer Zielordner f\u00fcr DVD-Serienfolgen. Leer = Standardpfad (data/output/series). CD Output-Ordner movie_dir_cd path leer Zielordner f\u00fcr encodierte CD-Ausgaben (FLAC, MP3 usw.). Leer = gleicher Ordner wie CD RAW-Ordner. Audiobook Output-Ordner movie_dir_audiobook path leer Zielordner f\u00fcr encodierte Audiobook-Dateien. Leer = Standardpfad (data/output/audiobooks). Externe Speicher external_storage_paths path [] Wird links unter \"Freie Speicher\" angezeigt. Log Ordner log_dir path data/logs Basisordner f\u00fcr Logs. Job-Logs liegen direkt hier, Backend-Logs in /backend. CD Output Template cd_output_template string {artist} - {album} ({year})/{trackNr} {artist} - {title} Template f\u00fcr relative CD-Ausgabepfade ohne Dateiendung. Platzhalter: {artist}, {album}, {year}, {title}, {trackNr}, {trackNo}. Unterordner sind \u00fcber \"/\" m\u00f6glich \u2013 alles nach dem letzten \"/\" ist der Dateiname. Die Endung wird \u00fcber das gew\u00e4hlte Ausgabeformat gesetzt. Output Template (Blu-ray) output_template_bluray string ${title} (${year})/${title} (${year}) Template f\u00fcr Ordner und Dateiname. Platzhalter: ${title}, ${year}, ${imdbId}. Unterordner \u00fcber \"/\" m\u00f6glich \u2013 alles nach dem letzten \"/\" ist der Dateiname. Die Endung wird \u00fcber das gew\u00e4hlte Ausgabeformat gesetzt. Output Template (Blu-ray Serie, Episode) output_template_bluray_series_episode string {seriesTitle}/Staffel {seasonNr}/S{seasonNr}E{episodeNr} - {episodeTitle} Template f\u00fcr einzelne Blu-ray-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNr}, {episodeTitle}, {discNr}, {year}, {language}. Optional mit f\u00fchrender Null: {0:seasonNr}, {0:episodeNr}. Output Template (Blu-ray Serie, Multi-Episode) output_template_bluray_series_multi_episode string {seriesTitle}/Staffel {seasonNr}/S{0:seasonNr}E{episodeRange} - {episodeTitle} (Teil {parts}) Template f\u00fcr zusammengefasste Blu-ray-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNoStart}, {episodeNoEnd}, {episodeRange}, {episodeTitle}, {parts}, {discNr}, {year}, {language}. Optional mit f\u00fchrender Null: {0:seasonNr}, {0:episodeNoStart}, {0:episodeNoEnd}. Output Template (DVD) output_template_dvd string ${title} (${year})/${title} (${year}) Template f\u00fcr Ordner und Dateiname. Platzhalter: ${title}, ${year}, ${imdbId}. Unterordner \u00fcber \"/\" m\u00f6glich \u2013 alles nach dem letzten \"/\" ist der Dateiname. Die Endung wird \u00fcber das gew\u00e4hlte Ausgabeformat gesetzt. Output Template (DVD Serie, Episode) output_template_dvd_series_episode string {seriesTitle}/Staffel {seasonNr}/S{seasonNr}E{episodeNr} - {episodeTitle} Template f\u00fcr einzelne DVD-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNr}, {episodeTitle}, {discNr}, {year}, {language}. Optional mit f\u00fchrender Null: {0:seasonNr}, {0:episodeNr}. Output Template (DVD Serie, Multi-Episode) output_template_dvd_series_multi_episode string {seriesTitle}/Staffel {seasonNr}/S{0:seasonNr}E{episodeRange} - {episodeTitle} (Teil {parts}) Template f\u00fcr zusammengefasste DVD-Serienepisoden ohne Dateiendung. Platzhalter: {seriesTitle}, {seasonNr}, {episodeNoStart}, {episodeNoEnd}, {episodeRange}, {episodeTitle}, {parts}, {discNr}, {year}, {language}. Optional mit f\u00fchrender Null: {0:seasonNr}, {0:episodeNoStart}, {0:episodeNoEnd}. Output Template (Audiobook) output_template_audiobook string {author}/{author} - {title} ({year}) Template f\u00fcr relative Audiobook-Ausgabepfade ohne Dateiendung. Platzhalter: {author}, {title}, {year}, {narrator}, {series}, {part}, {format}. Unterordner sind \u00fcber \"/\" m\u00f6glich. Audiobook RAW Template audiobook_raw_template string {author} - {title} ({year}) Template f\u00fcr relative Audiobook-RAW-Ordner. Platzhalter: {author}, {title}, {year}, {narrator}, {series}, {part}. Converter Raw-Ordner converter_raw_dir path leer Eingangsordner f\u00fcr den Converter (Import-Scan und Datei-Uploads). Jeder Upload erh\u00e4lt einen Unterordner. Leer = Standardpfad (data/output/converter-raw). Converter Ausgabe (Video) converter_movie_dir path leer Ausgabepfad f\u00fcr konvertierte Video-Dateien. Leer = Standardpfad (data/output/converted-movies). Converter Ausgabe (Audio) converter_audio_dir path leer Ausgabepfad f\u00fcr konvertierte Audio-Dateien. Leer = Standardpfad (data/output/converted-audio). Output-Template (Video) converter_output_template_video string {title} Dateiname-Template f\u00fcr konvertierte Video-Dateien (ohne Endung). Platzhalter: {title}, {year}. Output-Template (Audio) converter_output_template_audio string {artist} - {title} Dateiname-Template f\u00fcr konvertierte Audio-Dateien (ohne Endung). Platzhalter: {artist}, {title}, {album}, {year}, {trackNr}. RAW-Ordner (Blu-ray Serie) raw_dir_bluray_series path leer RAW-Zielpfad f\u00fcr Blu-ray-Serien. Leer = gleicher Pfad wie RAW-Ordner (Blu-ray). Eigent\u00fcmer RAW-Ordner (Blu-ray Serie) raw_dir_bluray_series_owner string leer Eigent\u00fcmer der Dateien im Format user:gruppe f\u00fcr Blu-ray-Serien-RAW. Leer = Eigent\u00fcmer Raw-Ordner (Blu-ray). Eigent\u00fcmer Raw-Ordner (Blu-ray) raw_dir_bluray_owner string leer Eigent\u00fcmer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. RAW-Ordner (DVD Serie) raw_dir_dvd_series path leer RAW-Zielpfad f\u00fcr DVD-Serien. Leer = gleicher Pfad wie RAW-Ordner (DVD). Eigent\u00fcmer RAW-Ordner (DVD Serie) raw_dir_dvd_series_owner string leer Eigent\u00fcmer der Dateien im Format user:gruppe f\u00fcr DVD-Serien-RAW. Leer = Eigent\u00fcmer Raw-Ordner (DVD). Eigent\u00fcmer Raw-Ordner (DVD) raw_dir_dvd_owner string leer Eigent\u00fcmer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer CD RAW-Ordner raw_dir_cd_owner string leer Eigent\u00fcmer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Audiobook RAW-Ordner raw_dir_audiobook_owner string leer Eigent\u00fcmer der Audiobook-RAW-Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Serien-Ordner (Blu-ray) series_dir_bluray_owner string leer Eigent\u00fcmer der Blu-ray-Serienausgaben im Format user:gruppe. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Film-Ordner (Blu-ray) movie_dir_bluray_owner string leer Eigent\u00fcmer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Film-Ordner (DVD) movie_dir_dvd_owner string leer Eigent\u00fcmer der Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Serien-Ordner (DVD) series_dir_dvd_owner string leer Eigent\u00fcmer der DVD-Serienausgaben im Format user:gruppe. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer CD Output-Ordner movie_dir_cd_owner string leer Eigent\u00fcmer der encodierten CD-Ausgaben im Format user:gruppe. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Audiobook Output-Ordner movie_dir_audiobook_owner string leer Eigent\u00fcmer der encodierten Audiobook-Dateien im Format user:gruppe. Leer = Standardbenutzer des Dienstes."},{"location":"configuration/settings-reference/#kategorie-tools","title":"Kategorie: Tools","text":"GUI-Feld Key Typ Default Wirkung im System MakeMKV Kommando makemkv_command string makemkvcon Pfad oder Befehl f\u00fcr makemkvcon. MakeMKV Key makemkv_registration_key string leer Optionaler Registrierungsschl\u00fcssel. Wird vor Analyze/Rip automatisch per \"makemkvcon reg\" gesetzt. Mediainfo Kommando mediainfo_command string mediainfo Pfad oder Befehl f\u00fcr mediainfo. Minimale Titell\u00e4nge (Minuten) makemkv_min_length_minutes number 60 Filtert kurze Titel beim Rip. HandBrake Kommando handbrake_command string HandBrakeCLI Pfad oder Befehl f\u00fcr HandBrakeCLI. Encode-Neustart: unvollst\u00e4ndige Ausgabe l\u00f6schen handbrake_restart_delete_incomplete_output boolean true Wenn aktiv, wird bei \"Encode neu starten\" der bisherige (nicht erfolgreiche) Output vor Start entfernt. Max. parallele Film/Video Encodes pipeline_max_parallel_jobs number 1 Maximale Anzahl parallel laufender Film/Video Encode-Jobs. Gilt zus\u00e4tzlich zum Gesamtlimit. Max. parallele Audio CD Jobs pipeline_max_parallel_cd_encodes number 2 Maximale Anzahl parallel laufender Audio CD Jobs (Rip + Encode als Einheit). Gilt zus\u00e4tzlich zum Gesamtlimit. Max. Encodes gesamt (medienunabh\u00e4ngig) pipeline_max_total_encodes number 3 Gesamtlimit f\u00fcr alle parallel laufenden Encode-Jobs (Film + Audio CD). Dieses Limit hat Vorrang vor den Einzellimits. Audio CDs: Queue-Reihenfolge \u00fcberspringen pipeline_cd_bypasses_queue boolean false Wenn aktiv, k\u00f6nnen Audio CD Jobs unabh\u00e4ngig von Film-Jobs starten (\u00fcberspringen die Film-Queue-Reihenfolge). Einzellimits und Gesamtlimit gelten weiterhin. Script-Test Timeout (ms) script_test_timeout_ms number 0 Timeout fuer Script-Tests in den Settings. 0 = kein Timeout. cdparanoia Kommando cdparanoia_command string cdparanoia Pfad oder Befehl f\u00fcr cdparanoia. Wird als Fallback genutzt wenn kein individuelles Kommando gesetzt ist. FFmpeg Kommando ffmpeg_command string ffmpeg Pfad oder Befehl f\u00fcr ffmpeg. Wird f\u00fcr Audiobook-Encoding genutzt. FFprobe Kommando ffprobe_command string ffprobe Pfad oder Befehl f\u00fcr ffprobe. Wird f\u00fcr Audiobook-Metadaten und Kapitel genutzt. Mediainfo Extra Args mediainfo_extra_args_bluray string leer Zus\u00e4tzliche CLI-Parameter f\u00fcr mediainfo (Blu-ray). MakeMKV Rip Modus makemkv_rip_mode_bluray select backup backup: vollst\u00e4ndige Blu-ray Struktur im RAW-Ordner (empfohlen, erm\u00f6glicht --decrypt). MakeMKV Analyze Extra Args makemkv_analyze_extra_args_bluray string leer Zus\u00e4tzliche CLI-Parameter f\u00fcr Analyze (Blu-ray). MakeMKV Rip Extra Args makemkv_rip_extra_args_bluray string leer Zus\u00e4tzliche CLI-Parameter f\u00fcr Rip (Blu-ray). HandBrake Preset handbrake_preset_bluray string H.264 MKV 1080p30 Preset Name f\u00fcr -Z (Blu-ray). Leer = kein Preset, nur CLI-Parameter werden verwendet. HandBrake Extra Args handbrake_extra_args_bluray string leer Zus\u00e4tzliche CLI-Argumente (Blu-ray). Ausgabeformat output_extension_bluray select mkv Dateiendung f\u00fcr finale Datei (Blu-ray). Mediainfo Extra Args mediainfo_extra_args_dvd string leer Zus\u00e4tzliche CLI-Parameter f\u00fcr mediainfo (DVD). MakeMKV Rip Modus makemkv_rip_mode_dvd select backup backup: vollst\u00e4ndige Disc-Struktur im RAW-Ordner (einzig g\u00fcltige Option f\u00fcr DVDs). MakeMKV Analyze Extra Args makemkv_analyze_extra_args_dvd string leer Zus\u00e4tzliche CLI-Parameter f\u00fcr Analyze (DVD). MakeMKV Rip Extra Args makemkv_rip_extra_args_dvd string leer Zus\u00e4tzliche CLI-Parameter f\u00fcr Rip (DVD). HandBrake Preset handbrake_preset_dvd string H.264 MKV 480p30 Preset Name f\u00fcr -Z (DVD). Leer = kein Preset, nur CLI-Parameter werden verwendet. HandBrake Extra Args handbrake_extra_args_dvd string leer Zus\u00e4tzliche CLI-Argumente (DVD). Ausgabeformat output_extension_dvd select mkv Dateiendung f\u00fcr finale Datei (DVD)."},{"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 ein \u2013 inklusive Node.js, MakeMKV, HandBrake, nginx und systemd-Dienst.

Unterst\u00fctzte Systeme laut Script: Debian, Ubuntu, Linux Mint, Pop!_OS 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> dev 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 und ohne Home-Verzeichnis; Gruppen werden (falls vorhanden) erg\u00e4nzt: cdrom, optical, disk, video, render
  7. Repository \u2013 klont Branch nach --dir (bei --reinstall: sichert backend/data, aktualisiert Repo, stellt Daten wieder her)
  8. Verzeichnisse \u2013 stellt u. a. sicher: backend/data, backend/logs, backend/data/output/raw, backend/data/output/movies, backend/data/logs
  9. npm-Abh\u00e4ngigkeiten \u2013 Root, Backend (nur production), Frontend
  10. Frontend-Build \u2013 npm run build mit relativen API-URLs (nginx-kompatibel)
  11. Backend .env \u2013 wird automatisch generiert (bei --reinstall bleibt bestehende .env erhalten)
  12. Berechtigungen \u2013 zun\u00e4chst ripster:ripster auf Installationsverzeichnis; bei sudo-Aufruf werden Output-/Log-Ordner auf <aufrufender user>:ripster mit 775 gesetzt; .env wird auf 600 gesetzt
  13. MakeMKV User-Ordner \u2013 erstellt bei sudo-Aufruf ~/.MakeMKV f\u00fcr den aufrufenden Benutzer
  14. systemd-Dienst \u2013 ripster-backend.service erstellt, aktiviert und gestartet
  15. 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    client_max_body_size 8G;\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

Hinweis: Fuer groessere Uploads wie .aax-Audiobooks muss client_max_body_size ausreichend hoch gesetzt sein. Im mitgelieferten Beispiel sind 8G hinterlegt.

"},{"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 Produktions- vs. Dev-Voraussetzungen klar trennen 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":"

Diese Seite ist die Betriebs-Checkliste vor dem ersten produktiven Lauf.

"},{"location":"getting-started/configuration/#ziel-der-ersteinrichtung","title":"Ziel der Ersteinrichtung","text":"

Vor dem ersten Job m\u00fcssen drei Dinge stabil sein:

  1. Pfade stimmen (RAW, Output, Logs)
  2. Tools sind aufrufbar (MakeMKV, HandBrake, MediaInfo)
  3. Metadatenzug\u00e4nge funktionieren (OMDb, optional TMDb/MusicBrainz)
"},{"location":"getting-started/configuration/#empfohlene-reihenfolge","title":"Empfohlene Reihenfolge","text":""},{"location":"getting-started/configuration/#1-basis-in-settings-konfiguration","title":"1) Basis in Settings -> Konfiguration","text":"

Setze zuerst:

  • Raw-Ordner und Film-/Serien-Ordner
  • Log Ordner
  • MakeMKV Kommando, HandBrake Kommando, Mediainfo Kommando
  • OMDb API Key

Dann speichern.

"},{"location":"getting-started/configuration/#2-profile-pro-medium-festziehen","title":"2) Profile pro Medium festziehen","text":"

Ripster l\u00f6st viele Werte profilspezifisch auf (bluray, dvd, cd, audiobook).

Pflichtpr\u00fcfung:

  • RAW-Pfade je Profil
  • Output-Pfade je Profil
  • HandBrake-Preset je Profil
  • Output-Templates je Profil

F\u00fcr Serien zus\u00e4tzlich:

  • RAW-Ordner (Blu-ray/DVD Serie)
  • Serien-Ordner (Blu-ray/DVD)
  • Serien-Templates (Episode/Multi-Episode)
"},{"location":"getting-started/configuration/#3-queue-verhalten-definieren","title":"3) Queue-Verhalten definieren","text":"

Stelle ein:

  • Max. parallele Film/Video Encodes
  • Max. parallele Audio CD Jobs
  • Max. Encodes gesamt
  • optional Audio CDs: Queue-Reihenfolge \u00fcberspringen

Damit steuerst du Durchsatz, Priorit\u00e4t und Lastverteilung.

"},{"location":"getting-started/configuration/#4-metadatenquellen-absichern","title":"4) Metadatenquellen absichern","text":"

Film:

  • OMDb-Key pr\u00fcfen

Serien:

  • TMDb Read Access Token setzen
  • Sprache/Fallback-Sprachen festlegen

CD/Audiodaten:

  • MusicBrainz aktiviert nach Bedarf
"},{"location":"getting-started/configuration/#5-optional-benachrichtigungen","title":"5) Optional: Benachrichtigungen","text":"
  • PushOver-Zugangsdaten setzen
  • PushOver Test ausf\u00fchren
  • Event-Toggles pro Phase pr\u00fcfen
"},{"location":"getting-started/configuration/#6-optional-automatisierung","title":"6) Optional: Automatisierung","text":"
  1. Skripte testen
  2. Skriptketten bauen/testen
  3. Cronjobs erst danach aktivieren
"},{"location":"getting-started/configuration/#funktionsprufung-kurztest","title":"Funktionspr\u00fcfung (Kurztest)","text":"
  1. Disc in Ripper erkennen lassen.
  2. Analyse starten.
  3. Metadaten \u00fcbernehmen.
  4. Bis Bereit zum Encodieren laufen.
  5. Encode starten und Abschluss in Historie pr\u00fcfen.
"},{"location":"getting-started/configuration/#typische-konfigurationsfehler","title":"Typische Konfigurationsfehler","text":"Symptom H\u00e4ufige Ursache Job bleibt fr\u00fch auf Fehler Toolkommando falsch oder nicht im PATH RAW/Output landet am falschen Ort Profilpfade nicht gesetzt, Fallback greift Serienausgabe landet bei Filmen Serienpfade/Serientemplates fehlen Queue verh\u00e4lt sich unerwartet Gesamtlimit und Lane-Limits widersprechen sich"},{"location":"getting-started/configuration/#weiter","title":"Weiter","text":"
  • Erster Lauf
  • GUI-Seiten
  • Workflows aus Nutzersicht
"},{"location":"getting-started/installation/","title":"Installation","text":"

Die empfohlene Installation l\u00e4uft \u00fcber install.sh und richtet Ripster vollst\u00e4ndig ein.

Du musst daf\u00fcr keine Tools manuell vorinstallieren. Das Skript installiert die ben\u00f6tigten Abh\u00e4ngigkeiten automatisch, sofern sie nicht explizit mit --no-* \u00fcbersprungen werden.

"},{"location":"getting-started/installation/#unterstutzte-systeme-und-anforderungen","title":"Unterst\u00fctzte Systeme und Anforderungen","text":"
  • unterst\u00fctzt laut Script: debian, ubuntu, linuxmint, pop
  • Ausf\u00fchrung als root (oder via sudo)
  • Internetzugang w\u00e4hrend der Installation
"},{"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 w\u00e4hlst du den HandBrake-Modus:

  • 1 Standard (Paketinstallation)
  • 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 (Standard): http://<Server-IP>
  • ohne nginx (--no-nginx): API auf http://<Server-IP>:3001/api
"},{"location":"getting-started/installation/#was-installsh-konkret-einrichtet","title":"Was install.sh konkret einrichtet","text":"
  1. pr\u00fcft Betriebssystem, Root-Rechte und ermittelt Host/IP
  2. aktualisiert Paketquellen und installiert Basispakete (curl, wget, git, mediainfo, udev ...)
  3. installiert Node.js 20 (falls nicht passend vorhanden)
  4. installiert optional MakeMKV (Build aus den offiziellen Quellen)
  5. installiert optional HandBrakeCLI (Standard oder GPU/NVDEC)
  6. installiert optional nginx
  7. legt den Systembenutzer ripster an (ohne Login-Shell, ohne Home) und erg\u00e4nzt Gruppen (cdrom, optical, disk, video, render, falls vorhanden)
  8. klont das Repository nach /opt/ripster (oder aktualisiert bei --reinstall)
  9. legt Verzeichnisse an:
  10. /opt/ripster/backend/data
  11. /opt/ripster/backend/logs
  12. /opt/ripster/backend/data/output/raw
  13. /opt/ripster/backend/data/output/movies
  14. /opt/ripster/backend/data/logs
  15. installiert npm-Abh\u00e4ngigkeiten (Root, Backend, Frontend) und baut das Frontend
  16. erzeugt backend/.env (bei --reinstall bleibt bestehende .env erhalten)
  17. setzt Rechte/Besitz und erstellt bei sudo-Installation zus\u00e4tzlich ~/.MakeMKV f\u00fcr den aufrufenden Benutzer
  18. erzeugt und startet ripster-backend.service
  19. konfiguriert und startet nginx (falls nicht \u00fcbersprungen)
"},{"location":"getting-started/installation/#wichtige-optionen","title":"Wichtige Optionen","text":"Option Default laut Script Zweck --branch <branch> dev Branch f\u00fcr die Installation --dir <pfad> /opt/ripster Installationsverzeichnis --user <benutzer> ripster Service-Benutzer --port <port> 3001 Backend-Port --host <hostname> automatisch ermittelte Host-IP Hostname/IP f\u00fcr Webzugriff/CORS --no-makemkv aus MakeMKV-Installation \u00fcberspringen --no-handbrake aus HandBrake-Installation \u00fcberspringen --no-nginx aus nginx-Setup \u00fcberspringen --reinstall aus bestehende Installation aktualisieren

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":"
  • Laufwerk nicht zugreifbar: Laufwerksrechte/Gruppen pr\u00fcfen
  • CLI-Tool fehlt wegen --no-*: Tool nachinstallieren oder Befehl in Settings korrigieren
  • UI nicht erreichbar: nginx-Status und 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":"

Die Voraussetzungen h\u00e4ngen davon ab, wie du Ripster betreibst.

"},{"location":"getting-started/prerequisites/#produktionsbetrieb-mit-installsh-standard","title":"Produktionsbetrieb mit install.sh (Standard)","text":"

F\u00fcr den normalen Betrieb sind nur wenige Punkte vorab n\u00f6tig.

"},{"location":"getting-started/prerequisites/#pflicht","title":"Pflicht","text":"
  • unterst\u00fctztes Linux-System (laut Script: Debian, Ubuntu, Linux Mint, Pop!_OS)
  • root-Rechte
  • Internetzugang w\u00e4hrend der Installation
  • optisches Laufwerk f\u00fcr Disc-Betrieb

install.sh installiert die ben\u00f6tigten Tools selbst (u. a. Node.js, MakeMKV, HandBrakeCLI, MediaInfo), sofern sie nicht explizit per --no-* \u00fcbersprungen werden.

"},{"location":"getting-started/prerequisites/#laufwerk-kurz-prufen","title":"Laufwerk kurz pr\u00fcfen","text":"
ls /dev/sr*\nlsblk | grep rom\n

Wenn n\u00f6tig Rechte setzen (Beispiel):

sudo chmod a+rw /dev/sr0\n
"},{"location":"getting-started/prerequisites/#optional-vorab","title":"Optional vorab","text":"
  • OMDb API-Key (kann auch nach Installation in den Settings gesetzt werden)
  • PushOver-Zugangsdaten (optional)
"},{"location":"getting-started/prerequisites/#entwicklungsmodus-nur-fur-dev","title":"Entwicklungsmodus (nur f\u00fcr Dev)","text":"

Wenn du lokal entwickelst (./start.sh, npm run dev), gelten zus\u00e4tzliche Voraussetzungen:

  • Node.js >= 20.19.0
  • makemkvcon, HandBrakeCLI, mediainfo im PATH

Details: Entwicklungsumgebung

"},{"location":"getting-started/prerequisites/#abschluss-checkliste","title":"Abschluss-Checkliste","text":"
  • [ ] Produktionsbetrieb: Linux + root + Internet + Laufwerk vorhanden
  • [ ] Dev-Modus (nur falls ben\u00f6tigt): Node.js und CLI-Tools verf\u00fcgbar
"},{"location":"getting-started/quickstart/","title":"Erster Lauf","text":"

Dieser Ablauf f\u00fchrt einen vollst\u00e4ndigen Disc-Job von Erkennung bis fertiger Datei durch.

"},{"location":"getting-started/quickstart/#1-disc-erkennen","title":"1) Disc erkennen","text":"
  1. Ripper \u00f6ffnen.
  2. Disc einlegen.
  3. Auf Medium erkannt warten.

Pr\u00fcfen:

  • Disk-Information zeigt Device/Label.
  • Falls nicht: Laufwerk neu lesen.
"},{"location":"getting-started/quickstart/#2-analyse-starten","title":"2) Analyse starten","text":"

Aktion:

  • Analyse starten

Erwartung:

  • Status Analyse
  • danach Metadaten-Dialog
"},{"location":"getting-started/quickstart/#3-metadaten-bestatigen","title":"3) Metadaten best\u00e4tigen","text":"

Im Dialog:

  1. Treffer suchen/ausw\u00e4hlen.
  2. Bei Serie zus\u00e4tzlich Disc-Nummer setzen.
  3. Auswahl \u00fcbernehmen.

M\u00f6gliche Abzweigungen:

  • Duplikatfilm -> \u00dcbernahme erzwingen oder Multipart movie
  • vorhandenes RAW -> Entscheidungsdialog (weiterverwenden oder neu rippen)
"},{"location":"getting-started/quickstart/#4-ripreview-phase","title":"4) Rip/Review-Phase","text":"

Normalfall:

  • Startbereit -> Rippen -> Mediainfo-Pruefung

M\u00f6gliche Alternativen:

  • vorhandenes RAW: direkter Sprung in Pr\u00fcfung
  • Blu-ray/DVD-Entscheidung n\u00f6tig: Warte auf Auswahl f\u00fcr Playlist/Titel
"},{"location":"getting-started/quickstart/#5-encode-review-abschlieen","title":"5) Encode-Review abschlie\u00dfen","text":"

Bei Bereit zum Encodieren:

  • Titel festlegen
  • Audio-/Subtitle-Spuren pr\u00fcfen
  • optional Preset ausw\u00e4hlen
  • optional Pre-/Post-Skripte w\u00e4hlen

Dann:

  • Encoding starten
"},{"location":"getting-started/quickstart/#6-encoding-uberwachen","title":"6) Encoding \u00fcberwachen","text":"

W\u00e4hrend Encodieren:

  • Fortschritt/ETA im Ripper
  • Queue- und Runtime-Status beobachten
  • optional Logkontrolle in Historie
"},{"location":"getting-started/quickstart/#7-ergebnis-verifizieren","title":"7) Ergebnis verifizieren","text":"

Nach Fertig:

  1. Historie \u00f6ffnen.
  2. Jobdetail pr\u00fcfen.
  3. Output-Pfad und Log plausibilisieren.

Kontrollpunkte:

  • finale Datei am erwarteten Template-Pfad
  • RAW-Ordnerzustand finalisiert (kein Incomplete_)
"},{"location":"getting-started/quickstart/#8-typische-folgeaktionen","title":"8) Typische Folgeaktionen","text":"
  • falsche Metadaten: OMDb neu zuordnen
  • andere Trackauswahl: Review neu starten
  • erneuter Encode aus RAW: RAW neu encodieren
  • gleicher Plan erneut: Encode neu starten
"},{"location":"gui/","title":"GUI-Seiten","text":"

Dieses Kapitel ist das Bedienhandbuch f\u00fcr die Oberfl\u00e4chen im Alltag.

"},{"location":"gui/#seitenuberblick","title":"Seiten\u00fcberblick","text":"Seite Rolle im Betrieb Typischer Einsatz Jobs zentrale Inbox Gesamtlage pr\u00fcfen und in Fachseite springen Ripper Live-Steuerung der Pipeline Disc-Flow starten, Queue steuern, Review freigeben Audiobooks AAX-Spezialflow Upload, Konfiguration und Encode von Audiobooks Settings Konfiguration/Automatisierung Pfade, Tools, Queue-Limits, Skripte, Cron Historie Nachbearbeitung und Kontrolle Logs, Re-Encode, L\u00f6schvorschau, Recovery-Aktionen Converter dateibasierte Konvertierung Video/Audio/ISO ohne Disc-Rip verarbeiten Downloads ZIP-Exports RAW/Output aus Historie bereitstellen Database (Expert) Recovery-Sicht orphan RAW finden und importieren"},{"location":"gui/#empfohlener-tagesablauf","title":"Empfohlener Tagesablauf","text":"
  1. Jobs: Statuslage und Auff\u00e4lligkeiten pr\u00fcfen.
  2. Ripper oder Converter/Audiobooks: neue Arbeit starten.
  3. Historie: Ergebnisse validieren und ggf. nachbearbeiten.
  4. Downloads: Exporte f\u00fcr externe \u00dcbergabe erzeugen.
  5. Settings: Regeln und Limits nur kontrolliert anpassen.
"},{"location":"gui/#navigation","title":"Navigation","text":"

Direkt in der Top-Navigation:

  • Jobs, Ripper, Converter, Audiobooks, Settings, Historie, Downloads

Nur per URL:

  • Database unter /database
"},{"location":"gui/audiobooks/","title":"Audiobooks","text":"

Die Seite Audiobooks ist der spezialisierte AAX-Workflow.

"},{"location":"gui/audiobooks/#ablaufubersicht","title":"Ablauf\u00fcbersicht","text":"

Die Oberfl\u00e4che ist in drei Bereiche gegliedert:

  1. Audiobooks Upload
  2. Audiobook Jobs
  3. Audiobook Output Explorer
"},{"location":"gui/audiobooks/#1-audiobooks-upload","title":"1) Audiobooks Upload","text":"

Der Upload verarbeitet ausschlie\u00dflich AAX-Dateien.

Direkt nach Upload passieren im Hintergrund:

  • Probe/Metadatenanalyse (ffprobe)
  • Anlage eines RAW-Ordners per Audiobook RAW Template
  • Ablage der AAX-Datei im RAW-Pfad
  • Initiale Jobkonfiguration (Format, Kapitel, Metadaten)

Wichtige Parameter:

  • Zielformat (m4b, mp3, flac)
  • optionaler Sofortstart

Toolabh\u00e4ngigkeit:

  • ffprobe_command f\u00fcr Metadaten/Kapitel
  • ffmpeg_command f\u00fcr Encode/Cover-Extraktion
"},{"location":"gui/audiobooks/#2-audiobook-jobs","title":"2) Audiobook Jobs","text":"

Jobkarten zeigen Zustand, Fortschritt und verf\u00fcgbare Aktionen.

Typische Aktionen:

  • Starten
  • Abbrechen
  • Retry
  • L\u00f6schen
  • Im Ripper (Kontextwechsel)

Die Karten werden regelm\u00e4\u00dfig aktualisiert und durch WebSocket-Ereignisse erg\u00e4nzt.

"},{"location":"gui/audiobooks/#3-audiobook-output-explorer","title":"3) Audiobook Output Explorer","text":"

Read-only Explorer des Audiobook-Outputpfads:

  • Ordner-/Dateistruktur
  • Zeitstempel/Gr\u00f6\u00dfen
  • schnelle Ergebnispr\u00fcfung ohne Dateisystemwechsel
"},{"location":"gui/audiobooks/#pfad-und-template-logik","title":"Pfad- und Template-Logik","text":"Bereich Gesteuert durch RAW-Ablage raw_dir_audiobook + audiobook_raw_template Finale Ausgabe movie_dir_audiobook + output_template_audiobook Dateiformat Jobkonfiguration (m4b, mp3, flac)"},{"location":"gui/audiobooks/#typische-probleme","title":"Typische Probleme","text":"
  • Upload wird abgelehnt: Eingabedatei ist keine AAX-Datei.
  • Start schl\u00e4gt fehl: ffmpeg/ffprobe nicht aufrufbar.
  • Unerwartete Pfade: Templates enthalten ung\u00fcltige oder zu generische Platzhalter.
"},{"location":"gui/converter/","title":"Converter","text":"

Die Seite Converter verarbeitet bereits vorhandene Dateien (Video, Audio, ISO) ohne Laufwerks-Rip.

"},{"location":"gui/converter/#betriebsmodell","title":"Betriebsmodell","text":"

Der Converter arbeitet auf dem Eingangspfad converter_raw_dir:

  • Uploads landen dort
  • Explorer-Aktionen arbeiten dort
  • daraus werden Converter-Jobs erstellt

Wichtig:

  • Upload erzeugt nicht automatisch einen Job.
  • Joberstellung erfolgt explizit \u00fcber Auswahl im Explorer.
"},{"location":"gui/converter/#datei-explorer","title":"Datei-Explorer","text":"

Der Explorer zeigt den kompletten Baum unter converter_raw_dir.

Aktionen:

Aktion Wirkung Upload Dateien werden in den Raw-Baum geschrieben Ordner erstellen legt Unterordner im Raw-Baum an Umbenennen benennt Datei/Ordner im Raw-Baum um Verschieben verschiebt innerhalb des Raw-Baums L\u00f6schen entfernt Datei/Ordner dauerhaft Scannen synchronisiert Explorer und DB-Zuordnungen

Upload-Regeln:

  • Dateiendung muss in Erlaubte Datei-Endungen* enthalten sein
  • bei Versto\u00df wird der Upload abgelehnt
"},{"location":"gui/converter/#joberstellung-aus-explorer-auswahl","title":"Joberstellung aus Explorer-Auswahl","text":"

Es gibt zwei Audio-Strategien:

  1. Ein Job pro Datei
  2. Gemeinsamer Job (Audio)

Verhalten:

  • Video/ISO werden grunds\u00e4tzlich als Einzeljobs angelegt.
  • Audio kann als Shared-Job mit mehreren Eingabedateien erzeugt werden.

Shared-Audio-Job:

  • h\u00e4lt mehrere inputPaths
  • kann vor Start erweitert/reduziert werden (nur Audio-Dateien)
"},{"location":"gui/converter/#job-konfiguration","title":"Job-Konfiguration","text":"

Vor Start je Job einstellbar:

  • converterMediaType (video, audio, iso)
  • outputFormat
  • Metadaten
  • Track-/Titelwahl (bei video/iso)
  • Pre-/Post-Encode-Skripte und Ketten

Spezifika:

  • Video/ISO laufen durch Mediainfo/Review \u00e4hnlich zum Disc-Flow.
  • Audio kann direkt mit Formatoptionen konfiguriert werden.
"},{"location":"gui/converter/#ausgabe-pfade","title":"Ausgabe-Pfade","text":""},{"location":"gui/converter/#videoiso","title":"Video/ISO","text":"
  • Root: converter_movie_dir
  • Dateiname: Output-Template (Video)
  • Endung: aus gew\u00e4hltem Output-Format
"},{"location":"gui/converter/#audio","title":"Audio","text":"
  • Root: converter_audio_dir
  • Dateiname/Ordner: Output-Template (Audio)
  • bei Shared-/Folder-Job: Ausgabe als Ordnerstruktur mit Trackdateien
"},{"location":"gui/converter/#queue-und-start","title":"Queue und Start","text":"

Converter-Jobs laufen \u00fcber dieselbe Pipeline-/Queue-Logik:

  • sofortiger Start wenn Limits frei
  • sonst Queue-Eintrag

Parallelit\u00e4t richtet sich nach den globalen Encode-Limits in Settings.

"},{"location":"gui/converter/#auto-scan-polling","title":"Auto-Scan (Polling)","text":"

Mit aktiviertem Polling:

  • converter_raw_dir wird zyklisch gescannt
  • neue Dateien erscheinen automatisch im Explorer

Relevante Settings:

  • Auto-Scan (Polling)
  • Polling-Intervall (Sekunden)
"},{"location":"gui/converter/#abgrenzung-zu-audiobooks","title":"Abgrenzung zu Audiobooks","text":"
  • Converter: beliebige Audio/Video/ISO-Dateien
  • Audiobooks: dedizierter AAX-Workflow mit Kapitel-/Audiobook-Metadaten
"},{"location":"gui/database/","title":"Database (Expert)","text":"

/database ist die Recovery- und Expertensicht f\u00fcr F\u00e4lle, in denen Dateisystem und Historie nicht mehr sauber zusammenpassen.

"},{"location":"gui/database/#zugriff","title":"Zugriff","text":"
  • direkte Route: /database
  • nicht Teil der Standardnavigation
"},{"location":"gui/database/#bereich-gefundene-raw-eintrage","title":"Bereich Gefundene RAW-Eintr\u00e4ge","text":"

Dieser Bereich listet RAW-Verzeichnisse ohne zugeordneten Historie-Job.

Aktionen:

  • RAW pr\u00fcfen: scannt konfigurierte RAW-Wurzeln
  • Job anlegen: erstellt aus einem orphan RAW einen neuen Historie-Job
"},{"location":"gui/database/#was-bei-job-anlegen-passiert","title":"Was bei Job anlegen passiert","text":"
  • RAW-Pfad wird als Importquelle registriert
  • Job wird in die Historie geschrieben
  • anschlie\u00dfende Analyse l\u00e4uft als RAW-basierter Einstieg (ohne klassischen Disc-Read)

Typischer Einsatz:

  • manuelle Dateioperationen au\u00dferhalb der UI
  • Migrationen
  • Wiederherstellung nach abgebrochenen L\u00e4ufen
"},{"location":"gui/database/#sicherheits-und-betriebsregeln","title":"Sicherheits- und Betriebsregeln","text":"
  • Aktionen wirken direkt auf produktive Historie/Dateipfade.
  • Vor Import oder L\u00f6schung immer Pfad und Ziel pr\u00fcfen.
  • Diese Seite nur f\u00fcr Recovery-Szenarien nutzen, nicht f\u00fcr normalen Tagesbetrieb.
"},{"location":"gui/downloads/","title":"Downloads","text":"

Auf Downloads werden ZIP-Archive f\u00fcr Historie-Artefakte erstellt und bereitgestellt.

"},{"location":"gui/downloads/#was-heruntergeladen-werden-kann","title":"Was heruntergeladen werden kann","text":"

Ein Download-Eintrag referenziert immer einen Historie-Job und genau ein Ziel:

  • RAW
  • Output

Erzeugt wird ein ZIP-Archiv im Download-Verzeichnis des Backends.

"},{"location":"gui/downloads/#statusmodell","title":"Statusmodell","text":"Status Bedeutung queued Eintrag erstellt, wartet auf Verarbeitung processing ZIP wird gerade gebaut ready Archiv fertig, Download-Link aktiv failed Erzeugung oder Zugriff fehlgeschlagen"},{"location":"gui/downloads/#eintrag-anlegen","title":"Eintrag anlegen","text":"

Startpunkt ist die Historie:

  1. Job \u00f6ffnen.
  2. Download einreihen.
  3. Ziel (RAW oder Output) w\u00e4hlen.
  4. Status in Downloads verfolgen.
"},{"location":"gui/downloads/#wichtige-laufzeitdetails","title":"Wichtige Laufzeitdetails","text":"
  • Wenn bereits ein passendes, aktuelles Archiv existiert, kann der Eintrag wiederverwendet werden.
  • Nach Backend-Neustart werden unterbrochene queued/processing-Eintr\u00e4ge gepr\u00fcft und fortgesetzt.
  • Fehlt eine erwartete ZIP-Datei bei ready, wird der Eintrag auf failed gesetzt.
"},{"location":"gui/downloads/#download-auslosen","title":"Download ausl\u00f6sen","text":"

Bei Status ready:

  • Download-Button l\u00e4dt die ZIP direkt aus /api/downloads/:id/file.
"},{"location":"gui/downloads/#eintrage-entfernen","title":"Eintr\u00e4ge entfernen","text":"

L\u00f6schen entfernt:

  • Queue-Metadaten
  • zugeh\u00f6rige Archivdatei

Nicht erlaubt:

  • L\u00f6schen w\u00e4hrend queued/processing
"},{"location":"gui/downloads/#echtzeitaktualisierung","title":"Echtzeitaktualisierung","text":"

Die Seite reagiert auf DOWNLOADS_UPDATED per WebSocket. Dadurch sind Statuswechsel ohne Reload sichtbar.

"},{"location":"gui/history/","title":"Historie","text":"

Historie ist die Kontroll- und Nachbearbeitungsoberfl\u00e4che f\u00fcr alle bereits angelegten Jobs.

"},{"location":"gui/history/#hauptansicht","title":"Hauptansicht","text":"

Filter und Arbeitsmittel:

  • Suche (Titel, IMDb, Kontextbegriffe)
  • Statusfilter
  • Mediumfilter
  • Sortierung
  • Listen-/Grid-Layout

Jeder Eintrag zeigt auf einen Blick:

  • Titel, Jahr, Poster
  • Status und Zeitstempel
  • RAW-/Output-Verf\u00fcgbarkeit
  • Medien- und ggf. Containerhinweise
"},{"location":"gui/history/#detaildialog-was-dort-zusammenlauft","title":"Detaildialog: Was dort zusammenl\u00e4uft","text":"

Der Detaildialog b\u00fcndelt:

  • Metadaten (Film oder Serie)
  • Jobstatus und Fehlertexte
  • RAW-/Output-Pfade
  • Encode-Plan und Trackauswahl
  • ausgef\u00fchrte Kommandodetails
  • Prozesslog (Tail oder vollst\u00e4ndig)

Bei Seriencontainern wird disk-/child-orientiert dargestellt, nicht nur als Einzeljob.

"},{"location":"gui/history/#nachbearbeitungsaktionen-und-wirkung","title":"Nachbearbeitungsaktionen und Wirkung","text":"Aktion Typischer Einsatz Technische Wirkung OMDb neu zuordnen falsches Match, Titel/Jahr korrigieren Metadatenfelder werden neu geschrieben; Folder-Rename wird best effort angesto\u00dfen Review neu starten neue Track-/Titelbewertung n\u00f6tig Mediainfo/Review wird aus RAW neu aufgebaut RAW neu encodieren neuer Encode aus vorhandenem RAW startet Encode ohne neuen Laufwerks-Rip Encode neu starten gleiche best\u00e4tigte Auswahl erneut fahren letzter best\u00e4tigter Plan wird geladen, optional mit Bereinigung unvollst\u00e4ndiger Ausgabe Retry Rippen Rip/Analyse neu ansto\u00dfen neuer Rip-Lauf, inkl. erneuter RAW-Phase

L\u00f6schaktionen im Dialog:

  • RAW l\u00f6schen
  • Movie l\u00f6schen
  • Beides l\u00f6schen
  • Historieneintrag l\u00f6schen
"},{"location":"gui/history/#loschvorschau-und-selektives-loschen","title":"L\u00f6schvorschau und selektives L\u00f6schen","text":"

Vor endg\u00fcltigem L\u00f6schen zeigt Ripster eine Vorschau mit:

  • RAW-Kandidaten
  • Movie-/Episoden-Kandidaten
  • Related-Scope (Container/Kinder/verbundene Jobs)

Wichtige Punkte:

  • Pfade sind selektierbar.
  • F\u00fcr RAW-L\u00f6schung muss bei Mehrfachkandidaten mindestens ein RAW-Pfad gew\u00e4hlt werden.
  • Schutzlogik verhindert L\u00f6schungen au\u00dferhalb erlaubter Root-Verzeichnisse.
"},{"location":"gui/history/#serien-und-multipart-sicht-in-der-historie","title":"Serien- und Multipart-Sicht in der Historie","text":""},{"location":"gui/history/#serien","title":"Serien","text":"
  • Container zeigt aggregierten Zustand aus Child-Jobs.
  • Disk-/Episode-Aktionen k\u00f6nnen child-spezifisch ausgef\u00fchrt werden.
  • Im Ripper \u00f6ffnen hilft bei Bereit zum Encodieren-Kindern.
"},{"location":"gui/history/#multipart","title":"Multipart","text":"
  • gemeinsamer Container mit Disc-Childs
  • Disc-Nummern bleiben pro Child nachvollziehbar
  • Delete-Preview kann Related-Pfade gemeinsam aufl\u00f6sen
"},{"location":"gui/history/#logs-sinnvoll-nutzen","title":"Logs sinnvoll nutzen","text":"
  • Tail laden (800) f\u00fcr schnellen Fehlerkontext
  • Vollst\u00e4ndiges Log laden f\u00fcr forensische Analyse

Empfehlung:

  1. Erst Tail pr\u00fcfen.
  2. Bei Pfad-/Toolproblemen vollst\u00e4ndiges Log laden.
  3. Danach passende Wiederanlauf-Aktion w\u00e4hlen.
"},{"location":"gui/jobs/","title":"Jobs","text":"

Jobs ist die zentrale Inbox \u00fcber alle Jobarten und dient als schneller Einstieg in den Tagesbetrieb.

"},{"location":"gui/jobs/#zweck-der-seite","title":"Zweck der Seite","text":"

Die Liste vereinheitlicht:

  • Disc-/Ripper-Jobs
  • Converter-Jobs
  • Audiobook-Jobs

Dadurch kannst du unabh\u00e4ngig von der Fachseite zuerst den Gesamtzustand pr\u00fcfen.

"},{"location":"gui/jobs/#filterlogik","title":"Filterlogik","text":""},{"location":"gui/jobs/#view-filter","title":"View-Filter","text":"
  • Alle Jobs
  • Ripper-View
  • Converter-View
  • Audiobooks
"},{"location":"gui/jobs/#status-filter","title":"Status-Filter","text":"
  • Alle
  • Aktiv
  • Fehler/Abbruch

Zus\u00e4tzlich:

  • Freitextsuche
  • Paginierung
"},{"location":"gui/jobs/#was-ein-jobeintrag-zeigt","title":"Was ein Jobeintrag zeigt","text":"
  • Job-ID und Titel
  • Statusbadge
  • Jobtypbadge (z. B. Blu-ray, DVD, Converter Audio, Audiobook)
  • Aktualisierungszeit

Die Ansicht wird periodisch aktualisiert und erg\u00e4nzt sich mit WebSocket-Events.

"},{"location":"gui/jobs/#schnellaktion-pro-zeile","title":"Schnellaktion pro Zeile","text":"
  • Im Ripper \u00f6ffnen f\u00fcr Disc-/Audiobook-nahe Jobs
  • Im Converter \u00f6ffnen f\u00fcr Converter-Jobs

So kommst du ohne Umwege in die Oberfl\u00e4che mit den passenden Detailaktionen.

"},{"location":"gui/jobs/#empfohlener-einsatz","title":"Empfohlener Einsatz","text":"
  1. In Jobs St\u00f6rungen und Auslastung identifizieren.
  2. Danach gezielt in Ripper, Converter oder Historie springen.
"},{"location":"gui/ripper/","title":"Ripper","text":"

Die Seite Ripper ist die Live-Steuerung der Pipeline. Hier laufen Disc-Erkennung, Queue-Steuerung, Review und Encode-Start zusammen.

"},{"location":"gui/ripper/#seitenaufbau-und-betriebslogik","title":"Seitenaufbau und Betriebslogik","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/ripper/#1-hardware-monitoring","title":"1) Hardware Monitoring","text":"

Zeigt kontinuierlich:

  • CPU / RAM
  • GPU (wenn verf\u00fcgbar)
  • freie Speicherst\u00e4nde konfigurierter Pfade

Nutzen im Betrieb:

  • Engp\u00e4sse vor Jobfehlern erkennen
  • Pfadf\u00fcllst\u00e4nde vor Start gro\u00dfer Batchs pr\u00fcfen

Gesteuert \u00fcber Settings:

  • Hardware Monitoring aktiviert
  • Hardware Monitoring Intervall (ms)
"},{"location":"gui/ripper/#2-job-queue","title":"2) Job Queue","text":"

Es gibt zwei operative Zonen:

  • Laufende Jobs
  • Warteschlange

M\u00f6gliche Queue-Eintr\u00e4ge:

  • Job-Startaktionen (Start, Retry Rippen, RAW neu encodieren, Encode neu starten, Review neu berechnen, Audio CD starten)
  • Nicht-Job-Eintr\u00e4ge (Skript, Skriptkette, Warten)

Wichtige Regeln:

  • Queue-Reihenfolge ist per Drag-and-Drop \u00e4nderbar.
  • Warten blockiert nachfolgende Queue-Starts bis kein aktiver Prozess mehr l\u00e4uft.
  • Skript und Skriptkette werden als Queue-Eintr\u00e4ge mitgef\u00fchrt.

Parallelit\u00e4t kommt aus Settings:

  • Max. parallele Film/Video Encodes
  • Max. parallele Audio CD Jobs
  • Max. Encodes gesamt
  • optional Audio CDs: Queue-Reihenfolge \u00fcberspringen
"},{"location":"gui/ripper/#3-skript-cron-status","title":"3) Skript- / Cron-Status","text":"

Zeigt Runtime-Aktivit\u00e4ten:

  • laufende Skripte
  • laufende Ketten
  • Cron-Ausf\u00fchrungen
  • letzte abgeschlossene Aktivit\u00e4ten

Aktionen:

  • N\u00e4chster Schritt bei Ketten
  • Abbrechen
  • Liste leeren
"},{"location":"gui/ripper/#4-job-ubersicht","title":"4) Job \u00dcbersicht","text":"

Die Jobliste ist der zentrale Arbeitsbereich. Ein Klick \u00f6ffnet den jeweiligen Pipeline-Status.

"},{"location":"gui/ripper/#badges-und-kontext","title":"Badges und Kontext","text":"

Neben Status/Fortschritt zeigt die Liste je nach Job:

  • Serienkontext (Serien-Container, Staffel/Disk)
  • Multipart-Kontext (Multipart Movie, Disc-Nr.)
  • Queue-/Subjob-Kontext bei Serien-Episoden
"},{"location":"gui/ripper/#zustandsabhangige-aktionen","title":"Zustandsabh\u00e4ngige Aktionen","text":"Zustand Hauptaktion im Ripper Ergebnis Medium erkannt, Bereit Analyse starten startet MakeMKV-Analyse Metadatenauswahl Metadaten \u00f6ffnen Film/Serie ausw\u00e4hlen, Provider festlegen Warte auf Auswahl Playlist/Titel/RAW-Entscheidung best\u00e4tigen setzt Flow fort zur Pr\u00fcfung Startbereit Job starten startet Rip oder RAW-basierte Pr\u00fcfung Bereit zum Encodieren Encoding starten startet HandBrake mit best\u00e4tigter Auswahl Laufend (Analyse, Rippen, Encodieren) Abbrechen setzt Job auf Abgebrochen Fehler, Abgebrochen Retry Rippen neuer Rip-Anlauf

Zusatzaktionen je nach Zustand und Jobtyp:

  • Review neu starten
  • Encode neu starten
  • RAW neu encodieren
  • Aus Queue l\u00f6schen
"},{"location":"gui/ripper/#review-bereich-bereit-zum-encodieren","title":"Review-Bereich (Bereit zum Encodieren)","text":"

Hier wird die effektive Encode-Entscheidung festgelegt:

  • Titelwahl
  • Audio-/Subtitle-Trackselektion
  • User-Preset
  • Pre-/Post-Encode-Skripte und Ketten
  • HandBrake-Kommandovorschau

Ohne Best\u00e4tigung dieses Blocks startet kein produktiver Encode.

"},{"location":"gui/ripper/#raw-ordnerphasen-sichtbar-uber-logsdetails","title":"RAW-Ordnerphasen (sichtbar \u00fcber Logs/Details)","text":"

Der Ripper arbeitet mit drei RAW-Zust\u00e4nden:

  • Incomplete_... w\u00e4hrend unvollst\u00e4ndigem Rip
  • Rip_Complete_... nach erfolgreich abgeschlossenem Rip, vor Encode
  • ohne Prefix nach erfolgreichem Encode

Das ist wichtig f\u00fcr Recovery und Delete-Vorschau.

"},{"location":"gui/ripper/#5-disk-information","title":"5) Disk-Information","text":"

Zeigt aktuelle Laufwerksdaten:

  • Device-Pfad
  • Modell
  • Disc-Label / Mount

Aktionen:

  • Laufwerk neu lesen
  • Disk neu analysieren
  • Metadaten-Dialog \u00f6ffnen

Hinweis:

  • Laufwerk neu lesen ist nicht mehr an einen festen Pipeline-State gebunden.
"},{"location":"gui/ripper/#wichtige-dialoge","title":"Wichtige Dialoge","text":""},{"location":"gui/ripper/#metadaten-auswahlen","title":"Metadaten ausw\u00e4hlen","text":"

Im Dialog werden Film-/Serienmetadaten best\u00e4tigt.

Sonderf\u00e4lle:

  • Film-Duplikat: \u00dcbernahme erzwingen oder Multipart movie
  • Serie: Disc-Nummer ist Pflicht
"},{"location":"gui/ripper/#vorhandenes-raw-erkannt","title":"Vorhandenes RAW erkannt","text":"

Wenn passendes RAW existiert, fordert der Dialog eine explizite Entscheidung:

  • vorhandenes RAW verwenden
  • RAW verwerfen/l\u00f6schen und neu rippen
"},{"location":"gui/ripper/#queue-eintrag-einfugen","title":"Queue-Eintrag einf\u00fcgen","text":"

Du kannst gezielt ab Position einf\u00fcgen:

  • Skript
  • Skriptkette
  • Wartezeit
"},{"location":"gui/settings/","title":"Settings","text":"

Die Seite Settings steuert alle Betriebsparameter von Ripster: Pfade, Tools, Queue-Limits, Metadatenquellen, Automatisierung.

"},{"location":"gui/settings/#tab-uberblick","title":"Tab-\u00dcberblick","text":"Tab Hauptzweck Konfiguration globale und profilspezifische Laufzeitsettings Scripte einzelne Skripte verwalten und testen Skriptketten mehrstufige Abl\u00e4ufe aus Skript/Warten Encode-Presets wiederverwendbare HandBrake-Profile f\u00fcr Review Cronjobs zeitgesteuerte Ausf\u00fchrung von Skript/Kette"},{"location":"gui/settings/#tab-konfiguration","title":"Tab Konfiguration","text":""},{"location":"gui/settings/#bedienprinzip","title":"Bedienprinzip","text":"
  1. Werte \u00e4ndern.
  2. \u00c4nderungen speichern.
  3. erst danach sind Werte f\u00fcr neue Aktionen wirksam.

Zus\u00e4tzliche Bedienhilfen:

  • Neu laden verwirft lokale Formzust\u00e4nde
  • \u00c4nderungen verwerfen setzt auf zuletzt gespeicherten Stand
  • PushOver Test validiert Benachrichtigungszugang sofort
"},{"location":"gui/settings/#was-wirkt-unmittelbar-was-erst-bei-neuem-job","title":"Was wirkt unmittelbar, was erst bei neuem Job?","text":"
  • Queue-/Parallelit\u00e4t wirkt auf neue Queue-Entscheidungen und Pump-L\u00e4ufe.
  • Tool-/Pfad-/Template-\u00c4nderungen wirken vollst\u00e4ndig auf neu gestartete Schritte.
  • Bereits laufende Prozesse \u00fcbernehmen \u00c4nderungen in der Regel nicht r\u00fcckwirkend.
"},{"location":"gui/settings/#welche-bereiche-im-alltag-kritisch-sind","title":"Welche Bereiche im Alltag kritisch sind","text":"Bereich Kritisch f\u00fcr Pfade wo RAW, finale Ausgaben, Converter/Audiobook-Dateien landen Tools ob Analyze/Rip/Encode ausf\u00fchrbar sind Metadaten Film-/Serienzuordnung und Episode-Mapping Queue-Limits Durchsatz und Reihenfolgeverhalten Monitoring Sichtbarkeit von Last und Speicherengp\u00e4ssen Benachrichtigungen PushOver-Ereignisse je Pipelinephase"},{"location":"gui/settings/#tab-scripte","title":"Tab Scripte","text":"

Funktionen:

  • anlegen, bearbeiten, l\u00f6schen
  • testen (Test)
  • sortieren

Testausf\u00fchrung liefert:

  • Exit-Code
  • Dauer
  • stdout/stderr

Wichtig:

  • Nur erfolgreiche Skripte sollten in produktive Pre-/Post-Listen \u00fcbernommen werden.
"},{"location":"gui/settings/#tab-skriptketten","title":"Tab Skriptketten","text":"

Ketten bestehen aus Schritten:

  • Skript
  • Warten

Typischer Einsatz:

  • externe Hooks vor/nach Encode
  • gestaffelte Abl\u00e4ufe mit Pausen

In der Queue erscheinen Ketten als eigene Eintr\u00e4ge und werden dort ausgef\u00fchrt.

"},{"location":"gui/settings/#tab-encode-presets","title":"Tab Encode-Presets","text":"

Ein Preset b\u00fcndelt:

  • optionales HandBrake-Preset (-Z)
  • optionale Extra-Args
  • Medienziel (Universell/Blu-ray/DVD/Sonstiges)

Im Ripper-Review kannst du Presets pro Job ausw\u00e4hlen, statt Parameter jedes Mal neu zu setzen.

"},{"location":"gui/settings/#tab-cronjobs","title":"Tab Cronjobs","text":"

Funktionen:

  • Cronjob anlegen und bearbeiten
  • Quelle w\u00e4hlen (Skript oder Skriptkette)
  • Cron-Ausdruck pr\u00fcfen
  • Jetzt ausf\u00fchren
  • Job-Logs ansehen
  • Aktivierung/Pushover toggeln

Empfehlung:

  1. Skript/Kette manuell testen.
  2. Dann Cron aktivieren.
  3. Erste automatische L\u00e4ufe aktiv im Runtime-Status kontrollieren.
"},{"location":"gui/settings/#verbindung-zur-einstellungsreferenz","title":"Verbindung zur Einstellungsreferenz","text":"

Die vollst\u00e4ndige Wirkung jeder einzelnen Einstellung steht in Einstellungsreferenz.

"},{"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":"

Vor dem eigentlichen Encoding erstellt Ripster einen Encode-Plan und zeigt ihn im Review an.

"},{"location":"pipeline/encoding/#ablauf","title":"Ablauf","text":"
Quelle bestimmen (Disc/RAW)\n  -> HandBrake-Scan (--scan --json)\n  -> Plan erstellen (Titel, Audio, Untertitel)\n  -> Status: Bereit zum Encodieren\n  -> Benutzer bestaetigt Auswahl\n  -> finaler HandBrake-Aufruf\n
"},{"location":"pipeline/encoding/#review-inhalt-status-bereit-zum-encodieren","title":"Review-Inhalt (Status: Bereit zum Encodieren)","text":"
  • ausw\u00e4hlbarer Encode-Titel
  • Audio-Track-Auswahl
  • Untertitel-Track-Auswahl inkl. Flags
  • burnIn
  • forced
  • defaultTrack
  • optionale User-Presets (HandBrake Preset + Extra Args)
  • optionale Pre-/Post-Skripte und Ketten
"},{"location":"pipeline/encoding/#bestaetigung-confirm-encode","title":"Bestaetigung (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

Die best\u00e4tigte Auswahl wird im Job gespeichert und f\u00fcr Neustarts wiederverwendet.

"},{"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

Fehlerverhalten:

  • Pre-Encode-Fehler: Job endet mit Status Fehler (Encode startet nicht)
  • Post-Encode-Fehler: Job kann Fertig bleiben, enth\u00e4lt aber Fehlerhinweis/Script-Summary
"},{"location":"pipeline/encoding/#dateinamenordner","title":"Dateinamen/Ordner","text":"

Der finale Outputpfad wird aus den Templates in den Settings aufgebaut.

Platzhalter:

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

Ung\u00fcltige Dateizeichen werden bereinigt.

"},{"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 sehr 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 intern Kandidatenlisten, Bewertungen und eine Empfehlung.

"},{"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, wechselt der Job in der GUI auf:

  • Warte auf Auswahl

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

"},{"location":"pipeline/playlist-analysis/#konfigurationseinfluss","title":"Konfigurationseinfluss","text":"Feld in Settings Wirkung Minimale Titellaenge (Minuten) Mindestlaufzeit f\u00fcr Kandidaten

Default ist aktuell 60 Minuten.

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

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

Nach Best\u00e4tigung:

  • mit vorhandenem RAW -> zur\u00fcck zu Mediainfo-Pruefung
  • ohne RAW -> Startpfad \u00fcber Startbereit / Rippen
"},{"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":"
Bereit zum Encodieren\n  -> Pre-Encode Skripte/Ketten\n  -> HandBrake Encoding\n  -> Post-Encode Skripte/Ketten\n  -> Fertig oder Fehler\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 Fehler.
  • Post-Encode-Fehler stoppen die restlichen Post-Schritte; Job kann dennoch Fertig 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 Zustandsmaschine.

"},{"location":"pipeline/workflow/#zustandsdiagramm-vereinfacht","title":"Zustandsdiagramm (vereinfacht)","text":"
flowchart LR\n    A[Bereit] --> B[Medium erkannt]\n    B --> C[Analyse]\n    C --> D[Metadatenauswahl]\n    D --> E[Startbereit]\n    E --> F[Rippen]\n    E --> G[Mediainfo-Pruefung]\n    G --> H[Warte auf Auswahl]\n    H --> G\n    G --> I[Bereit zum Encodieren]\n    I --> J[Encodieren]\n    J --> K[Fertig]\n    J --> L[Fehler]\n    F --> L\n    F --> M[Abgebrochen]
"},{"location":"pipeline/workflow/#statusliste-gui-anzeige","title":"Statusliste (GUI-Anzeige)","text":"Status in der GUI Bedeutung Bereit Wartet auf Disc Medium erkannt Disc wurde erkannt Analyse MakeMKV-Analyse l\u00e4uft Metadatenauswahl Metadaten m\u00fcssen best\u00e4tigt werden Warte auf Auswahl Playlist-Auswahl ist erforderlich Warte auf Auswahl auch f\u00fcr RAW-Entscheidung bei vorhandenen Quelldaten genutzt Startbereit kurzer \u00dcbergang vor Start Rippen MakeMKV-Rip l\u00e4uft Mediainfo-Pruefung Titel/Spuren werden ausgewertet Bereit zum Encodieren Review ist bereit Encodieren HandBrake l\u00e4uft CD-Metadatenauswahl CD-Metadaten m\u00fcssen best\u00e4tigt werden CD-Startbereit CD-Job wartet auf Start CD-Analyse CD-Track-/Strukturaufbereitung CD-Rippen Audio-CD-Rip l\u00e4uft CD-Encodieren CD-Encode l\u00e4uft Fertig erfolgreich abgeschlossen Abgebrochen manuell oder technisch abgebrochen Fehler fehlgeschlagen"},{"location":"pipeline/workflow/#typische-pfade","title":"Typische Pfade","text":""},{"location":"pipeline/workflow/#standardfall-kein-vorhandenes-raw","title":"Standardfall (kein vorhandenes RAW)","text":"
  1. Medium erkannt
  2. Analyse + Metadaten
  3. Rippen
  4. Mediainfo-Pruefung
  5. Bereit zum Encodieren
  6. Encodieren
  7. Fertig
"},{"location":"pipeline/workflow/#vorhandenes-raw","title":"Vorhandenes RAW","text":"

Startbereit springt direkt zu Mediainfo-Pruefung (kein neuer Rip).

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

Mediainfo-Pruefung -> Warte auf Auswahl bis Playlist best\u00e4tigt wurde.

"},{"location":"pipeline/workflow/#vorhandenes-raw-mit-nutzerentscheidung","title":"Vorhandenes RAW mit Nutzerentscheidung","text":"

Metadatenauswahl -> Warte auf Auswahl bis Entscheidung f\u00fcr Weiterverarbeitung (continue) oder Neustart getroffen wurde.

"},{"location":"pipeline/workflow/#cd-flow","title":"CD-Flow","text":"

CD-Metadatenauswahl -> CD-Startbereit -> CD-Rippen -> CD-Encodieren -> Fertig

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

Wenn der Wert Parallele Jobs erreicht ist:

  • neue Starts werden als Queue-Eintr\u00e4ge abgelegt
  • die Queue kann zus\u00e4tzlich Nicht-Job-Eintr\u00e4ge enthalten (Skript, Kette, Warten)
  • Reihenfolge ist per UI/API \u00e4nderbar
"},{"location":"pipeline/workflow/#abbruch-wiederaufnahme-neustart","title":"Abbruch, Wiederaufnahme, Neustart","text":"
  • Abbrechen: laufenden Job stoppen oder Queue-Eintrag entfernen
  • Retry Rippen: Fehler-/Abbruch-Job erneut starten
  • RAW neu encodieren: aus vorhandenem RAW neu encodieren
  • Review neu starten: Review aus RAW neu aufbauen
  • Encode neu starten: 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-felder-in-settings","title":"Relevante Felder in Settings","text":"Feldname in der GUI Bedeutung HandBrake Kommando CLI-Binary HandBrake Preset (Blu-ray/DVD) profilspezifisches Preset HandBrake Extra Args (Blu-ray/DVD) profilspezifische Zusatzargumente Ausgabeformat (Blu-ray/DVD) Dateiendung der finalen Datei Encode-Neustart: unvollst\u00e4ndige Ausgabe l\u00f6schen 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 in Settings ein MakeMKV Key gesetzt ist, f\u00fchrt Ripster vor Analyse/Rip aus:

makemkvcon reg <key>\n
"},{"location":"tools/makemkv/#relevante-felder-in-settings","title":"Relevante Felder in Settings","text":"Feldname in der GUI Bedeutung MakeMKV Kommando CLI-Binary MakeMKV Source Index Source-Index im Auto-Modus Minimale Titellaenge (Minuten) Mindestlaufzeitfilter MakeMKV Rip Modus (Blu-ray/DVD) mkv oder backup MakeMKV Analyze Extra Args (Blu-ray/DVD) Zusatzargumente f\u00fcr Analyse MakeMKV Rip Extra Args (Blu-ray/DVD) Zusatzargumente f\u00fcr 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 die produktiven Abl\u00e4ufe als Handbuch: welche Entscheidung an welcher Stelle f\u00e4llt, welche Objekte dabei entstehen (Job, Container, Child-Job) und welche Dateien in welchen Ordnern landen.

"},{"location":"workflows/#gemeinsame-grundlagen","title":"Gemeinsame Grundlagen","text":""},{"location":"workflows/#statuskette-im-normalfall","title":"Statuskette im Normalfall","text":"

Medium erkannt -> Analyse -> Metadatenauswahl -> Startbereit -> Rippen -> Mediainfo-Pruefung -> Bereit zum Encodieren -> Encodieren -> Fertig

Abweichungen:

  • bei Blu-ray/DVD mit n\u00f6tiger Playlistwahl: Mediainfo-Pruefung -> Warte auf Auswahl -> zur\u00fcck in Mediainfo-Pruefung
  • bei vorhandenem RAW: Startbereit springt direkt in Review/Pr\u00fcfung ohne neuen Laufwerks-Rip
  • bei Fehler/Abbruch: Fehler oder Abgebrochen mit Wiederanlauf-Aktionen
"},{"location":"workflows/#job-und-container-typen","title":"Job- und Container-Typen","text":"Typ Zweck Was enth\u00e4lt der Typ? Normaler Disc-Job Einzel-Film oder einzelne Disc RAW-Pfad, Output-Pfad, Logs, Review dvd_series_container logischer Serien-Container (pro Serie/Staffel) Metadatenanker, aggregierter Status \u00fcber Kinder dvd_series_child einzelne Serien-Disc oder Serien-Episode-Job eigentliche RAW-/Encode-Arbeit multipart_movie_container logischer Multipart-Film-Container Zusammenfassung f\u00fcr mehrere Film-Discs multipart_movie_child einzelne Disc innerhalb Multipart-Film Disc-spezifische RAW-/Encode-Daten

Wichtig:

  • Container sind prim\u00e4r Ordnungs- und Statusobjekte.
  • Dateien (RAW/Output) h\u00e4ngen an den Child-Jobs.
"},{"location":"workflows/#workflow-a-film-blu-raydvd","title":"Workflow A: Film (Blu-ray/DVD)","text":""},{"location":"workflows/#1-disc-analysieren-und-film-metadaten-wahlen","title":"1) Disc analysieren und Film-Metadaten w\u00e4hlen","text":"
  1. Im Ripper Analyse starten.
  2. Im Metadaten-Dialog Film ausw\u00e4hlen (OMDb bzw. manuelle Film-Metadaten).
  3. Auswahl \u00fcbernehmen.

Wirkung:

  • der Job wird als Film-Workflow gef\u00fchrt
  • Film-Fingerprint f\u00fcr Duplikaterkennung wird gebildet (IMDb oder Titel/Jahr)
"},{"location":"workflows/#2-duplikatfall-entscheiden","title":"2) Duplikatfall entscheiden","text":"

Wenn Film mit gleichem Fingerprint bereits existiert, gibt es zwei Wege:

  1. \u00dcbernahme erzwingen (allow_new): neuer unabh\u00e4ngiger Film-Job
  2. Multipart movie: neuer Job wird mit bestehendem Job in einem Multipart-Container verkn\u00fcpft

Bei Multipart gilt:

  • beide Discs brauchen unterschiedliche Disc-Nummer
  • gleiche Disc-Nummer blockiert den Vorgang (MULTIPART_DISC_ALREADY_EXISTS)
"},{"location":"workflows/#3-raw-verzeichnis-entsteht","title":"3) RAW-Verzeichnis entsteht","text":"

Ordnername basiert auf Metadaten plus Job-ID:

  • Incomplete_<Titel> (<Jahr>) - RAW - job-<id>

Zustandswechsel des RAW-Ordners:

  • beim Start: Incomplete_...
  • nach erfolgreichem Rip: Rip_Complete_...
  • nach erfolgreichem Encode: Prefix wird entfernt (final)
"},{"location":"workflows/#4-review-und-encode","title":"4) Review und Encode","text":"

In Bereit zum Encodieren:

  • Titel w\u00e4hlen
  • Audio-/Subtitle-Spuren festlegen
  • optional User-Preset
  • optional Pre-/Post-Encode-Skripte oder Ketten

Beim Start:

  • tempor\u00e4re Ausgabe in Incomplete_job-<id>/<Datei>.<ext>
  • nach Erfolg Verschiebung in finalen Zielpfad aus Film-Template
"},{"location":"workflows/#workflow-b-serie-blu-raydvd","title":"Workflow B: Serie (Blu-ray/DVD)","text":""},{"location":"workflows/#1-serienmodus-aktivieren","title":"1) Serienmodus aktivieren","text":"
  1. Disc analysieren.
  2. Im Metadaten-Dialog Serienmetadaten w\u00e4hlen (TMDb-basiert).
  3. Disc-Nummer setzen (Pflicht, ab 1).

Wirkung:

  • Workflow-Kind wird series
  • Seriencontainer wird gesucht/angelegt
  • aktueller Job wird als dvd_series_child darunter gef\u00fchrt
"},{"location":"workflows/#2-seriencontainer-und-disc-konflikte","title":"2) Seriencontainer und Disc-Konflikte","text":"

Beim Speichern wird gepr\u00fcft:

  • existiert f\u00fcr Serie/Staffel bereits ein Container?
  • existiert in diesem Container bereits dieselbe Disc-Nummer?

Wenn ja, wird blockiert (SERIES_DISC_ALREADY_EXISTS).

"},{"location":"workflows/#3-serien-raw-pfad","title":"3) Serien-RAW-Pfad","text":"

F\u00fcr Serien wird ein eigener RAW-Pfad bevorzugt:

  • Blu-ray: raw_dir_bluray_series (Fallback: raw_dir_bluray)
  • DVD: raw_dir_dvd_series (Fallback: raw_dir_dvd)

RAW-Namensbasis enth\u00e4lt Staffel/Disc (SxDy) und wird ebenfalls mit den Prefix-Phasen gef\u00fchrt:

  • Incomplete_... -> Rip_Complete_... -> final
"},{"location":"workflows/#4-serien-review-und-episoden-ausgabe","title":"4) Serien-Review und Episoden-Ausgabe","text":"

Beim Review werden Episoden-/Titelzuordnungen genutzt. Je nach Auswahl:

  • Einzel-Episode: Episode-Template
  • Multi-Episode-Titel: Multi-Episode-Template

Ausgabepfad:

  • Root: series_dir_* (Fallback auf movie_dir_*)
  • Dateiname/Unterordner aus Serien-Template
"},{"location":"workflows/#5-multi-episode-disc-als-batch","title":"5) Multi-Episode-Disc als Batch","text":"

Wenn mehrere Episoden-Titel aus einer Disc encodiert werden:

  • Ripster erzeugt Episode-Child-Jobs
  • der urspr\u00fcngliche Disc-Job dient als Batch-Anker
  • RAW-Finalisierung erfolgt erst, wenn alle Episode-Encodes abgeschlossen sind
"},{"location":"workflows/#workflow-c-multipart-film","title":"Workflow C: Multipart-Film","text":""},{"location":"workflows/#wann-dieser-flow-gedacht-ist","title":"Wann dieser Flow gedacht ist","text":"
  • gleicher Film auf mehreren Discs (z. B. Disc 1/Disc 2)
  • Zusammengeh\u00f6rigkeit soll in Historie und Detailansichten sichtbar sein
"},{"location":"workflows/#ablauf","title":"Ablauf","text":"
  1. Film-Metadaten w\u00e4hlen.
  2. Duplikatdialog -> Multipart movie.
  3. Disc-Nummern f\u00fcr bestehenden und neuen Job festlegen.

Wirkung:

  • multipart_movie_container wird angelegt oder wiederverwendet
  • beteiligte Jobs werden multipart_movie_child
  • Container f\u00fchrt gemeinsame Metadaten, Kinder f\u00fchren je Disc die eigentlichen Artefakte
"},{"location":"workflows/#workflow-d-vorhandenes-raw-raw-import","title":"Workflow D: Vorhandenes RAW / RAW-Import","text":""},{"location":"workflows/#fall-1-raw-bereits-vorhanden-bei-metadatenubernahme","title":"Fall 1: RAW bereits vorhanden bei Metadaten\u00fcbernahme","text":"

Nach Metadaten-\u00dcbernahme erkennt Ripster passende RAW-Ordner und setzt den Job auf Entscheidungsstatus.

M\u00f6glichkeiten:

  • vorhandenes RAW weiterverwenden (kein neuer Rip)
  • RAW l\u00f6schen/ignorieren und neu rippen
"},{"location":"workflows/#fall-2-orphan-raw-aus-database","title":"Fall 2: Orphan-RAW aus /database","text":"
  1. In Database RAW pr\u00fcfen.
  2. Bei orphan RAW Job anlegen.
  3. Job wird in Historie erzeugt und wie \"Disk analysieren aus RAW\" weiterverarbeitet.
"},{"location":"workflows/#workflow-e-nachbearbeitung-bestehender-jobs","title":"Workflow E: Nachbearbeitung bestehender Jobs","text":"

In Historie (Detaildialog):

Aktion Wirkung OMDb neu zuordnen Metadaten neu schreiben, Folder-Rename wird best effort angesto\u00dfen Review neu starten Titel-/Spurpr\u00fcfung aus aktuellem RAW neu aufbauen RAW neu encodieren Encode erneut aus vorhandenem RAW starten Encode neu starten letzte best\u00e4tigte Review-Einstellungen wiederverwenden Retry Rippen Rip/Analyse neu starten; alter Job-RAW kann bereinigt werden"},{"location":"workflows/#wo-landet-was-artefakt-matrix","title":"Wo landet was? (Artefakt-Matrix)","text":"Artefakt Film Serie Multipart RAW raw_dir_* bevorzugt raw_dir_*_series pro Child-Job im normalen Film-RAW-Schema Finale Ausgabe movie_dir_* + Film-Template series_dir_* (Fallback movie_dir_*) + Serien-Templates pro Child-Job normaler Film-Output Container-Datensatz nein ja (dvd_series_container) ja (multipart_movie_container) L\u00f6schvorschau in Historie einzelner Job oder Related Scope Container-/Child-bezogen mit Pfadauswahl Container-/Child-bezogen mit Pfadauswahl"},{"location":"workflows/#queue-verhalten-im-alltag","title":"Queue-Verhalten im Alltag","text":"

Die Startfreigabe h\u00e4ngt an vier Settings:

  • Max. parallele Film/Video Encodes
  • Max. parallele Audio CD Jobs
  • Max. Encodes gesamt
  • Audio CDs: Queue-Reihenfolge \u00fcberspringen

Praxis:

  • Film/Video- und Audio/CD laufen in getrennten Lanes
  • Gesamtlimit begrenzt beide gemeinsam
  • Queue kann neben Jobs auch Skript, Kette, Warten enthalten
"}]} \ No newline at end of file diff --git a/site/workflows/index.html b/site/workflows/index.html index 1960a2b..50392a0 100644 --- a/site/workflows/index.html +++ b/site/workflows/index.html @@ -1 +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. Ripper: Disc einlegen, Analyse starten
  2. Metadaten im Dialog übernehmen
  3. bei Bereit zum Encodieren Titel/Tracks prüfen
  4. Encoding starten
  5. Ergebnis in Historie kontrollieren

Workflow 2: Playlist-Entscheidung bei Blu-ray

  1. Job landet in Warte auf Auswahl
  2. im Pipeline-Status Playlist-Kandidaten vergleichen
  3. gewünschte Playlist auswählen
  4. Playlist übernehmen
  5. danach normal weiter bis Bereit zum Encodieren

Workflow 3: Mehrere Jobs mit Queue

  1. Parallel-Limit in Settings über Parallele Jobs setzen
  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 Ripper-Review Pre-/Post-Ausführungen pro Job auswählen
  4. Settings -> Cronjobs: zeitgesteuerte Ausführung konfigurieren
  5. Status im Ripper (Skript- / Cron-Status) überwachen

Workflow 6: Abbruch und Recovery

Fall A: Job wurde abgebrochen

  • im Ripper optional erzeugte RAW/Movie-Datei bereinigen
  • anschließend je nach Ziel: Retry Rippen oder Disk-Analyse neu starten

Fall B: Job steht in Bereit zum Encodieren, ist aber nicht aktive Session

  • in Historie: Im Ripper öffnen
  • im Ripper Review erneut prüfen und starten

Fall C: RAW ohne Historieneintrag

  • /database öffnen
  • Bereich Gefundene RAW-Einträge
  • Job anlegen

Workflow 7: Duplikat als Multipart Movie zusammenführen

  1. Ripper -> Metadaten auswählen für einen Film-Job
  2. bei Duplikat-Konflikt Multipart movie wählen
  3. Disc-Nummern für bestehenden und neuen Job setzen (jeweils >= 1, unterschiedlich)
  4. Metadaten übernehmen
  5. in Historie den gemeinsamen Multipart-Container prüfen

Workflow 8: Selektives Löschen in der Historie

  1. in Historie einen Job öffnen und Historieneintrag löschen
  2. Löschvorschau prüfen (RAW + Ausgabe)
  3. gewünschte RAW-/Ausgabepfade gezielt auswählen
  4. passende Aktion ausführen (Eintrag + nur RAW, Eintrag + nur ..., Eintrag + RAW + ...)

Workflow 9: Audiobook (AAX) verarbeiten

  1. Seite Audiobooks öffnen
  2. AAX-Datei hochladen
  3. Job-Konfiguration prüfen und starten
  4. Fortschritt im Job-Panel verfolgen
  5. Ergebnis im Audiobook Output Explorer und in der Historie prüfen
\ No newline at end of file + Workflows aus Nutzersicht - Ripster

Workflows aus Nutzersicht

Diese Seite beschreibt die produktiven Abläufe als Handbuch: welche Entscheidung an welcher Stelle fällt, welche Objekte dabei entstehen (Job, Container, Child-Job) und welche Dateien in welchen Ordnern landen.

Gemeinsame Grundlagen

Statuskette im Normalfall

Medium erkannt -> Analyse -> Metadatenauswahl -> Startbereit -> Rippen -> Mediainfo-Pruefung -> Bereit zum Encodieren -> Encodieren -> Fertig

Abweichungen:

  • bei Blu-ray/DVD mit nötiger Playlistwahl: Mediainfo-Pruefung -> Warte auf Auswahl -> zurück in Mediainfo-Pruefung
  • bei vorhandenem RAW: Startbereit springt direkt in Review/Prüfung ohne neuen Laufwerks-Rip
  • bei Fehler/Abbruch: Fehler oder Abgebrochen mit Wiederanlauf-Aktionen

Job- und Container-Typen

Typ Zweck Was enthält der Typ?
Normaler Disc-Job Einzel-Film oder einzelne Disc RAW-Pfad, Output-Pfad, Logs, Review
dvd_series_container logischer Serien-Container (pro Serie/Staffel) Metadatenanker, aggregierter Status über Kinder
dvd_series_child einzelne Serien-Disc oder Serien-Episode-Job eigentliche RAW-/Encode-Arbeit
multipart_movie_container logischer Multipart-Film-Container Zusammenfassung für mehrere Film-Discs
multipart_movie_child einzelne Disc innerhalb Multipart-Film Disc-spezifische RAW-/Encode-Daten

Wichtig:

  • Container sind primär Ordnungs- und Statusobjekte.
  • Dateien (RAW/Output) hängen an den Child-Jobs.

Workflow A: Film (Blu-ray/DVD)

1) Disc analysieren und Film-Metadaten wählen

  1. Im Ripper Analyse starten.
  2. Im Metadaten-Dialog Film auswählen (OMDb bzw. manuelle Film-Metadaten).
  3. Auswahl übernehmen.

Wirkung:

  • der Job wird als Film-Workflow geführt
  • Film-Fingerprint für Duplikaterkennung wird gebildet (IMDb oder Titel/Jahr)

2) Duplikatfall entscheiden

Wenn Film mit gleichem Fingerprint bereits existiert, gibt es zwei Wege:

  1. Übernahme erzwingen (allow_new): neuer unabhängiger Film-Job
  2. Multipart movie: neuer Job wird mit bestehendem Job in einem Multipart-Container verknüpft

Bei Multipart gilt:

  • beide Discs brauchen unterschiedliche Disc-Nummer
  • gleiche Disc-Nummer blockiert den Vorgang (MULTIPART_DISC_ALREADY_EXISTS)

3) RAW-Verzeichnis entsteht

Ordnername basiert auf Metadaten plus Job-ID:

  • Incomplete_<Titel> (<Jahr>) - RAW - job-<id>

Zustandswechsel des RAW-Ordners:

  • beim Start: Incomplete_...
  • nach erfolgreichem Rip: Rip_Complete_...
  • nach erfolgreichem Encode: Prefix wird entfernt (final)

4) Review und Encode

In Bereit zum Encodieren:

  • Titel wählen
  • Audio-/Subtitle-Spuren festlegen
  • optional User-Preset
  • optional Pre-/Post-Encode-Skripte oder Ketten

Beim Start:

  • temporäre Ausgabe in Incomplete_job-<id>/<Datei>.<ext>
  • nach Erfolg Verschiebung in finalen Zielpfad aus Film-Template

Workflow B: Serie (Blu-ray/DVD)

1) Serienmodus aktivieren

  1. Disc analysieren.
  2. Im Metadaten-Dialog Serienmetadaten wählen (TMDb-basiert).
  3. Disc-Nummer setzen (Pflicht, ab 1).

Wirkung:

  • Workflow-Kind wird series
  • Seriencontainer wird gesucht/angelegt
  • aktueller Job wird als dvd_series_child darunter geführt

2) Seriencontainer und Disc-Konflikte

Beim Speichern wird geprüft:

  • existiert für Serie/Staffel bereits ein Container?
  • existiert in diesem Container bereits dieselbe Disc-Nummer?

Wenn ja, wird blockiert (SERIES_DISC_ALREADY_EXISTS).

3) Serien-RAW-Pfad

Für Serien wird ein eigener RAW-Pfad bevorzugt:

  • Blu-ray: raw_dir_bluray_series (Fallback: raw_dir_bluray)
  • DVD: raw_dir_dvd_series (Fallback: raw_dir_dvd)

RAW-Namensbasis enthält Staffel/Disc (SxDy) und wird ebenfalls mit den Prefix-Phasen geführt:

  • Incomplete_... -> Rip_Complete_... -> final

4) Serien-Review und Episoden-Ausgabe

Beim Review werden Episoden-/Titelzuordnungen genutzt. Je nach Auswahl:

  • Einzel-Episode: Episode-Template
  • Multi-Episode-Titel: Multi-Episode-Template

Ausgabepfad:

  • Root: series_dir_* (Fallback auf movie_dir_*)
  • Dateiname/Unterordner aus Serien-Template

5) Multi-Episode-Disc als Batch

Wenn mehrere Episoden-Titel aus einer Disc encodiert werden:

  • Ripster erzeugt Episode-Child-Jobs
  • der ursprüngliche Disc-Job dient als Batch-Anker
  • RAW-Finalisierung erfolgt erst, wenn alle Episode-Encodes abgeschlossen sind

Workflow C: Multipart-Film

Wann dieser Flow gedacht ist

  • gleicher Film auf mehreren Discs (z. B. Disc 1/Disc 2)
  • Zusammengehörigkeit soll in Historie und Detailansichten sichtbar sein

Ablauf

  1. Film-Metadaten wählen.
  2. Duplikatdialog -> Multipart movie.
  3. Disc-Nummern für bestehenden und neuen Job festlegen.

Wirkung:

  • multipart_movie_container wird angelegt oder wiederverwendet
  • beteiligte Jobs werden multipart_movie_child
  • Container führt gemeinsame Metadaten, Kinder führen je Disc die eigentlichen Artefakte

Workflow D: Vorhandenes RAW / RAW-Import

Fall 1: RAW bereits vorhanden bei Metadatenübernahme

Nach Metadaten-Übernahme erkennt Ripster passende RAW-Ordner und setzt den Job auf Entscheidungsstatus.

Möglichkeiten:

  • vorhandenes RAW weiterverwenden (kein neuer Rip)
  • RAW löschen/ignorieren und neu rippen

Fall 2: Orphan-RAW aus /database

  1. In Database RAW prüfen.
  2. Bei orphan RAW Job anlegen.
  3. Job wird in Historie erzeugt und wie "Disk analysieren aus RAW" weiterverarbeitet.

Workflow E: Nachbearbeitung bestehender Jobs

In Historie (Detaildialog):

Aktion Wirkung
OMDb neu zuordnen Metadaten neu schreiben, Folder-Rename wird best effort angestoßen
Review neu starten Titel-/Spurprüfung aus aktuellem RAW neu aufbauen
RAW neu encodieren Encode erneut aus vorhandenem RAW starten
Encode neu starten letzte bestätigte Review-Einstellungen wiederverwenden
Retry Rippen Rip/Analyse neu starten; alter Job-RAW kann bereinigt werden

Wo landet was? (Artefakt-Matrix)

Artefakt Film Serie Multipart
RAW raw_dir_* bevorzugt raw_dir_*_series pro Child-Job im normalen Film-RAW-Schema
Finale Ausgabe movie_dir_* + Film-Template series_dir_* (Fallback movie_dir_*) + Serien-Templates pro Child-Job normaler Film-Output
Container-Datensatz nein ja (dvd_series_container) ja (multipart_movie_container)
Löschvorschau in Historie einzelner Job oder Related Scope Container-/Child-bezogen mit Pfadauswahl Container-/Child-bezogen mit Pfadauswahl

Queue-Verhalten im Alltag

Die Startfreigabe hängt an vier Settings:

  • Max. parallele Film/Video Encodes
  • Max. parallele Audio CD Jobs
  • Max. Encodes gesamt
  • Audio CDs: Queue-Reihenfolge überspringen

Praxis:

  • Film/Video- und Audio/CD laufen in getrennten Lanes
  • Gesamtlimit begrenzt beide gemeinsam
  • Queue kann neben Jobs auch Skript, Kette, Warten enthalten
\ No newline at end of file