YouTube Data API v3を利用してプレイリストをエクスポートする

YouTubeには、プレイリスト(再生リスト)をエクスポートする機能がないので、YouTube Data API v3を利用して簡単なエクスポート機能を自作した。

この機能を実装するには、

  1. APIリクエストを行うオブジェクトを作成
  2. プレイリストIDを指定して動画情報を取得

を行えば良い。

まず、下記は Google_Service_YouTube オブジェクトを作成する部分のコード。


require_once '/path/to/google-api-php-client/vendor/autoload.php';

$client = new Google_Client();
$client->setDeveloperKey("_YOUR_API_KEY_");
$youtube = new Google_Service_YouTube($client);

※APIキーは、Google Cloud Platform の "API とサービス" → "認証情報" ページに移動して、"認証情報を作成" ボタンをクリックして、プルダウンメニューから "API キー" を選択すれば作成できる。


次に、プレイリストIDを指定して動画情報を取得していく。


// https://www.youtube.com/playlist?list=PLpjK416fmKwQKmatriVu3rdwv7g4ZJSfD
$playlistId = "PLpjK416fmKwQKmatriVu3rdwv7g4ZJSfD";

$filename = "export.tsv";
$fh = fopen($filename, "w");
if (!$fh)
  exit("Error: Can't open file: $filename\n");

$pageToken = "";
$cnts = 0;

$params = [
  'playlistId' => $playlistId,
  'maxResults' => 50
];

do {
  $response = $youtube->playlistItems->listPlaylistItems('snippet', $params);

  foreach ($response['items'] as $item)
  {
    $snippet = $item['snippet'];

    $url = "https://www.youtube.com/watch?v={$snippet['resourceId']['videoId']}";
    $title = $snippet['title'];

    $line = "$url\t$title\n";

    $cnts++;
    echo "$cnts:$line";

    fwrite($fh, $line);
  }

  echo "\n";
  echo "# nextPageToken: {$response['nextPageToken']}\n";
  echo "# prevPageToken: {$response['prevPageToken']}\n";
  echo "# totalResults: {$response['pageInfo']['totalResults']}\n";
  echo "# resultsPerPage: {$response['pageInfo']['resultsPerPage']}\n";
  echo "\n";

  $pageToken = $response['nextPageToken'];
  $params['pageToken'] = $pageToken;

  sleep(1);
} while (!empty($pageToken));

fclose($fh);

echo "done.\n";

ここでは、まずプレイリストIDが必要になるので事前に調べておく。プレイリストIDは、"再生リストの全体を見る" ページのURLから調べられる。

"再生リストの全体を見る"ページのURLの例
https://www.youtube.com/playlist?list=PLpjK416fmKwQKmatriVu3rdwv7g4ZJSfD

上記URLの list=に指定されているパラメータ PLpjK416fmKwQKmatriVu3rdwv7g4ZJSfD がプレイリストIDに該当する。

プレイリストIDが分かったら、$youtube->playlistItems->listPlaylistItems() を使ってAPIリクエストを行う。

このメソッドにはAPIレスポンスに含めるリソースのプロパティとフィルタのパラメータを指定する。リソースのプロパティには snippet を指定する。snippet プロパティを指定すると、タイトルなどのアイテム(今回の場合は動画)の基本情報をレスポンスとして返してくれる。フィルタのパラメータには、下記のようにプレイリストIDとAPIレスポンスに含めるアイテム件数を指定する。


$params = [
  'playlistId' => $uploadsListId,
  'maxResults' => 50
];

上記の設定でリクエストを送るとリクエスト毎に最大50件のアイテムが返ってくる。各アイテムは snippet プロパティを持っているので、このプロパティを参照してエクスポートに必要な動画IDと動画タイトルの値を取得してファイルに書き出していく。

また、コードの下記の箇所については、


  $pageToken = $response['nextPageToken'];
  $params['pageToken'] = $pageToken;

2ページ目以降のAPIレスポンス取得には、pageToken を指定する必要があり、上記コードはその値をセットしている箇所となる。つまり、2ページ目以降は、APIリクエストのフィルタに下記のパラメータを設定してリクエストを行っている。


$params = [
  'playlistId' => $uploadsListId,
  'maxResults' => 50,
  'pageToken' => $pageToken
];

コードを実行すると、エクスポートファイル export.tsv が作成され、タブ区切りで下記のように出力される。


YouTube動画URL1	動画タイトル1
YouTube動画URL2	動画タイトル2
YouTube動画URL3	動画タイトル3
...