为初代 iPad mini(iOS 9)准备的极简 Subsonic 播放器
1.8K
为初代 iPad mini(iOS 9.3.5 的 Safari)准备的极简 Subsonic 播放器。
现代前端框架(Vue/React + ES6)在这台机器的 Safari 上跑不起来,所以这个项目的页面是手写 ES5 单文件:没有构建步骤、没有框架、没有外部资源。服务端做三件事:托管这个页面、把 /rest/* 反向代理到 Subsonic 服务端(Navidrome 等),让页面与 API 同源绕开老浏览器的 CORS 限制;保存连接配置;并在转发时注入鉴权参数。音频流的 Range 请求由代理原样透传,拖进度条靠它。
镜像由 GitHub Actions 在打 v* 标签时构建,推送到 Docker Hub(passport888/submini)与 GHCR。家里部署只需拉镜像:
mkdir -p data && sudo chown 65534:65534 data # 容器以 nobody(65534) 运行,数据目录要归它
docker compose pull
docker compose up -d
然后打开 http://<家里服务器>:9898,第一次打开会看到连接设置表单:填服务器地址(如 http://192.168.1.10:4533)、Subsonic 用户名和密码,点「连接并保存」。后端会先向服务器验证一次,成功才保存;之后任何设备打开这个页面都直接进播放器,不用再输。
本地构建也可以:docker build -t submini .,或直接 go run .(见下文)。
连接信息存在后端的 SQLite 数据库里(submini.db),compose 把它挂在工作目录的 ./data 下(容器内 /data),升级镜像不丢,备份也方便。存的是 Subsonic 的 token 和 salt,不是密码原文——密码只在提交表单时用一次,算完 token 就丢弃。点页面右上角「退出」会清掉已保存的连接,回到设置表单。
环境变量只剩两个基础设施项:
| 变量 | 默认 | 说明 |
|---|---|---|
LISTEN | :9898 | 监听地址 |
DATA_DIR | .(镜像里是 /data) | submini.db 所在目录 |
注意:设置接口(/api/*)本身没有鉴权,这是给可信局域网用的家用小工具,别把 9898 端口直接暴露到公网。
format=mp3:Navidrome 会把 FLAC 等格式实时转码,老 Safari 只认 MP3/AAC 也能放let/const、模板字符串、Promise、fetch(用 XMLHttpRequest)playAt() 不要隔异步回调调用go run . # 需要 Go 1.26+
DATA_DIR=/tmp/submini-dev go run .
Content type
Image
Digest
sha256:435703720…
Size
8.8 MB
Last updated
4 minutes ago
docker pull passport888/submini