From 7e04b7f60276da6c9d0594521b296e54c8d170da Mon Sep 17 00:00:00 2001 From: alf Date: Thu, 23 Oct 2025 09:31:58 +0000 Subject: [PATCH] =?UTF-8?q?audio=5Farchiver.sh=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio_archiver.sh | 126 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 audio_archiver.sh diff --git a/audio_archiver.sh b/audio_archiver.sh new file mode 100644 index 0000000..20d1f2d --- /dev/null +++ b/audio_archiver.sh @@ -0,0 +1,126 @@ +#!/bin/bash + +# ... (Ihre KONFIGURATION und logger_init/logger_start sind hier unverändert) ... + +# --- KONFIGURATION --- +# Das Skript benötigt Lesezugriff auf dieses Verzeichnis +SOURCE_DIR="/srv/MEDIA/Audio/Radio-Archiv/2025/10" +STAGING_DIR="/srv/MEDIA/Audio/ISO/Staging" +ISO_OUTPUT_DIR="/srv/MEDIA/Audio/ISO/burn" + +# Maximale Größe des Staging-Verzeichnisses (DVD-5: 4.7 GB * 1024^3) +ISO_LIMIT_BYTES=4939274240  + +CONFIG_FILE="/root/Gitea/audio_archiver/current_iso.conf" +INDEX_FILE="/root/Gitea/audio_archiver/archive_index.csv" + +LOG_FILE="/root/Gitea/logger/Logs/audio_archiver.log" +source /root/Gitea/logger/logger.sh +log_init $LOG_FILE +log_start +# --------------------- + +# Sicherstellen, dass die Verzeichnisse existieren +mkdir -p "$STAGING_DIR" "$ISO_OUTPUT_DIR" $(dirname "$CONFIG_FILE") $(dirname "$INDEX_FILE") + +# ... (Ihre Funktionen load_config, save_config, next_iso_id sind hier unverändert) ... + +# Funktion zur Verarbeitung des vollen Staging-Verzeichnisses +finalize_iso() { +    log_info "--- ISO $CURRENT_ISO_ID erreicht Speichergrenze. Erstelle Image. ---" +     +    local ISO_FILENAME="${ISO_OUTPUT_DIR}/${CURRENT_ISO_ID}.iso" +    # Temporäre Datei für die Ausgabe von genisoimage +    local GENISO_LOG=$(mktemp) + +    # 1. ISO-Image erstellen (mit Rock Ridge für lange Dateinamen) +    # Die Ausgabe wird in die temporäre Datei umgeleitet +    genisoimage -r -J -o "$ISO_FILENAME" "$STAGING_DIR" > "$GENISO_LOG" 2>&1 +    local EXIT_CODE=$? +     +    # Protokollierung der genisoimage-Ausgabe +    log_info "Ausgabe von genisoimage: $(cat $GENISO_LOG | tr '\n' ' ')" +    rm -f "$GENISO_LOG" # Temporäre Datei löschen + +    if [ $EXIT_CODE -eq 0 ]; then +        log_info "ISO-Image '$ISO_FILENAME' erfolgreich erstellt." +         +        # 2. Staging-Verzeichnis leeren +        log_info "Leere Staging-Verzeichnis..." +        rm -rf "$STAGING_DIR"/* +         +        # 3. Zur nächsten ISO wechseln und Konfiguration speichern +        next_iso_id +        save_config +    else +        log_error "FEHLER ($EXIT_CODE) beim Erstellen des ISO-Images '$ISO_FILENAME'." +        exit 1 +    fi +    log_info "------------------------------------------------------------------" +} + + +# --- HAUPTPROGRAMM START --- +load_config +log_info "Archivierung gestartet. Aktuelle ISO: $CURRENT_ISO_ID, Zähler: $CURRENT_FILE_COUNTER" + +# 1. Alle neuen/unverarbeiteten MP3s finden +find "$SOURCE_DIR" -type f -name "*.mp3" | while read -r FILE_PATH; do +     +    # Prüfen, ob Datei bereits im Index ist (verhindert Doppelarchivierung) +    if grep -q ";${FILE_PATH}$" "$INDEX_FILE"; then +        continue # Datei wurde bereits archiviert, überspringen +    fi +     +    # **KORREKTUR 1: Größenprüfung VOR Kopieren mit Dateigröße** +    # Die Größe der aktuellen Datei holen +    FILE_SIZE=$(stat -c%s "$FILE_PATH") +    +    # Größe des Staging-Verzeichnisses holen +    CURRENT_STAGING_SIZE=$(du -bs "$STAGING_DIR" | awk '{print $1}') +     +    # Bei Erreichen der Grenze: Schließe ISO ab und starte neue +    # Prüfen, ob die Hinzufügung der aktuellen Datei das Limit überschreiten würde +    if [[ $(($CURRENT_STAGING_SIZE + $FILE_SIZE)) -ge "$ISO_LIMIT_BYTES" ]]; then +        log_warn "Nächste Datei würde Limit überschreiten. Finalisiere aktuelle ISO: $CURRENT_ISO_ID" +        finalize_iso +        # Nach finalize_iso sind die neue ISO_ID und der Zähler geladen. +        # Die aktuelle Datei ($FILE_PATH) wird in der nächsten Iteration erneut geprüft. +        continue +    fi +     +    # 3. Metadaten (Tags) auslesen mit exiftool +    # Trennzeichen ist TAB (\t) +    TAGS=$(exiftool -s3 -T -Artist -Title "$FILE_PATH") +    KUENSTLER=$(echo "$TAGS" | awk -F '\t' '{print $1}') +    TITEL=$(echo "$TAGS" | awk -F '\t' '{print $2}') + +    # Sicherstellen, dass Tags vorhanden sind (falls nicht, 'Unknown' verwenden) +    [ -z "$KUENSTLER" ] && KUENSTLER="Unknown Artist" +    [ -z "$TITEL" ] && TITEL="Unknown Title" + +    # 4. Eindeutigen Dateinamen generieren und kopieren +    NEW_FILENAME=$(printf "%s_%06d.mp3" "$CURRENT_ISO_ID" "$CURRENT_FILE_COUNTER") +    log_info "Kopiere $FILE_PATH zu $NEW_FILENAME" +    cp "$FILE_PATH" "$STAGING_DIR/$NEW_FILENAME" +     +    if [ $? -eq 0 ]; then +        log_info "Archiviert: $NEW_FILENAME" + +        # 5. Index-Eintrag hinzufügen +        echo "$KUENSTLER;$TITEL;$CURRENT_ISO_ID;$CURRENT_FILE_COUNTER;$FILE_PATH" >> "$INDEX_FILE" +         +        # 6. Zähler erhöhen und Konfiguration speichern +        CURRENT_FILE_COUNTER=$((CURRENT_FILE_COUNTER + 1)) +        save_config +    else +        log_error "FEHLER beim Kopieren der Datei: $FILE_PATH" +    fi + +done + +log_info "Archivierung abgeschlossen. $CURRENT_ISO_ID ist aktuell im Staging." + +# --- HAUPTPROGRAMM ENDE --- + +log_end \ No newline at end of file