我正在尝试使用服务器上的 PHP 脚本从 MusicBrainz 数据库检索发行信息。我有一个歌曲列表,其中包含歌曲标题和艺术家姓名,我正在尝试检索该歌曲首次发行的日期以及有关该发行的其他信息。

我意识到搜索并不总是 100% 准确,但该列表包含相当罕见和独特的歌曲,因此它至少应该让我找到一个好的曲目。

我的脚本已经完成了相当多的工作,它返回结果和所有内容,但我不确定如何准确编写查询。该文档非常混乱,并且没有提供搜索歌曲标题和艺术家的示例。

这是我的代码:

// this info is normally fetched from my DB, but just as a simple example (as it is returned):
$artist = "ZZTop"; 
$song_title = "It's only Love";

// I'm having trouble with this part:
$mb_query = 'http://www.musicbrainz.org/ws/2/recording?query=' . $song_title .' ANDartist:' . $artist ;

$xml = simplexml_load_file($mb_query);

$releasedate = $xml->{'recording-list'}->recording[0]->{'release-list'}->release[0]->date;

起初我尝试过 rawurlencode()$artist$song_title, ,但有趣的是,它没有返回任何结果,所以我想我只需将其保留为纯字符串即可。查询返回结果,但它们确实关闭了,我感觉只有部分查询被获取(例如只有歌曲标题而不是艺术家)。

有谁知道执行此操作的正确方法?

有帮助吗?

解决方案

您的示例代码创建的查询如下:http://musicbrainz.org/ws/2/recording?query=It%27s%20only%20Love%20ANDartist:ZZTop

问题是:

  • ANDartist: 应该 AND artist:
  • ZZTop 应该 "ZZ Top", ,否则找不到艺术家。如果您确实认为有很多人拼写它,您可以添加别名“ZZTop”
  • 您可能想要使用短语 ("...")来搜索完整标题。否则 MB 会搜索标题,包括 (It's 或者 only 或者 Love) `艺术家:“ZZ TOP”。但是,包含所有单词的结果 将要 获得更高的评价并出现在顶部。所以这是可选的。

因此,要使用的正确/精确查询是:http://musicbrainz.org/ws/2/recording?query=%22It%27s%20only%20Love%22%20AND%20艺术家:%22ZZ%20Top%22 (2 个结果)

更有效的模糊查询是:http://musicbrainz.org/ws/2/recording?query=It%27s%20only%20Love%20AND%20艺术家:%28ZZ%20Top%29 (80 个结果,使用 artist:(ZZ Top) 寻找 ZZ 或者 Top 艺术家)

请参阅 MusicBrainz 搜索文档Lucene 搜索语法 了解详情。

此代码适用于我(在 PHP 5.5.13 上)而不是您的行:

$mb_query = 'http://www.musicbrainz.org/ws/2/recording?query="'.$song_title.'"'
            .' AND artist:"'.$artist.'"';

PHP 文档 说你只需要使用 rawurlencode() PHP 5.1.0 之前的版本。

此外,您可能希望使用预制库来更轻松地使用 MusicBrainz Web 服务。有一个 WS/2 的 PHP 库 列于 MB 文档. 。不过我自己还没有尝试过。


奖金:

如果由于艺术家的拼写不同而导致您在查找录音时遇到问题,您可以先搜索艺术家(包括别名),然后使用艺术家的 ID 进行录音搜索。请注意,您不能直接在录音搜索中使用别名。

该查询将搜索 ZZTop 在艺术家姓名、艺术家别名和艺术家姓名中:http://musicbrainz.org/ws/2/artist?query=%22ZZTop%22(参见 艺术家搜索字段文档).

通过该搜索,您将获得一个唯一的 ID: a81259a0-a2f5-464b-866e-71220f2739f1. 。请注意,您可能会获得多个结果,因此您可能需要保存包含高分结果的列表,并在下一步中找不到记录时尝试其他条目。

现在您可以在录音搜索中使用 ID 而不是名称:http://musicbrainz.org/ws/2/recording?query=%22I%27ts%20only%20Love%22%20AND%20arid:a81259a0-a2f5-464b-866e-71220f2739f1

您还可以使用 arid:(... OR ...) 当您获得艺术家查询的多个结果时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top