YouTubeには、プレイリスト(再生リスト)をエクスポートする機能がないので、YouTube Data API v3を利用して簡単なエクスポート機能を自作した。
この機能を実装するには、
- APIリクエストを行うオブジェクトを作成
- プレイリスト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
...