動画をPythonでYOUTUBEへ自動アップロード

YOUTUBE公式のAPIがPython2形式などと古かったので全体的に書き直しました。
以下のコードにより動画をYouTubeにアップロードできます。

# コード
```python
# Google APIとの通信に使用するモジュールをインポート
from googleapiclient.discovery import build
# ファイルのアップロードをサポートするクラスをインポート
from googleapiclient.http import MediaFileUpload
# OAuth2認証のフローを管理するクラスをインポート
from google_auth_oauthlib.flow import InstalledAppFlow

# YouTube APIのサービス名とバージョンを定義
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
# 認証時に要求する権限のスコープを定義
SCOPES = ["https://www.googleapis.com/auth/youtube.upload"]
# クライアントの秘密情報が含まれるJSONファイルへのパスを定義
CLIENT_SECRETS_FILE = r"client_secret_path.json"

# 認証関数を定義
def authenticate():
    # OAuth2認証のフローを管理
    flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES)
    # ローカルサーバーを使用して認証情報を取得
    credentials = flow.run_local_server(port=0)
    # 認証情報を使用してAPIサービスを構築
    return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, credentials=credentials)

# ビデオアップロード関数を定義
def upload_video(youtube, file_path, title, description, category, privacyStatus):
    # アップロードリクエストを作成
    request = youtube.videos().insert(
        part="snippet,status",
        body={
            "snippet": {
                "title": title,
                "description": description,
                "categoryId": category
            },
            "status": {
                "privacyStatus": privacyStatus
            }
        },
        # メディアファイルとしてアップロード
        media_body=MediaFileUpload(file_path, chunksize=-1, resumable=True)
    )
    response = None
    while response is None:
        status, response = request.next_chunk()
        if 'id' in response:
            print(f"Video id '{response['id']}' was successfully uploaded.")
        else:
            print("The upload failed with an unexpected response:", response)

# メイン部分
if __name__ == "__main__":
    # 以下は変数の例であり、実際には適切な値を設定する必要があります
    file_path = "path/to/your/video.mp4"
    title = "Test Title"
    description = "Test Description"
    category = "1"  # YouTubeの公式カテゴリリストから選択
    privacyStatus = "public"  # または "private" または "unlisted"

    # YouTube APIサービスを認証
    youtube = authenticate()
    # ビデオをアップロード
    upload_video(youtube, file_path, title, description, category, privacyStatus)
```


このコードはYouTube APIと連携して、ローカルのビデオファイルをYouTubeにアップロードするプロセスを完全に自動化しています。認証からビデオのメタデータの設定、実際のアップロードまで、全てのステップが含まれています。

このコードを実行するには、先にGoogle Developer Consoleでプロジェクトを作成し、YouTube Data API v3を有効にし、OAuth 2.0クライアントIDを生成する必要があります。そして、そのクライアントIDを使って`client_secret_*.json`ファイルをダウンロードし、指定のパスに配置する必要があります。


# 詳細解説

このコードは、YouTubeのAPIを使用して、特定のビデオファイルをYouTubeにアップロードするためのものです。各部分の説明は次のとおりです。

### インポート部分

- `googleapiclient.discovery`：Google APIとの通信に使用するモジュール。
- `googleapiclient.http.MediaFileUpload`：ファイルのアップロードをサポートするクラス。
- `google_auth_oauthlib.flow.InstalledAppFlow`：OAuth2認証のフローを管理するクラス。

### 定数

- `YOUTUBE_API_SERVICE_NAME`、`YOUTUBE_API_VERSION`：YouTube APIのサービス名とバージョン。
- `SCOPES`：認証時に要求する権限のスコープ。
- `CLIENT_SECRETS_FILE`：クライアントの秘密情報が含まれるJSONファイルへのパス。

### 関数

#### `authenticate()`

この関数は、クライアントの認証情報を使用してYouTube APIサービスを構築します。

- `flow`：OAuth2認証のフローを管理。
- `credentials`：ローカルサーバーを使用して認証情報を取得。
- `build`：認証情報を使用してAPIサービスを構築。

#### `upload_video(youtube, file_path, title, description, category, privacyStatus)`

この関数は、指定されたビデオファイルをYouTubeにアップロードします。

- `youtube`：認証されたYouTube APIサービス。
- `file_path`：アップロードするファイルのパス。
- `title`、`description`、`category`：ビデオのタイトル、説明、カテゴリー。
- `privacyStatus`：ビデオのプライバシー設定（"public"、"private"、"unlisted"）。
- `request`：アップロードリクエストを作成。
- `response`：アップロードの応答を処理。

### メイン部分

- ファイルパス、タイトル、説明、カテゴリー、プライバシー設定を設定。
- `authenticate()`を呼び出してYouTube APIサービスを認証。
- `upload_video()`を呼び出してビデオをアップロード。

このコードを実行するには、Google Developer ConsoleでYouTube APIを有効にし、適切な認証情報（`client_secret_*.json`）を取得する必要があります。カテゴリIDもYouTubeの公式カテゴリリストから選ぶ必要があります。

注意: このコードでは `file_path` 変数が未定義のまま使用されているため、実際に実行する際には適切なファイルパスを指定する必要があります。

### その他

- 無料アカウントだと一日10000ポイントまでで動画のアップロードは1600ポイント使うので一日6回まで実行できます。