做了六年,终于给 go-musicfox 搞了个官网

go-musicfox 的官网 musicfox.anhoder.com 终于上线了。这件事拖了六年。

不是没时间。是总觉得 README 够用了——一个终端播放器,用户都是开发者,谁会需要一个 .com 域名?但做到第六年回头看,有个像样的门面确实不一样。给别人推荐的时候甩个域名过去,和甩个 GitHub 链接过去,观感完全不同。

趁官网上线的契机,也回顾一下这个项目是怎么走到今天的。

起点:Dart 版本(2020)

一开始做 musicfox 是在 2020 年 7 月,用的 Dart。动机很简单,就四个:

  1. 终端里放歌很酷。不是所有人都会这么觉得,但我觉得。
  2. 确实有听歌需求。当时网易云音乐的客户端越来越重,开机自启、弹窗推荐、评论区乌烟瘴气——我只想安静听个歌。
  3. 学一门新语言。Dart 语法像 Java,学习成本低,而且能编译成三平台可执行文件。
  4. 想维护一个自己的开源项目。之前给别人的项目提过 PR,但有自己的东西感觉不一样。

第一版长这样——基于 mpg123 做播放后端,fork 子进程通过管道通信,Bubble Tea 那时候还没出来,TUI 是自己撸的。仓库在这:github.com/anhoder/musicfox,当时还写了篇博客记录

Dart 版本能用,但问题不少:依赖 mpg123(需要用户手动装)、只能放 mp3(网易云无损 flac 放不了)、Windows 下管道通信各种坑、Dart 的原生生态也不太行。

Go 重写(2021)

做了一年不到,决定用 Go 重写。2021 年 5 月发了 musicfox 2.0——golang 重写版

选 Go 的原因很实际:单二进制跨平台编译、有 beep 这个纯 Go 音频库(不用依赖外部播放器了)、bubbletea 做 TUI 正合适。顺便——也想深入熟悉 Go。

这次重写解决了 Dart 版本的所有痛点:不依赖外部播放器、支持 flac、Windows 体验正常了。但说实话,当时没想到这个项目会做这么久。

Go 重写之后:一路加到现在

2021 年 5 月的 2.0 版本跟现在比,功能差了十万八千里。这些年陆续加进来的主要东西:

更多播放引擎。最初只有 Beep。后来加了 MPV(兼容性更强)、MPD(连 NAS/树莓派)、AVFoundation(macOS 原生)、MediaPlayer(Windows 原生)。最近 v4.8.3 又加了 DLNA/UPnP——能把音乐投送到客厅的智能电视和 Hi-Fi 音响。

UNM 多源回退。网易云音乐的灰色歌曲是最大痛点。UNM 自动从酷我、酷狗、咪咕、QQ 音乐找替代音源——一行配置的事。

逐字歌词。先做了 LRC(按行高亮),后来加了 YRC(逐字踩点)。macOS 配合 LyricsX 桌面浮动显示,代码写着歌听着,余光就能看到唱到哪了。

Kitty 图形协议。终端里直接渲染专辑封面,圆角裁剪加旋转动画。Kitty、iTerm2、WezTerm 都支持。TUI 也能很好看。

系统深度集成。Linux MPRIS、macOS Now Playing + 菜单栏控制、Windows 媒体控件。蓝牙耳机断连自动暂停、系统休眠自动响应。终端播放器不和系统割裂。

其他。TOML 配置迁移、40+ 快捷键全量可定制、Last.fm scrobble、远程控制模式、终端内二维码登录、自定义分享模板、鼠标支持……功能列表越拉越长。

从零到 2.4k star:一点心理历程

刚开源的时候,GitHub 上只有自己一个星星。那时候每天刷好几遍,看到有人 star 了能高兴半天。Dart 版本慢慢攒了几十颗星,有人提 issue 说 Windows 下跑不起来——虽然是个报 bug 的,但"有人真的在用"这个感觉,对一个刚开始做开源的人来说,很奇妙。

Go 重写之后,star 涨得快了一些。大概到 500 的时候,开始有陌生人来提 PR——不是修 typo 那种,是真的加了功能、改了 bug。那个瞬间你会意识到,这个项目不再只是"你的"了。

1k star 的时候,感觉是道坎。终端音乐播放器是个非常小的品类,能做到 1k 说明不是自嗨。2k 之后心态反而平和了——不再频繁刷 star 数,更关注 issue 里的反馈和 PR 的质量。

说实话,2.4k star 跟现在动辄 10k、20k 的明星 repo 没法比。但一个终端里跑的网易云音乐播放器,用 Go 写的,不追风口、不做营销、不发推广文章——就纯靠人传人和搜索引擎的自然流量,六年慢慢长到 2.4k。这个数字不大,但每一个都是真实的。

有人用它搭配树莓派做了家里的 music server,有人因为它换了支持 Kitty 协议的终端,有人在 issue 里认真讨论某个引擎的音频延迟问题——这些比 star 数本身更有意思。开源最有价值的东西不是数字,是这些因为你写的东西而产生了真实连接的时刻。

感谢社区

六年下来,这个项目早就不只是我一个人在维护了。60+ 贡献者提交过代码,有人修 bug,有人加功能,有人帮忙打包到各个发行版。

特别感谢每一位给 go-musicfox 提过 PR、开过 issue、写过文档、做过打包的人。一个开源项目能活六年,靠的不是作者的热情——热情会消退。靠的是有人用、有人在意、有人愿意搭把手。

六年,一个官网

拖了六年才做官网,回头看也不算坏事。如果 2020 年就做,上面能写的东西太少——Dart 版本功能有限,截图不好看,也没什么数据可说。现在做,六个引擎、八级音质、2.4k star、60+ 贡献者、15 个包管理器——每一行都有东西可写。

有些事情晚做比早做好。因为你确实有话可说了。


官网:musicfox.anhoder.com

GitHub:github.com/go-musicfox/go-musicfox

Dart 版本:github.com/anhoder/musicfox