前置き
今まで、YouTubeの動画をお気に入りに登録するのと同じように、再生リストにまとめてきたのですが、
非公開のつもりでまとめていたら、どうやら公開されているということに気が付きました。
で、泣く泣く手動で再生リストを非公開化しようと思ったら、「数が膨大でやってられない!」
ということで、ふと、GASにYouTubeのAPIが追加されたのを思い出して、全て非公開にするスクリプトを
作って動かしてみました。
本日のコード
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を有効にします。
同時に、Developer ConsoleでもAPIを有効にしておきます。
実行時に、読み取りと、書き込みの承認をします。YouTube.Playlists.list()
とYouTube.Playlists.update()
を別々に試したので2つに分かれていますが、いきなり更新まで試す場合は、1回で済むと思います。
解説
まず、自分の再生リストを取得するには、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