sinewalker
4/26/2017 - 9:14 AM

use eyed3 to set ID3 tags on MP3 files

use eyed3 to set ID3 tags on MP3 files

# I used this code within an IPython session to clean up all the missing ID3 tags from my MP3 collection.
# They had gone missing years ago when I down-sampled them to fit on an old phone, and then lost the originals.
# Fortunately I named the files themselves with the basic details (artist, date, title and so on) so it was possible to
# recover the tags... It sat on my to-do list for *years* but now I finally did it.

# I used the Python library "EyeD3" (get it?): https://pypi.python.org/pypi/eyeD3
# This requires Python 2.7, which has some interesting quirks for Unicode, a bit of a pain since I had named my MP3s
# with utf8 characters. What I've come up with *mostly* works.  When it doesn't I had to resort to manually editing (using 
# Clementine).


import eyed3
import os
import os.path
import glob

#In ipython:  cd ~/Music/some_artist
artist=u'Some Artist'

#note the glob to select folders for tagging MP3s
# This expects music tracks to be stored within album folders, and to be named like this:
#
#  Artist/YYYY - Album Name/nn - Song Title.mp3
#
# It will pick out the relevant parts of these names for use in the ID3 tags.
for folder in glob.glob("*"):
     (year,album)=unicode(os.path.split(os.path.abspath(folder))[-1],"utf8").split(" - ")
     print year, album
     year=eyed3.core.Date(int(year))
     for file in glob.glob(os.path.join(folder,"*.mp3")):
        (track_num,title)=unicode(os.path.splitext(os.path.basename(file))[0],"utf8").split(" - ")
        song=eyed3.load(file).tag
        song.track_num=int(track_num)
        song.title=title
        song.album=album
        song.artist=artist
        song.recording_date=year
        song.save()

# Sometimes my MP3s had no tags set *at all*.  There's probably a way to initialise tags with eyed3, but I found that
# the easiest was to load an album with Clementine and set a tag for all the files -- e.g. the Artist tag.  After that
# then the above code works.

# In some rare cases I had to do an album at a time:

#cd ~/Music/Funky_artist/1974 - Some Album That breaks above code
artist=u'Funky Artist'
year=eyed3.core.Date(1974)
album=u'Some Album That breaks above code'

for file in glob.glob("*.mp3"):
     song=eyed3.load(file).tag
     (track_num,title)=unicode(os.path.splitext(file)[0],"utf8").split(" - ")
     song.track_num=int(track_num)
     song.title=title
     song.album=album
     song.artist=artist
     song.recording_date=year
     song.save()
      
 # And that takes care of my missing ID3 tags.