Blob Blame History Raw
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
# needs mutagen
# grabbed from: http://code.activestate.com/recipes/577138-embed-lyrics-into-mp3-files-using-mutagen-uslt-tag/
# simplified to only work on one file and get lyrics from stdin
# I suspect this is public domain code. Just a usage example of the mutagen lib.

import os
import sys
import codecs
from mutagen.mp3 import MP3
from mutagen.id3 import ID3NoHeaderError
from mutagen.id3 import ID3, USLT

TEXT_ENCODING = 'utf8'
TEXT_LANG = 'XXX'
TEXT_DESC = ''

# get workdir from first arg or use current dir 
if (len(sys.argv) > 1):
	fname = sys.argv[1]
	print "fname=" + fname
else:
	print 'Give me at least a file name to work on, plus the lyrics from stdin'
	print 'Optionally, you can provide the language (3 lowercase letters) of the lyrics and a description'
	sys.exit()

if (len(sys.argv) > 2):
	TEXT_LANG = sys.argv[2]

if (len(sys.argv) > 3):
	TEXT_DESC = sys.argv[3]

print "reading lyrics from standard input ..."

lyrics = sys.stdin.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)
		TEXT_DESC = TEXT_DESC.decode(enc)
		print enc,
		break
	except:
		pass

print "Adding lyrics to " + fname
print "Language: " + TEXT_LANG
print "Description: " + TEXT_DESC

# 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::'"+TEXT_LANG+"'")) != 0:
	print "Removing Lyrics."
	tags.delall(u"USLT::'"+TEXT_LANG+"'")
	#tags.save(fname) # hm, why?

#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))
tags[u"USLT::'"+TEXT_LANG+"'"] = (USLT(encoding=3, lang=TEXT_LANG, desc=TEXT_DESC, text=lyrics))
print 'Added USLT frame to', fname

tags.save(fname)

print 'Done'