如果你有NAS,可以尝试搭建Navidrome全能音乐播放平台

如果你有NAS,可以尝试搭建Navidrome全能音乐播放平台

freund
freund
1364 浏览

在折腾电子产品的过程中,深切感受到需求往往是递进时的,往往在实现了一个功能之后又会产生新的需要,继续搜寻资料不断尝试,如此不断往复,就形成了自己的不断扩张的知识树。这又像是蝴蝶效应,就是因为我刷坏了一个国砖便携播放器,而在闲鱼上购进了一个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是必填项。

屏幕截图 2024-04-02 222027

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

屏幕截图 2024-04-02 222130

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

屏幕截图 2024-04-02 222843

输入一些基本信息。

屏幕截图 2024-04-02 223316

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

屏幕截图 2024-04-02 223426

创建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

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

屏幕截图 2024-04-02 230343

访问Navidrome页面

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

屏幕截图 2024-04-02 231139

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

屏幕截图 2024-04-02 231259

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

屏幕截图 2024-04-02 233659

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

屏幕截图 2024-04-02 233925

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

屏幕截图 2024-05-26 002424

PC客户端访问Navidrome

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

屏幕截图 2024-04-02 234513

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

屏幕截图 2024-04-02 234553

歌词显示

Navidrome本身是支持歌词显示的,但是不支持加载外置歌词(.lrc格式)。

但是一般下载的音频文件也不会带歌词内容,这里提供一个变通的方法。

下载安装LRCGET,这是一个开源的歌词下载软件(G站 tranxuanthang/lrcget)。

选择音乐文件夹导入。

屏幕截图 2024-04-03 111655

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

屏幕截图 2024-04-03 111750

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

屏幕截图 2024-04-03 111829

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

屏幕截图 2024-04-03 113225

下面我们要做的是,将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

如果路径下有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

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

屏幕截图 2024-05-26 000712

尽管歌词显示效果只能算是差强人意。

手机访问Navidrome

只要是基于subsonic方案的手机音乐播放器都可以直接连接Navidrome。

Amperfy Music

一款免费APP,基本功能都能实现,界面也比较简洁。

ADA2353C8CBB5DBAD0D0FF46076925B4
IMG_8631

音流

一款国人开发的APP,官网在此

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

IMG_8636
IMG_8634

总结

今天和大家分享了一下Navidrome容器的搭建方法,个人实操感觉还是挺顺利,非常容易上手。

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

君君提示:你也可以发布优质内容,点此查看详情 >>

本文著作权归作者本人和北美省钱快报共同所有,未经许可不得转载。长文章仅代表作者看法,如有更多内容分享或是对文中观点有不同见解,省钱快报欢迎您的投稿。

1364 8 1

扫码下载APP