跳转到正文

自托管 · 开源 · MIT

每一次播放,都算数。

Navidrome Stat 轮询 Navidrome 服务器的 getNowPlaying 接口,把所有 Subsonic 客户端的播放汇聚成一块自托管仪表盘——收听时长、趋势、榜单和年度回顾。数据从不离开你的机器。

正在收听

Blue in Green

Miles Davis — Kind of Blue

1:05 5:37
Feishin · home-nas
Product Hunt 首发 MIT 许可证 Docker Hub — stepaniah/navidrome-statistic 10 套主题 · 5 种语言 · 任意 Subsonic 客户端

你的收听历史,值得被完整呈现

Navidrome 的各个客户端彼此不共享统计。Navidrome Stat 改为在服务器端观测——所有客户端,同一条历史。

实时正在播放
  • B

    So What

    DSub · 2m ago

  • T

    Take Five

    Symfonium · 14m ago

  • G

    Goodbye Pork Pie Hat

    Feishin · 31m ago

所有客户端,同一条历史

DSub、Symfonium、Feishin、网页播放器——任何 Subsonic 客户端的播放都汇入同一条历史,多台 Navidrome 服务器也不例外。

DSub Symfonium Feishin Navidrome Stat

足够深的图表

按小时与按天的趋势、星期×小时热力图、客户端占比、转码率,以及艺术家、专辑、曲目榜单。

年度回顾

年度总量、连续收听天数,以及你的年度艺术家、专辑与曲目——属于你自己的 Wrapped,基于你自己的数据。

3,847 412 h 21 d → 年度回顾

封面代理与缓存

专辑封面经过带鉴权的、容量受限的缓存——你的音乐库保持私密。

数据由你做主

一切都在一个属于你的 SQLite 文件里。按用户导出、导入与删除,可选 token 认证,零遥测。

JSON 导出与导入按用户删除可选 token 认证

十套主题

Catppuccin、Nord、Dracula、Tokyo Night、Gruvbox、Solarized——即时切换。

五种语言

简体中文、繁體中文、English、日本語、Deutsch——更多语言已在路线图上。

English简体中文繁體中文日本語Deutsch

主题随你挑

十套内置主题,整个仪表盘即时换色。点一个试试:

localhost:39421

你的年度音乐报告

一页看尽一整年:总量、连续天数,和陪你走过这一年的歌。

0
次播放
0
小时收听
0
位艺术家
0
天连续收听

年度曲目

Blue in Green

214

示例数据——真实数字来自你自己的曲库。

2025 · 示例曲库

你的年度音乐报告

0

次播放

412
小时收听
486
位艺术家
21
天连续收听

年度曲目

示例数据——真实数字来自你自己的曲库。

工作原理

无需客户端插件、无需注册、不上云。一个轻量容器,守在你的音乐服务器旁边。

  1. 1

    轮询 getNowPlaying

    每 10 秒(可配置)通过 Subsonic API 向每台 Navidrome 服务器询问正在播放的内容——接口本来就在。

  2. 2

    追踪真实会话

    暂停与中断不计入。累计有效收听超过阈值(默认 30 秒)才算一次播放。

  3. 3

    存储并呈现

    有效播放写入你磁盘上的 SQLite,在 39421 端口的自包含仪表盘中呈现。

当服务器支持 OpenSubsonic playbackReport 扩展时会自动采用,让进度与时长统计更精确。

一个 compose 文件即可启动

复制、粘贴,打开 39421 端口。建议锁定版本号,保证更新可复现。

compose.yaml
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:

配置 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 秒一次的轮询——树莓派也能轻松跑。