前言

个人音乐服务Navidrome搭建之后,必然会碰到高质量的音乐文件来源和歌曲元数据的问题,这里说一下个人解决办法。我是以腾讯音乐为基础,从腾讯下载mp3音乐文件,然后将腾讯音乐的元数据写入到mp3里,偶尔碰到在腾讯里没有版权的音乐,会在网易音乐里搜索有没有,使用网易音乐的音乐元数据,实在没有就没有办法了。
过程中会使用的一些开源服务,两个已经都不更新,一直用得挺好就没有找其他替代了。

  1. QQMusicApi: 腾讯音乐API服务,需要部署在自有的服务器或者本机都可以,需要的时候启动,使用之前需要设置账号信息和更新登陆的Cookie。 需要会员,不提供无会员下载320的音乐
  2. NeteaseCloudMusicApi: 网易音乐API服务,可以实现在Vercel部署使用。

请支持正版音乐!!!有需要更新音乐的时候,会购买一个的腾讯音乐会员,登陆后提取Cookie发送到QQMusicApi服务,后面使用到QQMusicApi的服务都是在登陆之后的操作。网易音乐我只是使用元数据,暂时没有购买过会员。
腾讯音乐会员可以官方购买,或者某些APP里兑换会员服务,或者是闲鱼、淘宝都可以的,哪个便宜搞哪个

整体使用Python代码实现的下面过程,因为不具备通用性,这里只说一下怎么使用的思路。 音乐刮削

音乐来源

  1. 专辑:
    如你在腾讯音乐找到周杰伦的《J III MP3 Player》,看到浏览器的URL:https://y.qq.com/n/ryqq/albumDetail/002MAeob3zLXwZ,最后的002MAeob3zLXwZ就是专辑的albummid,接下来调用QQMusicApi的获取专辑内的歌曲接口,可以获取到专辑歌曲清单的json数据。
  2. 歌单:
  • 腾讯音乐提供了榜单和歌单,都可以QQMusicApi的获取榜单详情获取歌单详情,根据个人喜好可以找对应的日常更新。
  • 网易音乐也有提供排行榜和歌单,可以调用NeteaseCloudMusicApi的获取歌单所有歌曲
  • Apple Music有每周热门100首和城市排行榜的歌单,找到对应歌单返回歌曲链接,分析请求参数和header信息,后续需要更新音乐的时候,重新访问地址获取Cookie里的authorization,更新到请求代码,处理返回的json数据就可以获取歌单信息了。
  • Spotify榜单,找自己想更新的对应榜单,同样也是看返回歌曲的链接,分析请求参数和header信息,处理返回的json数据就可以获取歌单信息,当然每次更新歌曲时候也需要更新authorization参数。
  1. 歌手:
    在腾讯音乐里找歌手的singermid,调用QQMusicApi的 获取热门歌曲,修改参数page能够获取歌手的歌曲清单。
  2. 单曲:
    在腾讯音乐找对应单曲的songmid,调用QQMusicApi的 单个获取,可以获取包含了很多的歌曲信息,包括歌手、专辑、语种、曲风等,但是不包含歌词。

匹配歌曲

腾讯音乐直接有对应的songmid字段,可以跳过这个步骤。
对于网易、Apple Music、Spotify里获取歌曲清单,基本都会包含歌曲id(songmid)、歌名(songname)、歌手信息等,然后遍历歌单数据拼接查询关键词:歌手名称 - 歌名,如周杰伦 - 晴天,然后调用QQMusicApi的 搜索接口获取返回搜索的数据,具体接口参数详细见链接。对返回的结果第一条数据进行,看歌名和歌手名称是否一致,如果一致就搜索成功,然后找到返回结果的mid就是腾讯音乐的songmid,基本上成功率能达到90%以上,如果没有找到需要手动在浏览器里调用接口自己找一下返回的数据看看(推荐使用firefox,查看json数据方便)。
举例:

网易音乐: 周杰伦 - 晴天,songmid=186016
腾讯音乐:周杰伦 - 晴天,songmid=0039MnYb0qxYhV

根据找到的ID,可以放到一个ID对照文件里,每次搜索之前加载对应的对照表,先通过ID查找一下,是否存在,如果不存在则调用QQMusicApi的 搜索接口,找到了对应的腾讯音乐的songmid,再把ID对应关系写会对照文件,可以加快歌单的更新速度,因为大量是已经下载好的歌曲。
对照表文件示意:

186016 0039MnYb0qxYhV
2133271060 2133271060 nt

对照的文件,我做一个特殊处理,如果在腾讯音乐没有找到的音乐,可以在网易音乐里搜索,采用网易音乐的元数据文件。

如果确实没有找到元数据,我可能就不会放到Navidrome里了。

歌曲信息

腾讯音乐的歌曲信息调用QQMusicApi的 单个获取
网易音乐的歌曲信息调用NeteaseCloudMusicApi的获取歌曲详情
同样这里把获取到的歌曲详情json文件保存到文件系统,按照一定的目录结构组织起来,加快歌曲信息获取速度,先找缓存,再调用接口。

下载歌曲

只试过腾讯会员的下载音乐,网易音乐需要大家尝试。 下载之前,检查本地是否已经下载好了音乐文件,存在就可以跳过。
调用调用QQMusicApi的 下载链接接口获取音乐文件地址,可以传入音质的参数,获取不同音质的音乐文件。 请求音乐文件地址,保存到本地。由于有时会出错,可以在代码里加入重试下载的次数。

歌曲专辑

如果需要更新音乐文件元数据,一般包括:歌曲信息、专辑信息、封面、歌词。
腾讯音乐的歌曲专辑调用QQMusicApi的 获取专辑信息
网易音乐的歌曲专辑调用NeteaseCloudMusicApi的获取专辑内容
同样这里把获取到的歌曲专辑json文件保存到文件系统,按照一定的目录结构组织起来,加快歌曲专辑获取速度,先找缓存,再调用接口。

歌曲封面

歌曲的封面,如果属于专辑的歌曲,获取专辑的封面,如果属于单曲,获取歌手的封面。 腾讯音乐:https://y.gtimg.cn/music/photo_new/T002R300x300M000${mid}.jpg?max_age=2592000 mid参数替换为专辑的id或者歌手的id
网易音乐,如果歌曲信息里al.picUrl存在,直接使用里面的封面地址,否则需要调用NeteaseCloudMusicApi的获取歌手详情,使用data.artist.cover里的歌手封面地址。
下载的封面 对于获取的封面建议也做缓存,以专辑ID、歌手ID为文件名,按照一定的目录结构组织起来,加快歌曲封面获取速度,先找缓存,再调用接口。

歌曲歌词

腾讯音乐的歌词调用QQMusicApi的 歌词
网易音乐的歌词调用NeteaseCloudMusicApi的歌词

更新歌曲

采用eyed3或者mutagen库,将歌曲信息、专辑信息、封面、歌词写入到音乐文件id3标签中,完成歌曲元数据的更新。
eyed3可以操作的标签可以参考:https://eyed3.readthedocs.io/en/latest/eyed3.id3.html#module-eyed3.id3.tag
mutagen可以操作的标签可以参考: https://mutagen.readthedocs.io/en/latest/user/id3.html
最后可以在一个不常用的ID3标签,写入元素数据是来源和歌曲的id,后面可以检查使用。

最后,请支持正版音乐!!!