GoogleAppsScript

GASでYouTubeの自分の再生リストを全て非公開にする。

More than 3 years have passed since last update.

前置き

今まで、YouTubeの動画をお気に入りに登録するのと同じように、再生リストにまとめてきたのですが、
非公開のつもりでまとめていたら、どうやら公開されているということに気が付きました。
で、泣く泣く手動で再生リストを非公開化しようと思ったら、「数が膨大でやってられない!」
ということで、ふと、GASにYouTubeのAPIが追加されたのを思い出して、全て非公開にするスクリプトを
作って動かしてみました。

本日のコード

コード.gs
function myFunction() {
  var nextToken = "";
  while(nextToken != null) {
    var res = YouTube.Playlists.list('snippet,status', 
                                     {maxResults: 50,
                                      mine: true,
                                      pageToken: nextToken});

    for(var i = 0; i < res.items.length; i++) {
      var item = res.items[i];

      // PlaylistResponse.itemsの型はPlaylist
      if(item.status.privacyStatus != "private") {
        Logger.log("update: " + item.snippet.title + ", " + item.status.privacyStatus );
        item.status.privacyStatus = "private";
        var updateRes = YouTube.Playlists.update(item, "snippet, status");
        Logger.log(updateRes.status.privacyStatus);
      }

    }

    nextToken = res.nextPageToken;
  }
}

YouTube Data APIの有効化と承認が必要です。

GASからYouTubeのAPIを実行するためにAPIを有効にします。
gas側の有効化.png

同時に、Developer ConsoleでもAPIを有効にしておきます。
api有効化.png

実行時に、読み取りと、書き込みの承認をします。YouTube.Playlists.list()YouTube.Playlists.update()を別々に試したので2つに分かれていますが、いきなり更新まで試す場合は、1回で済むと思います。
読み取りの承認.png
書き込み承認.png

解説

まず、自分の再生リストを取得するには、YouTube.Playlists.list()を使います。第1引数が難しいですが、"snippet"を指定すると、再生リストのデータが取得されますが、公開/非公開などのstatus情報は付加されません。(GASでは、undefined)
従って、第1引数は、カンマ区切りで、"snippet,status"と指定しています。ただし、"status"だけでは、エラーになります。

YouTube.Playlists.list()は、最大50件まで、デフォルト5件なので、それ以上登録している場合は、pageTokenパラメータにYouTube.Playlists.list()で取得したnextPageTokenを指定します。最後まで取得し終わったらnextPageTokenがnullになりますので、while文で繰り返し取得します。
(私は、タイプミスがあって、無限ループしていると思い込んでいたけど、実は違ってた…)

戻り値に再生リストレスポンスが返されるので、それをそのまま利用します。
res.items[i]が再生リストの情報です。

公開/非公開情報は、res.items[i].status.privacyStatusに入っていて、"private"、"public"、"unlisted"の3のうちどれかが格納されています。ので、"private"でなければ、"private"に上書きして、YouTube.Playlists.update()を呼び出します。
引数が2つのものと、3つのものがありますが、今回のケースでは、2つの方を使えば大丈夫です。

結果

無事、全て非公開になりました!
が、もう少しGAS側で吸収できないのかな…。statusを付けずに読み取るなんていうことがありえるんだろうか…?まあ、いらないものは送らない方が速度面で有利だとは思うけど、パラメータの指定方法はわかりにくい…。

参考

https://developers.google.com/apps-script/advanced/youtube
https://developers.google.com/youtube/v3/docs/playlists