技术指南
本页面向高级用户和集成开发者:Tune 的构建方式、它的 API 以及运维细节。日常设置请见配置。
架构
- 服务器:单个程序
tune-server,使用 Rust 编写。它负责为音乐库建立索引、解码音频、驱动设备,并提供网页界面、API 和音频流,全部通过同一个端口(默认 8888)。 - 网页界面:由服务器提供的 Svelte 应用(程序旁边的
web/文件夹,或TUNE_WEB_DIR)。 - 数据库:默认为 SQLite,PostgreSQL 为可选项(见配置)。迁移在启动时运行。
- 解码:内置解码器(Symphonia,加上 Tune 自己的 WavPack 和 APE 解码器,以及 libopus)。重采样使用 sinc 插值(rubato)。播放不经过 ffmpeg;已发布的版本中附带一个精简的 ffmpeg,仅用于转换器的 AAC 编码。
- 发现:DLNA/UPnP 使用 SSDP,AirPlay 和 Chromecast 使用 mDNS,Squeezebox 的发现使用 UDP 3483。
- Tune 还会在网络上把自己呈现为一台 UPnP 媒体服务器(其音乐库对 DLNA 控制应用可见),并按区域呈现为 UPnP 渲染器。
HTTP API
所有路由都位于 /api/v1 之下。路由的 JSON 列表由 GET /api/v1/system/api-docs 提供(即“设置 › 系统 › 关于”中的 API 文档链接)。Tune 不提供 OpenAPI 描述。
| 路由 | 用途 |
|---|---|
GET /api/v1/system/health | 服务器健康状态:ok 或 degraded(HTTP 200),error(HTTP 503) |
GET /api/v1/system/version | 服务器版本 |
GET /api/v1/system/stats | 统计信息(Docker 镜像的健康检查使用) |
POST /api/v1/system/scan, GET /api/v1/system/scan/status | 启动扫描,跟踪其进度 |
GET /api/v1/system/logs?lines=N | 最新的日志行(默认 1000 行) |
GET /api/v1/system/diagnostics/bundle | 诊断压缩包 |
GET /api/v1/zones | 区域列表 |
GET /api/v1/zones/{id}/status | 区域的播放状态 |
POST /api/v1/zones/{id}/play, /pause, /resume, /stop, /next, /previous, /seek, /volume | 播放命令 |
GET /api/v1/zones/{id}/queue | 播放队列 |
GET /api/v1/search | 在音乐库和各服务中搜索 |
GET /api/v1/library/albums, /artists, /tracks | 音乐库 |
实时事件(播放、队列、扫描等)通过位于 /ws(或 /api/v1/ws)的 WebSocket 传递。旧的 /api/scan 路由(不带 v1)已不再存在。
身份验证
身份验证默认关闭,这使得 API 对整个本地网络开放。它通过 API(/api/v1/auth/config)开启。账户就是 Tune 的配置文件,密码使用 Argon2 哈希,会话为有效期 24 小时的 JWT。长期有效的 API 令牌由 POST /api/v1/auth/token 签发。接受的请求头有:Authorization: Bearer <token> 和 Authorization: ApiKey <key>。即使开启了身份验证,/system/health 和 /system/version 仍然保持公开。Tune 不提供 HTTPS:如有需要,请在它前面放置一个反向代理。
Squeezebox / LMS 兼容性
- 内置 SlimProto 服务器,端口 3483(TCP 和 UDP,可用
TUNE_SLIMPROTO_PORT配置),供 Squeezelite 和 Squeezebox 播放器使用。 - 与 LMS 兼容的文本命令端口 9090(
TUNE_CLI_PORT),如果 9090 被占用,则顺延到下一个空闲端口。
运维
- .deb 软件包:程序在
/opt/tune/,数据在/var/lib/tune/,配置在/etc/default/tune-server(升级时保留),tune-server.service单元以tune用户运行。apt purge绝不会删除/var/lib/tune。 - Docker:
renesenses/tune镜像(amd64、arm64)。它以非 root 的tune用户(uid 1000)运行,带有/data和/music卷。它既不包含本地音频输出,也不包含 PostgreSQL。在 arm64 上无法使用 AirPlay 2,Tune 会使用 AirPlay 1。 - Tune OS:基于 Fedora。程序在
/opt/tune,服务为tune,数据在/opt/tune/data,80 端口转发到 8888,SSH 已启用(拒绝 root 登录)。 - 日志:
RUST_LOG允许按模块进行细粒度过滤。