2026-07-16 10:46:50 +02:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
2026-08-19 11:23:02 +02:00
|
|
|
root="${1:-.}"
|
|
|
|
|
find "$root" \( -iname '*.mp3' -o -iname '*.m4a' -o -iname '*.m4b' \) -print0 |
|
2026-07-16 10:46:50 +02:00
|
|
|
while IFS= read -r -d '' f; do
|
|
|
|
|
|
|
|
|
|
comment=$(ffprobe -v error \
|
|
|
|
|
-show_entries format_tags=comment \
|
|
|
|
|
-of default=nw=1:nk=1 \
|
|
|
|
|
-- "$f")
|
|
|
|
|
|
|
|
|
|
[[ $comment =~ ^[Rr]ead[[:space:]]+[Bb]y[[:space:]]+(.+) ]] || continue
|
|
|
|
|
|
|
|
|
|
composer="${BASH_REMATCH[1]}"
|
|
|
|
|
echo "Updating: $f"
|
|
|
|
|
echo " Composer: $composer"
|
|
|
|
|
|
|
|
|
|
dir=$(dirname -- "$f")
|
|
|
|
|
base=$(basename -- "$f")
|
|
|
|
|
ext="${base##*.}"
|
|
|
|
|
|
|
|
|
|
case "${ext,,}" in
|
|
|
|
|
mp3) format=mp3 ;;
|
|
|
|
|
m4a|m4b) format=ipod ;;
|
|
|
|
|
*) continue ;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
tmp=$(mktemp -p "$dir" ".${base}.XXXXXX") || {
|
|
|
|
|
echo "Couldn't create temporary file in $dir" >&2
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ffmpeg -nostdin -v error -y \
|
|
|
|
|
-i "$f" \
|
|
|
|
|
-map 0 \
|
|
|
|
|
-map_metadata 0 \
|
|
|
|
|
-c copy \
|
|
|
|
|
-metadata composer="$composer" \
|
|
|
|
|
-metadata comment= \
|
|
|
|
|
-f "$format" \
|
|
|
|
|
"$tmp"
|
|
|
|
|
then
|
|
|
|
|
mv -f -- "$tmp" "$f"
|
|
|
|
|
else
|
|
|
|
|
echo "FAILED: $f" >&2
|
|
|
|
|
rm -f -- "$tmp"
|
|
|
|
|
fi
|
|
|
|
|
done
|