Files
abdulive/config/config.example.yaml
ZeasyAlexandClaude Opus 5.5 d00550aa37 Rueckbau: gestrichene Werkzeuge entfernt, Hub schreibt keinen Chat mehr mit
Raid-Scout, Auswertung, VOD-Kapitel, Community-Gedaechtnis, Punkteshop
und Recap samt Platzhaltern, Spezifikationen und Konfiguration. Der Hub
schickt am Chat zusaetzlich die Sendezeit mit, fuer die Uhrzeit im Pult.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 19:16:04 +01:00

158 lines
5.8 KiB
YAML

# Kopie als config/config.yaml anlegen. Secrets gehoeren in .env, nicht hierher.
channel:
login: abdulive_
userId: "" # wird beim ersten `pnpm auth` gefuellt
language: de
timezone: Europe/Berlin
bot:
login: abdulive_bot
ingest:
viewerPollSeconds: 60
chattersPollSeconds: 300
sessionGapMinutes: 5 # kuerzere Luecken gelten als derselbe Stream
spike:
windowSeconds: 15
baselineMinutes: 10
factor: 3
minDelta: 4
cooldownSeconds: 60
armed: false # erst nach Kalibrierung auf true
laughEmotes: [KEKW, LUL, OMEGALUL, PogChamp, Pog]
# Woher `abdulive update` neue Fassungen holt. Erwartet wird dort
# `abdulive.json` und die darin genannte ZIP-Datei.
#
# Leer = keine automatischen Updates. Liegt die Adresse hinter einer
# Anmeldung (privates Gitea), gehoert der Zugriffstoken NICHT hierher,
# sondern auf die Einrichtungsseite - siehe ADR-0005.
update:
url: "https://git.zeasy.dev/ZeasyAlex/abdulive/releases/download/latest"
obs:
url: ws://127.0.0.1:4455
replayBufferSeconds: 90
chapterScenes: [Gameplay, "Just Chatting", Startbildschirm]
clipper:
enabled: true
source: obs-replay # obs-replay | twitch
alsoCreateTwitchClip: true
# Aus dem 90-Sekunden-Puffer werden die letzten Sekunden genommen -
# dort liegt der Moment, der die Ausloesung verursacht hat.
tailSeconds: 45
renderWhileLive: false # true = sofort rendern, false = erst nach Streamende
audio:
# OBS nimmt getrennte Spuren auf. Untertitel entstehen NUR aus dem Mikrofon -
# Spielton im Transkript macht Whisper unbrauchbar. Die Spur im fertigen
# Video bleibt die Mischung.
transcribeTrack: 2 # OBS-Spur mit dem Mikrofon
outputTrack: 1 # OBS-Spur mit der Mischung (kommt ins Short)
whisper:
binary: whisper-cli # whisper.cpp, im Image enthalten
model: ggml-small.bin
language: de
threads: 4
ffmpeg:
preset: veryfast
crf: 20
encoder: libx264 # keine NVIDIA-GPU da, QSV aus WSL2 unzuverlaessig
niceness: 15 # Encoding laeuft nachrangig zum Stream
# Abklingzeiten sind nicht optional: ohne sie ist !clip nach zwei Streams aus.
cooldownGlobalSeconds: 60
cooldownUserSeconds: 300
followersOnly: false
triggers:
chatCommand: "!clip"
onSpike: false # erst nach Kalibrierung der Spitzen-Erkennung
# Der Hotkey wird in OBS auf "Wiedergabepuffer speichern" gelegt. Es gibt
# bewusst keinen eigenen Hotkey-Dienst - siehe ADR-0004, Punkt 4.
# Go-Live-Ankuendigung auf Discord.
#
# mode: live -> Post in #ankuendigungen, mit Ping an die Rolle Live-Ping
# draft -> derselbe Post in #technik-log, ohne Ping. Zum Zusehen.
#
# Zum Ausprobieren, ohne auf einen Stream zu warten:
# abdulive golive:test (interner Kanal, ohne Ping)
# abdulive golive:test --echt (echter Kanal, mit Ping)
broadcaster:
enabled: true
mode: live
# Twitch setzt Titel und Kategorie erst kurz nach dem Start. Wer sofort
# postet, kuendigt regelmaessig den Titel des letzten Streams an.
delaySecondsAfterOnline: 60
# Innerhalb dieser Zeit wird kein zweites Mal angekuendigt. Faengt den Fall
# ab, dass Twitch nach einem Aussetzer eine neue Stream-ID vergibt.
cooldownHours: 6
pingRole: Live-Ping # leer = Post ohne Ping
obsScreenshot: true # Vorschaubild aus OBS statt von Twitch
platforms:
discord: true
bluesky: false # noch nicht gebaut
mastodon: false
instagramStoryImage: false
# Kanalpunkt-Belohnungen und was sie ausloesen.
#
# Zugeordnet wird ueber den Titel der Belohnung auf Twitch (Gross-/Klein-
# schreibung egal) oder ueber die stabile ID; liegt beides vor, gewinnt die ID.
# Belohnungen, die hier nicht stehen, werden protokolliert und sonst in Ruhe
# gelassen - nicht jede Belohnung geht das Toolkit etwas an.
#
# Aktionen: konfetti | emote-regen | einblendung | tts | liegestuetze | nichts
rewards:
enabled: false # aus, bis hier bewusst Belohnungen stehen
belohnungen: []
# Beispiel:
# belohnungen:
# - titel: Konfetti
# aktion: konfetti
# - titel: Nachricht vorlesen
# aktion: tts
# maxZeichen: 150
# - titel: 5 Liegestütze
# aktion: liegestuetze
# anzahl: 5 # so viele kommen je Einloesung dazu
tts:
# Vorgabe ist die Freigabe von Hand, und das aus gutem Grund: Kanalpunkte
# sammeln sich beim Zugucken von allein an und sind damit kaum eine
# Huerde. Auf `false` gestellt hat man eine Vorlesefunktion fuer Fremde
# im eigenen Stream. Siehe docs/projects/chat-control.md.
freigabe: true
maxZeichen: 200
# Zu langer Text wird abgelehnt, nicht gekuerzt - ein halb vorgelesener
# Satz ist schlimmer als gar keiner.
blockliste: []
proPersonProStunde: 3
# Gesprochen wird im Hub mit Piper, nicht im Browser - dort haengt die
# Stimme am Rechner, der streamt. Name einer Datei unter models/piper/
# (ohne .onnx) oder ein absoluter Pfad. Einrichten: scripts/install-piper.sh
stimme: de_DE-thorsten-medium
# Nur bei Stimmen mit mehreren Sprechern, z. B. de_DE-mls-medium (0-235).
# Die klang im Stream allerdings verwaschen.
# sprecher: 0
# Overlay-Server. Zugleich die einzige Tuer nach aussen, wenn der Dienst
# zentral laeuft: Uebersicht, Einrichtung und OAuth-Rueckruf haengen daran.
overlay:
port: 4791
enabled: true
# Oeffentliche Adresse, ohne Schraegstrich am Ende.
#
# Leer = der Dienst laeuft lokal und bindet an 127.0.0.1. Ist etwas gesetzt,
# bindet er an 0.0.0.0 (der Reverse-Proxy sitzt in einem anderen Container)
# und der OAuth-Rueckruf von Twitch geht an <publicUrl>/callback - genau so
# muss er auch in der Twitch-App hinterlegt sein.
#
# Die Umgebungsvariable PUBLIC_URL gewinnt gegen diesen Wert.
publicUrl: ""
dashboard:
port: 4792
ingestServer:
port: 4790