diff --git a/audio_archiver.sh b/audio_archiver.sh index 20d1f2d..c53ddf7 100644 --- a/audio_archiver.sh +++ b/audio_archiver.sh @@ -9,7 +9,7 @@ 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  +ISO_LIMIT_BYTES=4939274240 CONFIG_FILE="/root/Gitea/audio_archiver/current_iso.conf" 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 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) + 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 + # 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 "------------------------------------------------------------------" + 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 "------------------------------------------------------------------" } @@ -66,56 +66,56 @@ log_info "Archivierung gestartet. Aktuelle ISO: $CURRENT_ISO_ID, Zähler: $CURRE # 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}') + + # 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" + # 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" + # 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 + # 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 @@ -123,4 +123,4 @@ log_info "Archivierung abgeschlossen. $CURRENT_ISO_ID ist aktuell im Staging." # --- HAUPTPROGRAMM ENDE --- -log_end \ No newline at end of file +log_end