鉴于本人素ID3 tag严重洁癖者,之前有用easytag手动给几千个mp3改过tag= = easytag的界面不错,就是不能批量修改,导致那两天改的我手都酸的不行了….入了n1以后有一点不爽的就是不管啥音乐软件,听歌的时候就是抓不到一张封面,那个默认的灰色封面实在让我火大,就用python写了个从豆瓣抓封面图片直接嵌入ID3 tag的程序,一劳永逸了~~
读写ID3 tag信息
对ID3信息的读取和修改依赖了mutagen库,当然用之前还是要对ID3标准有一个基本的了解。
from mutagen.mp3 import MP3
from mutagen.id3 import ID3, APIC, error
audio = MP3(self.filename, ID3=ID3)
try:
audio.add_tags()
except error:
pass
有可能音乐文件一开始并没有tag(虽然机率比较小),所以调用add_tags()方法初始化一下,一般情况下都会抛出个error,提示已经有tag了。
album = self.audio['TALB'][0]
frames = self.audio.tags.getall("APIC")
for frame in frames:
ext = ".img"
if frame.mime == "image/jpeg" or frame.mime == "image/jpg":
ext = ".jpg"
elif frame.mime == "image/png":
ext = ".png"
elif frame.mime == "image/gif":
ext = ".gif"
如果tag中已经包含唱片标题信息,那么audio.keys()的返回结果中就会包含”TALB”这一项,其他还有比如”TLE1″(表演者),“TCON”(流派)等等。ID3标准中规定代表唱片封面信息的帧结构如下:
audio.tags.add(APIC(encoding = 3,mime = "image/jpeg",type = 3,
desc = u'Cover',data=imagedata))
audio.save()
encoding = 3表示utf8编码,mime可以为”image/jpeg”(“image/jpg”)或者”image/png”格式,type=3表示写入的是front cover,desc是描述信息,data是图片的二进制数据,可以从某个uri读取,也可以从本地读取。
从豆瓣抓取封面图片
豆瓣很早就开始提供各种API了,抓取过程很简单,默认是atom,把得到的xml用minidom库解析一下就可以得到封面图片的url了,这个不多说了。
req = urllib2.Request(self.site_url+"?"+url_data)
response = urllib2.urlopen(req)
result_xml = response.read()
elements = minidom.parseString(result)
albums = []
for entry in elements.getElementsByTagName("entry"):
album = {}
try:
album["id"] = self.getText(entry.getElementsByTagName("id")[0].childNodes)
album["title"] = self.getText(entry.getElementsByTagName("title")[0].childNodes)
album["author"] = self.get_authors(entry.getElementsByTagName("author") [0].getElementsByTagName("name"))
album["image"] = self.get_image(entry.getElementsByTagName("link"))
albums.append(album)
except IndexError:
pass
这个时候得到的图片的url一般是”http://t.douban.com/spic/s*.jpg”的格式,这些图片都比较小分辨率比较低,一般一张2,3k左右。我需要清晰一些,大一些的图片,所以把url中spic换成了lpic,这时得到的图片在20k左右。
image_url.replace("spic","lpic",1)
代码
源码见这里。
必需的命令行参数为-d,后接要处理的目录路径。-r表示递归处理该目录下所有子目录下的所有mp3文件,否则默认只处理指定目录下的文件。
成果
我的音乐目录是~/Music,执行python cmd.py -r -d ~/Music递归为该目录下所有mp3文件自动嵌入封面,由于mp3 tag有的有残缺,成功率大约在90%以上。
Amarok播放效果图:

Android Music播放效果图:

number of view: 705