質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Ruby

    9406questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    8826questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • YouTube API

    109questions

    YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

rails youtubeapiを使う

解決済

回答 2

投稿

  • 評価
  • クリップ 3
  • VIEW 1,893

SigenSakiyama

score 36

railsで YOUTUBEAPIのsearch.list メソッドを呼び出し、特定のキーワードに関連する検索結果を取得します。そこで調べたのですがrubyではこのような形でできるそうです。これをどうrailsに書くかわかる方,教えてくださると大変助かります。おねがいします。

#!/usr/bin/ruby

require 'rubygems'
gem 'google-api-client', '>0.7'
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 = 'REPLACE_ME'
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 => 'Google'
    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
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

連投しますが、こちらでないとコードが読みにくいので別回答で答えます。

ざっくり書いたコードなので、全く動作保証しません。
また、YoutubeAPIもコードサンプルを斜めに見ただけなので、相当怪しいです。
雰囲気だけでもわかれば。

Railsのコントローラを仮に、YoutubeMovieControllerとします。

# controller/youtube_movie_controller.rb

class YoutubeMovieController < ApplicationController
  
  private
  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 

  public
  def index
  end

  def search_movie
    @search_word = params[:search_word]
    
    opts = Trollop::options do 
      opt :q, @search_word, :type => String, :default => 'Google' 
      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 
        when 'youtube#channel' 
          channels << search_result 
        when 'youtube#playlist' 
          playlists << search_result 
        end
      end
    rescue Google::APIClient::TransmissionError => e 
      flash.now[:error] = e.result.body
      render action: :index
      return false 
    end
  end

end

# view/youtube_movie/index.html.erb

<% flash.each do |key, value| %>
  <%= content_tag(:div, value, class: "#{key}") %>
<% end %>
<%= form_tag search_movie_youtube_movie_path do %>
  <%= text_field_tag :search_word, @search_word %>
  <%= submit_tag "search" %>
<% end %>

# view/youtube_movie/search_movie.html.erb

<h1>ビデオ</h1>
<table>
  <% @videos.each do |video| %>
    <tr><td><%= video..snippet.title</td><td>ここにビデオにジャンプするとかのリンクを置いたりする</td></tr>
  <% end %>
</table>
<h1>チャンネル</h1>
<table>
  <% @channels.each do |video| %>
    <tr><td><%= video..snippet.title</td><td>ここにチャンネルにジャンプするとかのリンクを置いたりする</td></tr>
  <% end %>
</table>
<h1>プレイリスト</h1>
<table>
  <% @video.each do |video| %>
    <tr><td><%= video..snippet.title</td><td>ここにプレイリストにジャンプするとかのリンクを置いたりする</td></tr>
  <% end %>
</table>

こんな感じでわかりますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/25 12:01

    ありがとうございます。エラーがでて調べてわからなかったらまたここで聞かせてもらってもいいですか?

    キャンセル

0

どれぐらいのことをしたいのかよくわからないので、一番単純そうな方法で。

1. 最初のViewで検索ワードを取得
2. そのワードを受け取るコントローラ側に上記のYoutube検索メソッドを実装、
    結果はオブジェクトで返ってくる
3. 結果オブジェクトをViewに渡して表示

といった感じではないでしょうか?

ちょうどRailsのMVCのVCだけ実装する感じですね。

検索結果を永続化したいのであれば、検索結果を保持できるようなModelを作って、
APIから取得したオブジェクトでそのModelを生成、保存するようにすればよいのではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/06/24 12:32

    回答ありがとうございます。僕が作りたいことは、railsで
    キーワードで検索したyoutube動画新着100件を人気順に取得するという感じです。そこで質問なんですが最初のviewとは上のコードの具体的にどの部分でしょうか?controllerはdef get_service から search_response.data.items.each do |search_result| の部分まででしょうか?

    キャンセル

同じタグがついた質問を見る

  • Ruby

    9406questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    8826questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • YouTube API

    109questions

    YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。