- B
So What
DSub · 2m ago
- T
Take Five
Symfonium · 14m ago
- G
Goodbye Pork Pie Hat
Feishin · 31m ago
自托管 · 开源 · MIT
每一次播放,都算数。
Navidrome Stat 轮询 Navidrome 服务器的 getNowPlaying 接口,把所有 Subsonic 客户端的播放汇聚成一块自托管仪表盘——收听时长、趋势、榜单和年度回顾。数据从不离开你的机器。
Blue in Green
Miles Davis — Kind of Blue
你的收听历史,值得被完整呈现
Navidrome 的各个客户端彼此不共享统计。Navidrome Stat 改为在服务器端观测——所有客户端,同一条历史。
所有客户端,同一条历史
DSub、Symfonium、Feishin、网页播放器——任何 Subsonic 客户端的播放都汇入同一条历史,多台 Navidrome 服务器也不例外。
足够深的图表
按小时与按天的趋势、星期×小时热力图、客户端占比、转码率,以及艺术家、专辑、曲目榜单。
年度回顾
年度总量、连续收听天数,以及你的年度艺术家、专辑与曲目——属于你自己的 Wrapped,基于你自己的数据。
封面代理与缓存
专辑封面经过带鉴权的、容量受限的缓存——你的音乐库保持私密。
数据由你做主
一切都在一个属于你的 SQLite 文件里。按用户导出、导入与删除,可选 token 认证,零遥测。
十套主题
Catppuccin、Nord、Dracula、Tokyo Night、Gruvbox、Solarized——即时切换。
五种语言
简体中文、繁體中文、English、日本語、Deutsch——更多语言已在路线图上。
主题随你挑
十套内置主题,整个仪表盘即时换色。点一个试试:
你的年度音乐报告
一页看尽一整年:总量、连续天数,和陪你走过这一年的歌。
- 0
- 次播放
- 0
- 小时收听
- 0
- 位艺术家
- 0
- 天连续收听
年度曲目
Blue in Green
示例数据——真实数字来自你自己的曲库。
工作原理
无需客户端插件、无需注册、不上云。一个轻量容器,守在你的音乐服务器旁边。
- 1
轮询 getNowPlaying
每 10 秒(可配置)通过 Subsonic API 向每台 Navidrome 服务器询问正在播放的内容——接口本来就在。
- 2
追踪真实会话
暂停与中断不计入。累计有效收听超过阈值(默认 30 秒)才算一次播放。
- 3
存储并呈现
有效播放写入你磁盘上的 SQLite,在 39421 端口的自包含仪表盘中呈现。
当服务器支持 OpenSubsonic playbackReport 扩展时会自动采用,让进度与时长统计更精确。
一个 compose 文件即可启动
复制、粘贴,打开 39421 端口。建议锁定版本号,保证更新可复现。
services:
navidrome-stat:
image: stepaniah/navidrome-statistic:v0.8.1
container_name: navidrome-stat
user: "1000:1000"
ports:
- "39421:39421"
volumes:
- navidrome-stat-data:/data
environment:
NAVIDROME_URL: ${NAVIDROME_URL}
NAVIDROME_USER: ${NAVIDROME_USER}
NAVIDROME_PASS: ${NAVIDROME_PASS}
STATS_API_TOKEN: ${STATS_API_TOKEN}
DATABASE_URL: /data/navidrome_stats.db
restart: unless-stopped
volumes:
navidrome-stat-data: docker run -d --name navidrome-stat \
-p 39421:39421 \
-e NAVIDROME_URL=https://navidrome.example.com \
-e NAVIDROME_USER=you \
-e NAVIDROME_PASS=change-me \
-e STATS_API_TOKEN=$(openssl rand -hex 24) \
-v navidrome-stat-data:/data \
stepaniah/navidrome-statistic:v0.8.1 NAVIDROME_URL=https://navidrome.example.com
NAVIDROME_USER=example_user
NAVIDROME_PASS=change-me
STATS_API_TOKEN=use-a-long-random-value 配置 STATS_API_TOKEN 后,首次访问在登录页输入一次即可——浏览器只保存 HttpOnly 会话 Cookie,而非 token 本身。
完整配置参考默认私密
-
数据留在本地
收听历史只存在于你自己数据卷里的一个 SQLite 文件。
-
随时导出或删除
设置页内置按用户的 JSON 导出、导入与删除。
-
可选认证
配置 STATS_API_TOKEN 后仪表盘与 API 均需登录——会话使用 HttpOnly Cookie。
-
零遥测
容器唯一的外呼对象就是你的 Navidrome 服务器。
诚实的局限
-
一组数据源只跑一个实例
多个实例轮询同一批服务器会导致播放被重复计数。
-
SQLite 明文存储
数据库与设置页保存的凭据均为明文——请像对待机密一样保护数据卷。
-
不内置 TLS
远程访问请置于你的 HTTPS 反向代理之后。
常见问题
支持哪些播放客户端?
任何兼容 Subsonic 的客户端——DSub、Symfonium、Feishin、play:Sub、substreamer、Navidrome 网页端等。统计数据来自服务器端的 getNowPlaying 接口,客户端无需安装任何东西。
可以追踪多台 Navidrome 服务器吗?
可以。在 设置 → 连接 中逐一添加;播放按来源标记,仪表盘可按服务器筛选。
一次播放是如何判定的?
累计有效收听时长需超过 PLAY_THRESHOLD_SEC(默认 30 秒)。暂停与失联时段不计入;检查点更新同一条记录;未达阈值就结束的会话会单独保存为播放尝试,不计为播放。
支持 Jellyfin 或 Airsonic 吗?
任何讲 Subsonic API 的服务器都可以,但项目只针对 Navidrome 开发与测试。服务器支持的 OpenSubsonic 扩展会被自动采用。
我的数据存在哪里?
在你自己磁盘上容器 /data 卷中的一个 SQLite 文件里。你可以在设置页将其导出为 JSON、导入到别处,或删除某个用户的收听历史。
它占用资源多吗?
一个轻量容器、一个 SQLite 文件、10 秒一次的轮询——树莓派也能轻松跑。