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

2024-05-27 22:14:12 49点赞 341收藏 66评论

在折腾电子产品的过程中,深切感受到需求往往是递进时的,往往在实现了一个功能之后又会产生新的需要,继续搜寻资料不断尝试,如此不断往复,就形成了自己的不断扩张的知识树。这又像是蝴蝶效应,就是因为我刷坏了一个国砖便携播放器,而在闲鱼上购进了一个iPod Classic,为了能够装满128GB的空间,又开始尝试在NAS上搭建一套自助下载音乐的系统。如果大家回顾我近期的几篇文章,就能够知晓这些尝试的心路历程。

IPC虽然可玩性不错,但是局限性也很明显,默认系统只支持自家的ALAC无损格式,对于主流的FLAC等音乐格式并不支持;另一方面,下载的音频文件多了,迫切需要一个工具来集中管理存放在NAS上的音乐资源。于是我做了一番研究:

其实,音频文件也是媒体文件的一种,不少NAS播放类解决方案同样支持,比如我曾经介绍过的Emby和Jellyfin,个人在踩坑无数之后,更推荐解锁版的Emby。当然,如果需要一款专业的音乐播放Docker,还是有不少其他的方案可以选择,这里列出了几款常见Docker的功能比较。

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

经过一番搜索,发觉Navidrome似乎在音乐爱好者们中接受度更高,于是尝试把玩了一番,将折腾的经过整理于此。

注册Last.fm和Spotify获取API

Navidrome可以从Last.fm和Spotify获取专辑信息和图像,所以首先要在这两个音乐网站注册免费账号。

然后到这个地址申请一个API。表单里只有Application name是必填项。

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

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

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

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

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

输入一些基本信息。

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

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

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

创建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文件中。

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

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

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

访问Navidrome页面

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

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

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

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

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

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

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

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

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

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

PC客户端访问Navidrome

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

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

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

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

歌词显示

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

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

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

选择音乐文件夹导入。

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

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

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

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

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

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

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

下面我们要做的是,将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文件加入歌词内容。

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

如果路径下有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里播放音乐,点击右下角的书本图标即可显示歌词。

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

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

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

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

手机访问Navidrome

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

Amperfy Music

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

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

音流

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

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

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

总结

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

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

展开 收起
66评论

  • 精彩
  • 最新
  • 这个的确很简单,最好还是自己用musictag编辑音乐文件的标签,有的PT网站整理的比较好,标签完整,有的确实不行

    校验提示文案

    提交
    PT音乐确实比较少

    校验提示文案

    提交
    收起所有回复
  • 用emby配合symfonium听歌。

    校验提示文案

    提交
    Emby也非常好用,用了一年了

    校验提示文案

    提交
    收起所有回复
  • 能学会,但太耗时了。没多少时间折腾。

    校验提示文案

    提交
    实现起来还比较简单,按照我的方案就行

    校验提示文案

    提交
    收起所有回复
  • 现在主要问题还是没资源……

    校验提示文案

    提交
    确实是,不过我用lindarr还是下了不少专辑,采用了广撒网的方式

    校验提示文案

    提交
    pdd花点小钱很多T

    校验提示文案

    提交
    还有6条回复
    收起所有回复
  • 同方案,但是音流好像不能播放无损

    校验提示文案

    提交
    用Substreamer可以无损播放,也可以转码成MP3播放

    校验提示文案

    提交
    是的,功能类似

    校验提示文案

    提交
    还有5条回复
    收起所有回复
  • 竟然能看到松隆子的专辑

    校验提示文案

    提交
    找了些学生时代喜欢听的老专辑

    校验提示文案

    提交
    收起所有回复
  • jellyfin新版本也支持内嵌歌词了

    校验提示文案

    提交
    Jellyfin在免费docker里确实不错

    校验提示文案

    提交
    收起所有回复
  • 有各种音乐app,折腾这个意义是什么? [想一想]

    校验提示文案

    提交
    认真回答你的问题,为了折腾

    校验提示文案

    提交
    收藏,有些歌被禁了,大的音乐app就听不了了

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • 就是不能cue分轨播放

    校验提示文案

    提交
    是的,可以用foobar转一下

    校验提示文案

    提交
    收起所有回复
  • 请教下大佬,威联通docker部署后一直显示 Media Folder is empty. Aborting scan.这种怎么解决呢,nas地址是对的。 /share和直接路径 都试过。歌曲mp3/flac/cue,带不带文件夹都识别不出。

    校验提示文案

    提交
    我是用的绝对地址部署的,你是吗?

    校验提示文案

    提交
    /share就是绝对地址吧。cache的地址可以识别,只是歌曲不识别。 [喜极而泣]

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 真学习系列。。。。就是现在资源也不好搞了,apple music家庭省心了

    校验提示文案

    提交
  • 简单事情复杂化。
    samba共享,300买个买个daphile小主机。

    校验提示文案

    提交
  • 满满干货啊,牛逼

    校验提示文案

    提交
  • 这个和roon的差异点在哪呀

    校验提示文案

    提交
  • 这个真可以,学习一下,音乐资源管理很不错。

    校验提示文案

    提交
  • 大佬标题第一句就把我给PASS了……

    校验提示文案

    提交
  • 用的plex amp

    校验提示文案

    提交
  • 音流连接车机的时候怎么显示歌词啊

    校验提示文案

    提交
    连车机就老老实实开车,看歌词干嘛

    校验提示文案

    提交
    收起所有回复
  • 三连支持

    校验提示文案

    提交
  • 用音流会员版和musictag搭配完美

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
341
扫一下,分享更方便,购买更轻松