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

8.0 KiB
Raw Blame History

🛠️ 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:

  1. LXC erstellen

    • Debian 12, Name clipper
    • Ressourcen wie oben (1 vCPU, 512 MB RAM, 10 GB Speicher)
  2. System aktualisieren und Basis-Tools installieren

    apt update && apt upgrade -y
    apt install -y curl nano unzip ffmpeg inotify-tools
    
  3. Zeitsynchronisation prüfen

    timedatectl status
    

    Eine 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.

  1. Ordnerstruktur vorbereiten
    mkdir -p /srv/clipper/{watch,out,temp,logs}
    
    • watch → Eingangsordner für neue Videos (über Nextcloud oder Twitch-Import)
    • out → fertige Clips + Metadaten
    • temp → Zwischenablagen für Analyse
    • logs → 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 ClipperLXC einrichten (Basisdienste & ServiceSkelett)

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 ServiceBenutzer & 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 JSONHandling, python3/venv für optionale AnalyseHilfen (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 stattdessen runuser -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 **CLIEinstiegspunkte**, die n8n aufruft. Sie tun jetzt noch nichts Schweres  nur Validierung & Logging. Die echte Logik folgt in Abschnitt 4/5.

**AnalyseStub**
```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"

SchneidStub

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 LogRotation

nano /etc/logrotate.d/clipper

Inhalt:

/srv/clipper/logs/*.log {
  rotate 14
  daily
  missingok
  notifempty
  compress
  delaycompress
  copytruncate
}

Damit ist der ClipperLXC vorbereitet: Benutzer, Verzeichnisse, Pakete, Konfiguration und SystemdSkelett sind vorhanden. In den nächsten Abschnitten hängen wir Twitch/n8n an, füllen die AnalyseLogik (inkl. Facecam/Hochformat/UntertitelOption) und implementieren das Schneiden samt sauberer Ablage in Nextcloud.