Welcome, guest | Sign In | My Account | Store | Cart
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import codecs
from mutagen.mp3 import MP3
from mutagen.id3 import ID3NoHeaderError
from mutagen.id3 import ID3, TIT2, TALB, TPE1, TPE2, COMM, USLT, TCOM, TCON, TDRC

TEXT_ENCODING = 'utf8'
SET_OTHER_ID3_TAGS = False

# get workdir from first arg or use current dir 
if (len(sys.argv) > 1):
    fpath = sys.argv[1]
else:
    fpath = os.path.abspath(os.path.dirname(sys.argv[0]))

for fn in os.listdir(fpath):

    fname = os.path.join(fpath, fn)
    if fname.lower().endswith('.mp3'):
        
        lyrics = None
        
        lyrfname = fname[:-3] + 'txt'

        if not os.path.exists(lyrfname):
            print '\tERROR: No lyrics file found:', lyrfname, '...skipping'
            continue
        else:
            lyrics = open(lyrfname).read().strip()

        # try to find the right encoding
        for enc in ('utf8','iso-8859-1','iso-8859-15','cp1252','cp1251','latin1'):
            try:
                lyrics = lyrics.decode(enc)
                print enc,
                break
            except:
                pass
        
        # create ID3 tag if not exists
        try: 
            tags = ID3(fname)
        except ID3NoHeaderError:
            print "Adding ID3 header;",
            tags = ID3()

        # remove old unsychronized lyrics
        if len(tags.getall(u"USLT::'en'")) != 0:
            print "Removing Lyrics."
            tags.delall(u"USLT::'en'")
            tags.save(fname)
            
        #tags.add(USLT(encoding=3, lang=u'eng', desc=u'desc', text=lyrics))
        # apparently the description is important when more than one 
        # USLT frames are present
        tags[u"USLT::'eng'"] = (USLT(encoding=3, lang=u'eng', desc=u'desc', text=lyrics))
        print 'Added USLT frame to', fn
        
        # set title from filename; adjust to your needs
        if SET_OTHER_ID3_TAGS:
            title = unicode(os.path.splitext ( os.path.split(fn)[-1])[0])
            print title, 
            print fname
            # title
            tags["TIT2"] = TIT2(encoding=3, text= title)
            tags["TALB"] = TALB(encoding=3, text= u'mutagen Album Name')
            tags["TPE2"] = TPE2(encoding=3, text= u'mutagen Band')
            tags["COMM"] = COMM(encoding=3, lang=u'eng', desc='desc', text=u'mutagen comment')
            # artist
            tags["TPE1"] = TPE1(encoding=3, text= u'mutagen Artist')
            # composer 
            tags["TCOM"] = TCOM(encoding=3, text= u'mutagen Composer')
            # genre
            tags["TCON"] = TCON(encoding=3, text= u'mutagen Genre')
            tags["TDRC"] = TDRC(encoding=3, text= u'2010')
            #use to set track number
            #tags["TRCK"] = COMM(encoding=3, text=track_number)
        tags.save(fname)

print 'Done'

Diff to Previous Revision

--- revision 4 2010-11-25 15:37:42
+++ revision 5 2011-05-17 15:56:56
@@ -32,7 +32,7 @@
             lyrics = open(lyrfname).read().strip()
 
         # try to find the right encoding
-        for enc in ('utf8','latin1','iso-8859-1','iso-8859-15','cp1252','cp1251'):
+        for enc in ('utf8','iso-8859-1','iso-8859-15','cp1252','cp1251','latin1'):
             try:
                 lyrics = lyrics.decode(enc)
                 print enc,

History