LoginSignup
0
0

【Rails】Youtube APIを使ってIDで動画を検索する

Last updated at Posted at 2024-03-27

はじめに

この記事ではポートフォリオ作成中に学んだことを自分のために記録しています。
初学者のため、理解が不十分なところがあるかもしれません。
その場合はご指摘いただけると幸いです。

やりたいこと

YouTubeの動画IDから動画情報を検索し、タイトル・概要欄・サムネイルを取得する

準備

  • APIキーの取得
  • APIキーを環境変数に設定
  • YouTube Data API v3を使うためのgemをインストール

この3つを準備していきます。

APIキーの取得

  • Google Cloud Consoleにログイン
  • 新しいプロジェクトを作成

77772AA8-87F8-4842-93B5-FAAF741B9554_1_105_c.jpeg

  • 使用するAPIの有効化

APIとサービスライブラリから使用するものを選びます。
CFD8577F-ECF5-4153-A3D5-5BB976AC6BFB_1_201_a.jpeg

2BD853AF-81F6-4605-9264-C4DC0F9A4563_1_105_c.jpeg

C9F7A280-5A1E-42DF-8FF9-0F1BCFBB6C64_1_105_c.jpeg

Google mapsなどいろんなAPIがありますが、今回はYouTube Data API v3を選択します。

  • アプリケーション制限の設定

APIキーを悪用されないように指定したURLでしか使用できないよう制限をかけます。
サイトのすべてのURLを許可する場合は example.com/* のように設定します。

92573187-1972-42BA-8E14-74CFE6A9D3B9.png

  • APIの制限

念のため取得したAPIキーではYouTube Data API v3しか利用できないよう制限をかけておきます。
(上記のアプリケーション制限の設定をしていれば不要かもしれません)
4C99C30A-F36D-4776-9907-7263112D4C7C.png

F7D28762-B248-4BD7-860E-6C4DA2EBE840.png

これでAPIキーの準備ができました!
認証情報からAPIキーをコピーし、環境変数の設定に進みます。

APIキーを環境変数として保存

APIキーは機密情報のため、dotenv-railsというgemを使用し環境変数として管理します。

  • dotenv-railsのインストール
Gemfile
gem 'dotenv-rails'
  • .envファイルの作成
.env
YOUTUBE_API_KEY= "*****************"

ここに先ほど発行したAPIキーを入力します。

  • .gitignoreへ追記 (重要!)
.gitignore
.env

環境変数を記載した.envはGitHubにプッシュしないよう.gitignoreに追加しておきましょう。

gemのインストール

YouTube Data API v3を扱うためのgemをインストールします。

Gemfile
gem 'google-apis-youtube_v3'

私は初めgoogle-api-clientも一緒にインストールしていたのですが、GitHubを読む限りどうやら不要なようです。

いざ実装

実際に動画情報を取得していきます。
bookmarkモデルのvideo_idカラムの値を使用して動画を検索したいので、BookmarksHelperを作成しました。

app/helpers/bookmarks_helper.rb
module BookmarksHelper
  def get_video_data(video_id)
    require 'google/apis/youtube_v3'

    youtube = Google::Apis::YoutubeV3::YouTubeService.new
    youtube.key = ENV['YOUTUBE_API_KEY']
    
    Rails.cache.fetch("bookmark_#{video_id}", expires_in: 1.days) do
      youtube.list_videos('snippet', id: video_id)
    end.items.first
  end

  def video_title(video_id)
    if get_video_data(video_id).present?
      get_video_data(video_id).snippet.title
    else
      "Video Not Found"
    end
  end

  def video_description(video_id)
    if get_video_data(video_id).present?
      get_video_data(video_id).snippet.description
    else
      "Video Not Found"
    end
  end

  def video_thumbnail(video_id)
    if get_video_data(video_id).present?
      thumbnails = get_video_data(video_id).snippet.thumbnails
      thumbnails_resolutions = [:maxres, :standard, :high, :medium, :default]
      thumbnails_resolutions.each do |resolution|
        return thumbnails.send(resolution).url if thumbnails.send(resolution)
      end
    else
      "not_found.png"
    end
  end
end

上記でやっていること

get_video_data

  • キャッシュの保存期間を1日に設定
    (Google APIの割り当てが1日ごとにリセットされるため)

  • 動画IDで検索し、検索結果の最初の動画を取得
    (検索結果は1件ですが配列で返ってくるためこの記述にしています)

video_title, video_description

  • get_video_dataで取得した動画情報からそれぞれタイトル、概要欄を取得しています。
    渡した動画IDの動画が存在しない場合は"Not Found"を返します。

video_thumbnail

  • get_video_dataで取得した動画情報からサムネイルを取得しています。
    サムネイルは解像度の高い順にmaxres, standard, high, medium, defaultの5種類があるため、その動画が持つサムネイルの中で一番解像度の高いものを返すようにしています。

ヘルパーはこれで完成です!
ビューファイルの中で

<%= video_title(@bookmark.video_id) %>

のように記述すれば動画IDから取得した動画の情報が表示できます。

感想

いろんな記事を参考にさせていただきながら実装しましたが、この記述は何をしているのか?というのを理解するには結局公式を見るのがわかりやすいな〜と感じました。
英語のドキュメントにも恐れず立ち向かっていかなければ…

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0