Files
rippy/beweise
HitonabiandClaude Opus 5 663127f854
Ampel / ampel (push) Successful in 1m35s
feat(v5): Windows-Rand weg, Hardware-Empfehlung sichtbar, Wizard geradegezogen
Vier Punkte des Commanders (01.09.2026):

1. "Ich hab noch den rand ich glaube der kommt aber von windows selbst"
   Stimmt. Ein rahmenloses Fenster behaelt unter Windows 11 den DWM-Rand
   — eine feine Linie, die der Fenstermanager zeichnet, nicht die Seite;
   mit CSS ist da nichts zu holen. Neu fensterrand.ts:
   DwmSetWindowAttribute mit DWMWA_BORDER_COLOR = DWMWA_COLOR_NONE.
   Gemessen: HRESULT 0, Windows nimmt es an. Runde Ecken bleiben (sie
   sind unter Windows 11 das Uebliche); ein Schalter fuer kantig ist da.
   Aeltere Windows antworten mit Fehler — der wird als Wert
   zurueckgegeben und protokolliert, nicht verschluckt (R4); dort gibt es
   den Rand schlicht nicht.

   Das ist der DRITTE erlaubte koffi-Ort. Waechter R1 kennt jetzt drei
   statt zwei Dateien; die Regel selbst ("Win32 nur an benannten Orten")
   bleibt und haelt alles andere weiter dicht.

2. "Die alte Version konnte automatisch anhand der gescannten hardware
   encoder das beste preset waehlen."
   Das KANN diese auch — presetEmpfehlung() waehlt nach den gemessenen
   Backends (VCN -> NVENC -> QSV -> CPU) und laeuft seit dem Kino-Mix.
   Man sah es nur nirgends ausser als Wort "automatisch:" in einem
   Auswahlfeld. Die Erst-Einrichtung zeigt jetzt die gemessenen Encoder
   als Badges und was daraus fuer DVD, Blu-ray und 4K wird — plus eine
   ehrliche Warnung, wenn nur CPU-Encoder da sind.

3. Feld "Update-Adresse" ist raus. Der Schluessel updateUrl gilt
   weiterhin (Datenbank), Paragraph 6.8 prueft ihn wie zuvor.

4. Erst-Einrichtung geprueft. Gefunden und behoben:
   * "Dieses Setup stellt vier Dinge ein" — es stellte ZWEI ein.
   * Der Ablage-Schritt zeigte eine LEERE Zeile, wenn nichts gewaehlt
     war. Es gibt aber eine Vorgabe (Videos\Rippy im Benutzerprofil) —
     die steht jetzt da.
   * Kein Wort zum TMDb-Schluessel, obwohl Schritt 1 "Rippy erkennt, was
     drauf ist" verspricht. Ohne Schluessel heissen Filme wie das
     Disc-Label. Jetzt ein eigener Schritt mit Eingabefeld.
   * Rohe HTML-Checkbox statt des Schalters aus dem Kino-Mix.
   * Kein Hinweis, dass Rippy im Infobereich weiterlebt.
   Neu sechs Schritte, drei Fragen — und die Zahl im Text stimmt.

   Dazu: #einrichtung als Beweis-Anker (RIPPY_START_BEREICH), sonst ist
   der Wizard nach dem ersten Start nicht mehr zu fotografieren und
   damit nicht mehr pruefbar. Beweis: beweise/ui-515-wizard.png

237 Tests gruen, Typpruefung sauber. Version 5.1.5.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 18:43:58 +02:00
..

Beweise — die Messungen zu KONZEPT-WINDOWS.md § 3

Diese zwei Skripte sind die Grundlage für die Entscheidung, Rippy v5 in TypeScript/Node zu bauen. Sie beantworten die einzige Frage, an der das ganze Konzept hängt:

Kann Node überhaupt alles, was Rippy am Laufwerk braucht?

Wäre die Antwort nein gewesen, wäre das Konzept wertlos gewesen. Deshalb sind sie zuerst gelaufen — vor der ersten Zeile Konzept.

AGENTS.md Regel D: „Externe Schnittstellen NIE aus dem Kopf."


Nachstellen

npm install koffi
node laufwerk.js

Gemessen am 30.08.2026 mit Node v24.19.0, koffi 3.1.6, an einem HL-DT-ST BD-RE BU40N (USB) mit eingelegter Blu-ray.


laufwerk.js — Win32-Laufwerkszugriff

Ruft dieselben Steuercodes auf wie src/rippy/drives/win_ioctl.py im Docker-Zweig. Nur lesend — kein Auswerfen, kein Verriegeln.

1. GetLogicalDrives + GetDriveTypeW  ->  optische Laufwerke: [ 'G' ]
2. CreateFileW \\.\G: (Zugriff 0)     ->  offen
   CreateFileW \\.\G: (GENERIC_READ)  ->  offen
3. IOCTL_STORAGE_QUERY_PROPERTY  ->  Hersteller: HL-DT-ST | Modell: BD-RE BU40N
                                     | Rev: 1.03 | Serial: 0025114C0149
4. IOCTL_STORAGE_CHECK_VERIFY2   ->  Medium eingelegt
5. IOCTL_CDROM_DISK_TYPE         ->  Win32-Fehler 50
6. IOCTL_DISK_GET_LENGTH_INFO    ->  33.759.690.752 Bytes (33,76 GB)  =>  Blu-ray

Punkt 5 ist kein Fehlschlag. Fehler 50 ist ERROR_NOT_SUPPORTED — genau das, was der Python-Treiber an diesem Laufwerk auch sieht (SAVEPOINT.md, v4.0-rc11, Abschnitt „Das Laufwerk"). Node verhält sich identisch. Die Lehre steht im alten Code und gilt weiter: Die Disc-Einordnung darf sich nicht auf IOCTL_CDROM_DISK_TYPE verlassen — die Größe ist der verlässliche Weg.

Punkt 2 zeigt die Unterscheidung, die in rc11 teuer war: Zugriff 0 fragt das Gerät, GENERIC_READ fragt das Medium. Bei einer gestörten Disc scheitert das zweite und das erste geht weiter — wer nur eins probiert, hält ein antwortendes Laufwerk für tot.


leine.js — die Prozess-Leine (Job Object)

Stellt den Befund aus SAVEPOINT.md v4.0-rc10 nach: Windows räumt Kindprozesse nicht auf. Ein hart beendeter Rippy hinterlässt ein makemkvcon, das das Laufwerk festhält, und jeder spätere Rip scheitert.

Das Skript setzt eine Arbeitsgruppe mit JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, startet ein langlebiges Kind und lässt sich dann hart abschießen — taskkill /F ohne /T, also genau das, was bei einem Absturz und beim Drüber-Installieren passiert.

1. CreateJobObjectW           ->  Arbeitsgruppe angelegt
2. SetInformationJobObject    ->  KILL_ON_JOB_CLOSE gesetzt
3. AssignProcessToJobObject   ->  dieser Prozess hängt in der Gruppe
4. Kindprozess gestartet, PID 16040

vor dem Abschuss:   Eltern lebt: True    Kind lebt: True
taskkill /F /PID 29488  ->  ERFOLGREICH
danach:             Eltern lebt: False   Kind lebt: False

Nachstellen (PowerShell):

$p = Start-Process node -ArgumentList "leine.js" -PassThru -RedirectStandardOutput out.txt
Start-Sleep 3
$kind = (Select-String -Path out.txt -Pattern 'KIND-PID=(\d+)').Matches[0].Groups[1].Value
taskkill /F /PID $p.Id
Start-Sleep 2
Get-Process -Id $kind -ErrorAction SilentlyContinue   # muss LEER sein

sqlite-main.js + sqlite-kern.js — node:sqlite in Electron

Beantwortet die Frage, die in der ersten Fassung des Konzepts als ⚠️ offen stand: Electron baut sein Node mit eigenen Flags — ist node:sqlite dort überhaupt vorhanden?

Gemessen am 30.08.2026 mit Electron 44.0.0, und zwar im utilityProcess — dem Kontext, in dem Rippy v5 seine Datenbank betreiben wird (kern/speicher/db.ts), nicht bloß im Node-Modus der Binary:

KERN-ANTWORT: {"ok":true,"wert":"geht","node":"24.18.1"}
Kern beendet mit 0

Antwort: ja. Die im Konzept vorgesehene Rückfallebene better-sqlite3 wird nicht gebraucht. (Zur Einordnung: In Node 24.19.0 pur war dieselbe Messung zuvor ebenfalls grün.)

Nachstellen:

npm install electron@44 --no-save
node node_modules/electron/install.js
./node_modules/electron/dist/electron.exe sqlite-main.js

Die zweite Zeile ist kein Versehen — siehe nächster Abschnitt.


npm 11 blockiert Install-Skripte — und das trifft Electron selbst

npm warn allow-scripts  koffi@3.1.6 (install: node ./cnoke.cjs -P . --prebuild --release)

koffi lädt trotzdem — es bringt vorgebaute Binärdateien mit. Electron trifft die Sperre härter: 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. Am 30.08.2026 beim sqlite-Beweis selbst hineingelaufen; node node_modules/electron/install.js holt die Binary nach. Beides gehört in die Bau-Anleitung, sonst sucht eines Tages jemand an der falschen Stelle.