想要将个人音乐库进行整理,避免重复重名和标记混乱?不妨考虑使用MusicBrainz。作为一家旨在构建音乐元数据的基金会,MusicBrainz通过收集、维护并共享着一系列关于音乐家、专辑和歌曲等信息的储存库,为用户提供一种全面且可信赖的数据规范化解决方案。

而更棒的是,我们还可以利用MusicBrainz现有的规范数据来构建自己的半自动音乐标记器。那么,该如何开始呢?

首先,我们需要明确,半自动音乐标记器是指结合计算机自动化处理和人类参与的机制,达到使音乐标记更快速准确、便捷有效的目的。通俗点说,就是将MusicBrainz储存库中的元数据同我们自己的音乐库进行匹配,自动添加或者提示人工添加缺失信息。

接下来,我们需要使用MusicBrainz自带的命令行工具,通过Python编写脚本来建立我们的标记器。具体实现流程如下:

1. 安装Python和MusicBrainz PyPI包

这是前置条件,保证我们使用MusicBrainz提供的数据结构模型。如果你已经安装过Python,那么直接运行以下命令即可安装MusicBrainz PyPI包:

“`

pip install musicbrainzngs

“`

2. 编写Python脚本

在下一步之前,我们需要了解要使用的MusicBrainz API。我这里简单地介绍一下:

* `musicbrainzngs.search_artists`:通过艺人名字查询所有相关唱片记录。

* `musicbrainzngs.search_release_groups`:通过专辑名字查询所有相关唱片记录。

* `musicbrainzngs.search_recordings`:通过唱片名字查询所有相关唱片记录。

把这些方法整合起来,进行数据对齐即可。至于代码部分,可以根据自己的需求来编写,但最少需要实现两个功能——将结果储存为JSON并且加载MusicBrainz的数据。代码如下:

“`

import musicbrainzngs

def search_artist(artist_name):

# 查询包含该艺人名字的具体唱片记录

query = musicbrainzngs.search_artists(artist=artist_name, limit=1)

if ‘artist-list’ not in query or len(query[‘artist-list’]) == 0:

return []

# 查询插入该唱片记录的所有专辑记录

artist = query[‘artist-list’][0]

albums = musicbrainzngs.browse_releases(artist=artist[‘id’], limit=50)

# 查询识别该专辑记录近似数量的唱片记录

results = []

for album in albums[‘release-list’]:

discid = musicbrainzngs.get_releases_by_discid(album[‘id’])[‘disc’][‘id’]

for recording in musicbrainzngs.get_releases_by_discid(discid, includes=[‘recordings’])[‘medium-list’][0][‘track-list’]:

results.append({‘name’: recording[‘recording’][‘title’], ‘artist_name’: recording[‘recording’][‘artist-credit’][0][‘artist’][‘name’], ‘album_name’: album[‘title’]})

return results

if __name__ == ‘__main__’:

musicbrainzngs.set_useragent(‘PythonMusicTagger’, ‘0.1’, ‘https://github.com/me/MusicTagger’)

“`

3. 异步执行代码

使用异步编程(asyncio)达到并行处理的目的,加快数据之间的对齐速度。优化代码如下:

“`

import asyncio

async def get_metadata(name_iterable, search_function):

loop = asyncio.get_event_loop()

futures = [loop.run_in_executor(None, search_function, name) for name in name_iterable]

responses = await asyncio.gather(*futures)

return responses

name_list = [‘tuning’, ‘all I need’, ‘四季予你’, ‘爱国者之歌’, ]

metadata = asyncio.run(get_metadata(name_list, search_artist))

print(metadata)

“`

至此,你已经成功建立了自己的半自动音乐标记器!简单易懂,舒适高效,想怎么用就怎么用。下次整理音乐库的时候,试一试这个方法吧!

详情参考

了解更多有趣的事情:https://blog.ds3783.com/