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:
1 parent
d07c18441b
commit
684f10eb02
13 files changed
+796
-44
No files matched your search
+45
-8
@@ -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
|
||||
|
||||
|
||||
Reference in new issue
Block a user