Commit afc8e318d4e8bf6c7e7a26d404d5fb5fbe822da0
1 parent
4e9c7fe3
Exists in
theme-brasil-digital-from-staging
and in
9 other branches
Improvements for video
Showing
29 changed files
with
763 additions
and
57 deletions
Show diff stats
app/views/content_viewer/_article_toolbar.html.erb
| 1 | <div<%= user && " class='logged-in'" %>> | 1 | <div<%= user && " class='logged-in'" %>> |
| 2 | <div id="article-actions"> | 2 | <div id="article-actions"> |
| 3 | - | ||
| 4 | - | ||
| 5 | <% if @page.allow_edit?(user) && !remove_content_button(:edit, @page) %> | 3 | <% if @page.allow_edit?(user) && !remove_content_button(:edit, @page) %> |
| 6 | <% content = content_tag('span', label_for_edit_article(@page)) %> | 4 | <% content = content_tag('span', label_for_edit_article(@page)) %> |
| 7 | <% url = profile.admin_url.merge({ :controller => 'cms', :action => 'edit', :id => @page.id }) %> | 5 | <% url = profile.admin_url.merge({ :controller => 'cms', :action => 'edit', :id => @page.id }) %> |
| @@ -46,8 +44,10 @@ | @@ -46,8 +44,10 @@ | ||
| 46 | <%= button(:clock, _('All versions'), {:controller => 'content_viewer', :profile => profile.identifier, :action => 'article_versions'}, :id => 'article-versions-link') %> | 44 | <%= button(:clock, _('All versions'), {:controller => 'content_viewer', :profile => profile.identifier, :action => 'article_versions'}, :id => 'article-versions-link') %> |
| 47 | <% end %> | 45 | <% end %> |
| 48 | 46 | ||
| 47 | + <%#*Adds extra buttons to the toolbar%> | ||
| 48 | + <%= @plugins.dispatch(:article_extra_toolbar_buttons, @page).collect { |content| instance_exec(&content) }.join("") %> | ||
| 49 | + | ||
| 49 | <%= report_abuse(profile, :link, @page) %> | 50 | <%= report_abuse(profile, :link, @page) %> |
| 50 | - | ||
| 51 | </div> | 51 | </div> |
| 52 | <div id="article-header"> | 52 | <div id="article-header"> |
| 53 | <% if @page.blog? and !@page.image.nil? %> | 53 | <% if @page.blog? and !@page.image.nil? %> |
lib/noosfero/plugin.rb
| @@ -525,6 +525,12 @@ class Noosfero::Plugin | @@ -525,6 +525,12 @@ class Noosfero::Plugin | ||
| 525 | nil | 525 | nil |
| 526 | end | 526 | end |
| 527 | 527 | ||
| 528 | + # -> Adds adicional content to article toolbar buttons | ||
| 529 | + # returns = lambda block that creates html code | ||
| 530 | + def article_extra_toolbar_buttons(article) | ||
| 531 | + nil | ||
| 532 | + end | ||
| 533 | + | ||
| 528 | # -> Adds adicional content to article header | 534 | # -> Adds adicional content to article header |
| 529 | # returns = lambda block that creates html code | 535 | # returns = lambda block that creates html code |
| 530 | def article_header_extra_contents(article) | 536 | def article_header_extra_contents(article) |
plugins/video/README.md
| @@ -49,9 +49,10 @@ See Noosfero license. | @@ -49,9 +49,10 @@ See Noosfero license. | ||
| 49 | AUTHORS | 49 | AUTHORS |
| 50 | ======= | 50 | ======= |
| 51 | 51 | ||
| 52 | - Leandro Nunes dos Santos (leandronunes at gmail.com) | 52 | + Leandro Nunes dos Santos (leandronunes at gmail.com) (Video Block) |
| 53 | + Evandro Magalhães Leite Júnior (evandrojr at gmail.com) (Video Gallery & Video Content) | ||
| 53 | 54 | ||
| 54 | ACKNOWLEDGMENTS | 55 | ACKNOWLEDGMENTS |
| 55 | =============== | 56 | =============== |
| 56 | 57 | ||
| 57 | -The author have been supported by Serpro | 58 | +The authors have been supported by Serpro |
| @@ -0,0 +1,31 @@ | @@ -0,0 +1,31 @@ | ||
| 1 | +require_dependency 'article' | ||
| 2 | + | ||
| 3 | +class Article | ||
| 4 | + | ||
| 5 | + scope :video_gallery, :conditions => ["articles.type = 'VideoPlugin::VideoGallery'"] | ||
| 6 | + | ||
| 7 | + #FIXME This should be done via hotspot | ||
| 8 | + def self.folder_types_with_video | ||
| 9 | + self.folder_types_without_video << 'VideoPlugin::VideoGallery' | ||
| 10 | + end | ||
| 11 | + | ||
| 12 | + #FIXME This should be done via hotspot | ||
| 13 | + class << self | ||
| 14 | + alias_method_chain :folder_types, :video | ||
| 15 | + end | ||
| 16 | + | ||
| 17 | + def self.owner_video_galleries(owner) | ||
| 18 | + conditions = owner.kind_of?(Environment) ? [] : ["profile_id = ?", owner.id] | ||
| 19 | + result = Article.video_gallery.find( | ||
| 20 | + :all, | ||
| 21 | + :order => 'created_at desc', | ||
| 22 | + :conditions => conditions) | ||
| 23 | + end | ||
| 24 | + | ||
| 25 | +end | ||
| 26 | + | ||
| 27 | + | ||
| 28 | + | ||
| 29 | + | ||
| 30 | + | ||
| 31 | + |
plugins/video/lib/video_plugin.rb
| 1 | -require_dependency File.dirname(__FILE__) + '/video_block' | ||
| 2 | - | ||
| 3 | class VideoPlugin < Noosfero::Plugin | 1 | class VideoPlugin < Noosfero::Plugin |
| 4 | 2 | ||
| 5 | def self.plugin_name | 3 | def self.plugin_name |
| 6 | - "Video Block Plugin" | 4 | + "Video Content type, Video Block and Video Gallery Plugin" |
| 7 | end | 5 | end |
| 8 | 6 | ||
| 9 | def self.plugin_description | 7 | def self.plugin_description |
| @@ -11,9 +9,40 @@ class VideoPlugin < Noosfero::Plugin | @@ -11,9 +9,40 @@ class VideoPlugin < Noosfero::Plugin | ||
| 11 | end | 9 | end |
| 12 | 10 | ||
| 13 | def self.extra_blocks | 11 | def self.extra_blocks |
| 14 | - { | ||
| 15 | - VideoBlock => {} | ||
| 16 | - } | 12 | + { VideoPlugin::VideoBlock => {}, VideoPlugin::VideoGalleryBlock => {:position=>['1']} } |
| 13 | + end | ||
| 14 | + | ||
| 15 | + def stylesheet? | ||
| 16 | + true | ||
| 17 | + end | ||
| 18 | + | ||
| 19 | + def content_types | ||
| 20 | + [VideoPlugin::VideoGallery, VideoPlugin::Video] | ||
| 21 | + end | ||
| 22 | + | ||
| 23 | + def content_remove_new(content) | ||
| 24 | + if content.kind_of?(VideoPlugin::VideoGallery) or content.kind_of?(VideoPlugin::Video) | ||
| 25 | + true | ||
| 26 | + end | ||
| 27 | + end | ||
| 28 | + | ||
| 29 | + def content_remove_upload(content) | ||
| 30 | + if content.kind_of?(VideoPlugin::VideoGallery) or content.kind_of?(VideoPlugin::Video) | ||
| 31 | + true | ||
| 32 | + end | ||
| 33 | + end | ||
| 34 | + | ||
| 35 | + def article_extra_toolbar_buttons(content) | ||
| 36 | + if content.kind_of?(VideoPlugin::VideoGallery) | ||
| 37 | + proc do | ||
| 38 | + content_tag('a', _("New Video"), | ||
| 39 | + { :id=>"new-video-btn", | ||
| 40 | + :class=>"button with-text icon-new", | ||
| 41 | + :href=>url_for(:action => 'new', :type=>'VideoPlugin::Video', :controller=>'cms', :parent_id => content.id), | ||
| 42 | + :title=>_("New Video") | ||
| 43 | + }) | ||
| 44 | + end | ||
| 45 | + end | ||
| 17 | end | 46 | end |
| 18 | 47 | ||
| 19 | end | 48 | end |
| @@ -0,0 +1,185 @@ | @@ -0,0 +1,185 @@ | ||
| 1 | +require 'noosfero/translatable_content' | ||
| 2 | +require 'application_helper' | ||
| 3 | +require 'net/http' | ||
| 4 | + | ||
| 5 | +class VideoPlugin::Video < Article | ||
| 6 | + | ||
| 7 | + settings_items :video_url, :type => :string, :default => 'http://' | ||
| 8 | + settings_items :video_width, :type => :integer, :default => 499 | ||
| 9 | + settings_items :video_height, :type => :integer, :default => 353 | ||
| 10 | + #Video Providers are: youtube, vimeo, file | ||
| 11 | + settings_items :video_provider, :type => :string | ||
| 12 | + settings_items :video_format, :type => :string | ||
| 13 | + settings_items :video_id, :type => :string | ||
| 14 | + settings_items :video_thumbnail_url, :type => :string, :default => '/plugins/video/images/video_generic_thumbnail.jpg' | ||
| 15 | + settings_items :video_thumbnail_width, :type=> :integer | ||
| 16 | + settings_items :video_thumbnail_height, :type=> :integer | ||
| 17 | + settings_items :video_duration, :type=> :integer, :default => 0 | ||
| 18 | + | ||
| 19 | + attr_accessible :video_url | ||
| 20 | + | ||
| 21 | + before_save :fill_video_properties | ||
| 22 | + | ||
| 23 | + def self.type_name | ||
| 24 | + _('Video') | ||
| 25 | + end | ||
| 26 | + | ||
| 27 | + def can_display_versions? | ||
| 28 | + true | ||
| 29 | + end | ||
| 30 | + | ||
| 31 | + def self.short_description | ||
| 32 | + _('Embedded Video') | ||
| 33 | + end | ||
| 34 | + | ||
| 35 | + def self.description | ||
| 36 | + _('Display embedded videos.') | ||
| 37 | + end | ||
| 38 | + | ||
| 39 | + def is_youtube? | ||
| 40 | + VideoPlugin::Video.is_youtube?(self.video_url) | ||
| 41 | + end | ||
| 42 | + | ||
| 43 | + def is_vimeo? | ||
| 44 | + VideoPlugin::Video.is_vimeo?(self.video_url) | ||
| 45 | + end | ||
| 46 | + | ||
| 47 | + include ActionView::Helpers::TagHelper | ||
| 48 | + def to_html(options={}) | ||
| 49 | + article = self | ||
| 50 | + proc do | ||
| 51 | + render :partial => 'content_viewer/video_plugin/video', :locals => {:article => article} | ||
| 52 | + end | ||
| 53 | + end | ||
| 54 | + | ||
| 55 | + def fitted_width | ||
| 56 | + 499 | ||
| 57 | + end | ||
| 58 | + | ||
| 59 | + def fitted_height | ||
| 60 | + ((fitted_width * self.video_height) / self.video_width).to_i | ||
| 61 | + end | ||
| 62 | + | ||
| 63 | + def thumbnail_fitted_width | ||
| 64 | + 80 | ||
| 65 | + end | ||
| 66 | + | ||
| 67 | + def thumbnail_fitted_height | ||
| 68 | + ((thumbnail_fitted_width * self.video_thumbnail_height) / self.video_thumbnail_width).to_i | ||
| 69 | + end | ||
| 70 | + | ||
| 71 | + def no_browser_support_message | ||
| 72 | + '<p class="vjs-no-js">To view this video please enable JavaScript, and consider upgrading to a web browser that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a></p>' | ||
| 73 | + end | ||
| 74 | + | ||
| 75 | + def self.is_youtube?(video_url) | ||
| 76 | + video_url.match(/.*(youtube.com.*v=[#{YOUTUBE_ID_FORMAT}]+|youtu.be\/[#{YOUTUBE_ID_FORMAT}]+).*/) ? true : false | ||
| 77 | + end | ||
| 78 | + | ||
| 79 | + def self.is_vimeo?(video_url) | ||
| 80 | + video_url.match(/^(http[s]?:\/\/)?(www.)?(vimeo.com|player.vimeo.com\/video)\/([A-z]|\/)*[[:digit:]]+/) ? true : false | ||
| 81 | + end | ||
| 82 | + | ||
| 83 | + def self.is_video_file?(video_url) | ||
| 84 | + video_url.match(/\.(mp4|ogg|ogv|webm)/) ? true : false | ||
| 85 | + end | ||
| 86 | + | ||
| 87 | + def self.format_embed_video_url_for_youtube(video_url) | ||
| 88 | + "//www.youtube-nocookie.com/embed/#{extract_youtube_id(video_url)}?rel=0&wmode=transparent" if is_youtube?(video_url) | ||
| 89 | + end | ||
| 90 | + | ||
| 91 | + def self.format_embed_video_url_for_vimeo(video_url) | ||
| 92 | + "//player.vimeo.com/video/#{extract_vimeo_id(video_url)}" if is_vimeo?(video_url) | ||
| 93 | + end | ||
| 94 | + | ||
| 95 | + def format_embed_video_url_for_youtube | ||
| 96 | + VideoPlugin::Video.format_embed_video_url_for_youtube(self.video_url) | ||
| 97 | + end | ||
| 98 | + | ||
| 99 | + def format_embed_video_url_for_vimeo | ||
| 100 | + VideoPlugin::Video.format_embed_video_url_for_vimeo(self.video_url) | ||
| 101 | + end | ||
| 102 | + | ||
| 103 | + def self.extract_youtube_id(video_url) | ||
| 104 | + return nil unless self.is_youtube?(video_url) | ||
| 105 | + youtube_match = video_url.match("v=([#{YOUTUBE_ID_FORMAT}]*)") | ||
| 106 | + youtube_match ||= video_url.match("youtu.be\/([#{YOUTUBE_ID_FORMAT}]*)") | ||
| 107 | + youtube_match[1] unless youtube_match.nil? | ||
| 108 | + end | ||
| 109 | + | ||
| 110 | + def self.extract_vimeo_id(video_url) | ||
| 111 | + return nil unless self.is_vimeo?(video_url) | ||
| 112 | + vimeo_match = video_url.match('([[:digit:]]*)$') | ||
| 113 | + vimeo_match[1] unless vimeo_match.nil? | ||
| 114 | + end | ||
| 115 | + | ||
| 116 | + private | ||
| 117 | + | ||
| 118 | + YOUTUBE_ID_FORMAT = '\w-' | ||
| 119 | + | ||
| 120 | + def fill_video_properties | ||
| 121 | + if is_youtube? | ||
| 122 | + fill_youtube_video_properties | ||
| 123 | + elsif is_vimeo? | ||
| 124 | + fill_vimeo_video_properties | ||
| 125 | + elsif true | ||
| 126 | + self.video_format = detect_file_format | ||
| 127 | + self.video_provider = 'file' | ||
| 128 | + end | ||
| 129 | + end | ||
| 130 | + | ||
| 131 | + def fill_youtube_video_properties | ||
| 132 | + self.video_provider = 'youtube' | ||
| 133 | + self.video_id = extract_youtube_id | ||
| 134 | + url = "http://www.youtube.com/oembed?url=http%3A//www.youtube.com/watch?v%3D#{self.video_id}&format=json" | ||
| 135 | + resp = Net::HTTP.get_response(URI.parse(url)) | ||
| 136 | + buffer = resp.body | ||
| 137 | + vid = JSON.parse(buffer) | ||
| 138 | + self.video_thumbnail_url = vid['thumbnail_url'] | ||
| 139 | + self.video_width = vid['width'] | ||
| 140 | + self.video_height = vid['height'] | ||
| 141 | + self.video_thumbnail_width = vid['thumbnail_width'] | ||
| 142 | + self.video_thumbnail_height = vid['thumbnail_height'] | ||
| 143 | + url = "http://gdata.youtube.com/feeds/api/videos/#{self.video_id}?alt=json"; | ||
| 144 | + resp = Net::HTTP.get_response(URI.parse(url)) | ||
| 145 | + buffer = resp.body | ||
| 146 | + vid = JSON.parse(buffer) | ||
| 147 | + self.video_duration = vid['entry']['media$group']['media$content'][0]['duration'] | ||
| 148 | + end | ||
| 149 | + | ||
| 150 | + def fill_vimeo_video_properties | ||
| 151 | + self.video_provider = 'vimeo' | ||
| 152 | + self.video_id = extract_vimeo_id | ||
| 153 | + url = "http://vimeo.com/api/v2/video/#{self.video_id}.json" | ||
| 154 | + resp = Net::HTTP.get_response(URI.parse(url)) | ||
| 155 | + buffer = resp.body | ||
| 156 | + vid = JSON.parse(buffer) | ||
| 157 | + vid = vid[0] | ||
| 158 | + self.video_thumbnail_url = vid['thumbnail_large'] | ||
| 159 | + self.video_width = vid['width'] | ||
| 160 | + self.video_height = vid['height'] | ||
| 161 | + self.video_thumbnail_width = 640 | ||
| 162 | + self.video_thumbnail_height = 360 | ||
| 163 | + end | ||
| 164 | + | ||
| 165 | + def detect_file_format | ||
| 166 | + video_type = 'video/unknown' | ||
| 167 | + if /.mp4/i =~ self.video_url or /.mov/i =~ self.video_url | ||
| 168 | + video_type='video/mp4' | ||
| 169 | + elsif /.webm/i =~ self.video_url | ||
| 170 | + video_type='video/webm' | ||
| 171 | + elsif /.og[vg]/i =~ self.video_url | ||
| 172 | + video_type='video/ogg' | ||
| 173 | + end | ||
| 174 | + video_type | ||
| 175 | + end | ||
| 176 | + | ||
| 177 | + def extract_youtube_id | ||
| 178 | + VideoPlugin::Video.extract_youtube_id(self.video_url) | ||
| 179 | + end | ||
| 180 | + | ||
| 181 | + def extract_vimeo_id | ||
| 182 | + VideoPlugin::Video.extract_vimeo_id(self.video_url) | ||
| 183 | + end | ||
| 184 | + | ||
| 185 | +end |
| @@ -0,0 +1,57 @@ | @@ -0,0 +1,57 @@ | ||
| 1 | +class VideoPlugin::VideoBlock < Block | ||
| 2 | + | ||
| 3 | + attr_accessible :url, :width, :height | ||
| 4 | + | ||
| 5 | + settings_items :url, :type => :string, :default => "" | ||
| 6 | + settings_items :width, :type => :integer, :default => 400 | ||
| 7 | + settings_items :height, :type => :integer, :default => 315 | ||
| 8 | + | ||
| 9 | + YOUTUBE_ID_FORMAT = '\w-' | ||
| 10 | + | ||
| 11 | + def is_youtube? | ||
| 12 | + VideoPlugin::Video.is_youtube?(url) | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | + def is_vimeo? | ||
| 16 | + VideoPlugin::Video.is_vimeo?(url) | ||
| 17 | + end | ||
| 18 | + | ||
| 19 | + def is_video_file? | ||
| 20 | + url.match(/.*(mp4|ogg|ogv|webm)$/) ? true : false | ||
| 21 | + end | ||
| 22 | + | ||
| 23 | + def format_embed_video_url_for_youtube | ||
| 24 | + VideoPlugin::Video.format_embed_video_url_for_youtube(url) | ||
| 25 | + end | ||
| 26 | + | ||
| 27 | + def format_embed_video_url_for_vimeo | ||
| 28 | + VideoPlugin::Video.format_embed_video_url_for_vimeo(url) | ||
| 29 | + end | ||
| 30 | + | ||
| 31 | + def self.description | ||
| 32 | + _('Display a Video') | ||
| 33 | + end | ||
| 34 | + | ||
| 35 | + def help | ||
| 36 | + _('This block presents a video from youtube, vimeo and some video formats (mp4, ogg, ogv and webm)') | ||
| 37 | + end | ||
| 38 | + | ||
| 39 | + def content(args={}) | ||
| 40 | + block = self | ||
| 41 | + | ||
| 42 | + proc do | ||
| 43 | + render :file => 'video_block', :locals => { :block => block } | ||
| 44 | + end | ||
| 45 | + end | ||
| 46 | + | ||
| 47 | + private | ||
| 48 | + | ||
| 49 | + def extract_youtube_id | ||
| 50 | + VideoPlugin::Video.extract_youtube_id(url) | ||
| 51 | + end | ||
| 52 | + | ||
| 53 | + def extract_vimeo_id | ||
| 54 | + VideoPlugin::Video.extract_vimeo_id(url) | ||
| 55 | + end | ||
| 56 | + | ||
| 57 | +end |
| @@ -0,0 +1,63 @@ | @@ -0,0 +1,63 @@ | ||
| 1 | +class VideoPlugin::VideoGallery < Folder | ||
| 2 | + | ||
| 3 | + def self.type_name | ||
| 4 | + _('Video Gallery') | ||
| 5 | + end | ||
| 6 | + | ||
| 7 | + settings_items :thumbnail_width, :type => :integer, :default => 50 | ||
| 8 | + settings_items :thumbnail_height, :type => :integer, :default => 50 | ||
| 9 | + settings_items :videos_per_row, :type => :integer, :default => 5 | ||
| 10 | + | ||
| 11 | + validate :not_belong_to_blog | ||
| 12 | + | ||
| 13 | + def not_belong_to_blog | ||
| 14 | + errors.add(:parent, "A video gallery should not belong to a blog.") if parent && parent.blog? | ||
| 15 | + end | ||
| 16 | + | ||
| 17 | + acts_as_having_settings :field => :setting | ||
| 18 | + | ||
| 19 | + xss_terminate :only => [ :body ], :with => 'white_list', :on => 'validation' | ||
| 20 | + | ||
| 21 | + include WhiteListFilter | ||
| 22 | + filter_iframes :body | ||
| 23 | + def iframe_whitelist | ||
| 24 | + profile && profile.environment && profile.environment.trusted_sites_for_iframe | ||
| 25 | + end | ||
| 26 | + | ||
| 27 | + def self.short_description | ||
| 28 | + _('Video Gallery') | ||
| 29 | + end | ||
| 30 | + | ||
| 31 | + def self.description | ||
| 32 | + _('A gallery of link to videos that are hosted elsewhere.') | ||
| 33 | + end | ||
| 34 | + | ||
| 35 | + include ActionView::Helpers::TagHelper | ||
| 36 | + def to_html(options = {}) | ||
| 37 | + video_gallery = self | ||
| 38 | + proc do | ||
| 39 | + render :partial => 'content_viewer/video_plugin/video_gallery', :locals => {:video_gallery => video_gallery} | ||
| 40 | + end | ||
| 41 | + end | ||
| 42 | + | ||
| 43 | + def video_gallery? | ||
| 44 | + true | ||
| 45 | + end | ||
| 46 | + | ||
| 47 | + def can_display_hits? | ||
| 48 | + false | ||
| 49 | + end | ||
| 50 | + | ||
| 51 | + def accept_comments? | ||
| 52 | + false | ||
| 53 | + end | ||
| 54 | + | ||
| 55 | + def self.icon_name(article = nil) | ||
| 56 | + 'Video gallery' | ||
| 57 | + end | ||
| 58 | + | ||
| 59 | + def news(limit = 30, highlight = false) | ||
| 60 | + profile.recent_documents(limit, ["articles.type != ? AND articles.highlighted = ? AND articles.parent_id = ?", 'Folder', highlight, id]) | ||
| 61 | + end | ||
| 62 | + | ||
| 63 | +end |
| @@ -0,0 +1,31 @@ | @@ -0,0 +1,31 @@ | ||
| 1 | +class VideoPlugin::VideoGalleryBlock < Block | ||
| 2 | + | ||
| 3 | + settings_items :video_gallery_id, :type => :integer | ||
| 4 | + attr_accessible :video_gallery_id | ||
| 5 | + | ||
| 6 | + include ActionView::Helpers | ||
| 7 | + include Rails.application.routes.url_helpers | ||
| 8 | + | ||
| 9 | + def self.description | ||
| 10 | + _('Display a Video Gallery') | ||
| 11 | + end | ||
| 12 | + | ||
| 13 | + def help | ||
| 14 | + _('This block presents a video gallery') | ||
| 15 | + end | ||
| 16 | + | ||
| 17 | + def content(args={}) | ||
| 18 | + block = self | ||
| 19 | + if video_gallery_id.present? | ||
| 20 | + video_gallery = VideoPlugin::VideoGallery.find(video_gallery_id) | ||
| 21 | + proc do | ||
| 22 | + render :partial => 'content_viewer/video_plugin/video_gallery', :locals => {:video_gallery => video_gallery} | ||
| 23 | + end | ||
| 24 | + end | ||
| 25 | + end | ||
| 26 | + | ||
| 27 | + def list_my_galleries | ||
| 28 | + Article.owner_video_galleries(owner) | ||
| 29 | + end | ||
| 30 | + | ||
| 31 | +end |
| @@ -0,0 +1,18 @@ | @@ -0,0 +1,18 @@ | ||
| 1 | +module VideoPlugin::VideoGalleryHelper | ||
| 2 | + | ||
| 3 | + def list_videos(configure={}) | ||
| 4 | + configure[:recursive] ||= false | ||
| 5 | + configure[:list_type] ||= :folder | ||
| 6 | + if !configure[:contents].blank? | ||
| 7 | + configure[:contents] = configure[:contents].paginate( | ||
| 8 | + :order => "updated_at DESC", | ||
| 9 | + :per_page => 17, | ||
| 10 | + :page => params[:npage] | ||
| 11 | + ) | ||
| 12 | + render :file => 'shared/video_list', :locals => configure | ||
| 13 | + else | ||
| 14 | + content_tag('em', _('(empty folder)')) | ||
| 15 | + end | ||
| 16 | + end | ||
| 17 | + | ||
| 18 | +end |
4.49 KB
| @@ -0,0 +1,66 @@ | @@ -0,0 +1,66 @@ | ||
| 1 | +.video-gallery-thumbnail { | ||
| 2 | + position: relative; | ||
| 3 | + display: inline-block; | ||
| 4 | + width: 95px; | ||
| 5 | + height: 115px; | ||
| 6 | + margin: 1em; | ||
| 7 | + border: solid #F0F0F0 1px; | ||
| 8 | + vertical-align: top; | ||
| 9 | + text-align: left; | ||
| 10 | + overflow: hidden; | ||
| 11 | + padding-top: 7px; | ||
| 12 | + margin-botton: 10px; | ||
| 13 | + text-overflow: ellipsis; | ||
| 14 | +} | ||
| 15 | + | ||
| 16 | +.video-gallery-top-box{ | ||
| 17 | + height: 73px; | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +.video-duration{ | ||
| 21 | + position: absolute; | ||
| 22 | + bottom: 0px; | ||
| 23 | + background-color: black; | ||
| 24 | + font-size: 1em; | ||
| 25 | + text-color: white; | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +.video-title{ | ||
| 29 | + width: 100%; | ||
| 30 | + overflow: hidden; | ||
| 31 | + text-overflow: ellipsis; | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | +.video-author{ | ||
| 35 | + display: none; | ||
| 36 | + overflow: hidden; | ||
| 37 | + text-overflow: ellipsis; | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +.video-gallery-thumbnail:hover div{ | ||
| 41 | + display: inline-block; | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +.video-gallery-table-big{ | ||
| 45 | + width: 100%; | ||
| 46 | + overflow: hidden; | ||
| 47 | +} | ||
| 48 | + | ||
| 49 | +.video-gallery-left-column-big{ | ||
| 50 | + width: 350px; | ||
| 51 | + float: left; | ||
| 52 | +} | ||
| 53 | + | ||
| 54 | +.video-gallery-right-column-big{ | ||
| 55 | + margin-left: 370px; | ||
| 56 | +} | ||
| 57 | + | ||
| 58 | +.video-title-big{ | ||
| 59 | + font-size: 2em; | ||
| 60 | +} | ||
| 61 | + | ||
| 62 | +.video-block-center{ | ||
| 63 | + width: 100%; | ||
| 64 | + margin-left: auto; | ||
| 65 | + margin-right: auto; | ||
| 66 | +} | ||
| 0 | \ No newline at end of file | 67 | \ No newline at end of file |
plugins/video/test/functional/video_plugin_environment_design_controller_test.rb
| @@ -21,9 +21,9 @@ class EnvironmentDesignControllerTest < ActionController::TestCase | @@ -21,9 +21,9 @@ class EnvironmentDesignControllerTest < ActionController::TestCase | ||
| 21 | @environment.enabled_plugins = ['VideoPlugin'] | 21 | @environment.enabled_plugins = ['VideoPlugin'] |
| 22 | @environment.save! | 22 | @environment.save! |
| 23 | 23 | ||
| 24 | - VideoBlock.delete_all | 24 | + VideoPlugin::VideoBlock.delete_all |
| 25 | 25 | ||
| 26 | - @block = VideoBlock.new | 26 | + @block = VideoPlugin::VideoBlock.new |
| 27 | @block.box = @environment.boxes.first | 27 | @block.box = @environment.boxes.first |
| 28 | @block.save! | 28 | @block.save! |
| 29 | end | 29 | end |
plugins/video/test/functional/video_plugin_profile_design_controller_test.rb
| @@ -18,11 +18,11 @@ class ProfileDesignControllerTest < ActionController::TestCase | @@ -18,11 +18,11 @@ class ProfileDesignControllerTest < ActionController::TestCase | ||
| 18 | @environment.enabled_plugins = ['VideoPlugin'] | 18 | @environment.enabled_plugins = ['VideoPlugin'] |
| 19 | @environment.save! | 19 | @environment.save! |
| 20 | 20 | ||
| 21 | - VideoBlock.delete_all | 21 | + VideoPlugin::VideoBlock.delete_all |
| 22 | @box1 = Box.create!(:owner => @profile) | 22 | @box1 = Box.create!(:owner => @profile) |
| 23 | @profile.boxes = [@box1] | 23 | @profile.boxes = [@box1] |
| 24 | 24 | ||
| 25 | - @block = VideoBlock.new | 25 | + @block = VideoPlugin::VideoBlock.new |
| 26 | @block.box = @box1 | 26 | @block.box = @box1 |
| 27 | @block.save! | 27 | @block.save! |
| 28 | 28 |
plugins/video/test/unit/video_block_test.rb
| @@ -4,94 +4,88 @@ class VideoBlockTest < ActiveSupport::TestCase | @@ -4,94 +4,88 @@ class VideoBlockTest < ActiveSupport::TestCase | ||
| 4 | ### Tests for YouTube | 4 | ### Tests for YouTube |
| 5 | 5 | ||
| 6 | should "is_youtube return true when the url contains http://youtube.com" do | 6 | should "is_youtube return true when the url contains http://youtube.com" do |
| 7 | - block = VideoBlock.new | 7 | + block = VideoPlugin::VideoBlock.new |
| 8 | block.url = "http://youtube.com/?v=XXXXX" | 8 | block.url = "http://youtube.com/?v=XXXXX" |
| 9 | assert block.is_youtube? | 9 | assert block.is_youtube? |
| 10 | end | 10 | end |
| 11 | 11 | ||
| 12 | should "is_youtube return true when the url contains https://youtube.com" do | 12 | should "is_youtube return true when the url contains https://youtube.com" do |
| 13 | - block = VideoBlock.new | 13 | + block = VideoPlugin::VideoBlock.new |
| 14 | block.url = "https://youtube.com/?v=XXXXX" | 14 | block.url = "https://youtube.com/?v=XXXXX" |
| 15 | assert block.is_youtube? | 15 | assert block.is_youtube? |
| 16 | end | 16 | end |
| 17 | 17 | ||
| 18 | - should "is_youtube return true when the url contains https://www.youtube.com" do | ||
| 19 | - block = VideoBlock.new | ||
| 20 | - block.url = "https://www.youtube.com/?v=XXXXX" | ||
| 21 | - assert block.is_youtube? | ||
| 22 | - end | ||
| 23 | - | ||
| 24 | should "is_youtube return true when the url contains www.youtube.com" do | 18 | should "is_youtube return true when the url contains www.youtube.com" do |
| 25 | - block = VideoBlock.new | 19 | + block = VideoPlugin::VideoBlock.new |
| 26 | block.url = "www.youtube.com/?v=XXXXX" | 20 | block.url = "www.youtube.com/?v=XXXXX" |
| 27 | assert block.is_youtube? | 21 | assert block.is_youtube? |
| 28 | end | 22 | end |
| 29 | 23 | ||
| 30 | should "is_youtube return true when the url contains youtube.com" do | 24 | should "is_youtube return true when the url contains youtube.com" do |
| 31 | - block = VideoBlock.new | 25 | + block = VideoPlugin::VideoBlock.new |
| 32 | block.url = "youtube.com/?v=XXXXX" | 26 | block.url = "youtube.com/?v=XXXXX" |
| 33 | assert block.is_youtube? | 27 | assert block.is_youtube? |
| 34 | end | 28 | end |
| 35 | 29 | ||
| 36 | should "is_youtube return false when the url not contains youtube video ID" do | 30 | should "is_youtube return false when the url not contains youtube video ID" do |
| 37 | - block = VideoBlock.new | 31 | + block = VideoPlugin::VideoBlock.new |
| 38 | block.url = "youtube.com/" | 32 | block.url = "youtube.com/" |
| 39 | assert !block.is_youtube? | 33 | assert !block.is_youtube? |
| 40 | end | 34 | end |
| 41 | 35 | ||
| 42 | should "is_youtube return false when the url contains empty youtube video ID" do | 36 | should "is_youtube return false when the url contains empty youtube video ID" do |
| 43 | - block = VideoBlock.new | 37 | + block = VideoPlugin::VideoBlock.new |
| 44 | block.url = "youtube.com/?v=" | 38 | block.url = "youtube.com/?v=" |
| 45 | assert !block.is_youtube? | 39 | assert !block.is_youtube? |
| 46 | end | 40 | end |
| 47 | 41 | ||
| 48 | should "is_youtube return false when the url contains an invalid youtube link" do | 42 | should "is_youtube return false when the url contains an invalid youtube link" do |
| 49 | - block = VideoBlock.new | 43 | + block = VideoPlugin::VideoBlock.new |
| 50 | block.url = "http://www.yt.com/?v=XXXXX" | 44 | block.url = "http://www.yt.com/?v=XXXXX" |
| 51 | assert !block.is_youtube? | 45 | assert !block.is_youtube? |
| 52 | end | 46 | end |
| 53 | 47 | ||
| 54 | should "format embed video for youtube videos" do | 48 | should "format embed video for youtube videos" do |
| 55 | - block = VideoBlock.new | 49 | + block = VideoPlugin::VideoBlock.new |
| 56 | block.url = "youtube.com/?v=XXXXX" | 50 | block.url = "youtube.com/?v=XXXXX" |
| 57 | assert_match /\/\/www.youtube-nocookie.com\/embed/, block.format_embed_video_url_for_youtube | 51 | assert_match /\/\/www.youtube-nocookie.com\/embed/, block.format_embed_video_url_for_youtube |
| 58 | end | 52 | end |
| 59 | 53 | ||
| 60 | should "format embed video return nil if is not a youtube url" do | 54 | should "format embed video return nil if is not a youtube url" do |
| 61 | - block = VideoBlock.new | 55 | + block = VideoPlugin::VideoBlock.new |
| 62 | block.url = "http://www.yt.com/?v=XXXXX" | 56 | block.url = "http://www.yt.com/?v=XXXXX" |
| 63 | assert_nil block.format_embed_video_url_for_youtube | 57 | assert_nil block.format_embed_video_url_for_youtube |
| 64 | end | 58 | end |
| 65 | 59 | ||
| 66 | should "extract youtube id from youtube video url's if it's a valid youtube full url" do | 60 | should "extract youtube id from youtube video url's if it's a valid youtube full url" do |
| 67 | - block = VideoBlock.new | 61 | + block = VideoPlugin::VideoBlock.new |
| 68 | id = 'oi43jre2d2' | 62 | id = 'oi43jre2d2' |
| 69 | block.url = "youtube.com/?v=#{id}" | 63 | block.url = "youtube.com/?v=#{id}" |
| 70 | assert_equal id, block.send('extract_youtube_id') | 64 | assert_equal id, block.send('extract_youtube_id') |
| 71 | end | 65 | end |
| 72 | 66 | ||
| 73 | should "extract youtube id from youtube video url's if it has underline and hyphen" do | 67 | should "extract youtube id from youtube video url's if it has underline and hyphen" do |
| 74 | - block = VideoBlock.new | 68 | + block = VideoPlugin::VideoBlock.new |
| 75 | id = 'oi43_re-d2' | 69 | id = 'oi43_re-d2' |
| 76 | block.url = "youtube.com/?v=#{id}" | 70 | block.url = "youtube.com/?v=#{id}" |
| 77 | assert_equal id, block.send('extract_youtube_id') | 71 | assert_equal id, block.send('extract_youtube_id') |
| 78 | end | 72 | end |
| 79 | 73 | ||
| 80 | should "extract youtube id from youtube video url's if it's a valid youtube short url" do | 74 | should "extract youtube id from youtube video url's if it's a valid youtube short url" do |
| 81 | - block = VideoBlock.new | 75 | + block = VideoPlugin::VideoBlock.new |
| 82 | id = 'oi43jre2d2' | 76 | id = 'oi43jre2d2' |
| 83 | block.url = "youtu.be/#{id}" | 77 | block.url = "youtu.be/#{id}" |
| 84 | assert_equal id, block.send('extract_youtube_id') | 78 | assert_equal id, block.send('extract_youtube_id') |
| 85 | end | 79 | end |
| 86 | 80 | ||
| 87 | should "extract_youtube_id return nil if the url it's not a valid youtube url" do | 81 | should "extract_youtube_id return nil if the url it's not a valid youtube url" do |
| 88 | - block = VideoBlock.new | 82 | + block = VideoPlugin::VideoBlock.new |
| 89 | block.url = "http://www.yt.com/?v=XXXXX" | 83 | block.url = "http://www.yt.com/?v=XXXXX" |
| 90 | assert_nil block.send('extract_youtube_id') | 84 | assert_nil block.send('extract_youtube_id') |
| 91 | end | 85 | end |
| 92 | 86 | ||
| 93 | should "extract_youtube_id return nil if youtue url there is no id" do | 87 | should "extract_youtube_id return nil if youtue url there is no id" do |
| 94 | - block = VideoBlock.new | 88 | + block = VideoPlugin::VideoBlock.new |
| 95 | block.url = "youtube.com/" | 89 | block.url = "youtube.com/" |
| 96 | assert_nil block.send('extract_youtube_id') | 90 | assert_nil block.send('extract_youtube_id') |
| 97 | end | 91 | end |
| @@ -99,111 +93,111 @@ class VideoBlockTest < ActiveSupport::TestCase | @@ -99,111 +93,111 @@ class VideoBlockTest < ActiveSupport::TestCase | ||
| 99 | #### Tests for Vimeo Videos | 93 | #### Tests for Vimeo Videos |
| 100 | 94 | ||
| 101 | should "is_vimeo return true when the url contains http://vimeo.com" do | 95 | should "is_vimeo return true when the url contains http://vimeo.com" do |
| 102 | - block = VideoBlock.new | 96 | + block = VideoPlugin::VideoBlock.new |
| 103 | block.url = "http://vimeo.com/98979" | 97 | block.url = "http://vimeo.com/98979" |
| 104 | assert block.is_vimeo? | 98 | assert block.is_vimeo? |
| 105 | end | 99 | end |
| 106 | 100 | ||
| 107 | should "is_vimeo return true when the url contains https://vimeo.com" do | 101 | should "is_vimeo return true when the url contains https://vimeo.com" do |
| 108 | - block = VideoBlock.new | 102 | + block = VideoPlugin::VideoBlock.new |
| 109 | block.url = "https://vimeo.com/989798" | 103 | block.url = "https://vimeo.com/989798" |
| 110 | assert block.is_vimeo? | 104 | assert block.is_vimeo? |
| 111 | end | 105 | end |
| 112 | 106 | ||
| 113 | should "is_vimeo return true when the url contains https://www.vimeo.com" do | 107 | should "is_vimeo return true when the url contains https://www.vimeo.com" do |
| 114 | - block = VideoBlock.new | 108 | + block = VideoPlugin::VideoBlock.new |
| 115 | block.url = "https://www.vimeo.com/98987" | 109 | block.url = "https://www.vimeo.com/98987" |
| 116 | assert block.is_vimeo? | 110 | assert block.is_vimeo? |
| 117 | end | 111 | end |
| 118 | 112 | ||
| 119 | should "is_vimeo return true when the url contains www.vimeo.com" do | 113 | should "is_vimeo return true when the url contains www.vimeo.com" do |
| 120 | - block = VideoBlock.new | 114 | + block = VideoPlugin::VideoBlock.new |
| 121 | block.url = "www.vimeo.com/989798" | 115 | block.url = "www.vimeo.com/989798" |
| 122 | assert block.is_vimeo? | 116 | assert block.is_vimeo? |
| 123 | end | 117 | end |
| 124 | 118 | ||
| 125 | should "is_vimeo return true when the url contains vimeo.com" do | 119 | should "is_vimeo return true when the url contains vimeo.com" do |
| 126 | - block = VideoBlock.new | 120 | + block = VideoPlugin::VideoBlock.new |
| 127 | block.url = "vimeo.com/09898" | 121 | block.url = "vimeo.com/09898" |
| 128 | assert block.is_vimeo? | 122 | assert block.is_vimeo? |
| 129 | end | 123 | end |
| 130 | 124 | ||
| 131 | should "is_vimeo return false when the url not contains vimeo video ID" do | 125 | should "is_vimeo return false when the url not contains vimeo video ID" do |
| 132 | - block = VideoBlock.new | 126 | + block = VideoPlugin::VideoBlock.new |
| 133 | block.url = "vimeo.com/home" | 127 | block.url = "vimeo.com/home" |
| 134 | assert !block.is_vimeo? | 128 | assert !block.is_vimeo? |
| 135 | end | 129 | end |
| 136 | 130 | ||
| 137 | should "is_vimeo return false when the url contains empty vimeo video ID" do | 131 | should "is_vimeo return false when the url contains empty vimeo video ID" do |
| 138 | - block = VideoBlock.new | 132 | + block = VideoPlugin::VideoBlock.new |
| 139 | block.url = "vimeo.com/" | 133 | block.url = "vimeo.com/" |
| 140 | assert !block.is_vimeo? | 134 | assert !block.is_vimeo? |
| 141 | end | 135 | end |
| 142 | 136 | ||
| 143 | should "is_vimeo return false when the url contains an invalid vimeo link" do | 137 | should "is_vimeo return false when the url contains an invalid vimeo link" do |
| 144 | - block = VideoBlock.new | 138 | + block = VideoPlugin::VideoBlock.new |
| 145 | block.url = "http://www.vmsd.com/98979" | 139 | block.url = "http://www.vmsd.com/98979" |
| 146 | assert !block.is_vimeo? | 140 | assert !block.is_vimeo? |
| 147 | end | 141 | end |
| 148 | 142 | ||
| 149 | should "format embed video for vimeo videos" do | 143 | should "format embed video for vimeo videos" do |
| 150 | - block = VideoBlock.new | 144 | + block = VideoPlugin::VideoBlock.new |
| 151 | block.url = "vimeo.com/09898" | 145 | block.url = "vimeo.com/09898" |
| 152 | assert_match /\/\/player.vimeo.com\/video\/[[:digit:]]+/, block.format_embed_video_url_for_vimeo | 146 | assert_match /\/\/player.vimeo.com\/video\/[[:digit:]]+/, block.format_embed_video_url_for_vimeo |
| 153 | end | 147 | end |
| 154 | 148 | ||
| 155 | should "format embed video return nil if is not a vimeo url" do | 149 | should "format embed video return nil if is not a vimeo url" do |
| 156 | - block = VideoBlock.new | 150 | + block = VideoPlugin::VideoBlock.new |
| 157 | block.url = "http://www.yt.com/?v=XXXXX" | 151 | block.url = "http://www.yt.com/?v=XXXXX" |
| 158 | assert_nil block.format_embed_video_url_for_vimeo | 152 | assert_nil block.format_embed_video_url_for_vimeo |
| 159 | end | 153 | end |
| 160 | 154 | ||
| 161 | should "extract vimeo id from vimeo video url's if it's a valid vimeo url" do | 155 | should "extract vimeo id from vimeo video url's if it's a valid vimeo url" do |
| 162 | - block = VideoBlock.new | 156 | + block = VideoPlugin::VideoBlock.new |
| 163 | id = '23048239432' | 157 | id = '23048239432' |
| 164 | block.url = "vimeo.com/#{id}" | 158 | block.url = "vimeo.com/#{id}" |
| 165 | assert_equal id, block.send('extract_vimeo_id') | 159 | assert_equal id, block.send('extract_vimeo_id') |
| 166 | end | 160 | end |
| 167 | 161 | ||
| 168 | should "extract_vimeo_id return nil if the url it's not a valid vimeo url" do | 162 | should "extract_vimeo_id return nil if the url it's not a valid vimeo url" do |
| 169 | - block = VideoBlock.new | 163 | + block = VideoPlugin::VideoBlock.new |
| 170 | block.url = "http://www.yt.com/XXXXX" | 164 | block.url = "http://www.yt.com/XXXXX" |
| 171 | assert_nil block.send('extract_vimeo_id') | 165 | assert_nil block.send('extract_vimeo_id') |
| 172 | end | 166 | end |
| 173 | 167 | ||
| 174 | should "extract_vimeo_id return nil if vimeo url there is no id" do | 168 | should "extract_vimeo_id return nil if vimeo url there is no id" do |
| 175 | - block = VideoBlock.new | 169 | + block = VideoPlugin::VideoBlock.new |
| 176 | block.url = "vimeo.com/" | 170 | block.url = "vimeo.com/" |
| 177 | assert_nil block.send('extract_youtube_id') | 171 | assert_nil block.send('extract_youtube_id') |
| 178 | end | 172 | end |
| 179 | 173 | ||
| 180 | # Other video formats | 174 | # Other video formats |
| 181 | should "is_video return true if url ends with mp4" do | 175 | should "is_video return true if url ends with mp4" do |
| 182 | - block = VideoBlock.new | 176 | + block = VideoPlugin::VideoBlock.new |
| 183 | block.url = "http://www.vmsd.com/98979.mp4" | 177 | block.url = "http://www.vmsd.com/98979.mp4" |
| 184 | assert block.is_video_file? | 178 | assert block.is_video_file? |
| 185 | end | 179 | end |
| 186 | 180 | ||
| 187 | should "is_video return true if url ends with ogg" do | 181 | should "is_video return true if url ends with ogg" do |
| 188 | - block = VideoBlock.new | 182 | + block = VideoPlugin::VideoBlock.new |
| 189 | block.url = "http://www.vmsd.com/98979.ogg" | 183 | block.url = "http://www.vmsd.com/98979.ogg" |
| 190 | assert block.is_video_file? | 184 | assert block.is_video_file? |
| 191 | end | 185 | end |
| 192 | 186 | ||
| 193 | should "is_video return true if url ends with ogv" do | 187 | should "is_video return true if url ends with ogv" do |
| 194 | - block = VideoBlock.new | 188 | + block = VideoPlugin::VideoBlock.new |
| 195 | block.url = "http://www.vmsd.com/98979.ogv" | 189 | block.url = "http://www.vmsd.com/98979.ogv" |
| 196 | assert block.is_video_file? | 190 | assert block.is_video_file? |
| 197 | end | 191 | end |
| 198 | 192 | ||
| 199 | should "is_video return true if url ends with webm" do | 193 | should "is_video return true if url ends with webm" do |
| 200 | - block = VideoBlock.new | 194 | + block = VideoPlugin::VideoBlock.new |
| 201 | block.url = "http://www.vmsd.com/98979.webm" | 195 | block.url = "http://www.vmsd.com/98979.webm" |
| 202 | assert block.is_video_file? | 196 | assert block.is_video_file? |
| 203 | end | 197 | end |
| 204 | 198 | ||
| 205 | should "is_video return false if url ends without mp4, ogg, ogv, webm" do | 199 | should "is_video return false if url ends without mp4, ogg, ogv, webm" do |
| 206 | - block = VideoBlock.new | 200 | + block = VideoPlugin::VideoBlock.new |
| 207 | block.url = "http://www.vmsd.com/98979.mp4r" | 201 | block.url = "http://www.vmsd.com/98979.mp4r" |
| 208 | assert !block.is_video_file? | 202 | assert !block.is_video_file? |
| 209 | block.url = "http://www.vmsd.com/98979.oggr" | 203 | block.url = "http://www.vmsd.com/98979.oggr" |
| @@ -215,7 +209,7 @@ class VideoBlockTest < ActiveSupport::TestCase | @@ -215,7 +209,7 @@ class VideoBlockTest < ActiveSupport::TestCase | ||
| 215 | end | 209 | end |
| 216 | 210 | ||
| 217 | should 'display video block partial' do | 211 | should 'display video block partial' do |
| 218 | - block = VideoBlock.new | 212 | + block = VideoPlugin::VideoBlock.new |
| 219 | self.expects(:render).with(:file => 'video_block', :locals => { | 213 | self.expects(:render).with(:file => 'video_block', :locals => { |
| 220 | :block => block | 214 | :block => block |
| 221 | }) | 215 | }) |
| @@ -0,0 +1,12 @@ | @@ -0,0 +1,12 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | +class VideoGaleryBlockTest < ActiveSupport::TestCase | ||
| 3 | + | ||
| 4 | + should "define its description" do | ||
| 5 | + assert_equal VideoPlugin::VideoGalleryBlock.description, _('Display a Video Gallery') | ||
| 6 | + end | ||
| 7 | + | ||
| 8 | + should "define its help description" do | ||
| 9 | + assert_equal VideoPlugin::VideoGalleryBlock.new.help, _('This block presents a video gallery') | ||
| 10 | + end | ||
| 11 | + | ||
| 12 | +end |
| @@ -0,0 +1,16 @@ | @@ -0,0 +1,16 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | +class VideoGaleryTest < ActiveSupport::TestCase | ||
| 3 | + | ||
| 4 | + should "define its type_name as Video Gallery" do | ||
| 5 | + assert_equal VideoPlugin::VideoGallery.type_name, _('Video Gallery') | ||
| 6 | + end | ||
| 7 | + | ||
| 8 | + should "define its short_description" do | ||
| 9 | + assert_equal VideoPlugin::VideoGallery.short_description, _('Video Gallery') | ||
| 10 | + end | ||
| 11 | + | ||
| 12 | + should "define its description" do | ||
| 13 | + assert_equal VideoPlugin::VideoGallery.description, _('A gallery of link to videos that are hosted elsewhere.') | ||
| 14 | + end | ||
| 15 | + | ||
| 16 | +end |
plugins/video/test/unit/video_plugin_test.rb
| @@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/../test_helper' | @@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | class VideoPluginTest < ActiveSupport::TestCase | 2 | class VideoPluginTest < ActiveSupport::TestCase |
| 3 | 3 | ||
| 4 | should "return VideoBlock in extra_blocks class method" do | 4 | should "return VideoBlock in extra_blocks class method" do |
| 5 | - assert VideoPlugin.extra_blocks.keys.include?(VideoBlock) | 5 | + assert VideoPlugin.extra_blocks.keys.include?(VideoPlugin::VideoBlock) |
| 6 | end | 6 | end |
| 7 | 7 | ||
| 8 | end | 8 | end |
| @@ -0,0 +1,90 @@ | @@ -0,0 +1,90 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | +class VideoTest < ActiveSupport::TestCase | ||
| 3 | + | ||
| 4 | + include AuthenticatedTestHelper | ||
| 5 | + fixtures :users, :environments | ||
| 6 | + | ||
| 7 | + def setup | ||
| 8 | + @video = VideoPlugin::Video.new | ||
| 9 | + end | ||
| 10 | + | ||
| 11 | + should "define its type_name as video" do | ||
| 12 | + assert_equal VideoPlugin::Video.type_name, _('Video') | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | + should "display version" do | ||
| 16 | + assert @video.can_display_versions? | ||
| 17 | + end | ||
| 18 | + | ||
| 19 | + should "define its short_description" do | ||
| 20 | + assert_equal VideoPlugin::Video.short_description, _('Embedded Video') | ||
| 21 | + end | ||
| 22 | + | ||
| 23 | + should "define its description" do | ||
| 24 | + assert_equal VideoPlugin::Video.description, _('Display embedded videos.') | ||
| 25 | + end | ||
| 26 | + | ||
| 27 | + should "define a fitted_width" do | ||
| 28 | + assert_equal @video.fitted_width, 499 | ||
| 29 | + end | ||
| 30 | + | ||
| 31 | + should "eval a fitted_height" do | ||
| 32 | + @video.video_height = 1000 | ||
| 33 | + @video.video_width = 2000 | ||
| 34 | + fitted_height = ((@video.fitted_width * @video.video_height) / @video.video_width).to_i | ||
| 35 | + assert_equal fitted_height, @video.fitted_height | ||
| 36 | + end | ||
| 37 | + | ||
| 38 | + should "define a thumbnail_fitted_width" do | ||
| 39 | + assert_equal @video.thumbnail_fitted_width, 80 | ||
| 40 | + end | ||
| 41 | + | ||
| 42 | + should "eval a thumbnail_fitted_height" do | ||
| 43 | + @video.video_thumbnail_height = 60 | ||
| 44 | + @video.video_thumbnail_width = 30 | ||
| 45 | + thumbnail_fitted_height = ((@video.thumbnail_fitted_width * @video.video_thumbnail_height) / @video.video_thumbnail_width).to_i | ||
| 46 | + assert_equal thumbnail_fitted_height, @video.thumbnail_fitted_height | ||
| 47 | + end | ||
| 48 | + | ||
| 49 | + should "show a no_browser_support_message" do | ||
| 50 | + assert_equal @video.no_browser_support_message, '<p class="vjs-no-js">To view this video please enable JavaScript, and consider upgrading to a web browser that <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a></p>' | ||
| 51 | + end | ||
| 52 | + | ||
| 53 | + | ||
| 54 | + ### Tests for YouTube | ||
| 55 | + | ||
| 56 | + should "is_youtube return true when the url contains http://youtube.com" do | ||
| 57 | + @video.video_url = "http://youtube.com/?v=XXXXX" | ||
| 58 | + assert @video.is_youtube? | ||
| 59 | + end | ||
| 60 | + | ||
| 61 | + should "is_youtube return true when the url contains https://youtube.com" do | ||
| 62 | + @video.video_url = "https://youtube.com/?v=XXXXX" | ||
| 63 | + assert @video.is_youtube? | ||
| 64 | + end | ||
| 65 | + | ||
| 66 | + should "is_youtube return false when the url contains an invalid youtube link" do | ||
| 67 | + @video.video_url = "http://www.yt.com/?v=XXXXX" | ||
| 68 | + assert !@video.is_youtube? | ||
| 69 | + end | ||
| 70 | + | ||
| 71 | + ### Tests for vimeo | ||
| 72 | + | ||
| 73 | + should "is_vimeo return true when the url contains vimeo.com" do | ||
| 74 | + @video.video_url = "vimeo.com/09898" | ||
| 75 | + assert @video.is_vimeo? | ||
| 76 | + end | ||
| 77 | + | ||
| 78 | + should "is_vimeo return false when the url not contains vimeo video ID" do | ||
| 79 | + @video.video_url = "vimeo.com/home" | ||
| 80 | + assert !@video.is_vimeo? | ||
| 81 | + end | ||
| 82 | + | ||
| 83 | + should "is_vimeo return true for https://vimeo.com/channels/staffpicks/XXXXXXXXXX" do | ||
| 84 | + @video.video_url = "https://vimeo.com/channels/staffpicks/122325664" | ||
| 85 | + assert @video.is_vimeo? | ||
| 86 | + end | ||
| 87 | + | ||
| 88 | + | ||
| 89 | + | ||
| 90 | +end |
plugins/video/views/box_organizer/_html5_video_block.html.erb
plugins/video/views/box_organizer/_iframe_video_block.html.erb
| 1 | -<iframe width='<%="#{width}px"%>' height='<%="#{height}px"%>' src='<%= "#{url}" %>' frameborder="0" allowfullscreen></iframe> | 1 | +<iframe class="video-block-center" width='<%="#{width}px"%>' height='<%="#{height}px"%>' src='<%= "#{url}" %>' frameborder="0" allowfullscreen></iframe> |
| 2 | \ No newline at end of file | 2 | \ No newline at end of file |
plugins/video/views/box_organizer/video_plugin/_video_block.html.erb
0 → 100644
| @@ -0,0 +1,11 @@ | @@ -0,0 +1,11 @@ | ||
| 1 | +<label for="url" class="formlabel"> Video URL: </label> | ||
| 2 | + | ||
| 3 | +<div class="formfield type-text"> | ||
| 4 | + <%= text_field_tag 'block[url]', @block.url, :class => 'video-url', :maxlength => 255 %> | ||
| 5 | +</div> | ||
| 6 | +<div class="formfield type-text"> | ||
| 7 | + <label for="width" class="formlabel"> Width: </label> | ||
| 8 | + <%= text_field_tag 'block[width]', @block.width, :size => 7, :class => 'video-width', :maxlength => 5 %> | ||
| 9 | + <label for="height" class="formlabel"> Height: </label> | ||
| 10 | + <%= text_field_tag 'block[height]', @block.height, :size => 7, :class => 'video-height', :maxlength => 5 %> | ||
| 11 | +</div> |
plugins/video/views/box_organizer/video_plugin/_video_gallery_block.html.erb
0 → 100644
| @@ -0,0 +1,12 @@ | @@ -0,0 +1,12 @@ | ||
| 1 | +<%= required_fields_message %> | ||
| 2 | + | ||
| 3 | +<div> | ||
| 4 | +<%= required f.text_field('name', :size => '64', :maxlength => 150) %> | ||
| 5 | +<%= required labelled_form_field _('URL of the video'), text_field(:article, :video_url, :size => 80) %> | ||
| 6 | +<%= labelled_form_field(_('Description:'), text_area(:article, :body, :rows => 3, :cols => 64)) %> | ||
| 7 | +<%= render :partial => 'general_fields' %> | ||
| 8 | +<%= render :partial => 'translatable' %> | ||
| 9 | +</div> | ||
| 10 | + | ||
| 11 | + | ||
| 12 | + |
plugins/video/views/cms/video_plugin/_video_gallery.html.erb
0 → 100644
plugins/video/views/content_viewer/video_plugin/_video.html.erb
0 → 100644
| @@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
| 1 | +<div> | ||
| 2 | +<%if @page.video_provider=='youtube' %> | ||
| 3 | + <iframe class="video-block-center" width='<%="#{@page.fitted_width}px"%>' height='<%="#{@page.fitted_height}px"%>' src='<%= "#{@page.format_embed_video_url_for_youtube}" %>' frameborder="0" allowfullscreen></iframe> | ||
| 4 | +<% elsif @page.video_provider=='vimeo' %> | ||
| 5 | + <iframe class="video-block-center" width='<%="#{@page.fitted_width}px"%>' height='<%="#{@page.fitted_height}px"%>' src='<%= "#{@page.format_embed_video_url_for_vimeo}" %>' frameborder="0" allowfullscreen></iframe> | ||
| 6 | +<% elsif @page.video_provider=='file' %> | ||
| 7 | + <video class="video-block-center" controls preload="auto" height="353" width="499" type='<%= @page.video_format %>'> | ||
| 8 | + <source src=<%= "#{@page.video_url}" %>> | ||
| 9 | + </video> | ||
| 10 | +<% end %> | ||
| 11 | +<br style="clear:both" /> | ||
| 12 | +</div> | ||
| 13 | +<% _("Description:") %> | ||
| 14 | +<%= @page.body %> |
plugins/video/views/content_viewer/video_plugin/_video_gallery.html.erb
0 → 100644
| @@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
| 1 | +<% extend VideoPlugin::VideoGalleryHelper %> | ||
| 2 | + | ||
| 3 | +<% unless video_gallery.body.blank? %> | ||
| 4 | + <div> | ||
| 5 | + <%= video_gallery.body %> | ||
| 6 | + </div> | ||
| 7 | + <hr/> | ||
| 8 | +<% end %> | ||
| 9 | + | ||
| 10 | +<% if video_gallery.children.empty? %> | ||
| 11 | + <em><%= _('(empty video gallery)') %></em> | ||
| 12 | +<% else %> | ||
| 13 | + <%= list_videos(:contents=>video_gallery.children) %> | ||
| 14 | +<% end %> | ||
| 0 | \ No newline at end of file | 15 | \ No newline at end of file |
| @@ -0,0 +1,40 @@ | @@ -0,0 +1,40 @@ | ||
| 1 | +<div> | ||
| 2 | + <% | ||
| 3 | + first_video = contents[0] | ||
| 4 | + first_video_arr = Array.new | ||
| 5 | + first_video_arr.push(first_video) | ||
| 6 | + other_videos = contents - first_video_arr %> | ||
| 7 | + <% if first_video.display_to?(user) %> | ||
| 8 | + <div class="video-gallery-table-big"> | ||
| 9 | + <div class="video-gallery-left-column-big"> | ||
| 10 | + <%= link_to first_video.view_url do %> | ||
| 11 | + <img width="320" height="320" src='<%= first_video.video_thumbnail_url %>' class="disable-zoom"/> | ||
| 12 | + <% end %> | ||
| 13 | + </div> | ||
| 14 | + <div class="video-gallery-right-column-big"> | ||
| 15 | + <div class="video-title-big"><%= first_video.title %></div> | ||
| 16 | + <div class="video-author-big"> | ||
| 17 | + <%= _("by") %> <%= first_video.author_name %> <%= _("updated at") %> <%= time_ago_as_sentence(first_video.updated_at) %> | ||
| 18 | + </div> | ||
| 19 | + </div> | ||
| 20 | + </div> | ||
| 21 | + <% end %> | ||
| 22 | + <% other_videos.each do |content| %> | ||
| 23 | + <% if content.display_to?(user) %> | ||
| 24 | + <div class="video-gallery-thumbnail"> | ||
| 25 | + <div class="video-gallery-top-box"> | ||
| 26 | + <%= link_to content.view_url do %> | ||
| 27 | + <img width="<%= content.thumbnail_fitted_width %>" height="<%= content.thumbnail_fitted_height %>" src='<%= content.video_thumbnail_url %>' class="disable-zoom"/> | ||
| 28 | + <% end %> | ||
| 29 | + </div> | ||
| 30 | + <div class="video-gallery-botton-box"> | ||
| 31 | + <div class="video-author"> | ||
| 32 | + <%= _("by") %> <%= content.author_name %> <%= _("updated at") %> <%= time_ago_as_sentence(content.updated_at) %> | ||
| 33 | + </div> | ||
| 34 | + <div class="video-title"><%= content.title %></div> | ||
| 35 | + </div> | ||
| 36 | + </div> | ||
| 37 | + <% end %> | ||
| 38 | + <% end %> | ||
| 39 | +<p><%= pagination_links contents, :param_name => 'npage', :page_links => true %></p> | ||
| 40 | +</div> |