きっかけ
私は、好きなYouTube動画を自分用でまとめてるWordpressブログを持ってます。
あの日見た動画をもう一度見たいって思っても、探し出せないことがあるんですよね!
履歴辿ったり、再生リストに入れたりしても、もしその動画が消えていたりしたら分かる術があまりないので、Wordpressブログにまとめてます。
WordPressでまとめれば好きなカテゴリやタグも自由に設定できるし、自分が見た日付も記録されるので便利です。
どうやるか?
YouTubeから直接Wordpressに画像をアップロードすることはできなさそうなので、一度GoogleDriveに保存して、それをWordpressにアップロードします。
YouTube → GoogleDrive → WordPress
GoogleDriveに画像がどんどん残りますが、残したくなければWordPressにアップロードしたら削除するようにすればOK
サンプルコード
前提条件
- YouTubeのサムネイル画像はサイズによって複数あるのですが最大サイズ(maxresdefault.jpg)が存在している前提です。
参考:YoutubeサムネイルURL取得 - なぜかYoutubeのサムネによってはGoogleDriveからWordpressへのアップロードに失敗する。ですが、ローカルに落としてペイントで編集したものをGoogleDriveにアップロードして↓のコードで実行すると成功する・・・謎。
- レンタルサーバー側のWAFを無効化する必要がある。
コード
function getMediaID(youtubeId) {
// 保存場所、ファイル名、対象画像URL
const folderId = 'GoogleDriveのフォルダID'; // ./Media
const fileName = `GoogleDrive保存時のファイル名`;
const imageUrl = `https://img.youtube.com/vi/${data['youtubeId']}/maxresdefault.jpg`;
// ====== Google Drive に保存 ==============
// 画像をダウンロード
let responseImg = UrlFetchApp.fetch(imageUrl);
let imageBlob = responseImg.getBlob().setName(fileName);
// Googleドライブに保存
let folder = DriveApp.getFolderById(folderId); // 保存先フォルダを指定
let file = folder.createFile(imageBlob); // 保存したファイルを取得
let fileId = file.getId();
// ====== Google Drive から WordPress ==============
// 一度変換と再変換を噛ます(なぜかそのままはWPへUPできない><)
const targetFile = DriveApp.getFileById(fileId);
const targetFile_PNG = targetFile.getAs(MimeType.PNG); // png→jpeg に変換
const converedFile = targetFile_PNG.getAs(MimeType.JPEG); // jpeg→png に再変換
targetFile.setTrashed(true);
let newFile = DriveApp.getFolderById(folderId).createFile(converedFile);
newFileId = newFile.getId();
let newFileName = newFile.getName();
// WordPressにUPするために変換後のファイル(newFile)だけ共有設定を行う
// リンクを知っている全員が閲覧可
newFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
// Googleドライブ上で共有設定した時の画像ファイルのURL
let newFileUrl = 'https://drive.google.com/uc?export=view&id=' + newFileId;
let headers = {
// 'Content-Type': 'image/png',
'Content-Disposition': 'attachment;filename='+newFileName+'.jpg',
'accept': 'application/json',
'Authorization': 'Basic ' + Utilities.base64Encode(BLOG_USER + ":" + BLOG_API_PASSWORD)
};
let options = {
'method': 'POST',
'muteHttpExceptions': true,
'headers': headers,
'payload': UrlFetchApp.fetch(newFileUrl)
};
let response = UrlFetchApp.fetch(BLOG_URL + '/wp-json/wp/v2/media', options);
let responseJson = JSON.parse(response.getContentText());
// ====== UpしたメディアIDを返す ==============
return responseJson.id
}
概説
getMediaID関数は、youtubeId(Youtubeの動画ID)を引数として受け取り、WordPressのメディアIDを返します。
途中、GoogleDriveにUPしたり変換したりしてます。
所感
WAFを無効化するのはちょっと怖い・・・。
YouTubeのサムネ画像によって挙動が変わって四苦八苦した。
最大サイズがない場合の処理は追加で実装する必要あり!