diff --git a/Kapitel 13/Tutorial.md b/Kapitel 13/Tutorial.md index 2834620..5148a3c 100644 --- a/Kapitel 13/Tutorial.md +++ b/Kapitel 13/Tutorial.md @@ -15,7 +15,7 @@ Clips sind der beste Weg, lange Streams in kurze, teilbare Highlights zu verwand - **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 +- **Ressourcen für den LXC**: 1 vCPU, 1–2 GB RAM, 100 GB Speicher reichen aus - **Grundwissen**: SSH-Verbindung, Nano-Editor, Basiskenntnisse in n8n --- @@ -26,6 +26,7 @@ Wir beginnen mit einem frischen Debian‑12‑LXC in Proxmox, benennen ihn `clip ```bash apt update && apt upgrade -y apt install -y curl unzip ffmpeg inotify-tools +pip3 install ffmpeg-python numpy scipy soundfile ``` Eine korrekte Systemzeit ist entscheidend, da Schnittmarken später auf exakten Sekunden basieren. Prüfe die Zeit mit: @@ -123,6 +124,8 @@ SFTP_PORT=22 SFTP_USER=sftp_uploader SFTP_KEY=/home/clipper/.ssh/nc_sftp_ed25519 DROP_BASE="/mnt/hdd/incoming" +CLIPPER_PEAK_THRESHOLD=0.85 + CLIPPER_IN=/srv/clipper/watch CLIPPER_OUT=/srv/clipper/out @@ -146,7 +149,7 @@ Erzeuge und fülle eine virtuelle Umgebung für die spätere Analyse: python3 -m venv /srv/clipper/.venv source /srv/clipper/.venv/bin/activate pip install --upgrade pip -pip install numpy opencv-python-headless +pip install librosa soundfile numpy scipy deactivate ``` Wechsle für die nächsten Schritte **im Benutzer clipper** weiter. @@ -555,8 +558,8 @@ In diesem Schritt erstellen wir den eigentlichen Workflow in **n8n**. Er sorgt d nano /bin/clipper-vod-get ``` Nun befüllst du sie mit: - ```bash - #!/usr/bin/env bash + ```bash + #!/usr/bin/env bash set -euo pipefail ENV_FILE="/etc/clipper/clipper.env" @@ -574,7 +577,10 @@ In diesem Schritt erstellen wir den eigentlichen Workflow in **n8n**. Er sorgt d PART="${TMP}/${ID}.mp4.part" LOCK="${TMP}/${ID}.lock" - mkdir -p "$TMP" "$LOGDIR" "$OUT_BASE" + FINAL_DIR="${OUT_BASE}/original" + FINAL_FILE="${FINAL_DIR}/${ID}.mp4" + + mkdir -p "$TMP" "$LOGDIR" "$FINAL_DIR" LOG="${LOGDIR}/download.log" log(){ printf '[%(%F %T)T] %s\n' -1 "$*" ; } exec > >(tee -a "$LOG") 2>&1 @@ -590,15 +596,31 @@ In diesem Schritt erstellen wir den eigentlichen Workflow in **n8n**. Er sorgt d log "URL: ${URL}" log "TMP: ${TMP}" + # Wenn Zieldatei schon vorhanden → überspringen + if [[ -s "$FINAL_FILE" ]]; then + log "SKIP: Finaldatei existiert bereits → $FINAL_FILE" + exit 0 + fi + + # Falls temp-Datei noch da ist → wiederaufnehmen if [[ -s "$TEMP" && ! -s "$FILE" ]]; then log "RESUME: $TEMP -> $FILE" mv -f "$TEMP" "$FILE" fi OUT="${TMP}/${ID}.%(ext)s" - yt-dlp -q --no-progress --retries 20 --fragment-retries 50 --retry-sleep 5 \ - --socket-timeout 30 --hls-prefer-ffmpeg --remux-video mp4 -o "$OUT" "$URL" + yt-dlp --newline \ + --progress \ + --progress-template "progress: %(progress._percent_str)s" \ + --retries 20 \ + --fragment-retries 50 \ + --retry-sleep 5 \ + --socket-timeout 30 \ + --hls-prefer-ffmpeg \ + --remux-video mp4 \ + -o "$OUT" "$URL" + # Fallback für .temp-Datei [[ -s "$FILE" ]] || { [[ -s "$TEMP" ]] && mv -f "$TEMP" "$FILE"; } if [[ ! -s "$FILE" ]]; then @@ -606,17 +628,13 @@ In diesem Schritt erstellen wir den eigentlichen Workflow in **n8n**. Er sorgt d exit 10 fi - FINAL_DIR="${OUT_BASE}/original" - mkdir -p "$FINAL_DIR" - mv -f "$FILE" "$FINAL_DIR/${ID}.mp4" - log "MOVE: ${FILE} -> ${FINAL_DIR}/${ID}.mp4" + # Datei verschieben → Zielstruktur + mv -f "$FILE" "$FINAL_FILE" + log "MOVE: ${FILE} -> ${FINAL_FILE}" log "=== DONE: VOD ${ID} erfolgreich geladen ===" + ``` - ``` - Mit diesem Skript laden wir die aktuellen VODs herunter, laden sie in die Nextcloud für die weitere Verabeitung und räumen wieder auf. Zusätzlich erzeugen wir logs in `/logs/.log`. - - Damit die Datei auch ausgeführt werden kann, musst du die folgenden zwei Befehle eingeben: ```bash chmod 755 /bin/clipper-vod-get chown clipper:clipper /bin/clipper-vod-get