Запрос API поиска MusicBrainz через PHP-скрипт
-
21-12-2019 - |
Вопрос
Я пытаюсь получить информацию о выпуске из базы данных MusicBrainz, используя скрипт PHP на своем сервере.У меня есть список песен с названием песни и именем исполнителя, и я пытаюсь получить дату первого выпуска этой песни, а также другую информацию об этом выпуске.
Я понимаю, что поиск не всегда будет на 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.Eсть PHP-библиотека для WS/2 перечислены на Документация МБ.Хотя я сам не пробовал.
бонус:
Если у вас возникли проблемы с поиском записей из-за того, что исполнитель на вашей стороне пишется по-другому, вы можете сначала выполнить поиск исполнителя (включая псевдонимы), а затем использовать идентификатор исполнителя для поиска записей.Обратите внимание, что вы не можете напрямую использовать псевдоним при поиске записей.
Этот запрос будет искать ZZTop
в именах исполнителей, псевдонимах исполнителей и имени исполнителя:http://musicbrainz.org/ws/2/artist?query=%22ZZTop%22(см. Документация по полю поиска исполнителя).
С помощью этого поиска вы получаете уникальный идентификатор: 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 ...)
когда вы получили несколько результатов по запросу исполнителя.