我试图在我的服务器上使用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
) 和 ' artist:"ZZ TOP"。然而,包含所有单词的结果将被评为更高,并显示在顶部。所以这是可选的
所以正确/精确的查询应该是: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)
搜索ZZ
或Top
艺术家)
查看MusicBrainz搜索文档和Lucene搜索语法详细信息
这段代码适用于我(在PHP 5.5.13),而不是你的行:
$mb_query = 'http://www.musicbrainz.org/ws/2/recording?query="'.$song_title.'"'
.' AND artist:"'.$artist.'"';
PHP文档说你只需要在PHP 5.1.0之前使用rawurlencode()
。
此外,您可能希望使用预先制作的库来更轻松地与MusicBrainz Web Service一起工作。在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 - 464 b - 866 - e - 71220 - f2739f1
你也可以使用arid:(... OR ...)
当你得到多个结果的查询艺术家