通过 PHP 脚本查询 MusicBrainz 搜索 API
-
21-12-2019 - |
题
我正在尝试使用服务器上的 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 ...)
当您获得艺术家查询的多个结果时。