Kapitel 13/Tutorial.md hinzugefügt

This commit is contained in:
2025-08-24 23:04:22 +00:00
parent ac07e54b91
commit c750272395

192
Kapitel 13/Tutorial.md Normal file
View File

@@ -0,0 +1,192 @@
# 🛠️ Kapitel 13 Clipper (Tutorial)
---
## Einleitung
Clips sind der beste Weg, lange Streams in kurze, teilbare Highlights zu verwandeln. Unser Ziel in diesem Kapitel: Wir bauen ein System, das neue Videos automatisch erkennt, sinnvolle Stellen analysiert, passende Highlights schneidet und die Ergebnisse in Nextcloud ablegt inklusive Titeln und Hashtags für jede Plattform. Der Clipper selbst übernimmt dabei die technische Verarbeitung, während **n8n** für Steuerung, Analyse und Benachrichtigungen sorgt. Das System bleibt dadurch flexibel, ressourcenschonend und jederzeit erweiterbar.
---
## Voraussetzungen
- **Proxmox LXC** mit Debian 12 (Bookworm)
- **Nextcloud** (Pflicht, Zielort für Clips & Metadaten)
- **n8n-Instanz** (Automatisierung, Steuerung Clipper, Analyse, Metadaten-Erzeugung)
- **Twitch-Entwickler-Account** inkl. API-Key (für VOD- und Clip-Zugriff)
- **Optional**: RTMP-Server, falls VODs lokal aufgezeichnet werden
- **Ressourcen für den LXC**: 1 vCPU, 12 GB RAM, 10 GB Speicher reichen aus
- **Grundwissen**: SSH-Verbindung, Nano-Editor, Basiskenntnisse in n8n
---
## Vorbereitung
Wir beginnen mit einem frischen Debian12LXC in Proxmox, benennen ihn `clipper` und vergeben die im Abschnitt oben genannten Ressourcen. Danach bringen wir das System auf Stand und installieren die Grundwerkzeuge:
```bash
apt update && apt upgrade -y
apt install -y curl nano unzip ffmpeg inotify-tools
```
Eine korrekte Systemzeit ist entscheidend, da Schnittmarken später auf exakten Sekunden basieren. Prüfe die Zeit mit:
```bash
timedatectl status
```
Wenn hier UTC steht und du lieber „Europe/Berlin“ nutzen willst:
```bash
timedatectl list-timezones | grep Europe
timedatectl set-timezone Europe/Berlin
timedatectl status
```
Die Zeit wird sofort angepasst, Logs und Schnittzeiten passen damit zur lokalen Umgebung.
Zum Schluss legen wir die Arbeitsordner an:
```bash
mkdir -p /srv/clipper/{watch,out,temp,logs}
```
- `watch` Eingangsordner für neue Videos (egal ob von Twitch oder RTMP)
- `out` fertige Clips und Metadaten
- `temp` Zwischenspeicher für Analyse
- `logs` Protokolle aller Abläufe
Damit ist das Fundament gelegt.
---
## Abschnitt 2 Clipper-LXC einrichten (Basisdienste & Einstiegsskripte)
Jetzt richten wir Clipper so ein, dass er klare Einstiegspunkte zum **Analysieren** und **Schneiden** hat. Die eigentliche Logik füllen wir in Abschnitt 4 und 5, hier bauen wir das Gerüst.
### Benutzer und Verzeichnisse
Zuerst legen wir den Service-Benutzer an und weisen ihm die Arbeitsordner zu:
```bash
adduser clipper
mkdir -p /etc/clipper
chown root:clipper /etc/clipper
chmod 750 /etc/clipper
```
### Pakete installieren
```bash
apt install -y ffmpeg jq python3 python3-venv curl unzip inotify-tools sudo
```
- **ffmpeg** für Analyse und Schnitt
- **jq** für JSON-Verarbeitung
- **python3/venv** für optionale Analyse-Tools (z. B. Szenenerkennung, Face-Detection)
- **inotify-tools** für Dateisystem-Events
- **sudo** damit der Benutzer clipper bei Bedarf Rechte anheben kann
Anschließend geben wir dem Benutzer clipper Sudo-Rechte:
```bash
usermod -aG sudo clipper
```
### Konfiguration anlegen
Wir legen eine Konfigurationsdatei an, die von allen Skripten geladen wird:
```bash
nano /etc/clipper/clipper.env
```
Inhalt:
```
CLIPPER_IN=/srv/clipper/watch
CLIPPER_OUT=/srv/clipper/out
CLIPPER_TMP=/srv/clipper/temp
CLIPPER_LOG=/srv/clipper/logs/clipper.log
```
Datei speichern und mit `chown root:clipper /etc/clipper/clipper.env && chmod 640 /etc/clipper/clipper.env` die Rechte setzen.
### Python-Umgebung vorbereiten
Die eigentliche Analyse binden wir erst in Abschnitt 4 ein. Damit die Basis steht, richten wir jetzt schon eine virtuelle Umgebung ein:
```bash
su - clipper
python3 -m venv /srv/clipper/.venv
source /srv/clipper/.venv/bin/activate
pip install --upgrade pip
pip install numpy opencv-python-headless
```
So haben wir erste Bibliotheken, mit denen Szenen- und Gesichtserkennung später möglich wird.
### Einstiegsskripte (Stubs)
Wir erstellen zwei Einstiegspunkte, die n8n direkt aufruft. Sie tun noch nichts außer Logging und Validierung.
**Analyse-Stub**
```bash
nano /srv/clipper/bin/clipper-analyze
```
Inhalt:
```bash
#!/usr/bin/env bash
set -euo pipefail
source /etc/clipper/clipper.env
IN="$1"
JOBID="${2:-manual}"
mkdir -p "$CLIPPER_TMP/$JOBID"
echo "$(date '+%F %T') [ANALYZE] job=$JOBID file=$IN" | tee -a "$CLIPPER_LOG"
OUT_JSON="$CLIPPER_TMP/$JOBID/candidates.json"
echo '[]' > "$OUT_JSON"
echo "$OUT_JSON"
```
**Schneid-Stub**
```bash
nano /srv/clipper/bin/clipper-cut
```
Inhalt:
```bash
#!/usr/bin/env bash
set -euo pipefail
source /etc/clipper/clipper.env
IN="$1"
RANGES_JSON="$2"
JOBID="${3:-manual}"
mkdir -p "$CLIPPER_OUT/$JOBID"
echo "$(date '+%F %T') [CUT] job=$JOBID file=$IN ranges=$RANGES_JSON" | tee -a "$CLIPPER_LOG"
exit 0
```
Rechte setzen:
```bash
chmod +x /srv/clipper/bin/clipper-*
chown -R clipper:clipper /srv/clipper/bin
```
### Direktaufruf und Tests
Wir verzichten bewusst auf systemd-Templates und rufen die Skripte direkt über n8n oder manuell auf. Beispiel:
```bash
su - clipper
/srv/clipper/bin/clipper-analyze /srv/clipper/watch/demo.mp4 job-001
/srv/clipper/bin/clipper-cut /srv/clipper/watch/demo.mp4 /srv/clipper/temp/job-001/ranges.json job-001
tail -n 50 /srv/clipper/logs/clipper.log
```
Wenn alles passt, siehst du Einträge `[ANALYZE]` und `[CUT]` mit deiner Job-ID.
### Logrotation
Zum Schluss sorgen wir dafür, dass Logs nicht unendlich wachsen:
```bash
nano /etc/logrotate.d/clipper
```
Inhalt:
```
/srv/clipper/logs/*.log {
rotate 14
daily
missingok
notifempty
compress
delaycompress
copytruncate
}
```
---
Damit ist der Clipper-LXC vorbereitet: Benutzer, Verzeichnisse, Pakete, Konfiguration und Einstiegsskripte sind eingerichtet. In den nächsten Abschnitten bauen wir die Anbindung an Twitch/n8n, implementieren die Analyse-Logik (inklusive Facecam, Hochformat und Untertitel) und fügen den eigentlichen Schnitt hinzu, bevor alles sauber in Nextcloud abgelegt wird.