- B
So What
DSub · 2m ago
- T
Take Five
Symfonium · 14m ago
- G
Goodbye Pork Pie Hat
Feishin · 31m ago
3 个客户端 · 2 台服务器 · 实时更新
自托管 · 开源 · MIT
Navidrome Stat 轮询 Navidrome 服务器的 getNowPlaying 接口,把所有 Subsonic 客户端的播放汇聚成一块自托管仪表盘——收听时长、趋势、榜单和年度回顾。数据从不离开你的机器。
Blue in Green
Miles Davis — Kind of Blue
Navidrome 的各个客户端彼此不共享统计。Navidrome Stat 改为在服务器端观测——所有客户端,同一条历史。
So What
DSub · 2m ago
Take Five
Symfonium · 14m ago
Goodbye Pork Pie Hat
Feishin · 31m ago
3 个客户端 · 2 台服务器 · 实时更新
DSub、Symfonium、Feishin、网页播放器——任何 Subsonic 客户端的播放都汇入同一条历史,多台 Navidrome 服务器也不例外。
按小时与按天的趋势、星期×小时热力图、客户端占比、转码率,以及可下钻到可分享详情页的艺术家、专辑、曲目榜单——支持时段与周期对比。
年度总量、连续收听天数,以及你的年度艺术家、专辑与曲目——属于你自己的 Wrapped。可按年份、服务器、用户与时区划定范围,并通过链接分享。
专辑封面经过带鉴权的、容量受限的缓存——你的音乐库保持私密。
已缓存 1,024 张封面 · 128 MB
一切都在一个属于你的 SQLite 文件里。按用户导出、导入与删除,可选 token 认证,零遥测。
九个色板家族——Catppuccin、Nord、Dracula、Tokyo Night、Gruvbox、Solarized 等——每个都有配套的明暗变体。
简体中文、繁體中文、English、日本語、Deutsch、Français、Español。
九个色板家族、明暗成对,整个仪表盘即时换色。点一个试试:
一页看尽一整年:总量、连续天数,和陪你走过这一年的歌。
年度曲目
Blue in Green
示例数据——真实数字来自你自己的曲库。
无需客户端插件、无需注册、不上云。一个轻量容器,守在你的音乐服务器旁边。
每 10 秒(可配置)通过 Subsonic API 向每台 Navidrome 服务器询问正在播放的内容——接口本来就在。
暂停与中断不计入。累计有效收听超过阈值(默认 30 秒)才算一次播放。
有效播放写入你磁盘上的 SQLite,在 39421 端口的自包含仪表盘中呈现。
当服务器支持 OpenSubsonic playbackReport 扩展时会自动采用,让进度与时长统计更精确。还可以监视一个 Navidrome 智能播放列表,把安装前的收听历史导入为估算播放。
复制、粘贴,打开 39421 端口。建议锁定版本号,保证更新可复现。
services:
navidrome-stat:
image: stepaniah/navidrome-statistic:v0.9.2
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.9.2 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 中明文存储。设置页保存的凭据经本地密钥文件加密存放——防的是随手翻看备份,防不了已被完全攻陷的主机。
远程访问请置于你的 HTTPS 反向代理之后。
任何兼容 Subsonic 的客户端——DSub、Symfonium、Feishin、play:Sub、substreamer、Navidrome 网页端等。统计数据来自服务器端的 getNowPlaying 接口,客户端无需安装任何东西。
可以。在 设置 → 连接 中逐一添加;播放按来源标记,仪表盘可按服务器或用户筛选。
可以。让某个已保存的连接监视一个 Navidrome 智能播放列表(.nsp,例如"最近播放"),Navidrome Stat 会按每首歌的最近播放时间戳导入一条估算播放。重复执行不会重复计数,已被实时轮询覆盖的播放会跳过,且只导入安装之前的收听。
能。仪表盘筛选条件、艺术家与专辑详情页以及年度回顾的范围都保存在 URL 里——刷新不丢视图,复制链接即可分享。客户端详情页的名称通过 POST 请求发送,不会出现在可分享的 URL 中。
累计有效收听时长需超过 PLAY_THRESHOLD_SEC(默认 30 秒)。暂停与失联时段不计入;检查点更新同一条记录;未达阈值就结束的会话会单独保存为播放尝试,不计为播放。
在 设置 → 偏好 中可选择合并或拆分艺术家署名。拆分模式下每次播放为每位参与艺术家各计一次,而曲目数、总播放次数与总收听时长保持不变。
任何讲 Subsonic API 的服务器都可以,但项目只针对 Navidrome 开发与测试。服务器支持的 OpenSubsonic 扩展会被自动采用。
Last.fm 把 scrobble 存在别人的云端;Maloja 虽然自托管,但仍依赖客户端主动提交收听记录。Navidrome Stat 完全不需要客户端配合——它直接观测服务器自己的 now-playing 数据流,任何 Subsonic 客户端默认被覆盖,数据也只留在你的磁盘上。
在你自己磁盘上容器 /data 卷中的一个 SQLite 文件里。你可以在设置页将其导出为 JSON、导入到别处,或删除某个用户的收听历史。
一个轻量容器、一个 SQLite 文件、10 秒一次的轮询——树莓派也能轻松跑。