Files
abdulive/docs/offene-punkte.md
T
ZeasyAlexandClaude Opus 5 5f6301268a Native Windows-Auslieferung statt Container
Docker faellt weg. Das Projekt hat keine npm-Abhaengigkeiten und Node fuehrt
TypeScript direkt aus - der Container schrieb nur noch drei Programme fest,
und dafuer braucht es keine Virtualisierung, sondern einen Ordner.

Der Anlass war, dass ADR-0004 zwar `docker compose pull` versprach, es aber
nie ein veroeffentlichtes Image gab. Wer installieren wollte, musste
whisper.cpp aus dem Quelltext uebersetzen.

Plattformschicht (packages/core/src/platform.ts):
- Programme werden neben der Anwendung gesucht, nicht im PATH
- Daten unter %LOCALAPPDATA%, damit Installation und Update ohne
  Administratorrechte auskommen
- Schriften mitgeliefert: ohne fontsdir setzt libass wortlos eine
  Ersatzschrift ein - gemessen 720 statt 826 Pixel Zeilenbreite

Windows-Eigenheiten, an echtem ffmpeg 8.1 durchprobiert:
- Pfade im Filtergraphen brauchen alle drei Schritte (Vorwaertsschraegstriche,
  escapter Doppelpunkt, Anfuehrungszeichen); je zwei davon reichen nicht
- `nice` gibt es nicht, ersetzt durch os.setPriority

Auslieferung:
- scripts/build-package.ts baut das Paket, laeuft auch unter Linux
- install.ps1 ohne Administratorrechte, Autostart ueber den Aufgabenplaner
- update legt neue Fassungen bereit; eingespielt wird beim naechsten Start,
  nie mitten im Stream
- ZIP lesen und schreiben ohne Abhaengigkeiten (packages/core/src/zip.ts)

Kein `irm ... | iex`-Einzeiler: git.zeasy.dev antwortete instanzweit mit einer
Umleitung auf /user/login, und `iex` fuehrte die Anmeldeseite als PowerShell
aus. Der Updater verfolgt Umleitungen jetzt nicht und hat keine erfundene
Vorgabeadresse mehr.

Ausserdem: backup.ps1 war an zwei Stellen dokumentiert, aber nie geschrieben.

ADR-0007 ersetzt ADR-0004. 84 Tests, Typpruefung sauber.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AhVSfMFdWnXKCv5JfLnArZ
2026-09-09 17:39:26 +02:00

6.3 KiB

Offene Punkte

Stand 2026-09-09. Sortiert nach Dringlichkeit, nicht nach Aufwand. Erledigtes wandert raus, nicht ins Archiv — die Historie steht in Git.

Blockiert, bis jemand am Stream-PC sitzt

  • S2 abnehmen. Der obs-websocket-Client ist gebaut und getestet, soweit es ohne OBS geht: Anmeldeverfahren, Pfadübersetzung, Warten auf die fertige Datei. Ungeprüft ist das tatsächliche Gespräch mit einem laufenden OBS. Bis dahin ist !clip nicht bewiesen.
  • Strecke IRC → Datenbank im Livebetrieb. Die Teile sind einzeln getestet, die Verdrahtung wird erst beim ersten echten Stream sichtbar.
  • Layout umstellen nach obs-layout.md und danach calibrate laufen lassen.

Bekannte Lücke im Betrieb

  • Aufräumen im Arbeitsordner. Jede Rohdatei landet unter work/<clipId>/ und bleibt dort liegen. Bei fünf Clips pro Stream und mehreren hundert MB je Datei läuft das Volume in wenigen Wochen voll. Gebraucht wird eine Aufbewahrungsregel — Vorschlag: Rohdateien der letzten 30 Clips behalten, ältere löschen, sobald status = 'rendered'. Das ist der Punkt, der als Erstes weh tun wird.
  • Was passiert, wenn der Rechner mitten im Rendern ausgeht? Clips bleiben auf status = 'raw' stehen und werden nach Neustart nicht wieder eingereiht.

Untertitel verbessern

Der Durchlauf am echten Clip war brauchbar, aber nicht gut. Was auffiel:

  • Größeres Modell testen. ggml-small machte aus „Danke" ein „Dank es" und aus „Sabrina" ein „Savina". medium ist etwa dreimal so langsam — bei 30-Sekunden-Clips nach dem Stream ist das egal. Vergleich an demselben Clip fahren und entscheiden.
  • Wörter mit niedriger Wahrscheinlichkeit prüfen. Whisper liefert je Token ein p. Bei den Fehlgriffen lag es unter 0,15, bei korrekten Wörtern über 0,9. Entweder weglassen oder gedimmt anzeigen.
  • Schrift. DejaVu Sans ist im Image vorhanden, aber unauffällig. Auf Shorts trägt eine fettere, rundere Schrift (Montserrat ExtraBold, Inter Black). Braucht eine Schriftdatei im Image und eine Lizenzprüfung.
  • Nur das aktuelle Wort hervorheben statt fortlaufend einzufärben. Der heutige Karaoke-Effekt lässt gesprochene Wörter gefärbt stehen; der Stil, der auf TikTok funktioniert, hebt genau ein Wort hervor. Braucht mehrere Dialogzeilen je Zeile statt einer.
  • Position prüfen. 340 px Abstand nach unten ist geschätzt, nicht gemessen. An einem echten Handy gegen die TikTok-, Reels- und Shorts-Oberfläche halten.
  • Seitliche Ränder gegengeprüft, aber nur rechnerisch gegen eine gemessene mittlere Zeichenbreite. Bei einer anderen Schrift (siehe Punkt oben) muss CHAR_WIDTH_RATIO in subtitles.ts neu eingemessen werden — sonst bricht die Zeile wieder an der falschen Stelle.
  • Nur transkribieren, wenn Abdu spricht. Bei getrennten Tonspuren reicht ein Pegelfilter auf der Mikrofonspur, damit aus Stille kein erfundener Text wird.

Streamsetup

  • Live-Captions verschieben. Sie liegen im Gameplay-Band und sind fest eingebrannt. Zwei Vorschläge stehen in obs-layout.md. Welche OBS-Quelle sie überhaupt zeichnet, sagt abdulive sources — das war vorher unbekannt.
  • Spieluntertitel abschalten.
  • Bessere Bildquelle für die Facecam — Plugin Source Record oder Aitum Vertical. Damit entfällt die 2,25-fache Vergrößerung. Lohnt sich erst, wenn regelmäßig Shorts entstehen.

Auslieferung

  • Wo liegen die Pakete? Das ist die Entscheidung, die als Naechstes ansteht — ohne sie funktioniert abdulive update gar nicht. git.zeasy.dev verlangt instanzweit eine Anmeldung: /explore, die API und jede Rohdatei antworten mit 303 auf /user/login. Ein irm … | iex-Einzeiler bekommt dadurch die Anmeldeseite und versucht, sie als PowerShell auszufuehren. Drei Wege: (a) eine Ablage ohne Anmeldung, etwa dl.zeasy.software — am einfachsten, und das Paket enthaelt ohnehin den vollstaendigen Quelltext als lesbare .ts-Dateien; (b) Gitea-Release plus Lese-Token auf Abdus Rechner — der Token darf dann aber das ganze private Repo lesen; (c) kein Updater, Alexander spielt neue Fassungen per Fernwartung ein. Code und Installer sind auf (a) und (b) vorbereitet: update.url in der config.yaml, Token im verschluesselten Speicher.

  • Code-Signing. Das Paket ist nicht signiert, SmartScreen warnt bei jeder Installation vor einem unbekannten Herausgeber. Ein OV-Zertifikat kostet rund 200 EUR im Jahr, ein EV-Zertifikat mehr und braucht Hardware. Solange nur Abdu installiert, reicht ein Klick auf "Trotzdem ausfuehren" - sobald jemand Drittes das Paket bekommt, nicht mehr.

  • CI auf git.zeasy.dev. scripts/build-package.ts laeuft bisher von Hand. Als Forgejo-Action beim Tag gebaut und als Veroeffentlichung hochgeladen, findet abdulive update sie von allein.

  • Update noch nie im Feld gelaufen. Bereitlegen und Pruefsumme sind getestet, der Tausch durch launcher.ps1 nur gelesen. Vor dem ersten echten Update einmal kuenstlich durchspielen.

  • Hardware-Encoding. Der mitgelieferte ffmpeg kann QSV, AMF und NVENC (--enable-libvpl, --enable-amf, --enable-ffnvcodec) - aus WSL2 heraus ging das nicht. clipper.ffmpeg.encoder steht weiter auf libx264. Auf Abdus Rechner messen, ob h264_qsv etwas bringt.

Nach dem MVP

  • Spitzen-Erkennung scharf schalten. Sie läuft mit und schreibt jeden Kandidaten samt Punktzahl in events. Sobald ein paar Streams protokolliert sind: an echten Daten kalibrieren, dann armed: true.
  • Automatischer Upload zu TikTok und YouTube.
  • EventSub für Follows, Subs, Raids — bisher reicht IRC plus Polling.
  • Follower-Prüfung bei !clip, falls die Abklingzeiten nicht reichen.
  • Die übrigen acht Werkzeuge, siehe 04-roadmap.md.

Kleinigkeiten

  • Die Fortschrittsanzeige schreibt \r-Zeilen; im Protokoll der Aufgabe sieht das unschoen aus. Beim Umleiten in eine Datei besser unterdruecken.