mediaelement_rails 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +1 -1
- data/app/assets/images/mediaelement_rails/bigplay.fw.png +0 -0
- data/app/assets/images/mediaelement_rails/bigplay.svg +14 -1
- data/app/assets/images/mediaelement_rails/controls.fw.png +0 -0
- data/app/assets/images/mediaelement_rails/skipback.png +0 -0
- data/app/assets/javascripts/mediaelement_rails/mediaelement.js +84 -99
- data/app/assets/javascripts/mediaelement_rails/mediaelementplayer.js +661 -286
- data/app/assets/plugins/mediaelement_rails/flashmediaelement-cdn.swf +0 -0
- data/app/assets/plugins/mediaelement_rails/flashmediaelement.swf +0 -0
- data/app/assets/plugins/mediaelement_rails/silverlightmediaelement.xap +0 -0
- data/app/assets/stylesheets/mediaelement_rails/mediaelementplayer.css.erb +143 -32
- data/lib/mediaelement_rails/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d8652013a3c249f1593fb65ab96035cfceb3e54
|
4
|
+
data.tar.gz: 0bf5e23f187444085871307754b558c73cac7350
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54839803d65a5e955b1964e0289c07d8a080400a088d103cae7a952ece979e94875bcfea9834768f8f2f5f16882b675bb48188f3d9af8bc36422d978b5ff91c3
|
7
|
+
data.tar.gz: 36f1ea8770f9d9adeb2a52a1292a837179dbdcea1623f5b84c56aa4cc56f523192b6023d0f7bd079dc19f04c5402edea0ad1073fb63723e666ae6563000dab40
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# MediaelementRails #
|
2
2
|
|
3
|
-
This neat project brings the cool [MediaElement.js](http://mediaelementjs.com/) 2.
|
3
|
+
This neat project brings the cool [MediaElement.js](http://mediaelementjs.com/) 2.16.4 (HTML5/Flash/Silverlight video player) to the Rails asset pipeline. __*NOTE:*__ This gem requires jquery to be included, which shouldn't be an issue.
|
4
4
|
|
5
5
|
## All you have to do is: ##
|
6
6
|
|
Binary file
|
@@ -1 +1,14 @@
|
|
1
|
-
<?xml version="1.0" standalone="no"?>
|
1
|
+
<?xml version="1.0" standalone="no"?>
|
2
|
+
<svg id="bigplay" viewBox="0 0 100 200" style="background-color:#ffffff00" version="1.1"
|
3
|
+
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
|
4
|
+
x="0px" y="0px" width="100px" height="200px"
|
5
|
+
>
|
6
|
+
<g id="dark">
|
7
|
+
<path id="Polygon" d="M 72.5 49.5 L 38.75 68.9856 L 38.75 30.0144 L 72.5 49.5 Z" fill="#ffffff" opacity="0.75" />
|
8
|
+
<path id="Ellipse" d="M 13 50.5 C 13 29.7891 29.7891 13 50.5 13 C 71.2109 13 88 29.7891 88 50.5 C 88 71.2109 71.2109 88 50.5 88 C 29.7891 88 13 71.2109 13 50.5 Z" stroke="#ffffff" stroke-width="5" fill="none" opacity="0.75"/>
|
9
|
+
</g>
|
10
|
+
<g id="light">
|
11
|
+
<path id="Polygon2" d="M 72.5 149.5 L 38.75 168.9856 L 38.75 130.0144 L 72.5 149.5 Z" fill="#ffffff" opacity="1.0" />
|
12
|
+
<path id="Ellipse2" d="M 13 150.5 C 13 129.7891 29.7891 113 50.5 113 C 71.2109 113 88 129.7891 88 150.5 C 88 171.211 71.2109 188 50.5 188 C 29.7891 188 13 171.211 13 150.5 Z" stroke="#ffffff" stroke-width="5" fill="none" opacity="1.0"/>
|
13
|
+
</g>
|
14
|
+
</svg>
|
Binary file
|
Binary file
|
@@ -1,21 +1,22 @@
|
|
1
1
|
/*!
|
2
|
-
*
|
3
|
-
*
|
4
|
-
*
|
5
|
-
*
|
6
|
-
*
|
7
|
-
*
|
8
|
-
*
|
9
|
-
*
|
10
|
-
*
|
11
|
-
*
|
12
|
-
*
|
13
|
-
|
2
|
+
*
|
3
|
+
* MediaElement.js
|
4
|
+
* HTML5 <video> and <audio> shim and player
|
5
|
+
* http://mediaelementjs.com/
|
6
|
+
*
|
7
|
+
* Creates a JavaScript object that mimics HTML5 MediaElement API
|
8
|
+
* for browsers that don't understand HTML5 or can't play the provided codec
|
9
|
+
* Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3
|
10
|
+
*
|
11
|
+
* Copyright 2010-2014, John Dyer (http://j.hn)
|
12
|
+
* License: MIT
|
13
|
+
*
|
14
|
+
*/
|
14
15
|
// Namespace
|
15
16
|
var mejs = mejs || {};
|
16
17
|
|
17
18
|
// version number
|
18
|
-
mejs.version = '2.
|
19
|
+
mejs.version = '2.16.4';
|
19
20
|
|
20
21
|
|
21
22
|
// player number (for missing, same id attr)
|
@@ -27,7 +28,7 @@ mejs.plugins = {
|
|
27
28
|
{version: [3,0], types: ['video/mp4','video/m4v','video/mov','video/wmv','audio/wma','audio/m4a','audio/mp3','audio/wav','audio/mpeg']}
|
28
29
|
],
|
29
30
|
flash: [
|
30
|
-
{version: [9,0,124], types: ['video/mp4','video/m4v','video/mov','video/flv','video/rtmp','video/x-flv','audio/flv','audio/x-flv','audio/mp3','audio/m4a','audio/mpeg', 'video/youtube', 'video/x-youtube']}
|
31
|
+
{version: [9,0,124], types: ['video/mp4','video/m4v','video/mov','video/flv','video/rtmp','video/x-flv','audio/flv','audio/x-flv','audio/mp3','audio/m4a','audio/mpeg', 'video/youtube', 'video/x-youtube', 'application/x-mpegURL']}
|
31
32
|
//,{version: [12,0], types: ['video/webm']} // for future reference (hopefully!)
|
32
33
|
],
|
33
34
|
youtube: [
|
@@ -320,6 +321,7 @@ mejs.MediaFeatures = {
|
|
320
321
|
t.isBustedNativeHTTPS = (location.protocol === 'https:' && (ua.match(/android [12]\./) !== null || ua.match(/macintosh.* version.* safari/) !== null));
|
321
322
|
t.isIE = (nav.appName.toLowerCase().indexOf("microsoft") != -1 || nav.appName.toLowerCase().match(/trident/gi) !== null);
|
322
323
|
t.isChrome = (ua.match(/chrome/gi) !== null);
|
324
|
+
t.isChromium = (ua.match(/chromium/gi) !== null);
|
323
325
|
t.isFirefox = (ua.match(/firefox/gi) !== null);
|
324
326
|
t.isWebkit = (ua.match(/webkit/gi) !== null);
|
325
327
|
t.isGecko = (ua.match(/gecko/gi) !== null) && !t.isWebkit && !t.isIE;
|
@@ -385,13 +387,13 @@ mejs.MediaFeatures = {
|
|
385
387
|
}
|
386
388
|
|
387
389
|
t.isFullScreen = function() {
|
388
|
-
if (
|
390
|
+
if (t.hasMozNativeFullScreen) {
|
389
391
|
return d.mozFullScreen;
|
390
392
|
|
391
|
-
} else if (
|
393
|
+
} else if (t.hasWebkitNativeFullScreen) {
|
392
394
|
return d.webkitIsFullScreen;
|
393
395
|
|
394
|
-
} else if (
|
396
|
+
} else if (t.hasMsNativeFullScreen) {
|
395
397
|
return d.msFullscreenElement !== null;
|
396
398
|
}
|
397
399
|
}
|
@@ -651,7 +653,7 @@ mejs.PluginMediaElement.prototype = {
|
|
651
653
|
setVolume: function (volume) {
|
652
654
|
if (this.pluginApi != null) {
|
653
655
|
// same on YouTube and MEjs
|
654
|
-
if (this.pluginType == 'youtube'
|
656
|
+
if (this.pluginType == 'youtube') {
|
655
657
|
this.pluginApi.setVolume(volume * 100);
|
656
658
|
} else {
|
657
659
|
this.pluginApi.setVolume(volume);
|
@@ -661,7 +663,7 @@ mejs.PluginMediaElement.prototype = {
|
|
661
663
|
},
|
662
664
|
setMuted: function (muted) {
|
663
665
|
if (this.pluginApi != null) {
|
664
|
-
if (this.pluginType == 'youtube'
|
666
|
+
if (this.pluginType == 'youtube') {
|
665
667
|
if (muted) {
|
666
668
|
this.pluginApi.mute();
|
667
669
|
} else {
|
@@ -680,7 +682,7 @@ mejs.PluginMediaElement.prototype = {
|
|
680
682
|
setVideoSize: function (width, height) {
|
681
683
|
|
682
684
|
//if (this.pluginType == 'flash' || this.pluginType == 'silverlight') {
|
683
|
-
if ( this.pluginElement.style) {
|
685
|
+
if (this.pluginElement && this.pluginElement.style) {
|
684
686
|
this.pluginElement.style.width = width + 'px';
|
685
687
|
this.pluginElement.style.height = height + 'px';
|
686
688
|
}
|
@@ -735,7 +737,7 @@ mejs.PluginMediaElement.prototype = {
|
|
735
737
|
if (callbacks) {
|
736
738
|
args = Array.prototype.slice.call(arguments, 1);
|
737
739
|
for (i = 0; i < callbacks.length; i++) {
|
738
|
-
callbacks[i].apply(
|
740
|
+
callbacks[i].apply(this, args);
|
739
741
|
}
|
740
742
|
}
|
741
743
|
},
|
@@ -1032,6 +1034,12 @@ mejs.HtmlMediaElementShim = {
|
|
1032
1034
|
};
|
1033
1035
|
}
|
1034
1036
|
|
1037
|
+
// special case for Chromium to specify natively supported video codecs (i.e. WebM and Theora)
|
1038
|
+
if (mejs.MediaFeatures.isChromium) {
|
1039
|
+
htmlMediaElement.canPlayType = function(type) {
|
1040
|
+
return (type.match(/video\/(webm|ogv|ogg)/gi) !== null) ? 'maybe' : '';
|
1041
|
+
};
|
1042
|
+
}
|
1035
1043
|
|
1036
1044
|
// test for native playback first
|
1037
1045
|
if (supportsMediaTag && (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'native') && !(mejs.MediaFeatures.isBustedNativeHTTPS && options.httpsBasicAuthSite === true)) {
|
@@ -1049,7 +1057,7 @@ mejs.HtmlMediaElementShim = {
|
|
1049
1057
|
|
1050
1058
|
for (i=0; i<mediaFiles.length; i++) {
|
1051
1059
|
// normal check
|
1052
|
-
if (htmlMediaElement.canPlayType(mediaFiles[i].type).replace(/no/, '') !== ''
|
1060
|
+
if (mediaFiles[i].type == "video/m3u8" || htmlMediaElement.canPlayType(mediaFiles[i].type).replace(/no/, '') !== ''
|
1053
1061
|
// special case for Mac/Safari 5.0.3 which answers '' to canPlayType('audio/mp3') but 'maybe' to canPlayType('audio/mpeg')
|
1054
1062
|
|| htmlMediaElement.canPlayType(mediaFiles[i].type.replace(/mp3/,'mpeg')).replace(/no/, '') !== ''
|
1055
1063
|
// special case for m4a supported by detecting mp4 support
|
@@ -1146,7 +1154,7 @@ mejs.HtmlMediaElementShim = {
|
|
1146
1154
|
getTypeFromFile: function(url) {
|
1147
1155
|
url = url.split('?')[0];
|
1148
1156
|
var ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase();
|
1149
|
-
return (/(mp4|m4v|ogg|ogv|webm|webmv|flv|wmv|mpeg|mov)/gi.test(ext) ? 'video' : 'audio') + '/' + this.getTypeFromExtension(ext);
|
1157
|
+
return (/(mp4|m4v|ogg|ogv|m3u8|webm|webmv|flv|wmv|mpeg|mov)/gi.test(ext) ? 'video' : 'audio') + '/' + this.getTypeFromExtension(ext);
|
1150
1158
|
},
|
1151
1159
|
|
1152
1160
|
getTypeFromExtension: function(ext) {
|
@@ -1260,6 +1268,8 @@ mejs.HtmlMediaElementShim = {
|
|
1260
1268
|
// flash/silverlight vars
|
1261
1269
|
initVars = [
|
1262
1270
|
'id=' + pluginid,
|
1271
|
+
'jsinitfunction=' + "mejs.MediaPluginBridge.initPlugin",
|
1272
|
+
'jscallbackfunction=' + "mejs.MediaPluginBridge.fireEvent",
|
1263
1273
|
'isvideo=' + ((playback.isVideo) ? "true" : "false"),
|
1264
1274
|
'autoplay=' + ((autoplay) ? "true" : "false"),
|
1265
1275
|
'preload=' + preload,
|
@@ -1268,7 +1278,7 @@ mejs.HtmlMediaElementShim = {
|
|
1268
1278
|
'timerrate=' + options.timerRate,
|
1269
1279
|
'flashstreamer=' + options.flashStreamer,
|
1270
1280
|
'height=' + height,
|
1271
|
-
|
1281
|
+
'pseudostreamstart=' + options.pseudoStreamingStartQueryParam];
|
1272
1282
|
|
1273
1283
|
if (playback.url !== null) {
|
1274
1284
|
if (playback.method == 'flash') {
|
@@ -1382,19 +1392,37 @@ mejs.HtmlMediaElementShim = {
|
|
1382
1392
|
var player_id = pluginid + "_player";
|
1383
1393
|
pluginMediaElement.vimeoid = playback.url.substr(playback.url.lastIndexOf('/')+1);
|
1384
1394
|
|
1385
|
-
container.innerHTML ='<iframe src="//player.vimeo.com/video/' + pluginMediaElement.vimeoid + '?api=1&portrait=0&byline=0&title=0&player_id=' + player_id + '" width="' + width +'" height="' + height +'" frameborder="0" class="mejs-shim" id="' + player_id + '"></iframe>';
|
1395
|
+
container.innerHTML ='<iframe src="//player.vimeo.com/video/' + pluginMediaElement.vimeoid + '?api=1&portrait=0&byline=0&title=0&player_id=' + player_id + '" width="' + width +'" height="' + height +'" frameborder="0" class="mejs-shim" id="' + player_id + '" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
|
1386
1396
|
if (typeof($f) == 'function') { // froogaloop available
|
1387
1397
|
var player = $f(container.childNodes[0]);
|
1398
|
+
|
1388
1399
|
player.addEvent('ready', function() {
|
1400
|
+
|
1389
1401
|
player.playVideo = function() {
|
1390
|
-
player.api('play');
|
1391
|
-
}
|
1402
|
+
player.api( 'play' );
|
1403
|
+
}
|
1404
|
+
player.stopVideo = function() {
|
1405
|
+
player.api( 'unload' );
|
1406
|
+
}
|
1392
1407
|
player.pauseVideo = function() {
|
1393
|
-
player.api('pause');
|
1394
|
-
}
|
1395
|
-
|
1396
|
-
|
1397
|
-
|
1408
|
+
player.api( 'pause' );
|
1409
|
+
}
|
1410
|
+
player.seekTo = function( seconds ) {
|
1411
|
+
player.api( 'seekTo', seconds );
|
1412
|
+
}
|
1413
|
+
player.setVolume = function( volume ) {
|
1414
|
+
player.api( 'setVolume', volume );
|
1415
|
+
}
|
1416
|
+
player.setMuted = function( muted ) {
|
1417
|
+
if( muted ) {
|
1418
|
+
player.lastVolume = player.api( 'getVolume' );
|
1419
|
+
player.api( 'setVolume', 0 );
|
1420
|
+
} else {
|
1421
|
+
player.api( 'setVolume', player.lastVolume );
|
1422
|
+
delete player.lastVolume;
|
1423
|
+
}
|
1424
|
+
}
|
1425
|
+
|
1398
1426
|
function createEvent(player, pluginMediaElement, eventName, e) {
|
1399
1427
|
var obj = {
|
1400
1428
|
type: eventName,
|
@@ -1406,10 +1434,12 @@ mejs.HtmlMediaElementShim = {
|
|
1406
1434
|
}
|
1407
1435
|
pluginMediaElement.dispatchEvent(obj.type, obj);
|
1408
1436
|
}
|
1437
|
+
|
1409
1438
|
player.addEvent('play', function() {
|
1410
1439
|
createEvent(player, pluginMediaElement, 'play');
|
1411
1440
|
createEvent(player, pluginMediaElement, 'playing');
|
1412
1441
|
});
|
1442
|
+
|
1413
1443
|
player.addEvent('pause', function() {
|
1414
1444
|
createEvent(player, pluginMediaElement, 'pause');
|
1415
1445
|
});
|
@@ -1417,14 +1447,16 @@ mejs.HtmlMediaElementShim = {
|
|
1417
1447
|
player.addEvent('finish', function() {
|
1418
1448
|
createEvent(player, pluginMediaElement, 'ended');
|
1419
1449
|
});
|
1450
|
+
|
1420
1451
|
player.addEvent('playProgress', function(e) {
|
1421
1452
|
createEvent(player, pluginMediaElement, 'timeupdate', e);
|
1422
1453
|
});
|
1454
|
+
|
1455
|
+
pluginMediaElement.pluginElement = container;
|
1423
1456
|
pluginMediaElement.pluginApi = player;
|
1424
1457
|
|
1425
1458
|
// init mejs
|
1426
1459
|
mejs.MediaPluginBridge.initPlugin(pluginid);
|
1427
|
-
|
1428
1460
|
});
|
1429
1461
|
}
|
1430
1462
|
else {
|
@@ -1668,6 +1700,8 @@ mejs.YouTubeApi = {
|
|
1668
1700
|
setInterval(function() {
|
1669
1701
|
mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'timeupdate');
|
1670
1702
|
}, 250);
|
1703
|
+
|
1704
|
+
mejs.YouTubeApi.createEvent(player, pluginMediaElement, 'canplay');
|
1671
1705
|
},
|
1672
1706
|
|
1673
1707
|
handleStateChange: function(youTubeState, player, pluginMediaElement) {
|
@@ -1717,11 +1751,11 @@ function onYouTubePlayerReady(id) {
|
|
1717
1751
|
window.mejs = mejs;
|
1718
1752
|
window.MediaElement = mejs.MediaElement;
|
1719
1753
|
|
1720
|
-
|
1754
|
+
/*
|
1721
1755
|
* Adds Internationalization and localization to mediaelement.
|
1722
1756
|
*
|
1723
|
-
* This file does not contain translations, you have to add
|
1724
|
-
* The schema is always the same: me-i18n-locale-[
|
1757
|
+
* This file does not contain translations, you have to add them manually.
|
1758
|
+
* The schema is always the same: me-i18n-locale-[IETF-language-tag].js
|
1725
1759
|
*
|
1726
1760
|
* Examples are provided both for german and chinese translation.
|
1727
1761
|
*
|
@@ -1730,7 +1764,8 @@ window.MediaElement = mejs.MediaElement;
|
|
1730
1764
|
* http://en.wikipedia.org/wiki/Internationalization_and_localization
|
1731
1765
|
*
|
1732
1766
|
* What langcode should i use?
|
1733
|
-
* http://en.wikipedia.org/wiki/
|
1767
|
+
* http://en.wikipedia.org/wiki/IETF_language_tag
|
1768
|
+
* https://tools.ietf.org/html/rfc5646
|
1734
1769
|
*
|
1735
1770
|
*
|
1736
1771
|
* License?
|
@@ -1756,11 +1791,14 @@ window.MediaElement = mejs.MediaElement;
|
|
1756
1791
|
*/
|
1757
1792
|
;(function(context, exports, undefined) {
|
1758
1793
|
"use strict";
|
1794
|
+
|
1759
1795
|
var i18n = {
|
1760
1796
|
"locale": {
|
1761
|
-
|
1762
|
-
"
|
1797
|
+
// Ensure previous values aren't overwritten.
|
1798
|
+
"language" : (exports.i18n && exports.i18n.locale.language) || '',
|
1799
|
+
"strings" : (exports.i18n && exports.i18n.locale.strings) || {}
|
1763
1800
|
},
|
1801
|
+
"ietf_lang_regex" : /^(x\-)?[a-z]{2,}(\-\w{2,})?(\-\w{2,})?$/,
|
1764
1802
|
"methods" : {}
|
1765
1803
|
};
|
1766
1804
|
// start i18n
|
@@ -1768,11 +1806,16 @@ window.MediaElement = mejs.MediaElement;
|
|
1768
1806
|
|
1769
1807
|
/**
|
1770
1808
|
* Get language, fallback to browser's language if empty
|
1809
|
+
*
|
1810
|
+
* IETF: RFC 5646, https://tools.ietf.org/html/rfc5646
|
1811
|
+
* Examples: en, zh-CN, cmn-Hans-CN, sr-Latn-RS, es-419, x-private
|
1771
1812
|
*/
|
1772
1813
|
i18n.getLanguage = function () {
|
1773
1814
|
var language = i18n.locale.language || window.navigator.userLanguage || window.navigator.language;
|
1774
|
-
|
1775
|
-
|
1815
|
+
return i18n.ietf_lang_regex.exec(language) ? language : null;
|
1816
|
+
|
1817
|
+
//(WAS: convert to iso 639-1 (2-letters, lower case))
|
1818
|
+
//return language.substr(0, 2).toLowerCase();
|
1776
1819
|
};
|
1777
1820
|
|
1778
1821
|
// i18n fixes for compatibility with WordPress
|
@@ -1870,61 +1913,3 @@ window.MediaElement = mejs.MediaElement;
|
|
1870
1913
|
}
|
1871
1914
|
|
1872
1915
|
}(mejs.i18n.locale.strings));
|
1873
|
-
|
1874
|
-
/*!
|
1875
|
-
* This is a i18n.locale language object.
|
1876
|
-
*
|
1877
|
-
* German translation by Tim Latz, latz.tim@gmail.com
|
1878
|
-
*
|
1879
|
-
* @author
|
1880
|
-
* Tim Latz (latz.tim@gmail.com)
|
1881
|
-
*
|
1882
|
-
* @see
|
1883
|
-
* me-i18n.js
|
1884
|
-
*
|
1885
|
-
* @params
|
1886
|
-
* - exports - CommonJS, window ..
|
1887
|
-
*/
|
1888
|
-
;(function(exports, undefined) {
|
1889
|
-
|
1890
|
-
"use strict";
|
1891
|
-
|
1892
|
-
if (typeof exports.de === 'undefined') {
|
1893
|
-
exports.de = {
|
1894
|
-
"Fullscreen" : "Vollbild",
|
1895
|
-
"Go Fullscreen" : "Vollbild an",
|
1896
|
-
"Turn off Fullscreen" : "Vollbild aus",
|
1897
|
-
"Close" : "Schließen"
|
1898
|
-
};
|
1899
|
-
}
|
1900
|
-
|
1901
|
-
}(mejs.i18n.locale.strings));
|
1902
|
-
/*!
|
1903
|
-
* This is a i18n.locale language object.
|
1904
|
-
*
|
1905
|
-
* Traditional chinese translation by Tim Latz, latz.tim@gmail.com
|
1906
|
-
*
|
1907
|
-
* @author
|
1908
|
-
* Tim Latz (latz.tim@gmail.com)
|
1909
|
-
*
|
1910
|
-
* @see
|
1911
|
-
* me-i18n.js
|
1912
|
-
*
|
1913
|
-
* @params
|
1914
|
-
* - exports - CommonJS, window ..
|
1915
|
-
*/
|
1916
|
-
;(function(exports, undefined) {
|
1917
|
-
|
1918
|
-
"use strict";
|
1919
|
-
|
1920
|
-
if (typeof exports.zh === 'undefined') {
|
1921
|
-
exports.zh = {
|
1922
|
-
"Fullscreen" : "全螢幕",
|
1923
|
-
"Go Fullscreen" : "全屏模式",
|
1924
|
-
"Turn off Fullscreen" : "退出全屏模式",
|
1925
|
-
"Close" : "關閉"
|
1926
|
-
};
|
1927
|
-
}
|
1928
|
-
|
1929
|
-
}(mejs.i18n.locale.strings));
|
1930
|
-
|
@@ -1,4 +1,5 @@
|
|
1
1
|
/*!
|
2
|
+
*
|
2
3
|
* MediaElementPlayer
|
3
4
|
* http://mediaelementjs.com/
|
4
5
|
*
|
@@ -44,6 +45,9 @@ if (typeof jQuery != 'undefined') {
|
|
44
45
|
return (media.duration * 0.05);
|
45
46
|
},
|
46
47
|
|
48
|
+
// set dimensions via JS instead of CSS
|
49
|
+
setDimensions: true,
|
50
|
+
|
47
51
|
// width of audio player
|
48
52
|
audioWidth: -1,
|
49
53
|
// height of audio player
|
@@ -70,8 +74,8 @@ if (typeof jQuery != 'undefined') {
|
|
70
74
|
alwaysShowControls: false,
|
71
75
|
// Display the video control
|
72
76
|
hideVideoControlsOnLoad: false,
|
73
|
-
|
74
|
-
|
77
|
+
// Enable click video element to toggle play/pause
|
78
|
+
clickToPlayPause: true,
|
75
79
|
// force iPad's native controls
|
76
80
|
iPadUseNativeControls: false,
|
77
81
|
// force iPhone's native controls
|
@@ -107,6 +111,12 @@ if (typeof jQuery != 'undefined') {
|
|
107
111
|
{
|
108
112
|
keys: [38], // UP
|
109
113
|
action: function(player, media) {
|
114
|
+
player.container.find('.mejs-volume-slider').css('display','block');
|
115
|
+
if (player.isVideo) {
|
116
|
+
player.showControls();
|
117
|
+
player.startControlsTimer();
|
118
|
+
}
|
119
|
+
|
110
120
|
var newVolume = Math.min(media.volume + 0.1, 1);
|
111
121
|
media.setVolume(newVolume);
|
112
122
|
}
|
@@ -114,6 +124,12 @@ if (typeof jQuery != 'undefined') {
|
|
114
124
|
{
|
115
125
|
keys: [40], // DOWN
|
116
126
|
action: function(player, media) {
|
127
|
+
player.container.find('.mejs-volume-slider').css('display','block');
|
128
|
+
if (player.isVideo) {
|
129
|
+
player.showControls();
|
130
|
+
player.startControlsTimer();
|
131
|
+
}
|
132
|
+
|
117
133
|
var newVolume = Math.max(media.volume - 0.1, 0);
|
118
134
|
media.setVolume(newVolume);
|
119
135
|
}
|
@@ -155,7 +171,7 @@ if (typeof jQuery != 'undefined') {
|
|
155
171
|
}
|
156
172
|
},
|
157
173
|
{
|
158
|
-
keys: [70], //
|
174
|
+
keys: [70], // F
|
159
175
|
action: function(player, media) {
|
160
176
|
if (typeof player.enterFullScreen != 'undefined') {
|
161
177
|
if (player.isFullScreen) {
|
@@ -165,6 +181,21 @@ if (typeof jQuery != 'undefined') {
|
|
165
181
|
}
|
166
182
|
}
|
167
183
|
}
|
184
|
+
},
|
185
|
+
{
|
186
|
+
keys: [77], // M
|
187
|
+
action: function(player, media) {
|
188
|
+
player.container.find('.mejs-volume-slider').css('display','block');
|
189
|
+
if (player.isVideo) {
|
190
|
+
player.showControls();
|
191
|
+
player.startControlsTimer();
|
192
|
+
}
|
193
|
+
if (player.media.muted) {
|
194
|
+
player.setMuted(false);
|
195
|
+
} else {
|
196
|
+
player.setMuted(true);
|
197
|
+
}
|
198
|
+
}
|
168
199
|
}
|
169
200
|
]
|
170
201
|
};
|
@@ -268,10 +299,14 @@ if (typeof jQuery != 'undefined') {
|
|
268
299
|
|
269
300
|
// remove native controls
|
270
301
|
t.$media.removeAttr('controls');
|
271
|
-
|
302
|
+
var videoPlayerTitle = t.isVideo ?
|
303
|
+
mejs.i18n.t('Video Player') : mejs.i18n.t('Audio Player');
|
304
|
+
// insert description for screen readers
|
305
|
+
$('<span class="mejs-offscreen">' + videoPlayerTitle + '</span>').insertBefore(t.$media);
|
272
306
|
// build container
|
273
307
|
t.container =
|
274
|
-
$('<div id="' + t.id + '" class="mejs-container ' + (mejs.MediaFeatures.svg ? 'svg' : 'no-svg') +
|
308
|
+
$('<div id="' + t.id + '" class="mejs-container ' + (mejs.MediaFeatures.svg ? 'svg' : 'no-svg') +
|
309
|
+
'" tabindex="0" role="application" aria-label="' + videoPlayerTitle + '">'+
|
275
310
|
'<div class="mejs-inner">'+
|
276
311
|
'<div class="mejs-mediaelement"></div>'+
|
277
312
|
'<div class="mejs-layers"></div>'+
|
@@ -280,7 +315,14 @@ if (typeof jQuery != 'undefined') {
|
|
280
315
|
'</div>' +
|
281
316
|
'</div>')
|
282
317
|
.addClass(t.$media[0].className)
|
283
|
-
.insertBefore(t.$media)
|
318
|
+
.insertBefore(t.$media)
|
319
|
+
.focus(function ( e ) {
|
320
|
+
if( !t.controlsAreVisible ) {
|
321
|
+
t.showControls(true);
|
322
|
+
var playButton = t.container.find('.mejs-playpause-button > button');
|
323
|
+
playButton.focus();
|
324
|
+
}
|
325
|
+
});
|
284
326
|
|
285
327
|
// add classes for user and content
|
286
328
|
t.container.addClass(
|
@@ -302,7 +344,7 @@ if (typeof jQuery != 'undefined') {
|
|
302
344
|
|
303
345
|
t.$media.remove();
|
304
346
|
t.$node = t.$media = $newMedia;
|
305
|
-
t.node = t.media = $newMedia[0]
|
347
|
+
t.node = t.media = $newMedia[0];
|
306
348
|
|
307
349
|
} else {
|
308
350
|
|
@@ -327,6 +369,7 @@ if (typeof jQuery != 'undefined') {
|
|
327
369
|
capsTagName = tagType.substring(0,1).toUpperCase() + tagType.substring(1);
|
328
370
|
|
329
371
|
|
372
|
+
|
330
373
|
if (t.options[tagType + 'Width'] > 0 || t.options[tagType + 'Width'].toString().indexOf('%') > -1) {
|
331
374
|
t.width = t.options[tagType + 'Width'];
|
332
375
|
} else if (t.media.style.width !== '' && t.media.style.width !== null) {
|
@@ -359,8 +402,8 @@ if (typeof jQuery != 'undefined') {
|
|
359
402
|
mejs.MediaElement(t.$media[0], meOptions);
|
360
403
|
|
361
404
|
if (typeof(t.container) != 'undefined' && t.controlsAreVisible){
|
362
|
-
|
363
|
-
|
405
|
+
// controls are shown when loaded
|
406
|
+
t.container.trigger('controlsshown');
|
364
407
|
}
|
365
408
|
},
|
366
409
|
|
@@ -376,8 +419,8 @@ if (typeof jQuery != 'undefined') {
|
|
376
419
|
t.controls
|
377
420
|
.css('visibility','visible')
|
378
421
|
.stop(true, true).fadeIn(200, function() {
|
379
|
-
|
380
|
-
|
422
|
+
t.controlsAreVisible = true;
|
423
|
+
t.container.trigger('controlsshown');
|
381
424
|
});
|
382
425
|
|
383
426
|
// any additional controls people might add and want to hide
|
@@ -408,7 +451,7 @@ if (typeof jQuery != 'undefined') {
|
|
408
451
|
|
409
452
|
doAnimation = typeof doAnimation == 'undefined' || doAnimation;
|
410
453
|
|
411
|
-
if (!t.controlsAreVisible || t.options.alwaysShowControls)
|
454
|
+
if (!t.controlsAreVisible || t.options.alwaysShowControls || t.keyboardAction)
|
412
455
|
return;
|
413
456
|
|
414
457
|
if (doAnimation) {
|
@@ -582,14 +625,14 @@ if (typeof jQuery != 'undefined') {
|
|
582
625
|
}
|
583
626
|
};
|
584
627
|
|
585
|
-
|
586
|
-
|
628
|
+
// click to play/pause
|
629
|
+
t.media.addEventListener('click', t.clickToPlayPauseCallback, false);
|
587
630
|
|
588
631
|
// show/hide controls
|
589
632
|
t.container
|
590
633
|
.bind('mouseenter mouseover', function () {
|
591
634
|
if (t.controlsEnabled) {
|
592
|
-
if (!t.options.alwaysShowControls) {
|
635
|
+
if (!t.options.alwaysShowControls ) {
|
593
636
|
t.killControlsTimer('enter');
|
594
637
|
t.showControls();
|
595
638
|
t.startControlsTimer(2500);
|
@@ -601,7 +644,6 @@ if (typeof jQuery != 'undefined') {
|
|
601
644
|
if (!t.controlsAreVisible) {
|
602
645
|
t.showControls();
|
603
646
|
}
|
604
|
-
//t.killControlsTimer('move');
|
605
647
|
if (!t.options.alwaysShowControls) {
|
606
648
|
t.startControlsTimer(2500);
|
607
649
|
}
|
@@ -663,6 +705,10 @@ if (typeof jQuery != 'undefined') {
|
|
663
705
|
if(t.options.autoRewind) {
|
664
706
|
try{
|
665
707
|
t.media.setCurrentTime(0);
|
708
|
+
// Fixing an Android stock browser bug, where "seeked" isn't fired correctly after ending the video and jumping to the beginning
|
709
|
+
window.setTimeout(function(){
|
710
|
+
$(t.container).find('.mejs-overlay-loading').parent().hide();
|
711
|
+
}, 20);
|
666
712
|
} catch (exp) {
|
667
713
|
|
668
714
|
}
|
@@ -698,6 +744,15 @@ if (typeof jQuery != 'undefined') {
|
|
698
744
|
}
|
699
745
|
}, false);
|
700
746
|
|
747
|
+
t.container.focusout(function (e) {
|
748
|
+
if( e.relatedTarget ) { //FF is working on supporting focusout https://bugzilla.mozilla.org/show_bug.cgi?id=687787
|
749
|
+
var $target = $(e.relatedTarget);
|
750
|
+
if (t.keyboardAction && $target.parents('.mejs-container').length === 0) {
|
751
|
+
t.keyboardAction = false;
|
752
|
+
t.hideControls(true);
|
753
|
+
}
|
754
|
+
}
|
755
|
+
});
|
701
756
|
|
702
757
|
// webkit has trouble doing this without a delay
|
703
758
|
setTimeout(function () {
|
@@ -717,8 +772,10 @@ if (typeof jQuery != 'undefined') {
|
|
717
772
|
t.setControlsSize();
|
718
773
|
});
|
719
774
|
|
720
|
-
//
|
721
|
-
|
775
|
+
// This is a work-around for a bug in the YouTube iFrame player, which means
|
776
|
+
// we can't use the play() API for the initial playback on iOS or Android;
|
777
|
+
// user has to start playback directly by tapping on the iFrame.
|
778
|
+
if (t.media.pluginType == 'youtube' && ( mf.isiOS || mf.isAndroid ) ) {
|
722
779
|
t.container.find('.mejs-overlay-play').hide();
|
723
780
|
}
|
724
781
|
}
|
@@ -753,6 +810,10 @@ if (typeof jQuery != 'undefined') {
|
|
753
810
|
setPlayerSize: function(width,height) {
|
754
811
|
var t = this;
|
755
812
|
|
813
|
+
if( !t.options.setDimensions ) {
|
814
|
+
return false;
|
815
|
+
}
|
816
|
+
|
756
817
|
if (typeof width != 'undefined') {
|
757
818
|
t.width = width;
|
758
819
|
}
|
@@ -762,18 +823,45 @@ if (typeof jQuery != 'undefined') {
|
|
762
823
|
}
|
763
824
|
|
764
825
|
// detect 100% mode - use currentStyle for IE since css() doesn't return percentages
|
765
|
-
|
826
|
+
if (t.height.toString().indexOf('%') > 0 || t.$node.css('max-width') === '100%' || (t.$node[0].currentStyle && t.$node[0].currentStyle.maxWidth === '100%')) {
|
766
827
|
|
767
828
|
// do we have the native dimensions yet?
|
829
|
+
var nativeWidth = (function() {
|
830
|
+
if (t.isVideo) {
|
831
|
+
if (t.media.videoWidth && t.media.videoWidth > 0) {
|
832
|
+
return t.media.videoWidth;
|
833
|
+
} else if (t.media.getAttribute('width') !== null) {
|
834
|
+
return t.media.getAttribute('width');
|
835
|
+
} else {
|
836
|
+
return t.options.defaultVideoWidth;
|
837
|
+
}
|
838
|
+
} else {
|
839
|
+
return t.options.defaultAudioWidth;
|
840
|
+
}
|
841
|
+
})();
|
842
|
+
|
843
|
+
var nativeHeight = (function() {
|
844
|
+
if (t.isVideo) {
|
845
|
+
if (t.media.videoHeight && t.media.videoHeight > 0) {
|
846
|
+
return t.media.videoHeight;
|
847
|
+
} else if (t.media.getAttribute('height') !== null) {
|
848
|
+
return t.media.getAttribute('height');
|
849
|
+
} else {
|
850
|
+
return t.options.defaultVideoHeight;
|
851
|
+
}
|
852
|
+
} else {
|
853
|
+
return t.options.defaultAudioHeight;
|
854
|
+
}
|
855
|
+
})();
|
856
|
+
|
768
857
|
var
|
769
|
-
nativeWidth = t.isVideo ? ((t.media.videoWidth && t.media.videoWidth > 0) ? t.media.videoWidth : t.options.defaultVideoWidth) : t.options.defaultAudioWidth,
|
770
|
-
nativeHeight = t.isVideo ? ((t.media.videoHeight && t.media.videoHeight > 0) ? t.media.videoHeight : t.options.defaultVideoHeight) : t.options.defaultAudioHeight,
|
771
858
|
parentWidth = t.container.parent().closest(':visible').width(),
|
859
|
+
parentHeight = t.container.parent().closest(':visible').height(),
|
772
860
|
newHeight = t.isVideo || !t.options.autosizeProgress ? parseInt(parentWidth * nativeHeight/nativeWidth, 10) : nativeHeight;
|
773
861
|
|
774
862
|
// When we use percent, the newHeight can't be calculated so we get the container height
|
775
|
-
if(isNaN(newHeight)) {
|
776
|
-
newHeight =
|
863
|
+
if (isNaN(newHeight)) {
|
864
|
+
newHeight = parentHeight;
|
777
865
|
}
|
778
866
|
|
779
867
|
if (t.container.parent()[0].tagName.toLowerCase() === 'body') { // && t.container.siblings().count == 0) {
|
@@ -781,7 +869,8 @@ if (typeof jQuery != 'undefined') {
|
|
781
869
|
newHeight = $(window).height();
|
782
870
|
}
|
783
871
|
|
784
|
-
if ( newHeight
|
872
|
+
if ( newHeight && parentWidth ) {
|
873
|
+
|
785
874
|
// set outer container size
|
786
875
|
t.container
|
787
876
|
.width(parentWidth)
|
@@ -838,7 +927,7 @@ if (typeof jQuery != 'undefined') {
|
|
838
927
|
others = rail.siblings(),
|
839
928
|
lastControl = others.last(),
|
840
929
|
lastControlPosition = null;
|
841
|
-
|
930
|
+
|
842
931
|
// skip calculation if hidden
|
843
932
|
if (!t.container.is(':visible') || !rail.length || !rail.is(':visible')) {
|
844
933
|
return;
|
@@ -849,7 +938,7 @@ if (typeof jQuery != 'undefined') {
|
|
849
938
|
if (t.options && !t.options.autosizeProgress) {
|
850
939
|
// Also, frontends devs can be more flexible
|
851
940
|
// due the opportunity of absolute positioning.
|
852
|
-
railWidth = parseInt(rail.css('width'));
|
941
|
+
railWidth = parseInt(rail.css('width'), 10);
|
853
942
|
}
|
854
943
|
|
855
944
|
// attempt to autosize
|
@@ -866,22 +955,22 @@ if (typeof jQuery != 'undefined') {
|
|
866
955
|
// fit the rail into the remaining space
|
867
956
|
railWidth = t.controls.width() - usedWidth - (rail.outerWidth(true) - rail.width());
|
868
957
|
}
|
869
|
-
|
958
|
+
|
870
959
|
// resize the rail,
|
871
960
|
// but then check if the last control (say, the fullscreen button) got pushed down
|
872
961
|
// this often happens when zoomed
|
873
|
-
do {
|
962
|
+
do {
|
874
963
|
// outer area
|
875
964
|
rail.width(railWidth);
|
876
965
|
// dark space
|
877
|
-
total.width(railWidth - (total.outerWidth(true) - total.width()));
|
878
|
-
|
966
|
+
total.width(railWidth - (total.outerWidth(true) - total.width()));
|
967
|
+
|
879
968
|
if (lastControl.css('position') != 'absolute') {
|
880
|
-
lastControlPosition = lastControl.position();
|
881
|
-
railWidth--;
|
969
|
+
lastControlPosition = lastControl.position();
|
970
|
+
railWidth--;
|
882
971
|
}
|
883
|
-
} while (lastControlPosition
|
884
|
-
|
972
|
+
} while (lastControlPosition !== null && lastControlPosition.top > 0 && railWidth > 0);
|
973
|
+
|
885
974
|
if (t.setProgressRail)
|
886
975
|
t.setProgressRail();
|
887
976
|
if (t.setCurrentRail)
|
@@ -903,7 +992,7 @@ if (typeof jQuery != 'undefined') {
|
|
903
992
|
}
|
904
993
|
|
905
994
|
// second, try the real poster
|
906
|
-
if (
|
995
|
+
if ( posterUrl ) {
|
907
996
|
t.setPoster(posterUrl);
|
908
997
|
} else {
|
909
998
|
poster.hide();
|
@@ -925,7 +1014,7 @@ if (typeof jQuery != 'undefined') {
|
|
925
1014
|
posterDiv = t.container.find('.mejs-poster'),
|
926
1015
|
posterImg = posterDiv.find('img');
|
927
1016
|
|
928
|
-
if (posterImg.length
|
1017
|
+
if (posterImg.length === 0) {
|
929
1018
|
posterImg = $('<img width="100%" height="100%" />').appendTo(posterDiv);
|
930
1019
|
}
|
931
1020
|
|
@@ -957,7 +1046,7 @@ if (typeof jQuery != 'undefined') {
|
|
957
1046
|
'<div class="mejs-overlay-button"></div>'+
|
958
1047
|
'</div>')
|
959
1048
|
.appendTo(layers)
|
960
|
-
.bind('click
|
1049
|
+
.bind('click', function() { // Removed 'touchstart' due issues on Samsung Android devices where a tap on bigPlay started and immediately stopped the video
|
961
1050
|
if (t.options.clickToPlayPause) {
|
962
1051
|
if (media.paused) {
|
963
1052
|
media.play();
|
@@ -1018,10 +1107,23 @@ if (typeof jQuery != 'undefined') {
|
|
1018
1107
|
|
1019
1108
|
loading.show();
|
1020
1109
|
controls.find('.mejs-time-buffering').show();
|
1110
|
+
// Firing the 'canplay' event after a timeout which isn't getting fired on some Android 4.1 devices (https://github.com/johndyer/mediaelement/issues/1305)
|
1111
|
+
if (mejs.MediaFeatures.isAndroid) {
|
1112
|
+
media.canplayTimeout = window.setTimeout(
|
1113
|
+
function() {
|
1114
|
+
if (document.createEvent) {
|
1115
|
+
var evt = document.createEvent('HTMLEvents');
|
1116
|
+
evt.initEvent('canplay', true, true);
|
1117
|
+
return media.dispatchEvent(evt);
|
1118
|
+
}
|
1119
|
+
}, 300
|
1120
|
+
);
|
1121
|
+
}
|
1021
1122
|
}, false);
|
1022
1123
|
media.addEventListener('canplay',function() {
|
1023
1124
|
loading.hide();
|
1024
1125
|
controls.find('.mejs-time-buffering').hide();
|
1126
|
+
clearTimeout(media.canplayTimeout); // Clear timeout inside 'loadeddata' to prevent 'canplay' to fire twice
|
1025
1127
|
}, false);
|
1026
1128
|
|
1027
1129
|
// error handling
|
@@ -1031,40 +1133,50 @@ if (typeof jQuery != 'undefined') {
|
|
1031
1133
|
error.show();
|
1032
1134
|
error.find('mejs-overlay-error').html("Error loading this resource");
|
1033
1135
|
}, false);
|
1136
|
+
|
1137
|
+
media.addEventListener('keydown', function(e) {
|
1138
|
+
t.onkeydown(player, media, e);
|
1139
|
+
}, false);
|
1034
1140
|
},
|
1035
1141
|
|
1036
1142
|
buildkeyboard: function(player, controls, layers, media) {
|
1037
1143
|
|
1038
1144
|
var t = this;
|
1039
1145
|
|
1146
|
+
t.container.keydown(function () {
|
1147
|
+
t.keyboardAction = true;
|
1148
|
+
});
|
1149
|
+
|
1040
1150
|
// listen for key presses
|
1041
1151
|
t.globalBind('keydown', function(e) {
|
1042
|
-
|
1043
|
-
if (player.hasFocus && player.options.enableKeyboard) {
|
1044
|
-
|
1045
|
-
// find a matching key
|
1046
|
-
for (var i=0, il=player.options.keyActions.length; i<il; i++) {
|
1047
|
-
var keyAction = player.options.keyActions[i];
|
1048
|
-
|
1049
|
-
for (var j=0, jl=keyAction.keys.length; j<jl; j++) {
|
1050
|
-
if (e.keyCode == keyAction.keys[j]) {
|
1051
|
-
e.preventDefault();
|
1052
|
-
keyAction.action(player, media, e.keyCode);
|
1053
|
-
return false;
|
1054
|
-
}
|
1055
|
-
}
|
1056
|
-
}
|
1057
|
-
}
|
1058
|
-
|
1059
|
-
return true;
|
1152
|
+
return t.onkeydown(player, media, e);
|
1060
1153
|
});
|
1061
1154
|
|
1155
|
+
|
1062
1156
|
// check if someone clicked outside a player region, then kill its focus
|
1063
1157
|
t.globalBind('click', function(event) {
|
1064
|
-
player.hasFocus = $(event.target).closest('.mejs-container').length
|
1158
|
+
player.hasFocus = $(event.target).closest('.mejs-container').length !== 0;
|
1065
1159
|
});
|
1066
1160
|
|
1067
1161
|
},
|
1162
|
+
onkeydown: function(player, media, e) {
|
1163
|
+
if (player.hasFocus && player.options.enableKeyboard) {
|
1164
|
+
// find a matching key
|
1165
|
+
for (var i = 0, il = player.options.keyActions.length; i < il; i++) {
|
1166
|
+
var keyAction = player.options.keyActions[i];
|
1167
|
+
|
1168
|
+
for (var j = 0, jl = keyAction.keys.length; j < jl; j++) {
|
1169
|
+
if (e.keyCode == keyAction.keys[j]) {
|
1170
|
+
if (typeof(e.preventDefault) == "function") e.preventDefault();
|
1171
|
+
keyAction.action(player, media, e.keyCode);
|
1172
|
+
return false;
|
1173
|
+
}
|
1174
|
+
}
|
1175
|
+
}
|
1176
|
+
}
|
1177
|
+
|
1178
|
+
return true;
|
1179
|
+
},
|
1068
1180
|
|
1069
1181
|
findTracks: function() {
|
1070
1182
|
var t = this,
|
@@ -1149,7 +1261,7 @@ if (typeof jQuery != 'undefined') {
|
|
1149
1261
|
// detach events from the video
|
1150
1262
|
// TODO: detach event listeners better than this;
|
1151
1263
|
// also detach ONLY the events attached by this plugin!
|
1152
|
-
t.$node.clone().
|
1264
|
+
t.$node.clone().insertBefore(t.container).show();
|
1153
1265
|
t.$node.remove();
|
1154
1266
|
} else {
|
1155
1267
|
t.$node.insertBefore(t.container);
|
@@ -1167,6 +1279,11 @@ if (typeof jQuery != 'undefined') {
|
|
1167
1279
|
}
|
1168
1280
|
t.globalUnbind();
|
1169
1281
|
delete t.node.player;
|
1282
|
+
},
|
1283
|
+
rebuildtracks: function(){
|
1284
|
+
var t = this;
|
1285
|
+
t.findTracks();
|
1286
|
+
t.buildtracks(t, t.controls, t.layers, t.media);
|
1170
1287
|
}
|
1171
1288
|
};
|
1172
1289
|
|
@@ -1207,30 +1324,31 @@ if (typeof jQuery != 'undefined') {
|
|
1207
1324
|
})();
|
1208
1325
|
|
1209
1326
|
// turn into jQuery plugin
|
1210
|
-
if (typeof
|
1211
|
-
|
1327
|
+
if (typeof $ != 'undefined') {
|
1328
|
+
$.fn.mediaelementplayer = function (options) {
|
1212
1329
|
if (options === false) {
|
1213
1330
|
this.each(function () {
|
1214
|
-
var player =
|
1331
|
+
var player = $(this).data('mediaelementplayer');
|
1215
1332
|
if (player) {
|
1216
1333
|
player.remove();
|
1217
1334
|
}
|
1218
|
-
|
1335
|
+
$(this).removeData('mediaelementplayer');
|
1219
1336
|
});
|
1220
1337
|
}
|
1221
1338
|
else {
|
1222
1339
|
this.each(function () {
|
1223
|
-
|
1340
|
+
$(this).data('mediaelementplayer', new mejs.MediaElementPlayer(this, options));
|
1224
1341
|
});
|
1225
1342
|
}
|
1226
1343
|
return this;
|
1227
1344
|
};
|
1228
|
-
}
|
1229
1345
|
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1346
|
+
|
1347
|
+
$(document).ready(function() {
|
1348
|
+
// auto enable using JSON attribute
|
1349
|
+
$('.mejs-player').mediaelementplayer();
|
1350
|
+
});
|
1351
|
+
}
|
1234
1352
|
|
1235
1353
|
// push out to window
|
1236
1354
|
window.MediaElementPlayer = mejs.MediaElementPlayer;
|
@@ -1240,7 +1358,8 @@ if (typeof jQuery != 'undefined') {
|
|
1240
1358
|
(function($) {
|
1241
1359
|
|
1242
1360
|
$.extend(mejs.MepDefaults, {
|
1243
|
-
|
1361
|
+
playText: mejs.i18n.t('Play'),
|
1362
|
+
pauseText: mejs.i18n.t('Pause')
|
1244
1363
|
});
|
1245
1364
|
|
1246
1365
|
// PLAY/pause BUTTON
|
@@ -1248,9 +1367,10 @@ if (typeof jQuery != 'undefined') {
|
|
1248
1367
|
buildplaypause: function(player, controls, layers, media) {
|
1249
1368
|
var
|
1250
1369
|
t = this,
|
1370
|
+
op = t.options,
|
1251
1371
|
play =
|
1252
1372
|
$('<div class="mejs-button mejs-playpause-button mejs-play" >' +
|
1253
|
-
'<button type="button" aria-controls="' + t.id + '" title="' +
|
1373
|
+
'<button type="button" aria-controls="' + t.id + '" title="' + op.playText + '" aria-label="' + op.playText + '"></button>' +
|
1254
1374
|
'</div>')
|
1255
1375
|
.appendTo(controls)
|
1256
1376
|
.click(function(e) {
|
@@ -1263,21 +1383,41 @@ if (typeof jQuery != 'undefined') {
|
|
1263
1383
|
}
|
1264
1384
|
|
1265
1385
|
return false;
|
1266
|
-
})
|
1386
|
+
}),
|
1387
|
+
play_btn = play.find('button');
|
1388
|
+
|
1389
|
+
|
1390
|
+
function togglePlayPause(which) {
|
1391
|
+
if ('play' === which) {
|
1392
|
+
play.removeClass('mejs-play').addClass('mejs-pause');
|
1393
|
+
play_btn.attr({
|
1394
|
+
'title': op.pauseText,
|
1395
|
+
'aria-label': op.pauseText
|
1396
|
+
});
|
1397
|
+
} else {
|
1398
|
+
play.removeClass('mejs-pause').addClass('mejs-play');
|
1399
|
+
play_btn.attr({
|
1400
|
+
'title': op.playText,
|
1401
|
+
'aria-label': op.playText
|
1402
|
+
});
|
1403
|
+
}
|
1404
|
+
};
|
1405
|
+
togglePlayPause('pse');
|
1406
|
+
|
1267
1407
|
|
1268
1408
|
media.addEventListener('play',function() {
|
1269
|
-
|
1409
|
+
togglePlayPause('play');
|
1270
1410
|
}, false);
|
1271
1411
|
media.addEventListener('playing',function() {
|
1272
|
-
|
1412
|
+
togglePlayPause('play');
|
1273
1413
|
}, false);
|
1274
1414
|
|
1275
1415
|
|
1276
1416
|
media.addEventListener('pause',function() {
|
1277
|
-
|
1417
|
+
togglePlayPause('pse');
|
1278
1418
|
}, false);
|
1279
1419
|
media.addEventListener('paused',function() {
|
1280
|
-
|
1420
|
+
togglePlayPause('pse');
|
1281
1421
|
}, false);
|
1282
1422
|
}
|
1283
1423
|
});
|
@@ -1319,24 +1459,30 @@ if (typeof jQuery != 'undefined') {
|
|
1319
1459
|
})(mejs.$);
|
1320
1460
|
|
1321
1461
|
(function($) {
|
1462
|
+
|
1463
|
+
$.extend(mejs.MepDefaults, {
|
1464
|
+
progessHelpText: mejs.i18n.t(
|
1465
|
+
'Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.')
|
1466
|
+
});
|
1467
|
+
|
1322
1468
|
// progress/loaded bar
|
1323
1469
|
$.extend(MediaElementPlayer.prototype, {
|
1324
1470
|
buildprogress: function(player, controls, layers, media) {
|
1325
1471
|
|
1326
|
-
$('<div class="mejs-time-rail">'+
|
1327
|
-
'<span
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
'</span>'+
|
1337
|
-
|
1472
|
+
$('<div class="mejs-time-rail">' +
|
1473
|
+
'<span class="mejs-time-total mejs-time-slider">' +
|
1474
|
+
//'<span class="mejs-offscreen">' + this.options.progessHelpText + '</span>' +
|
1475
|
+
'<span class="mejs-time-buffering"></span>' +
|
1476
|
+
'<span class="mejs-time-loaded"></span>' +
|
1477
|
+
'<span class="mejs-time-current"></span>' +
|
1478
|
+
'<span class="mejs-time-handle"></span>' +
|
1479
|
+
'<span class="mejs-time-float">' +
|
1480
|
+
'<span class="mejs-time-float-current">00:00</span>' +
|
1481
|
+
'<span class="mejs-time-float-corner"></span>' +
|
1482
|
+
'</span>' +
|
1483
|
+
'</div>')
|
1338
1484
|
.appendTo(controls);
|
1339
|
-
|
1485
|
+
controls.find('.mejs-time-buffering').hide();
|
1340
1486
|
|
1341
1487
|
var
|
1342
1488
|
t = this,
|
@@ -1346,20 +1492,22 @@ if (typeof jQuery != 'undefined') {
|
|
1346
1492
|
handle = controls.find('.mejs-time-handle'),
|
1347
1493
|
timefloat = controls.find('.mejs-time-float'),
|
1348
1494
|
timefloatcurrent = controls.find('.mejs-time-float-current'),
|
1495
|
+
slider = controls.find('.mejs-time-slider'),
|
1349
1496
|
handleMouseMove = function (e) {
|
1350
|
-
// mouse or touch position relative to the object
|
1351
|
-
if (e.originalEvent.changedTouches) {
|
1352
|
-
var x = e.originalEvent.changedTouches[0].pageX;
|
1353
|
-
}else{
|
1354
|
-
var x = e.pageX;
|
1355
|
-
}
|
1356
1497
|
|
1357
|
-
|
1498
|
+
var offset = total.offset(),
|
1358
1499
|
width = total.outerWidth(true),
|
1359
1500
|
percentage = 0,
|
1360
1501
|
newTime = 0,
|
1361
|
-
pos = 0
|
1362
|
-
|
1502
|
+
pos = 0,
|
1503
|
+
x;
|
1504
|
+
|
1505
|
+
// mouse or touch position relative to the object
|
1506
|
+
if (e.originalEvent.changedTouches) {
|
1507
|
+
x = e.originalEvent.changedTouches[0].pageX;
|
1508
|
+
}else{
|
1509
|
+
x = e.pageX;
|
1510
|
+
}
|
1363
1511
|
|
1364
1512
|
if (media.duration) {
|
1365
1513
|
if (x < offset.left) {
|
@@ -1386,7 +1534,101 @@ if (typeof jQuery != 'undefined') {
|
|
1386
1534
|
}
|
1387
1535
|
},
|
1388
1536
|
mouseIsDown = false,
|
1389
|
-
mouseIsOver = false
|
1537
|
+
mouseIsOver = false,
|
1538
|
+
lastKeyPressTime = 0,
|
1539
|
+
startedPaused = false,
|
1540
|
+
autoRewindInitial = player.options.autoRewind;
|
1541
|
+
// Accessibility for slider
|
1542
|
+
var updateSlider = function (e) {
|
1543
|
+
|
1544
|
+
var seconds = media.currentTime,
|
1545
|
+
timeSliderText = mejs.i18n.t('Time Slider'),
|
1546
|
+
time = mejs.Utility.secondsToTimeCode(seconds),
|
1547
|
+
duration = media.duration;
|
1548
|
+
|
1549
|
+
slider.attr({
|
1550
|
+
'aria-label': timeSliderText,
|
1551
|
+
'aria-valuemin': 0,
|
1552
|
+
'aria-valuemax': duration,
|
1553
|
+
'aria-valuenow': seconds,
|
1554
|
+
'aria-valuetext': time,
|
1555
|
+
'role': 'slider',
|
1556
|
+
'tabindex': 0
|
1557
|
+
});
|
1558
|
+
|
1559
|
+
};
|
1560
|
+
|
1561
|
+
var restartPlayer = function () {
|
1562
|
+
var now = new Date();
|
1563
|
+
if (now - lastKeyPressTime >= 1000) {
|
1564
|
+
media.play();
|
1565
|
+
}
|
1566
|
+
};
|
1567
|
+
|
1568
|
+
slider.bind('focus', function (e) {
|
1569
|
+
player.options.autoRewind = false;
|
1570
|
+
});
|
1571
|
+
|
1572
|
+
slider.bind('blur', function (e) {
|
1573
|
+
player.options.autoRewind = autoRewindInitial;
|
1574
|
+
});
|
1575
|
+
|
1576
|
+
slider.bind('keydown', function (e) {
|
1577
|
+
|
1578
|
+
if ((new Date() - lastKeyPressTime) >= 1000) {
|
1579
|
+
startedPaused = media.paused;
|
1580
|
+
}
|
1581
|
+
|
1582
|
+
var keyCode = e.keyCode,
|
1583
|
+
duration = media.duration,
|
1584
|
+
seekTime = media.currentTime;
|
1585
|
+
|
1586
|
+
switch (keyCode) {
|
1587
|
+
case 37: // left
|
1588
|
+
seekTime -= 1;
|
1589
|
+
break;
|
1590
|
+
case 39: // Right
|
1591
|
+
seekTime += 1;
|
1592
|
+
break;
|
1593
|
+
case 38: // Up
|
1594
|
+
seekTime += Math.floor(duration * 0.1);
|
1595
|
+
break;
|
1596
|
+
case 40: // Down
|
1597
|
+
seekTime -= Math.floor(duration * 0.1);
|
1598
|
+
break;
|
1599
|
+
case 36: // Home
|
1600
|
+
seekTime = 0;
|
1601
|
+
break;
|
1602
|
+
case 35: // end
|
1603
|
+
seekTime = duration;
|
1604
|
+
break;
|
1605
|
+
case 10: // enter
|
1606
|
+
media.paused ? media.play() : media.pause();
|
1607
|
+
return;
|
1608
|
+
case 13: // space
|
1609
|
+
media.paused ? media.play() : media.pause();
|
1610
|
+
return;
|
1611
|
+
default:
|
1612
|
+
return;
|
1613
|
+
}
|
1614
|
+
|
1615
|
+
seekTime = seekTime < 0 ? 0 : (seekTime >= duration ? duration : Math.floor(seekTime));
|
1616
|
+
lastKeyPressTime = new Date();
|
1617
|
+
if (!startedPaused) {
|
1618
|
+
media.pause();
|
1619
|
+
}
|
1620
|
+
|
1621
|
+
if (seekTime < media.duration && !startedPaused) {
|
1622
|
+
setTimeout(restartPlayer, 1100);
|
1623
|
+
}
|
1624
|
+
|
1625
|
+
media.setCurrentTime(seekTime);
|
1626
|
+
|
1627
|
+
e.preventDefault();
|
1628
|
+
e.stopPropagation();
|
1629
|
+
return false;
|
1630
|
+
});
|
1631
|
+
|
1390
1632
|
|
1391
1633
|
// handle clicks
|
1392
1634
|
//controls.find('.mejs-time-rail').delegate('span', 'click', handleMouseMove);
|
@@ -1404,7 +1646,6 @@ if (typeof jQuery != 'undefined') {
|
|
1404
1646
|
timefloat.hide();
|
1405
1647
|
t.globalUnbind('.dur');
|
1406
1648
|
});
|
1407
|
-
return false;
|
1408
1649
|
}
|
1409
1650
|
})
|
1410
1651
|
.bind('mouseenter', function(e) {
|
@@ -1434,6 +1675,7 @@ if (typeof jQuery != 'undefined') {
|
|
1434
1675
|
media.addEventListener('timeupdate', function(e) {
|
1435
1676
|
player.setProgressRail(e);
|
1436
1677
|
player.setCurrentRail(e);
|
1678
|
+
updateSlider(e);
|
1437
1679
|
}, false);
|
1438
1680
|
|
1439
1681
|
|
@@ -1447,8 +1689,8 @@ if (typeof jQuery != 'undefined') {
|
|
1447
1689
|
|
1448
1690
|
var
|
1449
1691
|
t = this,
|
1450
|
-
target = (e
|
1451
|
-
percent = null;
|
1692
|
+
target = (e !== undefined) ? e.target : t.media,
|
1693
|
+
percent = null;
|
1452
1694
|
|
1453
1695
|
// newest HTML5 spec has buffered array (FF4, Webkit)
|
1454
1696
|
if (target && target.buffered && target.buffered.length > 0 && target.buffered.end && target.duration) {
|
@@ -1459,12 +1701,12 @@ if (typeof jQuery != 'undefined') {
|
|
1459
1701
|
// to be anything other than 0. If the byte count is available we use this instead.
|
1460
1702
|
// Browsers that support the else if do not seem to have the bufferedBytes value and
|
1461
1703
|
// should skip to there. Tested in Safari 5, Webkit head, FF3.6, Chrome 6, IE 7/8.
|
1462
|
-
else if (target && target.bytesTotal
|
1704
|
+
else if (target && target.bytesTotal !== undefined && target.bytesTotal > 0 && target.bufferedBytes !== undefined) {
|
1463
1705
|
percent = target.bufferedBytes / target.bytesTotal;
|
1464
1706
|
}
|
1465
1707
|
// Firefox 3 with an Ogg file seems to go this way
|
1466
|
-
else if (e && e.lengthComputable && e.total
|
1467
|
-
percent = e.loaded/e.total;
|
1708
|
+
else if (e && e.lengthComputable && e.total !== 0) {
|
1709
|
+
percent = e.loaded / e.total;
|
1468
1710
|
}
|
1469
1711
|
|
1470
1712
|
// finally update the progress bar
|
@@ -1480,7 +1722,7 @@ if (typeof jQuery != 'undefined') {
|
|
1480
1722
|
|
1481
1723
|
var t = this;
|
1482
1724
|
|
1483
|
-
if (t.media.currentTime
|
1725
|
+
if (t.media.currentTime !== undefined && t.media.duration) {
|
1484
1726
|
|
1485
1727
|
// update bar and handle
|
1486
1728
|
if (t.total && t.handle) {
|
@@ -1493,10 +1735,9 @@ if (typeof jQuery != 'undefined') {
|
|
1493
1735
|
}
|
1494
1736
|
}
|
1495
1737
|
|
1496
|
-
}
|
1738
|
+
}
|
1497
1739
|
});
|
1498
1740
|
})(mejs.$);
|
1499
|
-
|
1500
1741
|
(function($) {
|
1501
1742
|
|
1502
1743
|
// options
|
@@ -1511,11 +1752,13 @@ if (typeof jQuery != 'undefined') {
|
|
1511
1752
|
buildcurrent: function(player, controls, layers, media) {
|
1512
1753
|
var t = this;
|
1513
1754
|
|
1514
|
-
$('<div class="mejs-time">'+
|
1515
|
-
'<span class="mejs-currenttime">' +
|
1516
|
-
|
1517
|
-
|
1518
|
-
|
1755
|
+
$('<div class="mejs-time" role="timer" aria-live="off">' +
|
1756
|
+
'<span class="mejs-currenttime">' +
|
1757
|
+
(player.options.alwaysShowHours ? '00:' : '') +
|
1758
|
+
(player.options.showTimecodeFrameCount? '00:00:00':'00:00') +
|
1759
|
+
'</span>'+
|
1760
|
+
'</div>')
|
1761
|
+
.appendTo(controls);
|
1519
1762
|
|
1520
1763
|
t.currenttime = t.controls.find('.mejs-currenttime');
|
1521
1764
|
|
@@ -1533,8 +1776,8 @@ if (typeof jQuery != 'undefined') {
|
|
1533
1776
|
'<span class="mejs-duration">' +
|
1534
1777
|
(t.options.duration > 0 ?
|
1535
1778
|
mejs.Utility.secondsToTimeCode(t.options.duration, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25) :
|
1536
|
-
|
1537
|
-
|
1779
|
+
((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00'))
|
1780
|
+
) +
|
1538
1781
|
'</span>')
|
1539
1782
|
.appendTo(controls.find('.mejs-time'));
|
1540
1783
|
} else {
|
@@ -1546,8 +1789,8 @@ if (typeof jQuery != 'undefined') {
|
|
1546
1789
|
'<span class="mejs-duration">' +
|
1547
1790
|
(t.options.duration > 0 ?
|
1548
1791
|
mejs.Utility.secondsToTimeCode(t.options.duration, t.options.alwaysShowHours || t.media.duration > 3600, t.options.showTimecodeFrameCount, t.options.framesPerSecond || 25) :
|
1549
|
-
|
1550
|
-
|
1792
|
+
((player.options.alwaysShowHours ? '00:' : '') + (player.options.showTimecodeFrameCount? '00:00:00':'00:00'))
|
1793
|
+
) +
|
1551
1794
|
'</span>' +
|
1552
1795
|
'</div>')
|
1553
1796
|
.appendTo(controls);
|
@@ -1586,6 +1829,7 @@ if (typeof jQuery != 'undefined') {
|
|
1586
1829
|
|
1587
1830
|
$.extend(mejs.MepDefaults, {
|
1588
1831
|
muteText: mejs.i18n.t('Mute Toggle'),
|
1832
|
+
allyVolumeControlText: mejs.i18n.t('Use Up/Down Arrow keys to increase or decrease volume.'),
|
1589
1833
|
hideVolumeOnTouchDevices: true,
|
1590
1834
|
|
1591
1835
|
audioVolume: 'horizontal',
|
@@ -1604,25 +1848,33 @@ if (typeof jQuery != 'undefined') {
|
|
1604
1848
|
mute = (mode == 'horizontal') ?
|
1605
1849
|
|
1606
1850
|
// horizontal version
|
1607
|
-
$('<div class="mejs-button mejs-volume-button mejs-mute">'+
|
1608
|
-
'<button type="button" aria-controls="' + t.id +
|
1851
|
+
$('<div class="mejs-button mejs-volume-button mejs-mute">' +
|
1852
|
+
'<button type="button" aria-controls="' + t.id +
|
1853
|
+
'" title="' + t.options.muteText +
|
1854
|
+
'" aria-label="' + t.options.muteText +
|
1855
|
+
'"></button>'+
|
1609
1856
|
'</div>' +
|
1610
|
-
|
1857
|
+
'<a href="javascript:void(0);" class="mejs-horizontal-volume-slider">' + // outer background
|
1858
|
+
'<span class="mejs-offscreen">' + t.options.allyVolumeControlText + '</span>' +
|
1611
1859
|
'<div class="mejs-horizontal-volume-total"></div>'+ // line background
|
1612
1860
|
'<div class="mejs-horizontal-volume-current"></div>'+ // current volume
|
1613
1861
|
'<div class="mejs-horizontal-volume-handle"></div>'+ // handle
|
1614
|
-
'</
|
1862
|
+
'</a>'
|
1615
1863
|
)
|
1616
1864
|
.appendTo(controls) :
|
1617
1865
|
|
1618
1866
|
// vertical version
|
1619
1867
|
$('<div class="mejs-button mejs-volume-button mejs-mute">'+
|
1620
|
-
'<button type="button" aria-controls="' + t.id +
|
1621
|
-
|
1868
|
+
'<button type="button" aria-controls="' + t.id +
|
1869
|
+
'" title="' + t.options.muteText +
|
1870
|
+
'" aria-label="' + t.options.muteText +
|
1871
|
+
'"></button>'+
|
1872
|
+
'<a href="javascript:void(0);" class="mejs-volume-slider">'+ // outer background
|
1873
|
+
'<span class="mejs-offscreen">' + t.options.allyVolumeControlText + '</span>' +
|
1622
1874
|
'<div class="mejs-volume-total"></div>'+ // line background
|
1623
1875
|
'<div class="mejs-volume-current"></div>'+ // current volume
|
1624
1876
|
'<div class="mejs-volume-handle"></div>'+ // handle
|
1625
|
-
'</
|
1877
|
+
'</a>'+
|
1626
1878
|
'</div>')
|
1627
1879
|
.appendTo(controls),
|
1628
1880
|
volumeSlider = t.container.find('.mejs-volume-slider, .mejs-horizontal-volume-slider'),
|
@@ -1635,32 +1887,30 @@ if (typeof jQuery != 'undefined') {
|
|
1635
1887
|
if (!volumeSlider.is(':visible') && typeof secondTry == 'undefined') {
|
1636
1888
|
volumeSlider.show();
|
1637
1889
|
positionVolumeHandle(volume, true);
|
1638
|
-
volumeSlider.hide()
|
1890
|
+
volumeSlider.hide();
|
1639
1891
|
return;
|
1640
1892
|
}
|
1641
|
-
|
1893
|
+
|
1642
1894
|
// correct to 0-1
|
1643
1895
|
volume = Math.max(0,volume);
|
1644
|
-
volume = Math.min(volume,1);
|
1645
|
-
|
1896
|
+
volume = Math.min(volume,1);
|
1897
|
+
|
1646
1898
|
// ajust mute button style
|
1647
|
-
if (volume
|
1899
|
+
if (volume === 0) {
|
1648
1900
|
mute.removeClass('mejs-mute').addClass('mejs-unmute');
|
1649
1901
|
} else {
|
1650
1902
|
mute.removeClass('mejs-unmute').addClass('mejs-mute');
|
1651
|
-
}
|
1903
|
+
}
|
1652
1904
|
|
1905
|
+
// top/left of full size volume slider background
|
1906
|
+
var totalPosition = volumeTotal.position();
|
1653
1907
|
// position slider
|
1654
1908
|
if (mode == 'vertical') {
|
1655
|
-
var
|
1656
|
-
|
1657
|
-
// height of the full size volume slider background
|
1909
|
+
var
|
1910
|
+
// height of the full size volume slider background
|
1658
1911
|
totalHeight = volumeTotal.height(),
|
1659
|
-
|
1660
|
-
|
1661
|
-
totalPosition = volumeTotal.position(),
|
1662
|
-
|
1663
|
-
// the new top position based on the current volume
|
1912
|
+
|
1913
|
+
// the new top position based on the current volume
|
1664
1914
|
// 70% volume on 100px height == top:30px
|
1665
1915
|
newTop = totalHeight - (totalHeight * volume);
|
1666
1916
|
|
@@ -1671,14 +1921,10 @@ if (typeof jQuery != 'undefined') {
|
|
1671
1921
|
volumeCurrent.height(totalHeight - newTop );
|
1672
1922
|
volumeCurrent.css('top', totalPosition.top + newTop);
|
1673
1923
|
} else {
|
1674
|
-
|
1675
|
-
|
1924
|
+
var
|
1676
1925
|
// height of the full size volume slider background
|
1677
1926
|
totalWidth = volumeTotal.width(),
|
1678
1927
|
|
1679
|
-
// top/left of full size volume slider background
|
1680
|
-
totalPosition = volumeTotal.position(),
|
1681
|
-
|
1682
1928
|
// the new left position based on the current volume
|
1683
1929
|
newLeft = totalWidth * volume;
|
1684
1930
|
|
@@ -1695,7 +1941,7 @@ if (typeof jQuery != 'undefined') {
|
|
1695
1941
|
totalOffset = volumeTotal.offset();
|
1696
1942
|
|
1697
1943
|
// calculate the new volume based on the moust position
|
1698
|
-
if (mode
|
1944
|
+
if (mode === 'vertical') {
|
1699
1945
|
|
1700
1946
|
var
|
1701
1947
|
railHeight = volumeTotal.height(),
|
@@ -1705,8 +1951,9 @@ if (typeof jQuery != 'undefined') {
|
|
1705
1951
|
volume = (railHeight - newY) / railHeight;
|
1706
1952
|
|
1707
1953
|
// the controls just hide themselves (usually when mouse moves too far up)
|
1708
|
-
if (totalOffset.top
|
1954
|
+
if (totalOffset.top === 0 || totalOffset.left === 0) {
|
1709
1955
|
return;
|
1956
|
+
}
|
1710
1957
|
|
1711
1958
|
} else {
|
1712
1959
|
var
|
@@ -1720,16 +1967,16 @@ if (typeof jQuery != 'undefined') {
|
|
1720
1967
|
volume = Math.max(0,volume);
|
1721
1968
|
volume = Math.min(volume,1);
|
1722
1969
|
|
1723
|
-
// position the slider and handle
|
1970
|
+
// position the slider and handle
|
1724
1971
|
positionVolumeHandle(volume);
|
1725
1972
|
|
1726
1973
|
// set the media object (this will trigger the volumechanged event)
|
1727
|
-
if (volume
|
1974
|
+
if (volume === 0) {
|
1728
1975
|
media.setMuted(true);
|
1729
1976
|
} else {
|
1730
1977
|
media.setMuted(false);
|
1731
1978
|
}
|
1732
|
-
media.setVolume(volume);
|
1979
|
+
media.setVolume(volume);
|
1733
1980
|
},
|
1734
1981
|
mouseIsDown = false,
|
1735
1982
|
mouseIsOver = false;
|
@@ -1741,12 +1988,28 @@ if (typeof jQuery != 'undefined') {
|
|
1741
1988
|
volumeSlider.show();
|
1742
1989
|
mouseIsOver = true;
|
1743
1990
|
}, function() {
|
1744
|
-
mouseIsOver = false;
|
1991
|
+
mouseIsOver = false;
|
1745
1992
|
|
1746
1993
|
if (!mouseIsDown && mode == 'vertical') {
|
1747
1994
|
volumeSlider.hide();
|
1748
1995
|
}
|
1749
1996
|
});
|
1997
|
+
|
1998
|
+
var updateVolumeSlider = function (e) {
|
1999
|
+
|
2000
|
+
var volume = Math.floor(media.volume*100);
|
2001
|
+
|
2002
|
+
volumeSlider.attr({
|
2003
|
+
'aria-label': mejs.i18n.t('volumeSlider'),
|
2004
|
+
'aria-valuemin': 0,
|
2005
|
+
'aria-valuemax': 100,
|
2006
|
+
'aria-valuenow': volume,
|
2007
|
+
'aria-valuetext': volume+'%',
|
2008
|
+
'role': 'slider',
|
2009
|
+
'tabindex': 0
|
2010
|
+
});
|
2011
|
+
|
2012
|
+
};
|
1750
2013
|
|
1751
2014
|
volumeSlider
|
1752
2015
|
.bind('mouseover', function() {
|
@@ -1768,13 +2031,39 @@ if (typeof jQuery != 'undefined') {
|
|
1768
2031
|
mouseIsDown = true;
|
1769
2032
|
|
1770
2033
|
return false;
|
2034
|
+
})
|
2035
|
+
.bind('keydown', function (e) {
|
2036
|
+
var keyCode = e.keyCode;
|
2037
|
+
var volume = media.volume;
|
2038
|
+
switch (keyCode) {
|
2039
|
+
case 38: // Up
|
2040
|
+
volume += 0.1;
|
2041
|
+
break;
|
2042
|
+
case 40: // Down
|
2043
|
+
volume = volume - 0.1;
|
2044
|
+
break;
|
2045
|
+
default:
|
2046
|
+
return true;
|
2047
|
+
}
|
2048
|
+
|
2049
|
+
mouseIsDown = false;
|
2050
|
+
positionVolumeHandle(volume);
|
2051
|
+
media.setVolume(volume);
|
2052
|
+
return false;
|
2053
|
+
})
|
2054
|
+
.bind('blur', function () {
|
2055
|
+
volumeSlider.hide();
|
1771
2056
|
});
|
1772
2057
|
|
1773
|
-
|
1774
2058
|
// MUTE button
|
1775
2059
|
mute.find('button').click(function() {
|
1776
2060
|
media.setMuted( !media.muted );
|
1777
2061
|
});
|
2062
|
+
|
2063
|
+
//Keyboard input
|
2064
|
+
mute.find('button').bind('focus', function () {
|
2065
|
+
volumeSlider.show();
|
2066
|
+
});
|
1778
2067
|
|
1779
2068
|
// listen for volume change events from other sources
|
1780
2069
|
media.addEventListener('volumechange', function(e) {
|
@@ -1787,6 +2076,7 @@ if (typeof jQuery != 'undefined') {
|
|
1787
2076
|
mute.removeClass('mejs-unmute').addClass('mejs-mute');
|
1788
2077
|
}
|
1789
2078
|
}
|
2079
|
+
updateVolumeSlider(e);
|
1790
2080
|
}, false);
|
1791
2081
|
|
1792
2082
|
if (t.container.is(':visible')) {
|
@@ -1794,9 +2084,9 @@ if (typeof jQuery != 'undefined') {
|
|
1794
2084
|
positionVolumeHandle(player.options.startVolume);
|
1795
2085
|
|
1796
2086
|
// mutes the media and sets the volume icon muted if the initial volume is set to 0
|
1797
|
-
|
1798
|
-
|
1799
|
-
|
2087
|
+
if (player.options.startVolume === 0) {
|
2088
|
+
media.setMuted(true);
|
2089
|
+
}
|
1800
2090
|
|
1801
2091
|
// shim gets the startvolume as a parameter, but we have to set it on the native <video> and <audio> elements
|
1802
2092
|
if (media.pluginType === 'native') {
|
@@ -1807,7 +2097,6 @@ if (typeof jQuery != 'undefined') {
|
|
1807
2097
|
});
|
1808
2098
|
|
1809
2099
|
})(mejs.$);
|
1810
|
-
|
1811
2100
|
(function($) {
|
1812
2101
|
|
1813
2102
|
$.extend(mejs.MepDefaults, {
|
@@ -1850,11 +2139,7 @@ if (typeof jQuery != 'undefined') {
|
|
1850
2139
|
}
|
1851
2140
|
};
|
1852
2141
|
|
1853
|
-
|
1854
|
-
player.globalBind(mejs.MediaFeatures.fullScreenEventName, func);
|
1855
|
-
} else {
|
1856
|
-
player.container.bind(mejs.MediaFeatures.fullScreenEventName, func);
|
1857
|
-
}
|
2142
|
+
player.globalBind(mejs.MediaFeatures.fullScreenEventName, func);
|
1858
2143
|
}
|
1859
2144
|
|
1860
2145
|
var t = this,
|
@@ -2228,6 +2513,9 @@ if (typeof jQuery != 'undefined') {
|
|
2228
2513
|
|
2229
2514
|
t.setControlsSize();
|
2230
2515
|
t.isFullScreen = true;
|
2516
|
+
|
2517
|
+
t.container.find('.mejs-captions-text').css('font-size', screen.width / t.width * 1.00 * 100 + '%');
|
2518
|
+
t.container.find('.mejs-captions-position').css('bottom', '45px');
|
2231
2519
|
},
|
2232
2520
|
|
2233
2521
|
exitFullScreen: function() {
|
@@ -2280,6 +2568,9 @@ if (typeof jQuery != 'undefined') {
|
|
2280
2568
|
|
2281
2569
|
t.setControlsSize();
|
2282
2570
|
t.isFullScreen = false;
|
2571
|
+
|
2572
|
+
t.container.find('.mejs-captions-text').css('font-size','');
|
2573
|
+
t.container.find('.mejs-captions-position').css('bottom', '');
|
2283
2574
|
}
|
2284
2575
|
});
|
2285
2576
|
|
@@ -2287,48 +2578,133 @@ if (typeof jQuery != 'undefined') {
|
|
2287
2578
|
|
2288
2579
|
(function($) {
|
2289
2580
|
|
2290
|
-
//
|
2581
|
+
// Speed
|
2582
|
+
$.extend(mejs.MepDefaults, {
|
2583
|
+
|
2584
|
+
speeds: ['2.00', '1.50', '1.25', '1.00', '0.75'],
|
2585
|
+
|
2586
|
+
defaultSpeed: '1.00',
|
2587
|
+
|
2588
|
+
speedChar: 'x'
|
2589
|
+
|
2590
|
+
});
|
2591
|
+
|
2592
|
+
$.extend(MediaElementPlayer.prototype, {
|
2593
|
+
|
2594
|
+
buildspeed: function(player, controls, layers, media) {
|
2595
|
+
var t = this;
|
2596
|
+
|
2597
|
+
if (t.media.pluginType == 'native') {
|
2598
|
+
var
|
2599
|
+
speedButton = null,
|
2600
|
+
speedSelector = null,
|
2601
|
+
playbackSpeed = null,
|
2602
|
+
html = '<div class="mejs-button mejs-speed-button">' +
|
2603
|
+
'<button type="button">' + t.options.defaultSpeed + t.options.speedChar + '</button>' +
|
2604
|
+
'<div class="mejs-speed-selector">' +
|
2605
|
+
'<ul>';
|
2606
|
+
|
2607
|
+
if ($.inArray(t.options.defaultSpeed, t.options.speeds) === -1) {
|
2608
|
+
t.options.speeds.push(t.options.defaultSpeed);
|
2609
|
+
}
|
2610
|
+
|
2611
|
+
t.options.speeds.sort(function(a, b) {
|
2612
|
+
return parseFloat(b) - parseFloat(a);
|
2613
|
+
});
|
2614
|
+
|
2615
|
+
for (var i = 0, il = t.options.speeds.length; i<il; i++) {
|
2616
|
+
html += '<li>' +
|
2617
|
+
'<input type="radio" name="speed" ' +
|
2618
|
+
'value="' + t.options.speeds[i] + '" ' +
|
2619
|
+
'id="' + t.options.speeds[i] + '" ' +
|
2620
|
+
(t.options.speeds[i] == t.options.defaultSpeed ? ' checked' : '') +
|
2621
|
+
' />' +
|
2622
|
+
'<label for="' + t.options.speeds[i] + '" ' +
|
2623
|
+
(t.options.speeds[i] == t.options.defaultSpeed ? ' class="mejs-speed-selected"' : '') +
|
2624
|
+
'>' + t.options.speeds[i] + t.options.speedChar + '</label>' +
|
2625
|
+
'</li>';
|
2626
|
+
}
|
2627
|
+
html += '</ul></div></div>';
|
2628
|
+
|
2629
|
+
speedButton = $(html).appendTo(controls);
|
2630
|
+
speedSelector = speedButton.find('.mejs-speed-selector');
|
2631
|
+
|
2632
|
+
playbackspeed = t.options.defaultSpeed;
|
2633
|
+
|
2634
|
+
speedSelector
|
2635
|
+
.on('click', 'input[type="radio"]', function() {
|
2636
|
+
var newSpeed = $(this).attr('value');
|
2637
|
+
playbackspeed = newSpeed;
|
2638
|
+
media.playbackRate = parseFloat(newSpeed);
|
2639
|
+
speedButton.find('button').html(newSpeed + t.options.speedChar);
|
2640
|
+
speedButton.find('.mejs-speed-selected').removeClass('mejs-speed-selected');
|
2641
|
+
speedButton.find('input[type="radio"]:checked').next().addClass('mejs-speed-selected');
|
2642
|
+
});
|
2643
|
+
|
2644
|
+
speedSelector
|
2645
|
+
.height(
|
2646
|
+
speedButton.find('.mejs-speed-selector ul').outerHeight(true) +
|
2647
|
+
speedButton.find('.mejs-speed-translations').outerHeight(true))
|
2648
|
+
.css('top', (-1 * speedSelector.height()) + 'px');
|
2649
|
+
}
|
2650
|
+
}
|
2651
|
+
});
|
2652
|
+
|
2653
|
+
})(mejs.$);
|
2654
|
+
|
2655
|
+
(function($) {
|
2656
|
+
|
2657
|
+
// add extra default options
|
2291
2658
|
$.extend(mejs.MepDefaults, {
|
2292
2659
|
// this will automatically turn on a <track>
|
2293
2660
|
startLanguage: '',
|
2294
2661
|
|
2295
2662
|
tracksText: mejs.i18n.t('Captions/Subtitles'),
|
2296
|
-
|
2663
|
+
|
2297
2664
|
// option to remove the [cc] button when no <track kind="subtitles"> are present
|
2298
2665
|
hideCaptionsButtonWhenEmpty: true,
|
2299
2666
|
|
2300
2667
|
// If true and we only have one track, change captions to popup
|
2301
2668
|
toggleCaptionsButtonWhenOnlyOne: false,
|
2302
2669
|
|
2303
|
-
// #id or .class
|
2670
|
+
// #id or .class
|
2304
2671
|
slidesSelector: ''
|
2305
2672
|
});
|
2306
2673
|
|
2307
2674
|
$.extend(MediaElementPlayer.prototype, {
|
2308
|
-
|
2675
|
+
|
2309
2676
|
hasChapters: false,
|
2310
2677
|
|
2678
|
+
cleartracks: function(player, controls, layers, media){
|
2679
|
+
if(player) {
|
2680
|
+
if(player.captions) player.captions.remove();
|
2681
|
+
if(player.chapters) player.chapters.remove();
|
2682
|
+
if(player.captionsText) player.captionsText.remove();
|
2683
|
+
if(player.captionsButton) player.captionsButton.remove();
|
2684
|
+
}
|
2685
|
+
},
|
2311
2686
|
buildtracks: function(player, controls, layers, media) {
|
2312
|
-
if (player.tracks.length
|
2687
|
+
if (player.tracks.length === 0)
|
2313
2688
|
return;
|
2314
2689
|
|
2315
|
-
var t = this,
|
2316
|
-
i,
|
2690
|
+
var t = this,
|
2691
|
+
i,
|
2317
2692
|
options = '';
|
2318
2693
|
|
2319
2694
|
if (t.domNode.textTracks) { // if browser will do native captions, prefer mejs captions, loop through tracks and hide
|
2320
|
-
for (
|
2695
|
+
for (i = t.domNode.textTracks.length - 1; i >= 0; i--) {
|
2321
2696
|
t.domNode.textTracks[i].mode = "hidden";
|
2322
2697
|
}
|
2323
2698
|
}
|
2324
|
-
player
|
2699
|
+
t.cleartracks(player, controls, layers, media);
|
2700
|
+
player.chapters =
|
2325
2701
|
$('<div class="mejs-chapters mejs-layer"></div>')
|
2326
2702
|
.prependTo(layers).hide();
|
2327
|
-
player.captions =
|
2328
|
-
$('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover"><span class="mejs-captions-text"></span></div></div>')
|
2703
|
+
player.captions =
|
2704
|
+
$('<div class="mejs-captions-layer mejs-layer"><div class="mejs-captions-position mejs-captions-position-hover" role="log" aria-live="assertive" aria-atomic="false"><span class="mejs-captions-text"></span></div></div>')
|
2329
2705
|
.prependTo(layers).hide();
|
2330
2706
|
player.captionsText = player.captions.find('.mejs-captions-text');
|
2331
|
-
player.captionsButton =
|
2707
|
+
player.captionsButton =
|
2332
2708
|
$('<div class="mejs-button mejs-captions-button">'+
|
2333
2709
|
'<button type="button" aria-controls="' + t.id + '" title="' + t.options.tracksText + '" aria-label="' + t.options.tracksText + '"></button>'+
|
2334
2710
|
'<div class="mejs-captions-selector">'+
|
@@ -2341,8 +2717,8 @@ if (typeof jQuery != 'undefined') {
|
|
2341
2717
|
'</div>'+
|
2342
2718
|
'</div>')
|
2343
2719
|
.appendTo(controls);
|
2344
|
-
|
2345
|
-
|
2720
|
+
|
2721
|
+
|
2346
2722
|
var subtitleCount = 0;
|
2347
2723
|
for (i=0; i<player.tracks.length; i++) {
|
2348
2724
|
if (player.tracks[i].kind == 'subtitles') {
|
@@ -2354,19 +2730,17 @@ if (typeof jQuery != 'undefined') {
|
|
2354
2730
|
if (t.options.toggleCaptionsButtonWhenOnlyOne && subtitleCount == 1){
|
2355
2731
|
// click
|
2356
2732
|
player.captionsButton.on('click',function() {
|
2357
|
-
if (player.selectedTrack
|
2358
|
-
|
2733
|
+
if (player.selectedTrack === null) {
|
2734
|
+
lang = player.tracks[0].srclang;
|
2359
2735
|
} else {
|
2360
|
-
|
2736
|
+
lang = 'none';
|
2361
2737
|
}
|
2362
2738
|
player.setTrack(lang);
|
2363
2739
|
});
|
2364
2740
|
} else {
|
2365
|
-
// hover
|
2366
|
-
player.captionsButton.
|
2741
|
+
// hover or keyboard focus
|
2742
|
+
player.captionsButton.on( 'mouseenter focusin', function() {
|
2367
2743
|
$(this).find('.mejs-captions-selector').css('visibility','visible');
|
2368
|
-
}, function() {
|
2369
|
-
$(this).find('.mejs-captions-selector').css('visibility','hidden');
|
2370
2744
|
})
|
2371
2745
|
|
2372
2746
|
// handle clicks to the language radio buttons
|
@@ -2375,6 +2749,10 @@ if (typeof jQuery != 'undefined') {
|
|
2375
2749
|
player.setTrack(lang);
|
2376
2750
|
});
|
2377
2751
|
|
2752
|
+
player.captionsButton.on( 'mouseleave focusout', function() {
|
2753
|
+
$(this).find(".mejs-captions-selector").css("visibility","hidden");
|
2754
|
+
});
|
2755
|
+
|
2378
2756
|
}
|
2379
2757
|
|
2380
2758
|
if (!player.options.alwaysShowControls) {
|
@@ -2399,8 +2777,6 @@ if (typeof jQuery != 'undefined') {
|
|
2399
2777
|
player.selectedTrack = null;
|
2400
2778
|
player.isLoadingTrack = false;
|
2401
2779
|
|
2402
|
-
|
2403
|
-
|
2404
2780
|
// add to list
|
2405
2781
|
for (i=0; i<player.tracks.length; i++) {
|
2406
2782
|
if (player.tracks[i].kind == 'subtitles') {
|
@@ -2411,18 +2787,17 @@ if (typeof jQuery != 'undefined') {
|
|
2411
2787
|
// start loading tracks
|
2412
2788
|
player.loadNextTrack();
|
2413
2789
|
|
2414
|
-
|
2415
2790
|
media.addEventListener('timeupdate',function(e) {
|
2416
2791
|
player.displayCaptions();
|
2417
2792
|
}, false);
|
2418
|
-
|
2419
|
-
if (player.options.slidesSelector
|
2793
|
+
|
2794
|
+
if (player.options.slidesSelector !== '') {
|
2420
2795
|
player.slidesContainer = $(player.options.slidesSelector);
|
2421
2796
|
|
2422
2797
|
media.addEventListener('timeupdate',function(e) {
|
2423
|
-
player.displaySlides();
|
2798
|
+
player.displaySlides();
|
2424
2799
|
}, false);
|
2425
|
-
|
2800
|
+
|
2426
2801
|
}
|
2427
2802
|
|
2428
2803
|
media.addEventListener('loadedmetadata', function(e) {
|
@@ -2445,26 +2820,26 @@ if (typeof jQuery != 'undefined') {
|
|
2445
2820
|
});
|
2446
2821
|
}
|
2447
2822
|
});
|
2448
|
-
|
2823
|
+
|
2449
2824
|
// check for autoplay
|
2450
2825
|
if (player.node.getAttribute('autoplay') !== null) {
|
2451
2826
|
player.chapters.css('visibility','hidden');
|
2452
2827
|
}
|
2453
2828
|
},
|
2454
|
-
|
2829
|
+
|
2455
2830
|
setTrack: function(lang){
|
2456
|
-
|
2831
|
+
|
2457
2832
|
var t = this,
|
2458
2833
|
i;
|
2459
|
-
|
2834
|
+
|
2460
2835
|
if (lang == 'none') {
|
2461
2836
|
t.selectedTrack = null;
|
2462
2837
|
t.captionsButton.removeClass('mejs-captions-enabled');
|
2463
2838
|
} else {
|
2464
2839
|
for (i=0; i<t.tracks.length; i++) {
|
2465
2840
|
if (t.tracks[i].srclang == lang) {
|
2466
|
-
if (t.selectedTrack
|
2467
|
-
|
2841
|
+
if (t.selectedTrack === null)
|
2842
|
+
t.captionsButton.addClass('mejs-captions-enabled');
|
2468
2843
|
t.selectedTrack = t.tracks[i];
|
2469
2844
|
t.captions.attr('lang', t.selectedTrack.srclang);
|
2470
2845
|
t.displayCaptions();
|
@@ -2484,8 +2859,8 @@ if (typeof jQuery != 'undefined') {
|
|
2484
2859
|
} else {
|
2485
2860
|
// add done?
|
2486
2861
|
t.isLoadingTrack = false;
|
2487
|
-
|
2488
|
-
t.checkForTracks();
|
2862
|
+
|
2863
|
+
t.checkForTracks();
|
2489
2864
|
}
|
2490
2865
|
},
|
2491
2866
|
|
@@ -2513,11 +2888,11 @@ if (typeof jQuery != 'undefined') {
|
|
2513
2888
|
|
2514
2889
|
// parse the loaded file
|
2515
2890
|
if (typeof d == "string" && (/<tt\s+xml/ig).exec(d)) {
|
2516
|
-
track.entries = mejs.TrackFormatParser.dfxp.parse(d);
|
2517
|
-
} else {
|
2518
|
-
track.entries = mejs.TrackFormatParser.
|
2891
|
+
track.entries = mejs.TrackFormatParser.dfxp.parse(d);
|
2892
|
+
} else {
|
2893
|
+
track.entries = mejs.TrackFormatParser.webvtt.parse(d);
|
2519
2894
|
}
|
2520
|
-
|
2895
|
+
|
2521
2896
|
after();
|
2522
2897
|
|
2523
2898
|
if (track.kind == 'chapters') {
|
@@ -2527,10 +2902,10 @@ if (typeof jQuery != 'undefined') {
|
|
2527
2902
|
}
|
2528
2903
|
}, false);
|
2529
2904
|
}
|
2530
|
-
|
2905
|
+
|
2531
2906
|
if (track.kind == 'slides') {
|
2532
2907
|
t.setupSlides(track);
|
2533
|
-
}
|
2908
|
+
}
|
2534
2909
|
},
|
2535
2910
|
error: function() {
|
2536
2911
|
t.loadNextTrack();
|
@@ -2540,10 +2915,10 @@ if (typeof jQuery != 'undefined') {
|
|
2540
2915
|
|
2541
2916
|
enableTrackButton: function(lang, label) {
|
2542
2917
|
var t = this;
|
2543
|
-
|
2918
|
+
|
2544
2919
|
if (label === '') {
|
2545
2920
|
label = mejs.language.codes[lang] || lang;
|
2546
|
-
}
|
2921
|
+
}
|
2547
2922
|
|
2548
2923
|
t.captionsButton
|
2549
2924
|
.find('input[value=' + lang + ']')
|
@@ -2553,7 +2928,7 @@ if (typeof jQuery != 'undefined') {
|
|
2553
2928
|
|
2554
2929
|
// auto select
|
2555
2930
|
if (t.options.startLanguage == lang) {
|
2556
|
-
$('#' + t.id + '_captions_' + lang).
|
2931
|
+
$('#' + t.id + '_captions_' + lang).prop('checked', true).trigger('click');
|
2557
2932
|
}
|
2558
2933
|
|
2559
2934
|
t.adjustLanguageBox();
|
@@ -2586,12 +2961,12 @@ if (typeof jQuery != 'undefined') {
|
|
2586
2961
|
t.captionsButton.find('.mejs-captions-translations').outerHeight(true)
|
2587
2962
|
);
|
2588
2963
|
},
|
2589
|
-
|
2964
|
+
|
2590
2965
|
checkForTracks: function() {
|
2591
2966
|
var
|
2592
2967
|
t = this,
|
2593
2968
|
hasSubtitles = false;
|
2594
|
-
|
2969
|
+
|
2595
2970
|
// check if any subtitles
|
2596
2971
|
if (t.options.hideCaptionsButtonWhenEmpty) {
|
2597
2972
|
for (i=0; i<t.tracks.length; i++) {
|
@@ -2599,13 +2974,13 @@ if (typeof jQuery != 'undefined') {
|
|
2599
2974
|
hasSubtitles = true;
|
2600
2975
|
break;
|
2601
2976
|
}
|
2602
|
-
}
|
2603
|
-
|
2977
|
+
}
|
2978
|
+
|
2604
2979
|
if (!hasSubtitles) {
|
2605
2980
|
t.captionsButton.hide();
|
2606
2981
|
t.setControlsSize();
|
2607
|
-
}
|
2608
|
-
}
|
2982
|
+
}
|
2983
|
+
}
|
2609
2984
|
},
|
2610
2985
|
|
2611
2986
|
displayCaptions: function() {
|
@@ -2618,10 +2993,11 @@ if (typeof jQuery != 'undefined') {
|
|
2618
2993
|
i,
|
2619
2994
|
track = t.selectedTrack;
|
2620
2995
|
|
2621
|
-
if (track
|
2996
|
+
if (track !== null && track.isLoaded) {
|
2622
2997
|
for (i=0; i<track.entries.times.length; i++) {
|
2623
|
-
if (t.media.currentTime >= track.entries.times[i].start && t.media.currentTime <= track.entries.times[i].stop){
|
2624
|
-
|
2998
|
+
if (t.media.currentTime >= track.entries.times[i].start && t.media.currentTime <= track.entries.times[i].stop) {
|
2999
|
+
// Set the line before the timecode as a class so the cue can be targeted if needed
|
3000
|
+
t.captionsText.html(track.entries.text[i]).attr('class', 'mejs-captions-text ' + (track.entries.times[i].identifier || ''));
|
2625
3001
|
t.captions.show().height(0);
|
2626
3002
|
return; // exit out if one is visible;
|
2627
3003
|
}
|
@@ -2631,25 +3007,25 @@ if (typeof jQuery != 'undefined') {
|
|
2631
3007
|
t.captions.hide();
|
2632
3008
|
}
|
2633
3009
|
},
|
2634
|
-
|
3010
|
+
|
2635
3011
|
setupSlides: function(track) {
|
2636
3012
|
var t = this;
|
2637
|
-
|
3013
|
+
|
2638
3014
|
t.slides = track;
|
2639
3015
|
t.slides.entries.imgs = [t.slides.entries.text.length];
|
2640
3016
|
t.showSlide(0);
|
2641
|
-
|
3017
|
+
|
2642
3018
|
},
|
2643
|
-
|
3019
|
+
|
2644
3020
|
showSlide: function(index) {
|
2645
3021
|
if (typeof this.tracks == 'undefined' || typeof this.slidesContainer == 'undefined') {
|
2646
|
-
return;
|
3022
|
+
return;
|
2647
3023
|
}
|
2648
|
-
|
3024
|
+
|
2649
3025
|
var t = this,
|
2650
3026
|
url = t.slides.entries.text[index],
|
2651
3027
|
img = t.slides.entries.imgs[index];
|
2652
|
-
|
3028
|
+
|
2653
3029
|
if (typeof img == 'undefined' || typeof img.fadeIn == 'undefined') {
|
2654
3030
|
|
2655
3031
|
t.slides.entries.imgs[index] = img = $('<img src="' + url + '">')
|
@@ -2658,46 +3034,46 @@ if (typeof jQuery != 'undefined') {
|
|
2658
3034
|
.hide()
|
2659
3035
|
.fadeIn()
|
2660
3036
|
.siblings(':visible')
|
2661
|
-
.fadeOut();
|
2662
|
-
|
3037
|
+
.fadeOut();
|
3038
|
+
|
2663
3039
|
});
|
2664
|
-
|
3040
|
+
|
2665
3041
|
} else {
|
2666
|
-
|
3042
|
+
|
2667
3043
|
if (!img.is(':visible') && !img.is(':animated')) {
|
2668
|
-
|
2669
|
-
//
|
2670
|
-
|
3044
|
+
|
3045
|
+
//
|
3046
|
+
|
2671
3047
|
img.fadeIn()
|
2672
3048
|
.siblings(':visible')
|
2673
|
-
.fadeOut();
|
3049
|
+
.fadeOut();
|
2674
3050
|
}
|
2675
3051
|
}
|
2676
|
-
|
3052
|
+
|
2677
3053
|
},
|
2678
|
-
|
3054
|
+
|
2679
3055
|
displaySlides: function() {
|
2680
|
-
|
3056
|
+
|
2681
3057
|
if (typeof this.slides == 'undefined')
|
2682
|
-
return;
|
2683
|
-
|
2684
|
-
var
|
3058
|
+
return;
|
3059
|
+
|
3060
|
+
var
|
2685
3061
|
t = this,
|
2686
3062
|
slides = t.slides,
|
2687
|
-
i;
|
2688
|
-
|
3063
|
+
i;
|
3064
|
+
|
2689
3065
|
for (i=0; i<slides.entries.times.length; i++) {
|
2690
3066
|
if (t.media.currentTime >= slides.entries.times[i].start && t.media.currentTime <= slides.entries.times[i].stop){
|
2691
|
-
|
3067
|
+
|
2692
3068
|
t.showSlide(i);
|
2693
|
-
|
3069
|
+
|
2694
3070
|
return; // exit out if one is visible;
|
2695
3071
|
}
|
2696
3072
|
}
|
2697
3073
|
},
|
2698
3074
|
|
2699
3075
|
displayChapters: function() {
|
2700
|
-
var
|
3076
|
+
var
|
2701
3077
|
t = this,
|
2702
3078
|
i;
|
2703
3079
|
|
@@ -2711,7 +3087,7 @@ if (typeof jQuery != 'undefined') {
|
|
2711
3087
|
},
|
2712
3088
|
|
2713
3089
|
drawChapters: function(chapters) {
|
2714
|
-
var
|
3090
|
+
var
|
2715
3091
|
t = this,
|
2716
3092
|
i,
|
2717
3093
|
dur,
|
@@ -2737,10 +3113,10 @@ if (typeof jQuery != 'undefined') {
|
|
2737
3113
|
//}
|
2738
3114
|
|
2739
3115
|
t.chapters.append( $(
|
2740
|
-
'<div class="mejs-chapter" rel="' + chapters.entries.times[i].start + '" style="left: ' + usedPercent.toString() + '%;width: ' + percent.toString() + '%;">' +
|
2741
|
-
'<div class="mejs-chapter-block' + ((i==chapters.entries.times.length-1) ? ' mejs-chapter-block-last' : '') + '">' +
|
2742
|
-
'<span class="ch-title">' + chapters.entries.text[i] + '</span>' +
|
2743
|
-
'<span class="ch-time">' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].start) + '–' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].stop) + '</span>' +
|
3116
|
+
'<div class="mejs-chapter" rel="' + chapters.entries.times[i].start + '" style="left: ' + usedPercent.toString() + '%;width: ' + percent.toString() + '%;">' +
|
3117
|
+
'<div class="mejs-chapter-block' + ((i==chapters.entries.times.length-1) ? ' mejs-chapter-block-last' : '') + '">' +
|
3118
|
+
'<span class="ch-title">' + chapters.entries.text[i] + '</span>' +
|
3119
|
+
'<span class="ch-time">' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].start) + '–' + mejs.Utility.secondsToTimeCode(chapters.entries.times[i].stop) + '</span>' +
|
2744
3120
|
'</div>' +
|
2745
3121
|
'</div>'));
|
2746
3122
|
usedPercent += percent;
|
@@ -2749,7 +3125,7 @@ if (typeof jQuery != 'undefined') {
|
|
2749
3125
|
t.chapters.find('div.mejs-chapter').click(function() {
|
2750
3126
|
t.media.setCurrentTime( parseFloat( $(this).attr('rel') ) );
|
2751
3127
|
if (t.media.paused) {
|
2752
|
-
t.media.play();
|
3128
|
+
t.media.play();
|
2753
3129
|
}
|
2754
3130
|
});
|
2755
3131
|
|
@@ -2776,7 +3152,7 @@ if (typeof jQuery != 'undefined') {
|
|
2776
3152
|
nl:'Dutch',
|
2777
3153
|
en:'English',
|
2778
3154
|
et:'Estonian',
|
2779
|
-
|
3155
|
+
fl:'Filipino',
|
2780
3156
|
fi:'Finnish',
|
2781
3157
|
fr:'French',
|
2782
3158
|
gl:'Galician',
|
@@ -2801,7 +3177,7 @@ if (typeof jQuery != 'undefined') {
|
|
2801
3177
|
fa:'Persian',
|
2802
3178
|
pl:'Polish',
|
2803
3179
|
pt:'Portuguese',
|
2804
|
-
//'pt-pt':'Portuguese (Portugal)',
|
3180
|
+
// 'pt-pt':'Portuguese (Portugal)',
|
2805
3181
|
ro:'Romanian',
|
2806
3182
|
ru:'Russian',
|
2807
3183
|
sr:'Serbian',
|
@@ -2821,10 +3197,10 @@ if (typeof jQuery != 'undefined') {
|
|
2821
3197
|
};
|
2822
3198
|
|
2823
3199
|
/*
|
2824
|
-
Parses
|
3200
|
+
Parses WebVTT format which should be formatted as
|
2825
3201
|
================================
|
2826
3202
|
WEBVTT
|
2827
|
-
|
3203
|
+
|
2828
3204
|
1
|
2829
3205
|
00:00:01,1 --> 00:00:05,000
|
2830
3206
|
A line of text
|
@@ -2832,51 +3208,50 @@ if (typeof jQuery != 'undefined') {
|
|
2832
3208
|
2
|
2833
3209
|
00:01:15,1 --> 00:02:05,000
|
2834
3210
|
A second line of text
|
2835
|
-
|
3211
|
+
|
2836
3212
|
===============================
|
2837
3213
|
|
2838
3214
|
Adapted from: http://www.delphiki.com/html5/playr
|
2839
3215
|
*/
|
2840
3216
|
mejs.TrackFormatParser = {
|
2841
|
-
|
2842
|
-
|
2843
|
-
pattern_identifier: /^([a-zA-z]+-)?[0-9]+$/,
|
2844
|
-
pattern_timecode: /^([0-9]{2}:[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ([0-9]{2}:[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/,
|
3217
|
+
webvtt: {
|
3218
|
+
pattern_timecode: /^((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{1,3})?) --\> ((?:[0-9]{1,2}:)?[0-9]{2}:[0-9]{2}([,.][0-9]{3})?)(.*)$/,
|
2845
3219
|
|
2846
3220
|
parse: function(trackText) {
|
2847
|
-
var
|
3221
|
+
var
|
2848
3222
|
i = 0,
|
2849
3223
|
lines = mejs.TrackFormatParser.split2(trackText, /\r?\n/),
|
2850
3224
|
entries = {text:[], times:[]},
|
2851
3225
|
timecode,
|
2852
|
-
text
|
3226
|
+
text,
|
3227
|
+
identifier;
|
2853
3228
|
for(; i<lines.length; i++) {
|
2854
|
-
|
2855
|
-
if (this.pattern_identifier.exec(lines[i])){
|
2856
|
-
// skip to the next line where the start --> end time code should be
|
2857
|
-
i++;
|
2858
|
-
timecode = this.pattern_timecode.exec(lines[i]);
|
3229
|
+
timecode = this.pattern_timecode.exec(lines[i]);
|
2859
3230
|
|
2860
|
-
|
2861
|
-
|
2862
|
-
|
2863
|
-
|
3231
|
+
if (timecode && i<lines.length) {
|
3232
|
+
if ((i - 1) >= 0 && lines[i - 1] !== '') {
|
3233
|
+
identifier = lines[i - 1];
|
3234
|
+
}
|
3235
|
+
i++;
|
3236
|
+
// grab all the (possibly multi-line) text that follows
|
3237
|
+
text = lines[i];
|
3238
|
+
i++;
|
3239
|
+
while(lines[i] !== '' && i<lines.length){
|
3240
|
+
text = text + '\n' + lines[i];
|
2864
3241
|
i++;
|
2865
|
-
while(lines[i] !== '' && i<lines.length){
|
2866
|
-
text = text + '\n' + lines[i];
|
2867
|
-
i++;
|
2868
|
-
}
|
2869
|
-
text = $.trim(text).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>");
|
2870
|
-
// Text is in a different array so I can use .join
|
2871
|
-
entries.text.push(text);
|
2872
|
-
entries.times.push(
|
2873
|
-
{
|
2874
|
-
start: (mejs.Utility.convertSMPTEtoSeconds(timecode[1]) == 0) ? 0.200 : mejs.Utility.convertSMPTEtoSeconds(timecode[1]),
|
2875
|
-
stop: mejs.Utility.convertSMPTEtoSeconds(timecode[3]),
|
2876
|
-
settings: timecode[5]
|
2877
|
-
});
|
2878
3242
|
}
|
3243
|
+
text = $.trim(text).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>");
|
3244
|
+
// Text is in a different array so I can use .join
|
3245
|
+
entries.text.push(text);
|
3246
|
+
entries.times.push(
|
3247
|
+
{
|
3248
|
+
identifier: identifier,
|
3249
|
+
start: (mejs.Utility.convertSMPTEtoSeconds(timecode[1]) === 0) ? 0.200 : mejs.Utility.convertSMPTEtoSeconds(timecode[1]),
|
3250
|
+
stop: mejs.Utility.convertSMPTEtoSeconds(timecode[3]),
|
3251
|
+
settings: timecode[5]
|
3252
|
+
});
|
2879
3253
|
}
|
3254
|
+
identifier = '';
|
2880
3255
|
}
|
2881
3256
|
return entries;
|
2882
3257
|
}
|
@@ -2885,7 +3260,7 @@ if (typeof jQuery != 'undefined') {
|
|
2885
3260
|
dfxp: {
|
2886
3261
|
parse: function(trackText) {
|
2887
3262
|
trackText = $(trackText).filter("tt");
|
2888
|
-
var
|
3263
|
+
var
|
2889
3264
|
i = 0,
|
2890
3265
|
container = trackText.children("div").eq(0),
|
2891
3266
|
lines = container.find("p"),
|
@@ -2921,15 +3296,15 @@ if (typeof jQuery != 'undefined') {
|
|
2921
3296
|
if (styles) {
|
2922
3297
|
style = "";
|
2923
3298
|
for (var _style in styles) {
|
2924
|
-
style += _style + ":" + styles[_style] + ";";
|
3299
|
+
style += _style + ":" + styles[_style] + ";";
|
2925
3300
|
}
|
2926
3301
|
}
|
2927
3302
|
if (style) _temp_times.style = style;
|
2928
|
-
if (_temp_times.start
|
3303
|
+
if (_temp_times.start === 0) _temp_times.start = 0.200;
|
2929
3304
|
entries.times.push(_temp_times);
|
2930
3305
|
text = $.trim(lines.eq(i).html()).replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, "<a href='$1' target='_blank'>$1</a>");
|
2931
3306
|
entries.text.push(text);
|
2932
|
-
if (entries.times.start
|
3307
|
+
if (entries.times.start === 0) entries.times.start = 2;
|
2933
3308
|
}
|
2934
3309
|
return entries;
|
2935
3310
|
}
|
@@ -2940,13 +3315,13 @@ if (typeof jQuery != 'undefined') {
|
|
2940
3315
|
return text.split(regex);
|
2941
3316
|
}
|
2942
3317
|
};
|
2943
|
-
|
3318
|
+
|
2944
3319
|
// test for browsers with bad String.split method.
|
2945
3320
|
if ('x\n\ny'.split(/\n/gi).length != 3) {
|
2946
3321
|
// add super slow IE8 and below version
|
2947
3322
|
mejs.TrackFormatParser.split2 = function(text, regex) {
|
2948
|
-
var
|
2949
|
-
parts = [],
|
3323
|
+
var
|
3324
|
+
parts = [],
|
2950
3325
|
chunk = '',
|
2951
3326
|
i;
|
2952
3327
|
|
@@ -2959,8 +3334,8 @@ if (typeof jQuery != 'undefined') {
|
|
2959
3334
|
}
|
2960
3335
|
parts.push(chunk);
|
2961
3336
|
return parts;
|
2962
|
-
}
|
2963
|
-
}
|
3337
|
+
};
|
3338
|
+
}
|
2964
3339
|
|
2965
3340
|
})(mejs.$);
|
2966
3341
|
|
@@ -3195,4 +3570,4 @@ $.extend(mejs.MepDefaults,
|
|
3195
3570
|
}
|
3196
3571
|
});
|
3197
3572
|
|
3198
|
-
})(mejs.$);
|
3573
|
+
})(mejs.$);
|