0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[GAS] YouTubeのサムネイル画像をWordPressのサムネ画像にする方法

Posted at

きっかけ

私は、好きな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のサムネ画像によって挙動が変わって四苦八苦した。
最大サイズがない場合の処理は追加で実装する必要あり!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?