Blame scripts/tag_lyrics.py

Packit c32a2d
#!/usr/bin/env python
Packit c32a2d
# -*- coding: utf-8 -*-
Packit c32a2d
 
Packit c32a2d
# needs mutagen
Packit c32a2d
# grabbed from: http://code.activestate.com/recipes/577138-embed-lyrics-into-mp3-files-using-mutagen-uslt-tag/
Packit c32a2d
# simplified to only work on one file and get lyrics from stdin
Packit c32a2d
# I suspect this is public domain code. Just a usage example of the mutagen lib.
Packit c32a2d
Packit c32a2d
import os
Packit c32a2d
import sys
Packit c32a2d
import codecs
Packit c32a2d
from mutagen.mp3 import MP3
Packit c32a2d
from mutagen.id3 import ID3NoHeaderError
Packit c32a2d
from mutagen.id3 import ID3, USLT
Packit c32a2d
Packit c32a2d
TEXT_ENCODING = 'utf8'
Packit c32a2d
TEXT_LANG = 'XXX'
Packit c32a2d
TEXT_DESC = ''
Packit c32a2d
Packit c32a2d
# get workdir from first arg or use current dir 
Packit c32a2d
if (len(sys.argv) > 1):
Packit c32a2d
	fname = sys.argv[1]
Packit c32a2d
	print "fname=" + fname
Packit c32a2d
else:
Packit c32a2d
	print 'Give me at least a file name to work on, plus the lyrics from stdin'
Packit c32a2d
	print 'Optionally, you can provide the language (3 lowercase letters) of the lyrics and a description'
Packit c32a2d
	sys.exit()
Packit c32a2d
Packit c32a2d
if (len(sys.argv) > 2):
Packit c32a2d
	TEXT_LANG = sys.argv[2]
Packit c32a2d
Packit c32a2d
if (len(sys.argv) > 3):
Packit c32a2d
	TEXT_DESC = sys.argv[3]
Packit c32a2d
Packit c32a2d
print "reading lyrics from standard input ..."
Packit c32a2d
Packit c32a2d
lyrics = sys.stdin.read().strip()
Packit c32a2d
Packit c32a2d
# try to find the right encoding
Packit c32a2d
for enc in ('utf8','iso-8859-1','iso-8859-15','cp1252','cp1251','latin1'):
Packit c32a2d
	try:
Packit c32a2d
		lyrics = lyrics.decode(enc)
Packit c32a2d
		TEXT_DESC = TEXT_DESC.decode(enc)
Packit c32a2d
		print enc,
Packit c32a2d
		break
Packit c32a2d
	except:
Packit c32a2d
		pass
Packit c32a2d
Packit c32a2d
print "Adding lyrics to " + fname
Packit c32a2d
print "Language: " + TEXT_LANG
Packit c32a2d
print "Description: " + TEXT_DESC
Packit c32a2d
Packit c32a2d
# create ID3 tag if not exists
Packit c32a2d
try: 
Packit c32a2d
	tags = ID3(fname)
Packit c32a2d
except ID3NoHeaderError:
Packit c32a2d
	print "Adding ID3 header;",
Packit c32a2d
	tags = ID3()
Packit c32a2d
Packit c32a2d
# remove old unsychronized lyrics
Packit c32a2d
if len(tags.getall(u"USLT::'"+TEXT_LANG+"'")) != 0:
Packit c32a2d
	print "Removing Lyrics."
Packit c32a2d
	tags.delall(u"USLT::'"+TEXT_LANG+"'")
Packit c32a2d
	#tags.save(fname) # hm, why?
Packit c32a2d
Packit c32a2d
#tags.add(USLT(encoding=3, lang=u'eng', desc=u'desc', text=lyrics))
Packit c32a2d
# apparently the description is important when more than one 
Packit c32a2d
# USLT frames are present
Packit c32a2d
#tags[u"USLT::'eng'"] = (USLT(encoding=3, lang=u'eng', desc=u'desc', text=lyrics))
Packit c32a2d
tags[u"USLT::'"+TEXT_LANG+"'"] = (USLT(encoding=3, lang=TEXT_LANG, desc=TEXT_DESC, text=lyrics))
Packit c32a2d
print 'Added USLT frame to', fname
Packit c32a2d
Packit c32a2d
tags.save(fname)
Packit c32a2d
Packit c32a2d
print 'Done'
Packit c32a2d