Kapitel 13/Tutorial.md aktualisiert
This commit is contained in:
@@ -1210,3 +1210,137 @@ curl -fsSL https://git.bratonien.de/Thomas/Homelab--Bratonein-Kontrollzentrum--T
|
|||||||
Alternativ kann die Datei auch manuell heruntergeladen und dort abgelegt werden.
|
Alternativ kann die Datei auch manuell heruntergeladen und dort abgelegt werden.
|
||||||
Die Datei enthält eine Liste von z. B. bekannten Anime-Namen – eine pro Zeile.
|
Die Datei enthält eine Liste von z. B. bekannten Anime-Namen – eine pro Zeile.
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
Um nun die Clips zu schneiden, benötigen wir ein weiteres Skript und einen weiteren Node.
|
||||||
|
Lege mit ```nano <clipper-ordner>/bin/clipper-cut-vod ``` die benötigte Datei an und fülle sie mit dem folgenden COde:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
|
||||||
|
VOD_ID="$1"
|
||||||
|
# Abschnitt 1: Namensmodus erkennen
|
||||||
|
|
||||||
|
ETC_DIR="/srv/clipper/etc"
|
||||||
|
CODE_POOL="$ETC_DIR/codename_pool.txt"
|
||||||
|
ADJ_POOL="$ETC_DIR/adjektive_de.txt"
|
||||||
|
|
||||||
|
# Standardmodus
|
||||||
|
NAMING_MODE="fallback"
|
||||||
|
|
||||||
|
if [[ -s "$CODE_POOL" && -s "$ADJ_POOL" ]]; then
|
||||||
|
NAMING_MODE="adjektiv_codename"
|
||||||
|
elif [[ -s "$CODE_POOL" ]]; then
|
||||||
|
NAMING_MODE="codename"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[INFO] Namensmodus erkannt: $NAMING_MODE"
|
||||||
|
|
||||||
|
# Abschnitt 2: Namen wählen (robust & ohne Wiederholung)
|
||||||
|
|
||||||
|
USED_PATH="/srv/clipper/etc/used.json"
|
||||||
|
mkdir -p "$(dirname "$USED_PATH")"
|
||||||
|
touch "$USED_PATH"
|
||||||
|
USED_LIST=$(jq -r '.[]' "$USED_PATH" 2>/dev/null || echo "")
|
||||||
|
|
||||||
|
is_used() {
|
||||||
|
grep -Fxq "$1" <<< "$USED_LIST"
|
||||||
|
}
|
||||||
|
|
||||||
|
choose_final_name() {
|
||||||
|
case "$NAMING_MODE" in
|
||||||
|
"codename")
|
||||||
|
mapfile -t CANDIDATES < "$CODE_POOL"
|
||||||
|
;;
|
||||||
|
"adjektiv_codename")
|
||||||
|
mapfile -t CODES < "$CODE_POOL"
|
||||||
|
mapfile -t ADJS < "$ADJ_POOL"
|
||||||
|
CANDIDATES=()
|
||||||
|
for adj in "${ADJS[@]}"; do
|
||||||
|
for code in "${CODES[@]}"; do
|
||||||
|
CANDIDATES+=("${adj}-${code}")
|
||||||
|
done
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
"fallback")
|
||||||
|
echo "$VOD_ID"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Filtere bereits genutzte Namen
|
||||||
|
AVAILABLE=()
|
||||||
|
for name in "${CANDIDATES[@]}"; do
|
||||||
|
if ! is_used "$name"; then
|
||||||
|
AVAILABLE+=("$name")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ${#AVAILABLE[@]} -eq 0 ]]; then
|
||||||
|
echo "[WARN] Keine verfügbaren Namen mehr – nutze Fallback: $VOD_ID"
|
||||||
|
echo "$VOD_ID"
|
||||||
|
else
|
||||||
|
FINAL_NAME="${AVAILABLE[RANDOM % ${#AVAILABLE[@]}]}"
|
||||||
|
echo "[INFO] Gewählter Codename: $FINAL_NAME"
|
||||||
|
echo "$FINAL_NAME"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Codename in used.json speichern (wenn nicht fallback)
|
||||||
|
if [[ "$FINAL_NAME" != "$VOD_ID" ]]; then
|
||||||
|
if jq -e . >/dev/null 2>&1 <<< "$USED_LIST"; then
|
||||||
|
UPDATED=$(jq --arg name "$FINAL_NAME" '. + [$name]' <<< "$USED_LIST")
|
||||||
|
else
|
||||||
|
UPDATED="[$(printf '%s\n' "$USED_LIST" | jq -R . | jq -s .), \"$FINAL_NAME\"]"
|
||||||
|
fi
|
||||||
|
echo "$UPDATED" > "$USED_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verzeichnisstruktur
|
||||||
|
TMP_DIR="/srv/clipper/temp/$VOD_ID"
|
||||||
|
VOD_PATH="/srv/clipper/out/$VOD_ID/original/$VOD_ID.mp4"
|
||||||
|
CANDIDATES_JSON="$TMP_DIR/candidates.json"
|
||||||
|
CLIPS_DIR="/srv/clipper/out/$VOD_ID/clips"
|
||||||
|
|
||||||
|
mkdir -p "$CLIPS_DIR/combined"
|
||||||
|
mkdir -p "$CLIPS_DIR/audio"
|
||||||
|
mkdir -p "$CLIPS_DIR/video"
|
||||||
|
|
||||||
|
# Ziel für temporären CSV-Index
|
||||||
|
INDEX_CSV="$TMP_DIR/index.csv"
|
||||||
|
echo "Typ;Quelle;Beginn;Ende;Dateiname;Pfad" > "$INDEX_CSV"
|
||||||
|
|
||||||
|
CLIP_NUM=1
|
||||||
|
|
||||||
|
for SECTION in combined only_audio only_video; do
|
||||||
|
case "$SECTION" in
|
||||||
|
combined) SUBDIR="kombiniert"; QUELLE="kombiniert" ;;
|
||||||
|
only_audio) SUBDIR="audio"; QUELLE="audio" ;;
|
||||||
|
only_video) SUBDIR="video"; QUELLE="video" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
mkdir -p "$CLIPS_DIR/$SUBDIR"
|
||||||
|
|
||||||
|
jq -c ".$SECTION[]" "$CANDIDATES_JSON" | while read -r clip; do
|
||||||
|
START=$(jq -r '.start' <<< "$clip")
|
||||||
|
END=$(jq -r '.end' <<< "$clip")
|
||||||
|
DURATION=$(awk "BEGIN { printf \"%.2f\", $END - $START }")
|
||||||
|
|
||||||
|
OUT_NAME=$(printf "%03d_%s.mp4" "$CLIP_NUM" "$FINAL_NAME")
|
||||||
|
OUT_PATH="$CLIPS_DIR/$SUBDIR/$OUT_NAME"
|
||||||
|
|
||||||
|
echo "[INFO] Schneide Clip $OUT_NAME ($START - $END → $DURATION s)"
|
||||||
|
ffmpeg -hide_banner -loglevel error -ss "$START" -i "$VOD_PATH" -t "$DURATION" -c copy "$OUT_PATH"
|
||||||
|
|
||||||
|
# Zeitformat HH:MM:SS
|
||||||
|
START_FMT=$(date -u -d "@$START" +"%H:%M:%S")
|
||||||
|
END_FMT=$(date -u -d "@$END" +"%H:%M:%S")
|
||||||
|
|
||||||
|
echo "Clip;$QUELLE;$START_FMT;$END_FMT;$OUT_NAME;clips/$SUBDIR/" >> "$INDEX_CSV"
|
||||||
|
|
||||||
|
CLIP_NUM=$((CLIP_NUM + 1))
|
||||||
|
done
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user