LoginSignup
3

More than 1 year has passed since last update.

GASでYoutubeの動画を検索して、自動で再生リストに追加するプログラムを作ってみた。

Posted at

はじめに

毎週複数の同じ検索ワードで検索しては、再生リストに追加してYoutube動画を見ていました。
それが面倒になり、自動化できないかプログラミングしてみました。
PythonでYoutubeの動画を検索して、自動で再生リストに追加するプログラムを作ってみた。
上記のGASバージョンです。
Pythonで週一定期実行したかったのですが、方法がみつからず。
GASなら定期実行ができるので移植しました。

環境

  • google app script
  • youtube api v3
  • windows 10

仕様

  • 7日以内にアップロードされた動画を対象とする
  • 各検索ワードに対して、関連度が高い1つの動画を再生リストに追加する
  • すでに再生リストに含まれる動画は重複しないようにする

流れ

  1. youtubeの認証を通す
  2. 7日前の日付を取得する
  3. 検索ワードで検索結果を取得する
  4. すでに再生リストに含まれるかチェックする
  5. 検索された動画を再生リストに追加する

つまづいたところ

  • Youtube appのマニュアルのJavascriptの記述では実行できない
    • javascriptじゃないのかよ!!!

コード


function searchVideosByKeywords(keywords,strLastWeek){
  var videoIdArray = []
  for(let indKeyword=0; indKeyword < keywords.length;indKeyword++){
    var searchResponse = YouTube.Search.list(
      "id,snippet",
      {
        q: keywords[indKeyword],
        type: "video",
        regionCode: 'jp',
        maxResults: 1,
        publishedAfter: strLastWeek,
      },
    );
    // console.log(searchResponse['items'][0]['id']['videoId']);
    // console.log(searchResponse['items'][0]['snippet']['title']);
    videoIdArray.push(searchResponse['items'][0]['id']['videoId']);
  }
  return videoIdArray;
}

function insertVideosIntoPlaylist(playlistItemsListResponse,videoIdArray,strPlaylist){
  var videoAlready = []
  for (let itemVideo in playlistItemsListResponse["items"]){
    videoAlready.push(playlistItemsListResponse["items"][itemVideo]["snippet"]["resourceId"]["videoId"]);
  }
  // var id = "q4qYRIJzlCs";
  for (let indVideo in videoIdArray){
    if(! isExistInArray(videoIdArray[indVideo],videoAlready)){
      var playlistItemInsertResponse = YouTube.PlaylistItems.insert(
        {snippet:{
          playlistId: strPlaylist,
          resourceId:{
            videoId: videoIdArray[indVideo],
            kind:"youtube#video",
          }
        }
        },
        "snippet",
      );
    }

  }

}

function collectNogizakaRadio(){
  const PLAYLIST_ID = "PLophPL_kQhKnXBP3y78orNmdNZDxNmMQS"
  var keywordArray = [];
  keywordArray.push('乃木坂');
  keywordArray.push('日向坂');
  keywordArray.push('欅坂');

  var dtNow = new Date();
  var dtLastWeek = new Date();
  dtLastWeek.setDate(dtNow.getDate() - 7);
  // console.log(dtLastWeek);
  const strLastWeek = dtLastWeek.toJSON();
  // console.log(strLastWeek);

  var videoIdArray = searchVideosByKeywords(keywordArray,strLastWeek);

  var playlistItemsListResponse = YouTube.PlaylistItems.list(
    "snippet",
    {
      playlistId: PLAYLIST_ID
    }
  );
  insertVideosIntoPlaylist(playlistItemsListResponse,videoIdArray,PLAYLIST_ID);
  console.log("done");
}

function isExistInArray(str,ary){
  var bool = false;
  for(let ind in ary){
    bool = bool || (str == ary[ind]);
  }
  return bool;
}

おわりに

このプログラムで以下を含みます。

  1. 特定のキーワードでYoutube動画検索したときの結果の取得
  2. 特定のYoutube再生リストの動画の取得
  3. 特定のYoutube再生リストに特定の動画を追加する

Youtubeのときと違って、トークンとか管理しなくていいのは楽。
しかし、なぜAPIごとの記法が異なるのか、たどり着くまで大変だった。

これで運用してみたいと思います。

困っていること

Youtubeアカウントをメインアカウントではなく、
ブラインドアカウントから再生リストを操作したいのですが、できません。
方法をご存じの方がいたら教えてください。

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
3