diumoo 开源啦

在接近三年的维护空荡期之后,我终于又抽出时间为 diumoo 发布了一个修复多个严重问题的 1.5.0 版本, 这一版本也将会成为 diumoo 开发过程当中的一个里程碑: diumoo 在 GitHub 上正式开源了!

粗略算来,自 diumoo 发布已经接近五年了。diumoo 作为我第一个比较成功的 App, 中间经过数个小版本更新和两个大的版本的更新,终于一路走到今天。在此次更新之前,diumoo 经历了长达两年的维护空档期,直到最近因豆瓣方面的页面调整而导致的严重问题,才终于迫使我又拿起这个项目。 在此,我不得不向所有支持 diumoo 的用户们表示歉意。

经过一段时间的考虑,我终于确信只有将 diumoo 开源,才能让此项目长期发展下去——在开源的开发模式下, diumoo 不会再因为我一个开发者不能活跃维护而迟迟不能更新了。 而我也更希望在开源之后,其他开发者可以加入其中,按照自己的想法定制和修改 diumoo, 从而衍生出更多更好的选择。这样即使用户最后不再使用 diumoo,它也可以继续实现自己的价值。

总之,欢迎各位有能力的开发者在关注 diumoo 在 GitHub 上的仓库。 在接下来的文章里,我会稍微介绍一下 diumoo 的开发历程。

起源

diumoo 的开发大约开始于我读大三的时候,当时在自己的联想 Y450 电脑上折腾出来一个 Hackintosh,也就是俗称的黑苹果。 因此逐渐将主力操作系统从 Linux 切换到 OSX 上了。在当时,豆瓣电台是 Mac 上听音乐最好的选择之一,它以优秀的推荐算法著称, 很多其他的竞争对手尚未发展起来。但是长期以来,豆瓣仍奉行 Web 服务为主的特点,不要说 Mac App, 连移动应用也没有给予足够的重视。

我对当时可以找到的一些电台 App 不甚满意,因此想要自己开发一个。当时的我比较熟悉的是 Web 开发和一点 Qt 开发, 对于 OSX 开发完全没有经验。因此最初想法其实是使用 Web 技术开发这一 App 然后将其打包成原生应用发布。 像 Electron 这么方便的工具还没有出现,因此开发遇到了不少困难。 制作出来一些 Prototype 之后自己都很不满意,因此下定决心要使用 Native 的 Cocoa API 进行开发。

从零入门 Objective-C 是一件挺困难的事情,在真正接触之前我其实一直不怎么喜欢它奇怪的语法, 而且当时的 Objective-C 还没有 ARC 这种方便的 GC 功能,在开发 diumoo 时尤其是在内存管理和多线程并发过程当中遇到很多问题, 然而就这样磕磕绊绊,竟然也终于完成了一个较为稳定的版本——尽管那个版本时不时还是会突然崩溃, 但是稳定性已经满足了最低的需求。也就是在这个时候,我将 diumoo 的第一个版本发布出去了。

diumoo 取得了预料之外的成功,前几天的下载量都超过千次。与此同时,很多博客也陆续推荐和介绍了 diumoo, 那段时间真是晚上都兴奋的睡不着。当时 App 的 UI 主要就是在状态栏上的一个 Menu 构成, 添加了一些诸如声音渐变的效果,最主要的 Feature 其实是添加了一个所谓的 Desktop Wave 的功能。 这个功能被很多用户所喜爱。

最早的 diumoo

这一版本让我最惊讶的时候是被当时的电脑报的一个栏目推荐了。在当时纸媒虽然已经开始走下坡路, 但是电脑报在一般熟悉计算机的人心中还是又很高的地位的。总之,尽管第一个版本的 diumoo 还有很多问题, 却仍然得到了很多用户的认可和支持。也有很多用户通过各种渠道为 diumoo 捐款,令我非常感动。

另外一个必须提到的事情是,diumoo 的另一个主要开发者 AnakinMac 也是在这一阶段主动加入到开发行列的。作为一个野生 OSX 开发者,很多地方我都写的很糟糕,从 Anakin 那里我学到了很多东西。

发展

在此后一段时间,Apple 的产品越来越受欢迎,Mac OS 的开发速度也开始加快,并且从 iOS 上吸收过来很多东西。 此后,Objective-C 2.0 发布,从此 Mac 开发者可以使用 ARC 进行内存管理,再也不需要手动操作引用计数了。 另一个重大的改变是,之前 Mac 上使用的 QuickTime.Framework 被弃用,取而代之的是从 iOS 上引入的 AVFoundation, 这导致 diumoo 在新版本的 OSX 上无法运行。此时 diumoo 还在活跃维护的阶段,因此很快就开始编写新的版本。

新版本的 diumoo 几乎是完全重写的代码,从 UI 到内核都进行了完全的重构。Apple 也很快发布了配备 Retina 屏幕的 Macbook Pro,因此对于 Retina 的支持也被规划在内。尽管 AVFoundation 对开发者更友好一些, 但是底层音频的 API 没有 QuickTime.Framework 暴露的多。尽管可以使用 CoreAudio 来获得更底层的访问,我们最终还是决定放弃实现 Desktop Wave 这种功能。 另一个放弃它的原因在于尽管看起来很炫酷,这一功能对 CPU 的占用还是比较大的,因此容易导致过热。

在这一版本,除了全新的 UI 和音乐播放内核,我们把重点放在了实现 Time Machine 和 diumoo search 这两个功能上。 使用 Time Machine,用户可以浏览和检索已经播放过的歌曲并且跳回原来的歌曲播放。其中使用 Time Machine 的形式浏览歌曲历史的功能,是我有一天在学校吃完发走在路上,突发奇想得到的 Idea,这可能是我在 diumoo 整个设计当中做出的最有创意的事情了。

Time Machine

在 Time Machine 当中,用户在历史中翻看自己播放过的歌曲记录,遇到想要再听一遍歌曲只需要点击 Restore 按钮, diumoo 就可以开始播放了。这一 API 在后来的 OSX 当中逐渐被淡化了,使用的 App 不多,而 diumoo 这种使用方式也许也是最另类的吧。除此之外,这个版本的 diumoo 还可以使用 search 功能直接找到听过的歌曲:

diumoo Search

尽管有一些用户捐款,但是作为一个穷学生,当时的我慢慢有点承受不了维护 diumoo 的一些开销,比如域名和服务器的租用费用等。当时的 Mac Apple Store 也在上升期, 很多 App 都转移到商店发布了。同时,商店作为一个发布平台,也可以让 diumoo 接触到更多的用户。 因此就跟 Anakin 商量要不要上架一个收费的版本,象征性地收取一点费用用来 Cover 一些固定开支。 毕竟就捐款来说,连 Mac Apple Store 每年的订阅费用都不够。

因此 Anakin 同学就购买了 Mac App Store 的账号。然而在 Mac App Store 上发布收费软件的复杂性超出了我们的预期, 迫于老版本 diumoo 已经存在严重的运行问题的情况,我们只好先发布了一个功能不完整的 Lite 版。 这个版本是一个巨大的错误,因为并没有提供为了这一版本开发的独特功能,仅仅是因为上架存在困难而提供的临时解决方案, 评价并不是很好。最终,我们还是将 diumoo 直接上架到 Mac Apple Store 上去免费发布了。在此也要特别感谢 Anakin 同学一直以来订阅 Mac Apple Store 以维持 diumoo 上架的贡献。

在这一版本的 diumoo 发布之后一段时间,diumoo 的开发就渐渐进入了停滞期。

停滞

diumoo 开发的停滞主要是由于我个人的原因,在本科的最后一年,我决定要报考研究生,因此花了将近半年的时间复习考试, 因此也就不再有什么时间来维护项目了。考研成功后,diumoo 做了一些日常的更新,当时一些其他的电台音乐软件, 譬如网易云等都开始发力。一些音乐服务如 QQ 音乐和网易云音乐都推出了官方 Mac 版,diumoo 因此也慢慢淡出了 Mac Apple Store 上的音乐类排行榜。

在上研之前的一个暑假,我有幸拿到了豆瓣的实习 Offer,因此也进入豆瓣认识了当时负责音乐部分的 Su27 老师和 另一个豆瓣电台客户端 dRadio 的开发者 lembacon 同学。在豆瓣的两个月我其实主要的工作还是 Python 和 Web 开发, 但是中间确实有机会接触到了豆瓣电台的官方 API (未公开)。中间更有机会为豆瓣官方的 Mac 电台客户端出一份力, 但是最终这一计划还是流产了。

关于豆瓣电台官方 Mac App 也是一个 Sad Story,我本人作为一个半路出家的野生 Mac 程序员, 确实在这方面技术还是有点 Too young,再加上在开发过程中一些问题上的争执,最后没有成型也是难以避免。 后来,我就到了上海交通大学去读研,期间还试图挣扎着试图使用官方 API 重构一次,Su27 老师也很大方, 允许我离开豆瓣之后继续查看 API 文档以及为我提供 API Key。但是由于研究生期间的学业问题以及兴趣爱好还是转移到了 Web 和膜蛤这边,终于还是没能将这件事情完成。

就这样,diumoo 的开发陷入了停滞的状态,我自己也将豆瓣电台的红心歌曲通过网易云音乐同步和下载到本地, 从此成为了本地音乐党,一度将所有能找到无损音质的歌曲都换成无损音质了。而豆瓣电台本身这一段时间也没有太大的变化, diumoo 还可以一直使用。

不得不说,从我结束豆瓣实习到现在,豆瓣本身也出现了很多变化。Su27 老师现在已经不再负责音乐组,豆瓣内部的架构听说也有一些调整。 这些年,尽管有一些失败的产品尝试,但是豆瓣已经逐渐开始重视移动端开发,在按照自己的步调慢慢发展着。 从某种角度来说,因为豆瓣 API 的修改而导致 diumoo 无法登录的问题也是豆瓣电台还在不断改进的一个标志。

开源: 新的开始

因为近期出现的登录问题,我不得不又回到 diumoo 的开发上来。在这段时间里,我在微博和主页上发出了征召开发者的请求, 很多用户表达了参与的意愿。这些用户的支持是我终于下定决心要将 diumoo 开源出来重要原因。

在开源之前,我还先着手将目前所遇到的不能登录的问题解决了,做了一些的修正和代码处理。 得到了现在的 1.5.0 版本。下图就是现在的 diumoo 运行截图了,为了更好的显示效果 diumoo 现在也已经支持 OSX 的 Dark mode。这一版本同时也修正了一些豆瓣电台页面和 API 修改所遇到的问题。

diumoo

不得不说,在使用过一段时间离线音乐之后, 重新拿起 diumoo 来,我又喜欢上了豆瓣电台这种推荐音乐的方式: 电台音乐不会像本地音乐那样反复听容易厌倦, 而自己写的 App,用起来还是最舒服的感觉。

总而言之,diumoo 开源了,diumoo 的开发也进入了一个新的阶段。这并不是 diumoo 开发的结束而是一个新的开始—— 集合更多人的力量支持 diumoo 的维护,减轻我本人的压力是我目前比较现实的期望。 如果其他开发者能为 diumoo 贡献更多功能、让 diumoo 发展的更好那真的是再好不过了。

如果你喜欢 diumoo、使用过 diumoo 或者是一个感兴趣的开发者,欢迎你在 GitHub 上关注 diumoo。也欢迎你通过在 GitHub 上添加 Issue 的方式为 diumoo 反馈 Bug,支持 diumoo 的继续发展!