在折腾电子产品的过程中,深切感受到需求往往是递进时的,往往在实现了一个功能之后又会产生新的需要,继续搜寻资料不断尝试,如此不断往复,就形成了自己的不断扩张的知识树。这又像是蝴蝶效应,就是因为我刷坏了一个国砖便携播放器,而在闲鱼上购进了一个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:\resources\music' # 替换为你的 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:\resources\music' # 替换为你的 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,体验别样聆听音乐的乐趣。
君君提示:你也可以发布优质内容,点此查看详情 >>
本文著作权归作者本人和北美省钱快报共同所有,未经许可不得转载。长文章仅代表作者看法,如有更多内容分享或是对文中观点有不同见解,省钱快报欢迎您的投稿。