Kapitel 13/Tutorial.md aktualisiert
This commit is contained in:
@@ -61,28 +61,11 @@ Damit ist das Fundament gelegt: Der LXC ist vorbereitet, das System auf Stand, u
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Hinweis zu späteren Schritten (Analyse & Schneiden)
|
## Abschnitt 2 – Clipper‑LXC einrichten (Basisdienste & Service‑Skelett)
|
||||||
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**: 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` + gerenderte Untertitel im Video; optional `.srt` zusätzlich.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 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.)
|
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
### Service‑Benutzer & Verzeichnisse
|
### 2.1 Service‑Benutzer & Verzeichnisse
|
||||||
```bash
|
```bash
|
||||||
# Systemnutzer ohne Login
|
# Systemnutzer ohne Login
|
||||||
useradd --system --create-home --shell /usr/sbin/nologin clipper
|
useradd --system --create-home --shell /usr/sbin/nologin clipper
|
||||||
@@ -94,7 +77,7 @@ mkdir -p /etc/clipper
|
|||||||
chmod 750 /etc/clipper
|
chmod 750 /etc/clipper
|
||||||
```
|
```
|
||||||
|
|
||||||
### Pakete installieren
|
### 2.2 Pakete installieren
|
||||||
```bash
|
```bash
|
||||||
apt update && apt install -y ffmpeg jq python3 python3-venv curl unzip inotify-tools
|
apt update && apt install -y ffmpeg jq python3 python3-venv curl unzip inotify-tools
|
||||||
```
|
```
|
||||||
@@ -102,7 +85,7 @@ apt update && apt install -y ffmpeg jq python3 python3-venv curl unzip inotify-t
|
|||||||
> **Warum diese Pakete?**
|
> **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.
|
> **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.
|
||||||
|
|
||||||
### Konfiguration (env)
|
### 2.3 Konfiguration (env)
|
||||||
```bash
|
```bash
|
||||||
nano /etc/clipper/clipper.env
|
nano /etc/clipper/clipper.env
|
||||||
```
|
```
|
||||||
@@ -121,17 +104,55 @@ chown root:clipper /etc/clipper/clipper.env
|
|||||||
chmod 640 /etc/clipper/clipper.env
|
chmod 640 /etc/clipper/clipper.env
|
||||||
```
|
```
|
||||||
|
|
||||||
### Python‑Umgebung vorbereiten (für Analyse‑Tools, Abschnitt 4)
|
### 2.4 Python-Umgebung vorbereiten (für Analyse-Tools, Abschnitt 4)
|
||||||
```bash
|
```bash
|
||||||
# Virtuelle Umgebung im Home des clipper-Users erstellen
|
# Virtuelle Umgebung als Benutzer "clipper" anlegen
|
||||||
runuser -u clipper -- python3 -m venv /srv/clipper/.venv
|
runuser -u clipper -- python3 -m venv /srv/clipper/.venv
|
||||||
runuser -u clipper -- /srv/clipper/.venv/bin/pip install --upgrade pip
|
runuser -u clipper -- /srv/clipper/.venv/bin/pip install --upgrade pip
|
||||||
# Pakete für spätere Analyse (Details in Abschnitt 4)
|
# 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
|
runuser -u clipper -- /srv/clipper/.venv/bin/pip install numpy opencv-python-headless
|
||||||
```
|
```
|
||||||
> Wir installieren nur Basis‑Bausteine. STT/KI o. Ä. binden wir erst in Abschnitt 4 an.
|
> Hinweis: Wir arbeiten im LXC als root, deshalb **kein `sudo`** – stattdessen `runuser -u clipper -- …`.
|
||||||
|
|
||||||
### Entrypoints (noch „stubs“)
|
### 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**
|
||||||
|
```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"
|
||||||
|
```
|
||||||
|
|
||||||
|
**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" # 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.
|
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**
|
**Analyse‑Stub**
|
||||||
@@ -177,50 +198,27 @@ chmod +x /srv/clipper/bin/clipper-*
|
|||||||
chown -R clipper:clipper /srv/clipper/bin
|
chown -R clipper:clipper /srv/clipper/bin
|
||||||
```
|
```
|
||||||
|
|
||||||
### Systemd‑Dienst (on‑demand)
|
### 2.6 Direktaufruf (ohne systemd)
|
||||||
Wir wollen Clipper „auf Zuruf“ starten/stoppen. Für einfache Integrationen setzt n8n **SSH/Command** ab. Optional ergänzen wir später einen Webhook.
|
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:**
|
||||||
```bash
|
```bash
|
||||||
nano /etc/systemd/system/clipper.target
|
# Analyse starten (Pfad anpassen)
|
||||||
```
|
runuser -u clipper -- /srv/clipper/bin/clipper-analyze \
|
||||||
Inhalt:
|
"/srv/clipper/watch/demo.mp4" "job-001"
|
||||||
```ini
|
|
||||||
[Unit]
|
# Schneiden mit zuvor ermittelten Bereichen
|
||||||
Description=Clipper Target (on-demand services)
|
runuser -u clipper -- /srv/clipper/bin/clipper-cut \
|
||||||
|
"/srv/clipper/watch/demo.mp4" "/srv/clipper/temp/job-001/ranges.json" "job-001"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Prüfen:**
|
||||||
```bash
|
```bash
|
||||||
nano /etc/systemd/system/clipper@.service
|
tail -n 50 /srv/clipper/logs/clipper.log
|
||||||
```
|
```
|
||||||
Inhalt:
|
→ Du solltest die [ANALYZE] bzw. [CUT] Zeilen mit Job-ID sehen.
|
||||||
```ini
|
|
||||||
[Unit]
|
|
||||||
Description=Clipper Job %i
|
|
||||||
After=network.target
|
|
||||||
Wants=clipper.target
|
|
||||||
|
|
||||||
[Service]
|
### 2.7 Log-Rotation Log‑Rotation
|
||||||
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.).
|
|
||||||
|
|
||||||
### Log‑Rotation
|
|
||||||
```bash
|
```bash
|
||||||
nano /etc/logrotate.d/clipper
|
nano /etc/logrotate.d/clipper
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user