3

我正在创建一个 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 获取给定曲目的专辑信息,如果不可能,我的替代选择是什么?

4

2 回答 2

5

首先,您想要的是将元数据添加到 mp3 中,这是人们最常见的使用场景。“正常”的方式是使用 Musicbrainz 标记器,在那里打开这些文件并使用界面附加正确的元数据。建议的(gui)工具是Musicbrain Picard

我还想声明 Perl 模块正在使用现已弃用的 MusicBrainz Web 服务版本 1。该 Web 服务有几个问题,因为它是为另一种数据库方案而不是 MusicBrainz 现在使用的数据库方案而设计的。

但是,当前的Web 服务版本 2只有一个可用的 python 库:python-musicbrainzngs

您仍然可以使用 Perl 模块,但是如果您遇到“奇怪”的问题,这可能就是原因。


这就是 Web 服务的一般工作方式(以及它应该如何直接应用于 Perl 模块作为该 Web 服务的包装器):您的搜索结果如下:

http://musicbrainz.org/ws/1/track/?artist=%22Ryan%20Adams%22&title=%22when%20the%20stars%20go%20blue%22

在那里,您可以获得该曲目的录音列表。这些重新编码发生在多个版本 (ReleaseList) 上。您可以忽略其中的许多,因为它们属于“编译”类型。您可能想要“专辑”版本。

您可能会问自己,为什么列表中有多个同名专辑。这是因为 MusicBrainz 上的“发布”是发布事件和几种媒体的组合。你可能有一个美国版本和一个德国豪华版等等。所有这些版本都在一个“版本组”中。

您可能想要这个“发布组”的名称,这通常也是该组中每个发布的名称。

您可能想了解一下MusicBrainz 数据库的结构。


当然,这只是基本用例。您可能会遇到艺术家/标题拼写错误、多个或缺少专辑发行组和其他问题。但是,总的来说它应该可以工作,您可以将“问题”案例放在一个特殊的目录中,然后在 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 模块已损坏。

于 2012-12-16T00:42:11.597 回答
1

查看我们的 perl 模块以访问封面艺术档案:

http://metacpan.org/pod/Net::CoverArtArchive

有关我们档案的更多信息在这里,包括规格:

http://coverartarchive.org/

祝你好运!

于 2012-10-21T19:18:02.313 回答