根据 ID3 自动补充专辑封面和歌词

最近在搞 C# ,起因是我喜欢的播放器 aiplay ,这个东西的作者不维护了,也不是,是做了第三版,但是却比现在烂很多,于是我一直在用第二版的,但是歌词服务器,专辑封面服务器都关了,于是用着就略不爽,想着怎么补全这两个东西。

顺便附上我喜欢的 airplay AIRPLAY

首先是专辑封面,这个百度了一下,目前好像还没有这样的软件,于是自己研究,看了豆瓣的 API,看到这两个,一个是搜索书籍、电影、音乐,http://developers.douban.com/w…,一个是获取音乐信息,http://developers.douban.com/w…,大概研究了一番,觉得这两个可以搞,于是开搞,后来发现,其实只需要一个搜索的就够了,在搜索的结果中,他会给出专辑封面的 url,例如这个,http://api.douban.com/music/su…,返回的结果中直接可以解析得到封面,但是有一个小问题,他给的封面都是很小的尺寸的,http://img1.douban.com/spic/s6…,例如这个,才 80*80 的像素,这个肯定是不够用的,想起来豆瓣 FM 的封面好像比这个清晰很多啊,于是看了一下电台那边的网络交互,发现其实很简单,只要把 url 中的 spic 换成 lpic 就行了,。。这个。。略坑爹啊。。(不过后来在实现的过程中发现豆瓣的图片服务器还是不稳定的,经常出现 504 的情况,不管大图小图都会出),有了思路就好办了,于是用 C# 现学现用,写了一个根据 ID3 补全专辑封面的小工具,呵呵,第一次写桌面客户端,很多东西就将就的,不过磕磕碰碰总算写出了个大概了,附上半成品,(半成品的意思就是说使用有风险,可能毁文件或者乱崩溃,请谨慎,多备份源文件)

点此下载

另外附上源码,写的很丑,将就用吧(环境是 vs2008)

MP3ID3源代码

解压缩开来的到一个 exe,运行就是了,(需要 .net framework 3.5 环境,这个 win7 自带,xp 自带的好像是 2.0,所以 xp 的话需要自己先装一个 3.5),界面如下图

往列表中拖入 MP3 文件,(只能拖 MP3 文件,不能拖其他,也不能拖文件夹,这个还没做,将就吧),然后双击某一个文件可以看到他里面已经内嵌的歌词和封面,点击 start 就可以开始自动对所有列表中的文件去拉取封面了,(这里需要说明的是,豆瓣比较恶心,API 每分钟只能请求 10 次,于是我只能让每个文件请求后都休眠 6 秒钟了,所以这个东西最好放到睡觉前跑,一觉起来就跑得差不多了,如果有申请豆瓣的 API key 的话,可以修改源代码,去掉这个限制),拉取回来自动嵌入封面就算完了,然后就下一首。在这个过程中会在 exe 的所在文件夹下生成一个 log 的日志,还算比较详尽,一般出错的原因都可以从这个得到

另外那个 force over write 的选项的意思是,是否要强制覆盖写入,默认情况下,如果一首歌曲里面有内嵌图片的话,那么就会跳过,勾选这个可以无视已有的图片,强制覆盖写入。

一个已知的问题是,读取中文的标签信息时候会乱码,这个暂时没有很好的解法,应付的解法可以看这里,Taglib 读取中文 ID3 标签时乱码,http://zrj.me/archives/389,可以暂解燃眉之急。

这个搞完就剩下歌词了,歌词就容易了,我想起来以前用千千静听的时候,他是可以自动下载歌词的,但是没有开放接口,哈哈,笨人自然有笨办法,搞一个按键精灵嘛,每两秒钟自动触发一次 ctrl alt → 三个组合键的全局热键,让他去播放下一首的时候自动下载不就行了,音量调成静音,很快就好了

至此这个小项目应该就算结束了,不过这次的过程中 C# 和 .NET 给我留下了良好的印象(承认自己喜欢 C# .NET 是需要勇气的啊,要知道鄙视 C# .NET 是高手必备的素质之一啊,哈哈),这次时间紧,还有其他东西要赶,将来还会继续学的,主要还是通过这个学点多线程,学点系统本身的环境调用等等,这个领域还是很大的,作为新手用这种高层语言自然最适合不过了,类似数组越界异常处理这些东西,都有虚拟机帮忙把关,其实是降低了学习曲线,不然一上来就用 windows api 去写一个类似我这样的应用程序,新手不被各种小细节烦的崩溃才怪,现在沙盒里面练练手,熟悉之后再踏上征途嘛。不管怎么说,作为一个刚学 C# 三四天,第一个练习的项目做成这样的情况来说,我还是能及格的。

One thought on “根据 ID3 自动补充专辑封面和歌词

  1. Pingback: 再次折腾专辑封面 | ZRJ

Leave a Reply

Your email address will not be published. Required fields are marked *