# 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 community: greetings: enabled: true minSecondsBetween: 20 maxPerStream: 10 returningAfterDays: 21 milestones: [5, 10, 25, 50, 100] suppressWhileStreamerSpeaking: true overlayHint: true raidScout: minViewers: 5 maxViewers: 30 minUptimeMinutes: 30 maxUptimeMinutes: 300 languages: [de] topN: 5 recap: enabled: true delayMinutesAfterOffline: 10 minStreamMinutes: 20 hideViewerNumbersIfWeak: true topChatters: 3 topClips: 2 loyalty: enabled: false # spaetere Ausbaustufe # 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 /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