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/にアクセスする。