<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Taglib on ZRJ | 学习笔记</title>
        <link>https://blog.zrj.me/tags/taglib/</link>
        <description>Recent content in Taglib on ZRJ | 学习笔记</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-CN</language>
        <lastBuildDate>Thu, 30 Aug 2012 10:17:31 +0800</lastBuildDate><atom:link href="https://blog.zrj.me/tags/taglib/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>根据 ID3 自动补充专辑封面和歌词</title>
        <link>https://blog.zrj.me/posts/2012-08-30-%E6%A0%B9%E6%8D%AE-id3-%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%85%E4%B8%93%E8%BE%91%E5%B0%81%E9%9D%A2%E5%92%8C%E6%AD%8C%E8%AF%8D/</link>
        <pubDate>Thu, 30 Aug 2012 10:17:31 +0800</pubDate>
        
        <guid>https://blog.zrj.me/posts/2012-08-30-%E6%A0%B9%E6%8D%AE-id3-%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%85%E4%B8%93%E8%BE%91%E5%B0%81%E9%9D%A2%E5%92%8C%E6%AD%8C%E8%AF%8D/</guid>
        <description>&lt;p&gt;最近在搞 C# ，起因是我喜欢的播放器 aiplay ，这个东西的作者不维护了，也不是，是做了第三版，但是却比现在烂很多，于是我一直在用第二版的，但是歌词服务器，专辑封面服务器都关了，于是用着就略不爽，想着怎么补全这两个东西。&lt;/p&gt;
&lt;p&gt;顺便附上我喜欢的 airplay &lt;a class=&#34;link&#34; href=&#34;http://zrj.me/wp-content/uploads/2012/08/AIRPLAY.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AIRPLAY&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;首先是专辑封面，这个百度了一下，目前好像还没有这样的软件，于是自己研究，看了豆瓣的 API，看到这两个，一个是搜索书籍、电影、音乐，&lt;a class=&#34;link&#34; href=&#34;http://developers.douban.com/wiki/?title=subject_1#subject_search&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://developers.douban.com/wiki/?title=subject_1#subject_search&lt;/a&gt;，一个是获取音乐信息，&lt;a class=&#34;link&#34; href=&#34;http://developers.douban.com/wiki/?title=subject_1#music_get&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://developers.douban.com/wiki/?title=subject_1#music_get&lt;/a&gt;，大概研究了一番，觉得这两个可以搞，于是开搞，后来发现，其实只需要一个搜索的就够了，在搜索的结果中，他会给出专辑封面的 url，例如这个，&lt;a class=&#34;link&#34; href=&#34;http://api.douban.com/music/subjects?q=papercut&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://api.douban.com/music/subjects?q=papercut&lt;/a&gt;，返回的结果中直接可以解析得到封面，但是有一个小问题，他给的封面都是很小的尺寸的，&lt;a class=&#34;link&#34; href=&#34;http://img1.douban.com/spic/s6044101.jpg&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://img1.douban.com/spic/s6044101.jpg&lt;/a&gt;，例如这个，才 80*80 的像素，这个肯定是不够用的，想起来豆瓣 FM 的封面好像比这个清晰很多啊，于是看了一下电台那边的网络交互，发现其实很简单，只要把 url 中的 spic 换成 lpic 就行了，。。这个。。略坑爹啊。。（不过后来在实现的过程中发现豆瓣的图片服务器还是不稳定的，经常出现 504 的情况，不管大图小图都会出），有了思路就好办了，于是用 C# 现学现用，写了一个根据 ID3 补全专辑封面的小工具，呵呵，第一次写桌面客户端，很多东西就将就的，不过磕磕碰碰总算写出了个大概了，附上半成品，（半成品的意思就是说使用有风险，可能毁文件或者乱崩溃，请谨慎，多备份源文件）&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/wp-content/uploads/2012/08/Debug.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;点此下载&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;另外附上源码，写的很丑，将就用吧（环境是 vs2008）&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/wp-content/uploads/2012/08/MP3ID3.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MP3ID3源代码&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;解压缩开来的到一个 exe，运行就是了，（需要 .net framework 3.5 环境，这个 win7 自带，xp 自带的好像是 2.0，所以 xp 的话需要自己先装一个 3.5），界面如下图&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/wp-content/uploads/2012/08/Unnamed-QQ-Screenshot20120830094811.png&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://blog.zrj.me/images/Unnamed-QQ-Screenshot20120830094811.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;往列表中拖入 MP3 文件，（只能拖 MP3 文件，不能拖其他，也不能拖文件夹，这个还没做，将就吧），然后双击某一个文件可以看到他里面已经内嵌的歌词和封面，点击 start 就可以开始自动对所有列表中的文件去拉取封面了，（这里需要说明的是，豆瓣比较恶心，API 每分钟只能请求 10 次，于是我只能让每个文件请求后都休眠 6 秒钟了，所以这个东西最好放到睡觉前跑，一觉起来就跑得差不多了，如果有申请豆瓣的 API key 的话，可以修改源代码，去掉这个限制），拉取回来自动嵌入封面就算完了，然后就下一首。在这个过程中会在 exe 的所在文件夹下生成一个 log 的日志，还算比较详尽，一般出错的原因都可以从这个得到&lt;/p&gt;
&lt;p&gt;另外那个 force over write 的选项的意思是，是否要强制覆盖写入，默认情况下，如果一首歌曲里面有内嵌图片的话，那么就会跳过，勾选这个可以无视已有的图片，强制覆盖写入。&lt;/p&gt;
&lt;p&gt;一个已知的问题是，读取中文的标签信息时候会乱码，这个暂时没有很好的解法，应付的解法可以看这里，Taglib 读取中文 ID3 标签时乱码，&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/archives/389&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://zrj.me/archives/389&lt;/a&gt;，可以暂解燃眉之急。&lt;/p&gt;
&lt;p&gt;这个搞完就剩下歌词了，歌词就容易了，我想起来以前用千千静听的时候，他是可以自动下载歌词的，但是没有开放接口，哈哈，笨人自然有笨办法，搞一个按键精灵嘛，每两秒钟自动触发一次 ctrl alt → 三个组合键的全局热键，让他去播放下一首的时候自动下载不就行了，音量调成静音，很快就好了&lt;/p&gt;
&lt;p&gt;至此这个小项目应该就算结束了，不过这次的过程中 C# 和 .NET 给我留下了良好的印象（承认自己喜欢 C# .NET 是需要勇气的啊，要知道鄙视 C# .NET 是高手必备的素质之一啊，哈哈），这次时间紧，还有其他东西要赶，将来还会继续学的，主要还是通过这个学点多线程，学点系统本身的环境调用等等，这个领域还是很大的，作为新手用这种高层语言自然最适合不过了，类似数组越界异常处理这些东西，都有虚拟机帮忙把关，其实是降低了学习曲线，不然一上来就用 windows api 去写一个类似我这样的应用程序，新手不被各种小细节烦的崩溃才怪，现在沙盒里面练练手，熟悉之后再踏上征途嘛。不管怎么说，作为一个刚学 C# 三四天，第一个练习的项目做成这样的情况来说，我还是能及格的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;历史评论&#34;&gt;历史评论
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;再次折腾专辑封面 | ZRJ&lt;/strong&gt; (2012-12-03 23:54:18):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[&amp;hellip;] 最近 itunes 升级，于是重新在整理音乐文件，看到那些没有专辑封面的 mp3，于是骨子里的不折腾不舒服斯基又发作了，手贱准备再次开始写一个自动工具来搞，上次的折腾记录在这里，根据 ID3 自动补充专辑封面和歌词 [&amp;hellip;]&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        </item>
        <item>
        <title>Taglib 读取中文 ID3 标签时乱码</title>
        <link>https://blog.zrj.me/posts/2012-08-29-taglib-%E8%AF%BB%E5%8F%96%E4%B8%AD%E6%96%87-id3-%E6%A0%87%E7%AD%BE%E6%97%B6%E4%B9%B1%E7%A0%81/</link>
        <pubDate>Wed, 29 Aug 2012 23:41:44 +0800</pubDate>
        
        <guid>https://blog.zrj.me/posts/2012-08-29-taglib-%E8%AF%BB%E5%8F%96%E4%B8%AD%E6%96%87-id3-%E6%A0%87%E7%AD%BE%E6%97%B6%E4%B9%B1%E7%A0%81/</guid>
        <description>&lt;p&gt;在读取中文的标签的时候，有时候会出现乱码的问题，一开始以为是文件中内嵌标签本来就有编码问题，类似 gbk 和 utf8 那样，后来折腾着发现貌似是类库本身的问题，同样的问题在这里也有人提到，&lt;a class=&#34;link&#34; href=&#34;http://blog.sina.com.cn/s/blog_69dcb20701014pmj.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://blog.sina.com.cn/s/blog_69dcb20701014pmj.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不过，似乎TagLib-Sharp对utf8编码的中文不是非常的兼容，读取的时候很容易出现乱码，对于中文字符串的处理似乎需要而外的解码处理，需要在日后查阅资料来解决这个问题，郁闷纠结中。。。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/wp-content/uploads/2012/08/Unnamed-QQ-Screenshot20120829233911.png&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://blog.zrj.me/images/Unnamed-QQ-Screenshot20120829233911.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;也是，毕竟是外国友人写的，对 cjk 这类的字符自然没有顾虑那么周全，于是 google 搜，看到这里，&lt;a class=&#34;link&#34; href=&#34;http://gphone.tgbus.com/jc/syjc/200812/172339.shtml&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://gphone.tgbus.com/jc/syjc/200812/172339.shtml&lt;/a&gt;，有一个好软件叫做 convertz ，下载回来，重新编码了一下文件之后，果然能够争取读取了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;历史评论&#34;&gt;历史评论
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;根据 ID3 自动补充专辑封面和歌词 | ZRJ&lt;/strong&gt; (2012-08-30 10:17:37):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[&amp;hellip;] 文章导航 ← 上一篇 [&amp;hellip;]&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        </item>
        <item>
        <title>Taglib 读取 MP3 内嵌专辑图</title>
        <link>https://blog.zrj.me/posts/2012-08-29-taglib-%E8%AF%BB%E5%8F%96-mp3-%E5%86%85%E5%B5%8C%E4%B8%93%E8%BE%91%E5%9B%BE/</link>
        <pubDate>Wed, 29 Aug 2012 10:23:53 +0800</pubDate>
        
        <guid>https://blog.zrj.me/posts/2012-08-29-taglib-%E8%AF%BB%E5%8F%96-mp3-%E5%86%85%E5%B5%8C%E4%B8%93%E8%BE%91%E5%9B%BE/</guid>
        <description>&lt;p&gt;taglib 是一个 c# 的库，用来读写 ID3 的标签还是很好用的，昨天在折腾读取图片的问题，搞了好久，最后找到这里，&lt;a class=&#34;link&#34; href=&#34;http://geekswithblogs.net/sonam/archive/2009/06/11/extracting-album-from-an-audio-file.aspx&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://geekswithblogs.net/sonam/archive/2009/06/11/extracting-album-from-an-audio-file.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不过自己改写了一下，发现可以不用这么多，最后如下&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;TagLib&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IPicture&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pictures&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Tag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Pictures&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pictures&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Length&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;Byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bytes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pictures&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ToArray&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MemoryStream&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ms&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MemoryStream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bytes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Drawing&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Bitmap&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bitmap&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Drawing&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Bitmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pictureBoxCover&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bitmap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pictureBoxCover&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Image&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item>
        
    </channel>
</rss>
