251 lines
7.8 KiB
Markdown
251 lines
7.8 KiB
Markdown
# Datenbank
|
||
|
||
Ripster verwendet **SQLite3** als Datenbank. Die Datenbankdatei liegt unter `backend/data/ripster.db`.
|
||
|
||
---
|
||
|
||
## Schema-Übersicht
|
||
|
||
```sql
|
||
settings_schema -- Einstellungs-Definitionen
|
||
settings_values -- Benutzer-Werte
|
||
jobs -- Rip-Job-Datensätze
|
||
pipeline_state -- Aktueller Pipeline-Zustand (Singleton)
|
||
scripts -- Shell-Skripte für Pre-/Post-Encode-Ausführung
|
||
script_chains -- Geordnete Ketten aus mehreren Skripten
|
||
script_chain_steps -- Einzelschritte einer Skript-Kette
|
||
cron_jobs -- Zeitgesteuerte Aufgaben (eigener Cron-Parser)
|
||
cron_run_logs -- Ausführungs-Protokolle für Cron-Jobs
|
||
```
|
||
|
||
---
|
||
|
||
## Tabelle: jobs
|
||
|
||
Die wichtigste Tabelle – speichert alle Ripping-Jobs.
|
||
|
||
```sql
|
||
CREATE TABLE jobs (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
created_at TEXT NOT NULL,
|
||
updated_at TEXT NOT NULL,
|
||
status TEXT NOT NULL, -- Aktueller Status
|
||
title TEXT, -- Filmtitel (von OMDb)
|
||
imdb_id TEXT, -- IMDb-ID
|
||
omdb_year TEXT, -- Erscheinungsjahr
|
||
omdb_type TEXT, -- movie/series
|
||
omdb_poster TEXT, -- Poster-URL
|
||
raw_path TEXT, -- Pfad zur Raw-MKV
|
||
output_path TEXT, -- Pfad zur Ausgabedatei
|
||
playlist TEXT, -- Gewählte Blu-ray Playlist
|
||
rip_successful INTEGER NOT NULL DEFAULT 0, -- 1 wenn Rip abgeschlossen
|
||
makemkv_output TEXT, -- MakeMKV-Ausgabe (JSON)
|
||
mediainfo_output TEXT, -- MediaInfo-Ausgabe (JSON)
|
||
encode_plan TEXT, -- Encode-Plan (JSON)
|
||
handbrake_log TEXT, -- HandBrake Log-Pfad
|
||
error_message TEXT, -- Fehlermeldung bei ERROR
|
||
error_details TEXT -- Detaillierte Fehler-Infos
|
||
);
|
||
```
|
||
|
||
!!! info "rip_successful"
|
||
Das Feld `rip_successful` wird auf `1` gesetzt, sobald MakeMKV den Rip-Schritt erfolgreich abgeschlossen hat – unabhängig davon, ob danach ein Encode-Fehler auftritt. Damit lässt sich in der History unterscheiden, ob eine Raw-Datei vorhanden ist.
|
||
|
||
### Job-Status-Werte
|
||
|
||
| Status | Beschreibung |
|
||
|--------|-------------|
|
||
| `ANALYZING` | MakeMKV analysiert die Disc |
|
||
| `METADATA_SELECTION` | Wartet auf Benutzer-Metadaten-Auswahl |
|
||
| `READY_TO_START` | Bereit zum Starten |
|
||
| `RIPPING` | MakeMKV rippt die Disc |
|
||
| `MEDIAINFO_CHECK` | MediaInfo analysiert die Raw-Datei |
|
||
| `READY_TO_ENCODE` | Wartet auf Encode-Bestätigung |
|
||
| `ENCODING` | HandBrake encodiert |
|
||
| `FINISHED` | Erfolgreich abgeschlossen |
|
||
| `ERROR` | Fehler aufgetreten |
|
||
|
||
---
|
||
|
||
## Tabelle: pipeline_state
|
||
|
||
Singleton-Tabelle für den aktuellen Pipeline-Zustand (immer genau 1 Zeile).
|
||
|
||
```sql
|
||
CREATE TABLE pipeline_state (
|
||
id INTEGER PRIMARY KEY CHECK(id = 1),
|
||
state TEXT NOT NULL DEFAULT 'IDLE',
|
||
job_id INTEGER, -- Aktiver Job (NULL wenn IDLE)
|
||
progress REAL, -- Fortschritt 0-100
|
||
eta TEXT, -- Geschätzte Restzeit
|
||
updated_at TEXT NOT NULL
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
## Tabelle: settings_schema
|
||
|
||
Definiert alle verfügbaren Einstellungen mit Metadaten.
|
||
|
||
```sql
|
||
CREATE TABLE settings_schema (
|
||
key TEXT PRIMARY KEY,
|
||
category TEXT NOT NULL, -- paths, tools, encoding, ...
|
||
type TEXT NOT NULL, -- string, number, boolean, select
|
||
label TEXT NOT NULL, -- Anzeigename
|
||
description TEXT, -- Hilfetext
|
||
default_val TEXT, -- Standardwert
|
||
required INTEGER, -- 1 = Pflichtfeld
|
||
min_val REAL, -- Minimalwert (für number)
|
||
max_val REAL, -- Maximalwert (für number)
|
||
options TEXT -- JSON-Array für select-Typ
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
## Tabelle: settings_values
|
||
|
||
Speichert benutzer-konfigurierte Werte.
|
||
|
||
```sql
|
||
CREATE TABLE settings_values (
|
||
key TEXT PRIMARY KEY REFERENCES settings_schema(key),
|
||
value TEXT NOT NULL,
|
||
updated_at TEXT NOT NULL
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
## Tabelle: scripts
|
||
|
||
Verwaltet Shell-Skripte, die vor oder nach dem Encode-Schritt ausgeführt werden können.
|
||
|
||
```sql
|
||
CREATE TABLE scripts (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
name TEXT NOT NULL UNIQUE,
|
||
script_body TEXT NOT NULL,
|
||
order_index INTEGER NOT NULL DEFAULT 0, -- Sortierposition in der UI
|
||
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
```
|
||
|
||
## Tabelle: script_chains
|
||
|
||
Geordnete Ketten, die mehrere Skripte sequenziell zusammenfassen.
|
||
|
||
```sql
|
||
CREATE TABLE script_chains (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
name TEXT NOT NULL UNIQUE,
|
||
order_index INTEGER NOT NULL DEFAULT 0, -- Sortierposition in der UI
|
||
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
CREATE TABLE script_chain_steps (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
chain_id INTEGER NOT NULL REFERENCES script_chains(id) ON DELETE CASCADE,
|
||
script_id INTEGER NOT NULL REFERENCES scripts(id) ON DELETE CASCADE,
|
||
step_order INTEGER NOT NULL DEFAULT 0,
|
||
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
```
|
||
|
||
!!! info "Sortierung"
|
||
`order_index` in `scripts` und `script_chains` wird über die API (`reorderScripts` / `reorderChains`) per Drag & Drop in der UI gesetzt und bleibt persistent gespeichert.
|
||
|
||
---
|
||
|
||
## Tabellen: cron_jobs & cron_run_logs
|
||
|
||
Speichern den Zeitplan und die Ausführungs-Historie des eingebauten Cron-Systems.
|
||
|
||
```sql
|
||
CREATE TABLE cron_jobs (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
name TEXT NOT NULL,
|
||
cron_expression TEXT NOT NULL, -- 5-Felder-Ausdruck (min h d m wd)
|
||
source_type TEXT NOT NULL, -- "script" oder "chain"
|
||
source_id INTEGER NOT NULL, -- ID des Skripts/der Kette
|
||
enabled INTEGER NOT NULL DEFAULT 1,
|
||
pushover_enabled INTEGER NOT NULL DEFAULT 1,
|
||
last_run_at TEXT,
|
||
last_run_status TEXT, -- "success", "error", "running"
|
||
next_run_at TEXT,
|
||
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
CREATE TABLE cron_run_logs (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
cron_job_id INTEGER NOT NULL REFERENCES cron_jobs(id) ON DELETE CASCADE,
|
||
started_at TEXT NOT NULL,
|
||
finished_at TEXT,
|
||
status TEXT NOT NULL, -- "success", "error", "running"
|
||
exit_code INTEGER,
|
||
stdout TEXT,
|
||
stderr TEXT,
|
||
triggered_by TEXT NOT NULL DEFAULT 'cron', -- "cron" oder "manual"
|
||
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
```
|
||
|
||
!!! info "Log-Rotation"
|
||
Pro Cron-Job werden maximal **50 Log-Einträge** gespeichert; ältere Einträge werden automatisch gelöscht. Stdout/Stderr werden auf **100.000 Zeichen** begrenzt.
|
||
|
||
---
|
||
|
||
## Schema-Migrationen
|
||
|
||
`database.js` implementiert **automatische Migrationen**:
|
||
|
||
1. Beim Start wird das aktuelle Schema geprüft
|
||
2. Fehlende Tabellen werden erstellt
|
||
3. Fehlende Spalten werden hinzugefügt
|
||
4. Neue Default-Einstellungen werden eingefügt
|
||
|
||
### Korruptions-Recovery
|
||
|
||
Falls die Datenbankdatei korrupt ist:
|
||
|
||
```
|
||
1. Korrupte Datei wird erkannt (Verbindungsfehler / Integritätsprüfung)
|
||
2. Datei wird in backend/data/corrupt-backups/ verschoben
|
||
3. Neue, leere Datenbank wird erstellt
|
||
4. Schema wird neu initialisiert
|
||
5. Log-Eintrag mit Warnung
|
||
```
|
||
|
||
---
|
||
|
||
## Datenbankpfad konfigurieren
|
||
|
||
Standard: `./data/ripster.db` (relativ zum Backend-Verzeichnis)
|
||
|
||
Über Umgebungsvariable anpassen:
|
||
|
||
```env
|
||
DB_PATH=/var/lib/ripster/ripster.db
|
||
```
|
||
|
||
---
|
||
|
||
## Direkte Datenbankinspektion
|
||
|
||
```bash
|
||
# SQLite3-CLI
|
||
sqlite3 backend/data/ripster.db
|
||
|
||
# Alle Jobs anzeigen
|
||
.mode table
|
||
SELECT id, status, title, created_at FROM jobs ORDER BY created_at DESC;
|
||
|
||
# Einstellungen anzeigen
|
||
SELECT key, value FROM settings_values;
|
||
```
|