docs: SAVEPOINT — 5.4.0 gebaut und lokal installiert, NICHT veroeffentlicht; Uebergabe
Ampel / ampel (push) Successful in 1m54s

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-01 22:27:55 +02:00
co-authored by Claude Fable 5.1
parent c46a280b1f
commit 6555562a4c
+187 -1
View File
@@ -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:<XPath> /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="<roh-datei>" 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=<s>` (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