From a4ed80246a63ee52e7ac0a3bae718c9aad78e71c Mon Sep 17 00:00:00 2001 From: alf Date: Thu, 23 Oct 2025 09:51:55 +0000 Subject: [PATCH] audio_archiver.sh aktualisiert --- audio_archiver.sh | 194 +++++++++++++++++++++++++++------------------- 1 file changed, 115 insertions(+), 79 deletions(-) diff --git a/audio_archiver.sh b/audio_archiver.sh index c53ddf7..aafd91f 100644 --- a/audio_archiver.sh +++ b/audio_archiver.sh @@ -1,19 +1,26 @@ #!/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" + +# Temporäres Staging-Verzeichnis für die aktuelle ISO STAGING_DIR="/srv/MEDIA/Audio/ISO/Staging" + +# Ausgabeort für fertige ISO-Dateien ISO_OUTPUT_DIR="/srv/MEDIA/Audio/ISO/burn" # Maximale Größe des Staging-Verzeichnisses (DVD-5: 4.7 GB * 1024^3) +# Hier auf ca. 4.6 GB gesetzt, um Puffer zu haben ISO_LIMIT_BYTES=4939274240 +# Konfigurationsdatei für den aktuellen Zustand der Archivierung (ISO-ID, Zähler) CONFIG_FILE="/root/Gitea/audio_archiver/current_iso.conf" + +# Indexdatei (CSV-Format: Künstler;Titel;ISO_ID;Dateinummer;Originalpfad) INDEX_FILE="/root/Gitea/audio_archiver/archive_index.csv" +# Log-Datei und Einbindung des Logging-Skripts LOG_FILE="/root/Gitea/logger/Logs/audio_archiver.log" source /root/Gitea/logger/logger.sh log_init $LOG_FILE @@ -23,40 +30,68 @@ 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 Initialisierung/Laden der Konfiguration +load_config() { + if [ ! -f "$CONFIG_FILE" ]; then + log_info "Konfigurationsdatei nicht gefunden. Erstelle neue ISO-ID." + echo "CURRENT_ISO_ID=ISO_001" > "$CONFIG_FILE" + echo "CURRENT_FILE_COUNTER=1" >> "$CONFIG_FILE" + fi + # Werte aus der Konfigurationsdatei laden (z.B. CURRENT_ISO_ID="ISO_001") + source "$CONFIG_FILE" +} + +# Funktion zum Speichern der Konfiguration +save_config() { + echo "CURRENT_ISO_ID=$CURRENT_ISO_ID" > "$CONFIG_FILE" + echo "CURRENT_FILE_COUNTER=$CURRENT_FILE_COUNTER" >> "$CONFIG_FILE" + log_info "Config gespeichert. Aktueller Stand: ISO=$CURRENT_ISO_ID, Zähler=$CURRENT_FILE_COUNTER" +} + +# Funktion zum Hochzählen der ISO-ID (z.B. von ISO_001 auf ISO_002) +next_iso_id() { + local ID_PREFIX="${CURRENT_ISO_ID%_*}" + local ID_NUM="${CURRENT_ISO_ID##*_}" + # Inkrementieren und Formatierung auf 3 Stellen + local NEXT_NUM=$(printf "%03d" $((${ID_NUM} + 1))) + + CURRENT_ISO_ID="${ID_PREFIX}_${NEXT_NUM}" + CURRENT_FILE_COUNTER=1 + log_info "ISO ist voll. Nächste ISO-ID vorbereitet: $CURRENT_ISO_ID" +} # 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 -r und Joliet -J 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 (Auszug): $(tail -n 3 $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. Fertig zum Brennen." + + # 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 +101,57 @@ 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}') + + # a) Prüfen, ob Datei bereits im Index ist (verhindert Doppelarchivierung) + if grep -q ";${FILE_PATH}$" "$INDEX_FILE"; then + log_info "Datei bereits im Index, überspringe: $FILE_PATH" + continue + fi + + # b) Größe der aktuellen Datei holen + FILE_SIZE=$(stat -c%s "$FILE_PATH") + + # c) Größe des Staging-Verzeichnisses holen (in Bytes) + CURRENT_STAGING_SIZE=$(du -bs "$STAGING_DIR" | awk '{print $1}') + + # d) 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 + + # Gehe zur nächsten Schleifeniteration. Die aktuelle Datei wird dann in das + # neu geleerte Staging-Verzeichnis kopiert (neue ISO_ID). + 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}' | sed 's/;/,/g') # Semikolons im Tag ersetzen + TITEL=$(echo "$TAGS" | awk -F '\t' '{print $2}' | sed 's/;/,/g') # Semikolons im Tag ersetzen - # 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 $STAGING_DIR/$NEW_FILENAME" + cp "$FILE_PATH" "$STAGING_DIR/$NEW_FILENAME" + + if [ $? -eq 0 ]; then + log_info "Archiviert: $NEW_FILENAME (Nr. $CURRENT_FILE_COUNTER)" - # 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 +159,4 @@ log_info "Archivierung abgeschlossen. $CURRENT_ISO_ID ist aktuell im Staging." # --- HAUPTPROGRAMM ENDE --- -log_end +log_end \ No newline at end of file