diff --git a/SAVEPOINT.md b/SAVEPOINT.md index 0b3e149..603d1ce 100644 --- a/SAVEPOINT.md +++ b/SAVEPOINT.md @@ -1,6 +1,208 @@ # SAVEPOINT — Rippy -## ÜBERGABE an die nächste Session (01.09.2026, spät — 5.4.0 gebaut und lokal installiert, NICHT veröffentlicht) +## ÜBERGABE an die nächste Session (02.09.2026 — 5.5.0 gebaut und lokal installiert, NICHT veröffentlicht) + +### Wo die nächste Session startet + +* **Arbeitsort:** `F:\Coding Stuff\rippy`, Branch `worktree-windows-electron` + (Spitze siehe `git log`). v5-Code in `rippy-windows/`; `main` ist reines + Docker-Rippy. +* **Bau:** wie in BAUEN.md — `npm install` + `node node_modules/electron/install.js`, + Playwright mit `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1`, `vendor/` aus + `%LOCALAPPDATA%\Rippy\tools`. +* **Die drei Läufe:** `npm test` (413 Tests in 42 Dateien), + `npm run smoke` (Gerüst), `npm run klick` (29 Klick-Schritte durch + das echte Programm, jetzt auch durch die Erst-Einrichtung; Bilder + `beweise/klick/01…09*.png`). Alle drei in dieser Session grün. +* **Release veröffentlichen — NUR nach dem Wort des Commanders + („Update freigegeben"):** die VIER Dateien im Gitea-Tag `aktuell` + ERSETZEN (`RippySetup-5.5.0.exe`, `.blockmap`, `latest.yml`; `w0.yml` + bleibt liegen). Dateien liegen in `rippy-windows/dist-setup/` (Kopie) + und `rippy-windows/dist-setup-550/` (Original). Token: + `F:\Coding Stuff\Gittea Token\rippy.txt` (40 Hex; über das + PowerShell-Werkzeug lesen, nie ausgeben). Weg wie am 01.09.: LAN-Adresse + `http://192.168.178.153:3000/api/v1/…/releases/1`, `latest.yml` erst + löschen (204), dann hochladen (201), danach ANONYM über die externe + HTTPS-Adresse gegenmessen. **5.4.0 war nie im Kanal — 5.5.0 ersetzt sie + direkt; im Kanal liegt bis dahin 5.3.2.** + +### Stand + +**5.5.0 ist gebaut, am ausgepackten Paket bewiesen und auf DIESEM PC +installiert (17:50, Installer-Exit 0, Rippy lief dabei nicht), NICHT im Kanal.** Der Commander wollte 5.4.0 vor +der Freigabe noch umgebaut haben (Clean Code, UI/UX, Übersicht, FirstRun) +— das ist 5.5.0; 5.4.0 wurde dadurch nie veröffentlicht. + +* Setup: `RippySetup-5.5.0.exe`, **131 560 997 Bytes**, SHA-256 + `8E55C7797BC41C6A153B584CF58556104A4D67F8A2A2590D570079CA719A6181` (Bau in `dist-setup-550/`). +* Paket-Smoke: `SMOKE: OK — fenster=geladen kern=pid:23276,node:24.18.1 datenbank=ok leine=gesetzt pong=ok version=5.5.0`. +* **413 Tests** in 42 Dateien (5.4.0: 353), drei + Typprüfungen und Bau grün. +* Klick-Beweis: 29 Schritte grün, Ausgang 0 — Speicher-Karte + (Arbeitsordner und Ablage getrennt, Fußleiste FREI) → keine Bibliothek → + Rippen → Dialog → drei Titel → Sprach-Chips → jpn statt deu → + „Hauptinhalt + Extras" → Rollen auf Folge → Staffel 1, ab Folge 3 → + Vorschau → **Platz-Prüfung** → RIPPT → „Kompression eingereiht" → + Kompressions-Karte → „Komprimiert und abgelegt" → Dateien `S01E03/S01E04` + unter `Season 01` → **Roh lokal im Arbeitsordner, Zwischenordner + geräumt** → **Verlauf** → **Bilanz** → Roh-Dateien-Karte → Kompression + ohne „Allgemeines Preset", Chips Deutsch/Englisch → Werkzeuge mit + Durchsuchen, Karten Automatik/Benachrichtigung/Allgemein/Update → Roh + löschen → Ereignisse → **zweiter Start `RIPPY_START_BEREICH=einrichtung`: + Willkommen vor 7 Poster-Spalten → Prüfung → Ordner → Qualität → Titel → + Meldungen → Automatik → „Los geht's"**. +* Commits dieser Session: `3dc6798` (Kern, Oberfläche, Tests, Klick-Beweis, Aenderungsnotizen, Version 5.5.0 — 67 Dateien) und dieser SAVEPOINT. + +### Was 5.5.0 enthält — die Wünsche des Commanders vom 02.09.2026 + +Seine Worte (gekürzt): „Bevor wir das Update freigeben … CleanCode: +Separation of Concerns / UI/UX: MakeMKV-Header weg aus der Übersicht, +„Bereit"-Parameter sinnvoll, Allgemeines Preset weg, Dropdowns für Ton +und Untertitel, Programm → Allgemein oder eigener Update-Block, +Durchsuchen bei Werkzeugen / Bibliothek: brauchen wir die wirklich? / +Übersicht ist zu leer: freier Speicher auf Server und Arbeitsordner / +alles auch in den FirstRun / angenehme Fenstergröße je Monitor / weitere +Ideen her." Seine Entscheide in den Rückfragen: **Bibliothek weg, dafür +Verlauf in der Übersicht; Arbeitsordner lokal, Ablage auf dem Server; +Fußleiste ersetzen; Oberfläche UND Kern aufteilen; Poster-Grid im +FirstRun; aus ARM übernommen: Automatik mit Countdown, Protokoll-Datei + +Ordner öffnen, Benachrichtigung aufs Handy, Statistik; Serien-Merker, +Platz-Prüfung, Warteschlange pausieren; Rettungs-Abbild mit Nullen — aber +NUR, wenn Rippy wirklich Fehler sieht.** Nicht gewählt: Zeitfenster, +Oberflächen-Test, Backup-Weg als eigener Modus. + +1. **Kern aufgeteilt** (`kern/index.ts` 1244 → Bootstrap + Router): + `kern/kontext.ts` (KernKontext: db, anFenster, hinweis/fehler, + Protokoll), `kern/dienste/einstellungen.ts`, `werkzeuge.ts`, + `laufwerke.ts`, `erkennung.ts`, `vorgaenge.ts`, `speicher.ts`, + `benachrichtigung.ts`, `automatik.ts`. +2. **Oberfläche aufgeteilt** (`fenster/App.tsx` 2686 → Rahmen): + `bausteine.tsx` (Gemeinsames), `dialoge/` (AendernDialog, + TitelWahlDialog), `uebersicht/` (LaufwerkKachel, KompressionsKarte, + SpeicherKarte, VerlaufKarte, Uebersicht), `einstellungen/` (Karten.tsx + je Karte eine Funktion, SprachAuswahl, Einstellungen), + `einrichtung/` (ErstEinrichtung, PosterHintergrund). +3. **Übersicht:** MakeMKV-Kopf weg (→ Einstellungen → MakeMKV, plus LED + SCHLÜSSEL); Speicher-und-Bilanz-Karte (Arbeitsordner/Ablage mit + Füllbalken, Discs/gesichert/abgelegt/je Disc); Verlauf (letzte sechs + Vorgänge, Ordner öffnen, Sprung zu Roh-Dateien); Kompressions-Karte mit + **Pausieren/Weiter**; Fußleiste = sechs LEDs (KERN, DATENBANK, + WERKZEUGE, SCHLÜSSEL, FREI n GB, Version/UPDATE) statt PID und Ping. +4. **Einstellungen:** Ablage (+ Arbeitsordner, Auswurf), Kompression + (Presets je Typ, **SprachAuswahl** als Chips + Dropdown in + Wunschreihenfolge, kein Allgemeines Preset), Roh-Dateien, **Automatik** + (an/aus, Countdown), Metadaten, MakeMKV (Schlüssel-Stand, Neu prüfen, + Aktualisieren, eigener Key), Medienserver, **Benachrichtigung** + (Discord-Webhook, Telegram, Testnachricht), **Allgemein** (Autostart, + Protokoll öffnen, Ablage/Arbeitsordner im Explorer, Kern/DB/Protokoll- + Pfade), **Update** (eigene Karte), Werkzeuge (**Durchsuchen …** mit + exe-Dialog). Die Einstellungs-Schlüssel neu: `arbeitsordner`, + `automatik`, `automatikSekunden`, `benachrichtigungen`, + `discordWebhook`, `telegramToken`, `telegramChatId`; `transcodePreset` + ist aus der erlaubten Liste raus. +5. **Arbeitsordner** (`einstellungen.arbeitsordner()`, Roh unter + `\roh`): `ablegen.ts` encodiert nach `\fertig\` und + zieht danach in die Ablage (`nachzuziehen`), räumt den Zwischenordner. + `speicher.ts` misst mit `fs.statfsSync` (geht hoch bis zum vorhandenen + Elternpfad), Takt jede Minute, LED-Warnung unter 60/20 GB. +6. **Platz-Prüfung** (`gemeinsam/platz.ts`, EINE Rechnung): Dialog zeigt + das Urteil vor dem Klick und sperrt den Knopf bei „hart"; der Kern + urteilt beim Start (`index.ts ripMitPlatz`, auch für die Automatik). +7. **Automatik** (`automatik.ts`): ab 90 % Erkennung, nicht schon + gerippt, Video-Disc → Titel lesen → Countdown (Vorgabe 30 s) → Rip mit + Vorschlag; Kachel mit Sekunden, „Jetzt", „Stopp"; wer selbst klickt + (Rippen, Ändern, Zuordnung), beendet den Countdown. Unsicher = nur der + Grund. +8. **Serien-Merker** (Einstellung `serienMerker` JSON je `tv:`): nach + jedem Serien-Rip merkt sich Rippy Staffel und nächste Folge; die + nächste Disc derselben Serie bekommt „ab Folge n" vorbelegt (nur, wenn + Disc-Nr unbekannt oder > 1). +9. **Rettungs-Abbild** (`kern/rip/rettung.ts`, Pipeline-Phase `rettet`): + nur nach GESEHENEN Lesefehlern (`fehlerGesehen`: Defekt-Wächter, + Lesefehler, Titelfehler) erscheint „Rettungs-Abbild …"; Sektor-Leser + 1 MiB → 64 KiB → 2048 B mit je zwei Versuchen, Nullen für den Rest, + Bericht `\rettung.iso.rettung.txt`; danach derselbe Rip aus + `iso:`. Der Kern lehnt `rettung-start` ohne gesehene Fehler ab. +10. **Benachrichtigung** (`benachrichtigung.ts`): Discord-Webhook (POST + JSON `{content, username}`), Telegram (`bot/sendMessage`, + `{chat_id, text}`); bei Rip fertig, Kompression fertig, Fehler, + Automatik-Start; Fehlschlag = Ereignis-Zeile, nie ein Abbruch. +11. **Protokoll-Datei** (`gemeinsam/protokoll.ts`): Haupt und Kern + schreiben `\logs\rippy-JJJJ-MM-TT.log` (14 Tage). Der Kern + schreibt beim Start „Datenbank geöffnet: " — die Zeile, die am + 01.09. gefehlt hat. +12. **Fensterlage** (`haupt/fensterlage.ts`): 80 % des Arbeitsbereichs, + mittig, mindestens 1100 × 720; gemerkt in `\fenster-lage.json`, + nur wiederhergestellt, wenn sie auf einem heutigen Bildschirm liegt. +13. **Erst-Einrichtung:** acht Schritte (Willkommen, Prüfung mit + Durchsuchen für makemkvcon, Ordner mit Ablage + Arbeitsordner + frei, + Qualität mit Encodern, Empfehlungen und Sprach-Chips, Titel, Meldungen, + Automatik/Auswurf/Roh-Regel, Fertig) vor dem **Poster-Grid** + (`PosterHintergrund`: 7 Spalten, CSS `poster-lauf`, Platzhalter bis + zum TMDb-Schlüssel, dann `tmdb.beliebtePoster` über `poster-laden`). +14. **Nachrichten** (`gemeinsam/nachrichten.ts`): neu `speicher`, + `automatik`, `poster-vorschau`; Fenster → Kern `kompression-pause`, + `automatik-stopp`, `automatik-jetzt`, `benachrichtigung-testen`, + `poster-laden`, `rettung-start`, `speicher-laden`; `bibliothek` und + `bibliothek-laden` sind weg; `vorgaenge` trägt `statistik` und + `kompression.pausiert`; `RipStatus` trägt `rettungMoeglich`/`rettung`. + Brücke neu: `dateiWaehlen`, `ordnerOeffnen`, `protokollOeffnen`. + +### ⚠ Der Datenbank-Befund — weiter ungeklärt + +Unverändert aus der 5.4.0-Übergabe: `%APPDATA%\Rippy\rippy.db` war bis +21:13 am 01.09. Schema 1 vom 30.08. ohne Einstellungen, obwohl 5.3.2 hier +lief. Seit 5.5.0 steht der Datenbank-Pfad unter Einstellungen → Allgemein +UND als erste Zeile in der Protokoll-Datei (`Protokoll öffnen`). **Beim +Commander-Test als Erstes:** Kommt die Erst-Einrichtung wieder? Dann ist +die Roaming-DB die lebende, einmal neu einrichten — die Protokoll-Datei +sagt, welche Datei Rippy wirklich öffnet. + +### Was am Gerät noch zu messen ist (nichts davon war in dieser Session möglich) + +* **Rettungs-Abbild an Spartacus Disc 2** (echter Defekt): Der Leser + öffnet `\\.\Q:` über `fs/promises.open` — am echten Laufwerk NICHT + gemessen (Unit-Test mit nachgebautem Gerät: 7 Fälle). Zu prüfen: Dauer, + ob Windows das Gerät direkt lesen lässt, ob MakeMKV das `iso:`-Abbild + ohne Hänger rippt. Braucht doppelten Platz im Arbeitsordner. +* **Automatik an einer echten, sicher erkannten Disc** (Klick-Beweis hat + sie aus): Countdown in der Kachel, Stopp/Jetzt, Start mit Vorschlag. +* **Benachrichtigung live**: Discord/Telegram nach Doku gebaut, NICHT + live gemessen — der Testknopf unter Einstellungen → Benachrichtigung ist + dafür da. +* **Poster-Grid mit echtem TMDb-Schlüssel** (`movie/popular`, 2 Seiten): + im Klick-Beweis nur Platzhalter. +* **Ablage auf `\\192.168.178.62\rippy` mit lokalem Arbeitsordner** im + echten Betrieb (statfs auf UNC ist am 01.09. gemessen: 2216 GB frei). +* Weiter offen aus 5.4.0: MakeMKV-Key läuft Ende September ab (Rippy holt + neu); BU40N am USB. + +### Messungen dieser Session (Regel D) + +* `fs.statfsSync` (Node 24): Laufwerke, Ordner und UNC liefern + bavail/bsize/blocks; nicht vorhandener Pfad wirft ENOENT → + `vorhandenerPfad` geht hoch (siehe Kopf `kern/dienste/speicher.ts`). +* Discord „Execute Webhook": JSON `content` ≤ 2000 Zeichen; Telegram + `sendMessage`: JSON `chat_id`, `text` — beides Doku, nicht live. +* makemkvcon: `iso:` als Quelle (Manpage) — `parser.ts quelle()` + liefert es für `.iso`. +* Playwright: `_electron.launch` ein zweites Mal im selben Skript mit + anderem `env` funktioniert (Erst-Einrichtung im Klick-Beweis). + +### Bekannte Schwächen, bewusst in Kauf genommen + +* Die Platz-Schätzung rechnet pauschal 25 % für die Kompression — bei + „NICHT komprimieren" nur Roh + 2 GB Luft. +* Der Serien-Merker merkt sich je Serie EINEN Stand (die zuletzt gerippte + Disc) — zwei Staffeln durcheinander gerippt, gewinnt die letzte. +* Die Automatik startet nur mit Rippys Vorschlag (Rollen, Sprachen aus + der Einstellung) — wer je Titel anders will, klickt selbst. +* Das Rettungs-Abbild liest über Node, nicht über MakeMKVs Backup-Modus: + langsamer bei heilen Bereichen, dafür unter Rippys Kontrolle. +* `kern/dienste/vorgaenge.ts` und `erkennung.ts` sind noch groß; ein + weiterer Schnitt lohnt erst, wenn sich dort etwas ändert. + +## Übergabe vom 01.09.2026 spät (5.4.0 — gebaut, nie veröffentlicht; überholt durch 5.5.0) ### Wo die nächste Session startet