Messense Lv

aliyundrive-webdav 诞生记

起源

2021年8月份的时候开始使用阿里云盘,某天在 V2EX 上看了一个帖子《当 [Infuse] 遇上 [阿里云盘] 🚀》了解到可以通过 @zxbu 开源的webdav-aliyundriver 项目给阿里云盘添加 WebDAV 协议支持,从而可以将阿里云盘通过 rclone、davfs 和 RaiDrive 等软件挂载为磁盘使用,或者通过 Infuse 访问作为媒体服务器,而 Infuse 支持 Apple TV 并且能够自动扫描媒体文件抓取封面、字幕等构建媒体库,作为一个 Apple TV 用户自然很喜欢看云盘视频内容更方便了。

前不久也入手了一个 NanoPi R4S 软路由,配置一个双核 Cortex-A72 和一个四核 Cortex-A53、4G 内存性能不错可以跑 Docker,想着可以把 webdav-aliyundriver 容器跑在软路由上,尝试了之后遇到 network_modebridge 运行报错的问题,改成 host 后正常。不过由于它是 Java 语言实现的,占用内存随随便便就几百兆了比较高,看着挺不舒服的,况且程序员嘛本来就喜欢自己捣鼓,于是就萌发了使用 Rust 语言自行实现一套的想法,这就诞生了 aliyundrive-webdav 项目。

发展

第一个版本

说干就干,Chrome 网络调试分析了一遍阿里云盘网页版本的接口之后,大约花了三个晚上的时间,发布了只支持下载功能的第一个 0.1.0 版本,从一开始就有了比较完善的基于 GitHub Actions 的 CI/CD 流程自动构建基于 musl libc 的二进制文件打包发布到 GitHub Releases,得益于 [maturin] 项目非常方便地将这个 Rust 编译的二进制文件像一个普通 Python wheel 一样发布到 PyPI 上使得主流操作系统如 macOS、Linux 和 Windows 可以通过 pip install aliyundrive-webdav 安装使用。

OpenWrt 插件

前面提到的二进制包已经可以在 NanoPi R4S 软路由上运行了,但因为没有 init 配置,在路由器重启后不能自动启动,另外程序运行需要配置阿里云盘 refresh_token 参数,而该参数存在有效期虽然程序会自动定时刷新,但当需要提供全新的 refresh_token 参数时没有配置界面不是很方便,于是便学习了 OpenWrt Packages 文档,又在参考了一些现成的 OpenWrt 插件源代码之后完成了第一个版本的 OpenWrt 插件开发,同样集成了完善的 .ipk 文件 CI 自动编译打包流程。

Rust 编译的基于 musl libc 的二进制文件因为是全静态链接文件大小比较大,而很多路由器可用的存储空间都比较小,为了尽可能减少 .ipk 文件大小,增加了 Link Time Optimization 和 opt-level = "z"(优化产出物大小),并自动 strip debug symbols,即便如此二进制文件仍然有 5MB 左右,祭出大杀器 upx 对二进制进行压缩后直接减少约 44% 至 2.2MB 左右,非常厉害。不过后来也遇到过 upx 3.96 压缩的 MIPS 架构二进制文件启动即卡死的问题,只能降级到 3.95 版本解决。

梅林插件

当时手上还有个洋垃圾网件 R8000 路由器,刷了 Koolshare 的梅林系统有个软件中心可以安装第三方插件,就想着能不能我也写个梅林插件做个简单的配置界面方便使用,在参阅了《梅林软件中心插件开发教程详解》和一些梅林插件源代码之后,做了第一个支持比较老的梅林 ARM380 固件的 aliyudrive-webdav 插件。可惜后来这个因为空调漏水,这个洋垃圾路由器壮烈牺牲。现在换了国产辣鸡红米 AC2100 纯当 AP 使用,因为是 MIPS 架构的 CPU,偶尔也能用来测试一下。

论坛宣传

迭代了几个小版本后,在 V2EX 上发帖《阿里云盘 WebDAV 路由器版本》宣传了一下,得到了一些网友们的回应,带来了一些流量,GitHub issue 上渐渐多了一些提问和 feature requests。逐渐增加了 armv7、armv5te、x86_64 和 MIPS 等架构支持并发布了支持多种 CPU 架构的 Docker 镜像,还开发了呼声较高的上传文件功能。

社区贡献

@flyhigherpi 贡献了梅林 384/386 固件版本的支持,也吸引了国内 OpenWrt 社区比较活跃的 @Beginner-Go 的贡献改进了我的菜鸡 OpenWrt package 代码使之更加标准和规范化,后来还将 aliyundrive-webdav 提交收录至国内比较流行的 lede Lean's OpenWrt source 代码仓库,逐渐被各个 OpenWrt 固件发行版本收录编译方便用户安装使用。

为了支持 armv5te 和 MIPS 架构,也对依赖的两个不兼容的 Rust crates 提了 Pull Request 或者 Issue,通过与上游合作,增加了此类 32 位系统的支持,比如 quantamoka。也许 aliyundrive-webdav 这个项目不会很长久,但开发过程中产出的对 Rust 社区 crates 的改进会长久留存下去,Rust 这个比较年轻的语言的生态会越来越好。

Star History

aliyundrive-webdav 项目至今三个月,GitHub Star 增长速度可能是我目前的开源项目中最快的,如下图

Takeaways

这个用爱发电的开源项目,几乎没有带来任何收入,但却能让人看到开源社区有趣的一面,尽管大家互不相识,却能热情、高效地解决遇到的问题和困难。

另外,永远不要假设你的产品用户一定会怎么用,尽管我最初是想在 NanoPi R4S 这样的相对较高性能的软路由上跑来看视频的,也有些喜欢捡垃圾的用户却要跑在斐讯N1盒子、玩客云、威联通 NAS 等各式各样的平台上,用 rclone、davfs 或者 RaiDrive 配合 NAS 的文件同步服务比如群晖 CloudSync 单向/双向同步文件。

因为我目前工作在蚂蚁集团,正好也在阿里云盘内部反馈钉钉群中,也看到一些内部用户向官方团队提出需要 TV 版本或者 WebDAV 协议支持的需求,一开始他们是拒绝的回复说 WebDAV 是很老的协议兼容性也不好什么的,后来有一天改口说 WebDAV 协议支持设计中了,期待官方支持上线的那一天。

[maturin]: https://github.com/PyO3/maturin