最近のGoogle API Ruby Clientを使ってYoutubeで動画を探してファイルとしてダウンロードする

今回実践した環境をご紹介します。

|言語・ライブラリ|バージョン|
|:---:|:---:|
|Ruby|2.5.0|
|Google API Ruby Client|0.19.7|
|Youtube-DL|youtube-dl 2018.02.11|
|FFMpeg|n3.4.2|

# Google APIをを触るための準備
## API Keyの取得

 * [Google API Console](https://console.developers.google.com/?hl=ja)に行く
 * プロジェクトを作成する
![GenerateProgect1.png](https://qiita-image-store.s3.amazonaws.com/0/72596/997dd6e1-eb67-891c-f6aa-c54f5262866b.png)
![GenerateProject2.png](https://qiita-image-store.s3.amazonaws.com/0/72596/153633e7-dc8d-184a-23d6-c7884971e6cb.png)

 * APIキーを取得する(プロジェクトを作成できればできています)
![GetNewAPIKey.png](https://qiita-image-store.s3.amazonaws.com/0/72596/af9dcd96-ac83-56d2-dedb-a3b9446af69e.png)

 * Youtube Data APIを有効にする
![EnableYoutubeDataAPI.png](https://qiita-image-store.s3.amazonaws.com/0/72596/b3823a98-7754-933a-c7ec-dd9d4dbd04e0.png)


## Google API Ruby Clientを使うための準備
[google-api-ruby-client](https://github.com/google/google-api-ruby-client)はGoogleのAPIを触るための、Google謹製のRubyライブラリです。
<font color="#FF0000">0.8.x以降にて大幅な変更があり、ライブラリの使い方が大きく変更しています</font>
Gemfileに記述する場合は

```RUby:Gemfile
gem 'google-api-client', '~> 0.11'
```

または

```
gem install google-api-client
```
を実行してライブラリをインストールする。使い方などは基本的に[RubyDocs](http://www.rubydoc.info/github/google/google-api-ruby-client/)のドキュメントを参照することをお勧めします。(公式などを探してもなかなかのっていないので)

# [YouTube Data API (v3)](https://developers.google.com/youtube/v3/?hl=ja)を使ってみる
## 使い方や使用例など
### 初期化
```Ruby
require 'google/apis/youtube_v3'

youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = "API KEY"
```
これで各種Google APIのエンドポイントに対応したメソッドを実行することができます。(Google API Ruby Clientを使ってYoutube以外のAPI利用する場合も同様の書き方で初期化することができます)
また、<font color="#FF0000">使用する予定のAPIをrequireして呼び出さないとエラーになります</font>

### Youtube Search list でリストを取得する
以下は動画を検索してデータを取得するサンプルです。APIに指定できるパラメータや返り値など、詳しくは[こちら](https://developers.google.com/youtube/v3/docs/search/list?hl=ja)を参照

```Ruby
require 'google/apis/youtube_v3'

youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = "API KEY"
youtube_search_list = youtube.list_searches("id,snippet", type: "video", q: "キーワード", max_results: 50)
```
上記の場合、youtube_search_listにAPIの実行結果が取得できます。
データやアクセスするためのキーを確認する場合、

```Ruby
puts youtube_search_list.to_h
```
などで出力して確認することができます。(以降同様)

YoutubeのAPIでは第一引数は必須パラメータである、partの指定になります。partは取得したい情報をカンマ区切りで列挙指定します。<font color="#FF0000">複数指定すると多くの情報が取得できますが、その分APIの1日の使用制限が少なくなります。</font>
以降はオプションで指定可能なパラメータ要素についてです。

---------------------------------------

* typeキー
Youtube APIでは検索は動画以外にもチャンネルやプレイリストの検索もできます。
今回は動画の検索なので、type: "video"で動画を指定しています。

* qキー
動画の検索は様々な方法がありますが、今回は最もスタンダードなキーワード検索で行うため、q: をキーとしています。

* max_resultsキー
検索した時に取得することができる件数。最大で50件

* page_tokenキー
検索した結果の次のページへの行く時に渡すトークン。検索した結果、検索結果がmax_resultsの数以上ある場合、検索結果の中に入っていいる。

### Youtube Video list でより詳細な動画の情報を取得する
上記検索結果では取得できないより詳細な情報(コメント数やいいねの数など)を取得できます。以下は動画データを取得するサンプルです。APIに指定できるパラメータや返り値など、詳しくは[こちら](https://developers.google.com/youtube/v3/docs/videos/list?hl=ja)を参照

```Ruby
require 'google/apis/youtube_v3'

youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = "API KEY"
youtube.list_videos("id,snippet,statistics", max_results: 50, id: "video_id,video_id,...")
```
指定パラメータやその他の情報についてはおおよそ動画検索の場合と同じです。
しかし、検索の場合と異なり、APIを呼び出す時に指定できる値は限られています。今回はid: video_id(後述)で検索しています。また複数の動画の情報を取得したい場合video_idを,で区切って列挙して指定します。

### その他の情報について 
チャンネル情報やカテゴリ情報の他、Youtubeに動画を投稿したりすることもできます。詳しくは[こちら](https://developers.google.com/youtube/v3/docs/?hl=ja)を参照。
なお、今回はAPIキーのみで取得できる情報でYoutubeAPIを操作しましたが、動画の投稿や履歴の取得など、アカウント情報(個人情報)が必要になる場合はAPIキーのほかにOAuthクライアントIDを取得し、OAuth認証する必要があります。

# [Youtube-DL](https://github.com/rg3/youtube-dl)を使いYoutubeの動画をファイルにしてダウンロードする
[Youtube-DL](https://github.com/rg3/youtube-dl)はYoutubeの動画や音声をファイルとしてダウンロードすることができるライブラリです。このライブラリはPythonで作られています。
<font color="#FF0000">Rubyにもこのライブラリの[Wrapperライブラリ](https://github.com/layer8x/youtube-dl.rb)がありますが、最近更新されていなく</font>動作が不安定のためライブラリ本体を使うことをお勧めします。
またこのライブラリは動画ファイルの変換などに[FFMpeg](https://github.com/FFmpeg/FFmpeg)を使っているのでこちらのダウンロード, インストールも必要です。

## インストール
### Youtube-DLのインストール
UNIXユーザーの場合

```
sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl
```

wgetがある場合

```
sudo wget https://yt-dl.org/downloads/latest/youtube-dl
```

pythonが入っていて、pipが入っている場合

```
sudo -H pip install --upgrade youtube-dl
```

OS Xを使っていてHomebrewが入っている場合

```
brew install youtube-dl
```

### FFMpegのインストール

OS Xを使っていてHomebrewが入っている場合

```
brew install ffmpeg
```

他ユーザーの場合、[こちら](https://www.ffmpeg.org/download.html)からダウンロードしたり、[Github](https://github.com/FFmpeg/FFmpeg)からダウンロードし、自分でBuildする必要がある。

また、mp4など特定の動画や音声のフォーマットを指定して変換が必要な場合は追加でエンコーダーをダウンロードするか、一緒にBuildする必要がある


## Youtubeの動画を動画ファイルとしてダウンロードする
```
youtube-dl youtubeURL　-o 出力先のファイルパス
```

Ruby上で行う場合は

```Ruby
system('youtube-dl youtubeURL -o 出力先のファイルパス')
```
と記述することでYoutubeのダウンがをダウンロードすることができます。
この時、youtubeURLは

```
https://www.youtube.com/watch?v=[video_id]
```

で作成することができ、このvideo_idは上記、APIで取得した値を指定することでyoutubeURLを作成することができます。

なお、動画だけでなく、動画を音声のみをファイルとしてダウンロードすることもできます。

## 原理
Youtubeの動画サイトのHTMLを解析して、scriptタグの中にあるJSON内の<font color="#CC4400">dashmpdキー</font>の値をURLデコードしてアクセスすると、XML形式でデータを取得することができます。このXMLの中に音声ファイルと動画ファイルのURLがそれぞれ記載されているのでこの値を参照してファイルをダウンロードすることでデータを取得することができます。
![YoutubeHTML.png](https://qiita-image-store.s3.amazonaws.com/0/72596/1f2aedec-8aa2-48ed-efad-f02a78f78cd2.png)

# まとめ
主にRubyを使ってGoogleのYoutube APIを使い動画情報を取得し、Youtube-DLを使い動画ファイルとして取得する方法やサンプルをご紹介しました。何かしらのサービスの作成やデータの収集に活用していただければと思います。