Kapitel 13/Tutorial.md hinzugefügt
This commit is contained in:
192
Kapitel 13/Tutorial.md
Normal file
192
Kapitel 13/Tutorial.md
Normal 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, 1–2 GB RAM, 10 GB Speicher reichen aus
|
||||||
|
- **Grundwissen**: SSH-Verbindung, Nano-Editor, Basiskenntnisse in n8n
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Vorbereitung
|
||||||
|
|
||||||
|
Wir beginnen mit einem frischen Debian‑12‑LXC 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.
|
||||||
Reference in New Issue
Block a user