From 68491435b8e7afaee9bc223f870ec298a96960a4 Mon Sep 17 00:00:00 2001 From: Brian Michalski Date: Wed, 5 Aug 2009 13:25:14 -0400 Subject: [PATCH] Adding support for oEmbed format embedding. --- app/controllers/services_controller.rb | 15 ++++++++++++++ app/helpers/services_helper.rb | 2 ++ app/models/thumbnail.rb | 22 +++++++++++++++++++++ app/views/services/oembed.js.erb | 15 ++++++++++++++ app/views/services/oembed.xml.erb | 14 +++++++++++++ config/routes.rb | 2 ++ test/functional/services_controller_test.rb | 8 ++++++++ test/unit/helpers/services_helper_test.rb | 4 ++++ 8 files changed, 82 insertions(+) create mode 100644 app/controllers/services_controller.rb create mode 100644 app/helpers/services_helper.rb create mode 100644 app/views/services/oembed.js.erb create mode 100644 app/views/services/oembed.xml.erb create mode 100644 test/functional/services_controller_test.rb create mode 100644 test/unit/helpers/services_helper_test.rb diff --git a/app/controllers/services_controller.rb b/app/controllers/services_controller.rb new file mode 100644 index 0000000..59191b5 --- /dev/null +++ b/app/controllers/services_controller.rb @@ -0,0 +1,15 @@ +class ServicesController < ApplicationController + + def oembed + id = params[:url].scan(/\/(\d+)$/i).first.first + @video = Video.find(id) + + @thumbnail = @video.thumbnails.first + @thumb_size = @thumbnail.guess_size('thumb') + + respond_to do |format| + format.xml # oembed.xml.erb + format.js # oembed.js.erb + end + end +end diff --git a/app/helpers/services_helper.rb b/app/helpers/services_helper.rb new file mode 100644 index 0000000..de58435 --- /dev/null +++ b/app/helpers/services_helper.rb @@ -0,0 +1,2 @@ +module ServicesHelper +end diff --git a/app/models/thumbnail.rb b/app/models/thumbnail.rb index 048064b..3799f5c 100644 --- a/app/models/thumbnail.rb +++ b/app/models/thumbnail.rb @@ -9,4 +9,26 @@ class Thumbnail < ActiveRecord::Base default_scope select_without_file_columns_for(:image) + def guess_size(style = '') + if(style == 'thumb' || style == 'small') + if(style == 'thumb') + max = 75 + elsif(style == 'small') + max = 150 + else + max = 0 + end + #Compute how big the thumbnail should be + if self.video.width >= self.video.height + width = max + height = (self.video.height.to_f / self.video.width.to_f * width).to_i + else + height = max + width = (self.video.width.to_f / self.video.height.to_f * height).to_i + end + return {:width => width, :height => height} + else + return {:width => self.video.width, :height => self.video.height} + end + end end diff --git a/app/views/services/oembed.js.erb b/app/views/services/oembed.js.erb new file mode 100644 index 0000000..1cbd1af --- /dev/null +++ b/app/views/services/oembed.js.erb @@ -0,0 +1,15 @@ +<% data = {:type => 'video', + :version => 1.0, + :provider_name => 'Bonsai Video', + :provider_url => url_for(:controller => 'videos', :action => 'index', :only_path => false), + :title => @video.name, + :html => (render :partial => 'videos/playback/handler', :locals => {:video => @video}), + :width => @video.width, + :height => @video.height, + :duration => @video.duration, + :thumbnail_url => path_to_url(@thumbnail.image.url(:thumb)), + :thumbnail_width => @thumb_size[:width], + :thumbnail_height => @thumb_size[:height], + :video_id => @video.id + } +<%= "#{params[:callback]}(" if params[:callback]%><%= data.to_json %><%= ")" if params[:callback] %> \ No newline at end of file diff --git a/app/views/services/oembed.xml.erb b/app/views/services/oembed.xml.erb new file mode 100644 index 0000000..782c5a9 --- /dev/null +++ b/app/views/services/oembed.xml.erb @@ -0,0 +1,14 @@ +<% data = {:type => 'video', + :version => 1.0, + :provider_name => 'Bonsai Video', + :provider_url => url_for(:controller => 'videos', :action => 'index', :only_path => false), + :title => @video.name, + :html => (render :partial => 'videos/playback/handler', :locals => {:video => @video}), + :width => @video.width, + :height => @video.height, + :duration => @video.duration, + :thumbnail_url => path_to_url(@thumbnail.image.url(:thumb)), + :thumbnail_width => @thumb_size[:width], + :thumbnail_height => @thumb_size[:height], + :video_id => @video.id + } %><%= data.to_xml({:root => 'oembed'}) %> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index b89976e..0a85ff0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,10 +5,12 @@ map.resources :profiles + map.root :controller => "videos" #Exposes the video download interface map.connect ':controller/:action/:id/:filename.:format' + map.connect ':controller/:action.:format' #Regular routes map.connect ':controller/:action/:id' diff --git a/test/functional/services_controller_test.rb b/test/functional/services_controller_test.rb new file mode 100644 index 0000000..b311c24 --- /dev/null +++ b/test/functional/services_controller_test.rb @@ -0,0 +1,8 @@ +require 'test_helper' + +class ServicesControllerTest < ActionController::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/unit/helpers/services_helper_test.rb b/test/unit/helpers/services_helper_test.rb new file mode 100644 index 0000000..67e84ed --- /dev/null +++ b/test/unit/helpers/services_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class ServicesHelperTest < ActionView::TestCase +end