Youtubeへの動画アップロードの自動化を行いたいなと思って調べてましたが、ある程度まとまってきたので記事にしてみます。
調べてもあまり実装サンプルが見当たらないですね、Youtubeに動画をアップロードするサンプルは調べてすぐ出てくるものが古いものが多くて調べるのに苦労した感あります苦笑
未来の自分やどなたかの参考になれば幸いです。
Youtube Data API
Youtubeは
- Player API
- Data API
- Analytics API
- Live Streaming API
などに大きく分けられるみたいです。
その中でもData APIが動画アップロードに関連します。
こちらがYoutube Data API(v3)のページです。
環境
- Node.js v16.0.0
出たばかりですね〜
https://twitter.com/bethgriggs_/status/1384540641007448065?s=21
実装手順
基本的には他のGoogle API系と同じです。
credentials.jsonを取得
チュートリアルを参考にAPIを有効にし、credentials.jsonを手元に保存しましょう。
執筆時点のこちらのチュートリアルだと、client_secret.json
というファイル名になっていますが、credentials.json
にリネームします。
google-auth-token-generatorでtoken.jsonを作成
$ npx google-auth-token-generator@0.0.11
Youtubeを選択します。
youtube.readlonly
以外を選択します。(アップロードするときはreadonlyにチェックを入れるとパーミッションエラーで怒られます。)
認証用のURLが発行されるのでブラウザでアクセスしましょう。
ブラウザでアカウントなどを選択して進み、許可ボタンを押します。
コードが発行されるのでコピーして、ターミナルに戻ってコードを貼り付けます。
そうするとtoken.json
が発行されます。
動画をアップロードするコード
公式のupload.jsサンプルはこちらです。これを参考にサンプルを作成しています。
https://github.com/googleapis/google-api-nodejs-client/blob/master/samples/youtube/upload.js
'use strict';
const fs = require('fs');
const readline = require('readline');
const {google} = require('googleapis');
const googleAuth = () => {
const CREDENTIALS_PATH = 'credentials.json';
const TOKEN_PATH = 'token.json';
const credentials = JSON.parse(fs.readFileSync(CREDENTIALS_PATH, 'utf8'));
const token = JSON.parse(fs.readFileSync(TOKEN_PATH, 'utf8'));
const {client_secret, client_id, redirect_uris} = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);
oAuth2Client.setCredentials(token);
return oAuth2Client;
};
(async () => {
const auth = googleAuth();
const youtube = google.youtube({version: 'v3', auth});
console.log(youtube.channels)
try {
const fileName = 'tanaka.mov'; //アップロードする動画ファイル名
const fileSize = fs.statSync(fileName).size;
const res = await youtube.videos.insert(
{
part: 'id,snippet,status',
notifySubscribers: false,
requestBody: {
snippet: {
title: 'Node.js YouTube Upload Test',
description: 'Testing YouTube upload via Google APIs Node.js Client',
},
status: {
privacyStatus: 'private',
},
},
media: {
body: fs.createReadStream(fileName),
},
},
{
// Use the `onUploadProgress` event from Axios to track the
// number of bytes uploaded to this point.
onUploadProgress: evt => {
const progress = (evt.bytesRead / fileSize) * 100;
readline.clearLine(process.stdout, 0);
readline.cursorTo(process.stdout, 0, null);
process.stdout.write(`${Math.round(progress)}% complete`);
},
}
);
console.log('\n\n');
console.log(res.data);
return res.data;
} catch (error) {
console.log('The API returned an error: ' + error);
}
})();
実行
$ node upload.js
無事にアップロードできた
Node.jsからYoutubeに動画をアップロードするテストいけたっぽい #protoout pic.twitter.com/MAWtv3GgyM
— 菅原のびすけ (@n0bisuke) April 17, 2021
タイトルだったりは適宜コードを変更すればいけそうですね。
所感
チュートリアルのサンプルが、Google Driveなどのサンプルより絶妙に古いのと、APIを有効にした際のウィザードが少し他のAPIとフローが違っていて、YoutubeのAPIの独特さを感じました。
元々別だったけど統合していこう、、、みたいな流れなのかマージ途中な雰囲気を感じるという苦笑