audio_archiver.sh aktualisiert

This commit is contained in:
alf
2025-10-23 09:44:39 +00:00
parent 483c03eefa
commit 9eb0b1130c

View File

@ -9,7 +9,7 @@ STAGING_DIR="/srv/MEDIA/Audio/ISO/Staging"
ISO_OUTPUT_DIR="/srv/MEDIA/Audio/ISO/burn" ISO_OUTPUT_DIR="/srv/MEDIA/Audio/ISO/burn"
# Maximale Größe des Staging-Verzeichnisses (DVD-5: 4.7 GB * 1024^3) # Maximale Größe des Staging-Verzeichnisses (DVD-5: 4.7 GB * 1024^3)
ISO_LIMIT_BYTES=4939274240  ISO_LIMIT_BYTES=4939274240
CONFIG_FILE="/root/Gitea/audio_archiver/current_iso.conf" CONFIG_FILE="/root/Gitea/audio_archiver/current_iso.conf"
INDEX_FILE="/root/Gitea/audio_archiver/archive_index.csv" INDEX_FILE="/root/Gitea/audio_archiver/archive_index.csv"
@ -27,36 +27,36 @@ mkdir -p "$STAGING_DIR" "$ISO_OUTPUT_DIR" $(dirname "$CONFIG_FILE") $(dirname "$
# Funktion zur Verarbeitung des vollen Staging-Verzeichnisses # Funktion zur Verarbeitung des vollen Staging-Verzeichnisses
finalize_iso() { finalize_iso() {
    log_info "--- ISO $CURRENT_ISO_ID erreicht Speichergrenze. Erstelle Image. ---" 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) local ISO_FILENAME="${ISO_OUTPUT_DIR}/${CURRENT_ISO_ID}.iso"
    # Die Ausgabe wird in die temporäre Datei umgeleitet # Temporäre Datei für die Ausgabe von genisoimage
    genisoimage -r -J -o "$ISO_FILENAME" "$STAGING_DIR" > "$GENISO_LOG" 2>&1 local GENISO_LOG=$(mktemp)
    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 # 1. ISO-Image erstellen (mit Rock Ridge für lange Dateinamen)
        log_info "ISO-Image '$ISO_FILENAME' erfolgreich erstellt." # Die Ausgabe wird in die temporäre Datei umgeleitet
         genisoimage -r -J -o "$ISO_FILENAME" "$STAGING_DIR" > "$GENISO_LOG" 2>&1
        # 2. Staging-Verzeichnis leeren local EXIT_CODE=$?
        log_info "Leere Staging-Verzeichnis..."
        rm -rf "$STAGING_DIR"/* # Protokollierung der genisoimage-Ausgabe
         log_info "Ausgabe von genisoimage: $(cat $GENISO_LOG | tr '\n' ' ')"
        # 3. Zur nächsten ISO wechseln und Konfiguration speichern rm -f "$GENISO_LOG" # Temporäre Datei löschen
        next_iso_id
        save_config if [ $EXIT_CODE -eq 0 ]; then
    else log_info "ISO-Image '$ISO_FILENAME' erfolgreich erstellt."
        log_error "FEHLER ($EXIT_CODE) beim Erstellen des ISO-Images '$ISO_FILENAME'."
        exit 1 # 2. Staging-Verzeichnis leeren
    fi log_info "Leere Staging-Verzeichnis..."
    log_info "------------------------------------------------------------------" 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 "------------------------------------------------------------------"
} }
@ -66,56 +66,56 @@ log_info "Archivierung gestartet. Aktuelle ISO: $CURRENT_ISO_ID, Zähler: $CURRE
# 1. Alle neuen/unverarbeiteten MP3s finden # 1. Alle neuen/unverarbeiteten MP3s finden
find "$SOURCE_DIR" -type f -name "*.mp3" | while read -r FILE_PATH; do 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) # Prüfen, ob Datei bereits im Index ist (verhindert Doppelarchivierung)
    [ -z "$KUENSTLER" ] && KUENSTLER="Unknown Artist" if grep -q ";${FILE_PATH}$" "$INDEX_FILE"; then
    [ -z "$TITEL" ] && TITEL="Unknown Title" continue # Datei wurde bereits archiviert, überspringen
fi
    # 4. Eindeutigen Dateinamen generieren und kopieren # **KORREKTUR 1: Größenprüfung VOR Kopieren mit Dateigröße**
    NEW_FILENAME=$(printf "%s_%06d.mp3" "$CURRENT_ISO_ID" "$CURRENT_FILE_COUNTER") # Die Größe der aktuellen Datei holen
    log_info "Kopiere $FILE_PATH zu $NEW_FILENAME" FILE_SIZE=$(stat -c%s "$FILE_PATH")
    cp "$FILE_PATH" "$STAGING_DIR/$NEW_FILENAME"
    
    if [ $? -eq 0 ]; then
        log_info "Archiviert: $NEW_FILENAME"
        # 5. Index-Eintrag hinzufügen # Größe des Staging-Verzeichnisses holen
        echo "$KUENSTLER;$TITEL;$CURRENT_ISO_ID;$CURRENT_FILE_COUNTER;$FILE_PATH" >> "$INDEX_FILE" CURRENT_STAGING_SIZE=$(du -bs "$STAGING_DIR" | awk '{print $1}')
        
        # 6. Zähler erhöhen und Konfiguration speichern # Bei Erreichen der Grenze: Schließe ISO ab und starte neue
        CURRENT_FILE_COUNTER=$((CURRENT_FILE_COUNTER + 1)) # Prüfen, ob die Hinzufügung der aktuellen Datei das Limit überschreiten würde
        save_config if [[ $(($CURRENT_STAGING_SIZE + $FILE_SIZE)) -ge "$ISO_LIMIT_BYTES" ]]; then
    else log_warn "Nächste Datei würde Limit überschreiten. Finalisiere aktuelle ISO: $CURRENT_ISO_ID"
        log_error "FEHLER beim Kopieren der Datei: $FILE_PATH" finalize_iso
    fi # 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 done