地方でリモートワーク

プログラミング、先物、fx,仮想通貨なんでもやります

rubyでgoogle-api-clientを使ってyoutube動画を取得する方法

スポンサーリンク

f:id:ihatov08:20160710234345j:plain

ウィンブルドンの決勝をwowowで見ながら、コーディングしてます。

 グランドスラムとかマスターズ、フェデラーや錦織が出場している大会中はニュースをチェックしつつ、youtubeでハイライト動画を毎回検索していました。

youtubeで大会名とか名前で検索しているのですが、youtubeアプリに毎回アクセスするのも面倒だし、何よりノイズが多いです。ずばり見たいハイライト動画が検索トップに表示されるわけじゃないんです。中身を見てみると画質がいまいちだったりもします。

自分と同じような悩みを持つ人はいるんじゃないかと思い、これをCMSなんかに掲載すれば、意外と需要はあるんじゃないかと思ってます。

でも、手動でやるのはハッカーぽくないし、初めはよくても長続きしない。せっかくエンジニアになったんだし、API使えば、ずばりな動画だけを自動で取得して来れるんじゃないかと目論んでます。

とりあえずは動画だけでも取得してみようということで、とりあえずはうまくいきました。

gemを使うのですが、load errorで全然gemが読み込めなくて3時間くらいはまってました。google developerのサンプルコードそのまま貼り付けてもダメなんですね。 いつもRailsでやってるので、そこらへん理解していないのがわかりました。 以下自分用の備忘録です。

google developerでAPIキーを取得

google developerにアクセスして、APIキーを取得します。

作業用ディレクトリの作成

今回はyoutubeディレクトリで作業をします。

$ mkdir youtube
$ cd youtube

Gemfile管理

Gemを使うので、Gemfileで管理します。

$ bundle init #これでgemfileが作成される
Writing new Gemfile to

gemのgoogle-api-clientとtrollopを使います。google-api-clientは0.9以下じゃないとこの後のrequire 'google/api-clientがload errorになるっぽいです。

Gemfile

# frozen_string_literal: true
# A sample Gemfile
source "https://rubygems.org"
gem 'google-api-client', '<0.9'
# gem "rails"
gem 'trollop', '~> 2.1'
$ bundle install # gemfile.lockが作成される。Gemfileを変更したときはbundle installもしくはbundle update

検索するためのファイル作成

youtubeディレクトリの中に肝心の検索するためのファイルを作成します。

google API Rubyサンプルもしくは githubからサンプルソースコードを参考にしました。このままでは動くはずもなく3時間くらいはまりました。 今回はキーワードで検索してくるサンプルを試してみました。 「Google」で検索すれば、タイトルにGoogleが入っている動画を取得してきてくれます。 サンプルソースのgem google-api-clientの部分を削除してます。 また、自分のAPIキーを入力する必要があります。

yotube.rb

require 'rubygems'
require 'google/api_client'
require 'trollop'

# Set DEVELOPER_KEY to the API key value from the APIs & auth > Credentials
# tab of
# Google Developers Console <https://console.developers.google.com/>
# Please ensure that you have enabled the YouTube Data API for your project.
DEVELOPER_KEY = 'ここに自分のAPIキー'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'

def get_service
  client = Google::APIClient.new(
    :key => DEVELOPER_KEY,
    :authorization => nil,
    :application_name => $PROGRAM_NAME,
    :application_version => '1.0.0'
  )
  youtube = client.discovered_api(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION)

  return client, youtube
end

def main
  opts = Trollop::options do
    opt :q, 'Search term', :type => String, :default => 'ここに検索キーワード'
    opt :max_results, 'Max results', :type => :int, :default => 25
  end

  client, youtube = get_service

  begin
    # Call the search.list method to retrieve results matching the specified
    # query term.
    search_response = client.execute!(
      :api_method => youtube.search.list,
      :parameters => {
        :part => 'snippet',
        :q => opts[:q],
        :maxResults => opts[:max_results]
      }
    )

    videos = []
    channels = []
    playlists = []

    # Add each result to the appropriate list, and then display the lists of
    # matching videos, channels, and playlists.
    search_response.data.items.each do |search_result|
      case search_result.id.kind
        when 'youtube#video'
          videos << "#{search_result.snippet.title} (#{search_result.id.videoId})"
        when 'youtube#channel'
          channels << "#{search_result.snippet.title} (#{search_result.id.channelId})"
        when 'youtube#playlist'
          playlists << "#{search_result.snippet.title} (#{search_result.id.playlistId})"
      end
    end

    puts "Videos:\n", videos, "\n"
    puts "Channels:\n", channels, "\n"
    puts "Playlists:\n", playlists, "\n"
  rescue Google::APIClient::TransmissionError => e
    puts e.result.body
  end
end

main

検索キーワードの部分を今回はWimbledonにしてみました。実際の検索結果がこれ。

$ ruby youtube.rb
Videos:
Reid hoping to raise Wheelchair tennis profile after historic Wimbledon singles win (P8L8sIZ5bQ0)
Roger Federer vs Milos Raonic - Full Highlights | Wimbledon 2016 Semi Final (bljGR7wSk70)
WIMBLEDON 2016 Semi Final : Roger Federer vs Milos Raonic - Highlights HD (H7McNb_dc6c)
Live@Wimbledon 2016 – Day 14 (viisi8ad8lg)
Serena Williams vs Angelique Kerber: Ladies' Final day at Wimbledon (mgAlzVICPTE)
Live@Wimbledon 2016 – Day 13 (YtUqtoMCk50)
Roger Federer STUMBLES & FALLS at Wimbledon vs. Milos Raonic - Semifinals (8LpStjGZEoA)
Roger Federer Semi FINAL Press Conference Wimbledon 2016 (ttljRjlELIc)
Wimbledon 2016 Singles Final Preview (7fbuhFmcDGw)
Milos Raonic vs Roger Federer ✔ Highlights Match ✔ Semi-Final Wimbledon 2016 (M6NiHQVZ84Y)
Venus and Serena Williams Championship Doubles Point - Wimbledon 2016 (y4aTMuOZf9w)
Angelique Kerber warms up ahead of Wimbledon final with Serena Williams (ZPZnV9SINes)
QI | What's Unfair About Wimbledon? (-8HpzZVdhqU)
Milos Raonic INTERVIEW - Wimbledon 2016 : Roger Federer vs Milos Raonic (R53TFLT3q60)
Serena Williams Wins 7th Wimbledon Title, Ties Career Grand Slam Record (Y6sbOxXwwnQ)
Serena Williams 22 Grand Slams | Wimbledon (dStI-K8tat0)
Serena Williams Creates History With 7th Wimbledon, 22nd Grand Slam Title (jirDpKuSYG8)
Wimbledon in numbers - Day 12 (IhGnxzptkI8)
Live@Wimbledon 2016 – Day 12 (Z_WjFZiyxxg)
Wimbledon Ladies Final Preview (O81I5l2Clxg)
2016, Day 11 Highlights, Andy Murray vs Tomas Berdych (qmPtb6-Etck)
Milos Raonic Advances to Wimbledon Finals (RFsQzSHQWMk)
ESPN First Take - Serena Williams vs Angelique Kerber - Trophy presentation - Wimbledon 2016 (iMxnI8750H4)
2016, Day 11 Highlights, Roger Federer vs Milos Raonic (aUj0aCkMipU)

Channels:
Wimbledon (UCNa8NxMgSm7m4Ii9d4QGk1Q)

Playlists:

タイトルと動画のIDを取得してきてくれてます。 どうにか動画の取得まではできるようになりました。 これをRailsに組み込んで、検索条件も絞り込めれば、自分の見たいテニスのハイライト動画のみを取得してきてくれるはずです。 APIめちゃくちゃ便利。。。