在《我的音乐库解决方案》一文中,我简要地介绍了现阶段我在 NAS 上自建音乐库的一些方案。可无论是 Jellyfin、Emby 还是 Plex,它们都不是专门为音乐设计的媒体程序。即使这些软件都具备播放音乐的功能,界面也十分美观,但它们的核心用途终究还是在视频上。因此,我也只建议同时有视频观看需求的朋友部署这类媒体程序,这样才不会在使用时因为程序有太多用不上的功能而感到困扰。

其实,在写完音乐库程序推荐后没多久,我就发现了一款开源的音乐服务器软件「Navidrome」。只是相比御三家,Navidrome 的界面虽然采用的是 Material Design 设计,但就显示效果来看并不符合我个人的审美需求;网页端虽然全平台通用,无需担心兼容的问题,但在移动设备上还是需要有一个 App 方便即开即用;即使兼容 Subsonic/Madsonic/Airsonic 等一系列音乐流媒体协议,但市面上的大部分支持这些协议的播放器都是英文,几乎没有汉化,用着也十分不趁手;对歌词的显示效果,也称不上优雅……

如此这番批判下,想必你也能理解我为何没有及时安利 Navidrome 了。可现在水文推荐的原因又是什么呢?这两天水群的时候,看到群友推荐了一款国人开发的音乐播放器程序「音流」,界面符合国人审美,设计简洁,功能实用,间接性地解决了 Navidrome 不好看也不好用的痛点。因此,Navidrome 也就值得推荐给大家一试了。

安装

推荐使用 Docker Compose 安装 Navidrome。创建 docker-compose.yml 文件,填入以下内容:

services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    user: 1026:100 #用户id,详细解释见后文
    ports:
      - 4533:4533 #左侧端口如有冲突,可随意修改
    volumes:
      - ./navidrome:/data #数据路径
      - /volume1/media/music:/music:ro #音乐路径
    environment:
      #程序默认语言
      - ND_DEFAULTLANGUAGE=zh-Hans
      #启用GRAVATAR头像
      - ND_ENABLEGRAVATAR=true
      #关闭转码,如需要转码请设置为true
      - ND_ENABLETRANSCODINGCONFIG=false
      #SPOTIFY相关
      # - ND_SPOTIFY_ID=
      # - ND_SPOTIFY_SECRET=
      #LAST.FM相关
      # - ND_LASTFM_LANGUAGE=zh
      # - ND_LASTFM_APIKEY=
      # - ND_LASTFM_SECRET=
      #启用外挂歌词,以下为默认配置,可取消注释后自行修改
      # - ND_LYRICSPRIORITY=.ttml,.yaml,.yml,.elrc,.lrc,.srt,.txt,embedded
      #PROXY相关
      # - HTTP_PROXY=http://proxy:port
      # - HTTPS_PROXY=http://proxy:port
      #插件相关
      # - ND_PLUGINS_ENABLED=true
      # - ND_PLUGINS_AUTORELOAD=true
    restart: unless-stopped

关于 user 部分,Navidrome 不建议使用 root 用户运行。群晖管理员用户一般是 1026:100 ,可以使用该用户登录 SSH 终端后输入 id username 查询。例如我的群晖用户名是 mikusa :

$ id mikusa
uid=1026(mikusa) gid=100(users) groups=100(users),101(administrators),65537(docker)

如果实在是无法确定或者懒得查,那就填 1000:1000。

在 volumes 文件夹挂载部分,官方建议为音乐文件夹设置只读 :ro 标记以保证不修改音乐文件。群晖用户同时需要注意预创建 navidrome 数据文件夹。

而环境变量的部分,虽然官方文档有数十条可供选择的环境变量,但实际上用到的配置不多,除了固定语言、关闭转码以外,都是些不影响使用的功能。

如果你想让 Navidrome 显示歌手头像,那么需要配置 Spotify 相关的部分。你需要先创建一个 Spotify 账户,随后在 https://developer.spotify.com/dashboard/applications 中 Create app 创建一个应用。

只需填写 App name、App description 以及 Redirect URI 这三处,Redirect URI 需要填写 http://localhost/ ,即可保存。

随后返回控制台,点击应用,进入应用设置,即可获取 Client ID 和 Client secret。对应填入环境变量中的 ND_SPOTIFY_ID 和 ND_SPOTIFY_SECRET 。

如果你想让 Navidrome 显示歌手简介、热门歌曲等相关信息,就需要在环境变量中配置 Last.fm。同样先创建一个 Last.fm 帐户,前往 https://www.last.fm/zh/api/account/create 创建 API 帐户,只用填写应用名称。提交后在 API 应用程序 页面复制粘贴 Key 和 Secret 到环境变量即可。

上述两项外部功能,视个人网络状况而定,如果无法使用,你可能还需要配置 proxy 项。

如果你有增减环境变量的需求,请参考官方文档。

如果你需要使用域名访问 Navidrome,这里提供一个简单的 Nginx 反向代理配置:

server {
    listen 80;
    server_name navidrome.you.domain;
    return 301 https://navidrome.you.domain$request_uri;
}

server {
    listen 443 ssl http2;
    server_name navidrome.you.domain;
    #SSL配置省略
    location / {
        proxy_pass http://navidrome:4533;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Protocol $scheme;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_buffering off;
    }
    access_log /home/wwwlogs/navidrome.log;
}

使用

启动容器后,Navidrome 便可以直接使用了,几乎不需要其他额外的设置。

初次访问 IP:4533,Navidrome 会要求你先创建管理员账户。

因为环境变量中已经配置了默认语言,所以不用再修改用户语言,直接就是中文。

虽然 Navidrome 没有像 Plex 那样严格从 MusicBrainz 中获取音乐数据,但你仍可以参考《MusicBrainz 不完全使用指南》为音乐添加 ID3Tags 信息后,再添加到 Navidrome 中。

总之,只要你准备好音乐,Navidrome 就可以做到开箱即用。

这是专辑页
这是专辑页

在安装 Navidrome 时配置的 Spotify 和 Last.fm,最终会让艺术家页可以显示头像和简介等相关信息。

即使你不配置 Last.fm 相关的环境变量,也可以在个性化设置中勾选「启用 Last.fm 的喜好记录」,通过 Last.fm 记录你听过的音乐。

在跳转的授权页面登录 Last.fm 账户,允许访问即可。Navidrome 中,每个用户都可以配置自己的 Last.fm 账户,记录播放过的音乐。

只要网络没问题,几乎可以实时查看正在播放的音乐。

忘了介绍,这是 Navidrome 显示歌词的样子。目前仍只能显示歌曲文件内嵌歌词,外挂歌词仅供客户端读取使用。

移动设备上是这样的。

顺便一提,我内嵌的是双语歌词,正常来说它应该显示成上下两行。

Plex上的效果
Plex上的效果

现在朱军知道 Navidrome 在歌词的支持上有多糟糕了吧。 蛆音娘_摊手

歌词

Navidrome 在 v0.56.0 版本增加了识别外挂歌词的能力,又在 v0.63.0 支持了更多的歌词格式。虽然外挂 LRC 功能官方仍然明确定位为供类 Subsonic 客户端使用,但 v0.57.0 新增的插件系统又提供了使用插件获取歌词的能力。

因此在歌词这块,即便仍有不足,就现状来看已经算是有不错的体验了。这里推荐一个插件,简单配置就可以在使用第三方客户端时自动下载歌词。

项目地址:navidrome-lyrics-plugin

首先,在 compose.yml 环境变量配置中,新增启用插件、修改支持的歌词格式的变量:

      #插件相关
      - ND_PLUGINS_ENABLED=true
      - ND_PLUGINS_AUTORELOAD=true
      #启用外挂歌词
      - ND_LYRICSPRIORITY=.ttml,.yaml,.yml,.elrc,.lrc,.srt,.txt,embedded,nd-lyrics

同时,音乐库要授予读写权限:

- /mnt/music:/music:rw

接着,在 data/plugins 文件夹内,下载插件文件:

curl -L \
  https://github.com/J0R6IT0/navidrome-lyrics-plugin/releases/download/v7.2.0/nd-lyrics.ndp \
  -o nd-lyrics.ndp

重载容器后,在 Navidrome 插件设置中配置插件。推荐如下配置,可以启用网易云音乐歌词源。未截图部分保持默认:

不过,从网易云上获取的歌词经常都是原版,极少有双语。


以下方案不再推荐,仅供参考

群友告诉我说有一款开源的歌词/封面 API 程序「LrcApi」,可以直接用在音流上。怪不得音流的付费项不是这个。

根据官方介绍,LrcApi 为音流量身打造。支持酷狗/聚合API获取LRC歌词,支持获取音乐/专辑/艺术家封面。安装倒也很简单,Compose 一把梭:

services:
  lyricapi:
    image: hisatri/lyricapi:latest
    container_name: lyricapi
    ports:
      - 28883:28883
    environment:
      - TZ=Asia/Shanghai
      # - API_AUTH=自定义一个鉴权key
    volumes:
      - /volume1/media/music:/music:ro #和Navidrome一致的音乐路径
    restart: unless-stopped

关于 volumes 挂载部分,如果你正在使用 Navidrome,可以将 Navidrome 的音乐路径映射到容器中,这样 LrcApi 可以直接使用你本地已存在的的 LRC 歌词。直接解决了 Navidrome 不能使用本地歌词的问题。

关于环境变量中 API_AUTH 的部分,如果你公开创建了 LrcApi 但是不想让别人白嫖,那么就可以填写这个环境变量,为 LrcApi 加上一个密码(header 鉴权),只有密码正确才能在音流中使用。

接着再配合 Nginx 反向代理。你可以把 LrcApi 放在 Navidrome 同一个 Nginx 配置里:

    location /jsonapi {
        proxy_pass http://lyricapi:28883/jsonapi;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }

这样,就可以直接通过你的 Navidrome 的链接加上 /jsonapi 来访问这个 API。

或者,你不喜欢用 /jsonapi 访问,只要将 location /jsonapi 中的 /jsonapi 改成你喜欢的就行了。比如改成 /lrc 。你就可以在音流中填写 https://navidrome.you.domain/lrc 来使用 LrcApi。

不过, LrcApi 目前还不支持获取带译文的歌词,希望后续能支持使用网易云音乐的歌词源。所以,有使用 Navidrome 的朋友,并且本地保存了不少 LRC 歌词的话,还是自建一个 LrcApi 效果会比较好。

  • 图1:正式版音流的付费项
  • 图2:音乐付费接口,把你创建的 API 或网上公开的 API 填写到地址中,如果有密码鉴权就把密码填在验证信息一栏中
  • 图3:通过 API 获取到的歌词
  • 图4:通过 API 获取到的本地歌词
图1
图1
图2
图2
图3
图3
图4
图4

App

为了能让 Navidrome 变得稍微好用一点点,我的建议是使用第三方客户端。Navidrome 目前支持 Subsonic/Madsonic/Airsonic 协议,市面上(iOS App Store)已经有许多支持这类协议的客户端,只不过绝大多数都不支持中文。

Amperfy

Amperfy 是免费的 iPhone/iPad/macOS Subsonic 客户端,界面比较类似 Apple music。目前项目明确支持 Subsonic 的普通歌词和同步歌词,它的 Release 里已经把 synced lyrics 列为功能。不支持中文(2026.8.30)。

App Store 现在已有正式版:Amperfy Music 。

音流

「音流」是一款国人开发的音乐播放器,布局类似于网易云音乐,上手基本没有门槛。你可以在音流官网获取 Android 安装包,或直接在 iOS App Store 搜索「音流」下载。 (2023.11.25)

这里不过多介绍音流的使用方法。我们只要填入 Navidrome 地址、用户名和密码登录后,就可以进入音流首页。如果你的音乐很多,那音流可能需要先扫描一会儿。

接着,你应该注意到了首页「主线路」这三个字。这是音流中最让我感到惊喜的功能,它支持主备线路切换。也就是说,你可以主线路填内网地址,备用线路填外网地址。这样当你出门的时候,音流可以自动切换到外网地址上,而当你回到家中,又自动切换回内网。由于流媒体有缓存,切换网络的过程播放音乐不会中断。

但是,线路自动切换在正式版中为付费功能。

音流的各方面都很像网易云。首页按最新专辑、每日推荐、最近播放、最常播放和随机专辑依次排列。其中,每日推荐是随机的五十首音乐。若是觉得这五十首不合现在的心情,还可以立刻刷新换一批,是个不错的功能。

播放页面可以左滑进入推荐,右滑进入歌词。音流支持读取音乐中内嵌的歌词,并以双语上下两行显示。

Symfonium

评论区有朋友推荐了「Symfonium」,仅上线 Android 端。试用了下确实不错。内购售价 5 美元。(2025.6.11)

与音流不同,Symfonium 设计语言更贴近 Android 的 Material You,功能也更加强大。支持连接 Plex、Emby、Jellyfin、Subsonic、OpenSubsonic、Kodi、Samba (SMB v2/v3)、WebDAV 服务器,并支持直连云提供商(Google Drive、OneDrive、DropBox、Box),比目前音流能连接的服务多得多。

可能 UI 上不如音流来得简洁美观,但能自定义相当多的功能,扫库也比音流要快,算是优点之一吧。

参考