Kapitel 13/Tutorial.md aktualisiert

This commit is contained in:
2025-08-24 12:54:13 +00:00
parent 279cd05335
commit 82a5a1970b

View File

@@ -57,15 +57,177 @@ Im weiteren Verlauf des Tutorials berücksichtigen wir:
- **Facecam-Erkennung**: Falls eine Facecam im Stream vorhanden ist, wird sie automatisch erkannt und als Overlay (z. B. Kreis, Rechteck oder wechselnde Form) in den Clip eingeblendet.
- **Format-Anpassung**: Clips können zusätzlich ins **Hochformat (9:16)** umgewandelt werden, damit sie ohne Nachbearbeitung für TikTok, Instagram Reels oder YouTube Shorts nutzbar sind.
- **Varianten**: Optional werden sowohl Querformat (16:9) als auch Hochformat exportiert, um alle Plattformen optimal zu bedienen.
### Untertitel-Steuerung (per n8n-Option)
In n8n fügen wir ein **Auswahlfeld** „Untertitel“ hinzu (z. B. im Start-Form/Set-Node oder als Workflow-Variable), mit drei Modi:
1. **Aus** es werden keine Untertitel erzeugt.
2. **SRT** es wird automatisch eine `.srt` per STT (z.B. Whisper) erzeugt und neben dem Clip abgelegt.
3. **Generiert nach Preset** STT erzeugt Text + Timing, n8n wendet ein **Style-Preset** an und rendert die Untertitel ins Video ("burned-in").
**Preset-Verwaltung:** Die Style-Presets (Schriftgröße, Outline, Hintergrund, Position, ggf. ASS/Drawtext-Parameter) liegen zentral, z.B. in Nextcloud unter `/presets/subtitles.json` oder als n8n Static Data. So können später weitere Presets ergänzt werden, ohne den Workflow umzubauen.
- **Untertitel-Steuerung**: In n8n gibt es ein Auswahlfeld mit drei Modi:
1. **Aus** keine Untertitel.
2. **SRT** es wird eine `.srt` erzeugt und neben dem Clip abgelegt.
3. **Generiert nach Preset** STT erzeugt Text + Timing, und n8n rendert sie mit einem Style-Preset direkt ins Video. Presets können zentral (z. B. Nextcloud `/presets/subtitles.json`) gepflegt werden.
**Pipeline-Auswirkung:**
- Modus **SRT** → `.srt` speichern, Clip bleibt „clean“.
- Modus **Preset** → `.srt` generieren **und** per ffmpeg (drawtext/subtitles) ins Video rendern; zusätzlich optional `.srt` beilegen.
- Modus **Preset** → `.srt` + gerenderte Untertitel im Video; optional `.srt` zusätzlich.
---
## Abschnitt 2: Einrichten des Clipper-LXC
Nun richten wir Clipper selbst im vorbereiteten Container ein: Installation von ffmpeg, grundlegende Services und Basis-Konfiguration. (Details folgen in diesem Abschnitt.)
---
## 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
```bash
# 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
```bash
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)
```bash
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:
```bash
chown root:clipper /etc/clipper/clipper.env
chmod 640 /etc/clipper/clipper.env
```
### 2.4 PythonUmgebung vorbereiten (für AnalyseTools, Abschnitt 4)
```bash
sudo -u clipper python3 -m venv /srv/clipper/.venv
sudo -u clipper /srv/clipper/.venv/bin/pip install --upgrade pip
# Pakete für spätere Analyse; konkrete Libs folgen in Abschnitt 4
sudo -u clipper /srv/clipper/.venv/bin/pip install numpy opencv-python-headless
```
> Wir installieren nur BasisBausteine. STT/KI o. Ä. binden wir erst in Abschnitt 4 an.
### 2.5 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:
```bash
#!/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**
```bash
nano /srv/clipper/bin/clipper-cut
```
Inhalt:
```bash
#!/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:
```bash
chmod +x /srv/clipper/bin/clipper-*
chown -R clipper:clipper /srv/clipper/bin
```
### 2.6 SystemdDienst (ondemand)
Wir wollen Clipper „auf Zuruf“ starten/stoppen. Für einfache Integrationen setzt n8n **SSH/Command** ab. Optional ergänzen wir später einen Webhook.
```bash
nano /etc/systemd/system/clipper.target
```
Inhalt:
```ini
[Unit]
Description=Clipper Target (on-demand services)
```
```bash
nano /etc/systemd/system/clipper@.service
```
Inhalt:
```ini
[Unit]
Description=Clipper Job %i
After=network.target
Wants=clipper.target
[Service]
Type=oneshot
User=clipper
Group=clipper
EnvironmentFile=/etc/clipper/clipper.env
ExecStart=/srv/clipper/bin/%i
StandardOutput=append:/srv/clipper/logs/systemd-%i.log
StandardError=append:/srv/clipper/logs/systemd-%i.log
[Install]
WantedBy=clipper.target
```
Aktualisieren & testen:
```bash
systemctl daemon-reload
# Beispiel: Analyse-Stub einmalig ausführen
systemctl start "clipper@clipper-analyze"
```
> In Abschnitt 3/4 ruft n8n die EntryPoints mit Parametern auf (Dateipfad, JOBID usw.).
### 2.7 LogRotation
```bash
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.