Skip to content

Instantly share code, notes, and snippets.

@glowinthedark
Created January 28, 2023 14:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save glowinthedark/9b11e88ba5da31020039abc08a92cfa6 to your computer and use it in GitHub Desktop.
Save glowinthedark/9b11e88ba5da31020039abc08a92cfa6 to your computer and use it in GitHub Desktop.
Embed lyrics into MP3 files using mutagen (USLT tag), optionally set other ID3 tags
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# mirorred from https://code.activestate.com/recipes/577138-embed-lyrics-into-mp3-files-using-mutagen-uslt-tag/
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'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment