【Go】ターミナルでホロライブの推しの配信予定を確認する

# はじめに
Go言語でホロライブの推しの配信中の枠 or 配信予定の枠をターミナル上で確認できるツールを作りました. 
こんな感じに名前とstatusを指定することで検索結果を表示します. 
![スクリーンショット 2020-08-20 12.44.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242603/7bbad874-6280-3e73-b198-986e35593447.png)
この記事では核となるYoubue DATA APIに関する説明をメインにします. 
コードの全てを説明はしないので, 興味がある方は[githubのリポジトリ](https://github.com/shinya-ml/holo_check_CLI)をご覧になってください. 

# Youtube DATA API
今回の核となるサービスです. Youtubeといろんな情報をやりとりするためのAPIで, [ここ](https://developers.google.com/youtube/v3/getting-started?hl=ja)にリファレンスやら使い方が載っています. さらにブラウザ上でAPIをお試しで使うこともできるので, 実際にプログラムから呼び出す前にどんなレスポンスが返って来るのか確かめることもできます. 
今回は, その中の[Search API](https://developers.google.com/youtube/v3/docs/search?hl=ja)を使っていきます. リクエストする際に色々なパラメータを指定できるのですが, 今回は以下の3つのパラメータだけ指定します.

- channelId: 検索したいチャンネルのID (上の例だと桐生ココさんのチャンネルIDを指定しています)
- maxResults: 返ってくる検索結果の最大数
- order: 検索結果の並び順 (日時が新しい順に結果が欲しいので, dateにしています)

今回はこのAPIをGo言語を使って呼び出すんですが, Go言語にはYoutube DATA APIにアクセスするためのパッケージが用意されています. ([GoDoc](https://godoc.org/google.golang.org/api/youtube/v3)) 
GoでSearch APIをとりあえず呼び出してみようと思うと以下のように書けば結果が返ってきます. (簡単のためエラーを握り潰しています)

```golang
import (
    "net/http"
    "google.golang.org/api/youtube/v3"
)

func main(){
   sevice, _ := youtube.New(&http.NewClient{})
   call := service.Search.List([]string{"snippet"})
   resp, _ := call.Do()
}
```
どんなレスポンスが返ってきてるかというと, ちょっと長いですがこんな感じ. 

```json
{
  "kind": "youtube#searchListResponse",
  "etag": "C-VRzIwOOxWVPQvWTxeLEYpPU_o",
  "nextPageToken": "CAEQAA",
  "regionCode": "JP",
  "pageInfo": {
    "totalResults": 254,
    "resultsPerPage": 1
  },
  "items": [
    {
      "kind": "youtube#searchResult",
      "etag": "0-mINIWG26fwpoxKsChMO9DXFaM",
      "id": {
        "kind": "youtube#video",
        "videoId": "2rOsa2StCAg"
      },
      "snippet": {
        "publishedAt": "2020-08-18T16:03:15Z",
        "channelId": "UCS9uQI-jC3DE0L4IpXyvr6w",
        "title": "【#桐生ココの怖い話】ASMR怪談話‥其の二‥【ヘッドホン推奨】",
        "description": "視聴者のみなさんからいただいた恐ろしい怪談話を語り部：いながわココじが、ASMRマイクでじっとりと語る配信第二弾！ ※イヤホン・ヘッドホンでの視聴を推奨します ※本 ...",
        "thumbnails": {
          "default": {
            "url": "https://i.ytimg.com/vi/2rOsa2StCAg/default_live.jpg",
            "width": 120,
            "height": 90
          },
          "medium": {
            "url": "https://i.ytimg.com/vi/2rOsa2StCAg/mqdefault_live.jpg",
            "width": 320,
            "height": 180
          },
          "high": {
            "url": "https://i.ytimg.com/vi/2rOsa2StCAg/hqdefault_live.jpg",
            "width": 480,
            "height": 360
          }
        },
        "channelTitle": "Coco Ch. 桐生ココ",
        "liveBroadcastContent": "upcoming",
        "publishTime": "2020-08-18T16:03:15Z"
      }
    }
  ]
}
```
その中でも必要な情報はこれだけ. 

```json
"items": [
    {
      "id": {
        "videoId": "2rOsa2StCAg"
      },
      "snippet": {
        "title": "【#桐生ココの怖い話】ASMR怪談話‥其の二‥【ヘッドホン推奨】",
        "liveBroadcastContent": "upcoming"
      }
    }
  ]
```
- videoId: 枠のURLを表示するために必要 (https://youtube.com/watch?v=videoIdとなっている)
- title: 枠タイトル
- liveBroadcastContent: 枠のステータス
  - upcoming: 配信予定
  - live: 配信中
  - none: 動画

本当はいつから配信開始なのかも表示したかったのですが取ってこれず...
Goではこの検索結果に対応するSearchResultという構造体が定義されていてJSONで見たまんまのアクセスができます. 

# 終わり
Youtube DATA APIには1日あたりのリクエスト上限が設けられていて無限に使える訳ではありません. ブラウザが使えるならホロジュールを使いましょう.