Kleines Bash‑Skript, das Hörbuch‑Ordner unter src/ erkennt und mit m4b-tool zu einzelnen .m4b‑Dateien zusammenführt. Metadaten (Autor, Serie, Titel, Jahr, Sprecher:in) werden aus der Ordnerstruktur extrahiert und als Tags gesetzt.
Find a file
2025-09-10 16:59:15 +02:00
out chore: update .gitignore to include out and src directories; add .gitkeep files 2025-09-10 13:51:15 +02:00
src chore: update .gitignore to include out and src directories; add .gitkeep files 2025-09-10 13:51:15 +02:00
.gitignore chore: update .gitignore to include README.md; add README.md with project details and usage instructions 2025-09-10 15:42:25 +02:00
README.md docs: enhance README.md with detailed table of contents and examples for source and output structure 2025-09-10 16:22:37 +02:00
to-m4b.sh refactor: update m4b_tool_bin initialization and enhance argument parsing for backend selection 2025-09-10 16:59:15 +02:00

to-m4b

Kleines BashSkript, das HörbuchOrdner unter src/ erkennt und mit m4b-tool zu einzelnen .m4bDateien zusammenführt. Metadaten (Autor, Serie, Titel, Jahr, Sprecher:in) werden aus der Ordnerstruktur extrahiert und als Tags gesetzt. Die Ergebnisse werden unter out/ abgelegt.

Das Skript startet m4b-tool über Nix (nix run github:sandreas/m4b-tool#m4b-tool-libfdk).

Inhaltsverzeichnis

Voraussetzungen

  • Nix installiert (für den Aufruf von m4b-tool via nix run)
  • AudioQuellen in unterstützten Formaten: mp3, m4a, m4b, aac, flac, wav, ogg
  • Bash (unter macOS/Linux vorhanden)

Quickstart

  1. Quellen in die passende Ordnerstruktur unter src/ legen (siehe Beispiele unten).
  2. Script ausführbar machen: chmod +x to-m4b.sh
  3. Konvertierung starten: ./to-m4b.sh
  4. Ergebnis unter out/ prüfen.

Verzeichnisstruktur

Das Skript erwartet unter src/ je Hörbuch einen Ordner in einer der beiden Formen:

  1. Serie (mit Folgennummer)
src/<Autor>/<Serie>/Book <Folge> - <YYYY> - <Titel> {<Sprecher>}/

Beispiel:

src/WinterZeit Verlag/Das Schwarze Auge/Book 15 - 2022 - Auf Schusters Rappen/
  249_Das schwarze Auge_Teil 1 - Folge 15_ Auf Schusters Rappen.ogg
  ...
  1. Einzelband (ohne Serie)
src/<Autor>/<YYYY> - <Titel> {<Sprecher>}/

Die Angabe {<Sprecher>} ist optional; Leerzeichen dürfen enthalten sein.

Ausgabepfade

Für jede erkannte Quelle wird genau eine .m4b erzeugt und unter out/ abgelegt.

  • Serie:
    • Ordner: out/<Autor>/<Serie>/Book <NN> - <YYYY> - <Titel>/
    • Datei: <YYYY> - <Titel> {<Sprecher>}.m4b
  • Einzelband:
    • Ordner: out/<Autor>/<YYYY> - <Titel> {<Sprecher>}/
    • Datei: <YYYY> - <Titel> {<Sprecher>}.m4b

Hinweis: <NN> ist die nullaufgefüllte Folgennummer (Standard: 2 Stellen, z.B. 01).

Verwendete Tags

  • Autor → writer
  • Sprecher:in → artist
  • Titel → album
  • Jahr → year
  • Serie → series, Folgennummer → series-part

Nutzung

  1. Quellen in die passende Ordnerstruktur unter src/ legen (siehe oben).
  2. Skript ausführbar machen (einmalig):
chmod +x to-m4b.sh
  1. Konvertierung starten:
./to-m4b.sh

Das Skript durchsucht src/ rekursiv auf den erwarteten Ebenen, erzeugt pro gefundenem Hörbuch eine .m4b und schreibt Ausgaben nach out/.

Konfiguration

Die wichtigsten Einstellungen stehen am Anfang von to-m4b.sh und können bei Bedarf angepasst werden:

# to-m4b.sh (Auszug)
LEADING_ZEROES=2   # Stellen für Serienfolgen (z. B. 01, 02, ...)
SRC="${script_dir}/src"  # Quellverzeichnis
OUT="${script_dir}/out"  # Zielverzeichnis

Weitere relevante m4b-toolParameter (im Skript m4b-merge()):

  • --jobs=6 (Parallelität)
  • --audio-samplerate=44100
  • --audio-quality=100
  • Ausführung über m4b-tool-libfdk (AACEncoder libfdk_aac)

Wenn du m4b-tool lokal ohne Nix verwenden willst, kannst du den Aufruf in m4b-merge() entsprechend auf ein lokales m4b-tool ändern.

Beispiele

Quelle (src):

󰣞 src/                                                                                (Source Directory, für Hör-bücher/-spiele)
├──  'Corvus Corax'/                                                                 (Author)
│   └──  '2017 - Der Fluch des Drachen'/                                             (Jahr - Titel)
│       ├──  '101 - Einführung.flac'                                                 (Audiodateien)
│       ├──  '102 - Nimmer mehr (Die Ballade von Adamas) (Hörbuch Edit).flac'
│       ├──  '...'
│       ├──  '...'
│       ├──  '224 - Wer hat euch vom Schmied erzählt.flac'
│       └──  cover.jpg                                                               (Cover-Bild für das m4b Hörbuch)
└──  'WinterZeit Verlag'/                                                            (Author)
    └──  'Das Schwarze Auge'/                                                        (Serien Titel)
        ├──  'Book 1 - 2017 - Im Kerker von Gareth'/                                 (Book <Serien index> - Jahr - Title)
        │   ├──  '001_Das schwarze Auge_Teil 1 - Folge 1_ Im Kerker von Gareth.ogg'  (Audiodateien)
        │   ├──  '002_Das schwarze Auge_Teil 2 - Folge 1_ Im Kerker von Gareth.ogg'
        │   ├──  '...'
        │   ├──  '...'
        │   ├──  '017_Das schwarze Auge_Teil 17 - Folge 1_ Im Kerker von Gareth.ogg'
        │   ├──  cover.jpg                                                           (Cover-Bild für das m4b Hörbuch)
        │   └──  description.txt                                                     (Beschreibung für das m4b Hörbuch)
        └──  'Book 2 - 2017 - Freund oder Feind'/
            ├──  '018_Das schwarze Auge_Teil 1 - Folge 2_ Freund oder Feind.ogg'
            ├──  '019_Das schwarze Auge_Teil 2 - Folge 2_ Freund oder Feind.ogg'
            ├──  '...'
            ├──  '...'
            ├──  '035_Das schwarze Auge_Teil 18 - Folge 2_ Freund oder Feind.ogg'
            ├──  cover.jpg
            └──  description.txt

Ergebnis (out):

 out/                                                                                (Output Directory, für die m4b Hör-bücher/-spiele)
├──  'Corvus Corax'/                                                                 (Author)
│   └──  '2017 - Der Fluch des Drachen'/                                             (Jahr - Titel)
│       └──  '2017 - Der Fluch des Drachen.m4b'                                      (Fertiges m4b Hörbuch)
└──  'WinterZeit Verlag'/                                                            (Author)
    └──  'Das Schwarze Auge'/                                                        (Serien Titel)
        ├──  'Book 01 - 2017 - Im Kerker von Gareth'/                                (Book <Serien index> - Jahr - Title)
        │   └──  '2017 - Im Kerker von Gareth.m4b'                                   (Fertiges m4b Hörbuch -- Jahr - Titel.m4b)
        └──  'Book 02 - 2017 - Freund oder Feind'/                                   (Book <Serien index> - Jahr - Title)
            └──  '2017 - Freund oder Feind.m4b'                                      (Fertiges m4b Hörbuch -- Jahr - Titel.m4b)

Fehlersuche

  • „No book directories found …“: Struktur unter src/ prüfen; siehe Abschnitt „Verzeichnisstruktur“.
  • „Skipping '…': could not parse …“: Ordnername an die erwartten Muster anpassen.
  • „nix: command not found“: Nix installieren oder den m4b-toolAufruf auf ein lokales Binary umstellen.
  • „permission denied“ beim Start: chmod +x to-m4b.sh ausführen.

Hinweise

  • Cover/weitere Dateien im Quellordner werden nicht explizit an m4b-tool übergeben; das Tagging beruht vollständig auf der Ordnerbenennung.
  • Unterstützte Audioformate werden automatisch erkannt; die Reihenfolge bestimmt m4b-tool anhand von TrackInfos/Dateinamen.