插件驱动的分离架构——Spotube 如何用插件接管一切
v5 的核心变化
Spotube v5.0.0(2025-09-11)是一次架构级重构。之前的版本把 Spotify 的元数据和 YouTube 的音频流硬编码在代码里;v5 起,Spotube 本身只提供一个 宿主(Host)——UI、播放内核、数据存储、插件加载器,所有具体的音乐服务连接都通过插件完成。
四类插件接口
Spotube 预留了四类插件 API,每个插件可以实现其中一类或多类:
| 接口 | 职责 | 典型实现 |
|---|---|---|
| MetadataSearchAPI | 搜索曲目、专辑、歌手、歌单,返回元数据 | Spotify / MusicBrainz / JioSaavn |
| AudioAPI | 根据元数据提供音频流 | YouTube / Piped / Invidious / Qobuz |
| LyricsAPI | 根据曲目信息获取时间同步歌词 | LRCLib |
| ScrobbleAPI | 把播放记录上报到外部服务 | Last.fm / ListenBrainz |
v5.1.0(2025-11-14)新增 Audio-Source 插件——之前音频源只能用官方内置的 YouTube/Piped/Invidious,现在社区可以写自己的音频源插件,比如 Qobuz、Dab Radio、自定义 HTTP 源。
Kotlin/JS + Zipline runtime
Spotube 插件不是传统的 Dart/Flutter 扩展,而是 Kotlin/JS 库,在 Cash App 的 [Zipline] runtime 中执行。Zipline 为每个插件提供独立的沙箱环境,插件通过宿主暴露的 bridge 调用 Spotube 的能力,无法直接访问系统文件或网络。
一个插件的典型生命周期:
- 打包成
.smplug(Spotube Plugin),内含plugin.jsonmanifest 和编译好的 Kotlin/JS 代码 - Spotube 在启动或用户手动安装时加载
.smplug - 插件的
main()函数被调用,向宿主注册自己实现的接口 - 用户搜索曲目时,Spotube 调用已注册的 MetadataSearchAPI;播放时调用 AudioAPI;依此类推
元数据与音频源分离意味着什么
在传统客户端里,一个音乐平台同时负责告诉用户"有什么歌"(元数据)和"怎么听这首歌"(音频流)。Spotube 的分离架构打破了这个绑定——你可以用 Spotify 的元数据(歌单、推荐、热门榜),但音频流走 YouTube 或 Piped;或者 Qobuz 的无损音频配上 MusicBrainz 的元数据。这是它能绕过 Spotify Premium 的根本原因。

插件仓库与发现
Spotube 内置从 GitHub 和 Codeberg 拉取的 Available plugins 列表——非精选、非审核,用户自担风险。插件可以:
- 通过内置搜索框直接下载(输入
.smplug直链) - 通过右上角上传按钮从本地安装
- 手动拷贝到插件目录
安全提示:不要安装来源不明的插件。插件拥有你的全部音乐数据访问权限,恶意插件可能窃取登录凭证。优先使用标记 Official 的插件。
想自己写插件?详见 插件开发总览。