最近の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に行く
  • プロジェクトを作成する
    GenerateProgect1.png
    GenerateProject2.png

  • APIキーを取得する(プロジェクトを作成できればできています)
    GetNewAPIKey.png

  • Youtube Data APIを有効にする
    EnableYoutubeDataAPI.png

Google API Ruby Clientを使うための準備

google-api-ruby-clientはGoogleのAPIを触るための、Google謹製のRubyライブラリです。
0.8.x以降にて大幅な変更があり、ライブラリの使い方が大きく変更しています
Gemfileに記述する場合は

Gemfile
gem 'google-api-client', '~> 0.11'

または

gem install google-api-client

を実行してライブラリをインストールする。使い方などは基本的にRubyDocsのドキュメントを参照することをお勧めします。(公式などを探してもなかなかのっていないので)

YouTube Data API (v3)を使ってみる

使い方や使用例など

初期化

require 'google/apis/youtube_v3'

youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = "API KEY"

これで各種Google APIのエンドポイントに対応したメソッドを実行することができます。(Google API Ruby Clientを使ってYoutube以外のAPI利用する場合も同様の書き方で初期化することができます)
また、使用する予定のAPIをrequireして呼び出さないとエラーになります

Youtube Search list でリストを取得する

以下は動画を検索してデータを取得するサンプルです。APIに指定できるパラメータや返り値など、詳しくはこちらを参照

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の実行結果が取得できます。
データやアクセスするためのキーを確認する場合、

puts youtube_search_list.to_h

などで出力して確認することができます。(以降同様)

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


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

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

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

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

Youtube Video list でより詳細な動画の情報を取得する

上記検索結果では取得できないより詳細な情報(コメント数やいいねの数など)を取得できます。以下は動画データを取得するサンプルです。APIに指定できるパラメータや返り値など、詳しくはこちらを参照

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に動画を投稿したりすることもできます。詳しくはこちらを参照。
なお、今回はAPIキーのみで取得できる情報でYoutubeAPIを操作しましたが、動画の投稿や履歴の取得など、アカウント情報(個人情報)が必要になる場合はAPIキーのほかにOAuthクライアントIDを取得し、OAuth認証する必要があります。

Youtube-DLを使いYoutubeの動画をファイルにしてダウンロードする

Youtube-DLはYoutubeの動画や音声をファイルとしてダウンロードすることができるライブラリです。このライブラリはPythonで作られています。
RubyにもこのライブラリのWrapperライブラリがありますが、最近更新されていなく動作が不安定のためライブラリ本体を使うことをお勧めします。
またこのライブラリは動画ファイルの変換などに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

他ユーザーの場合、こちらからダウンロードしたり、Githubからダウンロードし、自分でBuildする必要がある。

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

Youtubeの動画を動画ファイルとしてダウンロードする

youtube-dl youtubeURL -o 出力先のファイルパス

Ruby上で行う場合は

system('youtube-dl youtubeURL -o 出力先のファイルパス')

と記述することでYoutubeのダウンがをダウンロードすることができます。
この時、youtubeURLは

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

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

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

原理

Youtubeの動画サイトのHTMLを解析して、scriptタグの中にあるJSON内のdashmpdキーの値をURLデコードしてアクセスすると、XML形式でデータを取得することができます。このXMLの中に音声ファイルと動画ファイルのURLがそれぞれ記載されているのでこの値を参照してファイルをダウンロードすることでデータを取得することができます。
YoutubeHTML.png

まとめ

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.