audio_archiver.sh aktualisiert

This commit is contained in:
alf
2025-10-23 09:51:55 +00:00
parent 9eb0b1130c
commit a4ed80246a

View File

@ -1,19 +1,26 @@
#!/bin/bash #!/bin/bash
# ... (Ihre KONFIGURATION und logger_init/logger_start sind hier unverändert) ...
# --- KONFIGURATION --- # --- KONFIGURATION ---
# Das Skript benötigt Lesezugriff auf dieses Verzeichnis # Das Skript benötigt Lesezugriff auf dieses Verzeichnis
SOURCE_DIR="/srv/MEDIA/Audio/Radio-Archiv/2025/10" 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" STAGING_DIR="/srv/MEDIA/Audio/ISO/Staging"
# Ausgabeort für fertige ISO-Dateien
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)
# Hier auf ca. 4.6 GB gesetzt, um Puffer zu haben
ISO_LIMIT_BYTES=4939274240 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" 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" 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" LOG_FILE="/root/Gitea/logger/Logs/audio_archiver.log"
source /root/Gitea/logger/logger.sh source /root/Gitea/logger/logger.sh
log_init $LOG_FILE log_init $LOG_FILE
@ -23,40 +30,68 @@ log_start
# Sicherstellen, dass die Verzeichnisse existieren # Sicherstellen, dass die Verzeichnisse existieren
mkdir -p "$STAGING_DIR" "$ISO_OUTPUT_DIR" $(dirname "$CONFIG_FILE") $(dirname "$INDEX_FILE") 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 # 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" local ISO_FILENAME="${ISO_OUTPUT_DIR}/${CURRENT_ISO_ID}.iso"
# Temporäre Datei für die Ausgabe von genisoimage # Temporäre Datei für die Ausgabe von genisoimage
local GENISO_LOG=$(mktemp) local GENISO_LOG=$(mktemp)
# 1. ISO-Image erstellen (mit Rock Ridge für lange Dateinamen) # 1. ISO-Image erstellen (mit Rock Ridge -r und Joliet -J für lange Dateinamen)
# Die Ausgabe wird in die temporäre Datei umgeleitet # Die Ausgabe wird in die temporäre Datei umgeleitet
genisoimage -r -J -o "$ISO_FILENAME" "$STAGING_DIR" > "$GENISO_LOG" 2>&1 genisoimage -r -J -o "$ISO_FILENAME" "$STAGING_DIR" > "$GENISO_LOG" 2>&1
local EXIT_CODE=$? local EXIT_CODE=$?
# Protokollierung der genisoimage-Ausgabe # Protokollierung der genisoimage-Ausgabe
log_info "Ausgabe von genisoimage: $(cat $GENISO_LOG | tr '\n' ' ')" log_info "Ausgabe von genisoimage (Auszug): $(tail -n 3 $GENISO_LOG | tr '\n' ' ')"
rm -f "$GENISO_LOG" # Temporäre Datei löschen rm -f "$GENISO_LOG" # Temporäre Datei löschen
if [ $EXIT_CODE -eq 0 ]; then if [ $EXIT_CODE -eq 0 ]; then
log_info "ISO-Image '$ISO_FILENAME' erfolgreich erstellt." log_info "ISO-Image '$ISO_FILENAME' erfolgreich erstellt. Fertig zum Brennen."
# 2. Staging-Verzeichnis leeren # 2. Staging-Verzeichnis leeren
log_info "Leere Staging-Verzeichnis..." log_info "Leere Staging-Verzeichnis..."
rm -rf "$STAGING_DIR"/* rm -rf "$STAGING_DIR"/*
# 3. Zur nächsten ISO wechseln und Konfiguration speichern # 3. Zur nächsten ISO wechseln und Konfiguration speichern
next_iso_id next_iso_id
save_config save_config
else else
log_error "FEHLER ($EXIT_CODE) beim Erstellen des ISO-Images '$ISO_FILENAME'." log_error "FEHLER ($EXIT_CODE) beim Erstellen des ISO-Images '$ISO_FILENAME'."
exit 1 exit 1
fi fi
log_info "------------------------------------------------------------------" log_info "------------------------------------------------------------------"
} }
@ -67,55 +102,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) # a) Prüfen, ob Datei bereits im Index ist (verhindert Doppelarchivierung)
if grep -q ";${FILE_PATH}$" "$INDEX_FILE"; then if grep -q ";${FILE_PATH}$" "$INDEX_FILE"; then
continue # Datei wurde bereits archiviert, überspringen log_info "Datei bereits im Index, überspringe: $FILE_PATH"
fi continue
fi
# **KORREKTUR 1: Größenprüfung VOR Kopieren mit Dateigröße** # b) Größe der aktuellen Datei holen
# Die Größe der aktuellen Datei holen FILE_SIZE=$(stat -c%s "$FILE_PATH")
FILE_SIZE=$(stat -c%s "$FILE_PATH")
# Größe des Staging-Verzeichnisses holen # c) Größe des Staging-Verzeichnisses holen (in Bytes)
CURRENT_STAGING_SIZE=$(du -bs "$STAGING_DIR" | awk '{print $1}') CURRENT_STAGING_SIZE=$(du -bs "$STAGING_DIR" | awk '{print $1}')
# Bei Erreichen der Grenze: Schließe ISO ab und starte neue # 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 # 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 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" log_warn "Nächste Datei würde Limit überschreiten. Finalisiere aktuelle ISO: $CURRENT_ISO_ID"
finalize_iso 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 # Gehe zur nächsten Schleifeniteration. Die aktuelle Datei wird dann in das
# Trennzeichen ist TAB (\t) # neu geleerte Staging-Verzeichnis kopiert (neue ISO_ID).
TAGS=$(exiftool -s3 -T -Artist -Title "$FILE_PATH") continue
KUENSTLER=$(echo "$TAGS" | awk -F '\t' '{print $1}') fi
TITEL=$(echo "$TAGS" | awk -F '\t' '{print $2}')
# Sicherstellen, dass Tags vorhanden sind (falls nicht, 'Unknown' verwenden) # 3. Metadaten (Tags) auslesen mit exiftool
[ -z "$KUENSTLER" ] && KUENSTLER="Unknown Artist" # Trennzeichen ist TAB (\t)
[ -z "$TITEL" ] && TITEL="Unknown Title" 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
# 4. Eindeutigen Dateinamen generieren und kopieren # Sicherstellen, dass Tags vorhanden sind (falls nicht, 'Unknown' verwenden)
NEW_FILENAME=$(printf "%s_%06d.mp3" "$CURRENT_ISO_ID" "$CURRENT_FILE_COUNTER") [ -z "$KUENSTLER" ] && KUENSTLER="Unknown Artist"
log_info "Kopiere $FILE_PATH zu $NEW_FILENAME" [ -z "$TITEL" ] && TITEL="Unknown Title"
cp "$FILE_PATH" "$STAGING_DIR/$NEW_FILENAME"
if [ $? -eq 0 ]; then # 4. Eindeutigen Dateinamen generieren und kopieren
log_info "Archiviert: $NEW_FILENAME" 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"
# 5. Index-Eintrag hinzufügen if [ $? -eq 0 ]; then
echo "$KUENSTLER;$TITEL;$CURRENT_ISO_ID;$CURRENT_FILE_COUNTER;$FILE_PATH" >> "$INDEX_FILE" log_info "Archiviert: $NEW_FILENAME (Nr. $CURRENT_FILE_COUNTER)"
# 6. Zähler erhöhen und Konfiguration speichern # 5. Index-Eintrag hinzufügen
CURRENT_FILE_COUNTER=$((CURRENT_FILE_COUNTER + 1)) echo "$KUENSTLER;$TITEL;$CURRENT_ISO_ID;$CURRENT_FILE_COUNTER;$FILE_PATH" >> "$INDEX_FILE"
save_config
else # 6. Zähler erhöhen und Konfiguration speichern
log_error "FEHLER beim Kopieren der Datei: $FILE_PATH" CURRENT_FILE_COUNTER=$((CURRENT_FILE_COUNTER + 1))
fi save_config
else
log_error "FEHLER beim Kopieren der Datei: $FILE_PATH"
fi
done done