Python3でYouTubeの動画管理

今回は試しに自分のアカウントの動画の一覧をコンソールに表示させます。

## 開発環境

+ Python3.5
+ GoogleAPI使用
+ ルートのPython環境はAnaconda等のconda系を使用して仮想環境を構築
+ インターネットに接続可能であること
+ YouTubeに１個以上動画ファイルが上がっていること（今回は前述の通り、一覧を表示するスクリプトのため）
+ 筆者はMacOS10.12.5で実行（恐らく他の環境でも動作出来るのではないかと思う）

## 大まかな手順

1. GoogleAPIの準備
2. Pythonの仮想環境を作る
3. Pythonの実行

## 参考URL

> http://silver-shell.org/blog/?p=227
> http://qiita.com/ottati/items/f7782bc834847470d4c8

## Google Apiの準備

制御は[Google API Console](https://console.developers.google.com/)で行います。

### プロジェクトの作成と認証

GoogleAPIを使うには、「プロジェクト」を作成する必要があります。
[左メニューから「ライブラリ」を選択して](https://console.developers.google.com/apis/library)、YouTube Data APIを選択。
「プロジェクトを作成」を選択。(この他にも「プロジェクト」を作成する方法はあります)
適当に名前を決めてプロジェクトを作成します。
なお、プロジェクトの削除は[こちら](https://support.google.com/cloud/answer/6251787?hl=ja)を参照
<img width="886" alt="006.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/1b180959-b1a2-d83e-bda7-0abe61aa6e4b.png">

### 認証情報

[左メニューから「ライブラリ」を選択して](https://console.developers.google.com/apis/library)、
YouTube Data APIを選択。
「Youtube API Data v3」の横にあるボタンを有効にします。
有効にすると、「認証情報を作成」というボタンが有ると思いますので、それをクリック。

<img width="590" alt="002.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/45e9a4d3-fb69-e1fd-dcec-455c95d54629.png">

なお、同じ画面は「認証情報」->「認証情報」->「ウィザードで選択」でも表示出来ます。
<img width="767" alt="009.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/f9290431-e7fe-7132-555d-5f9732ba774b.png">


#### プロジェクトへの認証情報の追加

「必要な認証情報の種類を決定します。」を「YouTube Data API v3」に
「APIを呼び出す場所」を「ウェブブラウザ(Javascript)」に
「アクセスするデータの種類」を「ユーザデータ」にして
「必要な認証情報」をクリック。
<img width="454" alt="003.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/436a7a03-9c2d-c03d-95cf-59b9dc15a2a9.png">

#### OAuth 2.0クライアントを作成する

識別用に適当な名前を英文で付けます。
<img width="437" alt="004.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/eaa6749d-484d-e15f-e6d1-f5ece0fdf0de.png">


承認済みのリダイレクトURIを「 http://localhost:8080/ 」
にします。
（この部分は、環境によって変わる可能性があります。8000だったり8090だったり。また、最後の「/」を入れておかないと動作しなかったりもするようです。）
<img width="426" alt="005.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/1a7a7fa9-0398-927a-a7fd-f483c13a0f2b.png">

#### 認証情報をダウンロードする

Python上で使用する設定が記述されたjsonファイルを「ダウンロード」ボタンを押してダウンロードします。
ここの設定完了後にダウンロードも可能ですが、ここでダウンロードした時とファイル名が違うことがあります。（ファイル名が違うだけで同じ内容）
（今回はclient_id.jsonというファイルでした。）
<img width="796" alt="007.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/60e55548-e852-93c5-aecb-b61ca50799dc.png">

## Pythonの仮想環境構築

ターミナル（windowsならコマンドプロンプト）で動作用に新しいPythonの仮想環境を構築します。
今回はyoutubeという名前にしました。

```cmd:command
conda create -n youtube python=3.5.3
# Anacondaのセットで作成する場合
# conda create -n youtube python=3.5.3 anaconda
# 作った環境を確認するときは
# conda info -e
# conda list -n youtube
# 作った仮想環境を削除する時は
# conda remove -n youtube --all
```

### 仮想環境のアクティブ化

以降の作業は、仮想環境上で行います。

```cmd:command
# Windows
activate youtube
# 非アクティブ化
# deactivate

# Mac
source activate youtube
# 非アクティブ化
# source deactivate
```

### Djangoのインストール

```command:cmd
conda install -c https://conda.anaconda.org/anaconda django
```

### GoogleApiClientをインストール

```command:cmd
pip install --upgrade google-api-python-client
```

### oauth2clientをインストール
https://github.com/google/oauth2client

```command:cmd
pip install --upgrade oauth2client
```

### 念のためアップデート

> http://mikegrouchy.com/blog/2014/06/pro-tip-pip-upgrade-all-python-packages.html

```command:cmd
pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs pip install -U
```

## Pythonの実行

### Pythonプロジェクトの作成

Pythonファイルを保存するディレクトリを作り、先程ダウンロードしたファイルをそこに移動します。

### Pythonファイルを作成。

今回は、アップロードしたファイルの一覧表を取得というのを行います。
下記URLの「マイ アップロード動画の取得」スクリプトをベースに一部修正しております。

> https://developers.google.com/youtube/v3/code_samples/python?hl=ja#retrieve_my_uploads

下記のスクリプトを記述したPythonファイルを作成します。（今回はmain.pyという名前）
<img width="125" alt="010.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/efed07f4-3471-8b1d-3751-e4a2f5ad2048.png">

```python:main.py
#! env python
# -*- coding: utf-8 -*-

import httplib2
import os
import sys
import glob

from apiclient.discovery import build
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import argparser, run_flow

if __name__ == '__main__':
    # カレントディレクトリを実行ファイルの位置に変更する
    os.chdir(os.path.dirname(os.path.abspath(sys.argv[0])))

    CLIENT_SECRETS_FILE = "client_id.json"  # ダウンロードしたファイル名

    MISSING_CLIENT_SECRETS_MESSAGE = """
    WARNING: Please configure OAuth 2.0

    To make this sample run you will need to populate the client_secrets.json file
    found at:

       %s

    with information from the Developers Console
    https://console.developers.google.com/

    For more information about the client_secrets.json file format, please visit:
    https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
    """ % os.path.abspath(os.path.join(os.path.dirname(__file__),
                                       CLIENT_SECRETS_FILE))

    YOUTUBE_READONLY_SCOPE = "https://www.googleapis.com/auth/youtube.readonly"
    YOUTUBE_API_SERVICE_NAME = "youtube"
    YOUTUBE_API_VERSION = "v3"

    CLIENT_SECRETS_FILE_PATH = glob.glob(os.path.join(os.getcwd(), CLIENT_SECRETS_FILE))[0]

    flow = flow_from_clientsecrets(os.path.join(os.getcwd(), CLIENT_SECRETS_FILE_PATH),
                                   message=MISSING_CLIENT_SECRETS_MESSAGE,
                                   scope=YOUTUBE_READONLY_SCOPE)

    storage = Storage("%s-oauth2.json" % sys.argv[0])
    credentials = storage.get()

    if credentials is None or credentials.invalid:
        flags = argparser.parse_args()
        credentials = run_flow(flow, storage, flags)

    youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
                    http=credentials.authorize(httplib2.Http()))

    channels_response = youtube.channels().list(
        mine=True,
        part="contentDetails"
    ).execute()

    for channel in channels_response["items"]:
        uploads_list_id = channel["contentDetails"]["relatedPlaylists"]["uploads"]
        print("Videos in list %s" % uploads_list_id)
        playlistitems_list_request = youtube.playlistItems().list(
            playlistId=uploads_list_id,
            part="snippet",
            maxResults=50
        )
        while playlistitems_list_request:
            playlistitems_list_response = playlistitems_list_request.execute()

            for playlist_item in playlistitems_list_response["items"]:
                title = playlist_item["snippet"]["title"]
                video_id = playlist_item["snippet"]["resourceId"]["videoId"]
                print("%s (%s)" % (title, video_id))

            playlistitems_list_request = youtube.playlistItems().list_next(
                playlistitems_list_request, playlistitems_list_response)

```

### 初回の実行

仮想環境上のターミナル（windowsならコマンドプロンプト）での実行の場合

```command:cmd
cd (Pythonのプロジェクトディレクトリ)
python main.py
```

初回実行すると、ブラウザが起動して
「(認証情報の名前)が次の許可をリクエストしています。」
と出ますので、許可を出します。
※ ここでエラーが表示された場合、前述した承認済みのリダイレクトURIのポートを8080から他の番号（エラー内に記述されている番号とか）にしてみてください。変更したら、認証情報のダウンロードもしなおしてください。なお、変更後はしばらく時間をおいておかないと反映されないという話もあります。
<img width="459" alt="008.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/64e7cbf6-4bff-b793-bae8-dbc18f6c600d.png">


### 実行完了

以上を実行すると、コンソールに今までアップロードした動画一覧が表示されます。

## その他の制御

リスト表示以外にも様々な制御が可能です。
当然ですが動画の削除を行う時は十分に検証してから自己責任で行いましょう。

> https://developers.google.com/youtube/1.0/developers_guide_python