YouTube Data API v3 でチャンネルの動画 ID を全て取得する際には PlaylistItems API を使う

やりたいこと

Google Apps Script 上で YouTube Data API v3 を使って、動画の情報を取得している。 特定のチャンネルにアップロードされた動画全ての ID を取得したかったが、Search API を使って書いたら歯抜けになってしまい、すべての動画 ID が取得できなかった。 このハマりについてまとめる。

Search API を使ったバージョン(うまく動かない)

最初は Search API を使って以下のようなコードを書いていた。

var nextPageToken = null;
do {
  var response = YouTube.Search.list('id', {
    channelId: 'UCXcjvt8cOfwtcqaMeE7-hqA',
    type: 'video',
    maxResults: 50,
    order: 'date',
    pageToken: nextPageToken
  });
  for (var i = 0; i < response.items.length; i++) {
    var videoId = response.items[i].id.videoId;
     // do something with videoId
  }
} while(nextPageToken);

channelId を指定し、検索クエリなしで書いていたので、すべての動画が含まれると思っていた。 response の中に含まれる、pageinfo.totalResults にも全動画の数が含まれていたので、まさかページネーションをしてもすべての動画が含まれていないとは思わなかった。

PlaylistItems API を使ったバージョン (うまく動く)

どうやら PlaylistItems API を使うと、抜けがなく動画を取得できるらしい。 コードにすると以下のような感じ。

チャンネルのすべての動画が含まれるプレイリストの ID は Search API などを使って特定しておく必要がある。

var nextPageToken = null;
do {
  var response = YouTube.PlaylistItems.list('id,contentDetails', {
    playlistId: 'PLRiGv_zZZiw9dppLgE2QfTcj0uDLYTNEk',
    maxResults: 50,
    order: 'date',
    pageToken: nextPageToken
  });
  for (var i = 0; i < response.items.length; i++) {
    var videoId = response.items[i].contentDetails.videoId;
    // do something with videoId
  }
} while(nextPageToken);

まとめ

YouTube Data API を使って、チャンネルにアップロードされた全ての動画の情報を取得するためには、Search API ではなく、PlaylistItems API を使うこと。

参考 URL

stackoverflow.com