Die sechs Punkte des Commanders vom 02.09.2026 abends und seine Entscheide:
* Restzeit der Kompression aus HandBrakes eigener ETA-Klammer (Formatstring
aus dem Binary 1.11.2 gelesen), KompressionStand.restS.
* Kachel zeigt nach dem Rip nur noch eine Zeile — Balken, Prozent, Ziel in
der Kompressions-Karte und im Verlauf ("nur in der Kompressions-Karte").
* Kopfzeile bleibt beim Scrollen stehen (sticky), Sektionswahl darunter.
* Untertitel-Vorwahl je Extra ("NUR für Extras, IMMER OPTIONAL"): welche
Untertitel-Spur beim Abspielen an ist — weiche Spur, nie eingebrannt;
RipAuftragTitel/RohDatei.untertitelVorwahl, sprachwahl.
* Mehrere Filme je Disc: "anderer Film …" je Titel mit TMDb-Suche;
filme.ts filmGruppen trennt am Rip-Ende in eigene Roh-Ordner, Vorgänge
und Kompressions-Aufträge mit voller Zuordnung (erkennung.zuordnungAus).
* Roh-Ordner und Dateien tragen den Filmnamen (filme.ts rohOrdnerName,
ablage/dateinamen.ts: Akira (1988).mkv, - Fassung n, - Extra nn).
* Hell-Modus: Einstellung design (dunkel/hell/system), data-design auf
<html>, Token --color-tinte statt white/-Alpha-Klassen.
* Vorgangs-Leiste (Commander: "Phase 1–4 plus Komprimierung — zu einem
machen"): gemeinsam/vorgangsleiste.ts + uebersicht/VorgangsLeiste.tsx,
vier Stationen (Rettung als Zwischenstation), Segment-Balken in der
aktiven Station; Kachel, Kompressions-Karte, Verlauf. PHASE-x/4-Texte weg.
* Automatik-Kasten leert sich, sobald ein Rip startet.
Beweise: 446 Tests (neu: filme, dateinamen, vorgangsleiste; erweitert:
auftrag, handbrake, automatik, ablegen), drei Typprüfungen, Klick-Beweis
33 Schritte inkl. Vorwahl, anderer Film, Vorgangs-Leiste, Restzeit,
Hell-Modus (Bilder beweise/klick/01…11).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
6.8 KiB
Rippy v5 bauen — Anleitung
Gilt für den Ordner
rippy-windows/. Grundlage:KONZEPT-WINDOWS.md, die Messungen dazu liegen inbeweise/.
Voraussetzungen
| Werkzeug | Version | Anmerkung |
|---|---|---|
| Node | 24 (LTS) | dieselbe Linie wie Electrons eingebautes Node (24.18) |
| npm | 11 | kommt mit Node 24 |
| Windows | 10 (ab 1809) / 11, x64 | zum Entwickeln und für den Smoke-Beweis; Bau/Tests laufen auch auf Linux (CI) |
Einrichten — zwei Schritte, nicht einer
npm install
node node_modules/electron/install.js
Die zweite Zeile ist kein Versehen (gemessen 30.08.2026, siehe
beweise/README.md und KONZEPT § 3.5): npm 11 blockiert Install-Skripte
fremder Pakete. koffi übersteht das, weil es vorgebaute Binärdateien
mitbringt — Electron nicht: Sein Install-Skript lädt die eigentliche
Programmdatei herunter. Wird es geblockt, liegt nach npm install ein Paket
ohne dist/electron.exe da, und nichts startet. Der Nachholer ist auch
als npm-Skript hinterlegt: npm run werkzeug:electron.
Die Läufe
| Befehl | Was er tut |
|---|---|
npm run dev |
Entwicklung: baut, startet Electron, lädt das Fenster vom Vite-Server |
npm run build |
Typprüfung (beide tsconfig) + Bau nach out/ |
npm test |
Vitest: Wächter-Tests (§ 4.3), Datenbank, Nachrichten-Schema |
npm run smoke |
Der W-0-Beweis: baut, startet das echte Programm mit --smoke, prüft Fenster + Kern + Datenbank + Leine + Ping/Pong über den MessagePort und endet mit Code 0 (grün) oder 2. RIPPY_SMOKE_BILD=<pfad.png> legt zusätzlich einen Screenshot ab. Läuft nur unter Windows (Electron-Binary + koffi). |
npm run klick |
Der Klick-Beweis (5.4.0): baut, startet das echte Programm mit eigenem Profil (--profil=…, --klick-smoke: ohne Tray, Updater, Toasts), einem nachgebauten Laufwerk (RIPPY_FAKE_LAUFWERK=Q) und nachgebauten Werkzeugen (bau/klick/fake-*.cjs, laufen über kern/werkzeuge/aufruf.ts) — und klickt per Playwright durch Speicher-Karte → Rippen → Dialog → Sprachen → Folgen → Platz-Prüfung → Rip → Warteschlange → Kompression → Arbeitsordner (Roh lokal, Zwischenordner geräumt) → Ablage → Verlauf → Bilanz → Roh-Dateien → Einstellungen (Sprach-Chips, Durchsuchen, Karten Automatik/Benachrichtigung/Allgemein/Update). Seit 5.5.0 mit getrenntem Arbeitsordner und Automatik aus (der Beweis klickt selbst). 5.6.0: dazu die Untertitel-Vorwahl (nur bei Extras), „anderer Film …" je Titel, die Restzeit in der Kompressions-Karte (das nachgebaute HandBrake schreibt die ETA-Klammer wie das Binary), die Kachel-Kurzzeile, die Vorgangs-Leiste (TITEL LESEN ✓ → RIPPEN aktiv → KOMPRIMIEREN → ABLEGEN, keine „PHASE x/4"-Texte mehr) und der Hell-Modus (Bild 07-hell-modus.png). Bilder in ../beweise/klick/, Code 0 oder 2. Grund: Beide Fehler vom 01.09.2026 waren Verkabelung, die kein Unit-Test sah. Playwright ist reines Bau-Werkzeug (MIT, PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 beim Installieren — Electron braucht keinen Browser-Download). |
Der Smoke-Lauf benutzt ein Wegwerf-Profil unter %TEMP%\rippy-smoke — er
fasst die echten Einstellungen nicht an.
Was die CI-Ampel prüft (.gitea/workflows/ci.yml)
Die Ampel läuft auf Linux und führt hier npm ci, npm run build und
npm test aus. Deshalb gilt für Tests: nichts importieren, was koffi,
Win32 oder das Electron-Binary braucht. Die Wächter-Tests LESEN Quelltext
nur; die Datenbank-Tests laufen, weil node:sqlite im System-Node genauso
vorhanden ist wie in Electrons Node (§ 3.4). Was zwingend Windows braucht
(Smoke, später die Laufwerks-Messungen), wird lokal ausgeführt und im
SAVEPOINT.md mit Ausgabe belegt.
Das Setup bauen (W-6)
npm run paket
erzeugt dist-setup/RippySetup-<version>.exe (NSIS, pro Benutzer, ohne
Adminrechte) plus latest.yml und .blockmap — alle drei Dateien
gehören zum Release (§ 6.8: latest.yml ist die Update-Auskunft, die
.blockmap macht aus dem Voll-Download einen Differenz-Download).
⚠ Die win-unpacked-Sperre (30./31.08.2026 gemessen): Nachdem der
Paket-Smoke (win-unpacked\Rippy.exe --smoke) gelaufen ist, hält ein
Filter-Treiber (Virenscanner/Indexer — KEIN Prozess mit sichtbarem Pfad)
resources\app.asar mitunter STUNDENLANG fest. Der nächste Bau in
denselben Ordner scheitert dann mit EBUSY … unlink app.asar, und zwar
mit Exit-Code 0 (electron-builder!) — nicht vom Log-Ende täuschen
lassen, die ⨯-Zeile zählt. Ausweg: in ein frisches Verzeichnis bauen
(npx electron-builder --win --config electron-builder.yml -c.directories.output=dist-setup-neu), die fertige Setup-EXE nach
dist-setup/ KOPIEREN (eine Kopie ist eine neue Datei ohne Sperre) und
den gesperrten Ordner löschen, sobald er wieder frei ist.
Vorher einmalig vendor/ befüllen (die MITGELIEFERTEN Werkzeuge, § 9 —
liegen nicht im Git, 74 MB):
vendor/handbrake/HandBrakeCLI.exe (GPL-2 — Lizenztext liegt bei)
vendor/flac/flac.exe + libFLAC.dll (Xiph — OHNE die DLL endet jeder
Aufruf ohne eine Zeile Ausgabe)
Quelle auf dieser Maschine: %LOCALAPPDATA%\Rippy\tools\ (die rc11-
Beschaffung hat sie dort abgelegt); Original-Quellen und Lizenzen stehen
in bau/lizenzen/QUELLEN.md.
Release veröffentlichen (Entscheid 6): Die drei Dateien in ein
Gitea-Release mit dem festen Tag aktuell hochladen (Dateien dort
ERSETZEN) — electron-updater prüft
…/releases/download/aktuell/latest.yml. Ob Gitea 1.27 zusätzlich das
GitHub-Muster releases/latest/download/… bedient, ist am ersten echten
Release zu messen (§ 3.6 ⚠); das feste Tag ist die Rückfallebene.
SmartScreen (Entscheid 5): Die EXE ist unsigniert. Beim ersten Start eines Downloads: „Weitere Informationen → Trotzdem ausführen". Beim Release Größe und SHA-256 mit angeben, damit Bekannte die echte Datei erkennen.
Festgelegte Versionen und warum
- Electron 44.0.0 — exakt die am 30.08.2026 gemessene Version (KONZEPT § 3.1/§ 3.4). Sprünge nach der Pflege-Regel § 6.8: bei jedem Release prüfen, ob eine neue Linie ansteht.
- TypeScript 5.9.3, fest gepinnt — bewusst NICHT die neue
Go-Implementierung (7.x, „tsgo", seit 2026
latestauf npm): Für die Ampel zählt ein Typprüfer, dessen Verhalten die restliche Werkzeugkette (Vitest 4, electron-vite 5) breit getestet hat. Der Umstieg auf 7.x ist eine bewusste Entscheidung für später, kein Nebeneffekt einesnpm update. - Vite 7 — der gemeinsame Nenner von electron-vite 5 (verträgt 5–7) und
Vitest 4 (verträgt 6–8), am 30.08.2026 per
npm viewermittelt. - koffi ist die einzige Laufzeit-Abhängigkeit (
dependencies) — sie wird nicht gebündelt, sondern zur Laufzeit ausnode_modulesgeladen (natives Modul). Alles andere ist Bauzeit (devDependencies).