小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Ruby on RailsでYoutubeから動画を検索するサンプルアプリケーション


Youtubeの提供するAPIを使用して、動画を検索するサンプルアプリケーションをRuby on Railsでつくってみた。今回もさくらインターネットのレンタルサーバ上にアプリケーションを作成していく。

事前準備

プロジェクトの作成

Youtubeという名前でプロジェクトを作成する。データベースは使用しないが、とりあえずMySQL用でプロジェクトを作成しておく。

mkdir Rails
cd Rails
rails Youtube -d mysql
cd Youtube
chmod -R o+w log tmp
コントローラの作成
script/generate controller youtube
公開用ディレクトリにシンボリックリンクを張る
ln -s $HOME/Rails/Youtube/public $HOME/www/Youtube
各種設定ファイルを編集する
  • /publc/.htaccess
  • /config/database.yml
  • /config/environment.rb

上記ファイルの編集方法は、以下のエントリを参照してほしい。
Ruby On Rails2.2で作るサンプルアプリケーション(ON さくらインターネット) - 大人になったら肺呼吸

検索機能の作成

検索画面となるビューを作成する

app/views/youtube/配下にindex.html.erbを作成する。

<h1>Youtube検索</h1>
<% form_tag :action => :search do %>
  <fieldset>
  <legend>検索フォーム</legend>
  <%= text_field_tag :keyword, @keyword, :style=>"width:300px" %>
  <%= submit_tag '検索', :style=>"width:100px" %>
  </fieldset>
<% end %>

<ul>
<% if @data != nil %>
  <% for x, y in @data %>
    <li><%= x %></li>
    <li><%= y %></li>
    <object width="200" height="200">
    <param name="movie" value="<%= y %>"</param>
    <param name="wmode" value="transparent">
    <param name="allowFullScreen" value="false"></param>
    <embed src="<%= y %>" type="application/x-shockwave-flash" wmode="transparent" 
      width="425" height="336" allowfullscreen="false"></embed>
    </object>
  <% end %>
<% end %>
</ul>
検索処理をコントローラに追加する

/app/controllers/youtube_controller.rbを以下のように編集する

class YoutubeController < ApplicationController
  
  # indexアクション
  def index
    respond_to do |format|
      format.html
    end
  end
  
  # searchアクション
  def search
    site = Net::HTTP.start('gdata.youtube.com')
    
    # 検索語をクエリにセットして、リクエストする
    @keyword = params[:keyword]
    requestURL = "/feeds/api/videos?vq=" + @keyword
    requestURL = URI.escape(requestURL)
    response = site.get(requestURL)
    # 検索結果を変数にセットする
    resXML = response.body
    
    site.finish
    
    # XMLを解析して、タイトルだけを取り出す
    @titles = getTitles(resXML)
    # XMLを解析して、動画のURLだけを取り出す
    @movies = getMovies(resXML)
    
    # 画面に5件だけ表示するため、ハッシュを生成して
    # 5件分のタイトルと動画のURLを追加する
    h = Hash::new
    5.times { |i|
      h.store(@titles[i], @movies[i])
    }
    @data = h
    render :action => 'index'
  end
  
  # XMLを解析して、タイトルだけを取り出す関数
  def getTitles xml
    docTree = REXML::Document.new xml
    ary = Array.new()
    # entry/titleという要素の数だけ繰り返し
    docTree.root.elements.each("entry/title") do |element|
      ary.push(element.text)
    end
    
    return ary
  end
  
  # XMLを解析して、動画のURLを取り出す関数
  def getMovies xml
    docTree = REXML::Document.new xml
    ary = Array.new()
    
    # entry/media:group/media:contentという要素の数だけ繰り返し
    docTree.root.elements.each("entry/media:group/media:content") do |element|
      # 先頭がhttp:ではじまっているものだけを取り出す
      tmp = element.attributes['url']
      if tmp.slice(0,5) == "http:" then
        ary.push(hoge)
      end
    end
    
    return ary
  end
  
end
ルーティングの設定
  • public/index.htmlを削除するか、リネームする
  • config/route.rbに以下の行を追加する。
map.connect '', :controller => 'youtube'

これにより、http://xxx.sakura.ne.jp/Youtube/にアクセスした際に、自動的にYoutubeコントローラに処理が渡されるようになる。

動作確認

http://xxx.sakura.ne.jp/Youtube/にアクセスする。