在《我的音乐库解决方案》一文中,我简要地介绍了现阶段我在 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 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 显示歌词的样子。目前只能显示内嵌歌词。
移动设备上是这样的。
顺便一提,我内嵌的是双语歌词,正常来说它应该显示成上下两行。
现在朱军知道 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 获取到的本地歌词
就到这儿了,关于 Navidrome、音流或是 Symfonium 上其余的功能,就请诸位自行发现和体验吧!
参考
本文作者:mikusa
本文链接:https://www.himiku.com/archives/navidrome.html
版权声明:所有文章除特别声明外均系本人自主创作,转载及引用请联系作者,并注明出处(作者、原文链接等)。
音流买了以后可以按文件夹听音乐,配合emby还是挺棒的。
最近在研究搭建音乐库,博主的几篇博文给了我很多指导
本着能用就不部署多余服务的想法,我还在折腾jellyfin,大佬知道jellyfin怎么重新生成元数据吗?我遇到一个问题是jellyfin识别那种多个artist的情况好像处理的有问题,就是 A feat. B, 我已经通过Picard刮削过元数据了,还是有很多A feat. B在artist那个tab,album artist则没问题,不知道重新生成元数据能否解决
关于内外网,线路切换,我的做法是服务器地址填写域名(一般就算不买域名,服务器的hostname+端口在内网也是可以访问的),我的路由器貌似会自动处理好,因为我验证过禁掉手机的外网访问权限,不影响通过域名访问
如果路由器不能自动处理,一般配置下路由器的/etc/hosts即可或者DHCP给服务器设置静态IP和主机名
另外反代可以了解下caddy,linuxserver/swag,其实跟nginx差不多,但可以自动帮你处理HTTPS证书的颁发和管理
问一下那个大佬可以告诉我win10系统下怎么修改转码,提示禁止修改需要改什么文件,我是win10系统找那个文件,谢谢了
有个开源的整理元数据的,有人用过嘛?https://github.com/xhongc/music-tag-web
效果一般,个人不建议主用这个
自己装的黑群晖,搭上Navidrome后,通过映射端口可以访问网页端,但是链接地址输入到音流上连接不上,链接是https(映射必须设置自动https,不然映射不出来),音流是只支持http的吗?还有没有其他的客户端可以用?
应该 http https都可以的啊,你用ip加端口直连能行吗?
不行……还试了zerotier和tailscale组网,这俩能连上,但是都不好用,总是断
放弃了……
之前用过substreamer和subtrack,不太符合我习惯,这个音流确实会好点。感谢推荐
不知道支持CUE了没
更新:如果id username返回失败的话,在yaml配置中可以删除user选项(搭建设备:树莓派4;系统环境:debian for pi)
直接 id 也失败吗?
嗯,1000:1000也不行
不是,我意思是直接shell 里输入 id,也没东西显示吗?
音流除了支持Navidrome外,同样支持Jellyfin和群晖的Audio Station,请问大佬Navidrome相比这俩有什么优点呢?我在犹豫,要不要搭建一下Navidrome还是直接用现成的Jellyfin(之前已经搭建好)?
那用现成的 Jellyfin 就好
如果使用 Jellyfin 作为服务端的话,应该是不影响音流 APP 的元数据匹配能力和歌词显示的吧?
这我倒没测试过,你可以实际测试下看看,然后顺便告诉我一声👀
音流没有元数据匹配功能,依靠自定义API,API查询正确前提是你的歌曲名字什么的都正确
放弃 Jellyfin 了哈哈哈,还是和博主一样搭建 Navidrome 好看一点,不然电影、电视剧和音乐混在一起总感觉有点不搭配 顺便问下博文,添加自建的 API 后音流的自动抓取封面的功能正常嘛?我这边歌词可以正常抓取,但是有很多专辑的封面是无法抓取到的(大概能成功一般的样子),那会儿没办法被迫开始尝试博主推荐的 MusicBrainz 来刮削了哈哈哈,这软件真太牛了呀,四五年前我歌曲修改元数据好像是用 Foobar2000 手动修改的,工作量巨大并且手动填写信息不太准确,太感谢博主了
不过音流 + 自建 API 的自动抓取封面功能正常与否已经不重要了,用 MusicBrainz 来刮削可以解决一切问题 最喜欢这样了,我在 Jellyfin 上就是类似的操作,用 TMM 刮削电影、电视剧,这样可以保证各个平台的数据都是正常的
感谢感谢,折腾了一晚上,我现在用 Navidrome + 音流 + 博主之前推荐的 MusicBrainz 解决一切问题哈哈哈,这一套组合拳下来在 iOS 端听歌就非常舒服了,五六年前我刚组 NAS 的时候就想着找一套音乐解决方案,一直没有特别满意的,现在终于搞定了
不会麻烦啊,我就是plex全家桶,电视电影音乐一个软件搞定,方便滴很。navidrome基本没用过 OωO
刚再次尝试了一下 Jellyfin,确实感觉还不错,只要歌曲已经通过 MusicBrainz 刮削完成那就可以正确识别 不过还是有一点小问题,对于同一张专辑的多张 CD,比如毛不易的《平凡的一天》和邓紫棋的《旗开得胜》都是有 CD1 和 CD2 的,Jellyfin 会认为两张 CD 是不同的专辑,在专辑列表里显示两次,看着不舒服,但 Navidrome 和 Audio Station 就不存在这个问题……不知道 plex 有这个问题嘛?
jellyfin 我不知道,plex是可以正确显示分碟的,不会分开显示两次。有用 MusicBrainz 处理过也还是这样?那可以找个破解版 emby 再试试,就音乐而言 emby 会比 jellyfin 好一些。
我研究了一下,对于 Jellyfin 来说,如果分碟是放在同一张专辑的不同子目录下的(例如
邓紫棋 - 旗开得胜/CD1
和邓紫棋 - 旗开得胜/CD2
),它就不能正确识别,会识别出来两张相同名字和封面的专辑。但如果手动把子目录下的歌曲迁移到专辑目录下(合并一下),那就可以正确识别了 目前用 Jellyfin 感觉还不错,虽然网页版不能显示歌词,但音流也提供了 Win 客户端,不影响大佬,您plex是从哪入的永久,我现在emby永久感觉听歌不如plex music 啊
官网买的
音流我用了一周多了,移动端感觉还可以,有很多小bug和细节问题,但总体还行.Win端就不太行,布局操作什么的都挺难受的(颜值也不太好看).再考虑到作者一个人更新,也不知道什么时候能改改(感觉作者有意为之的甚至不会改)
建议来用plex ΦωΦ