mp3fixer
An embarrassing script that works pretty well for making mp3 filename and id3v1/v2 info all consistent.
Requires the id3v2 command line tool.
#!/bin/bash TEMPFILE=/tmp/mp3fixer.out.$$ EditTags() { read -e -p "Please enter artist ($1): " artist [ x"$artist" = x ] && artist=$1 id3v2 -a "$artist" "$file" read -e -p "Please enter title ($2): " title [ x"$title" = x ] && title=$2 id3v2 -t "$title" "$file" v1title=$title v2title=$title v1artist=$artist v2artist=$artist } CheckFileName() { OldFileName="" NewFileName="$artist - $title.mp3" if [ x"$file" != x"$NewFileName" ] then echo " I think the filename should be changed (x to skip, i to edit tags)" read -e -p " Please enter new filename ($NewFileName): " OldFileName if [ x"$OldFileName" = xi ] then EditTags "$artist" "$title" return 1 fi if [ x"$OldFileName" = x ] then OldFileName="$NewFileName" fi if [ x"$OldFileName" != xx ] then mv "$file" "$OldFileName" fi fi return 0 } for file in *.mp3 do echo "examining $file" id3v2 -l "$file" >$TEMPFILE artist="" title="" # Come up with possible artist/songname, based on filename. fNameArtist=`echo "$file" | awk -F" -" '{ print $1 }'` fNameTitle=`echo "$file" | awk -F"- " '{ print $NF }' | \ awk -F".mp3" '{ print $1 }'` # Collect the v1 artist and songname v1artist=`grep "Artist: " $TEMPFILE | awk -F"Artist: " '{ print $NF }' | sed 's/^[ \t]*//;s/[ \t]*$//'` v1title=`grep "Title *:.*" $TEMPFILE | sed 's/ *Artist.*//' | awk -F": " '{ print $NF }' | sed 's/^[ \t]*//;s/[ \t]*$//'` # Now collect the v2 artist and songname. Check for some # alternate v2.2 tags too. v2artist=`grep TPE1 $TEMPFILE | awk -F": " '{print $NF }'` [ x"$v2artist" == x ] && \ v2artist=`grep TP1 $TEMPFILE | awk -F": " '{print $NF }'` v2title=`grep TIT2 $TEMPFILE | awk -F": " '{print $NF }'` [ x"$v2title" == x ] && \ v2title=`grep TT2 $TEMPFILE | awk -F": " '{print $NF }'` #echo "fNameArtist: $fNameArtist xxx" #echo "fNameTitle: $fNameTitle xxx" #echo "v1artist: $v1artist xxx" #echo "v2artist: $v2artist xxx" #echo "v1title: $v1title xxx" #echo "v2title: $v2title xxx" # If file has no tags, create them based on filename if grep -q "No ID3 tag" $TEMPFILE then echo "no tags on file, creating v1 and v2 tags" EditTags "$fNameArtist" "$fNameTitle" fi # If file has bogus v1 artist tag, get rid of it. if echo $v1artist | grep -q "^artist" then echo "bogus v1 artist $v1artist, removing" id3v2 -1 -a"" "$file" v1artist="" fi # If file has bogus v1 title, get rid of it. if echo $v1title | grep -q "^title" then echo "bogus v1 title $v1title, removing" id3v2 -1 -t"" "$file" v1title="" fi # If file has bogus v2 artist tag, get rid of it. if echo $v2artist | grep -q "^artist" then echo "bogus v2 artist $v2artist, removing" id3v2 -2 -a\"\" "$file" v2artist="" fi # If file has bogus v2 title, get rid of it. if echo $v2title | grep -q "^title" then echo "bogus v2 title $v2title, removing" id3v2 -2 -t"" "$file" v2title="" fi # If file has v1 artist and title but no v2 artist or title, # convert the v1 tags to v2 tags. if [ -n "$v1artist" -a -n "$v1title" -a -z "$v2artist" -a -z "$v2title" ] then echo "converting v1 tags to v2" id3v2 -C "$file" artist=$v1artist title=$v1title v2title=$title v2artist=$artist fi if [ -n "$v2artist" -a -z "$v1artist" ] then # If file has v2 artist name, use it for v1 artist name as well. echo "copying v2 artist to v1 artist" id3v2 -a "$v2artist" "$file" artist=$v2artist v1artist=$v2artist elif [ -n "$v1artist" -a -z "$v2artist" ] then # Copy v1 artist to v2 echo "copying v1 artist to v2 artist" id3v2 -a "$v1artist" "$file" artist=$v1artist v2artist=$artist else artist=$v2artist fi if [ -n "$v2title" -a -z "$v1title" ] then # If file has v2 song title, use it for v1 song title too. echo "copying v2 title to v1 title" id3v2 -t "$v2title" "$file" title=$v2title v1title=$title elif [ -n "$v1title" -a -z "$v2title" ] then # Copy v1 title to v2. echo "copying v1 title to v2 title" id3v2 -t "$v1title" "$file" title=$v1title v2title=$title else title=$v2title fi # If v2title is a subset of the title we parsed from the filename, substitute # the filename title for the v2title (because v2title probably got truncated) # also skip this if v2title is just empty, otherwise the grep always matches. if [ "$fNameTitle" != "$v2title" ] && \ [ x"$v2title" != x"" ] && \ echo "$fNameTitle" | grep -q "^$v2title" then echo "v2title is subset of filename title. Restoring v2title" id3v2 -t "$fNameTitle" "$file" v2title=$fNameTitle title=$v2title fi # Make sure the filename is sensible ReCheck=yes until [ x"$ReCheck" = xno ] do CheckFileName && ReCheck=no done rm -f $TEMPFILE done