1

私は現在、アーティストとその仲間のタイトルを検索する Web アプリケーションを開発しています。これを行うために、このパッケージ(ドキュメンテーションはこちら)を通じて API MusicBrainz を解析することにしました。

アーティスト mbid (MusicBrainz の一意の識別子) が既にあるとします。

mbid = 302bd7b9-d012-4360-897a-93b00c855680問題は、たとえば、David Guetta ( ) を検索すると、スクリプトはリリース数が 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などのパラメータを定義できます。limitoffset

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最初のクエリでandを定義した場合$offset = 0、合計リリース数に応じてこれらの値を変更する方法がわかりません。したがって、100 から 196 の間の結果が得られます (この例では)。

4

2 に答える 2

2

この質問の時点で、回答を「本当の回答」として投稿します。

疑似言語

与えられた: 150 の結果。オフセットと制限を定義できます。ただし: 最大制限は 100 件の結果です。

一度に 100 件の結果しか取得できないため、2 回の呼び出しが必要です。これはあなたがそれを解決する方法です:

コール 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);
}
于 2015-06-05T08:55:33.263 に答える
1

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ですが、再設定しても問題はありません。

PHP ライブラリに実装されていないように見える必要なレート制限sleepのため、そこにa を追加しました。

于 2015-06-06T10:53:26.770 に答える