From 63876aa91f7998631a0e7e4e0e5ce3c5c5c6866c Mon Sep 17 00:00:00 2001 From: Thomas Dannenberg Date: Sun, 24 Aug 2025 13:25:34 +0000 Subject: [PATCH] Kapitel 13/Tutorial.md aktualisiert --- Kapitel 13/Tutorial.md | 124 ++++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 63 deletions(-) diff --git a/Kapitel 13/Tutorial.md b/Kapitel 13/Tutorial.md index 1e92981..4e3d00e 100644 --- a/Kapitel 13/Tutorial.md +++ b/Kapitel 13/Tutorial.md @@ -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) -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.) +## 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. -### Service‑Benutzer & Verzeichnisse +### 2.1 Service‑Benutzer & Verzeichnisse ```bash # Systemnutzer ohne Login useradd --system --create-home --shell /usr/sbin/nologin clipper @@ -94,7 +77,7 @@ mkdir -p /etc/clipper chmod 750 /etc/clipper ``` -### Pakete installieren +### 2.2 Pakete installieren ```bash 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?** > **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 nano /etc/clipper/clipper.env ``` @@ -121,17 +104,55 @@ chown root:clipper /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 -# 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 -- /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 ``` -> 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. **Analyse‑Stub** @@ -177,50 +198,27 @@ chmod +x /srv/clipper/bin/clipper-* chown -R clipper:clipper /srv/clipper/bin ``` -### Systemd‑Dienst (on‑demand) -Wir wollen Clipper „auf Zuruf“ starten/stoppen. Für einfache Integrationen setzt n8n **SSH/Command** ab. Optional ergänzen wir später einen Webhook. +### 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:** ```bash -nano /etc/systemd/system/clipper.target -``` -Inhalt: -```ini -[Unit] -Description=Clipper Target (on-demand services) +# 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:** ```bash -nano /etc/systemd/system/clipper@.service +tail -n 50 /srv/clipper/logs/clipper.log ``` -Inhalt: -```ini -[Unit] -Description=Clipper Job %i -After=network.target -Wants=clipper.target +→ Du solltest die [ANALYZE] bzw. [CUT] Zeilen mit Job-ID sehen. -[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.). - -### Log‑Rotation +### 2.7 Log-Rotation Log‑Rotation ```bash nano /etc/logrotate.d/clipper ```