Initial commit
This commit is contained in:
17
settings.ini
Normal file
17
settings.ini
Normal file
@@ -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
|
||||
209
shell_tmm_media_backup.sh
Executable file
209
shell_tmm_media_backup.sh
Executable file
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user