8.0 KiB
🛠️ Kapitel 13 – Clipper (Tutorial)
Einleitung
Clips sind der beste Weg, lange Streams in kurze, teilbare Highlights zu verwandeln.
Das Ziel dieses Kapitels: Wir bauen ein System, das neue Videos automatisch erkennt, sinnvolle Stellen analysiert, passende Highlights schneidet und die Ergebnisse in Nextcloud ablegt – komplett mit Titeln und Hashtags für jede Plattform.
Der Clipper selbst übernimmt dabei nur die technische Verarbeitung. Alles rund um Steuerung, Analyse und Benachrichtigungen läuft über n8n – so bleibt das System 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, 512 MB RAM, 10 GB Speicher reichen aus
- Grundwissen: SSH-Verbindung, Nano-Editor, Basiskenntnisse in n8n
Vorbereitung
Bevor wir Clipper installieren, richten wir den Container sauber ein:
-
LXC erstellen
- Debian 12, Name
clipper - Ressourcen wie oben (1 vCPU, 512 MB RAM, 10 GB Speicher)
- Debian 12, Name
-
System aktualisieren und Basis-Tools installieren
apt update && apt upgrade -y apt install -y curl nano unzip ffmpeg inotify-tools -
Zeitsynchronisation prüfen
timedatectl statusEine saubere Zeitbasis ist entscheidend, da Clips später anhand exakter Sekundenmarken geschnitten werden.
Wenn der Container standardmäßig auf UTC läuft, kann man die Zeitzone so ändern:
timedatectl list-timezones | grep Europe timedatectl set-timezone Europe/Berlin timedatectl status
Damit springt die Systemzeit sofort auf Europe/Berlin, und alle Logs sowie Schnittzeiten passen zur lokalen Zeit.
- Ordnerstruktur vorbereiten
mkdir -p /srv/clipper/{watch,out,temp,logs}watch→ Eingangsordner für neue Videos (über Nextcloud oder Twitch-Import)out→ fertige Clips + Metadatentemp→ Zwischenablagen für Analyselogs→ Protokolle aller Abläufe
Damit ist das Fundament gelegt: Der LXC ist vorbereitet, das System auf Stand, und die Ordnerstruktur für Clipper ist vorhanden.
Abschnitt 2 – Clipper‑LXC einrichten (Basisdienste & Service‑Skelett)
Ziel: Der LXC enthält alles Nötige, damit n8n ihn bei Bedarf starten kann und klare Einstiegspunkte zum Analysieren und Schneiden vorhanden sind. Die eigentliche Logik füllen wir später (Abschnitt 4/5) – jetzt legen wir nur das saubere Gerüst an.
2.1 Service‑Benutzer & Verzeichnisse
# Systemnutzer ohne Login
useradd --system --create-home --shell /usr/sbin/nologin clipper
mkdir -p /srv/clipper/{watch,out,temp,logs,bin}
chown -R clipper:clipper /srv/clipper
# Ort für Konfiguration/Secrets
mkdir -p /etc/clipper
chmod 750 /etc/clipper
2.2 Pakete installieren
apt update && apt install -y ffmpeg jq python3 python3-venv curl unzip inotify-tools
Warum diese Pakete?
ffmpeg für Analyse/Schnitt, jq für JSON‑Handling, python3/venv für optionale Analyse‑Hilfen (z. B. Szenen/Facedetect in Abschnitt 4), inotify-tools für eventuelle lokale Hooks.
2.3 Konfiguration (env)
nano /etc/clipper/clipper.env
Inhalt (minimal, erweiterbar in späteren Abschnitten):
CLIPPER_IN=/srv/clipper/watch
CLIPPER_OUT=/srv/clipper/out
CLIPPER_TMP=/srv/clipper/temp
CLIPPER_LOG=/srv/clipper/logs/clipper.log
# Standard-Exportformate; Details folgen in Abschnitt 5/6
EXPORT_VARIANTS="16x9,9x16"
Rechte setzen:
chown root:clipper /etc/clipper/clipper.env
chmod 640 /etc/clipper/clipper.env
2.4 Python-Umgebung vorbereiten (für Analyse-Tools, Abschnitt 4)
# Virtuelle Umgebung als Benutzer "clipper" anlegen
runuser -u clipper -- python3 -m venv /srv/clipper/.venv
runuser -u clipper -- /srv/clipper/.venv/bin/pip install --upgrade pip
# Pakete für spätere Analyse; konkrete Libs folgen in Abschnitt 4
runuser -u clipper -- /srv/clipper/.venv/bin/pip install numpy opencv-python-headless
Hinweis: Wir arbeiten im LXC als root, deshalb kein
sudo– stattdessenrunuser -u clipper -- ….
2.5 Entrypoints (noch „stubs“)
Wir erstellen zwei CLI-Einstiegspunkte, die n8n aufruft. Sie tun jetzt noch nichts Schweres – nur Validierung & Logging. Die echte Logik folgt in Abschnitt 4/5.
Analyse-Stub
nano /srv/clipper/bin/clipper-analyze
Inhalt:
#!/usr/bin/env bash
set -euo pipefail
source /etc/clipper/clipper.env
IN="$1" # absolute Datei
JOBID="${2:-manual}"
mkdir -p "$CLIPPER_TMP/$JOBID"
echo "$(date '+%F %T') [ANALYZE] job=$JOBID file=$IN" | tee -a "$CLIPPER_LOG"
# Platzhalter: Wir erzeugen vorerst nur eine leere Kandidatenliste
OUT_JSON="$CLIPPER_TMP/$JOBID/candidates.json"
echo '[]' > "$OUT_JSON"
echo "$OUT_JSON"
Schneid-Stub
nano /srv/clipper/bin/clipper-cut
Inhalt:
#!/usr/bin/env bash
set -euo pipefail
source /etc/clipper/clipper.env
IN="$1" # absolute Datei
RANGES_JSON="$2" # Zeitbereiche (kommt später aus Abschnitt 4)
JOBID="${3:-manual}"
mkdir -p "$CLIPPER_OUT/$JOBID"
echo "$(date '+%F %T') [CUT] job=$JOBID file=$IN ranges=$RANGES_JSON" | tee -a "$CLIPPER_LOG"
# Platzhalter: noch kein Schnitt; wir protokollieren nur
exit 0
``` Entrypoints (noch „stubs“)
Wir erstellen zwei **CLI‑Einstiegspunkte**, die n8n aufruft. Sie tun jetzt noch nichts Schweres – nur Validierung & Logging. Die echte Logik folgt in Abschnitt 4/5.
**Analyse‑Stub**
```bash
nano /srv/clipper/bin/clipper-analyze
Inhalt:
#!/usr/bin/env bash
set -euo pipefail
source /etc/clipper/clipper.env
IN="$1" # absolute Datei
JOBID="${2:-manual}"
mkdir -p "$CLIPPER_TMP/$JOBID"
echo "$(date '+%F %T') [ANALYZE] job=$JOBID file=$IN" | tee -a "$CLIPPER_LOG"
# Platzhalter: Wir erzeugen vorerst nur eine leere Kandidatenliste
OUT_JSON="$CLIPPER_TMP/$JOBID/candidates.json"
echo '[]' > "$OUT_JSON"
echo "$OUT_JSON"
Schneid‑Stub
nano /srv/clipper/bin/clipper-cut
Inhalt:
#!/usr/bin/env bash
set -euo pipefail
source /etc/clipper/clipper.env
IN="$1" # absolute Datei
RANGES_JSON="$2" # Zeitbereiche (kommt später aus Abschnitt 4)
JOBID="${3:-manual}"
mkdir -p "$CLIPPER_OUT/$JOBID"
echo "$(date '+%F %T') [CUT] job=$JOBID file=$IN ranges=$RANGES_JSON" | tee -a "$CLIPPER_LOG"
# Platzhalter: noch kein Schnitt; wir protokollieren nur
exit 0
Ausführbar machen:
chmod +x /srv/clipper/bin/clipper-*
chown -R clipper:clipper /srv/clipper/bin
2.6 Direktaufruf (ohne systemd)
Um Fehler durch fehlende Parameter zu vermeiden, verzichten wir fürs Job-Handling auf systemd-Templates. n8n ruft die Skripte direkt auf (per SSH „Execute Command“). So übergeben wir Dateipfad & JOBID explizit.
Beispiele:
# Analyse starten (Pfad anpassen)
runuser -u clipper -- /srv/clipper/bin/clipper-analyze \
"/srv/clipper/watch/demo.mp4" "job-001"
# Schneiden mit zuvor ermittelten Bereichen
runuser -u clipper -- /srv/clipper/bin/clipper-cut \
"/srv/clipper/watch/demo.mp4" "/srv/clipper/temp/job-001/ranges.json" "job-001"
Prüfen:
tail -n 50 /srv/clipper/logs/clipper.log
→ Du solltest die [ANALYZE] bzw. [CUT] Zeilen mit Job-ID sehen.
2.7 Log-Rotation Log‑Rotation
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 Systemd‑Skelett sind vorhanden. In den nächsten Abschnitten hängen wir Twitch/n8n an, füllen die Analyse‑Logik (inkl. Facecam/Hochformat/Untertitel‑Option) und implementieren das Schneiden samt sauberer Ablage in Nextcloud.