aboutsummaryrefslogtreecommitdiffstats
path: root/src/js/plyr.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/plyr.js')
-rw-r--r--src/js/plyr.js143
1 files changed, 69 insertions, 74 deletions
diff --git a/src/js/plyr.js b/src/js/plyr.js
index d04972a8..81cd6f15 100644
--- a/src/js/plyr.js
+++ b/src/js/plyr.js
@@ -817,12 +817,9 @@
// Inject the container
if (!_getElement(config.selectors.captions)) {
- plyr.videoContainer.insertAdjacentHTML('afterbegin', '<div class="' + _getClassname(config.selectors.captions) + '"><span></span></div>');
+ plyr.videoContainer.insertAdjacentHTML('afterbegin', '<div class="' + _getClassname(config.selectors.captions) + '"></div>');
}
- // Cache selector
- plyr.captionsContainer = _getElement(config.selectors.captions).querySelector('span');
-
// Determine if HTML5 textTracks is supported
plyr.usingTextTracks = false;
if (plyr.media.textTracks) {
@@ -870,14 +867,12 @@
_showCaptions(plyr);
// Disable unsupported browsers than report false positive
+ // Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1033144
if ((plyr.browser.name === 'IE' && plyr.browser.version >= 10) ||
(plyr.browser.name === 'Firefox' && plyr.browser.version >= 31)) {
- // ||
- //(plyr.browser.name === 'Chrome' && plyr.browser.version >= 43) ||
- //(plyr.browser.name === 'Safari' && plyr.browser.version >= 7)) {
// Debugging
- _log('Detected unsupported browser for HTML5 captions - using fallback');
+ _log('Detected browser with known TextTrack issues - using manual fallback');
// Set to false so skips to 'manual' captioning
plyr.usingTextTracks = false;
@@ -893,20 +888,12 @@
if (track.kind === 'captions' || track.kind === 'subtitles') {
_on(track, 'cuechange', function() {
- console.log('cuechange');
- console.log(this);
-
- // Clear container
- plyr.captionsContainer.innerHTML = '';
-
// Display a cue, if there is one
if (this.activeCues[0] && 'text' in this.activeCues[0]) {
- console.log(this.activeCues[0].getCueAsHTML());
-
- plyr.captionsContainer.appendChild(this.activeCues[0].getCueAsHTML());
-
- // Force redraw
- var redraw = plyr.captionsContainer.offsetHeight;
+ _setCaption(this.activeCues[0].getCueAsHTML());
+ }
+ else {
+ _setCaption();
}
});
}
@@ -955,25 +942,72 @@
xhr.send();
}
}
+ }
+ }
- // If Safari 7+, removing track from DOM [see 'turn off native caption rendering' above]
- /*if (plyr.browser.name === 'Safari' && plyr.browser.version >= 7) {
- _log('Safari 7+ detected; removing track from DOM');
+ // Set the current caption
+ function _setCaption(caption) {
+ var container = _getElement(config.selectors.captions),
+ content = document.createElement('span');
- // Find all <track> elements
- tracks = plyr.media.getElementsByTagName('track');
+ // Empty the container
+ container.innerHTML = '';
- // Loop through and remove one by one
- for (var t = 0; t < tracks.length; t++) {
- plyr.media.removeChild(tracks[t]);
- }
- }*/
+ // Default to empty
+ if(typeof caption === 'undefined') {
+ caption = '';
}
+
+ // Set the span content
+ if(typeof caption === 'string') {
+ content.innerHTML = caption.trim();
+ }
+ else {
+ content.appendChild(caption);
+ }
+
+ // Set new caption text
+ container.appendChild(content);
+
+ // Force redraw
+ var redraw = container.offsetHeight;
}
// Captions functions
// Seek the manual caption time and update UI
function _seekManualCaptions(time) {
+ // Utilities for caption time codes
+ function _timecodeCommon(tc, pos) {
+ var tcpair = [];
+ tcpair = tc.split(' --> ');
+ for(var i = 0; i < tcpair.length; i++) {
+ // WebVTT allows for extra meta data after the timestamp line
+ // So get rid of this if it exists
+ tcpair[i] = tcpair[i].replace(/(\d+:\d+:\d+\.\d+).*/, "$1");
+ }
+ return _subTcSecs(tcpair[pos]);
+ }
+ function _timecodeMin(tc) {
+ return _timecodeCommon(tc, 0);
+ }
+ function _timecodeMax(tc) {
+ return _timecodeCommon(tc, 1);
+ }
+ function _subTcSecs(tc) {
+ if (tc === null || tc === undefined) {
+ return 0;
+ }
+ else {
+ var tc1 = [],
+ tc2 = [],
+ seconds;
+ tc1 = tc.split(',');
+ tc2 = tc1[0].split(':');
+ seconds = Math.floor(tc2[0]*60*60) + Math.floor(tc2[1]*60) + Math.floor(tc2[2]);
+ return seconds;
+ }
+ }
+
// If it's not video, or we're using textTracks, bail.
if (plyr.usingTextTracks || plyr.type !== 'video' || !plyr.supported.full) {
return;
@@ -1005,25 +1039,12 @@
plyr.media.currentTime.toFixed(1) <= _timecodeMax(plyr.captions[plyr.subcount][0])) {
plyr.currentCaption = plyr.captions[plyr.subcount][1];
- // Trim caption text
- var content = plyr.currentCaption.trim();
-
- // Render the caption (only if changed)
- if (plyr.captionsContainer.innerHTML != content) {
- // Empty caption
- // Otherwise NVDA reads it twice
- plyr.captionsContainer.innerHTML = '';
-
- // Set new caption text
- plyr.captionsContainer.innerHTML = content;
- }
+ // Render the caption
+ _setCaption(plyr.currentCaption);
}
else {
- plyr.captionsContainer.innerHTML = '';
+ _setCaption('');
}
-
- // Force redraw
- // var redraw = plyr.captionsContainer.offsetHeight;
}
// Display captions container and button (for initialization)
@@ -1041,32 +1062,6 @@
}
}
- // Utilities for caption time codes
- function _timecodeMin(tc) {
- var tcpair = [];
- tcpair = tc.split(' --> ');
- return _subTcSecs(tcpair[0]);
- }
- function _timecodeMax(tc) {
- var tcpair = [];
- tcpair = tc.split(' --> ');
- return _subTcSecs(tcpair[1]);
- }
- function _subTcSecs(tc) {
- if (tc === null || tc === undefined) {
- return 0;
- }
- else {
- var tc1 = [],
- tc2 = [],
- seconds;
- tc1 = tc.split(',');
- tc2 = tc1[0].split(':');
- seconds = Math.floor(tc2[0]*60*60) + Math.floor(tc2[1]*60) + Math.floor(tc2[2]);
- return seconds;
- }
- }
-
// Find all elements
function _getElements(selector) {
return plyr.container.querySelectorAll(selector);
@@ -2444,7 +2439,7 @@
if (config.fullscreen.hideControls) {
// Keep an eye on the mouse location in relation to controls
- _on(plyr.controls, 'mouseenter mouseleave', function() {
+ _on(plyr.controls, 'mouseenter mouseleave', function(event) {
plyr.controls.mouseover = (event.type === 'mouseenter');
});
}
@@ -2465,7 +2460,7 @@
_on(plyr.media, 'ended', function() {
// Clear
if (plyr.type === 'video') {
- plyr.captionsContainer.innerHTML = '';
+ _setCaption('');
}
// Reset UI