From 6555562a4ca5a63a77f9012c3f4867ba2134b271 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Tue, 1 Sep 2026 22:27:55 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20SAVEPOINT=20=E2=80=94=205.4.0=20gebaut?= =?UTF-8?q?=20und=20lokal=20installiert,=20NICHT=20veroeffentlicht;=20Uebe?= =?UTF-8?q?rgabe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- SAVEPOINT.md | 188 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 187 insertions(+), 1 deletion(-) diff --git a/SAVEPOINT.md b/SAVEPOINT.md index b8eeea8..80f3548 100644 --- a/SAVEPOINT.md +++ b/SAVEPOINT.md @@ -1,6 +1,192 @@ # SAVEPOINT — Rippy -## ÜBERGABE an die nächste Session (01.09.2026, Sessionende) +## ÜBERGABE an die nächste Session (01.09.2026, spät — 5.4.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:** `npm install` + `node node_modules/electron/install.js` (npm 11 + blockt Electrons Install-Skript). **Playwright ist seit 5.4.0 devDependency** + (Commander-Ja nach Regel B; MIT; beim Installieren + `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1` setzen — Electron braucht keinen + Browser-Download). `vendor/` aus `%LOCALAPPDATA%\Rippy\tools` befüllen. +* **Die drei Läufe:** `npm test` (351 Tests), `npm run smoke` (Gerüst), + **`npm run klick`** (NEU: der Klick-Beweis durch das echte Programm mit + nachgebauten Werkzeugen, Bilder in `beweise/klick/`). Alle drei sind + in dieser Session grün gewesen. +* **Release veröffentlichen — NUR nach dem Wort des Commanders + („Update freigegeben"):** die VIER Dateien im Gitea-Tag `aktuell` + ERSETZEN (`RippySetup-5.4.0.exe`, `.blockmap`, `latest.yml`; `w0.yml` + bleibt liegen). Dateien liegen in `rippy-windows/dist-setup/` (Kopie) + und `rippy-windows/dist-setup-540/` (Original). Token: + `F:\Coding Stuff\Gittea Token\rippy.txt` (40 Hex; über das + PowerShell-Werkzeug lesen). 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. + +### Stand + +**5.4.0 ist gebaut, am ausgepackten Paket bewiesen und auf DIESEM PC +installiert (22:23), NICHT im Kanal.** Der Commander wollte es ausdrücklich +so: erst lokal, dann testen, dann veröffentlichen. + +* Setup: `RippySetup-5.4.0.exe`, **131 546 293 Bytes**, SHA-256 + `18A7BE8F6197D0933BF9AC8FA18C463474D99EE5B259DF960EC277CD135346C1`. +* Paket-Smoke: `SMOKE: OK — fenster=geladen kern=pid:10740,node:24.18.1 + datenbank=ok leine=gesetzt pong=ok version=5.4.0`. +* **351 Tests** in 34 Dateien (vorher 261), Typprüfung und Bau grün. +* Klick-Beweis: 15 Schritte grün, Ausgang 0 — Rippen → Dialog → drei + Titel → Sprach-Chips → jpn statt deu → „Hauptinhalt + Extras" → Rollen + auf Folge → Staffel 1, ab Folge 3 → Vorschau `Serien\…\Season 01` → + RIPPT → „Kompression eingereiht, das Laufwerk ist frei" → Kompressions- + Karte → „Komprimiert und abgelegt" → Dateien `… S01E03.mkv` und + `… S01E04.mkv` unter `Season 01` → Roh-Dateien-Karte → Roh löschen → + Ereignisse. Bilder: `beweise/klick/01…05*.png`. +* Commits dieser Session: `3f7f962` (Kern), `e3ce822` (Oberfläche), + `6dd1b0b` (Klick-Beweis), `c46a280` (Version 5.4.0), dazu der SAVEPOINT. + +### Was 5.4.0 enthält — alle zwölf Punkte der vorigen Übergabe + +Der Commander hat gefragt „Traust du dir alles auf einmal zu?" und die +Fassung als EINE gewollt. Seine Entscheidungen: Roh-Dateien **nach 7 Tagen, +nur bei gelungener Kompression**; Untertitel bei fremdem Ton **als Spur, +beim Abspielen vorgewählt**; Warteschlange = **nächste Disc rippen, während +die vorige komprimiert**; **Playwright ja**. + +1. **Roh-Dateien aufräumen** — `kern/ablage/rohaufraeumen.ts`: Regel + (`rohAufbewahrung`: sofort / 7 / 14 / 30 Tage / behalten), Frist ab + Ende der Kompression, gelöscht wird NUR bei Phase fertig + komprimiert + + jede fertige Datei vorhanden und nicht leer. Ordner unter `roh\`, die + kein Vorgang kennt (alles aus der Zeit vor 5.4.0!), werden nur gezeigt. + Belegung in Einstellungen → Roh-Dateien. Takt: 60 s nach Start, täglich, + und nach jeder gelungenen Kompression. +2. **Staffel und Folge von Hand** — Felder im Dialog, sobald eine Rolle + „Folge" ist; `ersteFolge` zählt fortlaufend in Disc-Reihenfolge, TMDb + warnt nur noch (`folgenPlausibel`). +3. **Wiederholen ab Kompression** — jeder Rip ist ein Datensatz + (Tabelle `vorgaenge`, Schema 4, Auftrag als JSON). „Neu komprimieren" + mit Preset-Wahl reiht den alten Auftrag wieder ein, die neue Fassung + ersetzt die alte im selben Zielordner. +4. + 12. **Sprachen je Titel** — SINFO-Sprachen reisen je Titel in den + Dialog (Chips, vorbelegt aus der Einstellung, sonst alles Vorhandene), + von dort in `RipAuftragTitel.audioSprachen/untertitelSprachen`, in den + Kompressions-Auftrag und in HandBrake. `sprachwahl()`: erste Tonspur + nicht in der Wunschsprache → Untertitel der Wunschsprache nach vorn und + `--subtitle-default=1`. Vor der Kompression prüft ein HandBrake-Scan + (`komprimieren/scan.ts`) die Roh-Datei; MakeMKVs Auswahlregel wird + gesetzt, wenn keine steht (`werkzeuge/spurauswahl.ts`). +5. **Vorschau** — `gemeinsam/ablagepfad.ts`, zwei Zeilen im Dialog. +6. **Warteschlange** — `kern/ablauf/warteschlange.ts` + `ablegen.ts`: + Rip endet mit den Roh-Dateien, Laufwerk frei, Auswurf (Einstellung + `autoAuswurf`, Vorgabe an), Kompression eine zur Zeit im Hintergrund, + Karte in der Übersicht, Abbruch je Auftrag, Wiederaufnahme nach Neustart. + Unkomprimierte Rips (4K, kein HandBrake) werden in den Zielordner + VERSCHOBEN — vorher blieben sie unter `roh\` liegen, ohne NFO, Poster, + Bibliothek. +7. **Klick-Beweis** — `npm run klick` (siehe oben), Naht + `kern/werkzeuge/aufruf.ts`, Fakes `bau/klick/`. +8. **Laufwerks-Gesundheit** — `kern/laufwerk/ereignisse.ts` liest + `wevtutil qe System /q: /f:xml` (cdrom/disk, 24 h), Urteil + Disc/Hardware/ruhig; automatisch nach einem gescheiterten Rip, sonst + Knopf „Laufwerk prüfen". +9. **Durchgehender Fortschritt** — `gewichteterFortschritt()` nach + Titel-/Dateigröße, Rip und Kompression. +10. **Aufräumen nach Abbruch** — halbe Dateien eines abgebrochenen ODER + gescheiterten Titels werden entfernt; ein Roh-Ordner ohne eine einzige + brauchbare Datei auch. +11. **Erkennung v2 + Kino-Banner v2** — `zuordnung.nachpruefen()` nach dem + Info-Lauf (Laufzeit ±6 % bestätigt → 0,95; ≥ 25 % daneben → Vorschlag), + `strukturHinweis()` (≥ 3 gleich lange Titel = Serie), Stubs zählen nicht + (`istStub`), `bdmt_deu` als zweite Titel-Variante. TMDb-Details holen + per `append_to_response` Logo, Tagline, Bewertung, FSK (DE), Besetzung. + Kachel zeigt Logo statt Text, Meta-Zeile, Darsteller-Streifen, Hinweise. + +Dazu aus der Liste „auch noch offen": Dialog-Zustand aus der Kachel +herausgehoben (Dialoge leben im App-Zustand), `7c489f8` ist mit drin, +Datenbank-Pfad steht unter Einstellungen → Programm, CSP `font-src data:` +(eingebettete Schrift-Teile waren blockiert — Konsolenfehler, unsichtbar). + +### ⚠ Der Datenbank-Befund — ungeklärt, bitte als Erstes prüfen + +Auf diesem PC (Konto TobisPC, einziges Konto) lag unter +`%APPDATA%\Rippy\rippy.db` bis 21:13 eine Datenbank von **Schema 1 vom +30.08. 16:50** ohne eine einzige Einstellung — obwohl 5.3.2 hier +installiert war, der Updater am 01.09. 20:01/20:27 Dateien lud und der +Commander Einrichtung, Erkennung und Rips bestätigt hat. Ein 10-s-Start +des installierten Rippy durch mich schrieb genau in diese Datei (Schema 3, +`letzter_start`). Kein anderes `rippy.db` auf C:/D:/E:/F: ist seit dem +30.08. geschrieben worden. Der Commander sagt: „Ja, alles bleibt +erhalten" (Einstellungen überleben den Neustart, Datenbank-LED grün). +Beides zusammen geht nicht auf — ich konnte es nicht auflösen. + +**Was beim Commander-Test zu beobachten ist:** Erscheint beim Start von +5.4.0 die Erst-Einrichtung, dann IST die Roaming-Datenbank die lebende und +sie war leer — einmal neu einrichten (TMDb-Key liegt in +`F:\Coding Stuff\Gittea Token\tmdb.txt`), danach bleibt es. Erscheint sie +nicht, steht unter Einstellungen → Programm jetzt der echte Pfad +(„Datenbank: …") — den bitte notieren. Die Roh-Dateien-Karte zeigt +außerdem seine wirkliche Ablage und Belegung. + +### Was am Gerät noch zu messen ist + +* **MakeMKV-Spurauswahl an einer echten Disc:** nach dem nächsten Rip + `RIPPY_MESSUNG_MKV="" npx vitest run test/messung.spuren.test.ts + --reporter=verbose` — zeigt, welche Sprachen wirklich in der Roh-Datei + sind. Die Regel `app_DefaultSelectionString` setzt Rippy beim Start + (Ereignis-Zeile „MakeMKV-Auswahlregel gesetzt"), wenn keine da war. +* Warteschlange mit zwei Discs hintereinander; Auswurf nach dem Rip. +* „Laufwerk prüfen" am BU40N (das Protokoll hat 338 × cdrom 7 und + 8 × cdrom 11 in 30 Tagen — es wird etwas zeigen). +* Hero-Banner mit TMDb-Key (Logo, FSK, Besetzung) — im Klick-Beweis ohne + Key nicht sichtbar. Vorsicht bei „Spartacus: Gods of the Arena": TMDb + führt es als Extras-Staffel (S0) von „Spartacus" (46296); die direkten + Treffer sind leere Stubs und zählen seit 5.4.0 nicht mehr. +* Roh-Aufräumen nach 7 Tagen ist frühestens ab dem 08.09. beobachtbar; + die Regel „sofort" lässt sich sofort prüfen. +* Weiter offen wie zuvor: `extras/`-Ordner in Jellyfin bestätigen, + DVD-/Audio-CD-Durchlauf, main-Merge. + +### Messungen dieser Session (Regel D) + +* **HandBrake 1.11** (ffmpeg-Testdatei jpn/deu/deu/eng + deu/eng-Untertitel, + Ausgabe per ffprobe): `--audio-lang-list deu,eng` = je Sprache die + erste Spur; `--first-audio` dasselbe; `--all-audio` alle passenden; + Untertitel-Ausgabe in LISTEN-Reihenfolge; `--subtitle-default=1` setzt + default UND forced; `-N deu` allein fügt keine Spur hinzu. + `--scan --json` schreibt „JSON Title Set:" + Objekt + weiteren Text. +* **TMDb** (v4-Token): `movie/149?append_to_response=images,credits, + release_dates&include_image_language=de,en,null` liefert tagline, + runtime, vote_average, images.logos (iso_639_1 de/en/null, .png/.svg), + credits.cast (name, character, profile_path, order), release_dates DE + certification „16" (type 3 Kino, 5 Heimvideo, 6 TV). `tv/46296`: + episode_run_time [53], content_ratings DE „18", seasons. Logo-Größen + w45…w500, Profil w45/w185/h632. +* **wevtutil** (`/q:` XPath, `/f:xml`, `/rd:true`): cdrom 7 = fehlerhafter + Block, 11 = Controllerfehler, 51 = E/A-Fehler; TimeCreated UTC. Über Git + Bash zerlegt der Pfad-Konverter das `/q:`-Argument — im Kern geht es + ohne Shell (spawn), das ist der Grund. +* **makemkvcon** nimmt `--minlength=` (nicht in der Kurzhilfe). +* **MakeMKV-Auswahlregel** (forum.makemkv.com, Thema 4386): Standard + `-sel:all,+sel:(favlang|nolang),-sel:(havemulti|havecore),=100:all,-10:favlang`; + favlang „always matches if no favorite language is set". + +### Bekannte Schwächen, bewusst in Kauf genommen + +* `--subtitle-default=1` markiert die Spur auch als forced (so schreibt es + HandBrakes Muxer). Jellyfin zeigt sie damit; wer sie abschaltet, kann das. +* Die Stub-Regel ist eng: nur Einträge OHNE Beschreibung, Backdrop UND + Bewertung zählen als leer. Als letzter Vorschlag zählt auch ein Stub. +* Die Belegung wird bei jedem Vorgänge-Stand durch einen Ordner-Walk + gemessen — bei sehr vielen Roh-Ordnern dauert das Sekunden. +* Der Klick-Beweis läuft nur unter Windows (Electron + koffi) und nicht in + der Linux-Ampel — wie der Smoke. + +--- + +## Übergabe vom 01.09.2026 (Sessionende, VOR 5.4.0 — die zwölf Punkte sind seit 5.4.0 umgesetzt) ### Wo die nächste Session startet