From 5d9be4d046634798ec9869e59d7d44af37b31555 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Fri, 24 Jul 2026 08:55:55 +0200 Subject: [PATCH] docs: SAVEPOINT v3.2, ROADMAP Etappe 13 + Ideen-Katalog, README-Ausbau, KONZEPT-Fortschreibungen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README: Media-Server-Ablage, Benachrichtigungen (Tabelle je Dienst), System/MakeMKV-Key, UHD-Arbeitsverzeichnis, neuer Abschnitt 'Rippy woanders bereitstellen' (beliebiger Docker-Host, was NICHT mitmuss). - ROADMAP: Etappe 13 (Universal-Komfort-Runde) dokumentiert, erledigte Punkte aus Etappe 11/12 abgehakt, priorisierter Ideen-Katalog. - KONZEPT: Abschnitt 10 'Fortschreibungen' — Media-Server-Neutralitaet erweitert das Jellyfin-Muss (keine Abweichung), Benachrichtigungen, udev->ioctl. - SAVEPOINT v3.2 mit dem Kernbefund: Ampel war seit 23.07. rot, stable hing 10 Commits zurueck (bcrypt/passlib + veralteter Test) — behoben. - AGENTS: Stand-Sektion entschlackt (Details leben im SAVEPOINT). Co-Authored-By: Claude Fable 5 --- .env.example | 2 ++ AGENTS.md | 11 +++++---- KONZEPT.md | 14 +++++++++++ README.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++---- ROADMAP.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++--- SAVEPOINT.md | 45 ++++++++++++++++++++++++++++++++++- 6 files changed, 189 insertions(+), 13 deletions(-) diff --git a/.env.example b/.env.example index 0d4a1b2..772e29b 100644 --- a/.env.example +++ b/.env.example @@ -19,4 +19,6 @@ OMDB_API_KEY= # MakeMKV-Beta-Key (optional): DVDs gehen ohne, Blu-ray läuft 30 Tage im # Testmodus. Aktueller Key: Forum-Thread "MakeMKV is free while in beta". # Wechselt etwa monatlich — bei Blu-ray-Fehlern zuerst hier schauen. +# Bequemer: im UI unter Einstellungen → System eintragen (gilt ab dem +# nächsten Rip, ohne Neustart, und schlägt diesen Env-Wert). MAKEMKV_APP_KEY= diff --git a/AGENTS.md b/AGENTS.md index 7222fe7..86bb916 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -53,9 +53,10 @@ Bibliotheks-APIs: `--help`/Doku prüfen und die Fundstelle im Commit nennen. - Kein Proxmox-LXC-Nesting-Workaround — das Projekt lebt bewusst in normalem Docker. - Kein ARM-Fork — Rippy ist ein Eigenbau von Grund auf. -## Aktueller Stand (21.07.2026) +## Aktueller Stand (24.07.2026) -- ✅ **Etappe 8 abgeschlossen:** Dark Mode mit Theme-Toggle, React-UI mit TailwindCSS -- ✅ **Git Sync:** Arcane VM (192.168.178.162) mit Git Repository konfiguriert -- ✅ **Savepoint v1.8:** Separation of Concerns geplant, Dark Mode implementiert -- 📝 **Nächste Etappe:** SoC-Refactoring (Theme-Context auslagern) +- ✅ **E2E bewiesen (v3.1):** BD-50 komplett durch die Kette (43 GB → 4,8 GB) +- ✅ **Etappe 13 (v3.2):** Universal-Komfort-Runde — Media-Server-Integration, + echte Benachrichtigungen, SMB-Klartext-Fehler, UHD-Arbeitsverzeichnis, + MakeMKV-Key via UI, Job-Detail-Popup, Toast-Feedback, Ampel-Blocker behoben +- 📝 **Details immer in SAVEPOINT.md** — diese Sektion nennt nur die Etappe diff --git a/KONZEPT.md b/KONZEPT.md index b4d9b6d..3a84163 100644 --- a/KONZEPT.md +++ b/KONZEPT.md @@ -161,3 +161,17 @@ Ein modular aufgebautes System, das bei Disc-Einwurf automatisch den Typ erkennt - Neue Risiken: TMDB-Matching-Fehler (mit Fallback), NFO-Format-Abhängigkeit (Hinweis), Pre-Scan-Latenz (Hinweis) **Ergebnis:** Konzept ist wasserdicht für MVP-Phase. + +## 10. Konzept-Fortschreibungen (dokumentierte Erweiterungen, keine Abweichungen) + +- **24.07.2026 — Media-Server-Neutralität:** Die Jellyfin-Muss-Features + (Ordnerstruktur, NFO, Poster) bleiben vollständig bestehen; sie sind jetzt + über das Setting `mediaServer` auf Emby und Kodi ausgeweitet (identisches + Kodi-NFO-Schema) und für Plex auf die reine Benennung reduziert. Jellyfin + bleibt Referenz- und Empfehlungssystem im Einrichtungs-Assistenten. +- **24.07.2026 — Benachrichtigungen:** Webhook bei Job-Ende (Discord/Slack/ + ntfy/generisch) als gebautes Feature — im UX-Flow Punkt 10 („Abschluss") + war das als Protokollierung angelegt, jetzt meldet Rippy aktiv. +- **23./24.07.2026 — udev → ioctl:** Der im Konzept beschriebene udev-Daemon + ist im Container prinzipbedingt nicht lauffähig; die Disc-Wache pollt per + Kernel-ioctl (3 s) — gleiches Verhalten, universell lauffähig. diff --git a/README.md b/README.md index 19daf21..c56eef0 100644 --- a/README.md +++ b/README.md @@ -44,17 +44,29 @@ NICHT als emuliertes CD-ROM (`media=cdrom`), das kann keine SCSI-Kommandos. 1. **Disc-Wache** (ioctl-Polling, kein udev-Gefrickel) erkennt Einlegen, identifiziert die Disc (Volume-Label → TMDB → OMDb-Fallback) und zeigt - sie mit Poster auf dem Dashboard. + sie mit Poster auf dem Dashboard. Klick auf einen Job-Titel öffnet die + Detail-Ansicht (Poster, Jahr, Beschreibung, Ablagepfad). 2. **Rip** (MakeMKV, verlustfrei — der einzige Weg durch AACS): Ziel wählst du beim Start (Filme/Serien/Musik/eigener Pfad, inkl. Netzwerk-Ziele). + Vor dem Start prüft Rippy den freien Platz gegen die Disc-Größe. Audio-CDs laufen über abcde → FLAC + MusicBrainz. 3. **Kompression** (HandBrake, eigener Job auf eigener Queue): x265/x264, Preset im UI wählbar; Rohdatei wird erst nach Erfolg gelöscht („Original behalten" als Option). Fehlgeschlagene Kompressionen lassen sich ohne Neu-Rip neu anstoßen. -4. **4K-UHD**: braucht ein LibreDrive-fähiges Laufwerk (MakeMKV-Forum: +4. **Media-Server-Ablage**: Unter Einstellungen → Ripping (oder im + Einrichtungs-Assistenten) wählst du dein System — Jellyfin, Emby, Kodi, + Plex oder keins. Fertige Rips heißen dann „Titel (Jahr)" statt + Job-UUID; für Jellyfin/Emby/Kodi legt Rippy zusätzlich movie.nfo + + poster.jpg dazu (Kodi-NFO-Schema, lesen alle drei nativ). Plex nutzt + nur die Benennung. +5. **4K-UHD**: braucht ein LibreDrive-fähiges Laufwerk (MakeMKV-Forum: „Ultimate UHD Drives Flashing Guide"). Normale BD/DVD gehen mit jedem - Laufwerk. + Laufwerk. ⚠️ UHD-Rohdaten sind bis 100 GB groß — wenn die Platte der + Rippy-Maschine dafür zu klein ist, lege das **Arbeitsverzeichnis** + (Einstellungen → Verarbeitung) auf eine eingehängte Freigabe, z. B. + `/app/media/nas-arbeit`. Rippy bricht sonst VOR dem Rip mit einer + Klartext-Meldung ab statt nach 40 GB mit voller Platte. ## Speicherziele (NAS, Freigaben) @@ -67,6 +79,28 @@ Containern. ⚠️ Zugangsdaten liegen unverschlüsselt in der lokalen Postgres-DB — bewusster Heimnetz-Kompromiss; lege fürs NAS einen eigenen, eingeschränkten Benutzer an. +## Benachrichtigungen + +**Einstellungen → Benachrichtigungen**: eine Webhook-URL eintragen, „Test +senden" drücken, speichern — fertig. Rippy meldet Job-Ende (fertig, +fehlgeschlagen, abgebrochen) und erkennt den Dienst an der URL selbst: + +| Dienst | URL-Beispiel | Format | +|---|---|---| +| Discord | `https://discord.com/api/webhooks/…` | `{"content": …}` | +| Slack | `https://hooks.slack.com/services/…` | `{"text": …}` | +| ntfy (Handy-Push) | `https://ntfy.sh/mein-geheimes-thema` | Roh-Text + Titel | +| Eigenes (HA, n8n, …) | beliebige HTTPS-URL | `{"title","message","level"}` | + +## System & MakeMKV-Beta-Key + +**Einstellungen → System** zeigt die Werkzeug-Versionen jedes Workers +(MakeMKV, HandBrake), den Key-Status und den freien Speicherplatz. Der +MakeMKV-Beta-Key (wechselt ~monatlich, Forum-Thread t=1053) wird hier im +UI eingetragen und gilt ab dem **nächsten Rip** — ohne Rebuild, ohne +Neustart; er schlägt den Key aus der `.env`. Nur die MakeMKV-*Version* +steckt im Image: `docker compose build worker && docker compose up -d worker`. + ## Verarbeitung & Hardware **Einstellungen → Verarbeitung** zeigt ehrlich an, welche Encoder deine @@ -88,11 +122,33 @@ eingebaute CPU-Worker alles selbst — Rippy bleibt All-in-one. | `TMDB_API_KEY` | empfohlen | Metadaten — alternativ im UI/Wizard eintragbar | | `OMDB_API_KEY` | optional | zweite Metadaten-Quelle (Fallback) | | `THETVDB_API_KEY` | optional | Serien-Fallback | -| `MAKEMKV_APP_KEY` | optional | MakeMKV-Beta-Key (Forum); DVDs gehen ohne | +| `MAKEMKV_APP_KEY` | optional | MakeMKV-Beta-Key (Forum); DVDs gehen ohne — bequemer: im UI unter Einstellungen → System pflegen | | `MAKEMKV_URL_BASE` | optional | alternative Download-Quelle für den Image-Build | UI-Einstellungen (Wizard/Settings) überstimmen die Env-Variablen. +## Rippy woanders bereitstellen + +Rippy ist reines Docker Compose — es läuft auf **jedem Linux-Host mit +Docker**, nicht nur auf der Original-VM. Es gibt (noch) keine fertigen +Registry-Images; gebaut wird beim ersten `up` direkt aus dem Repo. + +Voraussetzungen auf dem Ziel-Host: +1. Linux (x86_64) mit Docker + Compose-Plugin. +2. Ein optisches Laufwerk, das der Host sieht (`ls /dev/sr* /dev/sg*`). + In einer VM: per **USB-Passthrough** (Vendor-ID) durchreichen, NICHT + als emuliertes CD-ROM — siehe „Laufwerk anpassen" oben. +3. Ablage-Basis anlegen: `mkdir -p /srv/rippy/media` (oder Pfad in + `docker-compose.yml` anpassen — muss ein rshared-fähiger Bind sein). + +Dann wie im Schnellstart: klonen, `.env` füllen, `docker compose up -d +--build`, `http://` öffnen — der Einrichtungs-Assistent führt durch +den Rest (API-Keys, Media-Server, Verarbeitung). Updates: `git pull && +docker compose up -d --build`. + +Nicht mitnehmen musst du: Gitea, Arcane, den CI-Runner — das ist die +Entwicklungs-Infrastruktur DIESER Installation, nicht Teil von Rippy. + ## Entwicklung CI („Ampel") läuft bei jedem Push: Ruff, pytest, Vite-Build. Grün auf diff --git a/ROADMAP.md b/ROADMAP.md index 1d48331..4df553d 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -249,7 +249,9 @@ Bind-Mounts statt devices: (EPERM), UI rief hartkodiert localhost:8000 auf. - [x] /settings-Endpoints (Settings-Seite sprach vorher ins Leere) - [x] UI: Vite-Build + nginx mit /api-Proxy statt Dev-Server; relative API-Pfade - [x] compose: devices: statt Bind-Mounts; Ausgabe aufs media-Volume -- [ ] Jellyfin-Post-Processing an den Worker anbinden (NFO/Poster nach dem Rip) +- [x] Jellyfin-Post-Processing an den Worker anbinden (NFO/Poster nach dem + Rip) — 24.07., medien.py: Ordner „Titel (Jahr)" + movie.nfo + poster.jpg, + gesteuert übers mediaServer-Setting (Jellyfin/Emby/Kodi/Plex/keins) - [ ] Auth vor die schreibenden Endpoints (JWT existiert, schützt aber nichts) --- @@ -280,8 +282,9 @@ Jellyfin-Konvention nativ (ARM kann nur Emby-Refresh, keine NFOs). erlaubt nur EINE Auswahl). - [ ] **Min/Max-Titellänge + Extras**: Bonusmaterial nach extras/ (versteht Jellyfin nativ) statt alles flach. -- [ ] **Apprise-Benachrichtigungen**: eine Lib für Telegram/Discord/…, - Hooks auf job_completed/failed/awaiting_selection, Deep-Link ins UI. +- [x] **Benachrichtigungen bei Job-Ende** — 24.07., eigenes notify-Modul + (Discord/Slack/ntfy/generisches JSON, Dienst-Erkennung an der URL) + statt Apprise-Dependency; Test-Knopf im UI. Telegram/Deep-Links offen. - [ ] **Multi-Drive-Verwaltung**: drives-Tabelle (Seriennummer, Custom-Name, UHD-fähig-Flag), parallele Rips, Job↔Drive-Zuordnung. - [ ] **Backup-Modus** (makemkvcon backup --decrypt) als Plan B für Problem-Discs. @@ -294,3 +297,60 @@ Jellyfin-Konvention nativ (ARM kann nur Emby-Refresh, keine NFOs). „Show/Season 02/Show S02E05.mkv" im Preview bestätigen. - [ ] **Main-Feature per Laufzeitabgleich** mit TMDB-Runtime (±3 min) statt ARMs „größte Datei gewinnt" (#1297-Fehlklasse). + +--- + +## Etappe 13 (24.07.2026): Universal-Komfort-Runde — Lücken aus dem Alltag schließen + +**Quelle:** Commander-Sammelauftrag 24.07. — alles, was beim echten Benutzen +auffiel, in einem Rutsch. Alles gebaut, Tests dabei, Ampel-Blocker behoben. + +**Gebaut:** +- [x] **Ampel entrostet**: bcrypt auf 4.0.1 gepinnt (passlib-1.7.4-Bruch) und + cache_keys-Test an das Fingerprint-Format vom 23.07. angepasst — DIE + beiden Rot-Ursachen, wegen derer `stable` 10 Commits zurückhing. +- [x] **Media-Server-Integration**: mediaServer-Setting (Wizard + Einstellungen), + Zielordner „Titel (Jahr)", movie.nfo/tvshow.nfo + poster.jpg für + Jellyfin/Emby/Kodi (medien.py im Worker, mit Tests). +- [x] **Benachrichtigungen echt gemacht**: notify.py (API+Worker), Meldung bei + fertig/fehlgeschlagen/abgebrochen, Anleitung + Test-Knopf im UI — + das Webhook-Feld war vorher ein Placebo, nichts hat je gesendet. +- [x] **SMB-Freigaben-Scan repariert**: NT_STATUS-Fehler → Klartext (Gast- + Abfrage verweigert ⇒ Benutzer/Passwort nötig), Credential-Felder im UI + VOR den „Freigaben auflisten"-Knopf gezogen. +- [x] **4K-UHD-Platzproblem**: Arbeitsverzeichnis konfigurierbar (workDir, + z. B. NAS-Freigabe), Platz-Check per Disc-Größe (ioctl) VOR dem Rip. +- [x] **MakeMKV-Key über UI** (Einstellungen → System): gilt ab dem nächsten + Rip, ohne Rebuild; Worker melden Werkzeug-Versionen + Key-Quelle. +- [x] **Job-Detail-Popup**: Klick auf Titel in „Neueste Jobs" → Poster, Jahr, + Beschreibung, Ablagepfad, Fehler (Job speichert Metadaten jetzt mit). +- [x] **UI-Feedback überall**: Toast-System (reinploppende Meldungen), drehende + Refresh-Knöpfe, Logs-Filter um Warnung/Fehler-Pills ergänzt. +- [x] **Datei-Browser zeigt Dateien**: Ordner wirkten „leer", weil nur + Unterordner gelistet wurden — Dateien erscheinen jetzt grau mit Größe. +- [x] Favicon (Disc im Logo-Verlauf) + Footer „Created with ❤️ by LucyAI, + Claude and KrBrZ". +- [x] README: Media-Server, Benachrichtigungen, UHD-Arbeitsverzeichnis, + „Rippy woanders bereitstellen" (beliebiger Docker-Host). + +**Offen aus dieser Runde:** nichts — Rest siehe Etappe 12 und Ideen unten. + +--- + +## Ideen-Katalog (24.07.2026, priorisiert) — Lücken, die noch offen sind + +1. **Serien-Staffel-Flow**: Beim Rippen einer Serien-Disc Staffel/Disc-Nr + abfragen → Ablage `Show/Season 02/`, Episoden-Matching wie Etappe 12. +2. **Duplikat-Warnung**: Disc-Fingerprint schon in der Job-Historie → + „schon am X gerippt — trotzdem?" (Fingerprint-Infrastruktur existiert). +3. **Jellyfin-Bibliotheks-Refresh** nach Ablage (API-Key + URL in den + Einstellungen, POST /Library/Refresh) — der letzte Schritt zur + Null-Klick-Kette Disc→Bildschirm. +4. **Track-Auswahl vor dem Rip** (awaiting_selection, Etappe 12) — spart + bei Bonus-Material-Discs Stunden. +5. **Auth vor schreibende Endpoints** + Login-Flow im UI (JWT existiert). +6. **Speicherplatz-Kachel im Dashboard** (Media/Arbeitsverzeichnis als + Balken — /system/info liefert die Daten schon). +7. **Rip-Historie exportieren** (CSV/JSON) für die Sammlung-Übersicht. +8. **Design 2.0**: Design-Tokens statt Theme-Ternaries in jeder Zeile — + die `theme === 'dark' ? … : …`-Kaskaden sind der größte UI-Schuldenberg. diff --git a/SAVEPOINT.md b/SAVEPOINT.md index 16a157d..71d4055 100644 --- a/SAVEPOINT.md +++ b/SAVEPOINT.md @@ -1,6 +1,49 @@ # SAVEPOINT — Rippy -## Aktueller Stand: v3.1 — E2E BEWIESEN + Universal-Runde (24.07.2026, Claude) +## Aktueller Stand: v3.2 — Universal-Komfort-Runde + Ampel entrostet (24.07.2026, Claude) + +**Wichtigster Befund zuerst: die Ampel war seit dem 23.07. ROT und `stable` +hing 10 Commits hinter `main`** — deshalb kam nichts Neues mehr auf die VM. +Zwei Ursachen, beide behoben: +1. bcrypt ≥ 4.1 bricht passlib 1.7.4 (`__about__` entfernt → Selbsttest wirft + „password cannot be longer than 72 bytes") → **bcrypt==4.0.1 gepinnt**. +2. Der cache_keys-Test kannte den Disc-Fingerprint im Prescan-Key (23.07.) + nicht → Test an das echte Format angepasst + Fingerprint-Testfall dazu. + +**Neu in v3.2 (Commander-Sammelauftrag, alles mit Tests / Vite-Build grün):** +- **Media-Server-Integration**: Setting `mediaServer` (Wizard + Einstellungen → + Ripping): Zielordner „Titel (Jahr)" statt Job-UUID; für Jellyfin/Emby/Kodi + zusätzlich movie.nfo/tvshow.nfo + poster.jpg (Worker: medien.py). Plex = nur + Benennung. Job speichert Disc-Metadaten jetzt mit (jobs.meta, Migration). +- **Benachrichtigungen ECHT**: notify.py in API+Worker (Discord/Slack/ntfy/ + generisch, Erkennung an der URL) — das Feld war vorher ein Placebo. Meldung + bei fertig/fehlgeschlagen/abgebrochen; Anleitung + „Test senden" im UI. +- **SMB-Scan-Fix**: „NT_STATUS_ACCESS_DENIED" heißt jetzt im Klartext „Gast- + Abfrage verweigert → Benutzer/Passwort eintragen"; Credential-Felder stehen + im UI VOR dem Auflisten-Knopf. NAS-Ziel-Anlage quittiert per Toast. +- **4K-UHD-Vorsorge**: Arbeitsverzeichnis `workDir` konfigurierbar (auf + NAS-Freigabe legbar), Platz-Check per Disc-Größe (ioctl) VOR dem Rip mit + Klartext-Abbruch statt voller Platte bei 40 GB. +- **Einstellungen → System**: Werkzeug-Versionen je Worker (MakeMKV/HandBrake, + ENV MAKEMKV_VERSION im Image), Key-Quelle (ui/env/keiner), freier Platz; + **MakeMKV-Beta-Key im UI pflegbar** — gilt ab dem nächsten Rip, ohne Rebuild. +- **Job-Detail-Popup** (Klick auf Titel in „Neueste Jobs"): Poster, Jahr, + Beschreibung, Genres, Ablagepfad, Fehler (GET /jobs/{id}/detail). +- **UI-Feedback**: Toast-System (ToastContext, ploppt oben rechts), drehende + Refresh-Knöpfe, Logs-Pills um Warnung/Fehler ergänzt, Datei-Browser zeigt + jetzt auch DATEIEN (grau, mit Größe) — der „leere" Bluray-Ordner war voll. +- **Favicon** (Disc, Indigo-Verlauf) + **Footer** „Created with ❤️ by LucyAI, + Claude and KrBrZ". +- **Doku**: README (Media-Server, Benachrichtigungen, UHD-Arbeitsverzeichnis, + „Rippy woanders bereitstellen"), ROADMAP Etappe 13 + Ideen-Katalog, + KONZEPT-Fortschreibungen (Abschnitt 10), AGENTS-Stand. + +**Nächste Schritte:** unverändert die Fäden aus v3.1 (unten) + Ideen-Katalog +in der ROADMAP (Serien-Flow, Duplikat-Warnung, Jellyfin-Refresh, Auth). + +--- + +## Vorheriger Stand: v3.1 — E2E BEWIESEN + Universal-Runde (24.07.2026, Claude) **Der Beweis steht: Evangelion 2.22 (BD-50) komplett durch die Kette** — erkannt → verlustfrei gerippt (43 GB, LibreDrive) → H.264-komprimiert →