mediaelement_rails 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,7 +15,7 @@
|
|
15
15
|
var mejs = mejs || {};
|
16
16
|
|
17
17
|
// version number
|
18
|
-
mejs.version = '2.
|
18
|
+
mejs.version = '2.11.0';
|
19
19
|
|
20
20
|
// player number (for missing, same id attr)
|
21
21
|
mejs.meIndex = 0;
|
@@ -30,13 +30,14 @@ mejs.plugins = {
|
|
30
30
|
//,{version: [12,0], types: ['video/webm']} // for future reference (hopefully!)
|
31
31
|
],
|
32
32
|
youtube: [
|
33
|
-
{version: null, types: ['video/youtube', 'video/x-youtube']}
|
33
|
+
{version: null, types: ['video/youtube', 'video/x-youtube', 'audio/youtube', 'audio/x-youtube']}
|
34
34
|
],
|
35
35
|
vimeo: [
|
36
36
|
{version: null, types: ['video/vimeo', 'video/x-vimeo']}
|
37
37
|
]
|
38
38
|
};
|
39
39
|
|
40
|
+
|
40
41
|
/*
|
41
42
|
Utility methods
|
42
43
|
*/
|
@@ -148,7 +149,7 @@ mejs.Utility = {
|
|
148
149
|
/* borrowed from SWFObject: http://code.google.com/p/swfobject/source/browse/trunk/swfobject/src/swfobject.js#474 */
|
149
150
|
removeSwf: function(id) {
|
150
151
|
var obj = document.getElementById(id);
|
151
|
-
if (obj && obj.nodeName
|
152
|
+
if (obj && /object|embed/i.test(obj.nodeName)) {
|
152
153
|
if (mejs.MediaFeatures.isIE) {
|
153
154
|
obj.style.display = "none";
|
154
155
|
(function(){
|
@@ -532,13 +533,13 @@ mejs.PluginMediaElement.prototype = {
|
|
532
533
|
for (j=0; j<pluginInfo.types.length; j++) {
|
533
534
|
// find plugin that can play the type
|
534
535
|
if (type == pluginInfo.types[j]) {
|
535
|
-
return
|
536
|
+
return 'probably';
|
536
537
|
}
|
537
538
|
}
|
538
539
|
}
|
539
540
|
}
|
540
541
|
|
541
|
-
return
|
542
|
+
return '';
|
542
543
|
},
|
543
544
|
|
544
545
|
positionFullscreenButton: function(x,y,visibleAndAbove) {
|
@@ -701,6 +702,7 @@ mejs.PluginMediaElement.prototype = {
|
|
701
702
|
|
702
703
|
remove: function() {
|
703
704
|
mejs.Utility.removeSwf(this.pluginElement.id);
|
705
|
+
mejs.MediaPluginBridge.unregisterPluginElement(this.pluginElement.id);
|
704
706
|
}
|
705
707
|
};
|
706
708
|
|
@@ -715,6 +717,11 @@ mejs.MediaPluginBridge = {
|
|
715
717
|
this.htmlMediaElements[id] = htmlMediaElement;
|
716
718
|
},
|
717
719
|
|
720
|
+
unregisterPluginElement: function (id) {
|
721
|
+
delete this.pluginMediaElements[id];
|
722
|
+
delete this.htmlMediaElements[id];
|
723
|
+
},
|
724
|
+
|
718
725
|
// when Flash/Silverlight is ready, it calls out to this method
|
719
726
|
initPlugin: function (id) {
|
720
727
|
|
@@ -1210,7 +1217,7 @@ mejs.HtmlMediaElementShim = {
|
|
1210
1217
|
switch (playback.method) {
|
1211
1218
|
case 'silverlight':
|
1212
1219
|
container.innerHTML =
|
1213
|
-
'<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="' + pluginid + '" name="' + pluginid + '" width="' + width + '" height="' + height + '">' +
|
1220
|
+
'<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" id="' + pluginid + '" name="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' +
|
1214
1221
|
'<param name="initParams" value="' + initVars.join(',') + '" />' +
|
1215
1222
|
'<param name="windowless" value="true" />' +
|
1216
1223
|
'<param name="background" value="black" />' +
|
@@ -1227,7 +1234,7 @@ mejs.HtmlMediaElementShim = {
|
|
1227
1234
|
container.appendChild(specialIEContainer);
|
1228
1235
|
specialIEContainer.outerHTML =
|
1229
1236
|
'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
|
1230
|
-
'id="' + pluginid + '" width="' + width + '" height="' + height + '">' +
|
1237
|
+
'id="' + pluginid + '" width="' + width + '" height="' + height + '" class="mejs-shim">' +
|
1231
1238
|
'<param name="movie" value="' + options.pluginPath + options.flashName + '?x=' + (new Date()) + '" />' +
|
1232
1239
|
'<param name="flashvars" value="' + initVars.join('&') + '" />' +
|
1233
1240
|
'<param name="quality" value="high" />' +
|
@@ -1252,7 +1259,8 @@ mejs.HtmlMediaElementShim = {
|
|
1252
1259
|
'src="' + options.pluginPath + options.flashName + '" ' +
|
1253
1260
|
'flashvars="' + initVars.join('&') + '" ' +
|
1254
1261
|
'width="' + width + '" ' +
|
1255
|
-
'height="' + height + '"
|
1262
|
+
'height="' + height + '" ' +
|
1263
|
+
'class="mejs-shim"></embed>';
|
1256
1264
|
}
|
1257
1265
|
break;
|
1258
1266
|
|
@@ -1285,16 +1293,16 @@ mejs.HtmlMediaElementShim = {
|
|
1285
1293
|
|
1286
1294
|
pluginMediaElement.vimeoid = playback.url.substr(playback.url.lastIndexOf('/')+1);
|
1287
1295
|
|
1288
|
-
container.innerHTML ='<iframe src="http://player.vimeo.com/video/' + pluginMediaElement.vimeoid + '?portrait=0&byline=0&title=0" width="' + width +'" height="' + height +'" frameborder="0"></iframe>';
|
1296
|
+
container.innerHTML ='<iframe src="http://player.vimeo.com/video/' + pluginMediaElement.vimeoid + '?portrait=0&byline=0&title=0" width="' + width +'" height="' + height +'" frameborder="0" class="mejs-shim"></iframe>';
|
1289
1297
|
|
1290
1298
|
/*
|
1291
1299
|
container.innerHTML =
|
1292
|
-
'<object width="' + width + '" height="' + height + '">' +
|
1300
|
+
'<object width="' + width + '" height="' + height + '" class="mejs-shim">' +
|
1293
1301
|
'<param name="allowfullscreen" value="true" />' +
|
1294
1302
|
'<param name="allowscriptaccess" value="always" />' +
|
1295
1303
|
'<param name="flashvars" value="api=1" />' +
|
1296
1304
|
'<param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=' + pluginMediaElement.vimeoid + '&server=vimeo.com&show_title=0&show_byline=0&show_portrait=0&color=00adef&fullscreen=1&autoplay=0&loop=0" />' +
|
1297
|
-
'<embed src="//vimeo.com/moogaloop.swf?api=1&clip_id=' + pluginMediaElement.vimeoid + '&server=vimeo.com&show_title=0&show_byline=0&show_portrait=0&color=00adef&fullscreen=1&autoplay=0&loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="' + width + '" height="' + height + '"></embed>' +
|
1305
|
+
'<embed src="//vimeo.com/moogaloop.swf?api=1&clip_id=' + pluginMediaElement.vimeoid + '&server=vimeo.com&show_title=0&show_byline=0&show_portrait=0&color=00adef&fullscreen=1&autoplay=0&loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="' + width + '" height="' + height + '" class="mejs-shim"></embed>' +
|
1298
1306
|
'</object>';
|
1299
1307
|
*/
|
1300
1308
|
|
@@ -1478,7 +1486,7 @@ mejs.YouTubeApi = {
|
|
1478
1486
|
/*
|
1479
1487
|
settings.container.innerHTML =
|
1480
1488
|
'<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="//www.youtube.com/apiplayer?enablejsapi=1&playerapiid=' + settings.pluginId + '&version=3&autoplay=0&controls=0&modestbranding=1&loop=0" ' +
|
1481
|
-
'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; ">' +
|
1489
|
+
'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' +
|
1482
1490
|
'<param name="allowScriptAccess" value="always">' +
|
1483
1491
|
'<param name="wmode" value="transparent">' +
|
1484
1492
|
'</object>';
|
@@ -1492,7 +1500,7 @@ mejs.YouTubeApi = {
|
|
1492
1500
|
specialIEContainer = document.createElement('div');
|
1493
1501
|
settings.container.appendChild(specialIEContainer);
|
1494
1502
|
specialIEContainer.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab" ' +
|
1495
|
-
'id="' + settings.pluginId + '" width="' + settings.width + '" height="' + settings.height + '">' +
|
1503
|
+
'id="' + settings.pluginId + '" width="' + settings.width + '" height="' + settings.height + '" class="mejs-shim">' +
|
1496
1504
|
'<param name="movie" value="' + youtubeUrl + '" />' +
|
1497
1505
|
'<param name="wmode" value="transparent" />' +
|
1498
1506
|
'<param name="allowScriptAccess" value="always" />' +
|
@@ -1501,7 +1509,7 @@ mejs.YouTubeApi = {
|
|
1501
1509
|
} else {
|
1502
1510
|
settings.container.innerHTML =
|
1503
1511
|
'<object type="application/x-shockwave-flash" id="' + settings.pluginId + '" data="' + youtubeUrl + '" ' +
|
1504
|
-
'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; ">' +
|
1512
|
+
'width="' + settings.width + '" height="' + settings.height + '" style="visibility: visible; " class="mejs-shim">' +
|
1505
1513
|
'<param name="allowScriptAccess" value="always">' +
|
1506
1514
|
'<param name="wmode" value="transparent">' +
|
1507
1515
|
'</object>';
|
@@ -66,6 +66,8 @@ if (typeof jQuery != 'undefined') {
|
|
66
66
|
autosizeProgress : true,
|
67
67
|
// Hide controls when playing and mouse is not over the video
|
68
68
|
alwaysShowControls: false,
|
69
|
+
// Display the video control
|
70
|
+
hideVideoControlsOnLoad: false,
|
69
71
|
// Enable click video element to toggle play/pause
|
70
72
|
clickToPlayPause: true,
|
71
73
|
// force iPad's native controls
|
@@ -167,7 +169,7 @@ if (typeof jQuery != 'undefined') {
|
|
167
169
|
|
168
170
|
mejs.mepIndex = 0;
|
169
171
|
|
170
|
-
mejs.players =
|
172
|
+
mejs.players = {};
|
171
173
|
|
172
174
|
// wraps a MediaElement object in player controls
|
173
175
|
mejs.MediaElementPlayer = function(node, o) {
|
@@ -199,8 +201,11 @@ if (typeof jQuery != 'undefined') {
|
|
199
201
|
// extend default options
|
200
202
|
t.options = $.extend({},mejs.MepDefaults,o);
|
201
203
|
|
204
|
+
// unique ID
|
205
|
+
t.id = 'mep_' + mejs.mepIndex++;
|
206
|
+
|
202
207
|
// add to player array (for focus events)
|
203
|
-
mejs.players.
|
208
|
+
mejs.players[t.id] = t;
|
204
209
|
|
205
210
|
// start up
|
206
211
|
t.init();
|
@@ -252,7 +257,7 @@ if (typeof jQuery != 'undefined') {
|
|
252
257
|
t.media.play();
|
253
258
|
}
|
254
259
|
|
255
|
-
} else if (mf.isAndroid && t.AndroidUseNativeControls) {
|
260
|
+
} else if (mf.isAndroid && t.options.AndroidUseNativeControls) {
|
256
261
|
|
257
262
|
// leave default player
|
258
263
|
|
@@ -263,9 +268,6 @@ if (typeof jQuery != 'undefined') {
|
|
263
268
|
// remove native controls
|
264
269
|
t.$media.removeAttr('controls');
|
265
270
|
|
266
|
-
// unique ID
|
267
|
-
t.id = 'mep_' + mejs.mepIndex++;
|
268
|
-
|
269
271
|
// build container
|
270
272
|
t.container =
|
271
273
|
$('<div id="' + t.id + '" class="mejs-container ' + (mejs.MediaFeatures.svg ? 'svg' : 'no-svg') + '">'+
|
@@ -604,7 +606,11 @@ if (typeof jQuery != 'undefined') {
|
|
604
606
|
}
|
605
607
|
});
|
606
608
|
}
|
607
|
-
|
609
|
+
|
610
|
+
if(t.options.hideVideoControlsOnLoad) {
|
611
|
+
t.hideControls(false);
|
612
|
+
}
|
613
|
+
|
608
614
|
// check for autoplay
|
609
615
|
if (autoplay && !t.options.alwaysShowControls) {
|
610
616
|
t.hideControls();
|
@@ -628,10 +634,11 @@ if (typeof jQuery != 'undefined') {
|
|
628
634
|
|
629
635
|
// FOCUS: when a video starts playing, it takes focus from other players (possibily pausing them)
|
630
636
|
media.addEventListener('play', function() {
|
637
|
+
var playerIndex;
|
631
638
|
|
632
639
|
// go through all other players
|
633
|
-
for (
|
634
|
-
var p = mejs.players[
|
640
|
+
for (playerIndex in mejs.players) {
|
641
|
+
var p = mejs.players[playerIndex];
|
635
642
|
if (p.id != t.id && t.options.pauseOtherPlayers && !p.paused && !p.ended) {
|
636
643
|
p.pause();
|
637
644
|
}
|
@@ -688,7 +695,7 @@ if (typeof jQuery != 'undefined') {
|
|
688
695
|
}, 50);
|
689
696
|
|
690
697
|
// adjust controls whenever window sizes (used to be in fullscreen only)
|
691
|
-
|
698
|
+
t.globalBind('resize', function() {
|
692
699
|
|
693
700
|
// don't resize for fullscreen mode
|
694
701
|
if ( !(t.isFullScreen || (mejs.MediaFeatures.hasTrueNativeFullScreen && document.webkitIsFullScreen)) ) {
|
@@ -762,17 +769,12 @@ if (typeof jQuery != 'undefined') {
|
|
762
769
|
t.container
|
763
770
|
.width(parentWidth)
|
764
771
|
.height(newHeight);
|
765
|
-
|
766
|
-
// set native <video> or <audio>
|
767
|
-
t.$media
|
768
|
-
.width('100%')
|
769
|
-
.height('100%');
|
770
|
-
|
771
|
-
// set shims
|
772
|
-
t.container.find('object, embed, iframe')
|
772
|
+
|
773
|
+
// set native <video> or <audio> and shims
|
774
|
+
t.$media.add(t.container.find('.mejs-shim'))
|
773
775
|
.width('100%')
|
774
776
|
.height('100%');
|
775
|
-
|
777
|
+
|
776
778
|
// if shim is ready, send the size to the embeded plugin
|
777
779
|
if (t.isVideo) {
|
778
780
|
if (t.media.setVideoSize) {
|
@@ -823,7 +825,8 @@ if (typeof jQuery != 'undefined') {
|
|
823
825
|
|
824
826
|
// find the size of all the other controls besides the rail
|
825
827
|
others.each(function() {
|
826
|
-
|
828
|
+
var $this = $(this);
|
829
|
+
if ($this.css('position') != 'absolute' && $this.is(':visible')) {
|
827
830
|
usedWidth += $(this).outerWidth(true);
|
828
831
|
}
|
829
832
|
});
|
@@ -988,7 +991,7 @@ if (typeof jQuery != 'undefined') {
|
|
988
991
|
var t = this;
|
989
992
|
|
990
993
|
// listen for key presses
|
991
|
-
|
994
|
+
t.globalBind('keydown', function(e) {
|
992
995
|
|
993
996
|
if (player.hasFocus && player.options.enableKeyboard) {
|
994
997
|
|
@@ -1010,7 +1013,7 @@ if (typeof jQuery != 'undefined') {
|
|
1010
1013
|
});
|
1011
1014
|
|
1012
1015
|
// check if someone clicked outside a player region, then kill its focus
|
1013
|
-
|
1016
|
+
t.globalBind('click', function(event) {
|
1014
1017
|
if ($(event.target).closest('.mejs-container').length == 0) {
|
1015
1018
|
player.hasFocus = false;
|
1016
1019
|
}
|
@@ -1029,7 +1032,7 @@ if (typeof jQuery != 'undefined') {
|
|
1029
1032
|
track = $(track);
|
1030
1033
|
|
1031
1034
|
t.tracks.push({
|
1032
|
-
srclang: track.attr('srclang').toLowerCase(),
|
1035
|
+
srclang: (track.attr('srclang')) ? track.attr('srclang').toLowerCase() : '',
|
1033
1036
|
src: track.attr('src'),
|
1034
1037
|
kind: track.attr('kind'),
|
1035
1038
|
label: track.attr('label') || '',
|
@@ -1071,29 +1074,98 @@ if (typeof jQuery != 'undefined') {
|
|
1071
1074
|
this.media.setSrc(src);
|
1072
1075
|
},
|
1073
1076
|
remove: function() {
|
1074
|
-
var t = this;
|
1077
|
+
var t = this, featureIndex, feature;
|
1075
1078
|
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1079
|
+
// invoke features cleanup
|
1080
|
+
for (featureIndex in t.options.features) {
|
1081
|
+
feature = t.options.features[featureIndex];
|
1082
|
+
if (t['clean' + feature]) {
|
1083
|
+
try {
|
1084
|
+
t['clean' + feature](t);
|
1085
|
+
} catch (e) {
|
1086
|
+
// TODO: report control error
|
1087
|
+
//throw e;
|
1088
|
+
//console.log('error building ' + feature);
|
1089
|
+
//console.log(e);
|
1090
|
+
}
|
1091
|
+
}
|
1092
|
+
}
|
1093
|
+
|
1094
|
+
if (t.media.pluginType === 'native') {
|
1079
1095
|
t.$media.prop('controls', true);
|
1096
|
+
} else {
|
1097
|
+
t.media.remove();
|
1080
1098
|
}
|
1081
1099
|
|
1082
1100
|
// grab video and put it back in place
|
1083
1101
|
if (!t.isDynamic) {
|
1084
|
-
|
1102
|
+
if (t.media.pluginType === 'native') {
|
1103
|
+
// detach events from the video
|
1104
|
+
// TODO: detach event listeners better than this;
|
1105
|
+
// also detach ONLY the events attached by this plugin!
|
1106
|
+
//t.$node.clone().insertBefore(t.container);
|
1107
|
+
//t.$node.remove();
|
1108
|
+
}
|
1109
|
+
/*else*/ t.$node.insertBefore(t.container)
|
1085
1110
|
}
|
1111
|
+
|
1112
|
+
// Remove the player from the mejs.players array so that pauseOtherPlayers doesn't blow up when trying to pause a non existance flash api.
|
1113
|
+
mejs.players.splice( $.inArray( t, mejs.players ), 1);
|
1086
1114
|
|
1087
1115
|
t.container.remove();
|
1116
|
+
t.globalUnbind();
|
1117
|
+
delete t.node.player;
|
1118
|
+
delete mejs.players[t.id];
|
1088
1119
|
}
|
1089
1120
|
};
|
1090
1121
|
|
1122
|
+
(function(){
|
1123
|
+
var rwindow = /^((after|before)print|(before)?unload|hashchange|message|o(ff|n)line|page(hide|show)|popstate|resize|storage)\b/;
|
1124
|
+
|
1125
|
+
function splitEvents(events, id) {
|
1126
|
+
// add player ID as an event namespace so it's easier to unbind them all later
|
1127
|
+
var ret = {d: [], w: []};
|
1128
|
+
$.each((events || '').split(' '), function(k, v){
|
1129
|
+
ret[rwindow.test(v) ? 'w' : 'd'].push(v + '.' + id);
|
1130
|
+
});
|
1131
|
+
ret.d = ret.d.join(' ');
|
1132
|
+
ret.w = ret.w.join(' ');
|
1133
|
+
return ret;
|
1134
|
+
}
|
1135
|
+
|
1136
|
+
mejs.MediaElementPlayer.prototype.globalBind = function(events, data, callback) {
|
1137
|
+
var t = this;
|
1138
|
+
events = splitEvents(events, t.id);
|
1139
|
+
if (events.d) $(document).bind(events.d, data, callback);
|
1140
|
+
if (events.w) $(window).bind(events.w, data, callback);
|
1141
|
+
};
|
1142
|
+
|
1143
|
+
mejs.MediaElementPlayer.prototype.globalUnbind = function(events, callback) {
|
1144
|
+
var t = this;
|
1145
|
+
events = splitEvents(events, t.id);
|
1146
|
+
if (events.d) $(document).unbind(events.d, callback);
|
1147
|
+
if (events.w) $(window).unbind(events.w, callback);
|
1148
|
+
};
|
1149
|
+
})();
|
1150
|
+
|
1091
1151
|
// turn into jQuery plugin
|
1092
1152
|
if (typeof jQuery != 'undefined') {
|
1093
1153
|
jQuery.fn.mediaelementplayer = function (options) {
|
1094
|
-
|
1095
|
-
|
1096
|
-
|
1154
|
+
if (options === false) {
|
1155
|
+
this.each(function () {
|
1156
|
+
var player = jQuery(this).data('mediaelementplayer');
|
1157
|
+
if (player) {
|
1158
|
+
player.remove();
|
1159
|
+
}
|
1160
|
+
jQuery(this).removeData('mediaelementplayer');
|
1161
|
+
});
|
1162
|
+
}
|
1163
|
+
else {
|
1164
|
+
this.each(function () {
|
1165
|
+
jQuery(this).data('mediaelementplayer', new mejs.MediaElementPlayer(this, options));
|
1166
|
+
});
|
1167
|
+
}
|
1168
|
+
return this;
|
1097
1169
|
};
|
1098
1170
|
}
|
1099
1171
|
|
@@ -1259,21 +1331,20 @@ if (typeof jQuery != 'undefined') {
|
|
1259
1331
|
if (e.which === 1) {
|
1260
1332
|
mouseIsDown = true;
|
1261
1333
|
handleMouseMove(e);
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
});
|
1334
|
+
t.globalBind('mousemove.dur', function(e) {
|
1335
|
+
handleMouseMove(e);
|
1336
|
+
});
|
1337
|
+
t.globalBind('mouseup.dur', function (e) {
|
1338
|
+
mouseIsDown = false;
|
1339
|
+
timefloat.hide();
|
1340
|
+
t.globalUnbind('.dur');
|
1341
|
+
});
|
1271
1342
|
return false;
|
1272
1343
|
}
|
1273
1344
|
})
|
1274
1345
|
.bind('mouseenter', function(e) {
|
1275
1346
|
mouseIsOver = true;
|
1276
|
-
|
1347
|
+
t.globalBind('mousemove.dur', function(e) {
|
1277
1348
|
handleMouseMove(e);
|
1278
1349
|
});
|
1279
1350
|
if (!mejs.MediaFeatures.hasTouch) {
|
@@ -1283,7 +1354,7 @@ if (typeof jQuery != 'undefined') {
|
|
1283
1354
|
.bind('mouseleave',function(e) {
|
1284
1355
|
mouseIsOver = false;
|
1285
1356
|
if (!mouseIsDown) {
|
1286
|
-
|
1357
|
+
t.globalUnbind('.dur');
|
1287
1358
|
timefloat.hide();
|
1288
1359
|
}
|
1289
1360
|
});
|
@@ -1349,8 +1420,8 @@ if (typeof jQuery != 'undefined') {
|
|
1349
1420
|
// update bar and handle
|
1350
1421
|
if (t.total && t.handle) {
|
1351
1422
|
var
|
1352
|
-
newWidth = t.total.width() * t.media.currentTime / t.media.duration,
|
1353
|
-
handlePos = newWidth - (t.handle.outerWidth(true) / 2);
|
1423
|
+
newWidth = Math.round(t.total.width() * t.media.currentTime / t.media.duration),
|
1424
|
+
handlePos = newWidth - Math.round(t.handle.outerWidth(true) / 2);
|
1354
1425
|
|
1355
1426
|
t.current.width(newWidth);
|
1356
1427
|
t.handle.css('left', handlePos);
|
@@ -1432,14 +1503,14 @@ if (typeof jQuery != 'undefined') {
|
|
1432
1503
|
}
|
1433
1504
|
},
|
1434
1505
|
|
1435
|
-
updateDuration: function() {
|
1506
|
+
updateDuration: function() {
|
1436
1507
|
var t = this;
|
1437
1508
|
|
1438
1509
|
//Toggle the long video class if the video is longer than an hour.
|
1439
1510
|
t.container.toggleClass("mejs-long-video", t.media.duration > 3600);
|
1440
1511
|
|
1441
|
-
if (t.
|
1442
|
-
t.durationD.html(mejs.Utility.secondsToTimeCode(t.media.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25));
|
1512
|
+
if (t.durationD && (t.options.duration > 0 || t.media.duration)) {
|
1513
|
+
t.durationD.html(mejs.Utility.secondsToTimeCode(t.options.duration > 0 ? t.options.duration : t.media.duration, t.options.alwaysShowHours, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25));
|
1443
1514
|
}
|
1444
1515
|
}
|
1445
1516
|
});
|
@@ -1617,18 +1688,17 @@ if (typeof jQuery != 'undefined') {
|
|
1617
1688
|
})
|
1618
1689
|
.bind('mousedown', function (e) {
|
1619
1690
|
handleVolumeMove(e);
|
1620
|
-
|
1621
|
-
|
1622
|
-
|
1623
|
-
|
1624
|
-
|
1625
|
-
|
1626
|
-
$(document).unbind('.vol');
|
1691
|
+
t.globalBind('mousemove.vol', function(e) {
|
1692
|
+
handleVolumeMove(e);
|
1693
|
+
});
|
1694
|
+
t.globalBind('mouseup.vol', function () {
|
1695
|
+
mouseIsDown = false;
|
1696
|
+
t.globalUnbind('.vol');
|
1627
1697
|
|
1628
|
-
|
1629
|
-
|
1630
|
-
|
1631
|
-
|
1698
|
+
if (!mouseIsOver && mode == 'vertical') {
|
1699
|
+
volumeSlider.hide();
|
1700
|
+
}
|
1701
|
+
});
|
1632
1702
|
mouseIsDown = true;
|
1633
1703
|
|
1634
1704
|
return false;
|
@@ -1656,7 +1726,12 @@ if (typeof jQuery != 'undefined') {
|
|
1656
1726
|
if (t.container.is(':visible')) {
|
1657
1727
|
// set initial volume
|
1658
1728
|
positionVolumeHandle(player.options.startVolume);
|
1659
|
-
|
1729
|
+
|
1730
|
+
// mutes the media and sets the volume icon muted if the initial volume is set to 0
|
1731
|
+
if (player.options.startVolume === 0) {
|
1732
|
+
media.setMuted(true);
|
1733
|
+
}
|
1734
|
+
|
1660
1735
|
// shim gets the startvolume as a parameter, but we have to set it on the native <video> and <audio> elements
|
1661
1736
|
if (media.pluginType === 'native') {
|
1662
1737
|
media.setVolume(player.options.startVolume);
|
@@ -1696,15 +1771,7 @@ if (typeof jQuery != 'undefined') {
|
|
1696
1771
|
if (mejs.MediaFeatures.hasTrueNativeFullScreen) {
|
1697
1772
|
|
1698
1773
|
// chrome doesn't alays fire this in an iframe
|
1699
|
-
var
|
1700
|
-
|
1701
|
-
if (mejs.MediaFeatures.hasMozNativeFullScreen) {
|
1702
|
-
target = $(document);
|
1703
|
-
} else {
|
1704
|
-
target = player.container;
|
1705
|
-
}
|
1706
|
-
|
1707
|
-
target.bind(mejs.MediaFeatures.fullScreenEventName, function(e) {
|
1774
|
+
var func = function(e) {
|
1708
1775
|
|
1709
1776
|
if (mejs.MediaFeatures.isFullScreen()) {
|
1710
1777
|
player.isNativeFullScreen = true;
|
@@ -1716,7 +1783,13 @@ if (typeof jQuery != 'undefined') {
|
|
1716
1783
|
// make sure to put the player back into place
|
1717
1784
|
player.exitFullScreen();
|
1718
1785
|
}
|
1719
|
-
}
|
1786
|
+
};
|
1787
|
+
|
1788
|
+
if (mejs.MediaFeatures.hasMozNativeFullScreen) {
|
1789
|
+
player.globalBind(mejs.MediaFeatures.fullScreenEventName, func);
|
1790
|
+
} else {
|
1791
|
+
player.container.bind(mejs.MediaFeatures.fullScreenEventName, func);
|
1792
|
+
}
|
1720
1793
|
}
|
1721
1794
|
|
1722
1795
|
var t = this,
|
@@ -1822,7 +1895,7 @@ if (typeof jQuery != 'undefined') {
|
|
1822
1895
|
left: fullScreenBtnOffset + fullScreenBtnWidth});
|
1823
1896
|
};
|
1824
1897
|
|
1825
|
-
|
1898
|
+
t.globalBind('resize', function() {
|
1826
1899
|
positionHoverDivs();
|
1827
1900
|
});
|
1828
1901
|
|
@@ -1862,7 +1935,7 @@ if (typeof jQuery != 'undefined') {
|
|
1862
1935
|
// the mouseout event doesn't work on the fullscren button, because we already killed the pointer-events
|
1863
1936
|
// so we use the document.mousemove event to restore controls when the mouse moves outside the fullscreen button
|
1864
1937
|
/*
|
1865
|
-
|
1938
|
+
t.globalBind('mousemove', function(e) {
|
1866
1939
|
|
1867
1940
|
// if the mouse is anywhere but the fullsceen button, then restore it all
|
1868
1941
|
if (fullscreenIsDisabled) {
|
@@ -1920,13 +1993,18 @@ if (typeof jQuery != 'undefined') {
|
|
1920
1993
|
|
1921
1994
|
player.fullscreenBtn = fullscreenBtn;
|
1922
1995
|
|
1923
|
-
|
1996
|
+
t.globalBind('keydown',function (e) {
|
1924
1997
|
if (((mejs.MediaFeatures.hasTrueNativeFullScreen && mejs.MediaFeatures.isFullScreen()) || t.isFullScreen) && e.keyCode == 27) {
|
1925
1998
|
player.exitFullScreen();
|
1926
1999
|
}
|
1927
2000
|
});
|
1928
2001
|
|
1929
2002
|
},
|
2003
|
+
|
2004
|
+
cleanfullscreen: function(player) {
|
2005
|
+
player.exitFullScreen();
|
2006
|
+
},
|
2007
|
+
|
1930
2008
|
enterFullScreen: function() {
|
1931
2009
|
|
1932
2010
|
var t = this;
|
@@ -2030,7 +2108,7 @@ if (typeof jQuery != 'undefined') {
|
|
2030
2108
|
.width('100%')
|
2031
2109
|
.height('100%');
|
2032
2110
|
} else {
|
2033
|
-
t.container.find('
|
2111
|
+
t.container.find('.mejs-shim')
|
2034
2112
|
.width('100%')
|
2035
2113
|
.height('100%');
|
2036
2114
|
|
@@ -2111,8 +2189,17 @@ if (typeof jQuery != 'undefined') {
|
|
2111
2189
|
$.extend(mejs.MepDefaults, {
|
2112
2190
|
// this will automatically turn on a <track>
|
2113
2191
|
startLanguage: '',
|
2192
|
+
|
2193
|
+
tracksText: 'Captions/Subtitles',
|
2114
2194
|
|
2115
|
-
|
2195
|
+
// option to remove the [cc] button when no <track kind="subtitles"> are present
|
2196
|
+
hideCaptionsButtonWhenEmpty: true,
|
2197
|
+
|
2198
|
+
// If true and we only have one track, change captions to popup
|
2199
|
+
toggleCaptionsButtonWhenOnlyOne: false,
|
2200
|
+
|
2201
|
+
// #id or .class
|
2202
|
+
slidesSelector: ''
|
2116
2203
|
});
|
2117
2204
|
|
2118
2205
|
$.extend(MediaElementPlayer.prototype, {
|
@@ -2126,13 +2213,15 @@ if (typeof jQuery != 'undefined') {
|
|
2126
2213
|
if (player.tracks.length == 0)
|
2127
2214
|
return;
|
2128
2215
|
|
2129
|
-
var t= this,
|
2216
|
+
var t = this,
|
2217
|
+
i,
|
2218
|
+
options = '';
|
2130
2219
|
|
2131
2220
|
player.chapters =
|
2132
2221
|
$('<div class="mejs-chapters mejs-layer"></div>')
|
2133
2222
|
.prependTo(layers).hide();
|
2134
2223
|
player.captions =
|
2135
|
-
$('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position"><span class="mejs-captions-text"></span></div></div>')
|
2224
|
+
$('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover"><span class="mejs-captions-text"></span></div></div>')
|
2136
2225
|
.prependTo(layers).hide();
|
2137
2226
|
player.captionsText = player.captions.find('.mejs-captions-text');
|
2138
2227
|
player.captionsButton =
|
@@ -2147,35 +2236,42 @@ if (typeof jQuery != 'undefined') {
|
|
2147
2236
|
'</ul>'+
|
2148
2237
|
'</div>'+
|
2149
2238
|
'</div>')
|
2150
|
-
.appendTo(controls)
|
2151
|
-
|
2152
|
-
// hover
|
2153
|
-
.hover(function() {
|
2154
|
-
$(this).find('.mejs-captions-selector').css('visibility','visible');
|
2155
|
-
}, function() {
|
2156
|
-
$(this).find('.mejs-captions-selector').css('visibility','hidden');
|
2157
|
-
})
|
2239
|
+
.appendTo(controls);
|
2240
|
+
|
2158
2241
|
|
2159
|
-
|
2160
|
-
|
2161
|
-
|
2242
|
+
var subtitleCount = 0;
|
2243
|
+
for (i=0; i<player.tracks.length; i++) {
|
2244
|
+
if (player.tracks[i].kind == 'subtitles') {
|
2245
|
+
subtitleCount++;
|
2246
|
+
}
|
2247
|
+
}
|
2162
2248
|
|
2163
|
-
|
2164
|
-
|
2165
|
-
|
2166
|
-
|
2167
|
-
|
2168
|
-
|
2169
|
-
|
2170
|
-
|
2171
|
-
|
2172
|
-
|
2173
|
-
|
2174
|
-
|
2175
|
-
|
2176
|
-
|
2177
|
-
|
2178
|
-
|
2249
|
+
// if only one language then just make the button a toggle
|
2250
|
+
if (t.options.toggleCaptionsButtonWhenOnlyOne && subtitleCount == 1){
|
2251
|
+
// click
|
2252
|
+
player.captionsButton.on('click',function() {
|
2253
|
+
if (player.selectedTrack == null) {
|
2254
|
+
var lang = player.tracks[0].srclang;
|
2255
|
+
} else {
|
2256
|
+
var lang = 'none';
|
2257
|
+
}
|
2258
|
+
player.setTrack(lang);
|
2259
|
+
});
|
2260
|
+
} else {
|
2261
|
+
// hover
|
2262
|
+
player.captionsButton.hover(function() {
|
2263
|
+
$(this).find('.mejs-captions-selector').css('visibility','visible');
|
2264
|
+
}, function() {
|
2265
|
+
$(this).find('.mejs-captions-selector').css('visibility','hidden');
|
2266
|
+
})
|
2267
|
+
|
2268
|
+
// handle clicks to the language radio buttons
|
2269
|
+
.on('click','input[type=radio]',function() {
|
2270
|
+
lang = this.value;
|
2271
|
+
player.setTrack(lang);
|
2272
|
+
});
|
2273
|
+
|
2274
|
+
}
|
2179
2275
|
|
2180
2276
|
if (!player.options.alwaysShowControls) {
|
2181
2277
|
// move with controls
|
@@ -2208,12 +2304,22 @@ if (typeof jQuery != 'undefined') {
|
|
2208
2304
|
}
|
2209
2305
|
}
|
2210
2306
|
|
2307
|
+
// start loading tracks
|
2211
2308
|
player.loadNextTrack();
|
2212
2309
|
|
2213
2310
|
|
2214
2311
|
media.addEventListener('timeupdate',function(e) {
|
2215
2312
|
player.displayCaptions();
|
2216
2313
|
}, false);
|
2314
|
+
|
2315
|
+
if (player.options.slidesSelector != '') {
|
2316
|
+
player.slidesContainer = $(player.options.slidesSelector);
|
2317
|
+
|
2318
|
+
media.addEventListener('timeupdate',function(e) {
|
2319
|
+
player.displaySlides();
|
2320
|
+
}, false);
|
2321
|
+
|
2322
|
+
}
|
2217
2323
|
|
2218
2324
|
media.addEventListener('loadedmetadata', function(e) {
|
2219
2325
|
player.displayChapters();
|
@@ -2241,6 +2347,28 @@ if (typeof jQuery != 'undefined') {
|
|
2241
2347
|
player.chapters.css('visibility','hidden');
|
2242
2348
|
}
|
2243
2349
|
},
|
2350
|
+
|
2351
|
+
setTrack: function(lang){
|
2352
|
+
|
2353
|
+
var t = this,
|
2354
|
+
i;
|
2355
|
+
|
2356
|
+
if (lang == 'none') {
|
2357
|
+
t.selectedTrack = null;
|
2358
|
+
t.captionsButton.removeClass('mejs-captions-enabled');
|
2359
|
+
} else {
|
2360
|
+
for (i=0; i<t.tracks.length; i++) {
|
2361
|
+
if (t.tracks[i].srclang == lang) {
|
2362
|
+
if (t.selectedTrack == null)
|
2363
|
+
t.captionsButton.addClass('mejs-captions-enabled');
|
2364
|
+
t.selectedTrack = t.tracks[i];
|
2365
|
+
t.captions.attr('lang', t.selectedTrack.srclang);
|
2366
|
+
t.displayCaptions();
|
2367
|
+
break;
|
2368
|
+
}
|
2369
|
+
}
|
2370
|
+
}
|
2371
|
+
},
|
2244
2372
|
|
2245
2373
|
loadNextTrack: function() {
|
2246
2374
|
var t = this;
|
@@ -2252,6 +2380,8 @@ if (typeof jQuery != 'undefined') {
|
|
2252
2380
|
} else {
|
2253
2381
|
// add done?
|
2254
2382
|
t.isLoadingTrack = false;
|
2383
|
+
|
2384
|
+
t.checkForTracks();
|
2255
2385
|
}
|
2256
2386
|
},
|
2257
2387
|
|
@@ -2293,6 +2423,10 @@ if (typeof jQuery != 'undefined') {
|
|
2293
2423
|
}
|
2294
2424
|
}, false);
|
2295
2425
|
}
|
2426
|
+
|
2427
|
+
if (track.kind == 'slides') {
|
2428
|
+
t.setupSlides(track);
|
2429
|
+
}
|
2296
2430
|
},
|
2297
2431
|
error: function() {
|
2298
2432
|
t.loadNextTrack();
|
@@ -2348,6 +2482,27 @@ if (typeof jQuery != 'undefined') {
|
|
2348
2482
|
t.captionsButton.find('.mejs-captions-translations').outerHeight(true)
|
2349
2483
|
);
|
2350
2484
|
},
|
2485
|
+
|
2486
|
+
checkForTracks: function() {
|
2487
|
+
var
|
2488
|
+
t = this,
|
2489
|
+
hasSubtitles = false;
|
2490
|
+
|
2491
|
+
// check if any subtitles
|
2492
|
+
if (t.options.hideCaptionsButtonWhenEmpty) {
|
2493
|
+
for (i=0; i<t.tracks.length; i++) {
|
2494
|
+
if (t.tracks[i].kind == 'subtitles') {
|
2495
|
+
hasSubtitles = true;
|
2496
|
+
break;
|
2497
|
+
}
|
2498
|
+
}
|
2499
|
+
|
2500
|
+
if (!hasSubtitles) {
|
2501
|
+
t.captionsButton.hide();
|
2502
|
+
t.setControlsSize();
|
2503
|
+
}
|
2504
|
+
}
|
2505
|
+
},
|
2351
2506
|
|
2352
2507
|
displayCaptions: function() {
|
2353
2508
|
|
@@ -2372,6 +2527,70 @@ if (typeof jQuery != 'undefined') {
|
|
2372
2527
|
t.captions.hide();
|
2373
2528
|
}
|
2374
2529
|
},
|
2530
|
+
|
2531
|
+
setupSlides: function(track) {
|
2532
|
+
var t = this;
|
2533
|
+
|
2534
|
+
t.slides = track;
|
2535
|
+
t.slides.entries.imgs = [t.slides.entries.text.length];
|
2536
|
+
t.showSlide(0);
|
2537
|
+
|
2538
|
+
},
|
2539
|
+
|
2540
|
+
showSlide: function(index) {
|
2541
|
+
if (typeof this.tracks == 'undefined' || typeof this.slidesContainer == 'undefined') {
|
2542
|
+
return;
|
2543
|
+
}
|
2544
|
+
|
2545
|
+
var t = this,
|
2546
|
+
url = t.slides.entries.text[index],
|
2547
|
+
img = t.slides.entries.imgs[index];
|
2548
|
+
|
2549
|
+
if (typeof img == 'undefined' || typeof img.fadeIn == 'undefined') {
|
2550
|
+
|
2551
|
+
t.slides.entries.imgs[index] = img = $('<img src="' + url + '">')
|
2552
|
+
.on('load', function() {
|
2553
|
+
img.appendTo(t.slidesContainer)
|
2554
|
+
.hide()
|
2555
|
+
.fadeIn()
|
2556
|
+
.siblings(':visible')
|
2557
|
+
.fadeOut();
|
2558
|
+
|
2559
|
+
});
|
2560
|
+
|
2561
|
+
} else {
|
2562
|
+
|
2563
|
+
if (!img.is(':visible') && !img.is(':animated')) {
|
2564
|
+
|
2565
|
+
console.log('showing existing slide');
|
2566
|
+
|
2567
|
+
img.fadeIn()
|
2568
|
+
.siblings(':visible')
|
2569
|
+
.fadeOut();
|
2570
|
+
}
|
2571
|
+
}
|
2572
|
+
|
2573
|
+
},
|
2574
|
+
|
2575
|
+
displaySlides: function() {
|
2576
|
+
|
2577
|
+
if (typeof this.slides == 'undefined')
|
2578
|
+
return;
|
2579
|
+
|
2580
|
+
var
|
2581
|
+
t = this,
|
2582
|
+
slides = t.slides,
|
2583
|
+
i;
|
2584
|
+
|
2585
|
+
for (i=0; i<slides.entries.times.length; i++) {
|
2586
|
+
if (t.media.currentTime >= slides.entries.times[i].start && t.media.currentTime <= slides.entries.times[i].stop){
|
2587
|
+
|
2588
|
+
t.showSlide(i);
|
2589
|
+
|
2590
|
+
return; // exit out if one is visible;
|
2591
|
+
}
|
2592
|
+
}
|
2593
|
+
},
|
2375
2594
|
|
2376
2595
|
displayChapters: function() {
|
2377
2596
|
var
|
@@ -2735,6 +2954,10 @@ $.extend(mejs.MepDefaults,
|
|
2735
2954
|
|
2736
2955
|
});
|
2737
2956
|
},
|
2957
|
+
|
2958
|
+
cleancontextmenu: function(player) {
|
2959
|
+
player.contextMenu.remove();
|
2960
|
+
},
|
2738
2961
|
|
2739
2962
|
isContextMenuEnabled: true,
|
2740
2963
|
enableContextMenu: function() {
|
Binary file
|
metadata
CHANGED
@@ -1,105 +1,155 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mediaelement_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
5
|
-
prerelease:
|
4
|
+
version: 0.5.1
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Tobias Schlottke
|
9
9
|
- Pete Browne
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-03-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: railties
|
17
|
-
|
17
|
+
version_requirements: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - ">="
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.1'
|
18
22
|
none: false
|
23
|
+
requirement: !ruby/object:Gem::Requirement
|
19
24
|
requirements:
|
20
|
-
- -
|
25
|
+
- - ">="
|
21
26
|
- !ruby/object:Gem::Version
|
22
27
|
version: '3.1'
|
23
|
-
|
28
|
+
none: false
|
24
29
|
prerelease: false
|
25
|
-
|
30
|
+
type: :runtime
|
26
31
|
- !ruby/object:Gem::Dependency
|
27
32
|
name: jquery-rails
|
28
|
-
|
33
|
+
version_requirements: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.0'
|
29
38
|
none: false
|
39
|
+
requirement: !ruby/object:Gem::Requirement
|
30
40
|
requirements:
|
31
|
-
- -
|
41
|
+
- - ">="
|
32
42
|
- !ruby/object:Gem::Version
|
33
43
|
version: '1.0'
|
34
|
-
|
44
|
+
none: false
|
35
45
|
prerelease: false
|
36
|
-
|
46
|
+
type: :runtime
|
37
47
|
- !ruby/object:Gem::Dependency
|
38
48
|
name: rails
|
39
|
-
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '3.1'
|
40
54
|
none: false
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
41
56
|
requirements:
|
42
|
-
- -
|
57
|
+
- - ">="
|
43
58
|
- !ruby/object:Gem::Version
|
44
59
|
version: '3.1'
|
45
|
-
|
60
|
+
none: false
|
46
61
|
prerelease: false
|
47
|
-
|
62
|
+
type: :development
|
48
63
|
- !ruby/object:Gem::Dependency
|
49
64
|
name: i18n
|
50
|
-
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: !binary |-
|
70
|
+
MA==
|
51
71
|
none: false
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
52
73
|
requirements:
|
53
|
-
- -
|
74
|
+
- - ">="
|
54
75
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
56
|
-
|
76
|
+
version: !binary |-
|
77
|
+
MA==
|
78
|
+
none: false
|
57
79
|
prerelease: false
|
58
|
-
|
80
|
+
type: :development
|
59
81
|
- !ruby/object:Gem::Dependency
|
60
82
|
name: turn
|
61
|
-
|
83
|
+
version_requirements: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: !binary |-
|
88
|
+
MA==
|
62
89
|
none: false
|
90
|
+
requirement: !ruby/object:Gem::Requirement
|
63
91
|
requirements:
|
64
|
-
- -
|
92
|
+
- - ">="
|
65
93
|
- !ruby/object:Gem::Version
|
66
|
-
version:
|
67
|
-
|
94
|
+
version: !binary |-
|
95
|
+
MA==
|
96
|
+
none: false
|
68
97
|
prerelease: false
|
69
|
-
|
98
|
+
type: :development
|
70
99
|
- !ruby/object:Gem::Dependency
|
71
100
|
name: sqlite3
|
72
|
-
|
101
|
+
version_requirements: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: !binary |-
|
106
|
+
MA==
|
73
107
|
none: false
|
108
|
+
requirement: !ruby/object:Gem::Requirement
|
74
109
|
requirements:
|
75
|
-
- -
|
110
|
+
- - ">="
|
76
111
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
78
|
-
|
112
|
+
version: !binary |-
|
113
|
+
MA==
|
114
|
+
none: false
|
79
115
|
prerelease: false
|
80
|
-
|
116
|
+
type: :development
|
81
117
|
- !ruby/object:Gem::Dependency
|
82
118
|
name: thor
|
83
|
-
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: !binary |-
|
124
|
+
MA==
|
84
125
|
none: false
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
85
127
|
requirements:
|
86
|
-
- -
|
128
|
+
- - ">="
|
87
129
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
89
|
-
|
130
|
+
version: !binary |-
|
131
|
+
MA==
|
132
|
+
none: false
|
90
133
|
prerelease: false
|
91
|
-
|
134
|
+
type: :development
|
92
135
|
- !ruby/object:Gem::Dependency
|
93
136
|
name: rake
|
94
|
-
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: !binary |-
|
142
|
+
MA==
|
95
143
|
none: false
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
96
145
|
requirements:
|
97
|
-
- -
|
146
|
+
- - ">="
|
98
147
|
- !ruby/object:Gem::Version
|
99
|
-
version:
|
100
|
-
|
148
|
+
version: !binary |-
|
149
|
+
MA==
|
150
|
+
none: false
|
101
151
|
prerelease: false
|
102
|
-
|
152
|
+
type: :development
|
103
153
|
description: A MediaElement gem(engine) for Rails. Makes embedding HTML5 video easy.
|
104
154
|
email:
|
105
155
|
- tobias.schlottke@gmail.com
|
@@ -108,7 +158,7 @@ executables: []
|
|
108
158
|
extensions: []
|
109
159
|
extra_rdoc_files: []
|
110
160
|
files:
|
111
|
-
- .gitignore
|
161
|
+
- ".gitignore"
|
112
162
|
- Gemfile
|
113
163
|
- MIT-LICENSE
|
114
164
|
- README.md
|
@@ -176,26 +226,28 @@ files:
|
|
176
226
|
- vendor/.gitkeep
|
177
227
|
homepage: https://github.com/tobsch/mediaelement_rails
|
178
228
|
licenses: []
|
179
|
-
post_install_message:
|
229
|
+
post_install_message:
|
180
230
|
rdoc_options: []
|
181
231
|
require_paths:
|
182
232
|
- lib
|
183
233
|
required_ruby_version: !ruby/object:Gem::Requirement
|
184
|
-
none: false
|
185
234
|
requirements:
|
186
|
-
- -
|
235
|
+
- - ">="
|
187
236
|
- !ruby/object:Gem::Version
|
188
|
-
version:
|
189
|
-
|
237
|
+
version: !binary |-
|
238
|
+
MA==
|
190
239
|
none: false
|
240
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
191
241
|
requirements:
|
192
|
-
- -
|
242
|
+
- - ">="
|
193
243
|
- !ruby/object:Gem::Version
|
194
|
-
version:
|
244
|
+
version: !binary |-
|
245
|
+
MA==
|
246
|
+
none: false
|
195
247
|
requirements: []
|
196
|
-
rubyforge_project:
|
197
|
-
rubygems_version: 1.8.
|
198
|
-
signing_key:
|
248
|
+
rubyforge_project:
|
249
|
+
rubygems_version: 1.8.24
|
250
|
+
signing_key:
|
199
251
|
specification_version: 3
|
200
252
|
summary: MediaElement.js for Rails
|
201
253
|
test_files:
|