Files
audio_archiver/audio_archiver.sh
2025-10-23 09:31:58 +00:00

126 lines
4.8 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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