【Rails】YouTube APIの導入まとめ

# はじめに
今回はポートフォリオでYouTube APIを活用したいと思い、その流れについて備忘録として本記事を作成しております。また、基本的には様々な記事を見て実装しておりますので、間違い等ございましたら、コメントいただければと思います。

# 現状
###### 技術スタック
OS: macOS Sonoma 14.6.1
Docker: 24.0.2
Docker Compose: v2.18.1
Ruby: 3.1.4
Rails: 7.0.8.1
データベース: PostgreSQL 12.18
CSSフレームワーク: Bootstrap 5
CircleCI: 継続的インテグレーション（CI/CD）を導入

今回の実装で、これらの技術スタックが影響を与えることはないと思いますが、念の為記載しております。

# 手順
#### １ APIキーの取得
[Google API Console](https://console.cloud.google.com/apis)にてプロジェクトを作成し、「APIとサービスを有効にする（翻訳によっては文字が多少異なる）」から、「YouTube Data API v3」を選択して有効ボタンを押してください。
私はこちらの記事を参考にしました。

https://qiita.com/taptappun/items/a217b7017316881d6459

#### ２ Gemfileの追加
```php:Gemfile
gem 'google-api-client'
```
上記のように記述している記事が多く、RubyGems公式ページで確認したところ、2021年以降リリースが止まっていました。ですので調べたところ個別のAPIごとにgemが作成されていたので、今回はそちらを使用していきます。
```diff_ruby:Gemfile
-gem 'google-api-client'
+gem 'google-apis-youtube_v3', '~> 0.53.0'
```
`bundle install`を実行してください。

#### 3 APIキーの設定
今回はYouTube APIを動画一覧画面やユーザごとのおすすめなど様々な箇所で活用していきたいと考えています。そのため、活用するごとにAPIキーの設定を行うのは大変なので、config/initializersに記述していきたいと思います。
```php:config/initializers/youtube_api.rb
require 'google-apis-youtube_v3'

youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = ENV['YOUTUBE_API_KEY']
```
上記のように設定します。`youtube`の中にクラスから作成されたインスタンスが入り、それを活用してAPIキーを取得しています。ここで一点気になったのが、`require`は外部ライブラリを読み込むために記述するものなので、Gemfileにてすでに明記している`google-apis-youtube_v3`を記述する必要があるか疑問でした。なので、今回はこの１文を削除して進めていこうと思います。
```php:config/initializers/youtube_api.rb
youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = ENV['YOUTUBE_API_KEY']
```
このままでは、`youtube`は他のファイルでは使用できないので、`Rails.application.config`に独自設計を作成していこうと思います。作成したい設計は上記に記載している２行です。
```php:config/initializers/youtube_api.rb（修正ver.）
Rails.application.config.youtube_service = Google::Apis::YoutubeV3::YouTubeService.new.tap do |youtube|
    youtube.key = ENV['YOUTUBE_API_KEY']
end
```
この記述で独自設計ができました。少し解説をすると、`Rails.application.config`で`youtube_service`を作成し、その中は先ほどのコードを記載しています。`tap`は`new`で作成したオブジェクトをメソッド内で使用するので、それを活用して`key`の作成もしています。

#### ４ Controllerの作成
```php:ターミナル
rails g controller Videos index
```
Videosコントローラーを作成し、そこに以下の記述をしていきます。
```php:videos_controller
class VideosController < ApplicationController
    def index
        youtube = Rails.application.config.youtube_service
        if params[:query].present?
            search_query = params[:query]
            @videos = search_youtube_videos(query, youtube)
        end
    end

    private

    def search_youtube_videos(query,youtube)
        response = youtube.list_searches(
            'snippet',
            q: query,
            max_results: 1
        )
    end

    response.items.map do |item|
        {
            title: item.snippet.title,
            video_id: item.id.video_id,
            thumbnail_url: item.snippet.thumbnails.default.url
        }
    end
end
```
`youtube`には`Rails.application.config`を入れております。そして、この後に作成する「検索」にデータがあれば、`search_youtube_videos`メソッドを実行する流れです。このメソッドの流れについては、`youtube.list_searches`でどのような情報（snippet）をどのような（キーワード）で何個取得（max_results）するかという流れです。そして、取得したデータを`response`に入れて、その次に詳細を取得しています。

#### ５ index.html.erbの作成
```php:videos/index.html.erb
<h1>YouTube動画検索</h1>

<%= form_with url: videos_path, method: :get, local: true do |f| %>
  <%= f.text_field :query, placeholder: '検索キーワードを入力' %>
  <%= f.submit '検索' %>
<% end %>

<% if @videos.present? %>
  <h2>検索結果</h2>
  <% @videos.each do |video| %>
    <div>
      <h3><%= video[:channel_title] %></h3>
      <p><%= video[:title] %></p>
      <iframe width="560" height="315" src="https://www.youtube.com/embed/<%= video[:video_id] %>" frameborder="0" allowfullscreen></iframe>
    </div>
  <% end %>
<% else %>
  <p>動画が見つかりませんでした。</p>
<% end %>
```
これはとりあえず画面に出るか確認したかったので、またサイトの状況に応じて修正をしていこうと思います。

# おわりに
ここまで長い道のりでしたが、なんとか動画を実装することはできました。初心者で色々な記事などを見ながら実装しているため、全てが理解できているわけではないですが少しずつ理解しながら進めていこうと思います。ここまで閲覧いただき誠にありがとうございました。