From 10cab3f965cd25b1705d96821f5693e0b3ce9768 Mon Sep 17 00:00:00 2001 From: Thorsten Date: Fri, 31 Jan 2025 22:23:46 +0100 Subject: [PATCH] multiple source dir support --- settings.ini | 21 +++++-- shell_tmm_media_backup.sh | 128 +++++++++++++++++++++----------------- 2 files changed, 86 insertions(+), 63 deletions(-) diff --git a/settings.ini b/settings.ini index 78f99d0..c620b1c 100644 --- a/settings.ini +++ b/settings.ini @@ -1,11 +1,22 @@ [Paths] -source_dir=/home/thorsten/mnt/unRAID/Media/Filme/ -backup_dir=/home/thorsten/mnt/unRAID/Media/[0] Temp/Backup/Filme/ +source_dir=/home/thorsten/mnt/unRAID/Media/Filme/FSK 0/ +source_dir=/home/thorsten/mnt/unRAID/Media/Filme/FSK 6/ +source_dir=/home/thorsten/mnt/unRAID/Media/Filme/FSK 12/ +source_dir=/home/thorsten/mnt/unRAID/Media/Filme/FSK 16/ +source_dir=/home/thorsten/mnt/unRAID/Media/Filme/FSK 18/ +source_dir=/home/thorsten/mnt/unRAID/Media 2/TV Serien/FSK 0/ +source_dir=/home/thorsten/mnt/unRAID/Media 2/TV Serien/FSK 6/ +source_dir=/home/thorsten/mnt/unRAID/Media 2/TV Serien/FSK 12/ +source_dir=/home/thorsten/mnt/unRAID/Media 2/TV Serien/FSK 16/ +source_dir=/home/thorsten/mnt/unRAID/Media 2/TV Serien/FSK 18/ + +backup_dir_movies=/home/thorsten/mnt/unRAID/Media/[0] Temp/Backup/Filme/ +backup_dir_series=/home/thorsten/mnt/unRAID/Media/[0] Temp/Backup/Serien/ [Options] -backup_actors=true -backup_trickplay=true -backup_trailer=true +backup_actors=false +backup_trickplay=false +backup_trailer=false backup_banner=true backup_clearart=true backup_clearlogo=true diff --git a/shell_tmm_media_backup.sh b/shell_tmm_media_backup.sh index 33b5ff4..2cc9fbe 100755 --- a/shell_tmm_media_backup.sh +++ b/shell_tmm_media_backup.sh @@ -2,10 +2,19 @@ settings_file="./settings.ini" -# Start- und Zielordner als Variablen -source_dir=$(sed -nr "/^\[Paths\]/ { :l /^source_dir[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") -backup_dir=$(sed -nr "/^\[Paths\]/ { :l /^backup_dir[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") +# Funktion zum Lesen der Pfade aus der settings.ini und Entfernen von Anführungszeichen +read_source_dirs() { + sed -nr "/^\[Paths\]/ { :l /^source_dir[ ]*=/ { s/[^=]*=[ ]*//; s/^\"//; s/\"$//; p; n; b l;}; n; b l;}" "$settings_file" +} +# Start- und Zielordner als Variablen +source_dirs=() +while IFS= read -r line; do + source_dirs+=("$line") +done < <(read_source_dirs) + +backup_dir_movies=$(sed -nr "/^\[Paths\]/ { :l /^backup_dir_movies[ ]*=/ { s/[^=]*=[ ]*//; s/^\"//; s/\"$//; p; q;}; n; b l;}" "$settings_file") +backup_dir_series=$(sed -nr "/^\[Paths\]/ { :l /^backup_dir_series[ ]*=/ { s/[^=]*=[ ]*//; s/^\"//; s/\"$//; p; q;}; n; b l;}" "$settings_file") # Sicherungsoptionen backup_actors=$(sed -nr "/^\[Options\]/ { :l /^backup_actors[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") @@ -21,8 +30,6 @@ backup_discart=$(sed -nr "/^\[Options\]/ { :l /^backup_discart[ ]*=/ { s/[^=]*=[ backup_musictheme=$(sed -nr "/^\[Options\]/ { :l /^backup_musictheme[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") backup_nfo=$(sed -nr "/^\[Options\]/ { :l /^backup_nfo[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") - - # Liste der Dateimuster pro Typ declare -A backup_patterns backup_patterns[trailer]="*-trailer.* *-sample.* *-scene.* *-clip.* *-interview.* *-behindthescenes.* *-deleted.* *-featurette.* *-extra.* trailer.* sample.* scene.* clip.* interview.* behindthescenes.* deleted.* featurette.* extra.*" @@ -42,7 +49,6 @@ backup_folders[actors]=".actors" backup_folders[trickplay]="*.trickplay" backup_folders[fanart]="*extrafanart" - #colors RED='\033[0;31m' GREEN='\033[0;92m' @@ -56,16 +62,13 @@ NC='\033[0m' # No Color max_parallel=1 current_jobs=0 -# Prüfen, ob der Startordner existiert -if [ ! -d "$source_dir" ]; then - echo "Startordner existiert nicht: $source_dir" - exit 1 -fi - -# Prüfen, ob der Zielordner existiert, sonst erstellen -if [ ! -d "$backup_dir" ]; then - mkdir -p "$backup_dir" -fi +# Prüfen, ob die Startordner existieren +for source_dir in "${source_dirs[@]}"; do + if [ ! -d "$source_dir" ]; then + echo "Startordner existiert nicht: $source_dir" + exit 1 + fi +done # Funktion für das Erstellen eines Backups für Filme backup_movie_folder() { @@ -73,16 +76,20 @@ backup_movie_folder() { local movie_name local zip_file + # Prüfen, ob der Zielordner existiert, sonst erstellen + if [ ! -d "$backup_dir_movies" ]; then + mkdir -p "$backup_dir_movies" + fi + # Filmname aus dem Ordnernamen ableiten movie_name=$(basename "$folder") - zip_file="${backup_dir}/${movie_name}.zip" + zip_file="${backup_dir_movies}/${movie_name}.zip" zip_file=$(echo "$zip_file" | sed 's|//|/|g') echo -e "${BLACK_ON_WHITE} Backup erstellen ${NC} $zip_file" # Prüfen, ob die ZIP-Datei bereits existiert und ggf. löschen if [ -f "$zip_file" ]; then - #echo "Vorhandene ZIP-Datei gefunden. Lösche: $zip_file" rm -f "$zip_file" fi @@ -115,8 +122,6 @@ backup_movie_folder() { zip -r "$zip_file" "${movie_name}" >/dev/null ) - #echo "Backup erstellt: $zip_file" - # Temporären Ordner löschen rm -rf "$temp_dir" } @@ -127,16 +132,20 @@ backup_series_folder() { local series_name local zip_file + # Prüfen, ob der Zielordner existiert, sonst erstellen + if [ ! -d "$backup_dir_series" ]; then + mkdir -p "$backup_dir_series" + fi + # Serienname aus dem Ordnernamen ableiten series_name=$(basename "$folder") - zip_file="${backup_dir}/${series_name}.zip" + zip_file="${backup_dir_series}/${series_name}.zip" zip_file=$(echo "$zip_file" | sed 's|//|/|g') echo -e "${BLACK_ON_WHITE} Backup erstellen ${NC} $zip_file" # Prüfen, ob die ZIP-Datei bereits existiert und ggf. löschen if [ -f "$zip_file" ]; then - # echo "Vorhandene ZIP-Datei gefunden. Lösche: $zip_file" rm -f "$zip_file" fi @@ -184,8 +193,6 @@ backup_series_folder() { zip -r "$zip_file" "${series_name}" >/dev/null ) - #echo "Backup erstellt: $zip_file" - # Temporären Ordner löschen rm -rf "$temp_dir" } @@ -201,57 +208,62 @@ wait_for_jobs() { # Verarbeitung starten export -f backup_movie_folder export -f backup_series_folder -export source_dir backup_dir backup_patterns backup_folders +export backup_dir_movies backup_dir_series backup_patterns backup_folders echo "────────────────────────────────────────────────────────────────" echo -e "${BLACK_ON_WHITE} TMM Media Backup ${NC}" echo "────────────────────────────────────────────────────────────────" echo " " -echo -e "${WHITE_ON_GRAY} Source Folder ${NC} ""$source_dir""" -echo -e "${WHITE_ON_GRAY} Backup Folder ${NC} ""$backup_dir""" +for i in "${!source_dirs[@]}"; do + printf -v folder_number "%02d" "$((i+1))" + echo -e "${WHITE_ON_GRAY} Source Folder $folder_number ${NC} ${source_dirs[$i]}" +done +echo " " +echo "────────────────────────────────────────────────────────────────" +echo " " +echo -e "${WHITE_ON_GRAY} Movies Backups ${NC} ""$backup_dir_movies""" +echo -e "${WHITE_ON_GRAY} Series Backups ${NC} ""$backup_dir_series""" echo " " echo "────────────────────────────────────────────────────────────────" +for source_dir in "${source_dirs[@]}"; do + find "$source_dir" -type f \( -name "*.nfo" -o -name "tvshow.nfo" \) -print0 | \ + while IFS= read -r -d '' nfo_file; do + folder=$(dirname "$nfo_file") + + # Überspringe Ordner mit dem Namen ".deletedByTMM" + if [[ "$folder" == *"/.deletedByTMM"* ]]; then + continue + fi -find "$source_dir" -type f \( -name "*.nfo" -o -name "tvshow.nfo" \) -print0 | \ -while IFS= read -r -d '' nfo_file; do - folder=$(dirname "$nfo_file") - - # Überspringe Ordner mit dem Namen ".deletedByTMM" - if [[ "$folder" == *"/.deletedByTMM"* ]]; then - continue - fi - - if [[ "$(basename "$nfo_file")" == "tvshow.nfo" ]]; then - wait_for_jobs - - echo "────────────────────────────────────────────────────────────────" - echo -e "${BLACK_ON_WHITE} NFO gefunden ${NC} $nfo_file" - echo -e "${BLACK_ON_WHITE} NFO Typ ${NC} Serie" - - backup_series_folder "$folder" - - echo -e "${BLACK_ON_WHITE} Abgeschlossen! ${NC} $(date +'%Y-%m-%d %H:%M:%S')" - - else - # Sicherstellen, dass keine Staffel-/Season- oder Specials-Ordner als eigenständige Filme behandelt werden - if [[ "$folder" != *"/Staffel "* && "$folder" != *"/Season "* && "$folder" != *"/Specials"* ]]; then + if [[ "$(basename "$nfo_file")" == "tvshow.nfo" ]]; then wait_for_jobs echo "────────────────────────────────────────────────────────────────" echo -e "${BLACK_ON_WHITE} NFO gefunden ${NC} $nfo_file" - echo -e "${BLACK_ON_WHITE} NFO Typ ${NC} Film" + echo -e "${BLACK_ON_WHITE} NFO Typ ${NC} Serie" - backup_movie_folder "$folder" + backup_series_folder "$folder" echo -e "${BLACK_ON_WHITE} Abgeschlossen! ${NC} $(date +'%Y-%m-%d %H:%M:%S')" + + else + # Sicherstellen, dass keine Staffel-/Season- oder Specials-Ordner als eigenständige Filme behandelt werden + if [[ "$folder" != *"/Staffel "* && "$folder" != *"/Season "* && "$folder" != *"/Specials"* ]]; then + wait_for_jobs + + echo "────────────────────────────────────────────────────────────────" + echo -e "${BLACK_ON_WHITE} NFO gefunden ${NC} $nfo_file" + echo -e "${BLACK_ON_WHITE} NFO Typ ${NC} Film" + + backup_movie_folder "$folder" + + echo -e "${BLACK_ON_WHITE} Abgeschlossen! ${NC} $(date +'%Y-%m-%d %H:%M:%S')" + fi fi - fi - current_jobs=$((current_jobs + 1)) + current_jobs=$((current_jobs + 1)) + done done - - # Warte auf alle verbleibenden Prozesse -wait - +wait \ No newline at end of file