我正在创建一个Perl脚本,它会将mp3文件移动到我的音乐文件夹中,格式为artist/album/mp3file
。现在我的一些mp3文件可能没有album tag
,所以我想查询MusicBrainz数据库以检索给定track title & artist
的相册元数据。
我正在使用WebService::MusicBrainz Perl模块执行此任务,但我无法看到任何提供相册元数据信息的方法。我目前的代码是:
use WebService::MusicBrainz::Track;
my $ws = WebService::MusicBrainz::Track->new();
my $response = $ws->search({ ARTIST => 'Ryan Adams', TITLE => 'when the stars go blue' });
my $track = $response->track();
print $track->title(), " - ", $track->artist()->name(), "\n";
say $track->id();
那么,我如何使用MusicBrainz获取给定曲目的专辑信息?如果不可能,我还有哪些替代选项?
答案 0 :(得分:4)
首先,你想要的是向mp3添加元数据,这是人们最常用的场景。 “正常”方式是使用Musicbrainz Tagger,在那里打开这些文件并使用界面来附加正确的元数据。 建议的(gui)工具是Musicbrain Picard
我还想声明Perl模块正在使用现已弃用的Web Service Version 1 MusicBrainz。 该Web服务存在一些问题,因为它是针对另一种数据库方案而不是现在用于MusicBrainz的方案。
但是,当前Web Service Version 2只有一个可用的python库:python-musicbrainzngs。
您仍然可以使用Perl模块,但如果您遇到“奇怪”问题,这可能就是原因。
这是Web服务的一般工作方式(以及它应如何直接应用于Perl模块作为此Web服务的包装器): 您的搜索给出了:
您可以获得此曲目的录音列表。这些记录发生在多个版本(ReleaseList)上。 您可以忽略其中的许多内容,因为它们属于“编译”类型。你可能想要“专辑”版本。
您可能会问自己,为什么列表中有多个具有相同名称的相册。 这是因为MusicBrainz上的“发布”是发布事件和几种媒介的组合。 您可能有美国版本和德国豪华版本等。 所有这些版本都在一个“发布组”中。
您可能需要此“发布组”的名称,该名称大部分也是该组中每个发行版的名称。
您可能想了解MusicBrainz Database的结构。
这只是当然的基本用例。 您可能会遇到艺术家/标题,多个或缺少相册发布组和其他内容的拼写错误。 但是,它应该可以工作,您可以将“问题”案例放在特殊目录中,并在Picard中使用它们。 Picard还有其他方法来识别每个“音乐分析”(PUID,Acoustids)的文件
编辑:
my @tracklist = $response->track_list();
foreach my $track ( @tracklist ) {
print $track->title(), " - ", $track->artist()->name(), "\n";
my @releaselist = $track->release_list();
foreach my $release ( @releaselist ) {
print " ", $release->title(), " - ", $release->type();
}
}
一般应该工作,但事实并非如此。它为您提供了响应的所有跟踪,但不知何故它无法从release_list()中提取发行版。可能是因为模式已更改或因为perl模块已损坏。
答案 1 :(得分:1)