Files
abdulive/docs/05-setup.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

5.5 KiB

Setup

Eine native Windows-Anwendung. Node, ffmpeg, whisper.cpp und die Schriften sind mitgeliefert — vorausgesetzt wird nur OBS. Begruendung: ADR-0007.

Voraussetzungen

Was Version Anmerkung
Windows 10 oder 11, 64 Bit
OBS Studio 30+ mit obs-websocket v5 derselbe Rechner

Mehr nicht. Kein Docker, kein WSL2, kein Compiler, kein Git.

Installieren

Das Paket herunterladen, entpacken, darin install.ps1 ausfuehren:

Expand-Archive .\abdulive-0.5.0-win-x64.zip -DestinationPath .\abdulive
.\abdulive\install.ps1

Liegt das Paket an einer Adresse ohne Anmeldung, holt der Installer es selbst:

.\install.ps1 -Quelle https://.../abdulive

Ein irm … | iex-Einzeiler funktioniert mit git.zeasy.dev nicht. Die Instanz verlangt fuer alles eine Anmeldung und antwortet mit einer Umleitung auf /user/login; iex fuehrt dann die Anmeldeseite als PowerShell aus. Wo die Pakete liegen sollen, ist noch zu entscheiden.

Der Installer laeuft ohne Administratorrechte:

Was Wohin
Programm %LOCALAPPDATA%\Programs\abdulive
Daten, Datenbank, Clips %LOCALAPPDATA%\abdulive
Autostart Aufgabe abdulive, bei der Anmeldung
Update-Pruefung Aufgabe abdulive-update, taeglich 05:00

Beim ersten Start warnt Windows SmartScreen vor einem unbekannten Herausgeber — das Paket ist nicht signiert. Einmal auf Weitere Informationen → Trotzdem ausfuehren.

Twitch-Apps anlegen

Zwei Anwendungen unter https://dev.twitch.tv/console/apps:

  1. abdulive-toolkit — OAuth Redirect http://localhost:4792/callback
  2. abdulive-bot — gleicher Redirect

Client-ID und Client-Secret nicht in eine Datei eintragen, sondern später im Einrichtungs-Assistenten einfügen (siehe unten). Begründung: ADR-0005.

OBS vorbereiten

  1. obs-websocket aktivieren: Werkzeuge → WebSocket-Servereinstellungen → Server aktivieren, Port 4455, Passwort setzen — eingetragen wird es später im Einrichtungs-Assistenten.
  2. Wiedergabepuffer aktivieren: Einstellungen → Ausgabe → Wiedergabepuffer, 90 Sekunden. Den Zielordner merken und in .env als OBS_REPLAY_DIR eintragen — mit Forward-Slashes, z. B. C:/Users/abdu/Videos/replay.
  3. Hotkey setzen: Einstellungen → Hotkeys → „Wiedergabepuffer speichern". Das ist der Clip-Knopf. Ein globaler Windows-Hotkey wird bewusst nicht gebaut — aus einem Container ist er nicht abfangbar, und OBS meldet den gespeicherten Puffer ohnehin über WebSocket.
  4. Getrennte Audiospuren (bereits eingerichtet): Mikrofon auf Spur 2, Spielton auf Spur 3, Mischung auf Spur 1. Die Untertitel werden aus Spur 2 erzeugt - das ist bei lauten Spielen der Unterschied zwischen brauchbarem und unbrauchbarem Transkript. Einstellungen -> Ausgabe -> Aufnahme -> Audiospuren, und im Audiomixer je Quelle die Spurzuordnung pruefen.
  5. Browser-Sources (erst ab Meilenstein M3 relevant): „Browser-Quelle beim Szenenwechsel neu laden" aus, sonst brechen laufende Effekte ab.

Erste Einrichtung

abdulive check-env       # ffmpeg, whisper, Schriften, Verzeichnisse, Layout
abdulive fetch-model     # Sprachmodell, ca. 465 MB
Start-ScheduledTask -TaskName abdulive

Dann http://localhost:4792/setup oeffnen: Client-ID und Secret der beiden Twitch-Apps eintragen und je einmal auf „Mit Twitch verbinden" klicken.

Layout einmessen

abdulive calibrate

Legt einen Frame als PNG unter %LOCALAPPDATA%\abdulive\clips\_calibration ab und rendert die 9:16-Vorschau dazu. Anleitung: obs-layout.md.

Welche OBS-Quelle im Ausschnitt landet — etwa fremde Untertitel:

abdulive sources

Betrieb

Start-ScheduledTask -TaskName abdulive     # startet
Stop-ScheduledTask  -TaskName abdulive     # stoppt
Get-Content "$env:LOCALAPPDATA\abdulive\logs\abdulive.log" -Wait -Tail 40

Sichtungsseite: http://localhost:4792

Aktualisieren

abdulive update

Prueft das Manifest, laedt das Paket, vergleicht die SHA256 und legt es bereit. Die Adresse steht in config.yaml unter update.url und hat keine Vorgabe — ohne Eintrag sagt der Befehl das auch. Liegt die Ablage hinter einer Anmeldung, gehoert ein Lese-Token in den verschluesselten Speicher (Einrichtungsseite), nicht in die config.yaml. Eingespielt wird es beim naechsten Start — waehrend eines Streams wird nichts ausgetauscht. Sofort uebernehmen:

Stop-ScheduledTask -TaskName abdulive; Start-ScheduledTask -TaskName abdulive

Die Aufgabe abdulive-update macht die Pruefung taeglich um 05:00 von selbst.

Backup

.\scripts\backup.ps1

Kopiert die Datenbank per VACUUM INTO aus %LOCALAPPDATA%\abdulive\db nach backup\ und haelt 30 Generationen. VACUUM INTO und nicht einfach kopieren: die Datei wird im laufenden Betrieb gesichert, und ein Kopieren waehrend eines Schreibvorgangs ergaebe eine unbrauchbare Sicherung.

Die Datenbank liegt seit ADR-0007 in einem gewoehnlichen Windows-Ordner. Der Grund fuer das fruehere Docker-Volume - unzuverlaessige Dateisperren ueber die WSL2-Bruecke - ist mit dem Container weggefallen.

Was nicht ins Repo gehört

.env, config/config.yaml, alles unter data/. Steht in .gitignore. Die Datenbank enthält personenbezogene Daten (Chatverläufe, Notizen zu Zuschauern) und darf nicht committet oder geteilt werden.