Files
Homelab--Bratonein-Kontroll…/Kapitel 13/Tutorial.md

6.7 KiB
Raw Blame History

Abschnitt 3 n8n ↔ Twitch: VOD & Clips importieren, in Nextcloud ablegen, Clipper starten

In diesem Abschnitt verbinden wir n8n mit Twitch, legen die Dateien auf dem Clipper ab und laden sie nach Nextcloud hoch. Wichtig: Twitch unterscheidet zwischen deinem Login (sichtbarer Kanalname, z. B. bratonien_tv) und deiner User-ID (eine numerische Kennung, z. B. 123456789). Alle späteren Abfragen nutzen die User-ID, nicht den Login. Wir holen sie zuerst und tragen sie dann überall ein.


Schritt 1: Zugänge vorbereiten

1.1 SSH von n8n → Clipper (passwortlos)
Wechsle in den n8n-LXC und richte eine Schlüssel-Anmeldung zum Clipper-LXC ein:

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""
ssh-copy-id clipper@<CLIPPER-IP>
ssh clipper@<CLIPPER-IP> "echo OK"

Ersetze <CLIPPER-IP> durch die IP/den Hostnamen deines Clipper-Containers (z. B. 10.0.0.42). Wenn OK erscheint, steht die Verbindung.

1.2 Nextcloud App-Passwort (WebDAV)
Erzeuge in Nextcloud (Einstellungen → Sicherheit → App-Passwörter) ein App-Passwort. n8n verwendet später Basic Auth (Benutzername = <DEIN_NC_BENUTZER>, Passwort = App-Passwort) gegen genau dieses WebDAV-Schema:

https://<DEINE_NEXTCLOUD_DOMAIN>/remote.php/dav/files/<DEIN_NC_BENUTZER>/

Beispiel: https://stream.example.com/remote.php/dav/files/streamer/

1.3 Twitch OAuth (Client-Credentials)
Lege in der Twitch Developer Console eine App an und notiere Client ID und Client Secret. In n8n → Credentials → OAuth2:
Grant Type = Client Credentials, Access Token URL = https://id.twitch.tv/oauth2/token, Client ID/Secret eintragen, speichern. Details zum Auth-Flow findest du auch in der Twitch Auth-Dokumentation.


Schritt 2: Deine Twitch User-ID (numerisch) einmalig ermitteln

Viele scheitern hier: Die Helix-API benötigt immer die User-ID, nicht den Login. Wir holen sie in n8n mit einem HTTP Request. Setze das eben angelegte OAuth2-Credential ein und trage zusätzlich den Header Client-Id: <DEINE_CLIENT_ID> ein. URL:

https://api.twitch.tv/helix/users?login=<DEIN_LOGIN>

Ersetze <DEIN_LOGIN> durch deinen sichtbaren Kanal-Login, exakt wie auf Twitch (z. B. bratonien_tv). Die Antwort enthält unter data[0].id deine User-ID (z. B. 123456789). Notiere diese Zahl und verwende sie ab jetzt überall als <DEINE_TWITCH_USER_ID>. Offizielle Referenz: Twitch API Get Users.


Schritt 3: Workflow in n8n VOD erkennen → herunterladen → Nextcloud → Analyse

3.1 Neueste VOD-Metadaten holen (mit User-ID, nicht Login)
Lege in n8n einen Cron-Trigger (z. B. alle 10 Minuten) an. Dahinter ein HTTP Request:

https://api.twitch.tv/helix/videos?user_id=<DEINE_TWITCH_USER_ID>&type=archive&first=1

Auch hier: OAuth2-Credential + Header Client-Id: <DEINE_CLIENT_ID>. In data[0] stehen id, title, url, created_at, published_at. Speichere die letzte verarbeitete id in der Static Data; wenn die neue id identisch ist, beende den Lauf.

Offizielle Referenz: Twitch API Get Videos.

3.2 (Optional) Clips zum VOD laden
Füge einen zweiten HTTP Request an, der die Clips im Zeitraum des VOD abruft. Nutze die numerische User-ID als broadcaster_id und die ISO-Zeitstempel aus dem VOD:

https://api.twitch.tv/helix/clips?broadcaster_id=<DEINE_TWITCH_USER_ID>&started_at=<created_at>&ended_at=<published_at>

Das Ergebnis ist eine Liste mit Clip-IDs (z. B. AgileClip-XYZ). Offizielle Referenz: Twitch API Get Clips.

3.3 VOD direkt auf dem Clipper speichern (SSH)
Damit große Dateien nicht zwischen Containern geschoben werden, lädt der Clipper-LXC selbst. In n8n fügst du einen Execute Command (SSH) ein (Ziel: clipper@<CLIPPER-IP>):

mkdir -p "/srv/clipper/inbox/{{ $json.data[0].id }}"
yt-dlp -o "/srv/clipper/inbox/{{ $json.data[0].id }}/%(title)s.%(ext)s" {{ $json.data[0].url }}

So entsteht lokal /srv/clipper/inbox/<VOD-ID>/Titel.mp4. Achte auf die Anführungszeichen viele Titel enthalten Leerzeichen.

3.4 (Optional) Twitch-Clips ablegen
Für jeden Clip rufst du per SSH yt-dlp mit der öffentlichen URL auf (z. B. https://clips.twitch.tv/<CLIP_ID>). Lege je Clip einen Unterordner an, damit alles getrennt bleibt (z. B. /srv/clipper/inbox/<CLIP_ID>/…).

3.5 Upload nach Nextcloud (WebDAV, Basic Auth)
In n8n nutzt du für jede Datei einen HTTP Request (Methode PUT) auf das WebDAV-Ziel. Zusammensetzung des Pfads:

https://<DEINE_NEXTCLOUD_DOMAIN>/remote.php/dav/files/<DEIN_NC_BENUTZER>/Clips/{{ $json.data[0].id }}/<Dateiname>

Beispiel: https://stream.example.com/remote.php/dav/files/streamer/Clips/2075310051/Titel.mp4

3.6 Analyse auf dem Clipper starten
Zum Schluss stößt n8n die Analyse mit einer eindeutigen Job-ID an. Per SSH:

/srv/clipper/bin/clipper-analyze \
  "/srv/clipper/inbox/{{ $json.data[0].id }}/{{ $json.data[0].title }}.mp4" \
  "vod-{{ $json.data[0].id }}"

Das Skript legt eine candidates.json im temporären Job-Ordner an. Mit dieser Datei arbeiten wir in Abschnitt 4 weiter.


Alternativ (wenn du möchtest): Twitch-Community-Node in n8n

Falls du statt „HTTP Request“ einen fertigen Twitch-Node verwenden willst, kannst du in self-hosted n8n einen Community-Node installieren. Das ist bequemer, erfordert aber zusätzliche Pflege (Updates, öffentliche Erreichbarkeit für Webhooks). Für einen robusten Dauerbetrieb bleibt der oben beschriebene Weg über die offizielle Helix-API die zuverlässigste Variante. Mehr Infos findest du im n8n Community Nodes Guide.


Kurz prüfen, ob alles passt

Logge dich auf dem Clipper ein und kontrolliere Downloads und Logs:

su - clipper
ls -lh /srv/clipper/inbox
ls -lh /srv/clipper/inbox/<VOD-ID>
tail -n 80 /srv/clipper/logs/clipper.log

In Nextcloud sollte ein Ordner Clips/<VOD-ID>/… mit den Dateien erscheinen. Bei 401/403-Fehlern prüfe Twitch-Headers (OAuth2 + Client-Id) und Nextcloud-Pfad/Anmeldedaten exakt Groß/Kleinschreibung und der Teil remote.php/dav/files/… sind entscheidend.

Damit ist die Twitch-Anbindung vollständig implementiert: n8n erkennt neue VODs, lädt VOD und Clips auf dem Clipper, speichert alles strukturiert in Nextcloud und startet die Analyse. Im nächsten Abschnitt kombinieren wir die Clipper-Analyse mit der KI-Auswertung und erzeugen daraus belastbare Schnittbereiche.