想要将个人音乐库进行整理,避免重复重名和标记混乱?不妨考虑使用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/