虾米下载介绍

每个程序员都应该有一个宠物项目(pet project), 用来尝试想法、磨练技巧。 xiami_downloader 是我近两年来的宠物项目。

##初心

最初就是想做一个虾米网的免费下载软件。几年前开始,喜欢在虾米网在线听歌。下载高音质歌曲是收费的,而且官方软件(虾客)不好用。 有人可能问,为什么不直接在线收听,非要下载。原因是我有在手机听歌的习惯,但是没有开通3G服务,据说地铁里信号不好。

通过google找到了LongkeyMusic(以下简称LKM),这个软件的功能是从虾米网批量下载一张专辑的歌曲。然而如果你想下载某张精选集里的歌曲,或者歌曲的歌词等,这个软件爱莫能助,当时的LKM没有这些功能。

LKM是用.NET写的,而且作者很厚道地没有做混淆。同事胖子向我展示了反编译利器.NET Reflector的厉害。 在此想对原作者表示感谢(和抱歉)。

第一版的xiami_downloader是直接对LongKeyMusic的hack,功能方面主要增加了我想要的精选集歌曲下载、歌词下载。界面部分LKM采用.NET 3.5下的WinForm,而我们用的是WPF(.NET 4.0推出的界面库)。

从此开始了漫长的hacking 之路。

##道阻且长

xiami_downloader经过了几次大的重构,增加了很多新的功能,界面更是换了不知道多少次。 这个过程中学到了很多东西,总结起来如下:

###产品

最大的收获可能就是如何去规划和实现一个产品。从收集和过滤用户需求开始,到界面和功能设计、实现,再到代码重构、自动部署。

做自己每天都会使用的软件,是一件很快乐的事。动力当然不是问题, 但更加需要有对开发价值的判断。我是一个相信奥卡姆剃刀法则的人。 如果一个功能可有可无, 那么宁愿砍掉。

如果一个UI元素不需要时刻都出现,那么就隐藏它,避免破坏画面简洁的美感。

###重构

经过了几次大的重构,每次目的不一样,大体上可归纳为在两个方面增加便利性:新增和除错。要使新增方便,必然要提高代码的重用性,比较极端的是源自ruby的DRY(don’t repeat yourself)原则。要使除错方便,必须改进代码的逻辑结构,并且在各种渠道提高错误的能见度,比如log、tip、MessageBox等。

###git

之前一直用SVN做代码管理,与之相比,git的commit与push分离让offline状态下的工作有了更大的灵活性。 1个人的项目基本只用两个分支:master和dev,多了麻烦。

###异步方法与非阻塞UI

以前在silverlight中接触过异步方法,而在xiami_downloader中,我体会到要获得流畅的用户体验,需要在很多的方面使用异步方法,目的是不阻塞UI线程。WPF在这方面提供了很多编程上的条件,包括Dispatcher、Task等。

###密码学

包括凯撒方阵、api signature的生成、md5的使用等。

###跨进程通信(IPC)

主程序代码是C#,需要和C#、AutoHotKey(AHK)以及python进行IPC。先后接触到了IPC方面的集大成者ZeroMq、.NET自带的WCF,还有最原始的基于文件的IPC。

###RESTful API以及OAuth

虾米推出了自己在iOS和android平台的apps, 伴随而来的是一套用于pc和平台的RESTful API。虽然没有对外公布,但是在android的apk源码里看得到。还有一部分api的入口点是google到的,曾经能在google快照中看到虾米内部api的wiki,用python写的。

虾米采用了一种奇怪的OAuth验证,获取access token时要输入用户的密码(用md5加密)。 大概是想和第三方app的登录验证兼容吧。

###扁平化设计

最初是从windows 8和gmail接触到了扁平化设计,和我的审美理念很一致。然而实践扁平化设计并非易事, 对于颜色对比、留白大小的要求更加严格,找到能望图知义的icon也更加困难。

###自动更新

考虑了自动更新的基本原理。开始时把可执行程序托管到github上,但后来由于众所周知的访问限制,选择了国内的云存储服务:百度网盘。百度网盘采用的是更为标准的、继承自dropbox的RESTful API,即所谓的PCS。

###断点续传与下载器的线程控制

通过实现断点续传功能,对http协议有了更底层的了解。而多任务下载的需求,让我接触到了锁、资源池等概念,以及.NET 4.5引入的async/await机制

##下一站?

某种意义上,一个软件的开发过程不应该有自然的结束,因为需求和资源总是在变化之中。但是写这篇文章的目的,就是为这个伴随我两年的宠物项目画上一个(暂时的)句号。原因有二:

  1. 对项目目前的状态比较满意,能想到的功能基本上都实现(或者否决)了。需要输入更多用户的反馈,才能继续向前走。

  2. 是时候培养一个新的pet project,来尝试一些更加不一样的想法和技巧了。 毕竟xiami_downloader是一个pc 客户端, 涉及到web和移动平台方面的相关技术和思想,强行整合的话也不是不行,但是别扭。

在接下来的一段时间,不会再对该项目进行开发,而是会写一些总结性、介绍性的文字,承前启后,继往开来。

对于自己创造出的事物,人们很自然的会有一种喜爱之情。因此我想对xiami_downloader说一声:谢谢,再见。

分享