Hier versuche ich mal zusammen zu fassen was mir bei der Organisation hilfreich war.
Grundsätzliche Annahmen
- Ablage der Hörbücher in Verzeichnissen nach Author (Vorname Nachname) dann wenn vorhanden Unterverzeichnis Serie/Reihe und/oder dann Unterverzeichnis Buch
- Der besseren Übersichtlichkeit habe ich die Autoren auch noch mal nach den 26 Buchstaben des Alphabets getrennt
- Der Dateinamen der Bücher ???
Naja … Wichtig ist das eine Nummerierung dafür sorgt, dass die einzelnen MP3 Dateien in der richtigen Reihenfolge abgespielt werden.
Schön finde ich schon <Filenummer> – <Author> – <Reihe (wenn vorhanden)> – <Buchtitel>
Aber das kann auch schnell sehr lang werden. - Qualität der Hörbücher?
Also mir reichen 64 bis 96 kbit/s
D.h. wenn ich selbst hier etwas umkodiere, dann nutze ich 96 kbit/s - MP3 Tags
Ja sehr sinnvoll! Also gerne alle MP3 Tags setzen.
ABER! Kein Bild / Cover in die Dateien!!! Das bläht diese unnötig auf! - Bei jedem einzelnen Buch sollte ein Bild im Verzeichnis liegen mit Namen Cover.jpg oder Folder.jpg!
- Problem bei der Hörbucharchivierung
Ich hatte Verzeichnisse die nur ein Buch enthalten haben.
Diese hatten meist den Aufbau <Name Author>_<Buch Titel>
Nun möchte ich aber grundsätzlich ein Verzeichnis mit dem Namen des Author und erst darunter dann die einzelnen Bücher. (AUCH Wenn es aktuell nur 1 Buch ist)Diese habe ich mit folgendem Befehl identifiziert
1ls -1 |grep '_'|grep -v '&'|grep -v '!'|grep -v \'|grep -v +
Dabei habe ich auch die Besonderheit von Sonderzeichen für die weitere Bearbeitung ausgeklammert.Das Ergebnis habe ich dann im Texteditor (Geany) kurz bearbeitet indem ich alle Leerzeichen mit einem Backslash versehen habe. (Suchen ‚ ‚ Ersetzen ‚\ ‚)Dieses Ergebnis dann in die Tabellenkalkulation, dabei Text in Spalten mit dem Trenner ‚_‘ eingefügt. Es sollten zwei Spalten entstehen.
In die dritte Spalte kommt dann die Formel:
1=VERKETTEN("mkdir ";A1;"; mv ";A1;"_";B1;" ";A1)
Damit wir ein entsprechendes Verzeichnis angelegt und die Datei dort hin verschoben.Jetzt noch Restarbeiten.
Als erstes mal alle leeren Verzeichnisse löschen. (Bemerkungen zu fehlenden Bücherteilen also nicht als Verzeichnistext sondern als Datei speichern)
Und dazu auch noch auflisten, was an Dateien mit Sonderzeichen noch übrig ist.
1find *_* -type d -empty -delete; ls -1 |grep '_'
Falls hier noch was auftaucht …. Da ist erstmal noch HANDARBEIT angesagt - Alle Images aus den MP3 Dateien entfernen
1eyeD3 --remove-all-images *.mp3
- Alle MP3 Dateien nach 96 / 64 Kbit/s umwandeln
1234567for f in *.mp3; do ffmpeg -i "$f" -b:a 96k "96k_${f%.mp3}_96k.mp3"; done# Oder auch hier nur <strong>64Kbit/s und Mono</strong>for f in *.mp3; do ffmpeg -i "$f" -ac 1 -b:a 64k "64k_${f%.mp3}.mp3"; done# Hier nun mit vbr (variabler Bit Rate)for f in *.mp3; do ffmpeg -i "$f" -ac 1 -vbr 4 "VBR_${f%.mp3}.mp3"; done
Die VBR-Modi 1-5 entsprechen in etwa folgenden durchschnittlichen Bitraten:
‚1‘ 32 kbps/Kanal
‚2‘ 40 kbps/Kanal
‚3‘ 48–56 kbit/s/Kanal
‚4‘ 64 kbps/Kanal
‚5‘ etwa 80-96 kbps/Kanal
Der Standardwert ist 0. - Und dann die doppelten Dateien nach der Umwandlung am besten per Script aufräumen
1for f in VBR_*.mp3; do mv "$f" "$(echo $f | sed 's/VBR_//g')"; done
- Alle ZIP Dateien in einem Ordner und dessen Unterordner entpacken
Und danach die ZIP Datei gleich löschen. (Es wird also während der Aktion nicht mehr Platz benötigt auf der Platte)
12345find . -depth -name '*.zip' -execdir unzip -n {} \; -delete#Und nun nach nachschauen was übrig istfind . -depth -name '*.zip'#Das sind dann doppelte oder es sind Sonderzeichen in den Dateien und er konnte es nicht handeln
- Ermitteln der Gesamtspieldauer aller MP3 Dateien in einem Verzeichnis
Dazu zwei verschiedene Scripte
12345678910#!/bin/bashTOTAL_DURATION=0files=(*.mp3)BITRATE="$(mediainfo --Output='Audio;%BitRate/String%' "${files[4]}")"for file in *.mp3; doDURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")TOTAL_DURATION=$(awk "BEGIN {print $TOTAL_DURATION + $DURATION}")doneTOTAL_SEKUNDEN=$(echo "$TOTAL_DURATION" | awk '{print int($1)}')echo "Gesamtdauer: $(($TOTAL_SEKUNDEN/3600)) Stunden $(($TOTAL_SEKUNDEN%60)) Minuten ca. $BITRATE"
abgelegt als mp3sum.sh im Verzeichnis /home/dopper/scripte/ oder auch
1tot=0; while read -r i; do tmp=0; tmp=`ffprobe "$i" -show_format 2>/dev/null | grep "^duration" | cut -d '=' -f 2 | cut -d '.' -f 1`; if [ -n "$tmp" ]; then let tot+=$tmp; fi; done < <(find . -type f -iname "*[.mp3,.wav]"); echo "Gesamtdauer: $(($tot/3600)) Stunden $(($tot%60)) Minuten"
als Einzeiler - So und hier die Ermittlung der Gesamtspieldauer der MP3 Dateien für jedes einzelne Unterverzeichnis
123456789101112131415161718192021222324252627282930#!/bin/bash# =====================================================================================================================# Script um die Gesamtspielzeit der MP3 Dateien in jedem Verzeichnis einzeln zu ermitteln# =====================================================================================================================find . -type d -print0 | while IFS= read -r -d '' dir; doecho "=================================================================================================="# echo "Betrete: $dir"# Hier deine Befehle einfügen:if [ "$dir" != "." ]then# echo "Betrete: $dir"TOTAL_DURATION=0for file in "$dir"/*.mp3; doDURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")TOTAL_DURATION=$(awk "BEGIN {print $TOTAL_DURATION + $DURATION}")doneTOTAL_SEKUNDEN=$(echo "$TOTAL_DURATION" | awk '{print int($1)}')# =====================================================================================================================# In den nächsten 2 Zeilen wird die Bitrate des 5. MP3 Files im Verzeichnis ermittelt# =====================================================================================================================files=("$dir"/*.mp3)BITRATE="$(mediainfo --Output='Audio;%BitRate/String%' "${files[4]}")"# echo "$BITRATE"# =====================================================================================================================echo "-----------------------------------------------------------------------------------"echo "$(($TOTAL_SEKUNDEN/3600)) Stunden ### $(($TOTAL_SEKUNDEN%60)) Minuten ### ca. $BITRATE ### $dir"# echo "-----------------------------------------------------------------------------------"fi;doneecho "=================================================================================================="
Dieses Script habe ich mit dem Namen mp3dirsum.sh im Verzeichnis /home/dopper/scripte/ abgelegt.
Dieses Verzeichnis, habe ich dann auch im PATH bekanntgemacht, sodass ich es überall aufrufen kann. - Als letztes geht es noch darum die Ordner auf dem gleichen Stand zu halten.
Meine Master Platte für die Audiobooks ist die 17 TB Elements Platte
Diese spiegele ich mit folgendem Befehl
1rsync -avu --delete "/media/dopper/__17_TB__-2/__17_TB__Elements/Bibliothek/Audiobooks/_01_Hörbücher von A - Z nach Autor/" "/media/dopper/Expansion-2/__15_TB__Expansion/Bibliothek/Audiobooks/_01_Hörbücher von A - Z nach Autor" > rsync_20260108.log
