跳至主要內容

自託管 · 開源 · 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 18 組色板 · 7 種語言 · 任意 Subsonic 用戶端

你的收聽歷史,值得被完整呈現

Navidrome 的各個用戶端彼此不共享統計。Navidrome Stat 改為在伺服器端觀測——所有用戶端,同一條歷史。

即時正在播放
  • B

    So What

    DSub · 2m ago

  • T

    Take Five

    Symfonium · 14m ago

  • G

    Goodbye Pork Pie Hat

    Feishin · 31m ago

3 個用戶端 · 2 台伺服器 · 即時更新

所有用戶端,同一條歷史

DSub、Symfonium、Feishin、網頁播放器——任何 Subsonic 用戶端的播放都匯入同一條歷史,多台 Navidrome 伺服器也不例外。

DSub Symfonium Feishin Navidrome Stat

足夠深的圖表

按小時與按天的趨勢、星期×小時熱力圖、用戶端佔比、轉碼率,以及可下鑽到可分享詳情頁的藝術家、專輯、曲目排行榜——支援時段與週期對比。

年度回顧

年度總量、連續收聽天數,以及你的年度藝術家、專輯與曲目——屬於你自己的 Wrapped。可按年份、伺服器、使用者與時區劃定範圍,並透過連結分享。

3,847
次播放
412
小時收聽
21
天連續收聽

→ 年度回顧

封面代理與快取

專輯封面經過帶驗證的、容量受限的快取——你的音樂庫保持私密。

已快取 1,024 張封面 · 128 MB

資料由你做主

一切都在一個屬於你的 SQLite 檔案裡。按使用者匯出、匯入與刪除,可選 token 驗證,零遙測。

JSON 匯出與匯入按使用者刪除可選 token 驗證

18 組色板,明暗俱全

九個色板家族——Catppuccin、Nord、Dracula、Tokyo Night、Gruvbox、Solarized 等——每個都有配套的明暗變體。

七種語言

简体中文、繁體中文、English、日本語、Deutsch、Français、Español。

English简体中文繁體中文日本語DeutschFrançaisEspañol

主題隨你挑

九個色板家族、明暗成對,整個儀表板即時換色。點一個試試:

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 擴充時會自動採用,讓進度與時長統計更精確。還可以監看一個 Navidrome 智慧播放清單,把安裝前的收聽歷史匯入為估算播放。

一個 compose 檔即可啟動

複製、貼上,開啟 39421 連接埠。建議鎖定版本號,確保更新可重現。

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

設定 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 伺服器嗎?

可以。在 設定 → 連線 中逐一新增;播放按來源標記,儀表板可按伺服器或使用者篩選。

我已經累積了好幾個月的播放紀錄,能匯入嗎?

可以。讓某個已儲存的連線監看一個 Navidrome 智慧播放清單(.nsp,例如「最近播放」),Navidrome Stat 會按每首歌的最近播放時間戳匯入一條估算播放。重複執行不會重複計數,已被即時輪詢涵蓋的播放會跳過,且只匯入安裝之前的收聽。

看到的檢視能分享嗎?

能。儀表板篩選條件、藝術家與專輯詳情頁以及年度回顧的範圍都保存在 URL 裡——重新整理不丟檢視,複製連結即可分享。用戶端詳情頁的名稱透過 POST 請求傳送,不會出現在可分享的 URL 中。

一次播放是如何判定的?

累計有效收聽時長需超過 PLAY_THRESHOLD_SEC(預設 30 秒)。暫停與失聯時段不計入;檢查點更新同一條記錄;未達門檻就結束的工作階段會單獨保存為播放嘗試,不計為播放。

合作藝術家是如何計數的?

在 設定 → 偏好 中可選擇合併或拆分藝術家署名。拆分模式下每次播放為每位參與藝術家各計一次,而曲目數、總播放次數與總收聽時數保持不變。

支援 Jellyfin 或 Airsonic 嗎?

任何講 Subsonic API 的伺服器都可以,但專案只針對 Navidrome 開發與測試。伺服器支援的 OpenSubsonic 擴充會被自動採用。

和 Last.fm 或 Maloja 有什麼不同?

Last.fm 把 scrobble 存在別人的雲端;Maloja 雖然自託管,但仍依賴用戶端主動提交收聽記錄。Navidrome Stat 完全不需要用戶端配合——它直接觀測伺服器自己的 now-playing 資料流,任何 Subsonic 用戶端預設被涵蓋,資料也只留在你的磁碟上。

我的資料存在哪裡?

在你自己磁碟上容器 /data 卷中的一個 SQLite 檔案裡。你可以在設定頁將其匯出為 JSON、匯入到別處,或刪除某個使用者的收聽歷史。

它佔用資源多嗎?

一個輕量容器、一個 SQLite 檔案、10 秒一次的輪詢——樹莓派也能輕鬆跑。