В настоящее время я занимаюсь разработкой веб-приложения, в котором можно найти имена художников и их коллег. Для этого я решил разобрать API MusicBrainz, через этот пакет (какая документация Вот).
Предположим, у меня уже есть художник mbid (уникальный идентификатор для MusicBrainz).
Проблема в том, что если я сделаю поиск на Дэвида Гетта (mbid = 302bd7b9-d012-4360-897a-93b00c855680
) например, скрипт сообщает мне, что количество выпусков составляет 196. Однако API предоставляет 100 максимальных результатов на запрос.
// Instantiate a MusicBrainz object
$brainz = new MusicBrainz(new GuzzleHttpAdapter(new Client()));
$brainz->setUserAgent('ApplicationName', '0.2', 'http://example.com');
$limit = 100;
$offset = 0;
$includes = array('labels', 'recordings');
try {
$details = $brainz->browseRelease('artist', '302bd7b9-d012-4360-897a-93b00c855680', $includes, $limit, $offset);
print_r($details);
} catch (Exception $e) {
print $e->getMessage();
}
Функция browseRelease
ниже позволяет нам определить такие параметры как limit
а также offset
.
public function browseRelease($entity, $mbid, $includes = array(), $limit = 25, $offset = null, $releaseType = array(), $releaseStatus = array())
{
if (!in_array($entity, array('artist', 'label', 'recording', 'release-group'))) {
throw new Exception('Invalid browse entity for release');
}
return $this->browse(
new Filters\ReleaseFilter(array()),
$entity,
$mbid,
$includes,
$limit,
$offset,
$releaseType,
$releaseStatus
);
}
Теперь мы подошли к моему настоящему вопросу в этом посте.
Если бы я определил $limit = 100
а также $offset = 0
для первого запроса я не понимаю, как изменить эти значения в зависимости от общего количества выпусков и, таким образом, получить результаты от 100 до 196 (в этом примере).
Псевдокод ответ от Jordumus это правильно, но именно так вы должны изменить свой код, чтобы он работал.
$limit = 100;
$offset = 0;
$release_count = 0;
$includes = array('labels', 'recordings');
do {
if ($offset != 0) sleep(1);
try {
$details = $brainz->browseRelease('artist', '302bd7b9-d012-4360-897a-93b00c855680', $includes, $limit, $offset);
$release_count = $details['release-count'];
print_r($details);
} catch (Exception $e) {
print $e->getMessage();
}
$offset += $limit;
} while ($offset < $release_count);
Обратите внимание, что было бы достаточно установить $release_count
в первый раз, поскольку значение не меняется, но его сброс также не повредит.
Я добавил sleep
там из-за необходимого ограничение скорости который, кажется, не реализован в библиотеке PHP.
По состоянию на этот вопрос, Я опубликую свой ответ как «реальный ответ»:
Pseudolanguage
Дано: 150 результатов.
Вы можете определить: смещение и предел.
Но: максимальный предел составляет 100 результатов.
Вам нужно 2 звонка, потому что вы можете получить только 100 результатов одновременно. Вот как вы могли бы решить это:
Звоните 1:
Offset: 0
Limit: 100
//Returns results 0 to 99.
Звоните 2:
Offset: 100
Limit: [OPTIONAL] 100
//Returns resuls 100 to 199. As there are only 150 results in total, it will automatically return 100 to 150
Теперь мы можем сделать это автоматически с помощью цикла:
limit = 100
for (var i = 0; i < maxResults; i=i+100)
{
offset = i
GetResults(offset,limit);
}