YouTube Data APIを使ってみる

今回は YouTube Data API v3 を使ってみます。
## YouTube Data API v3 とは
Googleが提供しているAPIのひとつ。
YouTube関連でいうと、他にもYouTube Analytics APIなども提供されていますが、今回は動画検索をしたくYouTube Data APIを利用しました。
YouTube Data APIでは、主に以下のようなことができます。

| 操作 | 概要 |
|:----|:----|
| list | リソース（動画やプレイリスト、チャンネルなど）を取得 |
| insert | 新しいリソースの作成 |
| update | 既存のリソースの変更 |
| delete | 特定のリソースを削除 |

なお、それぞれの操作で扱えるリソースは異なるようです。詳細はドキュメントをご覧ください。
[YouTube Data API の概要#リソースとリソースの種類](https://developers.google.com/youtube/v3/getting-started?hl=ja#resources)

## 前提
利用するためには、**Googleアカウントを所持している**こと。
これさえクリアしていれば簡単に利用できます。
## 手順
### 1. YouTube Data APIの有効化
[https://console.developers.google.com](https://console.developers.google.com)
上記にアクセスし、「新しいプロジェクト」を作成します。お好きなプロジェクト名を入力し、作成します。
プロジェクトが完成したら、右上のベルマークに通知がきますので、そこからプロジェクトページへ移動。
<img width="1430" alt="スクリーンショット 2020-07-06 23.41.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124396/b3e37811-c994-91dd-162c-6ef023dfa579.png">
このような画面がでてきますので、画面中央のAPIから「APIの概要に移動」をクリック。

そして「APIとサービスを有効化」をクリックすると以下のような画面が出てきますので、ここからYouTube Data APIを検索し、「有効にする」をクリック。
<img width="1430" alt="スクリーンショット 2020-07-06 23.46.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124396/e22bd86b-a9d4-3fc8-a61e-03e94bf03dcc.png">
これで、YouTube Data APIを利用できるようになりました。

### 2. Credentialの追加
続いて、APIのアクセスキーを取得します。
<img width="270" alt="スクリーンショット 2020-07-06 23.53.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124396/03a9ec5c-391b-7d87-7070-c037e4c9d11b.png">
プロジェクトページの左側のナビゲーションから「認証情報」をクリック。
「認証情報を作成」→「APIキー」を選択すると、あっという間に作成してくれます。
この作成したAPIキーは、アプリケーション制限（IPアドレスなど）やAPI種類の制限（YouTube Data APIでしか利用できない、など）など、利用制限設定ができますので、適宜設定してください。

…なんと、これで準備は完了です。非常に簡単ですね。

## リソース検索してみる
これで準備が整ったので、実際にAPIを使ってみたいと思います。
今回はScala+Play（Httpクライアントは`okhttp`）で試してみます。

```scala
/**
 * provide Youtube Apis.
 */
@Singleton
class YoutubeApi {

  private lazy val client: OkHttpClient = new OkHttpClient()

  /**
   * Search Youtube Contents.
   *
   * @return 
   */
  def search(): String = {
    val host: String = "https://www.googleapis.com/youtube/v3/search?"
    val params: String = "part=snippet&regionCode=jp&q=hanaenatsuki&key=${key}"
    val url: String = host + params
    val request: Request = new Request.Builder().url(url).build()
    
    client
      .newCall(request)
      .execute()
      .body()
      .string()
  }
```
実行してみると、以下のような結果を取得できました（一部省略）。結果はjsonで返ってきます。

```json
{
  "kind": "youtube#searchListResponse",
  "etag": "5tf0sV-PMXIhtJBWLXFYDiCSBbk",
  "nextPageToken": "CAUQAA",
  "regionCode": "JP",
  "pageInfo": {
    "totalResults": 9302,
    "resultsPerPage": 5
  },
  "items": [
    {
      "kind": "youtube#searchResult",
      "etag": "viayFPw-HKkvnbsnjJfGokVv4_k",
      "id": {
        "kind": "youtube#channel",
        "channelId": "UC3C3YOGFjn7Pq3lOCeUFHfg"
      },
      "snippet": {
        "publishedAt": "2016-12-22T15:41:09Z",
        "channelId": "UC3C3YOGFjn7Pq3lOCeUFHfg",
        "title": "花江夏樹",
        "description": "花江夏樹の個人的な趣味チャンネルです。 普段は声優の仕事をしています。本物です。 基本毎週 月水金 19時更新 (休むこともある)",
        "thumbnails": {
          "default": {
            "url": "https://yt3.ggpht.com/-ar5eKAL9l20/AAAAAAAAAAI/AAAAAAAAAAA/1VHDWCAjXuI/s88-c-k-no-mo-rj-c0xffffff/photo.jpg"
          },
          "medium": {
            "url": "https://yt3.ggpht.com/-ar5eKAL9l20/AAAAAAAAAAI/AAAAAAAAAAA/1VHDWCAjXuI/s240-c-k-no-mo-rj-c0xffffff/photo.jpg"
          },
          "high": {
            "url": "https://yt3.ggpht.com/-ar5eKAL9l20/AAAAAAAAAAI/AAAAAAAAAAA/1VHDWCAjXuI/s800-c-k-no-mo-rj-c0xffffff/photo.jpg"
          }
        },
        "channelTitle": "花江夏樹",
        "liveBroadcastContent": "none",
        "publishTime": "2016-12-22T15:41:09Z"
      }
    },
    {
      "kind": "youtube#searchResult",
      "etag": "gRSJ4tI5FIymRL-rHhEO_GqCXpI",
      "id": {
        "kind": "youtube#video",
        "videoId": "ex9RgLSt5XU"
      },
      "snippet": {
        "publishedAt": "2020-07-05T10:00:11Z",
        "channelId": "UC3C3YOGFjn7Pq3lOCeUFHfg",
        "title": "【Undertale】#1 声優 花江夏樹がアフレコしながらクリアを目指す【アンダーテール】",
        "description": "あらすじ 今回はソロ実況！ あの名作UNDER TALEをプレイしていきます！ ▽出演者 花江夏樹 ▽編集 正一 花江夏樹 ▽DLや購入はこちらから...",
        "thumbnails": {
          "default": {
            "url": "https://i.ytimg.com/vi/ex9RgLSt5XU/default.jpg",
            "width": 120,
            "height": 90
          },
          "medium": {
            "url": "https://i.ytimg.com/vi/ex9RgLSt5XU/mqdefault.jpg",
            "width": 320,
            "height": 180
          },
          "high": {
            "url": "https://i.ytimg.com/vi/ex9RgLSt5XU/hqdefault.jpg",
            "width": 480,
            "height": 360
          }
        },
        "channelTitle": "花江夏樹",
        "liveBroadcastContent": "none",
        "publishTime": "2020-07-05T10:00:11Z"
      }
    },
    ...
  ]
}
```
僕が使ったパラメータだけ簡単に説明します。

| パラメータ | required | 概要 |
|:----|:----|:----|
| part | true | `snippet`にすると動画のタイトルや説明なども取得できる。 |
| regionCode | false | 指定した国の検索結果に絞り込める。 |
| q | false | 検索ワードをセットできる。 |
| key | | アクセスキーをセットできる。 |
その他パラメータや上記パラメータの詳細は以下をご覧ください。
[Search: list](https://developers.google.com/youtube/v3/docs/search/list?hl=ja)

## 注意点
非常にシンプルに利用できますが、無料範囲ではいろいろ制限があります。
<img width="270" alt="スクリーンショット 2020-07-07 0.35.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124396/4d913b7c-ad15-5da3-043d-4e1d728f47cc.png">
こちらの割り当てから利用状況が確認できますが、10,000 Queries / day などの制限があります。
Search APIを一度実行すると102 Queries消費していたので、1日で実行できるのはSearch APIだけだとおおよそ98回程度って感じですね。

無料範囲で利用する場合は、お気をつけください。