#!/usr/bin/env bash root="${1:-.}" find "$root" \( -iname '*.mp3' -o -iname '*.m4a' -o -iname '*.m4b' \) -print0 | 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