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

"},{"location":"api/crons/#websocket-events-zu-cron","title":"WebSocket-Events zu Cron","text":""},{"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":""},{"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:

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

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.

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

"},{"location":"api/settings/#skript-ketten","title":"Skript-Ketten","text":"

Basis: /api/settings/script-chains

Eine Kette hat Schritte vom Typ:

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

"},{"location":"appendix/","title":"Technischer Anhang","text":"

Dieser Bereich enth\u00e4lt die technische Referenz hinter dem Benutzerhandbuch.

"},{"location":"appendix/#inhalt","title":"Inhalt","text":""},{"location":"appendix/#wann-du-in-den-anhang-wechselst","title":"Wann du in den Anhang wechselst","text":""},{"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":""},{"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":""},{"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":""},{"location":"architecture/backend/#pipelineservicejs","title":"pipelineService.js","text":"

Zentrale Workflow-Orchestrierung.

Aufgaben:

Wichtige Methoden:

"},{"location":"architecture/backend/#diskdetectionservicejs","title":"diskDetectionService.js","text":"

Pollt Laufwerk(e) und emittiert:

Zusatz:

"},{"location":"architecture/backend/#settingsservicejs","title":"settingsService.js","text":"

Settings-Layer mit Validation/Serialisierung.

Features:

"},{"location":"architecture/backend/#historyservicejs","title":"historyService.js","text":"

Historie + Dateioperationen.

Features:

"},{"location":"architecture/backend/#audiobookservicejs","title":"audiobookService.js","text":"

Audiobook-Verarbeitung (AAX/M4B).

Features:

"},{"location":"architecture/backend/#activationbytesservicejs","title":"activationBytesService.js","text":"

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

Features:

"},{"location":"architecture/backend/#converterscanservicejs","title":"converterScanService.js","text":"

Dateisystem-\u00dcberwachung des Converter-Eingangsordners.

Features:

"},{"location":"architecture/backend/#downloadservicejs","title":"downloadService.js","text":"

Download-Queue f\u00fcr Ausgabedateien aus der Historie.

Features:

"},{"location":"architecture/backend/#cronservicejs","title":"cronService.js","text":"

Integriertes Cron-System ohne externe Parser-Library.

Features:

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

Limits:

Vollst\u00e4ndige API-Dokumentation: Runtime Activities API

"},{"location":"architecture/backend/#weitere-services","title":"Weitere Services","text":""},{"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:

Typische job_kind-Werte:

Wichtige Indizes:

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

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

"},{"location":"architecture/database/#pipeline_state","title":"pipeline_state","text":"

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

"},{"location":"architecture/database/#settings_schema-settings_values","title":"settings_schema + settings_values","text":""},{"location":"architecture/database/#scripts-script_chains-script_chain_steps","title":"scripts, script_chains, script_chain_steps","text":""},{"location":"architecture/database/#user_presets","title":"user_presets","text":"

Benannte HandBrake-Preset-Sets:

"},{"location":"architecture/database/#cron_jobs-cron_run_logs","title":"cron_jobs + cron_run_logs","text":""},{"location":"architecture/database/#aax_activation_bytes","title":"aax_activation_bytes","text":"

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

Felder:

"},{"location":"architecture/database/#user_prefs","title":"user_prefs","text":"

Benutzer-spezifische Einstellungen (Key-Value).

Felder:

"},{"location":"architecture/database/#converter_scan_entries","title":"converter_scan_entries","text":"

DB-seitige Erfassung gescannter Dateien im Converter-Eingangsordner.

Felder:

"},{"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/#ripperpagejsx","title":"RipperPage.jsx","text":"

Pipeline-Steuerung:

"},{"location":"architecture/frontend/#settingspagejsx","title":"SettingsPage.jsx","text":"

Konfiguration:

"},{"location":"architecture/frontend/#historypagejsx","title":"HistoryPage.jsx","text":"

Historie:

"},{"location":"architecture/frontend/#converterpagejsx","title":"ConverterPage.jsx","text":"

Datei-Converter:

"},{"location":"architecture/frontend/#audiobookspagejsx","title":"AudiobooksPage.jsx","text":"

Dedizierter AAX-/Audiobook-Flow:

"},{"location":"architecture/frontend/#downloadspagejsx","title":"DownloadsPage.jsx","text":"

Download-Queue:

"},{"location":"architecture/frontend/#databasepagejsx","title":"DatabasePage.jsx","text":"

Expert-Modus:

"},{"location":"architecture/frontend/#wichtige-komponenten","title":"Wichtige Komponenten","text":""},{"location":"architecture/frontend/#api-client-apiclientjs","title":"API-Client (api/client.js)","text":""},{"location":"architecture/frontend/#websocket-hooksusewebsocketjs","title":"WebSocket (hooks/useWebSocket.js)","text":"

In App.jsx werden u. a. verarbeitet:

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

"},{"location":"architecture/overview/#prozessausfuhrung","title":"Prozessausf\u00fchrung","text":"

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

"},{"location":"architecture/overview/#persistenz","title":"Persistenz","text":"

SQLite-Datei: backend/data/ripster.db

Kern-Tabellen:

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":""},{"location":"configuration/","title":"Anhang: Konfiguration","text":"

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

"},{"location":"configuration/#inhalte","title":"Inhalte","text":""},{"location":"configuration/#zuruck-zum-handbuch","title":"Zur\u00fcck zum Handbuch","text":""},{"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 den aktuellen Stand der Settings auf Basis von settings_schema und der aktiven GUI-Logik.

"},{"location":"configuration/settings-reference/#wichtiges-verhalten-in-der-gui","title":"Wichtiges Verhalten in der GUI","text":""},{"location":"configuration/settings-reference/#fallbacks-und-pfadaufloesung","title":"Fallbacks und Pfadaufloesung","text":""},{"location":"configuration/settings-reference/#vollstaendige-feldliste","title":"Vollstaendige Feldliste","text":""},{"location":"configuration/settings-reference/#kategorie-benachrichtigungen","title":"Kategorie: Benachrichtigungen","text":"GUI-Feld Key Typ Default Sichtbarkeit Wirkung im System Expertenmodus ui_expert_mode boolean false Standard Schaltet erweiterte Einstellungen in der UI ein. PushOver aktiviert pushover_enabled boolean false Standard Master-Schalter f\u00fcr PushOver Versand. PushOver Token pushover_token string leer Standard Application Token f\u00fcr PushOver. PushOver User pushover_user string leer Standard User-Key f\u00fcr PushOver. PushOver Device (optional) pushover_device string leer Expertenmodus Optionales Ziel-Device in PushOver. PushOver Titel-Pr\u00e4fix pushover_title_prefix string Ripster Standard Prefix im PushOver Titel. PushOver Priority pushover_priority number 0 Expertenmodus Priorit\u00e4t -2 bis 2. PushOver Timeout (ms) pushover_timeout_ms number 7000 Expertenmodus HTTP Timeout f\u00fcr PushOver Requests. Bei manueller Auswahl senden pushover_notify_metadata_ready boolean true Standard Sendet, wenn ein Job eine manuelle Auswahl/Entscheidung ben\u00f6tigt (z.B. Metadaten, Titel oder Playlist). Bei Rip-Start senden pushover_notify_rip_started boolean true Standard Sendet beim Start des MakeMKV-Rips. Bei Encode-Start senden pushover_notify_encoding_started boolean true Standard Sendet beim Start von HandBrake. Bei Erfolg senden pushover_notify_job_finished boolean true Standard Sendet bei erfolgreich abgeschlossenem Job. Bei Fehler senden pushover_notify_job_error boolean true Standard Sendet bei Fehlern in der Pipeline. Bei Abbruch senden pushover_notify_job_cancelled boolean true Standard Sendet wenn Job manuell abgebrochen wurde. Bei Re-Encode Start senden pushover_notify_reencode_started boolean true Standard Sendet beim Start von RAW Re-Encode. Bei Re-Encode Erfolg senden pushover_notify_reencode_finished boolean true Standard Sendet bei erfolgreichem RAW Re-Encode."},{"location":"configuration/settings-reference/#kategorie-converter","title":"Kategorie: Converter","text":"GUI-Feld Key Typ Default Sichtbarkeit Wirkung im System Erlaubte Datei-Endungen converter_scan_extensions string mkv,mp4,m2ts,iso,avi,mov,flac,mp3,aac,wav,m4a,ogg,opus Standard Komma-getrennte Liste erlaubter Dateiendungen f\u00fcr den Scan (ohne Punkt). Auto-Scan (Polling) converter_polling_enabled boolean false Standard Converter Raw-Ordner automatisch in regelm\u00e4\u00dfigen Abst\u00e4nden scannen. Polling-Intervall (Sekunden) converter_polling_interval number 300 Standard Intervall f\u00fcr automatischen Scan des Converter-Ordners."},{"location":"configuration/settings-reference/#kategorie-laufwerk","title":"Kategorie: Laufwerk","text":"GUI-Feld Key Typ Default Sichtbarkeit Wirkung im System Laufwerksmodus drive_mode select auto Standard Auto-Discovery oder explizites Device. Explizite Laufwerke drive_devices path [] Standard Laufwerke f\u00fcr den expliziten Modus als JSON-Array mit Pfad und MakeMKV-Index, z.B. [{\"path\":\"/dev/sr0\",\"makemkvIndex\":0},{\"path\":\"/dev/sr1\",\"makemkvIndex\":1}]. Nur relevant wenn Modus = Explizites Device. Device Pfad drive_device path /dev/sr0 Ausgeblendet (nur API/DB) Nur f\u00fcr expliziten Modus, z.B. /dev/sr0. MakeMKV Source Index makemkv_source_index number 0 Ausgeblendet (nur API/DB) Disc Index im Auto-Modus. Automatische Disk-Erkennung disc_auto_detection_enabled boolean true Standard 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 Expertenmodus Intervall f\u00fcr Disk-Erkennung. Laufwerk nach Rip auswerfen auto_eject_after_rip boolean false Standard Wenn aktiv, wird das Laufwerk nach erfolgreichem Abschluss eines Rip-Vorgangs automatisch ausgeworfen (eject)."},{"location":"configuration/settings-reference/#kategorie-logging","title":"Kategorie: Logging","text":"GUI-Feld Key Typ Default Sichtbarkeit Wirkung im System Terminal-Ausgabe aktiv server_console_log_output_enabled boolean true Expertenmodus Master-Schalter f\u00fcr die Ausgabe der Server-Logs im Terminal (z.B. start.sh). Das Schreiben in Log-Dateien bleibt immer aktiv. HTTP-Logs im Terminal server_console_log_http_enabled boolean true Expertenmodus Steuert HTTP Request-Logs im Terminal (z.B. request:start). Dateilogs bleiben unver\u00e4ndert. DEBUG im Terminal server_console_log_debug_enabled boolean true Expertenmodus Steuert DEBUG-Meldungen in der Terminal-Ausgabe. Dateilogs bleiben unver\u00e4ndert. INFO im Terminal server_console_log_info_enabled boolean true Expertenmodus Steuert INFO-Meldungen in der Terminal-Ausgabe. Dateilogs bleiben unver\u00e4ndert. WARN im Terminal server_console_log_warn_enabled boolean true Expertenmodus Steuert WARN-Meldungen in der Terminal-Ausgabe. Dateilogs bleiben unver\u00e4ndert. ERROR im Terminal server_console_log_error_enabled boolean true Expertenmodus Steuert ERROR-Meldungen in der Terminal-Ausgabe. Dateilogs bleiben unver\u00e4ndert."},{"location":"configuration/settings-reference/#kategorie-metadaten","title":"Kategorie: Metadaten","text":"GUI-Feld Key Typ Default Sichtbarkeit Wirkung im System TMDb Read Access Token tmdb_api_read_access_token string leer Standard Read Access Token f\u00fcr Serien-Metadaten \u00fcber TheMovieDB (TMDb). Film-Sprache dvd_series_language string de-DE Standard Bevorzugte TMDb-Sprache f\u00fcr Film- und Serienmetadaten (DVD/Blu-ray), z.B. de-DE oder en-US. Fallback Sprache dvd_series_fallback_languages string de-DE,en-US Standard Kommagetrennte TMDb-Fallback-Sprachen f\u00fcr Film- und Serienmetadaten (DVD/Blu-ray), z.B. de-DE,en-US,fr-FR. Coverart-Nachladen aktiv coverart_recovery_enabled boolean true Standard Wenn aktiv, werden fehlende Coverarts automatisch in Intervallen gepr\u00fcft und nachgeladen. Coverart-Pr\u00fcfintervall (Stunden) coverart_recovery_interval_hours number 6 Standard Intervall f\u00fcr automatische Pr\u00fcfung fehlender Coverarts in Stunden. NFO nach Encode erzeugen generate_nfo_after_encode boolean false Standard Erstellt nach erfolgreichem Encode automatisch eine .nfo-Datei neben der Ausgabedatei."},{"location":"configuration/settings-reference/#kategorie-monitoring","title":"Kategorie: Monitoring","text":"GUI-Feld Key Typ Default Sichtbarkeit Wirkung im System Hardware Monitoring aktiviert hardware_monitoring_enabled boolean true Standard Master-Schalter: aktiviert/deaktiviert das komplette Hardware-Monitoring (Polling + Berechnung + WebSocket-Updates). Hardware Monitoring Intervall (ms) hardware_monitoring_interval_ms number 5000 Expertenmodus Polling-Intervall f\u00fcr CPU/RAM/GPU/Storage-Metriken."},{"location":"configuration/settings-reference/#kategorie-pfade","title":"Kategorie: Pfade","text":"GUI-Feld Key Typ Default Sichtbarkeit Wirkung im System Raw Ausgabeordner (Blu-ray) raw_dir_bluray path leer Standard Optionaler RAW-Zielpfad nur f\u00fcr Blu-ray. Leer = Fallback auf \"Raw Ausgabeordner\". Raw Ausgabeordner (DVD) raw_dir_dvd path leer Standard Optionaler RAW-Zielpfad nur f\u00fcr DVD. Leer = Fallback auf \"Raw Ausgabeordner\". CD RAW-Ordner raw_dir_cd path leer Standard Basisordner f\u00fcr rohe CD-WAV-Dateien (cdparanoia-Output). Leer = Standardpfad (data/output/cd). Audiobook RAW-Ordner raw_dir_audiobook path leer Standard Basisordner f\u00fcr hochgeladene AAX-Dateien. Leer = Standardpfad (data/output/audiobook-raw). Serien-Ordner (Blu-ray) series_dir_bluray path leer Standard Zielordner f\u00fcr Blu-ray-Serienfolgen. Leer = Standardpfad (data/output/series). Film Ausgabeordner (Blu-ray) movie_dir_bluray path leer Standard Optionaler Encode-Zielpfad nur f\u00fcr Blu-ray. Leer = Fallback auf \"Film Ausgabeordner\". Film Ausgabeordner (DVD) movie_dir_dvd path leer Standard Optionaler Encode-Zielpfad nur f\u00fcr DVD. Leer = Fallback auf \"Film Ausgabeordner\". Serien-Ordner (DVD) series_dir_dvd path leer Standard Zielordner f\u00fcr DVD-Serienfolgen. Leer = Standardpfad (data/output/series). CD Output-Ordner movie_dir_cd path leer Standard Zielordner f\u00fcr encodierte CD-Ausgaben (FLAC, MP3 usw.). Leer = gleicher Ordner wie CD RAW-Ordner. Audiobook Output-Ordner movie_dir_audiobook path leer Standard Zielordner f\u00fcr encodierte Audiobook-Dateien. Leer = Standardpfad (data/output/audiobooks). Download ZIP-Ordner download_dir path leer Standard Zielordner f\u00fcr vorbereitete ZIP-Downloads. Leer = Standardpfad (data/downloads). Externe Speicher external_storage_paths path [] Standard Wird links unter \"Freie Speicher\" angezeigt. Log Ordner log_dir path installationsabhaengig Standard 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} Standard Template f\u00fcr relative CD-Ausgabepfade ohne Dateiendung. Platzhalter: {artist}, {album}, {year}, {title}, {trackNr}, {trackNo}. Unterordner sind \u00fcber \"/\" m\u00f6glich. Die Endung wird \u00fcber das gew\u00e4hlte Ausgabeformat gesetzt. Output Template (Blu-ray) output_template_bluray string ${title} (${year})/${title} (${year}) Standard 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} Standard 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}) Standard 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}) Standard 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}/Season {seasonNr}/{seriesTitle} - S{seasonNo}E{episodeNo} - {episodeTitle} Standard 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}/Season {seasonNr}/{seriesTitle} - S{seasonNo}E{episodeRange} Standard 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}) Standard 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}) Standard Template f\u00fcr relative Audiobook-RAW-Ordner. Platzhalter: {author}, {title}, {year}, {narrator}, {series}, {part}. Converter Raw-Ordner converter_raw_dir path leer Standard 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 Standard Ausgabepfad f\u00fcr konvertierte Video-Dateien. Leer = Standardpfad (data/output/converted-movies). Converter Ausgabe (Audio) converter_audio_dir path leer Standard Ausgabepfad f\u00fcr konvertierte Audio-Dateien. Leer = Standardpfad (data/output/converted-audio). Output-Template (Video) converter_output_template_video string {title} Standard Dateiname-Template f\u00fcr konvertierte Video-Dateien (ohne Endung). Platzhalter: {title}, {year}. Output-Template (Audio) converter_output_template_audio string {artist} - {title} Standard 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 Standard 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 Standard 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 Standard Eigent\u00fcmer der Dateien im Format user:gruppe. Nur aktiv wenn ein alternativer Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. RAW-Ordner (DVD Serie) raw_dir_dvd_series path leer Standard 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 Standard 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 Standard Eigent\u00fcmer der Dateien im Format user:gruppe. Nur aktiv wenn ein alternativer Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer CD RAW-Ordner raw_dir_cd_owner string leer Standard Eigent\u00fcmer der Dateien im Format user:gruppe. Nur aktiv wenn ein alternativer Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Audiobook RAW-Ordner raw_dir_audiobook_owner string leer Standard Eigent\u00fcmer der Audiobook-RAW-Dateien im Format user:gruppe. Nur aktiv wenn ein Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Converter RAW-Ordner converter_raw_dir_owner string leer Standard Eigent\u00fcmer der Converter-Eingabedateien im Format user:gruppe. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Serien-Ordner (Blu-ray) series_dir_bluray_owner string leer Standard 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 Standard Eigent\u00fcmer der Dateien im Format user:gruppe. Nur aktiv wenn ein alternativer Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Film-Ordner (DVD) movie_dir_dvd_owner string leer Standard Eigent\u00fcmer der Dateien im Format user:gruppe. Nur aktiv wenn ein alternativer Pfad gesetzt ist. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Serien-Ordner (DVD) series_dir_dvd_owner string leer Standard Eigent\u00fcmer der DVD-Serienausgaben im Format user:gruppe. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer CD Output-Ordner movie_dir_cd_owner string leer Standard 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 Standard Eigent\u00fcmer der encodierten Audiobook-Dateien im Format user:gruppe. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Converter Video Output-Ordner converter_movie_dir_owner string leer Standard Eigent\u00fcmer der konvertierten Video-Dateien im Format user:gruppe. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Converter Audio Output-Ordner converter_audio_dir_owner string leer Standard Eigent\u00fcmer der konvertierten Audio-Dateien im Format user:gruppe. Leer = Standardbenutzer des Dienstes. Eigent\u00fcmer Download ZIP-Ordner download_dir_owner string leer Standard Eigent\u00fcmer der vorbereiteten ZIP-Dateien im Format user:gruppe. Leer = Standardbenutzer des Dienstes. Kapitel Template (Audiobook) output_chapter_template_audiobook string {author}/{author} - {title} ({year})/{chapterNr} {chapterTitle} Standard Template f\u00fcr kapitelweise Audiobook-Ausgaben (MP3/FLAC) ohne Dateiendung. Platzhalter: {author}, {title}, {year}, {narrator}, {series}, {part}, {format}, {chapterNr}, {chapterNo}, {chapterTitle}. Unterordner sind \u00fcber \"/\" m\u00f6glich."},{"location":"configuration/settings-reference/#kategorie-tools","title":"Kategorie: Tools","text":"GUI-Feld Key Typ Default Sichtbarkeit Wirkung im System MakeMKV Kommando makemkv_command string makemkvcon Expertenmodus Pfad oder Befehl f\u00fcr makemkvcon. MakeMKV Key makemkv_registration_key string leer Standard Optionaler Registrierungsschl\u00fcssel. Wird beim Speichern nach ~/.MakeMKV/settings.conf synchronisiert. Darunter kann der aktuelle Betakey per API \u00fcbernommen werden. Mediainfo Kommando mediainfo_command string mediainfo Expertenmodus Pfad oder Befehl f\u00fcr mediainfo. Minimale Titell\u00e4nge (Minuten) makemkv_min_length_minutes number 60 Standard Filtert kurze Titel beim Rip. HandBrake Kommando handbrake_command string HandBrakeCLI Expertenmodus Pfad oder Befehl f\u00fcr HandBrakeCLI. Encode-Neustart: unvollst\u00e4ndige Ausgabe l\u00f6schen handbrake_restart_delete_incomplete_output boolean true Standard Wenn aktiv, wird bei \"Encode neu starten\" der bisherige (nicht erfolgreiche) Output vor Start entfernt. Parallele Jobs pipeline_max_parallel_jobs number 1 Standard Maximale Anzahl parallel laufender Jobs. Weitere Starts landen in der Queue. Max. parallele Audio CD Jobs pipeline_max_parallel_cd_encodes number 2 Standard Maximale Anzahl parallel laufender Audio CD Jobs (Rip + Encode als Einheit). Gilt zus\u00e4tzlich zum Gesamtlimit. Script-Test Timeout (ms) script_test_timeout_ms number 0 Expertenmodus Timeout fuer Script-Tests in den Settings. 0 = kein Timeout. Max. Encodes gesamt (medienunabh\u00e4ngig) pipeline_max_total_encodes number 3 Standard 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 Standard Wenn aktiv, k\u00f6nnen Audio CD Jobs unabh\u00e4ngig von Film-Jobs starten (\u00fcberspringen die Film-Queue-Reihenfolge). Einzellimits und Gesamtlimit gelten weiterhin. cdparanoia Kommando cdparanoia_command string cdparanoia Expertenmodus Pfad oder Befehl f\u00fcr cdparanoia. Wird als Fallback genutzt wenn kein individuelles Kommando gesetzt ist. FFmpeg Kommando ffmpeg_command string ffmpeg Standard Pfad oder Befehl f\u00fcr ffmpeg. Wird f\u00fcr Audiobook-Encoding genutzt. FFprobe Kommando ffprobe_command string ffprobe Standard Pfad oder Befehl f\u00fcr ffprobe. Wird f\u00fcr Audiobook-Metadaten und Kapitel genutzt. Serie: PlayAll Untergrenze (%) series_playall_tolerance_lower_pct number 10 Standard Untere Toleranz in Prozent f\u00fcr die Plausibilit\u00e4tspr\u00fcfung von PlayAll gegen Episodensumme (DVD/Blu-ray). Serie: PlayAll Obergrenze (%) series_playall_tolerance_upper_pct number 10 Standard Obere Toleranz in Prozent f\u00fcr die Plausibilit\u00e4tspr\u00fcfung von PlayAll gegen Episodensumme (DVD/Blu-ray). Mediainfo Extra Args mediainfo_extra_args_bluray string leer Expertenmodus Zus\u00e4tzliche CLI-Parameter f\u00fcr mediainfo (Blu-ray). MakeMKV Rip Modus makemkv_rip_mode_bluray select backup Ausgeblendet (nur API/DB) mkv: direkte MKV-Dateien; backup: vollst\u00e4ndige Blu-ray Struktur im RAW-Ordner. MakeMKV Analyze Extra Args makemkv_analyze_extra_args_bluray string leer Expertenmodus Zus\u00e4tzliche CLI-Parameter f\u00fcr Analyze (Blu-ray). MakeMKV Rip Extra Args makemkv_rip_extra_args_bluray string leer Expertenmodus Zus\u00e4tzliche CLI-Parameter f\u00fcr Rip (Blu-ray). HandBrake Preset handbrake_preset_bluray string H.264 MKV 1080p30 Standard Preset Name f\u00fcr -Z (Blu-ray). Leer = kein Preset, nur CLI-Parameter werden verwendet. HandBrake Extra Args handbrake_extra_args_bluray string --audio-lang-list deu,eng --first-audio --subtitle-lang-list deu,eng --first-subtitle --aencoder copy --audio-copy-mask ac3,eac3,dts --au... Standard Zus\u00e4tzliche CLI-Argumente (Blu-ray). Ausgabeformat output_extension_bluray select mkv Standard Dateiendung f\u00fcr finale Datei (Blu-ray). Mediainfo Extra Args mediainfo_extra_args_dvd string leer Expertenmodus Zus\u00e4tzliche CLI-Parameter f\u00fcr mediainfo (DVD). MakeMKV Rip Modus makemkv_rip_mode_dvd select mkv Ausgeblendet (nur API/DB) mkv: direkte MKV-Dateien; backup: vollst\u00e4ndige Disc-Struktur im RAW-Ordner. MakeMKV Analyze Extra Args makemkv_analyze_extra_args_dvd string leer Expertenmodus Zus\u00e4tzliche CLI-Parameter f\u00fcr Analyze (DVD). MakeMKV Rip Extra Args makemkv_rip_extra_args_dvd string leer Expertenmodus Zus\u00e4tzliche CLI-Parameter f\u00fcr Rip (DVD). HandBrake Preset handbrake_preset_dvd string H.264 MKV 480p30 Standard Preset Name f\u00fcr -Z (DVD). Leer = kein Preset, nur CLI-Parameter werden verwendet. HandBrake Extra Args handbrake_extra_args_dvd string --audio-lang-list deu,eng --first-audio --subtitle-lang-list deu,eng --first-subtitle --aencoder copy --audio-copy-mask ac3,eac3,dts --au... Standard Zus\u00e4tzliche CLI-Argumente (DVD). Ausgabeformat output_extension_dvd select mkv Standard Dateiendung f\u00fcr finale Datei (DVD). mkvmerge Kommando mkvmerge_command string mkvmerge Standard Pfad oder Befehl f\u00fcr mkvmerge. Wird f\u00fcr Multipart-Movie-Merges genutzt."},{"location":"configuration/settings-reference/#beispiele-fuer-haeufige-settings","title":"Beispiele fuer haeufige Settings","text":""},{"location":"configuration/settings-reference/#hinweise-zu-ausgeblendeten-keys","title":"Hinweise zu ausgeblendeten Keys","text":"

Folgende Keys liegen im Schema, sind aber im normalen Settings-Formular absichtlich ausgeblendet: drive_device, makemkv_source_index, makemkv_rip_mode_bluray, makemkv_rip_mode_dvd. Aenderungen daran erfolgen nur ueber API/DB oder technische Migrationen.

"},{"location":"deployment/","title":"Anhang: Deployment","text":"

Technische Betriebsdokumentation f\u00fcr Entwicklung und Produktion.

"},{"location":"deployment/development/","title":"Entwicklungsumgebung","text":""},{"location":"deployment/development/#voraussetzungen","title":"Voraussetzungen","text":""},{"location":"deployment/development/#schnellstart","title":"Schnellstart","text":"
./start.sh\n

Startet:

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:

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

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:

F\u00fcr Serien zus\u00e4tzlich:

"},{"location":"getting-started/configuration/#3-queue-verhalten-definieren","title":"3) Queue-Verhalten definieren","text":"

Stelle ein:

Damit steuerst du Durchsatz, Priorit\u00e4t und Lastverteilung.

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

Film:

Serien:

CD/Audiodaten:

"},{"location":"getting-started/configuration/#5-optional-benachrichtigungen","title":"5) Optional: Benachrichtigungen","text":""},{"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":""},{"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":""},{"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:

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

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

Details: Entwicklungsumgebung

"},{"location":"getting-started/prerequisites/#abschluss-checkliste","title":"Abschluss-Checkliste","text":""},{"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:

"},{"location":"getting-started/quickstart/#2-analyse-starten","title":"2) Analyse starten","text":"

Aktion:

Erwartung:

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

"},{"location":"getting-started/quickstart/#4-ripreview-phase","title":"4) Rip/Review-Phase","text":"

Normalfall:

M\u00f6gliche Alternativen:

"},{"location":"getting-started/quickstart/#5-encode-review-abschlieen","title":"5) Encode-Review abschlie\u00dfen","text":"

Bei Bereit zum Encodieren:

Dann:

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

W\u00e4hrend Encodieren:

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

"},{"location":"getting-started/quickstart/#8-typische-folgeaktionen","title":"8) Typische Folgeaktionen","text":""},{"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 Ripper Live-Steuerung der Pipeline Disc-Flow starten, Queue steuern, Review freigeben Audiobooks AAX-Spezialflow Upload, Jobkonfiguration 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. Ripper oder Converter/Audiobooks: neue Arbeit starten.
  2. Historie: Ergebnisse validieren und ggf. nachbearbeiten.
  3. Downloads: Exporte f\u00fcr externe \u00dcbergabe erzeugen.
  4. Settings: Regeln und Limits nur kontrolliert anpassen.
"},{"location":"gui/#navigation","title":"Navigation","text":"

Direkt in der Top-Navigation:

Nur per URL:

"},{"location":"gui/audiobooks/","title":"Audiobooks","text":"

Die Seite Audiobooks ist der spezialisierte Workflow f\u00fcr Audible-*.aax-Dateien.

"},{"location":"gui/audiobooks/#seitenstruktur","title":"Seitenstruktur","text":"

Die Oberfl\u00e4che besteht aus zwei Hauptbereichen:

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

Der Upload akzeptiert ausschlie\u00dflich .aax.

"},{"location":"gui/audiobooks/#bedienung","title":"Bedienung","text":"

W\u00e4hrend des Uploads zeigt die UI:

"},{"location":"gui/audiobooks/#ablauf-nach-erfolgreichem-upload","title":"Ablauf nach erfolgreichem Upload","text":""},{"location":"gui/audiobooks/#2-audiobook-jobs","title":"2) Audiobook Jobs","text":"

Gezeigt werden aktive Jobs (nicht abgeschlossene). Fertige Jobs liegen in der Historie.

Jeder Job kann eingeklappt/ausgeklappt werden und zeigt:

"},{"location":"gui/audiobooks/#konfigurierbare-job-parameter","title":"Konfigurierbare Job-Parameter","text":"

Im ausgeklappten Job:

"},{"location":"gui/audiobooks/#formatverhalten","title":"Formatverhalten","text":"

F\u00fcr mp3/flac zeigt die UI w\u00e4hrend/nach dem Lauf eine Kapitel-Status-Tabelle (Rip/Encode).

"},{"location":"gui/audiobooks/#aktionen-je-job","title":"Aktionen je Job","text":""},{"location":"gui/audiobooks/#relevante-settings","title":"Relevante Settings","text":""},{"location":"gui/audiobooks/#typische-fehlerbilder","title":"Typische Fehlerbilder","text":""},{"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:

Wichtig:

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

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

Shared-Audio-Job:

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

Vor Start je Job einstellbar:

Spezifika:

"},{"location":"gui/converter/#ausgabe-pfade","title":"Ausgabe-Pfade","text":""},{"location":"gui/converter/#videoiso","title":"Video/ISO","text":""},{"location":"gui/converter/#audio","title":"Audio","text":""},{"location":"gui/converter/#queue-und-start","title":"Queue und Start","text":"

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

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:

Relevante Settings:

"},{"location":"gui/converter/#abgrenzung-zu-audiobooks","title":"Abgrenzung zu Audiobooks","text":""},{"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":""},{"location":"gui/database/#bereich-gefundene-raw-eintrage","title":"Bereich Gefundene RAW-Eintr\u00e4ge","text":"

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

Aktionen:

"},{"location":"gui/database/#was-bei-job-anlegen-passiert","title":"Was bei Job anlegen passiert","text":"

Typischer Einsatz:

"},{"location":"gui/database/#sicherheits-und-betriebsregeln","title":"Sicherheits- und Betriebsregeln","text":""},{"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:

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":""},{"location":"gui/downloads/#download-auslosen","title":"Download ausl\u00f6sen","text":"

Bei Status ready:

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

L\u00f6schen entfernt:

Nicht erlaubt:

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

Jeder Eintrag zeigt auf einen Blick:

"},{"location":"gui/history/#detaildialog-was-dort-zusammenlauft","title":"Detaildialog: Was dort zusammenl\u00e4uft","text":"

Der Detaildialog b\u00fcndelt:

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:

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

Wichtige Punkte:

"},{"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":""},{"location":"gui/history/#multipart","title":"Multipart","text":""},{"location":"gui/history/#logs-sinnvoll-nutzen","title":"Logs sinnvoll nutzen","text":"

Empfehlung:

  1. Erst Tail pr\u00fcfen.
  2. Bei Pfad-/Toolproblemen vollst\u00e4ndiges Log laden.
  3. Danach passende Wiederanlauf-Aktion w\u00e4hlen.
"},{"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:

Nutzen im Betrieb:

Gesteuert \u00fcber Settings:

"},{"location":"gui/ripper/#2-job-queue","title":"2) Job Queue","text":"

Es gibt zwei operative Zonen:

M\u00f6gliche Queue-Eintr\u00e4ge:

Wichtige Regeln:

Parallelit\u00e4t kommt aus Settings:

"},{"location":"gui/ripper/#3-skript-cron-status","title":"3) Skript- / Cron-Status","text":"

Zeigt Runtime-Aktivit\u00e4ten:

Aktionen:

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

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

"},{"location":"gui/ripper/#review-bereich-bereit-zum-encodieren","title":"Review-Bereich (Bereit zum Encodieren)","text":"

Hier wird die effektive Encode-Entscheidung festgelegt:

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:

Das ist wichtig f\u00fcr Recovery und Delete-Vorschau.

"},{"location":"gui/ripper/#5-disk-information","title":"5) Disk-Information","text":"

Zeigt aktuelle Laufwerksdaten:

Aktionen:

Hinweis:

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

"},{"location":"gui/ripper/#vorhandenes-raw-erkannt","title":"Vorhandenes RAW erkannt","text":"

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

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

Du kannst gezielt ab Position einf\u00fcgen:

"},{"location":"gui/ripper/#audible-activation-bytes-eintragen","title":"Audible Activation Bytes eintragen","text":"

Wenn f\u00fcr eine AAX-Datei keine Activation Bytes automatisch ermittelt werden k\u00f6nnen, \u00f6ffnet Ripster einen Dialog zur manuellen Eingabe.

"},{"location":"gui/settings/","title":"Settings","text":"

Die Seite Settings ist das zentrale Kontrollpanel f\u00fcr Laufzeitverhalten, Automatisierung und Expertenfunktionen.

"},{"location":"gui/settings/#tab-uberblick","title":"Tab-\u00dcberblick","text":"Tab Zweck Konfiguration Alle fachlichen Settings (Pfade, Tools, Laufwerk, Metadaten, Monitoring, Benachrichtigungen, Converter) Scripte Einzelne Bash-Skripte pflegen, testen und sortieren Skriptketten Mehrstufige Sequenzen aus Skript und Warten bauen und testen Encode-Presets Benutzer-Presets und Standard-Zuordnungen f\u00fcr Blu-ray/DVD-Workflows Cronjobs Zeitgesteuerte Jobs auf Basis Skript/Skriptkette"},{"location":"gui/settings/#tab-konfiguration","title":"Tab Konfiguration","text":""},{"location":"gui/settings/#bedienlogik","title":"Bedienlogik","text":"
  1. Felder \u00e4ndern.
  2. \u00c4nderungen speichern klicken.
  3. Erst dann werden \u00c4nderungen persistiert und f\u00fcr neue Pipeline-Schritte wirksam.

Aktionen in der Toolbar:

"},{"location":"gui/settings/#wichtige-ui-verhalten","title":"Wichtige UI-Verhalten","text":""},{"location":"gui/settings/#kategorie-pfade-besondere-interaktion","title":"Kategorie Pfade: Besondere Interaktion","text":"

Die Pfad-Kategorie hat eine eigene Darstellung:

"},{"location":"gui/settings/#spezial-editoren-in-der-konfiguration","title":"Spezial-Editoren in der Konfiguration","text":""},{"location":"gui/settings/#laufwerks-infobox-innerhalb-laufwerk","title":"Laufwerks-Infobox innerhalb Laufwerk","text":"

In der Kategorie Laufwerk wird eine Live-Tabelle erkannter optischer Laufwerke angezeigt:

"},{"location":"gui/settings/#tab-scripte","title":"Tab Scripte","text":"

Funktionen:

Testergebnis enth\u00e4lt:

"},{"location":"gui/settings/#tab-skriptketten","title":"Tab Skriptketten","text":"

Skriptketten bestehen aus Schritten:

Funktionen:

Im Ketteneditor:

"},{"location":"gui/settings/#tab-encode-presets","title":"Tab Encode-Presets","text":"

Bereiche:

  1. Standard-Zuordnungen (Slots)
  2. Preset-Liste (CRUD)
"},{"location":"gui/settings/#standard-zuordnungen","title":"Standard-Zuordnungen","text":"

Es gibt vier persistente Slots:

Die Auswahl ist medientyp-kompatibel gefiltert. Nicht kompatible oder fehlende bereits gespeicherte IDs werden weiterhin sichtbar gemacht, damit bestehende Zuordnungen nachvollziehbar bleiben.

"},{"location":"gui/settings/#preset-inhalt","title":"Preset-Inhalt","text":"

Ein Preset umfasst:

"},{"location":"gui/settings/#tab-cronjobs","title":"Tab Cronjobs","text":"

Funktionen:

Die Seite zeigt zus\u00e4tzlich Live-Status laufender Cron-Aktivit\u00e4ten (Runtime Activities).

"},{"location":"gui/settings/#expertenbereich-activation-bytes-cache","title":"Expertenbereich: Activation Bytes Cache","text":"

Der Activation-Bytes-Block wird nur im Expertenmodus angezeigt und nur wenn Eintr\u00e4ge vorhanden sind.

Er zeigt:

"},{"location":"gui/settings/#validierungshinweise-fur-template-felder","title":"Validierungshinweise f\u00fcr Template-Felder","text":"

Template-Felder akzeptieren nur:

Nicht erlaubt sind z. B. unvollst\u00e4ndige geschweifte Klammern oder sonstige Sonderzeichen.

"},{"location":"gui/settings/#siehe-auch","title":"Siehe auch","text":""},{"location":"pipeline/","title":"Anhang: Pipeline intern","text":"

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

"},{"location":"pipeline/#zuruck-zum-handbuch","title":"Zur\u00fcck zum Handbuch","text":""},{"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":""},{"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:

"},{"location":"pipeline/encoding/#pre-post-encode-ausfuhrungen","title":"Pre-/Post-Encode-Ausf\u00fchrungen","text":"

Fehlerverhalten:

"},{"location":"pipeline/encoding/#dateinamenordner","title":"Dateinamen/Ordner","text":"

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

Platzhalter:

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:

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:

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:

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

"},{"location":"pipeline/post-encode-scripts/#fehlerverhalten","title":"Fehlerverhalten","text":""},{"location":"pipeline/post-encode-scripts/#verfugbare-umgebungsvariablen","title":"Verf\u00fcgbare Umgebungsvariablen","text":"

Beim Script-Run werden gesetzt:

"},{"location":"pipeline/post-encode-scripts/#skript-ketten","title":"Skript-Ketten","text":"

Ketten unterst\u00fctzen zwei Step-Typen:

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

"},{"location":"pipeline/post-encode-scripts/#testlaufe","title":"Testl\u00e4ufe","text":"

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:

"},{"location":"pipeline/workflow/#abbruch-wiederaufnahme-neustart","title":"Abbruch, Wiederaufnahme, Neustart","text":""},{"location":"tools/","title":"Anhang: Externe Tools","text":"

Ripster orchestriert externe CLI-Tools. Dieser Abschnitt erkl\u00e4rt deren Rolle im Gesamtsystem.

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

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

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:

"},{"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, synchronisiert Ripster ihn nach:

~/.MakeMKV/settings.conf\n

Format:

app_Key = \"product-key\"\n

Zus\u00e4tzlich zeigt die UI unterhalb des Feldes den aktuellen Betakey an, der per Button in das Eingabefeld \u00fcbernommen werden kann.

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

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

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

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

"},{"location":"workflows/#3-raw-verzeichnis-entsteht","title":"3) RAW-Verzeichnis entsteht","text":"

Ordnername basiert auf Metadaten plus Job-ID:

Zustandswechsel des RAW-Ordners:

"},{"location":"workflows/#4-review-und-encode","title":"4) Review und Encode","text":"

In Bereit zum Encodieren:

Beim Start:

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

"},{"location":"workflows/#2-seriencontainer-und-disc-konflikte","title":"2) Seriencontainer und Disc-Konflikte","text":"

Beim Speichern wird gepr\u00fcft:

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:

RAW-Namensbasis enth\u00e4lt Staffel/Disc (SxDy) und wird ebenfalls mit den Prefix-Phasen gef\u00fchrt:

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

Ausgabepfad:

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

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

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

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

Praxis:

"}]}