81 lines
2.6 KiB
Bash
81 lines
2.6 KiB
Bash
#!/bin/bash
|
|
# Dieses Script für den Fall, dass die m4b-Dateien bereits nach Kapiteln in einzelnen
|
|
# Dateien gesplittet vorliegen.
|
|
#
|
|
# Abhängigkeiten: sudo apt-get install ffmpeg id3v2
|
|
#
|
|
# USAGE:
|
|
# cd /pfad/zum/hörbuch/
|
|
# bash ~/convert_m4b.sh
|
|
#
|
|
# Funktioniert mit:
|
|
# - Monolithischen m4b-Dateien mit internen Kapiteln → werden aufgesplittet
|
|
# - Bereits aufgeteilten m4b-Dateien (eine Datei pro Kapitel) → werden direkt konvertiert
|
|
|
|
track=1
|
|
|
|
for i in *.m4b; do
|
|
name="${i%.m4b}"
|
|
echo "==> Verarbeite: $i"
|
|
|
|
# Kapitelinfo aus der m4b auslesen (nicht aus der konvertierten mp3)
|
|
ffmpeg -i "$i" 2> tmp.txt
|
|
chapter_count=$(grep -c "Chapter #" tmp.txt || true)
|
|
|
|
if [[ "$chapter_count" -gt 0 ]]; then
|
|
# Monolithische Datei: erst zu mp3 konvertieren, dann nach Kapiteln splitten
|
|
title=$(basename "$(pwd)")
|
|
full_file_path="${name}.mp3"
|
|
|
|
echo " Konvertiere zu mp3..."
|
|
ffmpeg -i "$i" \
|
|
-acodec libmp3lame \
|
|
-b:a 128k \
|
|
-map_metadata 0 \
|
|
-id3v2_version 3 \
|
|
"$full_file_path"
|
|
|
|
echo " Splitte nach Kapiteln..."
|
|
while read -r first _ _ start _ end; do
|
|
if [[ "${first}" = "Chapter" ]]; then
|
|
read # Metadata:-Zeile überspringen
|
|
read _ _ chapter
|
|
track_padded=$(printf "%02d" "$track")
|
|
base_name="${title} - ${track_padded} - ${chapter}"
|
|
chapter_file="${base_name}.mp3"
|
|
suffix=1
|
|
while [[ -e "$chapter_file" ]]; do
|
|
chapter_file="${base_name}_(${suffix}).mp3"
|
|
suffix=$((suffix + 1))
|
|
done
|
|
echo " -> $chapter_file"
|
|
</dev/null ffmpeg -loglevel error -stats \
|
|
-i "$full_file_path" \
|
|
-ss "${start%?}" \
|
|
-to "$end" \
|
|
-codec:a copy \
|
|
-metadata title="$chapter" \
|
|
-metadata album="$title" \
|
|
-metadata track="$track" \
|
|
"$chapter_file"
|
|
track=$((track + 1))
|
|
fi
|
|
done < tmp.txt
|
|
|
|
rm "$full_file_path"
|
|
else
|
|
# Bereits aufgeteilte Datei: direkt konvertieren, Metadaten aus m4b übernehmen
|
|
ffmpeg -i "$i" \
|
|
-acodec libmp3lame \
|
|
-b:a 128k \
|
|
-map_metadata 0 \
|
|
-id3v2_version 3 \
|
|
"${name}.mp3"
|
|
echo " -> ${name}.mp3"
|
|
track=$((track + 1))
|
|
fi
|
|
|
|
rm -f tmp.txt
|
|
done
|
|
|
|
echo "==> Fertig." |