concerto_remote_video 0.2.1 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -6
- data/app/assets/javascripts/concerto_remote_video/remote_video.js +96 -66
- data/app/models/remote_video.rb +58 -9
- data/app/views/contents/remote_video/_form_top.html.erb +5 -5
- data/app/views/contents/remote_video/_render_default.html.erb +4 -4
- data/app/views/contents/remote_video/_render_tile.html.erb +12 -1
- data/lib/concerto_remote_video/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0057c70e019b24d881176d1cee19c25b2cfbe15f
|
4
|
+
data.tar.gz: 427ad38f5490bf3d9bb97b56613c9b6a90c9d884
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abf286284ce3481b42daac729849b5d71d41ab0274e2a72a97c558883c0a363a3bc7ddda0cb3e9bae14ef14c25d37f9e07cf123e435e838e777b10452d4cac83
|
7
|
+
data.tar.gz: 6a21256b3c5f55af89a5be869f82c0ecd643c92291e78485e3aa3e8ae218990e7ff32a9c685c3fdbacfd4613d211deaf283e8aa444ac1585822164f2b9919912
|
data/README.md
CHANGED
@@ -1,13 +1,10 @@
|
|
1
1
|
# Concerto 2 Remote Video Plugin
|
2
2
|
This plugin provides support to play remotely hosted videos, like YouTube videos, in Concerto 2.
|
3
3
|
|
4
|
-
|
5
|
-
2. ```bundle install```
|
6
|
-
3. ```./script/rails generate concerto_remote_video:install install```
|
4
|
+
To install this plugin, go to the Plugin management page in concerto, select RubyGems as the source and "concerto_remote_video" as the gem name.
|
7
5
|
|
8
|
-
|
9
|
-
|
10
|
-
## Supported hosts:
|
6
|
+
## Supported sources:
|
7
|
+
* HTTP - MP4 videos primarily (http://en.wikipedia.org/wiki/HTML5_video#Supported_video_formats)
|
11
8
|
* YouTube
|
12
9
|
* Vimeo
|
13
10
|
|
@@ -1,80 +1,110 @@
|
|
1
|
-
|
1
|
+
var initializedRemoteVideoHandlers = false;
|
2
|
+
function initializeRemoteVideoHandlers() {
|
3
|
+
if (!initializedRemoteVideoHandlers) {
|
2
4
|
|
3
|
-
|
4
|
-
//
|
5
|
-
|
6
|
-
$('input#remote_video_config_video_id').on('blur', getVideoInfo);
|
7
|
-
$('select#remote_video_config_video_vendor').on('change', getVideoInfo);
|
5
|
+
function getVideoInfo() {
|
6
|
+
// need to know which vendor
|
7
|
+
// will place title, description, duration into 'div.remote-video-info'
|
8
8
|
|
9
|
-
|
9
|
+
var info = '<p>Video details could not be determined.</p>';
|
10
|
+
var vendor = $('select#remote_video_config_video_vendor').val();
|
11
|
+
var video_id = $('input#remote_video_config_video_id').val();
|
12
|
+
var info_el = $('.remote-video-info');
|
13
|
+
var preview_div = $('#preview_div');
|
14
|
+
$(preview_div).empty();
|
10
15
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
if (typeof vendor != 'undefined') {
|
34
|
-
// we found the vendor selection, call appropriate api
|
35
|
-
if (vendor == 'YouTube') {
|
36
|
-
$(info_el).empty().html('<i class=\"ficon-spinner icon-spin\"></i> searching...');
|
37
|
-
// todo: dont search if video_id is empty
|
38
|
-
$.ajax({
|
39
|
-
url: '//gdata.youtube.com/feeds/api/videos?q='+ encodeURIComponent(video_id) +'&v=2&max-results=1&format=5&alt=jsonc',
|
40
|
-
dataType: 'jsonp',
|
41
|
-
timeout: 4000,
|
42
|
-
success: function (data) {
|
43
|
-
if (parseInt(data['data']['totalItems']) > 0) {
|
44
|
-
// we got something, repoint data to first item in results
|
45
|
-
data = data['data']['items'];
|
46
|
-
$(info_el).empty().html('<img src="' + data[0].thumbnail.hqDefault + '"/><h4>' + data[0].title + '</h4><i>' + data[0].duration + ' secs</i><br/><p>' + data[0].description + '</p>');
|
47
|
-
} else {
|
16
|
+
if (info_el.length != 0) {
|
17
|
+
// we found the summary box
|
18
|
+
if (typeof vendor != 'undefined') {
|
19
|
+
// we found the vendor selection, call appropriate api
|
20
|
+
if (vendor == 'YouTube') {
|
21
|
+
$(info_el).empty().html('<i class=\"ficon-spinner icon-spin\"></i> searching...');
|
22
|
+
// todo: dont search if video_id is empty
|
23
|
+
$.ajax({
|
24
|
+
url: '//gdata.youtube.com/feeds/api/videos?q='+ encodeURIComponent(video_id) +'&v=2&max-results=1&format=5&alt=jsonc',
|
25
|
+
dataType: 'jsonp',
|
26
|
+
timeout: 4000,
|
27
|
+
success: function (data) {
|
28
|
+
if (parseInt(data['data']['totalItems']) > 0) {
|
29
|
+
// we got something, repoint data to first item in results
|
30
|
+
data = data['data']['items'];
|
31
|
+
$(info_el).empty().html('<img src="' + data[0].thumbnail.hqDefault + '"/><h4>' + data[0].title + '</h4><i>' + data[0].duration + ' secs</i><br/><p>' + data[0].description + '</p>');
|
32
|
+
previewVideo(data[0].id);
|
33
|
+
} else {
|
34
|
+
$(info_el).empty().html(info);
|
35
|
+
}
|
36
|
+
},
|
37
|
+
error: function (xoptions, textStatus) {
|
48
38
|
$(info_el).empty().html(info);
|
49
39
|
}
|
50
|
-
}
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
}
|
40
|
+
});
|
41
|
+
} else if (vendor == 'Vimeo') {
|
42
|
+
$(info_el).empty().html('<i class=\"ficon-spinner icon-spin\"></i> searching...');
|
43
|
+
$.ajax({
|
44
|
+
url: '//vimeo.com/api/v2/video/' + encodeURIComponent(video_id) + '.json',
|
45
|
+
dataType: 'jsonp',
|
46
|
+
timeout: 4000,
|
47
|
+
success: function (data) {
|
48
|
+
if (data.length > 0) {
|
49
|
+
// we got something
|
50
|
+
$(info_el).empty().html('<img src="' + data[0].thumbnail_small + '"/><h4>' + data[0].title + '</h4><i>' + data[0].duration + ' secs</i><br/><p>' + data[0].description + '</p>');
|
51
|
+
previewVideo();
|
52
|
+
} else {
|
53
|
+
$(info_el).empty().html(info);
|
54
|
+
}
|
55
|
+
},
|
56
|
+
error: function (xoptions, textStatus) {
|
66
57
|
$(info_el).empty().html(info);
|
67
58
|
}
|
68
|
-
}
|
69
|
-
|
70
|
-
|
59
|
+
});
|
60
|
+
} else if (vendor == 'HTTPVideo') {
|
61
|
+
$(info_el).empty();
|
62
|
+
if (video_id != "")
|
63
|
+
{
|
64
|
+
previewVideo();
|
71
65
|
}
|
72
|
-
}
|
66
|
+
}
|
73
67
|
}
|
74
68
|
}
|
75
69
|
}
|
70
|
+
|
71
|
+
function previewVideo(video_id) {
|
72
|
+
var url = $('input#remote_video_config_video_id').data('url');
|
73
|
+
if (url) {
|
74
|
+
if (video_id == null) {
|
75
|
+
video_id = $('input#remote_video_config_video_id').val();
|
76
|
+
}
|
77
|
+
$("#preview_div").load(url, { data: {
|
78
|
+
video_vendor: $('select#remote_video_config_video_vendor').val(),
|
79
|
+
video_id: video_id,
|
80
|
+
allow_flash: $('input#remote_video_config_allow_flash').val(),
|
81
|
+
duration: $('input#remote_video_duration').val(),
|
82
|
+
name: $('input#remote_video_name').val()
|
83
|
+
}, type: 'RemoteVideo' });
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
function updateTooltip() {
|
88
|
+
var vendor = $('select#remote_video_config_video_vendor').val();
|
89
|
+
if (vendor == 'YouTube') {
|
90
|
+
$('input#remote_video_config_video_id').attr("placeholder", "DGbqvYbPZBY");
|
91
|
+
$('div#video_id_hint').html('Specify the video id or keywords');
|
92
|
+
} else if (vendor == 'Vimeo') {
|
93
|
+
$('input#remote_video_config_video_id').attr("placeholder", "4224811");
|
94
|
+
$('div#video_id_hint').html('Specify the exact vimeo video id');
|
95
|
+
} else if (vendor == 'HTTPVideo') {
|
96
|
+
$('input#remote_video_config_video_id').attr("placeholder", "http://media.w3.org/2010/05/sintel/trailer.mp4");
|
97
|
+
$('div#video_id_hint').html('Specify the url of the video');
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
$('input#remote_video_config_video_id').on('blur', getVideoInfo);
|
102
|
+
$('select#remote_video_config_video_vendor').on('change', getVideoInfo);
|
103
|
+
$('select#remote_video_config_video_vendor').on('change', updateTooltip);
|
104
|
+
|
105
|
+
initializedRemoteVideoHandlers = true;
|
76
106
|
}
|
77
107
|
}
|
78
108
|
|
79
|
-
$(document).ready(
|
80
|
-
$(document).on('page:change',
|
109
|
+
$(document).ready(initializeRemoteVideoHandlers);
|
110
|
+
$(document).on('page:change', initializeRemoteVideoHandlers);
|
data/app/models/remote_video.rb
CHANGED
@@ -13,8 +13,9 @@ class RemoteVideo < Content
|
|
13
13
|
|
14
14
|
DISPLAY_NAME = 'Video'
|
15
15
|
VIDEO_VENDORS = {
|
16
|
-
|
17
|
-
:
|
16
|
+
:HTTPVideo => { :id => "HTTPVideo", :name => "Video URL", :url => ""},
|
17
|
+
:YouTube => { :id => "YouTube", :name => "YouTube", :url => "https://www.youtube.com/embed/" },
|
18
|
+
:Vimeo => { :id => "Vimeo", :name => "Vimeo", :url => "https://player.vimeo.com/video/" }
|
18
19
|
}
|
19
20
|
|
20
21
|
attr_accessor :config
|
@@ -116,6 +117,10 @@ class RemoteVideo < Content
|
|
116
117
|
self.config['thumb_url'] = video_data['thumbnail_small']
|
117
118
|
self.config['title'] = video_data['title']
|
118
119
|
self.config['description'] = video_data['description']
|
120
|
+
elsif self.config['video_vendor'] == VIDEO_VENDORS[:HTTPVideo][:id]
|
121
|
+
self.config['thumb_url'] = ''
|
122
|
+
self.config['title'] = self.name
|
123
|
+
self.config['description'] = ''
|
119
124
|
end
|
120
125
|
end
|
121
126
|
|
@@ -141,26 +146,70 @@ class RemoteVideo < Content
|
|
141
146
|
end
|
142
147
|
end
|
143
148
|
|
149
|
+
def self.preview(data)
|
150
|
+
begin
|
151
|
+
o = RemoteVideo.new()
|
152
|
+
o.config['video_id'] = data[:video_id]
|
153
|
+
o.config['video_vendor'] = data[:video_vendor]
|
154
|
+
o.config['allow_flash'] = data[:allow_flash]
|
155
|
+
o.name = data[:name]
|
156
|
+
o.duration = data[:duration]
|
157
|
+
|
158
|
+
results = o.render_preview
|
159
|
+
rescue => e
|
160
|
+
results = "Unable to preview. #{e.message}"
|
161
|
+
end
|
162
|
+
|
163
|
+
return results
|
164
|
+
end
|
165
|
+
|
166
|
+
def preview
|
167
|
+
begin
|
168
|
+
results = render_preview
|
169
|
+
rescue => e
|
170
|
+
results = "Unable to preview. #{e.message}"
|
171
|
+
end
|
172
|
+
|
173
|
+
return results
|
174
|
+
end
|
175
|
+
|
144
176
|
def render_details
|
145
177
|
if self.config['video_vendor'] == VIDEO_VENDORS[:YouTube][:id]
|
146
178
|
settings = {
|
147
|
-
:autoplay => 1,
|
179
|
+
:autoplay => 1, # Autostart the video
|
148
180
|
:end => self.duration, # Stop it around the duration
|
149
|
-
:controls => 0,
|
150
|
-
:modestbranding => 1,
|
151
|
-
:rel => 0,
|
152
|
-
:showinfo => 0,
|
153
|
-
:iv_load_policy => 3
|
181
|
+
:controls => 0, # Don't show any controls
|
182
|
+
:modestbranding => 1, # Use the less fancy branding
|
183
|
+
:rel => 0, # Don't show related videos
|
184
|
+
:showinfo => 0, # Don't show the video info
|
185
|
+
:iv_load_policy => 3 # Don't show any of those in-video labels
|
154
186
|
}
|
155
187
|
elsif self.config['video_vendor'] == VIDEO_VENDORS[:Vimeo][:id]
|
156
188
|
settings = {
|
157
|
-
:api => 1,
|
189
|
+
:api => 1, # use Javascript API
|
158
190
|
:player_id => 'playerv', #arbitrary id of iframe
|
159
191
|
:byline => 0,
|
160
192
|
:portrait => 0,
|
161
193
|
:autoplay => 1
|
162
194
|
}
|
195
|
+
elsif self.config['video_vendor'] == VIDEO_VENDORS[:HTTPVideo][:id]
|
196
|
+
settings = {
|
197
|
+
:autoplay => 1, # Autostart the video
|
198
|
+
:end => self.duration, # Stop it around the duration
|
199
|
+
:controls => 0, # Don't show any controls
|
200
|
+
}
|
163
201
|
end
|
164
202
|
{:path => player_url(settings)}
|
165
203
|
end
|
204
|
+
|
205
|
+
def render_preview
|
206
|
+
if self.config['video_vendor'] == RemoteVideo::VIDEO_VENDORS[:YouTube][:id] || self.config['video_vendor'] == RemoteVideo::VIDEO_VENDORS[:Vimeo][:id]
|
207
|
+
player_settings = { :end => self.duration, :rel => 0, :theme => 'light', :iv_load_policy => 3 }
|
208
|
+
results = "<iframe id=\"player\" type=\"text/html\" width=\"100%\" src=\"#{self.player_url(player_settings)}\" frameborder=\"0\"></iframe>"
|
209
|
+
elsif self.config['video_vendor'] == RemoteVideo::VIDEO_VENDORS[:HTTPVideo][:id]
|
210
|
+
results = "<video preload controls width=\"100%\"><source src=\"#{self.config['video_id']}\" /></video>"
|
211
|
+
end
|
212
|
+
|
213
|
+
results
|
214
|
+
end
|
166
215
|
end
|
@@ -7,16 +7,16 @@
|
|
7
7
|
<%= form.fields_for :config do |config| %>
|
8
8
|
<div class='span4'>
|
9
9
|
<div class="clearfix">
|
10
|
-
<%= config.label :video_vendor, 'Video
|
10
|
+
<%= config.label :video_vendor, 'Video Source' %>
|
11
11
|
<div class="input">
|
12
|
-
<%= config.select :video_vendor, RemoteVideo::VIDEO_VENDORS.collect { |a,b| b[:id] } %>
|
12
|
+
<%= config.select :video_vendor, RemoteVideo::VIDEO_VENDORS.collect { |a,b| [b[:name], b[:id]] } %>
|
13
13
|
</div>
|
14
14
|
</div>
|
15
15
|
<div class="clearfix">
|
16
16
|
<%= config.label :video_id %>
|
17
17
|
<div class="input">
|
18
|
-
<%= config.text_field :video_id, :placeholder => "
|
19
|
-
<div id="video_id_hint">Specify the
|
18
|
+
<%= config.text_field :video_id, :placeholder => "http://media.w3.org/2010/05/sintel/trailer.mp4", :class => "input-xlarge", "data-url" => preview_contents_path %>
|
19
|
+
<div id="video_id_hint">Specify the url of the video</div>
|
20
20
|
</div>
|
21
21
|
</div>
|
22
22
|
<div class="clearfix">
|
@@ -29,7 +29,7 @@
|
|
29
29
|
<%= form.label :duration %>
|
30
30
|
<div class="input">
|
31
31
|
<%= form.number_field :duration, :class => "input-small" %><br/>
|
32
|
-
(
|
32
|
+
(auto-set if read from video source)
|
33
33
|
</div>
|
34
34
|
</div>
|
35
35
|
</div>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<%= stylesheet_link_tag "concerto_remote_video/application" %>
|
2
2
|
<div class="auto-resizable-iframe">
|
3
|
-
<div>
|
4
|
-
|
5
|
-
|
3
|
+
<div>
|
4
|
+
<%= content.preview.html_safe %>
|
5
|
+
</div>
|
6
6
|
</div>
|
7
|
-
|
7
|
+
|
@@ -1 +1,12 @@
|
|
1
|
-
|
1
|
+
<% if content.config['thumb_url'].blank? %>
|
2
|
+
<div>
|
3
|
+
<h2 class="center">
|
4
|
+
<%= content.name %>
|
5
|
+
</h2>
|
6
|
+
<p>
|
7
|
+
<%= content.config['video_id'] %>
|
8
|
+
</p>
|
9
|
+
</div>
|
10
|
+
<% else %>
|
11
|
+
<div class="pop" style="background-image:url(<%= content.config['thumb_url'] %>); background-size: cover; width: 100%; height: 100%;" data-content="<%= content.config['description']%>" data-title="<%= content.config['title']%>"></div>
|
12
|
+
<% end %>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: concerto_remote_video
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Michalski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|