S2: obs-websocket, Wiedergabepuffer und der !clip-Ausloeser

Eigener obs-websocket-v5-Client (das Protokoll ist klein genug, und das
Projekt bleibt ohne Abhaengigkeiten). Anmeldung, Wiederverbindung mit
wachsender Pause, Ereignisse fuer ReplayBufferSaved und Szenenwechsel.

Der Clipper loest zwei Wege gleichzeitig aus: OBS-Wiedergabepuffer fuer die
Rohdatei in Aufnahmequalitaet, Twitch-Clip fuer die teilbare URL. Faellt
einer aus, ist der andere trotzdem etwas wert. Ein direkt in OBS gedrueckter
Hotkey wird ohne unseren Umweg erkannt und als vollwertiger Ausloeser
behandelt.

Die Pfaduebersetzung Windows -> Container hat eine eigene Datei und eigene
Tests - das ist die Stelle, an der die Pipeline am ehesten scheitert. Dazu
Warten auf den abgeschlossenen Schreibvorgang, bevor die Datei uebernommen
wird.

Zum Testvektor der OBS-Anmeldung: die Spezifikation nennt Salt und Challenge,
aber kein erwartetes Ergebnis. Der Erwartungswert wurde unabhaengig mit
Pythons hashlib aus derselben Beschreibung gerechnet; der Test sagt das im
Kommentar, statt einen amtlichen Vektor vorzutaeuschen.

29 Tests gruen. Die Abnahme von S2 braucht ein laufendes OBS und steht aus.

Ausserdem: ADR-0006 haelt fest, dass alles unter einem Dach laeuft - eine
lokale Weboberflaeche plus Kindprozesse fuer Rechenarbeit. Die Prozessliste
in der Architekturdoku ist entsprechend ersetzt. Der Onboarding-Assistent
ist als Teil von S5 aufgenommen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013VTGjd92LsDDWF3frd9FTB
This commit is contained in:
ZeasyAlexandClaude Opus 5 committed 2026-09-09 10:10:54 +02:00
1 parent d07c18441b
commit 684f10eb02
13 files changed
+796 -44

No files matched your search

+45 -8
View File
@@ -37,7 +37,8 @@ gibt. Vorher ist sie nur Ballast.
| S0 Container + Toolchain | **fertig** — Image 258 MB, `check-env` ohne harte Fehler |
| Layout eingemessen | **fertig** — `config/layout.yaml`, vorgezogen aus S3 |
| S1 Einrichtung + Auth + DB + IRC-Ingest | **fertig** — 20 Tests grün, Daemon läuft |
| S2–S6 | offen |
| S2 OBS-Anbindung + Trigger | **Code fertig**, 29 Tests grün — Abnahme braucht laufendes OBS |
| S3–S6 | offen |
**S1 abgenommen am 2026-09-09.** Der Daemon läuft, hängt am Chat, die
Einrichtung ist unter `http://localhost:4792/setup` erreichbar.
@@ -146,6 +147,17 @@ Bestätigung im Chat, genau eine pro Auslösung.
**Fertig, wenn:** `!clip` im laufenden Stream erzeugt binnen 5 s eine
`raw.mp4` im Ablageordner und eine Chat-Rückmeldung.
**Stand 2026-09-09:** Code steht und ist getestet, soweit es ohne OBS geht —
obs-websocket-Client mit Anmeldung und Wiederverbindung, Pfadübersetzung
Windows → Container, Abklingzeiten, Twitch-Clip parallel, Übernahme der Rohdatei
mit Warten auf fertigen Schreibvorgang. Der OBS-Hotkey wird ohne unseren Umweg
erkannt und als vollwertiger Auslöser behandelt.
Die **Abnahme steht aus**: Auf dieser Entwicklungsmaschine läuft kein OBS. Was
geprüft ist: Anmeldeverfahren (gegen eine unabhängige Zweitimplementierung),
Pfadübersetzung in allen vier Fällen, Warten auf die fertige Datei. Was
ungeprüft bleibt: das tatsächliche Gespräch mit einem laufenden OBS.
### S3 — 9:16-Render · ~1,5 Tage
`calibrate`-Kommando: zieht einen Frame aus einer Replay-Datei, schreibt ihn
@@ -170,15 +182,40 @@ mindestens 320 px. Ins Video kommt weiterhin die Mischung von Spur 1.
Untertitel, und der Text wird auf dem Handy von der TikTok-Oberfläche nicht
verdeckt.
### S5 — Sichtung · ~1 Tag
### S5 — Oberfläche: Onboarding und Sichtung · ~2 Tage
Ein kleiner HTTP-Server auf Port 4792 liefert eine Seite mit allen Kandidaten
des letzten Streams: Videovorschau, Score, Auslöser, der Chat-Ausschnitt aus
dem Clip-Fenster, Transkript, und die Knöpfe *Übernehmen* / *Verwerfen*.
Übernommene Clips wandern nach `data/clips/_upload/`.
**Erststart-Assistent.** Die heutige Einrichtungsseite ist ein Formularblock —
das reicht für mich, nicht für Abdu. Der Assistent führt durch sechs Schritte
und **prüft jeden davon live**, statt zu behaupten, es sei erledigt:
**Fertig, wenn:** Nach einem Stream lässt sich in unter zwei Minuten
entscheiden, welche Clips hochgeladen werden.
| Schritt | Wird geprüft |
|---|---|
| 1. Kanal bestätigen | Kanal existiert (Helix) |
| 2. Twitch-Apps anlegen | Redirect-URI zum Kopieren, Anleitung |
| 3. Verbinden | Token gültig, Scopes vollständig |
| 4. OBS | erreichbar, Wiedergabepuffer aktiv, Hotkey belegt |
| 5. Facecam einmessen | Vorschau direkt in der Seite |
| 6. Fertig | „So löst du einen Clip aus" |
**Warum diese Scheibe hinten liegt:** Die Prüfungen sind nur so viel wert, wie
es zu prüfen gibt. Ein OBS-Schritt, der behauptet „alles gut", ohne den
Wiedergabepuffer wirklich abzufragen, ist schlimmer als kein Schritt. Deshalb
**erweitert jede Scheibe ab S2 den Assistenten um ihren eigenen Schritt**, und
S5 macht daraus einen zusammenhängenden Ablauf mit Texten, Reihenfolge und der
Startseite danach.
Danach wird aus der Einrichtungsseite eine Einstellungsseite, und die Startseite
zeigt den laufenden Stream und die anstehenden Entscheidungen — nicht eine Liste
von Werkzeugen (siehe [ADR-0006](decisions/ADR-0006-ein-dach.md)).
**Sichtung.** Auf derselben Oberfläche eine Seite mit allen Kandidaten des
letzten Streams: Videovorschau, Punktzahl, Auslöser, der Chat-Ausschnitt aus dem
Clip-Fenster, Transkript, und die Knöpfe *Übernehmen* / *Verwerfen*. Übernommene
Clips wandern nach `data/clips/_upload/`.
**Fertig, wenn:** Ein Fremder kommt von „nichts eingerichtet" bis zum ersten
eigenen Clip, ohne die Dokumentation zu lesen. Und: nach einem Stream lässt sich
in unter zwei Minuten entscheiden, welche Clips hochgeladen werden.
### S6 — Erstchatter-Begrüßung · ~0,5 Tage · optional