YouTube Studioのドラフト編集を楽にしたい

## はじめに

YouTubeにとりあえず動画をまとめてアップして、後でドラフト編集しよう...
そう思って放置すると、いつの間にかドラフトが溜まりまくってドラフト編集が憂鬱になる。

そんなことありませんか？

- 家族や親戚等に共有したいホームビデオ
- 会社や学校での勉強会、講義動画
- 学校等のスポーツ試合や各種イベント等の様子を記録した動画
- etc

![img_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617410/163aea16-3c93-7b14-ec64-33d77c093a73.png)


特に同じ設定で公開したい時等、同じ操作をポチポチするのも億劫...

そんな時に有効なやり方を紹介します。

## 解決方法

Chromeの開発者ツール(F12キーで開く)を用いて、Consoleを使ってJavaScriptを実行します。

## 準備

- ブラウザ : Chrome
    - YouTube Studio (https://studio.youtube.com/channel/XXXXXXXX) にアクセスし、ダッシュボード画面(初期画面)からコンテンツ(チャンネルのコンテンツ)画面に移動しておく
    - 1ページあたりの行数は、動画が多い時は50とかに変更しておくと良い
    - 公開設定が「ドラフト」になっている動画が存在するページまでページを送っておく
- コード
    - ここではサンプルとして以下の設定を想定したものとする
        - 子供向けコンテンツではない
        - 非公開設定 (関係者にのみ公開する想定)
        - 他はそのまま (特に設定変更しない)

    ``` javascript
    editDraft = async () => {
      return new Promise ((resolve) => {
        document.querySelector("#row-container > div:nth-child(8) > ytcp-video-list-cell-actions > div > ytcp-button.edit-draft-button.style-scope.ytcp-video-list-cell-actions").click();
        setTimeout(() => resolve(), 3000);
      });
    };
    
    activateNotChild = async () => {
      return new Promise ((resolve) => {
        document.querySelector("#audience > ytkc-made-for-kids-select > div.made-for-kids-rating-container.style-scope.ytkc-made-for-kids-select > tp-yt-paper-radio-group > tp-yt-paper-radio-button:nth-child(2)").click()
        setTimeout(() => resolve(), 3000);
      });
    };
    
    activateLastStep = async () => {
      return new Promise ((resolve) => {
        document.querySelector("#step-title-3").click()
        setTimeout(() => resolve(), 3000);
      });
    };
    
    activatePrivate = async () => {
      return new Promise ((resolve) => {
        document.querySelector("#private-radio-button").click()
        setTimeout(() => resolve(), 3000);
      });
    };
    
    doneEdit = async () => {
      return new Promise ((resolve) => {
        document.getElementById('done-button').click();
        setTimeout(() => resolve(), 10000);
      });
    };
    
    closeDialog = async () => {
      return new Promise ((resolve) => {
        document.querySelector('paper-dialog#dialog ytcp-icon-button[tooltip-label="閉じる"]').click();
        setTimeout(() => resolve(), 10000);
      });
    };
    
    publish = async () => {
      await editDraft();
      await activateNotChild();
      await activateLastStep();
      await activatePrivate();
      await doneEdit();
    };
    
    publishCurrentPageContent = async () => {
      for (i=0; i<50; i++) {
        if (!document.querySelector("#row-container > div:nth-child(8) > ytcp-video-list-cell-actions > div > ytcp-button.edit-draft-button.style-scope.ytcp-video-list-cell-actions")) {
          break;
        }
        await publish();
      }
    };
    ```

お好みの公開設定に応じてカスタムが必要です。

また、サイトのレイアウト、設定項目が変わった等の仕様変更に依存しますので、現時点(2023/7)で有効な事例となります。

## やり方

1. 開発者ツールを開く

    F12を押してください。すると次のような画面になります。
    
    ![img_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617410/647a2ee0-11cc-6a2f-c962-0601d777fbd8.png)

2. Consoleの 「>」にフォーカスし、コードを貼り付けてEnterを押す

    この時以下のようなメッセージが表示されることがあります。

    ```text
    Warning: Don’t paste code into the DevTools Console that you don’t understand or haven’t reviewed yourself. This could allow attackers to steal your identity or take control of your computer. Please type ‘allow pasting’ below and hit Enter to allow pasting.
    ```

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617410/91d86824-8249-32a0-b144-65cd9191bd34.png)

    これはメッセージに従って「>」の後に「allow pasting」と`ちゃんと手動で入力`してEnterを押してください。

    コードを貼り付けられるようになったら、先ほどのコードを貼り付けます。
    貼り付けても、この時点では何も処理が実行されないため安心してください。

    ![img_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617410/29765d80-54d7-7eef-5f13-598b20417748.png)


3. この後は、処理を実行したい時に実行するだけ

    処理を実行する時は、引き続きConsoleの「>」にフォーカスし、

    ``` javascript
    publishCurrentPageContent();
    ```

    を入力してEnterを押す。

    ![img_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617410/d6a7b1e1-dc90-542b-e224-51ffc37fb979.png)


    処理が実行されるため、完了を待ちます。

    ![img_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617410/9e75dc72-b744-8d07-9dfb-cfa557a1e0ec.jpeg)

放置しておくといつの間にか完了!という感じです。

画面を開き直したりするとコードが無効になるため、再度 2. を実施してください。

## 補足

- ページ送りには対応していないため、1ページあたりの処理になります。(50動画毎のページ送りはセルフで)
- エラーのケアはしていないため様子を見てケア(もしくはカスタマイズ)してあげてください。
- 途中で止めたい時はブラウザを更新するなり閉じるなりしてください。
- ドラフト状態の動画一覧の中に、過去に一部手動で「子供向けコンテンツではない」「非公開設定」あたりをいじって保存していた動画があっても、それはこのスクリプトで再設定(上書き設定)されるだけです
    - 一部の動画だけ「子ども向けコンテンツにしたい」「限定公開にしたい」とかはできない点はご注意ください(=一律同じ設定にするロジックのため)
    - また、ロジックで触れていない設定項目は更新されない(そのままになる)のでご注意ください

以上です！