Вопрос

Я пытаюсь получить информацию о выпуске из базы данных 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 ...) когда вы получили несколько результатов по запросу исполнителя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top