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

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

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

以下操作均于搭载 DSM 7.2.1-69057 Update 3 的 DS220+ 中进行,Docker Compose 版本为 2.25.0。

安装

推荐使用 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=
      #PROXY相关
      # - HTTP_PROXY=http://proxy:port
      # - HTTPS_PROXY=http://proxy:port
    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 nameApp description 以及 Redirect URI 这三处,Redirect URI 需要填写 http://localhost/ ,即可保存。

随后返回控制台,点击应用,进入应用设置,即可获取 Client IDClient secret。对应填入环境变量中的 ND_SPOTIFY_IDND_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 在歌词的支持上有多糟糕了吧。

App

为了能让 Navidrome 变得稍微好用一点点,我的建议是使用第三方客户端。

音流

Navidrome 目前支持 Subsonic/Madsonic/Airsonic 协议,市面上(iOS App Store)已经有许多 Subsonic/Madsonic/Airsonic 的客户端,但它们都没有中文。「音流」的出现,让中文用户多了一种选择。

音流」是一款国人开发的音乐播放器,支持 Subsonic/Navidrome/Jellyfin/Emby/AudioStation,现已登录 Android、iOS,未来可能支持 Windows 和 tvOS 平台。音流采用 Flutter 开发,界面简洁美观,整体以透明和高斯模糊为主,布局类似于网易云音乐,上手基本没有门槛。你可以在音流官网获取 Android 安装包,或直接在 iOS App Store 搜索「音流」下载。

这里不过多介绍音流的使用方法(真没什么好说的地方)。我们只要填入 Navidrome 地址、用户名和密码登录后,就可以进入音流首页。

如果你的音乐很多,那音流可能需要先扫描一会儿。

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

但我说不准正好准备缓冲下一首的时候切换了网络,会不会造成软件崩溃。

实测音乐是会卡住的,可能是我 Navidrome 的问题。

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

播放页面可以左滑进入推荐,右滑进入歌词。音流支持读取音乐中内嵌的歌词,并以双语上下两行显示。如果音流后续收费,我猜可能会从提供歌词 API 入手。只要买断切价格适中,可以考虑入手。猜错了,不是歌词。

Symfonium

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

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

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

歌词

群友告诉我说有一款开源的歌词/封面 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

就到这儿了,关于 Navidrome、音流或是 Symfonium 上其余的功能,就请诸位自行发现和体验吧!

参考


  1. 官方 Github 有个两年前的关于「支持外挂 LRC」的 issue,现在还打开着……
  2. 线路自动切换在正式版中为付费功能。