鉴于本人素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播放效果图:



你终于下手改主题啦…,等我空下来也换个…
[Reply]
pipitu Reply:
May 15th, 2010 at 07:24
嗯,实在受不了原来那个的普遍程度了….
[Reply]
有点看不懂的说。。。
[Reply]
pipitu Reply:
May 15th, 2010 at 07:30
….额,哪里不懂?
[Reply]
那一开始从哪里获取正确的tag信息呢
[Reply]
pipitu Reply:
May 15th, 2010 at 10:00
从文件初始化MP3类的时候会载入tag信息到对象中,我这里读的是ID3v2版本的tag。你可以看一下源码里面的tag_handler.py。
[Reply]
missdeer Reply:
May 15th, 2010 at 10:06
呃,我不是这个意思。
我是问,你得到一个mp3后,怎么知道它的演唱者是谁,专辑是哪张,歌曲名是什么……等等这些信息
[Reply]
pipitu Reply:
May 15th, 2010 at 10:11
文章里面有写的阿
album = self.audio['TALB'][0]
这个获取的是ID3v2版本tag的专辑标题
其他的信息你可以参照这里:http://code.google.com/p/quodlibet/wiki/Mutagen,有很多如何mutagen库的example
[Reply]
missdeer Reply:
May 15th, 2010 at 12:27
抓狂,我的表达真有问题。
我不是问怎么从MP3里读取tag。我是问那些歌曲相关的原始信息从哪儿收集来的,就像你说可以从douban找到封面那样……
[Reply]
pipitu Reply:
May 15th, 2010 at 12:39
原始信息阿,我囧,那是手动添加的阿,寒假闲着的时候拿easytag一个一个写得。那些mp3的tag要么是残缺,要么是乱码,把它补全修正成utf8神马的花了我两三天…..
你可以尝试根据mp3的文件名直接从豆瓣音乐抓信息,不过实验表明如果不根据专辑名称抓一般是抓不准的….
wubuntust Reply:
May 15th, 2010 at 18:12
这就是从电驴和谷歌下载音乐的好处,信息都是好的,你要是有20G+的mp3或acc,不编死你才怪
missdeer Reply:
May 16th, 2010 at 09:49
原来如此,我在kugoo上下的mp3,常常信息不全
pipitu Reply:
May 16th, 2010 at 12:57
我现在都整张专辑的拖了,直接下mp3,tag多半残缺或者乱码….
可是这个主题太丑了.嗯,记得我以前装smoki时,默认的音乐播放器会把你放在文件夹里的封面给加进去,但现在这个uhero不行
[Reply]
pipitu Reply:
May 15th, 2010 at 13:03
居然说我主题丑!!!
[Reply]
pipitu Reply:
May 15th, 2010 at 13:07
封面直接嵌入就省的烦了…
[Reply]
换说,现在封面图片是不是可以写入mp3文件本身了
我经常发现一些神奇的现象
[Reply]
pipitu Reply:
May 17th, 2010 at 00:34
就可以的= =我在这里就这么干的,省的拖着个图片文件走。去看了ID3v2的标准,里面包含的frame种类如果有apic就是有内嵌封面图片的。
神奇的现象不会是你下了一首歌然后播放器直接显示出它的封面了吧= =
[Reply]
Sunng Reply:
May 17th, 2010 at 00:55
你说对了,下了个歌一播封面就出来了,虽说有id标签,但是国外的播放器默认的搜索不会搜到中文歌的封面,所以我怀疑可以直接写进去
[Reply]
这主题真漂亮
[Reply]
pipitu Reply:
May 19th, 2010 at 07:43
之前有人批评我主题丑…
看到白光弟弟你这句话,我内牛满面T^T
[Reply]
批量编辑tag我用mp3tag…
[Reply]
哈哈,这件事我之前也做过:http://ollir.com/show-me-the-cover
[Reply]
我还做过一件事,写程序把douban电台中的红心音乐从google music上抓下来。
[Reply]