如果你有NAS,可以尝试搭建Navidrome全能音乐播放平台
在折腾电子产品的过程中,深切感受到需求往往是递进时的,往往在实现了一个功能之后又会产生新的需要,继续搜寻资料不断尝试,如此不断往复,就形成了自己的不断扩张的知识树。这又像是蝴蝶效应,就是因为我刷坏了一个国砖便携播放器,而在闲鱼上购进了一个iPod Classic,为了能够装满128GB的空间,又开始尝试在NAS上搭建一套自助下载音乐的系统。如果大家回顾我近期的几篇文章,就能够知晓这些尝试的心路历程。
IPC虽然可玩性不错,但是局限性也很明显,默认系统只支持自家的ALAC无损格式,对于主流的FLAC等音乐格式并不支持;另一方面,下载的音频文件多了,迫切需要一个工具来集中管理存放在NAS上的音乐资源。于是我做了一番研究:
其实,音频文件也是媒体文件的一种,不少NAS播放类解决方案同样支持,比如我曾经介绍过的Emby和Jellyfin,个人在踩坑无数之后,更推荐解锁版的Emby。当然,如果需要一款专业的音乐播放Docker,还是有不少其他的方案可以选择,这里列出了几款常见Docker的功能比较。

经过一番搜索,发觉Navidrome似乎在音乐爱好者们中接受度更高,于是尝试把玩了一番,将折腾的经过整理于此。
注册Last.fm和Spotify获取API
Navidrome可以从Last.fm和Spotify获取专辑信息和图像,所以首先要在这两个音乐网站注册免费账号。
然后到这个地址申请一个API。表单里只有Application name是必填项。

随后页面将会显示专属的API信息,将API Key和Shared secret保存下来。

同理,创建Spotify的免费账号,然后在这个地址里Create app。

输入一些基本信息。

将生成APP的Client ID和Client secret保存下来。

创建Navidrome的Docker
docker-compose.yml 代码如下
version: "3"
services:
navidrome:
image: deluan/navidrome:latest
ports:
- "4533:4533" # 左边可以改成自己服务器未被占用的端口
environment:
# Optional: put your config options customization here. Examples(这些都是可选的):
ND_SCANSCHEDULE: 1m
ND_LASTFM_ENABLED:
ND_LASTFM_APIKEY: 2f976c9f28XXXXXXXXXXXXXXXX # 修改成自己的APIKEY
ND_LASTFM_SECRET: 74f181a9ecXXXXXXXXXXXXXXXXX # 修改成自己的SECRET
ND_SPOTIFY_ID: 96e3XXXXXXXXXXXXXXXXXXX # 修改成自己的ID
ND_SPOTIFY_SECRET: 487f87bXXXXXXXXXXXXXXXXXXX # 修改成自己的SECRET
ND_LASTFM_LANGUAGE: zh
ND_LOGLEVEL: info
ND_SESSIONTIMEOUT: 24h
ND_BASEURL: ""
ND_ENABLETRANSCODINGCONFIG: "true"
ND_TRANSCODINGCACHESIZE: "4000M"
ND_IMAGECACHESIZE: "1000M"
volumes:
- "/srv/dev-disk-by-uuid-91b16c01-2496-4993-aeee-a99c21d83597/share/appdata/navidrome:/data"
- "/srv/dev-disk-by-uuid-91b16c01-2496-4993-aeee-a99c21d83597/share/resources/music:/music:ro" # 冒号左边修改成自己本地的音乐文件夹路径
miniserve:
image: svenstaro/miniserve:latest
depends_on:
- navidrome
ports:
- "4534:8080"
volumes:
- "/srv/dev-disk-by-uuid-91b16c01-2496-4993-aeee-a99c21d83597/share/resources/music:/downloads" # 冒号左边修改成自己本地的音乐文件夹路径
command: "-r -z -u -q -p 8080 -a username:Password /downloads" # 修改成自己的账号:密码
restart: unless-stopped
代码中有几点需要注意,首先API改成自己从网站上获取的数值,另外data和music需要配置成自己NAS上的绝对或相对地址。
以下两个参数定义了Navidrome的转码功能。
ND_ENABLETRANSCODINGCONFIG 设置为true才能支持转码功能
ND_TRANSCODINGCACHESIZE 转码缓存的大小。设置0为禁用缓存,默认为 100MB
miniserve是创建的另一个本地网站,用以上传音乐文件,注意修改默认的8080映射端口,并设置好登录网站的账号名密码。当然局域网环境内,一般可以直接将音乐文件拷贝到NAS路径中,不需要额外上传这个操作。
然后在命令行里将代码写到docker-compose.yml文件中。

运行docker-compose up -d,等待Docker下载安装完成。

访问Navidrome页面
如果一切正常,浏览器访问4533端口即可访问Navidrome,第一次访问需要设置admin账号和密码。

不得不说,Navidrome设计得简洁好看,登录界面背景图片会自动变化。之前通过Lidarr自动下载的音乐专辑都可自动显示。

miniserve也可通过4534端口正常访问,不过一般无须网页繁琐的上传操作。

对Navidrome做一些个性化操作,如将默认语言改为简体中文。

修改转码设置:Navidrome虽然支持格式比较广泛,但是还是有一些不支持的格式,可以利用转码功能转成opus,aac和mp3格式等。默认mp3的转制码率比较低,可以改成320kbps。

PC客户端访问Navidrome
Navidrome的网页版已经非常完美了,但是同时也支持客户端访问,这里尝试了Sonixd(G站 jeffvli/sonixd)。简单配置服务器端的地址,用户名密码即可连接。

显示效果和Navidrome网页版大同小异,个人觉得用网页版就行。

歌词显示
Navidrome本身是支持歌词显示的,但是不支持加载外置歌词(.lrc格式)。
但是一般下载的音频文件也不会带歌词内容,这里提供一个变通的方法。
下载安装LRCGET,这是一个开源的歌词下载软件(G站 tranxuanthang/lrcget)。
选择音乐文件夹导入。

会自动按照歌名字母顺序排列所有音乐文件,点击Download All Lyrics即可下载歌曲对应的歌词。

如果显示Synced就说明歌词文件被成功下载,实测歌词下载成功率挺高,但是只适用于英文歌曲。

同步成功后,lrc文件就会下载到相同文件夹中。

下面我们要做的是,将lrc的内容注入到音频文件的Tag中,可以写一串Python代码:
import os
from mutagen.mp3 import MP3
from mutagen.id3 import ID3, USLT
def read_lrc(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
return f.read()
def add_lyrics_to_mp3(mp3_file, lyrics_text):
audio = MP3(mp3_file, ID3=ID3)
try:
audio.add_tags()
except:
pass
# 创建 USLT 元数据对象
uslt = USLT(encoding=3, lang=u'eng', desc=u'desc', text=lyrics_text)
# 将歌词添加到 MP3 文件的元数据中
audio.tags.add(uslt)
# 保存更改
audio.save()
def process_folder(folder_path):
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith('.mp3'):
mp3_file = os.path.join(root, file)
lrc_file = os.path.splitext(file)[0] + '.lrc'
lrc_path = os.path.join(root, lrc_file)
if os.path.exists(lrc_path):
lyrics_text = read_lrc(lrc_path)
add_lyrics_to_mp3(mp3_file, lyrics_text)
print(f'Lyrics added to {mp3_file}')
def main():
mp3_folder = 'Y:resourcesmusic' # 替换为你的 MP3 文件夹路径
process_folder(mp3_folder)
if __name__ == "__main__":
main()
执行后,即可自动修改mp3文件加入歌词内容。

如果路径下有mp3,也有flac文件,可以改写代码如下:
import os
from mutagen.mp3 import MP3
from mutagen.id3 import ID3, USLT
from mutagen.flac import FLAC
def read_lrc(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
return f.read()
def add_lyrics_to_mp3(mp3_file, lyrics_text):
audio = MP3(mp3_file, ID3=ID3)
try:
audio.add_tags()
except:
pass
# 创建 USLT 元数据对象
uslt = USLT(encoding=3, lang=u'eng', desc=u'desc', text=lyrics_text)
# 将歌词添加到 MP3 文件的元数据中
audio.tags.add(uslt)
# 保存更改
audio.save()
def add_lyrics_to_flac(flac_file, lyrics_text):
audio = FLAC(flac_file)
# 清除已有的歌词元数据
if 'lyrics' in audio:
audio['lyrics'] = lyrics_text
else:
audio['LYRICS'] = lyrics_text
# 保存更改
audio.save()
def process_folder(folder_path):
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith('.mp3') or file.endswith('.flac'):
audio_file = os.path.join(root, file)
lrc_file = os.path.splitext(file)[0] + '.lrc'
lrc_path = os.path.join(root, lrc_file)
if os.path.exists(lrc_path):
lyrics_text = read_lrc(lrc_path)
if file.endswith('.mp3'):
add_lyrics_to_mp3(audio_file, lyrics_text)
print(f'Lyrics added to {audio_file}')
elif file.endswith('.flac'):
add_lyrics_to_flac(audio_file, lyrics_text)
print(f'Lyrics added to {audio_file}')
def main():
mp3_folder = 'Y:resourcesmusic' # 替换为你的 MP3 文件夹路径
process_folder(mp3_folder)
if __name__ == "__main__":
main()
然后在Navidrome里播放音乐,点击右下角的书本图标即可显示歌词。

注意歌词都会打上时间戳,所以在歌曲刚开始时会显示No Lyrics,随后即可正常显示歌词。

尽管歌词显示效果只能算是差强人意。
手机访问Navidrome
只要是基于subsonic方案的手机音乐播放器都可以直接连接Navidrome。
Amperfy Music
一款免费APP,基本功能都能实现,界面也比较简洁。


音流
一款国人开发的APP,官网在此。
界面配色非常舒服,功能也很齐全,为了支持一下作者,我还购买了会员。48元终生有效,价格还算合理。付费会员可以更换界面,集成API,更多功能还有待发掘。



总结
今天和大家分享了一下Navidrome容器的搭建方法,个人实操感觉还是挺顺利,非常容易上手。
现在大家都习惯在itunes,Spotify等网络流媒体平台收听音乐,但是可能我更享受这种拥有的感觉吧,在Navidrome所有播放的音乐都是我喜欢的,远离算法的绑架。还有如果家里有一些更专业的听音设备,播放无损音频文件也能带来更佳的体验。所以如果你已经有了家用存储NAS,可以尝试搭建一下Navidrome,体验别样聆听音乐的乐趣。

被现实颠覆的红烧肉
校验提示文案
knook
校验提示文案
帅得太迟
校验提示文案
哈利波特别特别大
校验提示文案
东街小东东
校验提示文案
okswish
校验提示文案
ifwww
校验提示文案
cent
校验提示文案
值友6366820994
校验提示文案
白颜知己
校验提示文案
河边有只象
校验提示文案
值友1542384354
samba共享,300买个买个daphile小主机。
校验提示文案
Sunsir科技
校验提示文案
悟空老顽童
校验提示文案
哆喵呜
校验提示文案
伟小闲
校验提示文案
zc40
校验提示文案
回归的TK
校验提示文案
予我心安-予以平安
校验提示文案
conwin
校验提示文案
ccinoo
校验提示文案
把你毛拔了
全能个屁,ape格式都不支持,浪费感情。
校验提示文案
浮生不得闲
校验提示文案
暴躁的橘子
校验提示文案
值友1542384354
samba共享,300买个买个daphile小主机。
校验提示文案
白颜知己
校验提示文案
simon2137
校验提示文案
河边有只象
校验提示文案
conwin
校验提示文案
逍遥女大侠
校验提示文案
信太多因为知道太少
校验提示文案
高小喵
校验提示文案
予我心安-予以平安
校验提示文案
回归的TK
校验提示文案
就爱逛张大妈
校验提示文案
zc40
校验提示文案
伟小闲
校验提示文案
Angeladady
校验提示文案
波导终结者
校验提示文案
哆喵呜
校验提示文案