commit 063d48f503b2e10a9d6e1c578abca68da793e688 Author: Thorsten Date: Sat Jan 25 10:23:57 2025 +0100 Initial commit diff --git a/settings.ini b/settings.ini new file mode 100644 index 0000000..38e3356 --- /dev/null +++ b/settings.ini @@ -0,0 +1,17 @@ +[Paths] +source_dir=/home/thorsten/Schreibtisch/Filme/ +backup_dir=/home/thorsten/Schreibtisch/Backup/ + +[Options] +backup_actors=true +backup_trickplay=true +backup_trailer=true +backup_banner=true +backup_clearart=true +backup_clearlogo=true +backup_fanart=true +backup_landscape=true +backup_poster=true +backup_discart=true +backup_nfo=true +backup_musictheme=true diff --git a/shell_tmm_media_backup.sh b/shell_tmm_media_backup.sh new file mode 100755 index 0000000..933991b --- /dev/null +++ b/shell_tmm_media_backup.sh @@ -0,0 +1,209 @@ +#!/bin/bash + +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") + + +# Sicherungsoptionen +backup_actors=$(sed -nr "/^\[Options\]/ { :l /^backup_actors[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") +backup_trickplay=$(sed -nr "/^\[Options\]/ { :l /^backup_trickplay[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") +backup_trailer=$(sed -nr "/^\[Options\]/ { :l /^backup_trailer[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") +backup_banner=$(sed -nr "/^\[Options\]/ { :l /^backup_banner[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") +backup_clearart=$(sed -nr "/^\[Options\]/ { :l /^backup_clearart[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") +backup_clearlogo=$(sed -nr "/^\[Options\]/ { :l /^backup_clearlogo[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") +backup_fanart=$(sed -nr "/^\[Options\]/ { :l /^backup_fanart[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") +backup_landscape=$(sed -nr "/^\[Options\]/ { :l /^backup_landscape[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") +backup_poster=$(sed -nr "/^\[Options\]/ { :l /^backup_poster[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") +backup_discart=$(sed -nr "/^\[Options\]/ { :l /^backup_discart[ ]*=/ { s/[^=]*=[ ]*//; p; q;}; n; b l;}" "$settings_file") +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.*" +backup_patterns[banner]="*-banner.* banner.*" +backup_patterns[clearart]="*-clearart.* cleartart.*" +backup_patterns[clearlogo]="*-clearlogo.* *-logo.* clearlogo.* logo.*" +backup_patterns[fanart]="*-backdrop.* *-fanart.* *-art.* backdrop.* fanart.* art.*" +backup_patterns[landscape]="*-landscape.* *-thumb.* landscape.* thumb.*" +backup_patterns[poster]="*-poster.* *-folder.* *-cover.* poster.* folder.* cover.*" +backup_patterns[discart]="*-discart.* *-disc.* discart.* disc.*" +backup_patterns[backup_musictheme]="*-theme.mp3 theme.mp3" +backup_patterns[nfo]="*.nfo" + +# Spezielle Ordner für Backup +declare -A backup_folders +backup_folders[actors]=".actors" +backup_folders[trickplay]="*.trickplay" +backup_folders[fanart]="*extrafanart" + +# Maximal 2 parallele Prozesse +max_parallel=2 +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 + +# Funktion für das Erstellen eines Backups für Filme +backup_movie_folder() { + local folder="$1" + local movie_name + local zip_file + + # Filmname aus dem Ordnernamen ableiten + movie_name=$(basename "$folder") + zip_file="${backup_dir}/${movie_name}.zip" + + echo "Erstelle Backup für Film: $movie_name" + + # 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 + + # Temporären Ordner für das Backup erstellen + temp_dir=$(mktemp -d) + + # Eigenen Ordner für den Film im temporären Verzeichnis erstellen + movie_backup_dir="${temp_dir}/${movie_name}" + mkdir -p "$movie_backup_dir" + + # Dateien/Ordner sichern, basierend auf den Optionen + for type in "${!backup_patterns[@]}"; do + eval "should_backup=\$backup_$type" + if [ "$should_backup" = true ]; then + find "$folder" -type f \( $(echo "${backup_patterns[$type]}" | sed 's/ / -o -name /g' | sed 's/^/-name /') \) -exec cp --target-directory="$movie_backup_dir" -- {} + + fi + done + + # Spezielle Ordner sichern + for type in "${!backup_folders[@]}"; do + eval "should_backup=\$backup_$type" + if [ "$should_backup" = true ]; then + find "$folder" -type d -name "${backup_folders[$type]}" -exec cp -r --target-directory="$movie_backup_dir" -- {} + + fi + done + + # Zip-Datei erstellen + ( + cd "$temp_dir" || exit + zip -r "$zip_file" "${movie_name}" >/dev/null + ) + echo "Backup erstellt: $zip_file" + + # Temporären Ordner löschen + rm -rf "$temp_dir" +} + +# Funktion für das Erstellen eines Backups für Serien +backup_series_folder() { + local folder="$1" + local series_name + local zip_file + + # Serienname aus dem Ordnernamen ableiten + series_name=$(basename "$folder") + zip_file="${backup_dir}/${series_name}.zip" + + echo "Erstelle Backup für Serie: $series_name" + + # 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 + + # Temporären Ordner für das Backup erstellen + temp_dir=$(mktemp -d) + + # Eigenen Ordner für die Serie im temporären Verzeichnis erstellen + series_backup_dir="${temp_dir}/${series_name}" + mkdir -p "$series_backup_dir" + + # Hauptdateien der Serie sichern (im Serienordner selbst) + for type in "${!backup_patterns[@]}"; do + eval "should_backup=\$backup_$type" + if [ "$should_backup" = true ]; then + find "$folder" -maxdepth 1 -type f \( $(echo "${backup_patterns[$type]}" | sed 's/ / -o -name /g' | sed 's/^/-name /') \) -exec cp --target-directory="$series_backup_dir" -- {} + + fi + done + + # Alle Unterordner (z. B. Staffel 01, Staffel 02) durchgehen und sichern + find "$folder" -mindepth 1 -maxdepth 1 -type d -name "Staffel*" | while read -r season_folder; do + season_name=$(basename "$season_folder") + season_backup_dir="${series_backup_dir}/${season_name}" + mkdir -p "$season_backup_dir" + + # Dateien innerhalb des Staffelordners sichern + for type in "${!backup_patterns[@]}"; do + eval "should_backup=\$backup_$type" + if [ "$should_backup" = true ]; then + find "$season_folder" -type f \( $(echo "${backup_patterns[$type]}" | sed 's/ / -o -name /g' | sed 's/^/-name /') \) -exec cp --target-directory="$season_backup_dir" -- {} + + fi + done + + # Spezielle Ordner (z. B. .trickplay) innerhalb der Staffel sichern + for type in "${!backup_folders[@]}"; do + eval "should_backup=\$backup_$type" + if [ "$should_backup" = true ]; then + find "$season_folder" -type d -name "${backup_folders[$type]}" -exec cp -r --target-directory="$season_backup_dir" -- {} + + fi + done + done + + # Zip-Datei erstellen + ( + cd "$temp_dir" || exit + zip -r "$zip_file" "${series_name}" >/dev/null + ) + echo "Backup erstellt: $zip_file" + + # Temporären Ordner löschen + rm -rf "$temp_dir" +} + +# Warte auf aktuell laufende Prozesse +wait_for_jobs() { + while [ "$current_jobs" -ge "$max_parallel" ]; do + wait -n + current_jobs=$((current_jobs - 1)) + done +} + +# Verarbeitung starten +export -f backup_movie_folder +export -f backup_series_folder +export source_dir backup_dir backup_patterns backup_folders + +find "$source_dir" -type f \( -name "*.nfo" -o -name "tvshow.nfo" \) -print0 | \ +while IFS= read -r -d '' nfo_file; do + folder=$(dirname "$nfo_file") + if [[ "$(basename "$nfo_file")" == "tvshow.nfo" ]]; then + wait_for_jobs + backup_series_folder "$folder" & + else + if [[ "$folder" != *"/Staffel "* ]]; then + wait_for_jobs + backup_movie_folder "$folder" & + fi + fi + current_jobs=$((current_jobs + 1)) +done + +# Warte auf alle verbleibenden Prozesse +wait +