videojs_rails 4.8.5 → 4.9.0
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.
- checksums.yaml +4 -4
- data/lib/videojs_rails/version.rb +1 -1
- data/vendor/assets/javascripts/video.js.erb +118 -45
- data/vendor/assets/stylesheets/video-js.css.erb +37 -8
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd83ed4ae38c370b448785bff4dfabccc489277c
|
4
|
+
data.tar.gz: 67eb6cadd49fe9623c20c6bf9a6e9fc1ba1a7802
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae07acbaeda8ac7e420b761b4b79126eae148cb3964bd5b985a24af34f9799a545d6203add474aa2dddb5d4e0a9c1e5651072117ef9ba583a195fc295b8984e5
|
7
|
+
data.tar.gz: 53d5a6b2a2fec3ce534ce0f9dc7cd24c3f2268bd0a7049c046d68add803f02401be1128f4005c925afc42f4314bb66a4537b7648407ac7da913847abe5a2cbb4
|
@@ -63,7 +63,7 @@ var vjs = function(id, options, ready){
|
|
63
63
|
var videojs = window['videojs'] = vjs;
|
64
64
|
|
65
65
|
// CDN Version. Used to target right flash swf.
|
66
|
-
vjs.CDN_VERSION = '4.
|
66
|
+
vjs.CDN_VERSION = '4.9';
|
67
67
|
vjs.ACCESS_PROTOCOL = ('https:' == document.location.protocol ? 'https://' : 'http://');
|
68
68
|
|
69
69
|
/**
|
@@ -116,7 +116,7 @@ vjs.options = {
|
|
116
116
|
};
|
117
117
|
|
118
118
|
// Set CDN Version of swf
|
119
|
-
// The added (+) blocks the replace from changing this 4.
|
119
|
+
// The added (+) blocks the replace from changing this 4.9 string
|
120
120
|
if (vjs.CDN_VERSION !== 'GENERATED'+'_CDN_VSN') {
|
121
121
|
videojs.options['flash']['swf'] = "<%= asset_path('video-js.swf') %>";
|
122
122
|
}
|
@@ -972,6 +972,17 @@ vjs.isEmpty = function(obj) {
|
|
972
972
|
return true;
|
973
973
|
};
|
974
974
|
|
975
|
+
/**
|
976
|
+
* Check if an element has a CSS class
|
977
|
+
* @param {Element} element Element to check
|
978
|
+
* @param {String} classToCheck Classname to check
|
979
|
+
* @private
|
980
|
+
*/
|
981
|
+
vjs.hasClass = function(element, classToCheck){
|
982
|
+
return ((' ' + element.className + ' ').indexOf(' ' + classToCheck + ' ') !== -1);
|
983
|
+
};
|
984
|
+
|
985
|
+
|
975
986
|
/**
|
976
987
|
* Add a CSS class name to an element
|
977
988
|
* @param {Element} element Element to add class name to
|
@@ -979,7 +990,7 @@ vjs.isEmpty = function(obj) {
|
|
979
990
|
* @private
|
980
991
|
*/
|
981
992
|
vjs.addClass = function(element, classToAdd){
|
982
|
-
if ((
|
993
|
+
if (!vjs.hasClass(element, classToAdd)) {
|
983
994
|
element.className = element.className === '' ? classToAdd : element.className + ' ' + classToAdd;
|
984
995
|
}
|
985
996
|
};
|
@@ -993,7 +1004,7 @@ vjs.addClass = function(element, classToAdd){
|
|
993
1004
|
vjs.removeClass = function(element, classToRemove){
|
994
1005
|
var classNames, i;
|
995
1006
|
|
996
|
-
if (
|
1007
|
+
if (!vjs.hasClass(element, classToRemove)) {return;}
|
997
1008
|
|
998
1009
|
classNames = element.className.split(' ');
|
999
1010
|
|
@@ -2267,6 +2278,16 @@ vjs.Component.prototype.triggerReady = function(){
|
|
2267
2278
|
/* Display
|
2268
2279
|
============================================================================= */
|
2269
2280
|
|
2281
|
+
/**
|
2282
|
+
* Check if a component's element has a CSS class name
|
2283
|
+
*
|
2284
|
+
* @param {String} classToCheck Classname to check
|
2285
|
+
* @return {vjs.Component}
|
2286
|
+
*/
|
2287
|
+
vjs.Component.prototype.hasClass = function(classToCheck){
|
2288
|
+
return vjs.hasClass(this.el_, classToCheck);
|
2289
|
+
};
|
2290
|
+
|
2270
2291
|
/**
|
2271
2292
|
* Add a CSS class name to the component's element
|
2272
2293
|
*
|
@@ -2713,6 +2734,17 @@ vjs.Slider = vjs.Component.extend({
|
|
2713
2734
|
}
|
2714
2735
|
});
|
2715
2736
|
|
2737
|
+
vjs.Slider.prototype.dispose = function() {
|
2738
|
+
vjs.off(document, 'mousemove', this.boundEvents.move, false);
|
2739
|
+
vjs.off(document, 'mouseup', this.boundEvents.end, false);
|
2740
|
+
vjs.off(document, 'touchmove', this.boundEvents.move, false);
|
2741
|
+
vjs.off(document, 'touchend', this.boundEvents.end, false);
|
2742
|
+
|
2743
|
+
vjs.off(document, 'keyup', vjs.bind(this, this.onKeyPress));
|
2744
|
+
|
2745
|
+
vjs.Component.prototype.dispose.call(this);
|
2746
|
+
};
|
2747
|
+
|
2716
2748
|
vjs.Slider.prototype.createEl = function(type, props) {
|
2717
2749
|
props = props || {};
|
2718
2750
|
// Add the slider element class to all sub classes
|
@@ -3128,7 +3160,6 @@ vjs.MenuButton.prototype.unpressButton = function(){
|
|
3128
3160
|
this.menu.unlockShowing();
|
3129
3161
|
this.el_.setAttribute('aria-pressed', false);
|
3130
3162
|
};
|
3131
|
-
|
3132
3163
|
/**
|
3133
3164
|
* Custom MediaError to mimic the HTML5 MediaError
|
3134
3165
|
* @param {Number} code The media error code
|
@@ -3349,6 +3380,9 @@ vjs.Player = vjs.Component.extend({
|
|
3349
3380
|
// see enableTouchActivity in Component
|
3350
3381
|
options.reportTouchActivity = false;
|
3351
3382
|
|
3383
|
+
// Set isAudio based on whether or not an audio tag was used
|
3384
|
+
this.isAudio(this.tag.nodeName.toLowerCase() === 'audio');
|
3385
|
+
|
3352
3386
|
// Run base component initializing with new options.
|
3353
3387
|
// Builds the element through createEl()
|
3354
3388
|
// Inits and embeds any child components in opts
|
@@ -3362,6 +3396,10 @@ vjs.Player = vjs.Component.extend({
|
|
3362
3396
|
this.addClass('vjs-controls-disabled');
|
3363
3397
|
}
|
3364
3398
|
|
3399
|
+
if (this.isAudio()) {
|
3400
|
+
this.addClass('vjs-audio');
|
3401
|
+
}
|
3402
|
+
|
3365
3403
|
// TODO: Make this smarter. Toggle user state between touching/mousing
|
3366
3404
|
// using events, since devices can have both touch and mouse events.
|
3367
3405
|
// if (vjs.TOUCH_ENABLED) {
|
@@ -3452,12 +3490,24 @@ vjs.Player.prototype.dispose = function(){
|
|
3452
3490
|
};
|
3453
3491
|
|
3454
3492
|
vjs.Player.prototype.getTagSettings = function(tag){
|
3455
|
-
var
|
3456
|
-
|
3457
|
-
|
3458
|
-
|
3493
|
+
var tagOptions,
|
3494
|
+
dataSetup,
|
3495
|
+
options = {
|
3496
|
+
'sources': [],
|
3497
|
+
'tracks': []
|
3498
|
+
};
|
3499
|
+
|
3500
|
+
tagOptions = vjs.getElementAttributes(tag);
|
3501
|
+
dataSetup = tagOptions['data-setup'];
|
3459
3502
|
|
3460
|
-
|
3503
|
+
// Check if data-setup attr exists.
|
3504
|
+
if (dataSetup !== null){
|
3505
|
+
// Parse options JSON
|
3506
|
+
// If empty string, make it a parsable json object.
|
3507
|
+
vjs.obj.merge(tagOptions, vjs.JSON.parse(dataSetup || '{}'));
|
3508
|
+
}
|
3509
|
+
|
3510
|
+
vjs.obj.merge(options, tagOptions);
|
3461
3511
|
|
3462
3512
|
// Get tag children settings
|
3463
3513
|
if (tag.hasChildNodes()) {
|
@@ -3517,7 +3567,13 @@ vjs.Player.prototype.createEl = function(){
|
|
3517
3567
|
// ID will now reference player box, not the video tag
|
3518
3568
|
attrs = vjs.getElementAttributes(tag);
|
3519
3569
|
vjs.obj.each(attrs, function(attr) {
|
3520
|
-
|
3570
|
+
// workaround so we don't totally break IE7
|
3571
|
+
// http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7
|
3572
|
+
if (attr == 'class') {
|
3573
|
+
el.className = attrs[attr];
|
3574
|
+
} else {
|
3575
|
+
el.setAttribute(attr, attrs[attr]);
|
3576
|
+
}
|
3521
3577
|
});
|
3522
3578
|
|
3523
3579
|
// Update tag id/class for use as HTML5 playback tech
|
@@ -3768,7 +3824,7 @@ vjs.Player.prototype.onPause = function(){
|
|
3768
3824
|
/**
|
3769
3825
|
* Fired when the current playback position has changed
|
3770
3826
|
*
|
3771
|
-
* During playback this is fired every 15-250 milliseconds,
|
3827
|
+
* During playback this is fired every 15-250 milliseconds, depending on the
|
3772
3828
|
* playback technology in use.
|
3773
3829
|
* @event timeupdate
|
3774
3830
|
*/
|
@@ -4549,6 +4605,8 @@ vjs.Player.prototype.poster = function(src){
|
|
4549
4605
|
|
4550
4606
|
// alert components that the poster has been set
|
4551
4607
|
this.trigger('posterchange');
|
4608
|
+
|
4609
|
+
return this;
|
4552
4610
|
};
|
4553
4611
|
|
4554
4612
|
/**
|
@@ -4831,6 +4889,16 @@ vjs.Player.prototype.playbackRate = function(rate) {
|
|
4831
4889
|
|
4832
4890
|
};
|
4833
4891
|
|
4892
|
+
vjs.Player.prototype.isAudio_ = false;
|
4893
|
+
vjs.Player.prototype.isAudio = function(bool) {
|
4894
|
+
if (bool !== undefined) {
|
4895
|
+
this.isAudio_ = !!bool;
|
4896
|
+
return this;
|
4897
|
+
}
|
4898
|
+
|
4899
|
+
return this.isAudio_;
|
4900
|
+
};
|
4901
|
+
|
4834
4902
|
// Methods to add support for
|
4835
4903
|
// networkState: function(){ return this.techCall('networkState'); },
|
4836
4904
|
// readyState: function(){ return this.techCall('readyState'); },
|
@@ -5594,6 +5662,12 @@ vjs.VolumeMenuButton.prototype.createMenu = function(){
|
|
5594
5662
|
contentElType: 'div'
|
5595
5663
|
});
|
5596
5664
|
var vc = new vjs.VolumeBar(this.player_, vjs.obj.merge({'vertical': true}, this.options_.volumeBar));
|
5665
|
+
vc.on('focus', function() {
|
5666
|
+
menu.lockShowing();
|
5667
|
+
});
|
5668
|
+
vc.on('blur', function() {
|
5669
|
+
menu.unlockShowing();
|
5670
|
+
});
|
5597
5671
|
menu.addChild(vc);
|
5598
5672
|
return menu;
|
5599
5673
|
};
|
@@ -5765,7 +5839,9 @@ vjs.PosterImage = vjs.Button.extend({
|
|
5765
5839
|
this.src(player.poster());
|
5766
5840
|
}));
|
5767
5841
|
|
5768
|
-
player.
|
5842
|
+
if (!player.isAudio()) {
|
5843
|
+
player.on('play', vjs.bind(this, this.hide));
|
5844
|
+
}
|
5769
5845
|
}
|
5770
5846
|
});
|
5771
5847
|
|
@@ -7216,8 +7292,6 @@ vjs.TextTrack = vjs.Component.extend({
|
|
7216
7292
|
this.activeCues_ = [];
|
7217
7293
|
this.readyState_ = 0;
|
7218
7294
|
this.mode_ = 0;
|
7219
|
-
|
7220
|
-
this.player_.on('fullscreenchange', vjs.bind(this, this.adjustFontSize));
|
7221
7295
|
}
|
7222
7296
|
});
|
7223
7297
|
|
@@ -7375,22 +7449,6 @@ vjs.TextTrack.prototype.mode = function(){
|
|
7375
7449
|
return this.mode_;
|
7376
7450
|
};
|
7377
7451
|
|
7378
|
-
/**
|
7379
|
-
* Change the font size of the text track to make it larger when playing in fullscreen mode
|
7380
|
-
* and restore it to its normal size when not in fullscreen mode.
|
7381
|
-
*/
|
7382
|
-
vjs.TextTrack.prototype.adjustFontSize = function(){
|
7383
|
-
if (this.player_.isFullscreen()) {
|
7384
|
-
// Scale the font by the same factor as increasing the video width to the full screen window width.
|
7385
|
-
// Additionally, multiply that factor by 1.4, which is the default font size for
|
7386
|
-
// the caption track (from the CSS)
|
7387
|
-
this.el_.style.fontSize = screen.width / this.player_.width() * 1.4 * 100 + '%';
|
7388
|
-
} else {
|
7389
|
-
// Change the font size of the text track back to its original non-fullscreen size
|
7390
|
-
this.el_.style.fontSize = '';
|
7391
|
-
}
|
7392
|
-
};
|
7393
|
-
|
7394
7452
|
/**
|
7395
7453
|
* Create basic div to hold cue text
|
7396
7454
|
* @return {Element}
|
@@ -8185,33 +8243,48 @@ if (typeof window.JSON !== 'undefined' && window.JSON.parse === 'function') {
|
|
8185
8243
|
|
8186
8244
|
// Automatically set up any tags that have a data-setup attribute
|
8187
8245
|
vjs.autoSetup = function(){
|
8188
|
-
var options,
|
8189
|
-
|
8246
|
+
var options, mediaEl, player, i, e;
|
8247
|
+
|
8248
|
+
// One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*
|
8249
|
+
// var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));
|
8250
|
+
// var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));
|
8251
|
+
// var mediaEls = vids.concat(audios);
|
8252
|
+
|
8253
|
+
// Because IE8 doesn't support calling slice on a node list, we need to loop through each list of elements
|
8254
|
+
// to build up a new, combined list of elements.
|
8255
|
+
var vids = document.getElementsByTagName('video');
|
8256
|
+
var audios = document.getElementsByTagName('audio');
|
8257
|
+
var mediaEls = [];
|
8258
|
+
if (vids && vids.length > 0) {
|
8259
|
+
for(i=0, e=vids.length; i<e; i++) {
|
8260
|
+
mediaEls.push(vids[i]);
|
8261
|
+
}
|
8262
|
+
}
|
8263
|
+
if (audios && audios.length > 0) {
|
8264
|
+
for(i=0, e=audios.length; i<e; i++) {
|
8265
|
+
mediaEls.push(audios[i]);
|
8266
|
+
}
|
8267
|
+
}
|
8190
8268
|
|
8191
8269
|
// Check if any media elements exist
|
8192
|
-
if (
|
8270
|
+
if (mediaEls && mediaEls.length > 0) {
|
8193
8271
|
|
8194
|
-
for (
|
8195
|
-
|
8272
|
+
for (i=0,e=mediaEls.length; i<e; i++) {
|
8273
|
+
mediaEl = mediaEls[i];
|
8196
8274
|
|
8197
8275
|
// Check if element exists, has getAttribute func.
|
8198
8276
|
// IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.
|
8199
|
-
if (
|
8277
|
+
if (mediaEl && mediaEl.getAttribute) {
|
8200
8278
|
|
8201
8279
|
// Make sure this player hasn't already been set up.
|
8202
|
-
if (
|
8203
|
-
options =
|
8280
|
+
if (mediaEl['player'] === undefined) {
|
8281
|
+
options = mediaEl.getAttribute('data-setup');
|
8204
8282
|
|
8205
8283
|
// Check if data-setup attr exists.
|
8206
8284
|
// We only auto-setup if they've added the data-setup attr.
|
8207
8285
|
if (options !== null) {
|
8208
|
-
|
8209
|
-
// Parse options JSON
|
8210
|
-
// If empty string, make it a parsable json object.
|
8211
|
-
options = vjs.JSON.parse(options || '{}');
|
8212
|
-
|
8213
8286
|
// Create new video.js instance.
|
8214
|
-
player = videojs(
|
8287
|
+
player = videojs(mediaEl);
|
8215
8288
|
}
|
8216
8289
|
}
|
8217
8290
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*!
|
2
2
|
Video.js Default Styles (http://videojs.com)
|
3
|
-
Version 4.
|
3
|
+
Version 4.9.0
|
4
4
|
Create your own skin at http://designer.videojs.com
|
5
5
|
*/
|
6
6
|
/* SKIN
|
@@ -123,6 +123,11 @@ The default control bar that is a container for most of the controls.
|
|
123
123
|
.vjs-default-skin.vjs-error .vjs-control-bar {
|
124
124
|
display: none;
|
125
125
|
}
|
126
|
+
/* Don't hide the control bar if it's audio */
|
127
|
+
.vjs-audio.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
|
128
|
+
opacity: 1;
|
129
|
+
visibility: visible;
|
130
|
+
}
|
126
131
|
/* IE8 is flakey with fonts, and you have to change the actual content to force
|
127
132
|
fonts to show/hide properly.
|
128
133
|
- "\9" IE8 hack didn't work for this
|
@@ -144,7 +149,7 @@ fonts to show/hide properly.
|
|
144
149
|
height: 3.0em;
|
145
150
|
width: 4em;
|
146
151
|
}
|
147
|
-
/*
|
152
|
+
/* Font button icons */
|
148
153
|
.vjs-default-skin .vjs-control:before {
|
149
154
|
font-family: VideoJS;
|
150
155
|
font-size: 1.5em;
|
@@ -244,9 +249,6 @@ fonts to show/hide properly.
|
|
244
249
|
height: 0.6em;
|
245
250
|
margin: 1.1em auto 0;
|
246
251
|
}
|
247
|
-
.vjs-default-skin .vjs-volume-menu-button .vjs-menu-content {
|
248
|
-
height: 2.9em;
|
249
|
-
}
|
250
252
|
.vjs-default-skin .vjs-volume-level {
|
251
253
|
position: absolute;
|
252
254
|
top: 0;
|
@@ -273,9 +275,31 @@ fonts to show/hide properly.
|
|
273
275
|
width: 1em;
|
274
276
|
height: 1em;
|
275
277
|
}
|
278
|
+
/* The volume menu button is like menu buttons (captions/subtitles) but works
|
279
|
+
a little differently. It needs to be possible to tab to the volume slider
|
280
|
+
without hitting space bar on the menu button. To do this we're not using
|
281
|
+
display:none to hide the slider menu by default, and instead setting the
|
282
|
+
width and height to zero. */
|
283
|
+
.vjs-default-skin .vjs-volume-menu-button .vjs-menu {
|
284
|
+
display: block;
|
285
|
+
width: 0;
|
286
|
+
height: 0;
|
287
|
+
border-top-color: transparent;
|
288
|
+
}
|
276
289
|
.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content {
|
277
|
-
|
278
|
-
|
290
|
+
height: 0;
|
291
|
+
width: 0;
|
292
|
+
}
|
293
|
+
.vjs-default-skin .vjs-volume-menu-button:hover .vjs-menu,
|
294
|
+
.vjs-default-skin .vjs-volume-menu-button .vjs-menu.vjs-lock-showing {
|
295
|
+
border-top-color: rgba(7, 40, 50, 0.5);
|
296
|
+
/* Same as ul background */
|
297
|
+
|
298
|
+
}
|
299
|
+
.vjs-default-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-menu-content,
|
300
|
+
.vjs-default-skin .vjs-volume-menu-button .vjs-menu.vjs-lock-showing .vjs-menu-content {
|
301
|
+
height: 2.9em;
|
302
|
+
width: 10em;
|
279
303
|
}
|
280
304
|
/* Progress
|
281
305
|
--------------------------------------------------------------------------------
|
@@ -686,7 +710,8 @@ easily in the skin designer. http://designer.videojs.com/
|
|
686
710
|
-moz-box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
|
687
711
|
box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
|
688
712
|
}
|
689
|
-
.vjs-default-skin .vjs-menu-button:hover .vjs-menu
|
713
|
+
.vjs-default-skin .vjs-menu-button:hover .vjs-control-content .vjs-menu,
|
714
|
+
.vjs-default-skin .vjs-control-content .vjs-menu.vjs-lock-showing {
|
690
715
|
display: block;
|
691
716
|
}
|
692
717
|
.vjs-default-skin .vjs-menu-button ul li {
|
@@ -893,6 +918,10 @@ body.vjs-full-window {
|
|
893
918
|
.vjs-tt-cue {
|
894
919
|
display: block;
|
895
920
|
}
|
921
|
+
/* Increase font-size when fullscreen */
|
922
|
+
.video-js.vjs-fullscreen .vjs-text-track {
|
923
|
+
font-size: 3em;
|
924
|
+
}
|
896
925
|
/* Hide disabled or unsupported controls */
|
897
926
|
.vjs-default-skin .vjs-hidden {
|
898
927
|
display: none;
|