1

我正在尝试使用我服务器上的 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()$artistand $song_title,但有趣的是,它没有返回任何结果,所以我想我会把它作为一个普通的字符串。查询返回结果,但它们真的关闭了,我感觉只有部分查询被提取(例如只有歌曲标题而不是艺术家)。

有谁知道这样做的正确方法?

4

1 回答 1

8

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

问题是:

  • ANDartist:应该AND artist:
  • ZZTop应该是"ZZ Top",否则找不到艺术家。如果您真的认为这是有多少人拼写的,您可以添加别名`ZZTop
  • 您可能希望使用短语 ( "...") 来搜索完整的标题。否则, MB 会搜索包含 (It's )only `artist:"ZZ TOP" 的标题。但是,包含所有单词的结果被评为更高并显示在顶部。所以这是可选的。Love

所以要使用的正确/精确查询是: http ://musicbrainz.org/ws/2/recording?query=%22It%27s%20only%20Love%22%20AND%20artist:%22ZZ%20Top% 22(2结果)

一个更模糊的查询是: http ://musicbrainz.org/ws/2/recording?query=It%27s%20only%20Love%20AND%20artist:%28ZZ%20Top%29 (80 个结果,artist:(ZZ Top)用于搜索ZZTop艺术家)

有关详细信息,请参阅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 服务。MB 文档中列出了一个用于 WS/2 的 PHP 库。不过我自己没试过。


奖金

如果您因为艺术家的拼写不同而在查找录音时遇到问题,您可以先搜索艺术家(包括别名),然后使用艺术家的 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 ...)在获得艺术家查询的多个结果时使用。

于 2014-06-15T11:05:11.987 回答