![如果你有NAS,可以尝试搭建Navidrome全能音乐播放平台](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/859/eef/03b/6d5a99c2f1a0a3edd1b7768.jpg_1280_1280_3_9b08.jpg)
在折腾电子产品的过程中,深切感受到需求往往是递进时的,往往在实现了一个功能之后又会产生新的需要,继续搜寻资料不断尝试,如此不断往复,就形成了自己的不断扩张的知识树。这又像是蝴蝶效应,就是因为我刷坏了一个国砖便携播放器,而在闲鱼上购进了一个iPod Classic,为了能够装满128GB的空间,又开始尝试在NAS上搭建一套自助下载音乐的系统。如果大家回顾我近期的几篇文章,就能够知晓这些尝试的心路历程。
IPC虽然可玩性不错,但是局限性也很明显,默认系统只支持自家的ALAC无损格式,对于主流的FLAC等音乐格式并不支持;另一方面,下载的音频文件多了,迫切需要一个工具来集中管理存放在NAS上的音乐资源。于是我做了一番研究:
其实,音频文件也是媒体文件的一种,不少NAS播放类解决方案同样支持,比如我曾经介绍过的Emby和Jellyfin,个人在踩坑无数之后,更推荐解锁版的Emby。当然,如果需要一款专业的音乐播放Docker,还是有不少其他的方案可以选择,这里列出了几款常见Docker的功能比较。
![功能比较](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/bb7/916/377/cf1effe39867cccdf4a31ae.jpg_1080_0_40_07f9.jpg)
经过一番搜索,发觉Navidrome似乎在音乐爱好者们中接受度更高,于是尝试把玩了一番,将折腾的经过整理于此。
注册Last.fm和Spotify获取API
Navidrome可以从Last.fm和Spotify获取专辑信息和图像,所以首先要在这两个音乐网站注册免费账号。
然后到这个地址申请一个API。表单里只有Application name是必填项。
![屏幕截图 2024-04-02 222027](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/9e7/1d2/c44/9603044bf1c4bdf9194bea1.jpg_1080_0_40_24fc.jpg)
随后页面将会显示专属的API信息,将API Key和Shared secret保存下来。
![屏幕截图 2024-04-02 222130](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/45d/fb7/2b0/b8d4b720fc260664f1fe827.jpg_1080_0_40_6e38.jpg)
同理,创建Spotify的免费账号,然后在这个地址里Create app。
![屏幕截图 2024-04-02 222843](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/f3c/426/142/ed4dcf6b221eec7f5787344.jpg_1080_0_40_cbac.jpg)
输入一些基本信息。
![屏幕截图 2024-04-02 223316](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/3d3/214/094/3ed56da63afb2ce08d9613a.jpg_1080_0_40_2dff.jpg)
将生成APP的Client ID和Client secret保存下来。
![屏幕截图 2024-04-02 223426](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/606/d03/c4d/bd388d214402d979e2dee2a.jpg_1080_0_40_bfcf.jpg)
创建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文件中。
![屏幕截图 2024-04-02 225259](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/fd3/cdb/d85/830818fcf9583e2cbafbc2f.jpg_1080_0_40_f40b.jpg)
运行docker-compose up -d,等待Docker下载安装完成。
![屏幕截图 2024-04-02 230343](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/87b/d0b/812/2d59cffc804e08ba7462386.jpg_1080_0_40_f46f.jpg)
访问Navidrome页面
如果一切正常,浏览器访问4533端口即可访问Navidrome,第一次访问需要设置admin账号和密码。
![屏幕截图 2024-04-02 231139](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/3fc/547/52a/f632de2a2ee47aefd825ecf.jpg_1080_0_40_0b1c.jpg)
不得不说,Navidrome设计得简洁好看,登录界面背景图片会自动变化。之前通过Lidarr自动下载的音乐专辑都可自动显示。
![屏幕截图 2024-04-02 231259](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/db5/cdb/dd5/3f7fda4f36c702b52108940.jpg_1080_0_40_b1bf.jpg)
miniserve也可通过4534端口正常访问,不过一般无须网页繁琐的上传操作。
![屏幕截图 2024-04-02 233659](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/967/6e0/d37/4e834d2f9cbf491a9add951.jpg_1080_0_40_279f.jpg)
对Navidrome做一些个性化操作,如将默认语言改为简体中文。
![屏幕截图 2024-04-02 233925](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/c3f/237/6e1/8e1521a1b4a822f310580b8.jpg_1080_0_40_0aef.jpg)
修改转码设置:Navidrome虽然支持格式比较广泛,但是还是有一些不支持的格式,可以利用转码功能转成opus,aac和mp3格式等。默认mp3的转制码率比较低,可以改成320kbps。
![屏幕截图 2024-05-26 002424](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/cc0/856/6d5/eb8d00d3bda58fad13e416b.jpg_1080_0_40_9fcb.jpg)
PC客户端访问Navidrome
Navidrome的网页版已经非常完美了,但是同时也支持客户端访问,这里尝试了Sonixd(G站 jeffvli/sonixd)。简单配置服务器端的地址,用户名密码即可连接。
![屏幕截图 2024-04-02 234513](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/73e/4be/9f9/d8016a76cb3ec18317590ba.jpg_1080_0_40_313e.jpg)
显示效果和Navidrome网页版大同小异,个人觉得用网页版就行。
![屏幕截图 2024-04-02 234553](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/67c/39d/2d9/e8cf5a3cb240afff1f094ac.jpg_1080_0_40_b1f9.jpg)
歌词显示
Navidrome本身是支持歌词显示的,但是不支持加载外置歌词(.lrc格式)。
但是一般下载的音频文件也不会带歌词内容,这里提供一个变通的方法。
下载安装LRCGET,这是一个开源的歌词下载软件(G站 tranxuanthang/lrcget)。
选择音乐文件夹导入。
![屏幕截图 2024-04-03 111655](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/adf/6de/f04/a3086477c32948749d26a3a.jpg_1080_0_40_fcae.jpg)
会自动按照歌名字母顺序排列所有音乐文件,点击Download All Lyrics即可下载歌曲对应的歌词。
![屏幕截图 2024-04-03 111750](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/6ae/192/f5f/9356e3db9c36bc77b312645.jpg_1080_0_40_943c.jpg)
如果显示Synced就说明歌词文件被成功下载,实测歌词下载成功率挺高,但是只适用于英文歌曲。
![屏幕截图 2024-04-03 111829](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/84e/0b0/577/83a3a870bf6bb3db2599ef3.jpg_1080_0_40_4794.jpg)
同步成功后,lrc文件就会下载到相同文件夹中。
![屏幕截图 2024-04-03 113225](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/83c/fef/6a3/f275b324417529d5b2f4ca1.jpg_1080_0_40_b386.jpg)
下面我们要做的是,将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文件加入歌词内容。
![屏幕截图 2024-04-06 182756](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/134/840/f3c/351f7588f5ba6843d12d4ba.jpg_1080_0_40_f489.jpg)
如果路径下有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里播放音乐,点击右下角的书本图标即可显示歌词。
![屏幕截图 2024-05-26 000322](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/b2b/087/e88/d7980933b89de5b2d2d0f03.jpg_1080_0_40_d0e0.jpg)
注意歌词都会打上时间戳,所以在歌曲刚开始时会显示No Lyrics,随后即可正常显示歌词。
![屏幕截图 2024-05-26 000712](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/c44/f55/293/25d29a4e6a03df8c6963850.jpg_1080_0_40_7f24.jpg)
尽管歌词显示效果只能算是差强人意。
手机访问Navidrome
只要是基于subsonic方案的手机音乐播放器都可以直接连接Navidrome。
Amperfy Music
一款免费APP,基本功能都能实现,界面也比较简洁。
![ADA2353C8CBB5DBAD0D0FF46076925B4](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/1f9/9d9/cad/c687eaa922ce71f19f9209a.jpg_1080_0_40_2c8f.jpg)
![IMG_8631](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/66b/356/c36/e5a69ee3925b54c4a0eacbd.jpg_1080_0_40_45f9.jpg)
音流
一款国人开发的APP,官网在此。
界面配色非常舒服,功能也很齐全,为了支持一下作者,我还购买了会员。48元终生有效,价格还算合理。付费会员可以更换界面,集成API,更多功能还有待发掘。
![IMG_8636](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/656/d67/7c0/a14ef405676ce0ef88b163c.jpg_1080_0_40_3139.jpg)
![IMG_8634](https://imgcache.dealmoon.com/thumbimg.dealmoon.com/dealmoon/ece/ff0/0cf/1e69ba3d94fc5c486af857e.jpg_1080_0_40_fb22.jpg)
总结
今天和大家分享了一下Navidrome容器的搭建方法,个人实操感觉还是挺顺利,非常容易上手。
现在大家都习惯在itunes,Spotify等网络流媒体平台收听音乐,但是可能我更享受这种拥有的感觉吧,在Navidrome所有播放的音乐都是我喜欢的,远离算法的绑架。还有如果家里有一些更专业的听音设备,播放无损音频文件也能带来更佳的体验。所以如果你已经有了家用存储NAS,可以尝试搭建一下Navidrome,体验别样聆听音乐的乐趣。
君君提示:你也可以写原创长文章,点此查看详情 >>
本文著作权归作者本人和北美省钱快报共同所有,未经许可不得转载。长文章仅代表作者看法,如有更多内容分享或是对文中观点有不同见解,省钱快报欢迎您的投稿。