#!/bin/bash # --- 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 log_start # --------------------- # Sicherstellen, dass die Verzeichnisse existieren mkdir -p "$STAGING_DIR" "$ISO_OUTPUT_DIR" $(dirname "$CONFIG_FILE") $(dirname "$INDEX_FILE") # 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) # 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. 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 "------------------------------------------------------------------" } # --- 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 # 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" # 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 done log_info "Archivierung abgeschlossen. $CURRENT_ISO_ID ist aktuell im Staging." # --- HAUPTPROGRAMM ENDE --- log_end