From e2340fdf59532362b6e7005e3f7c123db4505d01 Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Mon, 4 Oct 2021 15:51:16 +0200 Subject: [PATCH] wait #4735 @0:30 --- js/libs/videojs/Youtube.js | 1409 +- js/libs/videojs/lang/ar.js | 118 +- js/libs/videojs/lang/ar.json | 86 + js/libs/videojs/lang/ba.js | 50 +- js/libs/videojs/lang/ba.json | 26 + js/libs/videojs/lang/bg.js | 50 +- js/libs/videojs/lang/bg.json | 26 + js/libs/videojs/lang/ca.js | 50 +- js/libs/videojs/lang/ca.json | 26 + js/libs/videojs/lang/cs.js | 109 +- js/libs/videojs/lang/cs.json | 85 + js/libs/videojs/lang/cy.js | 85 + js/libs/videojs/lang/cy.json | 85 + js/libs/videojs/lang/da.js | 50 +- js/libs/videojs/lang/da.json | 26 + js/libs/videojs/lang/de.js | 171 +- js/libs/videojs/lang/de.json | 90 + js/libs/videojs/lang/el.js | 78 +- js/libs/videojs/lang/el.json | 40 + js/libs/videojs/lang/en.js | 171 +- js/libs/videojs/lang/en.json | 89 + js/libs/videojs/lang/es.js | 114 +- js/libs/videojs/lang/es.json | 89 + js/libs/videojs/lang/fa.js | 113 +- js/libs/videojs/lang/fa.json | 89 + js/libs/videojs/lang/fi.js | 50 +- js/libs/videojs/lang/fi.json | 26 + js/libs/videojs/lang/fr.js | 166 +- js/libs/videojs/lang/fr.json | 84 + js/libs/videojs/lang/gd.js | 87 + js/libs/videojs/lang/gd.json | 87 + js/libs/videojs/lang/gl.js | 112 +- js/libs/videojs/lang/gl.json | 87 + js/libs/videojs/lang/he.js | 166 +- js/libs/videojs/lang/he.json | 84 + js/libs/videojs/lang/hi.js | 89 + js/libs/videojs/lang/hi.json | 89 + js/libs/videojs/lang/hr.js | 50 +- js/libs/videojs/lang/hr.json | 26 + js/libs/videojs/lang/hu.js | 113 +- js/libs/videojs/lang/hu.json | 89 + js/libs/videojs/lang/it.js | 50 +- js/libs/videojs/lang/it.json | 26 + js/libs/videojs/lang/ja.js | 50 +- js/libs/videojs/lang/ja.json | 26 + js/libs/videojs/lang/ko.js | 50 +- js/libs/videojs/lang/ko.json | 26 + js/libs/videojs/lang/nb.js | 111 +- js/libs/videojs/lang/nb.json | 87 + js/libs/videojs/lang/nl.js | 166 +- js/libs/videojs/lang/nl.json | 84 + js/libs/videojs/lang/nn.js | 111 +- js/libs/videojs/lang/nn.json | 87 + js/libs/videojs/lang/oc.js | 87 + js/libs/videojs/lang/oc.json | 87 + js/libs/videojs/lang/pl.js | 66 +- js/libs/videojs/lang/pl.json | 34 + js/libs/videojs/lang/pt-BR.js | 111 +- js/libs/videojs/lang/pt-BR.json | 88 + js/libs/videojs/lang/pt-PT.js | 80 +- js/libs/videojs/lang/pt-PT.json | 41 + js/libs/videojs/lang/ro.js | 89 + js/libs/videojs/lang/ro.json | 89 + js/libs/videojs/lang/ru.js | 167 +- js/libs/videojs/lang/ru.json | 85 + js/libs/videojs/lang/sk.js | 167 +- js/libs/videojs/lang/sk.json | 85 + js/libs/videojs/lang/sl.js | 83 + js/libs/videojs/lang/sl.json | 83 + js/libs/videojs/lang/sr.js | 50 +- js/libs/videojs/lang/sr.json | 26 + js/libs/videojs/lang/sv.js | 111 +- js/libs/videojs/lang/sv.json | 87 + js/libs/videojs/lang/th.js | 89 + js/libs/videojs/lang/th.json | 89 + js/libs/videojs/lang/tr.js | 150 +- js/libs/videojs/lang/tr.json | 76 + js/libs/videojs/lang/uk.js | 123 +- js/libs/videojs/lang/uk.json | 85 + js/libs/videojs/lang/vi.js | 166 +- js/libs/videojs/lang/vi.json | 84 + js/libs/videojs/lang/zh-CN.js | 127 +- js/libs/videojs/lang/zh-CN.json | 89 + js/libs/videojs/lang/zh-Hans.js | 89 + js/libs/videojs/lang/zh-Hans.json | 89 + js/libs/videojs/lang/zh-Hant.js | 87 + js/libs/videojs/lang/zh-Hant.json | 87 + js/libs/videojs/lang/zh-TW.js | 125 +- js/libs/videojs/lang/zh-TW.json | 87 + js/libs/videojs/video.min.js | 27 + js/libs/videojs/video.withscalefix.js | 25277 ------------------------ style/videojs/video-js-core.css | 1396 -- style/videojs/video-js.min.css | 1 + style/videojs/videojs.less | 6 +- 94 files changed, 6818 insertions(+), 28851 deletions(-) create mode 100644 js/libs/videojs/lang/ar.json create mode 100644 js/libs/videojs/lang/ba.json create mode 100644 js/libs/videojs/lang/bg.json create mode 100644 js/libs/videojs/lang/ca.json create mode 100644 js/libs/videojs/lang/cs.json create mode 100644 js/libs/videojs/lang/cy.js create mode 100644 js/libs/videojs/lang/cy.json create mode 100644 js/libs/videojs/lang/da.json create mode 100644 js/libs/videojs/lang/de.json create mode 100644 js/libs/videojs/lang/el.json create mode 100644 js/libs/videojs/lang/en.json create mode 100644 js/libs/videojs/lang/es.json create mode 100644 js/libs/videojs/lang/fa.json create mode 100644 js/libs/videojs/lang/fi.json create mode 100644 js/libs/videojs/lang/fr.json create mode 100644 js/libs/videojs/lang/gd.js create mode 100644 js/libs/videojs/lang/gd.json create mode 100644 js/libs/videojs/lang/gl.json create mode 100644 js/libs/videojs/lang/he.json create mode 100644 js/libs/videojs/lang/hi.js create mode 100644 js/libs/videojs/lang/hi.json create mode 100644 js/libs/videojs/lang/hr.json create mode 100644 js/libs/videojs/lang/hu.json create mode 100644 js/libs/videojs/lang/it.json create mode 100644 js/libs/videojs/lang/ja.json create mode 100644 js/libs/videojs/lang/ko.json create mode 100644 js/libs/videojs/lang/nb.json create mode 100644 js/libs/videojs/lang/nl.json create mode 100644 js/libs/videojs/lang/nn.json create mode 100644 js/libs/videojs/lang/oc.js create mode 100644 js/libs/videojs/lang/oc.json create mode 100644 js/libs/videojs/lang/pl.json create mode 100644 js/libs/videojs/lang/pt-BR.json create mode 100644 js/libs/videojs/lang/pt-PT.json create mode 100644 js/libs/videojs/lang/ro.js create mode 100644 js/libs/videojs/lang/ro.json create mode 100644 js/libs/videojs/lang/ru.json create mode 100644 js/libs/videojs/lang/sk.json create mode 100644 js/libs/videojs/lang/sl.js create mode 100644 js/libs/videojs/lang/sl.json create mode 100644 js/libs/videojs/lang/sr.json create mode 100644 js/libs/videojs/lang/sv.json create mode 100644 js/libs/videojs/lang/th.js create mode 100644 js/libs/videojs/lang/th.json create mode 100644 js/libs/videojs/lang/tr.json create mode 100644 js/libs/videojs/lang/uk.json create mode 100644 js/libs/videojs/lang/vi.json create mode 100644 js/libs/videojs/lang/zh-CN.json create mode 100644 js/libs/videojs/lang/zh-Hans.js create mode 100644 js/libs/videojs/lang/zh-Hans.json create mode 100644 js/libs/videojs/lang/zh-Hant.js create mode 100644 js/libs/videojs/lang/zh-Hant.json create mode 100644 js/libs/videojs/lang/zh-TW.json create mode 100644 js/libs/videojs/video.min.js delete mode 100644 js/libs/videojs/video.withscalefix.js delete mode 100755 style/videojs/video-js-core.css create mode 100644 style/videojs/video-js.min.css diff --git a/js/libs/videojs/Youtube.js b/js/libs/videojs/Youtube.js index 4798e911..d4104abb 100755 --- a/js/libs/videojs/Youtube.js +++ b/js/libs/videojs/Youtube.js @@ -21,729 +21,744 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*global define, YT*/ (function (root, factory) { - if(typeof exports==='object' && typeof module!=='undefined') { - module.exports = factory(require('video.js')); - } else if(typeof define === 'function' && define.amd) { - define(['videojs'], function(videojs){ - return (root.Youtube = factory(videojs)); - }); - } else { - root.Youtube = factory(root.videojs); - } -}(this, function(videojs) { - 'use strict'; - - var _isOnMobile = videojs.browser.IS_IOS || videojs.browser.IS_ANDROID; - var Tech = videojs.getTech('Tech'); - - var Youtube = videojs.extend(Tech, { - - constructor: function(options, ready) { - Tech.call(this, options, ready); - - this.setPoster(options.poster); - this.setSrc(this.options_.source, true); - - // Set the vjs-youtube class to the player - // Parent is not set yet so we have to wait a tick - this.setTimeout(function() { - if (this.el_) { - this.el_.parentNode.className += ' vjs-youtube'; - - if (_isOnMobile) { - this.el_.parentNode.className += ' vjs-youtube-mobile'; - } - - if (Youtube.isApiReady) { - this.initYTPlayer(); - } else { - Youtube.apiReadyQueue.push(this); - } - } - }.bind(this)); - }, - - dispose: function() { - if (this.ytPlayer) { - //Dispose of the YouTube Player - if (this.ytPlayer.stopVideo) { - this.ytPlayer.stopVideo(); - } - if (this.ytPlayer.destroy) { - this.ytPlayer.destroy(); - } - } else { - //YouTube API hasn't finished loading or the player is already disposed - var index = Youtube.apiReadyQueue.indexOf(this); - if (index !== -1) { - Youtube.apiReadyQueue.splice(index, 1); - } - } - this.ytPlayer = null; - - this.el_.parentNode.className = this.el_.parentNode.className - .replace(' vjs-youtube', '') - .replace(' vjs-youtube-mobile', ''); - this.el_.parentNode.removeChild(this.el_); - - //Needs to be called after the YouTube player is destroyed, otherwise there will be a null reference exception - Tech.prototype.dispose.call(this); - }, - - createEl: function() { - var div = document.createElement('div'); - div.setAttribute('id', this.options_.techId); - div.setAttribute('style', 'width:100%;height:100%;top:0;left:0;position:absolute'); - div.setAttribute('class', 'vjs-tech'); - - var divWrapper = document.createElement('div'); - divWrapper.appendChild(div); - - if (!_isOnMobile && !this.options_.ytControls) { - var divBlocker = document.createElement('div'); - divBlocker.setAttribute('class', 'vjs-iframe-blocker'); - divBlocker.setAttribute('style', 'position:absolute;top:0;left:0;width:100%;height:100%'); - - // In case the blocker is still there and we want to pause - divBlocker.onclick = function() { - this.pause(); - }.bind(this); - - divWrapper.appendChild(divBlocker); - } - - return divWrapper; - }, - - initYTPlayer: function() { - var playerVars = { - controls: 0, - modestbranding: 1, - rel: 0, - showinfo: 0, - loop: this.options_.loop ? 1 : 0 - }; - - // Let the user set any YouTube parameter - // https://developers.google.com/youtube/player_parameters?playerVersion=HTML5#Parameters - // To use YouTube controls, you must use ytControls instead - // To use the loop or autoplay, use the video.js settings - - if (typeof this.options_.autohide !== 'undefined') { - playerVars.autohide = this.options_.autohide; - } - - if (typeof this.options_['cc_load_policy'] !== 'undefined') { - playerVars['cc_load_policy'] = this.options_['cc_load_policy']; - } - - if (typeof this.options_.ytControls !== 'undefined') { - playerVars.controls = this.options_.ytControls; - } - - if (typeof this.options_.disablekb !== 'undefined') { - playerVars.disablekb = this.options_.disablekb; - } - - if (typeof this.options_.end !== 'undefined') { - playerVars.end = this.options_.end; - } - - if (typeof this.options_.color !== 'undefined') { - playerVars.color = this.options_.color; - } - - if (!playerVars.controls) { - // Let video.js handle the fullscreen unless it is the YouTube native controls - playerVars.fs = 0; - } else if (typeof this.options_.fs !== 'undefined') { - playerVars.fs = this.options_.fs; - } - - if (typeof this.options_.end !== 'undefined') { - playerVars.end = this.options_.end; - } - - if (typeof this.options_.hl !== 'undefined') { - playerVars.hl = this.options_.hl; - } else if (typeof this.options_.language !== 'undefined') { - // Set the YouTube player on the same language than video.js - playerVars.hl = this.options_.language.substr(0, 2); - } - - if (typeof this.options_['iv_load_policy'] !== 'undefined') { - playerVars['iv_load_policy'] = this.options_['iv_load_policy']; - } - - if (typeof this.options_.list !== 'undefined') { - playerVars.list = this.options_.list; - } else if (this.url && typeof this.url.listId !== 'undefined') { - playerVars.list = this.url.listId; - } - - if (typeof this.options_.listType !== 'undefined') { - playerVars.listType = this.options_.listType; - } - - if (typeof this.options_.modestbranding !== 'undefined') { - playerVars.modestbranding = this.options_.modestbranding; - } - - if (typeof this.options_.playlist !== 'undefined') { - playerVars.playlist = this.options_.playlist; - } - - if (typeof this.options_.playsinline !== 'undefined') { - playerVars.playsinline = this.options_.playsinline; - } - - if (typeof this.options_.rel !== 'undefined') { - playerVars.rel = this.options_.rel; - } - - if (typeof this.options_.showinfo !== 'undefined') { - playerVars.showinfo = this.options_.showinfo; - } - - if (typeof this.options_.start !== 'undefined') { - playerVars.start = this.options_.start; - } - - if (typeof this.options_.theme !== 'undefined') { - playerVars.theme = this.options_.theme; - } - - // Allow undocumented options to be passed along via customVars - if (typeof this.options_.customVars !== 'undefined') { - var customVars = this.options_.customVars; - Object.keys(customVars).forEach(function(key) { - playerVars[key] = customVars[key]; + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = factory(require('video.js')); + } else if (typeof define === 'function' && define.amd) { + define(['videojs'], function (videojs) { + return (root.Youtube = factory(videojs)); }); - } - - this.activeVideoId = this.url ? this.url.videoId : null; - this.activeList = playerVars.list; - - this.ytPlayer = new YT.Player(this.options_.techId, { - videoId: this.activeVideoId, - playerVars: playerVars, - events: { - onReady: this.onPlayerReady.bind(this), - onPlaybackQualityChange: this.onPlayerPlaybackQualityChange.bind(this), - onPlaybackRateChange: this.onPlayerPlaybackRateChange.bind(this), - onStateChange: this.onPlayerStateChange.bind(this), - onVolumeChange: this.onPlayerVolumeChange.bind(this), - onError: this.onPlayerError.bind(this) - } - }); - }, - - onPlayerReady: function() { - if (this.options_.muted) { - this.ytPlayer.mute(); - } - - var playbackRates = this.ytPlayer.getAvailablePlaybackRates(); - if (playbackRates.length > 1) { - this.featuresPlaybackRate = true; - } - - this.playerReady_ = true; - this.triggerReady(); - - if (this.playOnReady) { - this.play(); - } else if (this.cueOnReady) { - this.cueVideoById_(this.url.videoId); - this.activeVideoId = this.url.videoId; - } - }, - - onPlayerPlaybackQualityChange: function() { - - }, - - onPlayerPlaybackRateChange: function() { - this.trigger('ratechange'); - }, - - onPlayerStateChange: function(e) { - var state = e.data; - - if (state === this.lastState || this.errorNumber) { - return; - } - - this.lastState = state; - - switch (state) { - case -1: - this.trigger('loadstart'); - this.trigger('loadedmetadata'); - this.trigger('durationchange'); - this.trigger('ratechange'); - break; - - case YT.PlayerState.ENDED: - this.trigger('ended'); - break; - - case YT.PlayerState.PLAYING: - this.trigger('timeupdate'); - this.trigger('durationchange'); - this.trigger('playing'); - this.trigger('play'); - - if (this.isSeeking) { - this.onSeeked(); - } - break; - - case YT.PlayerState.PAUSED: - this.trigger('canplay'); - if (this.isSeeking) { - this.onSeeked(); - } else { + } else { + root.Youtube = factory(root.videojs); + } +}(this, function (videojs) { + 'use strict'; + + var _isOnMobile = videojs.browser.IS_IOS || videojs.browser.IS_ANDROID; + var Tech = videojs.getTech('Tech'); + + var Youtube = videojs.extend(Tech, { + + constructor: function (options, ready) { + Tech.call(this, options, ready); + + this.setPoster(options.poster); + this.setSrc(this.options_.source, true); + + // Set the vjs-youtube class to the player + // Parent is not set yet so we have to wait a tick + this.setTimeout(function () { + if (this.el_) { + this.el_.parentNode.className += ' vjs-youtube'; + + if (_isOnMobile) { + this.el_.parentNode.className += ' vjs-youtube-mobile'; + } + + if (Youtube.isApiReady) { + this.initYTPlayer(); + } else { + Youtube.apiReadyQueue.push(this); + } + } + }.bind(this)); + }, + + dispose: function () { + if (this.ytPlayer) { + //Dispose of the YouTube Player + if (this.ytPlayer.stopVideo) { + this.ytPlayer.stopVideo(); + } + if (this.ytPlayer.destroy) { + this.ytPlayer.destroy(); + } + } else { + //YouTube API hasn't finished loading or the player is already disposed + var index = Youtube.apiReadyQueue.indexOf(this); + if (index !== -1) { + Youtube.apiReadyQueue.splice(index, 1); + } + } + this.ytPlayer = null; + + this.el_.parentNode.className = this.el_.parentNode.className + .replace(' vjs-youtube', '') + .replace(' vjs-youtube-mobile', ''); + this.el_.parentNode.removeChild(this.el_); + + //Needs to be called after the YouTube player is destroyed, otherwise there will be a null reference exception + Tech.prototype.dispose.call(this); + }, + + createEl: function () { + var div = document.createElement('div'); + div.setAttribute('id', this.options_.techId); + div.setAttribute('style', 'width:100%;height:100%;top:0;left:0;position:absolute'); + div.setAttribute('class', 'vjs-tech'); + + var divWrapper = document.createElement('div'); + divWrapper.appendChild(div); + + if (!_isOnMobile && !this.options_.ytControls) { + var divBlocker = document.createElement('div'); + divBlocker.setAttribute('class', 'vjs-iframe-blocker'); + divBlocker.setAttribute('style', 'position:absolute;top:0;left:0;width:100%;height:100%'); + + // In case the blocker is still there and we want to pause + divBlocker.onclick = function () { + this.pause(); + }.bind(this); + + divWrapper.appendChild(divBlocker); + } + + return divWrapper; + }, + + initYTPlayer: function () { + var playerVars = { + controls: 0, + modestbranding: 1, + rel: 0, + showinfo: 0, + loop: this.options_.loop ? 1 : 0 + }; + + // Let the user set any YouTube parameter + // https://developers.google.com/youtube/player_parameters?playerVersion=HTML5#Parameters + // To use YouTube controls, you must use ytControls instead + // To use the loop or autoplay, use the video.js settings + + if (typeof this.options_.autohide !== 'undefined') { + playerVars.autohide = this.options_.autohide; + } + + if (typeof this.options_['cc_load_policy'] !== 'undefined') { + playerVars['cc_load_policy'] = this.options_['cc_load_policy']; + } + + if (typeof this.options_.ytControls !== 'undefined') { + playerVars.controls = this.options_.ytControls; + } + + if (typeof this.options_.disablekb !== 'undefined') { + playerVars.disablekb = this.options_.disablekb; + } + + if (typeof this.options_.end !== 'undefined') { + playerVars.end = this.options_.end; + } + + if (typeof this.options_.color !== 'undefined') { + playerVars.color = this.options_.color; + } + + if (!playerVars.controls) { + // Let video.js handle the fullscreen unless it is the YouTube native controls + playerVars.fs = 0; + } else if (typeof this.options_.fs !== 'undefined') { + playerVars.fs = this.options_.fs; + } + + if (typeof this.options_.end !== 'undefined') { + playerVars.end = this.options_.end; + } + + if (typeof this.options_.hl !== 'undefined') { + playerVars.hl = this.options_.hl; + } else if (typeof this.options_.language !== 'undefined') { + // Set the YouTube player on the same language than video.js + playerVars.hl = this.options_.language.substr(0, 2); + } + + if (typeof this.options_['iv_load_policy'] !== 'undefined') { + playerVars['iv_load_policy'] = this.options_['iv_load_policy']; + } + + if (typeof this.options_.list !== 'undefined') { + playerVars.list = this.options_.list; + } else if (this.url && typeof this.url.listId !== 'undefined') { + playerVars.list = this.url.listId; + } + + if (typeof this.options_.listType !== 'undefined') { + playerVars.listType = this.options_.listType; + } + + if (typeof this.options_.modestbranding !== 'undefined') { + playerVars.modestbranding = this.options_.modestbranding; + } + + if (typeof this.options_.playlist !== 'undefined') { + playerVars.playlist = this.options_.playlist; + } + + if (typeof this.options_.playsinline !== 'undefined') { + playerVars.playsinline = this.options_.playsinline; + } + + if (typeof this.options_.rel !== 'undefined') { + playerVars.rel = this.options_.rel; + } + + if (typeof this.options_.showinfo !== 'undefined') { + playerVars.showinfo = this.options_.showinfo; + } + + if (typeof this.options_.start !== 'undefined') { + playerVars.start = this.options_.start; + } + + if (typeof this.options_.theme !== 'undefined') { + playerVars.theme = this.options_.theme; + } + + // Allow undocumented options to be passed along via customVars + if (typeof this.options_.customVars !== 'undefined') { + var customVars = this.options_.customVars; + Object.keys(customVars).forEach(function (key) { + playerVars[key] = customVars[key]; + }); + } + + this.activeVideoId = this.url ? this.url.videoId : null; + this.activeList = playerVars.list; + + this.ytPlayer = new YT.Player(this.options_.techId, { + videoId: this.activeVideoId, + playerVars: playerVars, + events: { + onReady: this.onPlayerReady.bind(this), + onPlaybackQualityChange: this.onPlayerPlaybackQualityChange.bind(this), + onPlaybackRateChange: this.onPlayerPlaybackRateChange.bind(this), + onStateChange: this.onPlayerStateChange.bind(this), + onVolumeChange: this.onPlayerVolumeChange.bind(this), + onError: this.onPlayerError.bind(this) + } + }); + }, + + onPlayerReady: function () { + if (this.options_.muted) { + this.ytPlayer.mute(); + } + + var playbackRates = this.ytPlayer.getAvailablePlaybackRates(); + if (playbackRates.length > 1) { + this.featuresPlaybackRate = true; + } + + this.playerReady_ = true; + this.triggerReady(); + + if (this.playOnReady) { + this.play(); + } else if (this.cueOnReady) { + this.cueVideoById_(this.url.videoId); + this.activeVideoId = this.url.videoId; + } + }, + + onPlayerPlaybackQualityChange: function () { + + }, + + onPlayerPlaybackRateChange: function () { + this.trigger('ratechange'); + }, + + + onPlayerStateChange: function (e) { + var state = e.data; + + if (state === this.lastState || this.errorNumber) { + return; + } + + this.lastState = state; + + switch (state) { + case -1: + this.trigger('loadstart'); + this.trigger('loadedmetadata'); + this.trigger('durationchange'); + this.trigger('ratechange'); + + // == Hack start == // + if (window != window.top) { + if (this.stateTimeout) { + clearTimeout(this.stateTimeout); + this.stateTimeout = null; + } + + this.stateTimeout = setTimeout(() => { + if (this.lastState === -1) { + // Make Video.js UI think we are playing the video, then pause it. For a strange reason, this + // brings up the red "native" Youtube Play button. If you click it, everything will work fine from that point + this.trigger('playing'); + this.trigger('play'); + this.onSeeked(); + this.trigger('pause'); + } + }, 1500 + ) + } + // == Hack end == // + + break; + + case YT.PlayerState.ENDED: + this.trigger('ended'); + break; + + case YT.PlayerState.PLAYING: + // == Hack start == // + if (this.stateTimeout) { + clearTimeout(this.stateTimeout); + this.stateTimeout = null; + } + // == Hack end == // + this.trigger('timeupdate'); + this.trigger('durationchange'); + this.trigger('playing'); + this.trigger('play'); + + // ... + } + }, + + onPlayerVolumeChange: function () { + this.trigger('volumechange'); + }, + + onPlayerError: function (e) { + this.errorNumber = e.data; this.trigger('pause'); - } - break; - - case YT.PlayerState.BUFFERING: - this.player_.trigger('timeupdate'); - this.player_.trigger('waiting'); - break; - } - }, - - onPlayerVolumeChange: function() { - this.trigger('volumechange'); - }, - - onPlayerError: function(e) { - this.errorNumber = e.data; - this.trigger('pause'); - this.trigger('error'); - }, - - error: function() { - var code = 1000 + this.errorNumber; // as smaller codes are reserved - switch (this.errorNumber) { - case 5: - return { code: code, message: 'Error while trying to play the video' }; - - case 2: - case 100: - return { code: code, message: 'Unable to find the video' }; - - case 101: - case 150: - return { - code: code, - message: 'Playback on other Websites has been disabled by the video owner.' - }; - } - - return { code: code, message: 'YouTube unknown error (' + this.errorNumber + ')' }; - }, - - loadVideoById_: function(id) { - var options = { - videoId: id - }; - if (this.options_.start) { - options.startSeconds = this.options_.start; - } - if (this.options_.end) { - options.endEnd = this.options_.end; - } - this.ytPlayer.loadVideoById(options); - }, - - cueVideoById_: function(id) { - var options = { - videoId: id - }; - if (this.options_.start) { - options.startSeconds = this.options_.start; - } - if (this.options_.end) { - options.endEnd = this.options_.end; - } - this.ytPlayer.cueVideoById(options); - }, - - src: function(src) { - if (src) { - this.setSrc({ src: src }); - } - - return this.source; - }, - - poster: function() { - // You can't start programmaticlly a video with a mobile - // through the iframe so we hide the poster and the play button (with CSS) - if (_isOnMobile) { - return null; - } - - return this.poster_; - }, - - setPoster: function(poster) { - this.poster_ = poster; - }, - - setSrc: function(source) { - if (!source || !source.src) { - return; - } - - delete this.errorNumber; - this.source = source; - this.url = Youtube.parseUrl(source.src); - - if (!this.options_.poster) { - if (this.url.videoId) { - // Set the low resolution first - this.poster_ = 'https://img.youtube.com/vi/' + this.url.videoId + '/0.jpg'; - this.trigger('posterchange'); - - // Check if their is a high res - this.checkHighResPoster(); - } - } + this.trigger('error'); + }, + + error: function () { + var code = 1000 + this.errorNumber; // as smaller codes are reserved + switch (this.errorNumber) { + case 5: + return {code: code, message: 'Error while trying to play the video'}; + + case 2: + case 100: + return {code: code, message: 'Unable to find the video'}; + + case 101: + case 150: + return { + code: code, + message: 'Playback on other Websites has been disabled by the video owner.' + }; + } - if (this.options_.autoplay && !_isOnMobile) { - if (this.isReady_) { - this.play(); - } else { - this.playOnReady = true; - } - } else if (this.activeVideoId !== this.url.videoId) { - if (this.isReady_) { - this.cueVideoById_(this.url.videoId); - this.activeVideoId = this.url.videoId; - } else { - this.cueOnReady = true; - } - } - }, - - autoplay: function() { - return this.options_.autoplay; - }, - - setAutoplay: function(val) { - this.options_.autoplay = val; - }, - - loop: function() { - return this.options_.loop; - }, - - setLoop: function(val) { - this.options_.loop = val; - }, - - play: function() { - if (!this.url || !this.url.videoId) { - return; - } - - this.wasPausedBeforeSeek = false; - - if (this.isReady_) { - if (this.url.listId) { - if (this.activeList === this.url.listId) { - this.ytPlayer.playVideo(); - } else { - this.ytPlayer.loadPlaylist(this.url.listId); - this.activeList = this.url.listId; - } - } + return {code: code, message: 'YouTube unknown error (' + this.errorNumber + ')'}; + }, - if (this.activeVideoId === this.url.videoId) { - this.ytPlayer.playVideo(); - } else { - this.loadVideoById_(this.url.videoId); - this.activeVideoId = this.url.videoId; - } - } else { - this.trigger('waiting'); - this.playOnReady = true; - } - }, - - pause: function() { - if (this.ytPlayer) { - this.ytPlayer.pauseVideo(); - } - }, - - paused: function() { - return (this.ytPlayer) ? - (this.lastState !== YT.PlayerState.PLAYING && this.lastState !== YT.PlayerState.BUFFERING) - : true; - }, - - currentTime: function() { - return this.ytPlayer ? this.ytPlayer.getCurrentTime() : 0; - }, - - setCurrentTime: function(seconds) { - if (this.lastState === YT.PlayerState.PAUSED) { - this.timeBeforeSeek = this.currentTime(); - } - - if (!this.isSeeking) { - this.wasPausedBeforeSeek = this.paused(); - } - - this.ytPlayer.seekTo(seconds, true); - this.trigger('timeupdate'); - this.trigger('seeking'); - this.isSeeking = true; - - // A seek event during pause does not return an event to trigger a seeked event, - // so run an interval timer to look for the currentTime to change - if (this.lastState === YT.PlayerState.PAUSED && this.timeBeforeSeek !== seconds) { - clearInterval(this.checkSeekedInPauseInterval); - this.checkSeekedInPauseInterval = setInterval(function() { - if (this.lastState !== YT.PlayerState.PAUSED || !this.isSeeking) { - // If something changed while we were waiting for the currentTime to change, - // clear the interval timer - clearInterval(this.checkSeekedInPauseInterval); - } else if (this.currentTime() !== this.timeBeforeSeek) { + loadVideoById_: function (id) { + var options = { + videoId: id + }; + if (this.options_.start) { + options.startSeconds = this.options_.start; + } + if (this.options_.end) { + options.endEnd = this.options_.end; + } + this.ytPlayer.loadVideoById(options); + }, + + cueVideoById_: function (id) { + var options = { + videoId: id + }; + if (this.options_.start) { + options.startSeconds = this.options_.start; + } + if (this.options_.end) { + options.endEnd = this.options_.end; + } + this.ytPlayer.cueVideoById(options); + }, + + src: function (src) { + if (src) { + this.setSrc({src: src}); + } + + return this.source; + }, + + poster: function () { + // You can't start programmaticlly a video with a mobile + // through the iframe so we hide the poster and the play button (with CSS) + if (_isOnMobile) { + return null; + } + + return this.poster_; + }, + + setPoster: function (poster) { + this.poster_ = poster; + }, + + setSrc: function (source) { + if (!source || !source.src) { + return; + } + + delete this.errorNumber; + this.source = source; + this.url = Youtube.parseUrl(source.src); + + if (!this.options_.poster) { + if (this.url.videoId) { + // Set the low resolution first + this.poster_ = 'https://img.youtube.com/vi/' + this.url.videoId + '/0.jpg'; + this.trigger('posterchange'); + + // Check if their is a high res + this.checkHighResPoster(); + } + } + + if (this.options_.autoplay && !_isOnMobile) { + if (this.isReady_) { + this.play(); + } else { + this.playOnReady = true; + } + } else if (this.activeVideoId !== this.url.videoId) { + if (this.isReady_) { + this.cueVideoById_(this.url.videoId); + this.activeVideoId = this.url.videoId; + } else { + this.cueOnReady = true; + } + } + }, + + autoplay: function () { + return this.options_.autoplay; + }, + + setAutoplay: function (val) { + this.options_.autoplay = val; + }, + + loop: function () { + return this.options_.loop; + }, + + setLoop: function (val) { + this.options_.loop = val; + }, + + play: function () { + if (!this.url || !this.url.videoId) { + return; + } + + this.wasPausedBeforeSeek = false; + + if (this.isReady_) { + if (this.url.listId) { + if (this.activeList === this.url.listId) { + this.ytPlayer.playVideo(); + } else { + this.ytPlayer.loadPlaylist(this.url.listId); + this.activeList = this.url.listId; + } + } + + if (this.activeVideoId === this.url.videoId) { + this.ytPlayer.playVideo(); + } else { + this.loadVideoById_(this.url.videoId); + this.activeVideoId = this.url.videoId; + } + } else { + this.trigger('waiting'); + this.playOnReady = true; + } + }, + + pause: function () { + if (this.ytPlayer) { + this.ytPlayer.pauseVideo(); + } + }, + + paused: function () { + return (this.ytPlayer) ? + (this.lastState !== YT.PlayerState.PLAYING && this.lastState !== YT.PlayerState.BUFFERING) + : true; + }, + + currentTime: function () { + return this.ytPlayer ? this.ytPlayer.getCurrentTime() : 0; + }, + + setCurrentTime: function (seconds) { + if (this.lastState === YT.PlayerState.PAUSED) { + this.timeBeforeSeek = this.currentTime(); + } + + if (!this.isSeeking) { + this.wasPausedBeforeSeek = this.paused(); + } + + this.ytPlayer.seekTo(seconds, true); this.trigger('timeupdate'); - this.onSeeked(); - } - }.bind(this), 250); - } - }, - - seeking: function () { - return this.isSeeking; - }, - - seekable: function () { - if(!this.ytPlayer) { - return videojs.createTimeRange(); - } - - return videojs.createTimeRange(0, this.ytPlayer.getDuration()); - }, - - onSeeked: function() { - clearInterval(this.checkSeekedInPauseInterval); - this.isSeeking = false; - - if (this.wasPausedBeforeSeek) { - this.pause(); - } - - this.trigger('seeked'); - }, - - playbackRate: function() { - return this.ytPlayer ? this.ytPlayer.getPlaybackRate() : 1; - }, - - setPlaybackRate: function(suggestedRate) { - if (!this.ytPlayer) { - return; - } - - this.ytPlayer.setPlaybackRate(suggestedRate); - }, - - duration: function() { - return this.ytPlayer ? this.ytPlayer.getDuration() : 0; - }, - - currentSrc: function() { - return this.source && this.source.src; - }, - - ended: function() { - return this.ytPlayer ? (this.lastState === YT.PlayerState.ENDED) : false; - }, - - volume: function() { - return this.ytPlayer ? this.ytPlayer.getVolume() / 100.0 : 1; - }, - - setVolume: function(percentAsDecimal) { - if (!this.ytPlayer) { - return; - } - - this.ytPlayer.setVolume(percentAsDecimal * 100.0); - }, - - muted: function() { - return this.ytPlayer ? this.ytPlayer.isMuted() : false; - }, - - setMuted: function(mute) { - if (!this.ytPlayer) { - return; - } - else{ - this.muted(true); - } - - if (mute) { - this.ytPlayer.mute(); - } else { - this.ytPlayer.unMute(); - } - this.setTimeout( function(){ - this.trigger('volumechange'); - }, 50); - }, - - buffered: function() { - if(!this.ytPlayer || !this.ytPlayer.getVideoLoadedFraction) { - return videojs.createTimeRange(); - } - - var bufferedEnd = this.ytPlayer.getVideoLoadedFraction() * this.ytPlayer.getDuration(); - - return videojs.createTimeRange(0, bufferedEnd); - }, - - // TODO: Can we really do something with this on YouTUbe? - preload: function() {}, - load: function() {}, - reset: function() {}, - - supportsFullScreen: function() { - return true; - }, - - // Tries to get the highest resolution thumbnail available for the video - checkHighResPoster: function(){ - var uri = 'https://img.youtube.com/vi/' + this.url.videoId + '/maxresdefault.jpg'; - - try { - var image = new Image(); - image.onload = function(){ - // Onload may still be called if YouTube returns the 120x90 error thumbnail - if('naturalHeight' in image){ - if (image.naturalHeight <= 90 || image.naturalWidth <= 120) { - return; - } - } else if(image.height <= 90 || image.width <= 120) { - return; - } - - this.poster_ = uri; - this.trigger('posterchange'); - }.bind(this); - image.onerror = function(){}; - image.src = uri; - } - catch(e){} - } - }); + this.trigger('seeking'); + this.isSeeking = true; + + // A seek event during pause does not return an event to trigger a seeked event, + // so run an interval timer to look for the currentTime to change + if (this.lastState === YT.PlayerState.PAUSED && this.timeBeforeSeek !== seconds) { + clearInterval(this.checkSeekedInPauseInterval); + this.checkSeekedInPauseInterval = setInterval(function () { + if (this.lastState !== YT.PlayerState.PAUSED || !this.isSeeking) { + // If something changed while we were waiting for the currentTime to change, + // clear the interval timer + clearInterval(this.checkSeekedInPauseInterval); + } else if (this.currentTime() !== this.timeBeforeSeek) { + this.trigger('timeupdate'); + this.onSeeked(); + } + }.bind(this), 250); + } + }, - Youtube.isSupported = function() { - return true; - }; + seeking: function () { + return this.isSeeking; + }, - Youtube.canPlaySource = function(e) { - return Youtube.canPlayType(e.type); - }; + seekable: function () { + if (!this.ytPlayer) { + return videojs.createTimeRange(); + } - Youtube.canPlayType = function(e) { - return (e === 'video/youtube'); - }; + return videojs.createTimeRange(0, this.ytPlayer.getDuration()); + }, - Youtube.parseUrl = function(url) { - var result = { - videoId: null - }; + onSeeked: function () { + clearInterval(this.checkSeekedInPauseInterval); + this.isSeeking = false; - var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/; - var match = url.match(regex); + if (this.wasPausedBeforeSeek) { + this.pause(); + } - if (match && match[2].length === 11) { - result.videoId = match[2]; - } + this.trigger('seeked'); + }, - var regPlaylist = /[?&]list=([^#\&\?]+)/; - match = url.match(regPlaylist); + playbackRate: function () { + return this.ytPlayer ? this.ytPlayer.getPlaybackRate() : 1; + }, - if(match && match[1]) { - result.listId = match[1]; - } + setPlaybackRate: function (suggestedRate) { + if (!this.ytPlayer) { + return; + } + + this.ytPlayer.setPlaybackRate(suggestedRate); + }, + + duration: function () { + return this.ytPlayer ? this.ytPlayer.getDuration() : 0; + }, + + currentSrc: function () { + return this.source && this.source.src; + }, + + ended: function () { + return this.ytPlayer ? (this.lastState === YT.PlayerState.ENDED) : false; + }, + + volume: function () { + return this.ytPlayer ? this.ytPlayer.getVolume() / 100.0 : 1; + }, - return result; - }; + setVolume: function (percentAsDecimal) { + if (!this.ytPlayer) { + return; + } + + this.ytPlayer.setVolume(percentAsDecimal * 100.0); + }, + + muted: function () { + return this.ytPlayer ? this.ytPlayer.isMuted() : false; + }, + + setMuted: function (mute) { + if (!this.ytPlayer) { + return; + } else { + this.muted(true); + } - function apiLoaded() { - YT.ready(function() { - Youtube.isApiReady = true; + if (mute) { + this.ytPlayer.mute(); + } else { + this.ytPlayer.unMute(); + } + this.setTimeout(function () { + this.trigger('volumechange'); + }, 50); + }, + + buffered: function () { + if (!this.ytPlayer || !this.ytPlayer.getVideoLoadedFraction) { + return videojs.createTimeRange(); + } - for (var i = 0; i < Youtube.apiReadyQueue.length; ++i) { - Youtube.apiReadyQueue[i].initYTPlayer(); - } + var bufferedEnd = this.ytPlayer.getVideoLoadedFraction() * this.ytPlayer.getDuration(); + + return videojs.createTimeRange(0, bufferedEnd); + }, + + // TODO: Can we really do something with this on YouTUbe? + preload: function () { + }, + load: function () { + }, + reset: function () { + }, + + supportsFullScreen: function () { + return true; + }, + + // Tries to get the highest resolution thumbnail available for the video + checkHighResPoster: function () { + var uri = 'https://img.youtube.com/vi/' + this.url.videoId + '/maxresdefault.jpg'; + + try { + var image = new Image(); + image.onload = function () { + // Onload may still be called if YouTube returns the 120x90 error thumbnail + if ('naturalHeight' in image) { + if (image.naturalHeight <= 90 || image.naturalWidth <= 120) { + return; + } + } else if (image.height <= 90 || image.width <= 120) { + return; + } + + this.poster_ = uri; + this.trigger('posterchange'); + }.bind(this); + image.onerror = function () { + }; + image.src = uri; + } catch (e) { + } + } }); - } - - function loadScript(src, callback) { - var loaded = false; - var tag = document.createElement('script'); - var firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); - tag.onload = function () { - if (!loaded) { - loaded = true; - callback(); - } + + Youtube.isSupported = function () { + return true; }; - tag.onreadystatechange = function () { - if (!loaded && (this.readyState === 'complete' || this.readyState === 'loaded')) { - loaded = true; - callback(); - } + + Youtube.canPlaySource = function (e) { + return Youtube.canPlayType(e.type); }; - tag.src = src; - } - function injectCss() { - var css = // iframe blocker to catch mouse events - '.vjs-youtube .vjs-iframe-blocker { display: none; }' + - '.vjs-youtube.vjs-user-inactive .vjs-iframe-blocker { display: block; }' + - '.vjs-youtube .vjs-poster { background-size: cover; }' + - '.vjs-youtube-mobile .vjs-big-play-button { display: none; }'; + Youtube.canPlayType = function (e) { + return (e === 'video/youtube'); + }; - var head = document.head || document.getElementsByTagName('head')[0]; + Youtube.parseUrl = function (url) { + var result = { + videoId: null + }; - var style = document.createElement('style'); - style.type = 'text/css'; + var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/; + var match = url.match(regex); - if (style.styleSheet){ - style.styleSheet.cssText = css; - } else { - style.appendChild(document.createTextNode(css)); + if (match && match[2].length === 11) { + result.videoId = match[2]; + } + + var regPlaylist = /[?&]list=([^#\&\?]+)/; + match = url.match(regPlaylist); + + if (match && match[1]) { + result.listId = match[1]; + } + + return result; + }; + + function apiLoaded() { + YT.ready(function () { + Youtube.isApiReady = true; + + for (var i = 0; i < Youtube.apiReadyQueue.length; ++i) { + Youtube.apiReadyQueue[i].initYTPlayer(); + } + }); + } + + function loadScript(src, callback) { + var loaded = false; + var tag = document.createElement('script'); + var firstScriptTag = document.getElementsByTagName('script')[0]; + firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); + tag.onload = function () { + if (!loaded) { + loaded = true; + callback(); + } + }; + tag.onreadystatechange = function () { + if (!loaded && (this.readyState === 'complete' || this.readyState === 'loaded')) { + loaded = true; + callback(); + } + }; + tag.src = src; } - head.appendChild(style); - } + function injectCss() { + var css = // iframe blocker to catch mouse events + '.vjs-youtube .vjs-iframe-blocker { display: none; }' + + '.vjs-youtube.vjs-user-inactive .vjs-iframe-blocker { display: block; }' + + '.vjs-youtube .vjs-poster { background-size: cover; }' + + '.vjs-youtube-mobile .vjs-big-play-button { display: none; }'; - Youtube.apiReadyQueue = []; + var head = document.head || document.getElementsByTagName('head')[0]; - if (typeof document !== 'undefined'){ - loadScript('https://www.youtube.com/iframe_api', apiLoaded); - injectCss(); - } + var style = document.createElement('style'); + style.type = 'text/css'; - // Older versions of VJS5 doesn't have the registerTech function - if (typeof videojs.registerTech !== 'undefined') { - videojs.registerTech('Youtube', Youtube); - } else { - videojs.registerComponent('Youtube', Youtube); - } + if (style.styleSheet) { + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css)); + } + + head.appendChild(style); + } + + Youtube.apiReadyQueue = []; + + if (typeof document !== 'undefined') { + loadScript('https://www.youtube.com/iframe_api', apiLoaded); + injectCss(); + } + + // Older versions of VJS5 doesn't have the registerTech function + if (typeof videojs.registerTech !== 'undefined') { + videojs.registerTech('Youtube', Youtube); + } else { + videojs.registerComponent('Youtube', Youtube); + } })); diff --git a/js/libs/videojs/lang/ar.js b/js/libs/videojs/lang/ar.js index 6586f00f..b8a449e3 100644 --- a/js/libs/videojs/lang/ar.js +++ b/js/libs/videojs/lang/ar.js @@ -1,34 +1,86 @@ -videojs.addLanguage("ar",{ - "Play": "تشغيل", - "Pause": "إيقاف", - "Current Time": "الوقت الحالي", - "Duration Time": "مدة", - "Remaining Time": "الوقت المتبقي", - "Stream Type": "نوع التيار", - "LIVE": "مباشر", - "Loaded": "تم التحميل", - "Progress": "التقدم", - "Fullscreen": "ملء الشاشة", - "Non-Fullscreen": "تعطيل ملء الشاشة", - "Mute": "صامت", - "Unmute": "غير الصامت", - "Playback Rate": "معدل التشغيل", - "Subtitles": "الترجمة", - "subtitles off": "إيقاف الترجمة", - "Captions": "التعليقات", - "captions off": "إيقاف التعليقات", - "Chapters": "فصول", - "You aborted the media playback": "لقد ألغيت تشغيل الفيديو", - "A network error caused the media download to fail part-way.": "تسبب خطأ في الشبكة بفشل تحميل الفيديو بالكامل.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "لا يمكن تحميل الفيديو بسبب فشل في الخادوم أو الشبكة ، أو فشل بسبب عدم إمكانية قراءة تنسيق الفيديو.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "تم إيقاف تشغيل الفيديو بسبب مشكلة فساد أو لأن الفيديو المستخدم يستخدم ميزات غير مدعومة من متصفحك.", - "No compatible source was found for this media.": "فشل العثور على أي مصدر متوافق مع هذا الفيديو.", - "Play Video": "تشغيل الفيديو", - "Close": "أغلق", - "Modal Window": "نافذة مشروطة", - "This is a modal window": "هذه نافذة مشروطة", - "This modal can be closed by pressing the Escape key or activating the close button.": "يمكن غلق هذه النافذة المشروطة عن طريق الضغط على زر الخروج أو تفعيل زر الإغلاق", - ", opens captions settings dialog": ", تفتح نافذة خيارات التعليقات", - ", opens subtitles settings dialog": ", تفتح نافذة خيارات الترجمة", - ", selected": ", مختار" +videojs.addLanguage('ar', { + "Play": "تشغيل", + "Pause": "إيقاف", + "Current Time": "الوقت الحالي", + "Duration": "مدة", + "Remaining Time": "الوقت المتبقي", + "Stream Type": "نوع التيار", + "LIVE": "مباشر", + "Loaded": "تم التحميل", + "Progress": "التقدم", + "Fullscreen": "ملء الشاشة", + "Non-Fullscreen": "تعطيل ملء الشاشة", + "Mute": "صامت", + "Unmute": "غير الصامت", + "Playback Rate": "معدل التشغيل", + "Subtitles": "الترجمة", + "subtitles off": "إيقاف الترجمة", + "Captions": "التعليقات", + "captions off": "إيقاف التعليقات", + "Chapters": "فصول", + "You aborted the media playback": "لقد ألغيت تشغيل الفيديو", + "A network error caused the media download to fail part-way.": "تسبب خطأ في الشبكة بفشل تحميل الفيديو بالكامل.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "لا يمكن تحميل الفيديو بسبب فشل في الخادوم أو الشبكة ، أو فشل بسبب عدم إمكانية قراءة تنسيق الفيديو.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "تم إيقاف تشغيل الفيديو بسبب مشكلة فساد أو لأن الفيديو المستخدم يستخدم ميزات غير مدعومة من متصفحك.", + "No compatible source was found for this media.": "فشل العثور على أي مصدر متوافق مع هذا الفيديو.", + "Play Video": "تشغيل الفيديو", + "Close": "أغلق", + "Modal Window": "نافذة مشروطة", + "This is a modal window": "هذه نافذة مشروطة", + "This modal can be closed by pressing the Escape key or activating the close button.": "يمكن غلق هذه النافذة المشروطة عن طريق الضغط على زر الخروج أو تفعيل زر الإغلاق", + ", opens captions settings dialog": ", تفتح نافذة خيارات التعليقات", + ", opens subtitles settings dialog": ", تفتح نافذة خيارات الترجمة", + ", selected": ", مختار", + "Audio Player": "مشغل الصوت", + "Video Player": "مشغل الفيديو", + "Replay": "إعادة التشغيل", + "Seek to live, currently behind live": "ذهاب إلى نقطة البث المباشر، متأخر عن البث المباشر حاليًا", + "Seek to live, currently playing live": "ذهاب إلى نقطة البث المباشر، البث المباشر قيد التشغيل حاليًا", + "Progress Bar": "شريط التقدم", + "Descriptions": "الأوصاف", + "descriptions off": "إخفاء الأوصاف", + "Audio Track": "المسار الصوتي", + "Volume Level": "مستوى الصوت", + "The media is encrypted and we do not have the keys to decrypt it.": "الوسائط مشفرة وليس لدينا الرموز اللازمة لفك شفرتها.", + "Close Modal Dialog": "إغلاق مربع الحوار المشروط", + ", opens descriptions settings dialog": "، يفتح مربع حوار إعدادات الأوصاف", + "captions settings": "إعدادات التعليقات التوضيحية", + "subtitles settings": "إعدادات الترجمات", + "descriptions settings": "إعدادات الأوصاف", + "Text": "النص", + "White": "أبيض", + "Black": "أسود", + "Red": "أحمر", + "Green": "أخضر", + "Blue": "أزرق", + "Yellow": "أصفر", + "Magenta": "أرجواني", + "Cyan": "أزرق سماوي", + "Background": "الخلفية", + "Window": "نافذة", + "Transparent": "شفاف", + "Semi-Transparent": "نصف شفاف", + "Opaque": "معتم", + "Font Size": "حجم الخط", + "Text Edge Style": "نمط حواف النص", + "None": "لا شيء", + "Raised": "بارز", + "Depressed": "منخفض", + "Uniform": "منتظم", + "Dropshadow": "ظل خلفي", + "Font Family": "عائلة الخطوط", + "Proportional Sans-Serif": "Proportional Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportional Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Casual", + "Script": "Script", + "Small Caps": "Small Caps", + "Reset": "إعادة الضبط", + "restore all settings to the default values": "استعادة كل الإعدادات إلى القيم الافتراضية", + "Done": "تم", + "Caption Settings Dialog": "مربع حوار إعدادات التعليقات التوضيحية", + "Beginning of dialog window. Escape will cancel and close the window.": "بداية نافذة مربع حوار. الضغط على زر \"Escape\" سيؤدي إلى الإلغاء وإغلاق النافذة.", + "End of dialog window.": "نهاية نافذة مربع حوار.", + "{1} is loading.": "{1} قيد التحميل." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/ar.json b/js/libs/videojs/lang/ar.json new file mode 100644 index 00000000..ef59ae82 --- /dev/null +++ b/js/libs/videojs/lang/ar.json @@ -0,0 +1,86 @@ +{ + "Play": "تشغيل", + "Pause": "إيقاف", + "Current Time": "الوقت الحالي", + "Duration": "مدة", + "Remaining Time": "الوقت المتبقي", + "Stream Type": "نوع التيار", + "LIVE": "مباشر", + "Loaded": "تم التحميل", + "Progress": "التقدم", + "Fullscreen": "ملء الشاشة", + "Non-Fullscreen": "تعطيل ملء الشاشة", + "Mute": "صامت", + "Unmute": "غير الصامت", + "Playback Rate": "معدل التشغيل", + "Subtitles": "الترجمة", + "subtitles off": "إيقاف الترجمة", + "Captions": "التعليقات", + "captions off": "إيقاف التعليقات", + "Chapters": "فصول", + "You aborted the media playback": "لقد ألغيت تشغيل الفيديو", + "A network error caused the media download to fail part-way.": "تسبب خطأ في الشبكة بفشل تحميل الفيديو بالكامل.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "لا يمكن تحميل الفيديو بسبب فشل في الخادوم أو الشبكة ، أو فشل بسبب عدم إمكانية قراءة تنسيق الفيديو.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "تم إيقاف تشغيل الفيديو بسبب مشكلة فساد أو لأن الفيديو المستخدم يستخدم ميزات غير مدعومة من متصفحك.", + "No compatible source was found for this media.": "فشل العثور على أي مصدر متوافق مع هذا الفيديو.", + "Play Video": "تشغيل الفيديو", + "Close": "أغلق", + "Modal Window": "نافذة مشروطة", + "This is a modal window": "هذه نافذة مشروطة", + "This modal can be closed by pressing the Escape key or activating the close button.": "يمكن غلق هذه النافذة المشروطة عن طريق الضغط على زر الخروج أو تفعيل زر الإغلاق", + ", opens captions settings dialog": ", تفتح نافذة خيارات التعليقات", + ", opens subtitles settings dialog": ", تفتح نافذة خيارات الترجمة", + ", selected": ", مختار", + "Audio Player": "مشغل الصوت", + "Video Player": "مشغل الفيديو", + "Replay": "إعادة التشغيل", + "Seek to live, currently behind live": "ذهاب إلى نقطة البث المباشر، متأخر عن البث المباشر حاليًا", + "Seek to live, currently playing live": "ذهاب إلى نقطة البث المباشر، البث المباشر قيد التشغيل حاليًا", + "Progress Bar": "شريط التقدم", + "Descriptions": "الأوصاف", + "descriptions off": "إخفاء الأوصاف", + "Audio Track": "المسار الصوتي", + "Volume Level": "مستوى الصوت", + "The media is encrypted and we do not have the keys to decrypt it.": "الوسائط مشفرة وليس لدينا الرموز اللازمة لفك شفرتها.", + "Close Modal Dialog": "إغلاق مربع الحوار المشروط", + ", opens descriptions settings dialog": "، يفتح مربع حوار إعدادات الأوصاف", + "captions settings": "إعدادات التعليقات التوضيحية", + "subtitles settings": "إعدادات الترجمات", + "descriptions settings": "إعدادات الأوصاف", + "Text": "النص", + "White": "أبيض", + "Black": "أسود", + "Red": "أحمر", + "Green": "أخضر", + "Blue": "أزرق", + "Yellow": "أصفر", + "Magenta": "أرجواني", + "Cyan": "أزرق سماوي", + "Background": "الخلفية", + "Window": "نافذة", + "Transparent": "شفاف", + "Semi-Transparent": "نصف شفاف", + "Opaque": "معتم", + "Font Size": "حجم الخط", + "Text Edge Style": "نمط حواف النص", + "None": "لا شيء", + "Raised": "بارز", + "Depressed": "منخفض", + "Uniform": "منتظم", + "Dropshadow": "ظل خلفي", + "Font Family": "عائلة الخطوط", + "Proportional Sans-Serif": "Proportional Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportional Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Casual", + "Script": "Script", + "Small Caps": "Small Caps", + "Reset": "إعادة الضبط", + "restore all settings to the default values": "استعادة كل الإعدادات إلى القيم الافتراضية", + "Done": "تم", + "Caption Settings Dialog": "مربع حوار إعدادات التعليقات التوضيحية", + "Beginning of dialog window. Escape will cancel and close the window.": "بداية نافذة مربع حوار. الضغط على زر \"Escape\" سيؤدي إلى الإلغاء وإغلاق النافذة.", + "End of dialog window.": "نهاية نافذة مربع حوار.", + "{1} is loading.": "{1} قيد التحميل." +} diff --git a/js/libs/videojs/lang/ba.js b/js/libs/videojs/lang/ba.js index b7ca3da8..0705eb40 100644 --- a/js/libs/videojs/lang/ba.js +++ b/js/libs/videojs/lang/ba.js @@ -1,26 +1,26 @@ -videojs.addLanguage("ba",{ - "Play": "Pusti", - "Pause": "Pauza", - "Current Time": "Trenutno vrijeme", - "Duration Time": "Vrijeme trajanja", - "Remaining Time": "Preostalo vrijeme", - "Stream Type": "Način strimovanja", - "LIVE": "UŽIVO", - "Loaded": "Učitan", - "Progress": "Progres", - "Fullscreen": "Puni ekran", - "Non-Fullscreen": "Mali ekran", - "Mute": "Prigušen", - "Unmute": "Ne-prigušen", - "Playback Rate": "Stopa reprodukcije", - "Subtitles": "Podnaslov", - "subtitles off": "Podnaslov deaktiviran", - "Captions": "Titlovi", - "captions off": "Titlovi deaktivirani", - "Chapters": "Poglavlja", - "You aborted the media playback": "Isključili ste reprodukciju videa.", - "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", - "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." +videojs.addLanguage('ba', { + "Play": "Pusti", + "Pause": "Pauza", + "Current Time": "Trenutno vrijeme", + "Duration": "Vrijeme trajanja", + "Remaining Time": "Preostalo vrijeme", + "Stream Type": "Način strimovanja", + "LIVE": "UŽIVO", + "Loaded": "Učitan", + "Progress": "Progres", + "Fullscreen": "Puni ekran", + "Non-Fullscreen": "Mali ekran", + "Mute": "Prigušen", + "Unmute": "Ne-prigušen", + "Playback Rate": "Stopa reprodukcije", + "Subtitles": "Podnaslov", + "subtitles off": "Podnaslov deaktiviran", + "Captions": "Titlovi", + "captions off": "Titlovi deaktivirani", + "Chapters": "Poglavlja", + "You aborted the media playback": "Isključili ste reprodukciju videa.", + "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", + "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/ba.json b/js/libs/videojs/lang/ba.json new file mode 100644 index 00000000..32e1763f --- /dev/null +++ b/js/libs/videojs/lang/ba.json @@ -0,0 +1,26 @@ +{ + "Play": "Pusti", + "Pause": "Pauza", + "Current Time": "Trenutno vrijeme", + "Duration": "Vrijeme trajanja", + "Remaining Time": "Preostalo vrijeme", + "Stream Type": "Način strimovanja", + "LIVE": "UŽIVO", + "Loaded": "Učitan", + "Progress": "Progres", + "Fullscreen": "Puni ekran", + "Non-Fullscreen": "Mali ekran", + "Mute": "Prigušen", + "Unmute": "Ne-prigušen", + "Playback Rate": "Stopa reprodukcije", + "Subtitles": "Podnaslov", + "subtitles off": "Podnaslov deaktiviran", + "Captions": "Titlovi", + "captions off": "Titlovi deaktivirani", + "Chapters": "Poglavlja", + "You aborted the media playback": "Isključili ste reprodukciju videa.", + "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", + "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." +} diff --git a/js/libs/videojs/lang/bg.js b/js/libs/videojs/lang/bg.js index 34e48ece..6285df20 100644 --- a/js/libs/videojs/lang/bg.js +++ b/js/libs/videojs/lang/bg.js @@ -1,26 +1,26 @@ -videojs.addLanguage("bg",{ - "Play": "Възпроизвеждане", - "Pause": "Пауза", - "Current Time": "Текущо време", - "Duration Time": "Продължителност", - "Remaining Time": "Оставащо време", - "Stream Type": "Тип на потока", - "LIVE": "НА ЖИВО", - "Loaded": "Заредено", - "Progress": "Прогрес", - "Fullscreen": "Цял екран", - "Non-Fullscreen": "Спиране на цял екран", - "Mute": "Без звук", - "Unmute": "Със звук", - "Playback Rate": "Скорост на възпроизвеждане", - "Subtitles": "Субтитри", - "subtitles off": "Спряни субтитри", - "Captions": "Аудио надписи", - "captions off": "Спряни аудио надписи", - "Chapters": "Глави", - "You aborted the media playback": "Спряхте възпроизвеждането на видеото", - "A network error caused the media download to fail part-way.": "Грешка в мрежата провали изтеглянето на видеото.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Видеото не може да бъде заредено заради проблем със сървъра или мрежата или защото този формат не е поддържан.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Възпроизвеждането на видеото беше прекъснато заради проблем с файла или защото видеото използва опции които браузърът Ви не поддържа.", - "No compatible source was found for this media.": "Не беше намерен съвместим източник за това видео." +videojs.addLanguage('bg', { + "Play": "Възпроизвеждане", + "Pause": "Пауза", + "Current Time": "Текущо време", + "Duration": "Продължителност", + "Remaining Time": "Оставащо време", + "Stream Type": "Тип на потока", + "LIVE": "НА ЖИВО", + "Loaded": "Заредено", + "Progress": "Прогрес", + "Fullscreen": "Цял екран", + "Non-Fullscreen": "Спиране на цял екран", + "Mute": "Без звук", + "Unmute": "Със звук", + "Playback Rate": "Скорост на възпроизвеждане", + "Subtitles": "Субтитри", + "subtitles off": "Спряни субтитри", + "Captions": "Аудио надписи", + "captions off": "Спряни аудио надписи", + "Chapters": "Глави", + "You aborted the media playback": "Спряхте възпроизвеждането на видеото", + "A network error caused the media download to fail part-way.": "Грешка в мрежата провали изтеглянето на видеото.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Видеото не може да бъде заредено заради проблем със сървъра или мрежата или защото този формат не е поддържан.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Възпроизвеждането на видеото беше прекъснато заради проблем с файла или защото видеото използва опции които браузърът Ви не поддържа.", + "No compatible source was found for this media.": "Не беше намерен съвместим източник за това видео." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/bg.json b/js/libs/videojs/lang/bg.json new file mode 100644 index 00000000..372e8293 --- /dev/null +++ b/js/libs/videojs/lang/bg.json @@ -0,0 +1,26 @@ +{ + "Play": "Възпроизвеждане", + "Pause": "Пауза", + "Current Time": "Текущо време", + "Duration": "Продължителност", + "Remaining Time": "Оставащо време", + "Stream Type": "Тип на потока", + "LIVE": "НА ЖИВО", + "Loaded": "Заредено", + "Progress": "Прогрес", + "Fullscreen": "Цял екран", + "Non-Fullscreen": "Спиране на цял екран", + "Mute": "Без звук", + "Unmute": "Със звук", + "Playback Rate": "Скорост на възпроизвеждане", + "Subtitles": "Субтитри", + "subtitles off": "Спряни субтитри", + "Captions": "Аудио надписи", + "captions off": "Спряни аудио надписи", + "Chapters": "Глави", + "You aborted the media playback": "Спряхте възпроизвеждането на видеото", + "A network error caused the media download to fail part-way.": "Грешка в мрежата провали изтеглянето на видеото.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Видеото не може да бъде заредено заради проблем със сървъра или мрежата или защото този формат не е поддържан.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Възпроизвеждането на видеото беше прекъснато заради проблем с файла или защото видеото използва опции които браузърът Ви не поддържа.", + "No compatible source was found for this media.": "Не беше намерен съвместим източник за това видео." +} diff --git a/js/libs/videojs/lang/ca.js b/js/libs/videojs/lang/ca.js index 03371eee..1fcdab84 100644 --- a/js/libs/videojs/lang/ca.js +++ b/js/libs/videojs/lang/ca.js @@ -1,26 +1,26 @@ -videojs.addLanguage("ca",{ - "Play": "Reproducció", - "Pause": "Pausa", - "Current Time": "Temps reproduït", - "Duration Time": "Durada total", - "Remaining Time": "Temps restant", - "Stream Type": "Tipus de seqüència", - "LIVE": "EN DIRECTE", - "Loaded": "Carregat", - "Progress": "Progrés", - "Fullscreen": "Pantalla completa", - "Non-Fullscreen": "Pantalla no completa", - "Mute": "Silencia", - "Unmute": "Amb so", - "Playback Rate": "Velocitat de reproducció", - "Subtitles": "Subtítols", - "subtitles off": "Subtítols desactivats", - "Captions": "Llegendes", - "captions off": "Llegendes desactivades", - "Chapters": "Capítols", - "You aborted the media playback": "Heu interromput la reproducció del vídeo.", - "A network error caused the media download to fail part-way.": "Un error de la xarxa ha interromput la baixada del vídeo.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No s'ha pogut carregar el vídeo perquè el servidor o la xarxa han fallat, o bé perquè el seu format no és compatible.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducció de vídeo s'ha interrumput per un problema de corrupció de dades o bé perquè el vídeo demanava funcions que el vostre navegador no ofereix.", - "No compatible source was found for this media.": "No s'ha trobat cap font compatible amb el vídeo." +videojs.addLanguage('ca', { + "Play": "Reproducció", + "Pause": "Pausa", + "Current Time": "Temps reproduït", + "Duration": "Durada total", + "Remaining Time": "Temps restant", + "Stream Type": "Tipus de seqüència", + "LIVE": "EN DIRECTE", + "Loaded": "Carregat", + "Progress": "Progrés", + "Fullscreen": "Pantalla completa", + "Non-Fullscreen": "Pantalla no completa", + "Mute": "Silencia", + "Unmute": "Amb so", + "Playback Rate": "Velocitat de reproducció", + "Subtitles": "Subtítols", + "subtitles off": "Subtítols desactivats", + "Captions": "Llegendes", + "captions off": "Llegendes desactivades", + "Chapters": "Capítols", + "You aborted the media playback": "Heu interromput la reproducció del vídeo.", + "A network error caused the media download to fail part-way.": "Un error de la xarxa ha interromput la baixada del vídeo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No s'ha pogut carregar el vídeo perquè el servidor o la xarxa han fallat, o bé perquè el seu format no és compatible.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducció de vídeo s'ha interrumput per un problema de corrupció de dades o bé perquè el vídeo demanava funcions que el vostre navegador no ofereix.", + "No compatible source was found for this media.": "No s'ha trobat cap font compatible amb el vídeo." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/ca.json b/js/libs/videojs/lang/ca.json new file mode 100644 index 00000000..8ef0c040 --- /dev/null +++ b/js/libs/videojs/lang/ca.json @@ -0,0 +1,26 @@ +{ + "Play": "Reproducció", + "Pause": "Pausa", + "Current Time": "Temps reproduït", + "Duration": "Durada total", + "Remaining Time": "Temps restant", + "Stream Type": "Tipus de seqüència", + "LIVE": "EN DIRECTE", + "Loaded": "Carregat", + "Progress": "Progrés", + "Fullscreen": "Pantalla completa", + "Non-Fullscreen": "Pantalla no completa", + "Mute": "Silencia", + "Unmute": "Amb so", + "Playback Rate": "Velocitat de reproducció", + "Subtitles": "Subtítols", + "subtitles off": "Subtítols desactivats", + "Captions": "Llegendes", + "captions off": "Llegendes desactivades", + "Chapters": "Capítols", + "You aborted the media playback": "Heu interromput la reproducció del vídeo.", + "A network error caused the media download to fail part-way.": "Un error de la xarxa ha interromput la baixada del vídeo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No s'ha pogut carregar el vídeo perquè el servidor o la xarxa han fallat, o bé perquè el seu format no és compatible.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducció de vídeo s'ha interrumput per un problema de corrupció de dades o bé perquè el vídeo demanava funcions que el vostre navegador no ofereix.", + "No compatible source was found for this media.": "No s'ha trobat cap font compatible amb el vídeo." +} diff --git a/js/libs/videojs/lang/cs.js b/js/libs/videojs/lang/cs.js index f6004aa5..7164e086 100644 --- a/js/libs/videojs/lang/cs.js +++ b/js/libs/videojs/lang/cs.js @@ -1,26 +1,85 @@ -videojs.addLanguage("cs",{ - "Play": "Přehrát", - "Pause": "Pauza", - "Current Time": "Aktuální čas", - "Duration Time": "Doba trvání", - "Remaining Time": "Zbývající čas", - "Stream Type": "Stream Type", - "LIVE": "ŽIVĚ", - "Loaded": "Načteno", - "Progress": "Stav", - "Fullscreen": "Celá obrazovka", - "Non-Fullscreen": "Zmenšená obrazovka", - "Mute": "Ztlumit zvuk", - "Unmute": "Přehrát zvuk", - "Playback Rate": "Rychlost přehrávání", - "Subtitles": "Titulky", - "subtitles off": "Titulky vypnuty", - "Captions": "Popisky", - "captions off": "Popisky vypnuty", - "Chapters": "Kapitoly", - "You aborted the media playback": "Přehrávání videa je přerušeno.", - "A network error caused the media download to fail part-way.": "Video nemohlo být načteno, kvůli chybě v síti.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video nemohlo být načteno, buď kvůli chybě serveru nebo sítě nebo proto, že daný formát není podporován.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Váš prohlížeč nepodporuje formát videa.", - "No compatible source was found for this media.": "Špatně zadaný zdroj videa." +videojs.addLanguage('cs', { + "Audio Player": "Audio Přehravač", + "Video Player": "Video Přehravač", + "Play": "Přehrát", + "Pause": "Pauza", + "Replay": "Spustit znovu", + "Current Time": "Aktuální čas", + "Duration": "Doba trvání", + "Remaining Time": "Zbývající čas", + "Stream Type": "Typ streamu", + "LIVE": "ŽIVĚ", + "Loaded": "Načteno", + "Progress": "Stav", + "Progress Bar": "Ukazatel průběhu", + "progress bar timing: currentTime={1} duration={2}": "{1} z {2}", + "Fullscreen": "Celá obrazovka", + "Non-Fullscreen": "Běžné zobrazení", + "Mute": "Ztlumit zvuk", + "Unmute": "Zapnout zvuk", + "Playback Rate": "Rychlost přehrávání", + "Subtitles": "Titulky", + "subtitles off": "Bez titulků", + "Captions": "Popisky", + "captions off": "Popisky vypnuty", + "Chapters": "Kapitoly", + "Descriptions": "Popisy", + "descriptions off": "Bez popisů", + "Audio Track": "Zvuková stopa", + "Volume Level": "Hlasitost", + "You aborted the media playback": "Přehrávání videa bylo přerušeno.", + "A network error caused the media download to fail part-way.": "Video nemohlo být načteno kvůli chybě v síti.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video nemohlo být načteno, buď kvůli chybě serveru, sítě nebo proto, že daný formát není podporován.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Váš prohlížeč nepodporuje tento formát videa.", + "No compatible source was found for this media.": "Nevalidní zadaný zdroj videa.", + "The media is encrypted and we do not have the keys to decrypt it.": "Chyba při dešifrování videa.", + "Play Video": "Přehrát video", + "Close": "Zavřit", + "Close Modal Dialog": "Zavřít okno", + "Modal Window": "Modální okno", + "This is a modal window": "Toto je modální okno", + "This modal can be closed by pressing the Escape key or activating the close button.": "Toto okno se dá zavřít křížkem nebo klávesou Esc.", + ", opens captions settings dialog": ", otevřít okno pro nastavení popisků", + ", opens subtitles settings dialog": ", otevřít okno pro nastavení titulků", + ", opens descriptions settings dialog": ", otevře okno pro nastavení popisků pro nevidomé", + ", selected": ", vybráno", + "captions settings": "nastavení popisků", + "subtitles settings": "nastavení titulků", + "descriptions settings": "nastavení popisků pro nevidomé", + "Text": "Titulky", + "White": "Bílé", + "Black": "Černé", + "Red": "Červené", + "Green": "Zelené", + "Blue": "Modré", + "Yellow": "Žluté", + "Magenta": "Fialové", + "Cyan": "Azurové", + "Background": "Pozadí titulků", + "Window": "Okno", + "Transparent": "Průhledné", + "Semi-Transparent": "Poloprůhledné", + "Opaque": "Neprůhledné", + "Font Size": "Velikost písma", + "Text Edge Style": "Okraje písma", + "None": "Bez okraje", + "Raised": "Zvýšený", + "Depressed": "Propadlý", + "Uniform": "Rovnoměrný", + "Dropshadow": "Stínovaný", + "Font Family": "Rodina písma", + "Proportional Sans-Serif": "Proporcionální bezpatkové", + "Monospace Sans-Serif": "Monospace bezpatkové", + "Proportional Serif": "Proporcionální patkové", + "Monospace Serif": "Monospace patkové", + "Casual": "Hravé", + "Script": "Ručně psané", + "Small Caps": "Malé kapitálky", + "Reset": "Obnovit", + "restore all settings to the default values": "Vrátit nastavení do výchozího stavu", + "Done": "Hotovo", + "Caption Settings Dialog": "Okno s nastavením titulků", + "Beginning of dialog window. Escape will cancel and close the window.": "Začátek dialogového okna. Klávesa Esc okno zavře.", + "End of dialog window.": "Konec dialogového okna.", + "{1} is loading.": "{1} se načítá." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/cs.json b/js/libs/videojs/lang/cs.json new file mode 100644 index 00000000..02d30cdf --- /dev/null +++ b/js/libs/videojs/lang/cs.json @@ -0,0 +1,85 @@ +{ + "Audio Player": "Audio Přehravač", + "Video Player": "Video Přehravač", + "Play": "Přehrát", + "Pause": "Pauza", + "Replay": "Spustit znovu", + "Current Time": "Aktuální čas", + "Duration": "Doba trvání", + "Remaining Time": "Zbývající čas", + "Stream Type": "Typ streamu", + "LIVE": "ŽIVĚ", + "Loaded": "Načteno", + "Progress": "Stav", + "Progress Bar": "Ukazatel průběhu", + "progress bar timing: currentTime={1} duration={2}": "{1} z {2}", + "Fullscreen": "Celá obrazovka", + "Non-Fullscreen": "Běžné zobrazení", + "Mute": "Ztlumit zvuk", + "Unmute": "Zapnout zvuk", + "Playback Rate": "Rychlost přehrávání", + "Subtitles": "Titulky", + "subtitles off": "Bez titulků", + "Captions": "Popisky", + "captions off": "Popisky vypnuty", + "Chapters": "Kapitoly", + "Descriptions": "Popisy", + "descriptions off": "Bez popisů", + "Audio Track": "Zvuková stopa", + "Volume Level": "Hlasitost", + "You aborted the media playback": "Přehrávání videa bylo přerušeno.", + "A network error caused the media download to fail part-way.": "Video nemohlo být načteno kvůli chybě v síti.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video nemohlo být načteno, buď kvůli chybě serveru, sítě nebo proto, že daný formát není podporován.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Váš prohlížeč nepodporuje tento formát videa.", + "No compatible source was found for this media.": "Nevalidní zadaný zdroj videa.", + "The media is encrypted and we do not have the keys to decrypt it.": "Chyba při dešifrování videa.", + "Play Video": "Přehrát video", + "Close": "Zavřit", + "Close Modal Dialog": "Zavřít okno", + "Modal Window": "Modální okno", + "This is a modal window": "Toto je modální okno", + "This modal can be closed by pressing the Escape key or activating the close button.": "Toto okno se dá zavřít křížkem nebo klávesou Esc.", + ", opens captions settings dialog": ", otevřít okno pro nastavení popisků", + ", opens subtitles settings dialog": ", otevřít okno pro nastavení titulků", + ", opens descriptions settings dialog": ", otevře okno pro nastavení popisků pro nevidomé", + ", selected": ", vybráno", + "captions settings": "nastavení popisků", + "subtitles settings": "nastavení titulků", + "descriptions settings": "nastavení popisků pro nevidomé", + "Text": "Titulky", + "White": "Bílé", + "Black": "Černé", + "Red": "Červené", + "Green": "Zelené", + "Blue": "Modré", + "Yellow": "Žluté", + "Magenta": "Fialové", + "Cyan": "Azurové", + "Background": "Pozadí titulků", + "Window": "Okno", + "Transparent": "Průhledné", + "Semi-Transparent": "Poloprůhledné", + "Opaque": "Neprůhledné", + "Font Size": "Velikost písma", + "Text Edge Style": "Okraje písma", + "None": "Bez okraje", + "Raised": "Zvýšený", + "Depressed": "Propadlý", + "Uniform": "Rovnoměrný", + "Dropshadow": "Stínovaný", + "Font Family": "Rodina písma", + "Proportional Sans-Serif": "Proporcionální bezpatkové", + "Monospace Sans-Serif": "Monospace bezpatkové", + "Proportional Serif": "Proporcionální patkové", + "Monospace Serif": "Monospace patkové", + "Casual": "Hravé", + "Script": "Ručně psané", + "Small Caps": "Malé kapitálky", + "Reset": "Obnovit", + "restore all settings to the default values": "Vrátit nastavení do výchozího stavu", + "Done": "Hotovo", + "Caption Settings Dialog": "Okno s nastavením titulků", + "Beginning of dialog window. Escape will cancel and close the window.": "Začátek dialogového okna. Klávesa Esc okno zavře.", + "End of dialog window.": "Konec dialogového okna.", + "{1} is loading.": "{1} se načítá." +} diff --git a/js/libs/videojs/lang/cy.js b/js/libs/videojs/lang/cy.js new file mode 100644 index 00000000..c33ca577 --- /dev/null +++ b/js/libs/videojs/lang/cy.js @@ -0,0 +1,85 @@ +videojs.addLanguage('cy', { + "Audio Player": "Chwaraewr sain", + "Video Player": "Chwaraewr fideo", + "Play": "Chwarae", + "Pause": "Oedi", + "Replay": "Ailchwarae", + "Current Time": "Amser Cyfredol", + "Duration": "Parhad", + "Remaining Time": "Amser ar ôl", + "Stream Type": "Math o Ffrwd", + "LIVE": "YN FYW", + "Loaded": "Llwythwyd", + "Progress": "Cynnydd", + "Progress Bar": "Bar Cynnydd", + "progress bar timing: currentTime={1} duration={2}": "{1} o {2}", + "Fullscreen": "Sgrîn Lawn", + "Non-Fullscreen": "Ffenestr", + "Mute": "Pylu", + "Unmute": "Dad-bylu", + "Playback Rate": "Cyfradd Chwarae", + "Subtitles": "Isdeitlau", + "subtitles off": "Isdeitlau i ffwrdd", + "Captions": "Capsiynau", + "captions off": "Capsiynau i ffwrdd", + "Chapters": "Penodau", + "Descriptions": "Disgrifiadau", + "descriptions off": "disgrifiadau i ffwrdd", + "Audio Track": "Trac Sain", + "Volume Level": "Lefel Sain", + "You aborted the media playback": "Atalwyd y fideo gennych", + "A network error caused the media download to fail part-way.": "Mae gwall rhwydwaith wedi achosi methiant lawrlwytho.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Ni lwythodd y fideo, oherwydd methiant gweinydd neu rwydwaith, neu achos nid yw'r system yn cefnogi'r fformat.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Atalwyd y fideo oherwydd problem llygredd data neu oherwydd nid yw'ch porwr yn cefnogi nodweddion penodol o'r fideo.", + "No compatible source was found for this media.": "Nid oedd modd canfod ffynhonnell cytûn am y fideo hwn.", + "The media is encrypted and we do not have the keys to decrypt it.": "Mae'r fideo wedi ei amgryptio ac nid oes allweddion gennym.", + "Play Video": "Chwarae Fideo", + "Close": "Cau", + "Close Modal Dialog": "Cau Blwch Deialog Moddol", + "Modal Window": "Ffenestr Foddol", + "This is a modal window": "Mae hon yn ffenestr foddol", + "This modal can be closed by pressing the Escape key or activating the close button.": "Gallech chi gau'r ffenestr foddol hon trwy wasgu Escape neu glicio'r botwm cau.", + ", opens captions settings dialog": ", yn agor gosodiadau capsiynau", + ", opens subtitles settings dialog": ", yn agor gosodiadau isdeitlau", + ", opens descriptions settings dialog": ", yn agor gosodiadau disgrifiadau", + ", selected": ", detholwyd", + "captions settings": "gosodiadau capsiynau", + "subtitles settings": "gosodiadau isdeitlau", + "descriptions settings": "gosodiadau disgrifiadau", + "Text": "Testun", + "White": "Gwyn", + "Black": "Du", + "Red": "Coch", + "Green": "Gwyrdd", + "Blue": "Glas", + "Yellow": "Melyn", + "Magenta": "Piws", + "Cyan": "Cyan", + "Background": "Cefndir", + "Window": "Ffenestr", + "Transparent": "Tryloyw", + "Semi-Transparent": "Hanner-dryloyw", + "Opaque": "Di-draidd", + "Font Size": "Maint y Ffont", + "Text Edge Style": "Arddull Ymylon Testun", + "None": "Dim", + "Raised": "Uwch", + "Depressed": "Is", + "Uniform": "Unffurf", + "Dropshadow": "Cysgod cefn", + "Font Family": "Teulu y Ffont", + "Proportional Sans-Serif": "Heb-Seriff Cyfraneddol", + "Monospace Sans-Serif": "Heb-Seriff Unlled", + "Proportional Serif": "Seriff Gyfraneddol", + "Monospace Serif": "Seriff Unlled", + "Casual": "Llawysgrif", + "Script": "Sgript", + "Small Caps": "Prif Lythyrennau Bychain", + "Reset": "Ailosod", + "restore all settings to the default values": "Adfer yr holl osodiadau diofyn", + "Done": "Gorffenwyd", + "Caption Settings Dialog": "Blwch Gosodiadau Capsiynau", + "Beginning of dialog window. Escape will cancel and close the window.": "Dechrau ffenestr deialog. Bydd Escape yn canslo a chau'r ffenestr.", + "End of dialog window.": "Diwedd ffenestr deialog.", + "{1} is loading.": "{1} yn llwytho." +}); \ No newline at end of file diff --git a/js/libs/videojs/lang/cy.json b/js/libs/videojs/lang/cy.json new file mode 100644 index 00000000..f1e00a07 --- /dev/null +++ b/js/libs/videojs/lang/cy.json @@ -0,0 +1,85 @@ +{ + "Audio Player":"Chwaraewr sain", + "Video Player":"Chwaraewr fideo", + "Play":"Chwarae", + "Pause":"Oedi", + "Replay":"Ailchwarae", + "Current Time":"Amser Cyfredol", + "Duration":"Parhad", + "Remaining Time":"Amser ar ôl", + "Stream Type":"Math o Ffrwd", + "LIVE":"YN FYW", + "Loaded":"Llwythwyd", + "Progress":"Cynnydd", + "Progress Bar":"Bar Cynnydd", + "progress bar timing: currentTime={1} duration={2}":"{1} o {2}", + "Fullscreen":"Sgrîn Lawn", + "Non-Fullscreen":"Ffenestr", + "Mute":"Pylu", + "Unmute":"Dad-bylu", + "Playback Rate":"Cyfradd Chwarae", + "Subtitles":"Isdeitlau", + "subtitles off":"Isdeitlau i ffwrdd", + "Captions":"Capsiynau", + "captions off":"Capsiynau i ffwrdd", + "Chapters":"Penodau", + "Descriptions":"Disgrifiadau", + "descriptions off":"disgrifiadau i ffwrdd", + "Audio Track":"Trac Sain", + "Volume Level":"Lefel Sain", + "You aborted the media playback":"Atalwyd y fideo gennych", + "A network error caused the media download to fail part-way.":"Mae gwall rhwydwaith wedi achosi methiant lawrlwytho.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.":"Ni lwythodd y fideo, oherwydd methiant gweinydd neu rwydwaith, neu achos nid yw'r system yn cefnogi'r fformat.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"Atalwyd y fideo oherwydd problem llygredd data neu oherwydd nid yw'ch porwr yn cefnogi nodweddion penodol o'r fideo.", + "No compatible source was found for this media.":"Nid oedd modd canfod ffynhonnell cytûn am y fideo hwn.", + "The media is encrypted and we do not have the keys to decrypt it.":"Mae'r fideo wedi ei amgryptio ac nid oes allweddion gennym.", + "Play Video":"Chwarae Fideo", + "Close":"Cau", + "Close Modal Dialog":"Cau Blwch Deialog Moddol", + "Modal Window":"Ffenestr Foddol", + "This is a modal window":"Mae hon yn ffenestr foddol", + "This modal can be closed by pressing the Escape key or activating the close button.":"Gallech chi gau'r ffenestr foddol hon trwy wasgu Escape neu glicio'r botwm cau.", + ", opens captions settings dialog":", yn agor gosodiadau capsiynau", + ", opens subtitles settings dialog":", yn agor gosodiadau isdeitlau", + ", opens descriptions settings dialog":", yn agor gosodiadau disgrifiadau", + ", selected":", detholwyd", + "captions settings":"gosodiadau capsiynau", + "subtitles settings":"gosodiadau isdeitlau", + "descriptions settings":"gosodiadau disgrifiadau", + "Text":"Testun", + "White":"Gwyn", + "Black":"Du", + "Red":"Coch", + "Green":"Gwyrdd", + "Blue":"Glas", + "Yellow":"Melyn", + "Magenta":"Piws", + "Cyan":"Cyan", + "Background":"Cefndir", + "Window":"Ffenestr", + "Transparent":"Tryloyw", + "Semi-Transparent":"Hanner-dryloyw", + "Opaque":"Di-draidd", + "Font Size":"Maint y Ffont", + "Text Edge Style":"Arddull Ymylon Testun", + "None":"Dim", + "Raised":"Uwch", + "Depressed":"Is", + "Uniform":"Unffurf", + "Dropshadow":"Cysgod cefn", + "Font Family":"Teulu y Ffont", + "Proportional Sans-Serif":"Heb-Seriff Cyfraneddol", + "Monospace Sans-Serif":"Heb-Seriff Unlled", + "Proportional Serif":"Seriff Gyfraneddol", + "Monospace Serif":"Seriff Unlled", + "Casual":"Llawysgrif", + "Script":"Sgript", + "Small Caps":"Prif Lythyrennau Bychain", + "Reset":"Ailosod", + "restore all settings to the default values":"Adfer yr holl osodiadau diofyn", + "Done":"Gorffenwyd", + "Caption Settings Dialog":"Blwch Gosodiadau Capsiynau", + "Beginning of dialog window. Escape will cancel and close the window.":"Dechrau ffenestr deialog. Bydd Escape yn canslo a chau'r ffenestr.", + "End of dialog window.":"Diwedd ffenestr deialog.", + "{1} is loading.": "{1} yn llwytho." +} diff --git a/js/libs/videojs/lang/da.js b/js/libs/videojs/lang/da.js index f6b3ada8..9be95a95 100644 --- a/js/libs/videojs/lang/da.js +++ b/js/libs/videojs/lang/da.js @@ -1,26 +1,26 @@ -videojs.addLanguage("da",{ - "Play": "Afspil", - "Pause": "Pause", - "Current Time": "Aktuel tid", - "Duration Time": "Varighed", - "Remaining Time": "Resterende tid", - "Stream Type": "Stream-type", - "LIVE": "LIVE", - "Loaded": "Indlæst", - "Progress": "Status", - "Fullscreen": "Fuldskærm", - "Non-Fullscreen": "Luk fuldskærm", - "Mute": "Uden lyd", - "Unmute": "Med lyd", - "Playback Rate": "Afspilningsrate", - "Subtitles": "Undertekster", - "subtitles off": "Uden undertekster", - "Captions": "Undertekster for hørehæmmede", - "captions off": "Uden undertekster for hørehæmmede", - "Chapters": "Kapitler", - "You aborted the media playback": "Du afbrød videoafspilningen.", - "A network error caused the media download to fail part-way.": "En netværksfejl fik download af videoen til at fejle.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikke indlæses, enten fordi serveren eller netværket fejlede, eller fordi formatet ikke er understøttet.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoafspilningen blev afbrudt på grund af ødelagte data eller fordi videoen benyttede faciliteter som din browser ikke understøtter.", - "No compatible source was found for this media.": "Fandt ikke en kompatibel kilde for denne media." +videojs.addLanguage('da', { + "Play": "Afspil", + "Pause": "Pause", + "Current Time": "Aktuel tid", + "Duration": "Varighed", + "Remaining Time": "Resterende tid", + "Stream Type": "Stream-type", + "LIVE": "LIVE", + "Loaded": "Indlæst", + "Progress": "Status", + "Fullscreen": "Fuldskærm", + "Non-Fullscreen": "Luk fuldskærm", + "Mute": "Uden lyd", + "Unmute": "Med lyd", + "Playback Rate": "Afspilningsrate", + "Subtitles": "Undertekster", + "subtitles off": "Uden undertekster", + "Captions": "Undertekster for hørehæmmede", + "captions off": "Uden undertekster for hørehæmmede", + "Chapters": "Kapitler", + "You aborted the media playback": "Du afbrød videoafspilningen.", + "A network error caused the media download to fail part-way.": "En netværksfejl fik download af videoen til at fejle.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikke indlæses, enten fordi serveren eller netværket fejlede, eller fordi formatet ikke er understøttet.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoafspilningen blev afbrudt på grund af ødelagte data eller fordi videoen benyttede faciliteter som din browser ikke understøtter.", + "No compatible source was found for this media.": "Fandt ikke en kompatibel kilde for denne media." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/da.json b/js/libs/videojs/lang/da.json new file mode 100644 index 00000000..eeb298d6 --- /dev/null +++ b/js/libs/videojs/lang/da.json @@ -0,0 +1,26 @@ +{ + "Play": "Afspil", + "Pause": "Pause", + "Current Time": "Aktuel tid", + "Duration": "Varighed", + "Remaining Time": "Resterende tid", + "Stream Type": "Stream-type", + "LIVE": "LIVE", + "Loaded": "Indlæst", + "Progress": "Status", + "Fullscreen": "Fuldskærm", + "Non-Fullscreen": "Luk fuldskærm", + "Mute": "Uden lyd", + "Unmute": "Med lyd", + "Playback Rate": "Afspilningsrate", + "Subtitles": "Undertekster", + "subtitles off": "Uden undertekster", + "Captions": "Undertekster for hørehæmmede", + "captions off": "Uden undertekster for hørehæmmede", + "Chapters": "Kapitler", + "You aborted the media playback": "Du afbrød videoafspilningen.", + "A network error caused the media download to fail part-way.": "En netværksfejl fik download af videoen til at fejle.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikke indlæses, enten fordi serveren eller netværket fejlede, eller fordi formatet ikke er understøttet.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoafspilningen blev afbrudt på grund af ødelagte data eller fordi videoen benyttede faciliteter som din browser ikke understøtter.", + "No compatible source was found for this media.": "Fandt ikke en kompatibel kilde for denne media." +} diff --git a/js/libs/videojs/lang/de.js b/js/libs/videojs/lang/de.js index b9a4774e..23b253cc 100644 --- a/js/libs/videojs/lang/de.js +++ b/js/libs/videojs/lang/de.js @@ -1,84 +1,89 @@ -videojs.addLanguage("de",{ - "Play": "Wiedergabe", - "Pause": "Pause", - "Replay": "Erneut abspielen", - "Current Time": "Aktueller Zeitpunkt", - "Duration Time": "Dauer", - "Remaining Time": "Verbleibende Zeit", - "Stream Type": "Streamtyp", - "LIVE": "LIVE", - "Loaded": "Geladen", - "Progress": "Status", - "Fullscreen": "Vollbild", - "Non-Fullscreen": "Kein Vollbild", - "Mute": "Ton aus", - "Unmute": "Ton ein", - "Playback Rate": "Wiedergabegeschwindigkeit", - "Subtitles": "Untertitel", - "subtitles off": "Untertitel aus", - "Captions": "Untertitel", - "captions off": "Untertitel aus", - "Chapters": "Kapitel", - "You aborted the media playback": "Sie haben die Videowiedergabe abgebrochen.", - "A network error caused the media download to fail part-way.": "Der Videodownload ist aufgrund eines Netzwerkfehlers fehlgeschlagen.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Die Videowiedergabe wurde entweder wegen eines Problems mit einem beschädigten Video oder wegen verwendeten Funktionen, die vom Browser nicht unterstützt werden, abgebrochen.", - "No compatible source was found for this media.": "Für dieses Video wurde keine kompatible Quelle gefunden.", - "Play Video": "Video abspielen", - "Close": "Schließen", - "Modal Window": "Modales Fenster", - "This is a modal window": "Dies ist ein modales Fenster", - "This modal can be closed by pressing the Escape key or activating the close button.": "Durch Drücken der Esc-Taste bzw. Betätigung der Schaltfläche \"Schließen\" wird dieses modale Fenster geschlossen.", - ", opens captions settings dialog": ", öffnet Einstellungen für Untertitel", - ", opens subtitles settings dialog": ", öffnet Einstellungen für Untertitel", - ", selected": ", ausgewählt", - "captions settings": "Untertiteleinstellungen", - "subtitles settings": "Untertiteleinstellungen", - "descriptions settings": "Einstellungen für Beschreibungen", - "Close Modal Dialog": "Modales Fenster schließen", - "Descriptions": "Beschreibungen", - "descriptions off": "Beschreibungen aus", - "The media is encrypted and we do not have the keys to decrypt it.": "Die Entschlüsselungsschlüssel für den verschlüsselten Medieninhalt sind nicht verfügbar.", - ", opens descriptions settings dialog": ", öffnet Einstellungen für Beschreibungen", - "Audio Track": "Tonspur", - "Text": "Schrift", - "White": "Weiß", - "Black": "Schwarz", - "Red": "Rot", - "Green": "Grün", - "Blue": "Blau", - "Yellow": "Gelb", - "Magenta": "Magenta", - "Cyan": "Türkis", - "Background": "Hintergrund", - "Window": "Fenster", - "Transparent": "Durchsichtig", - "Semi-Transparent": "Halbdurchsichtig", - "Opaque": "Undurchsictig", - "Font Size": "Schriftgröße", - "Text Edge Style": "Textkantenstil", - "None": "Kein", - "Raised": "Erhoben", - "Depressed": "Gedrückt", - "Uniform": "Uniform", - "Dropshadow": "Schlagschatten", - "Font Family": "Schristfamilie", - "Proportional Sans-Serif": "Proportionale Sans-Serif", - "Monospace Sans-Serif": "Monospace Sans-Serif", - "Proportional Serif": "Proportionale Serif", - "Monospace Serif": "Monospace Serif", - "Casual": "Zwanglos", - "Script": "Schreibeschrift", - "Small Caps": "Small-Caps", - "Reset": "Zurücksetzen", - "restore all settings to the default values": "Alle Einstellungen auf die Standardwerte zurücksetzen", - "Done": "Fertig", - "Caption Settings Dialog": "Einstellungsdialog für Untertitel", - "Beginning of dialog window. Escape will cancel and close the window.": "Anfang des Dialogfensters. Esc bricht ab und schließt das Fenster.", - "End of dialog window.": "Ende des Dialogfensters.", - "Audio Player": "Audio-Player", - "Video Player": "Video-Player", - "Progress Bar": "Forschrittsbalken", - "progress bar timing: currentTime={1} duration={2}": "{1} von {2}", - "Volume Level": "Lautstärkestufe" +videojs.addLanguage('de', { + "Play": "Wiedergabe", + "Pause": "Pause", + "Replay": "Erneut abspielen", + "Current Time": "Aktueller Zeitpunkt", + "Duration": "Dauer", + "Remaining Time": "Verbleibende Zeit", + "Stream Type": "Streamtyp", + "LIVE": "LIVE", + "Loaded": "Geladen", + "Progress": "Status", + "Fullscreen": "Vollbild", + "Non-Fullscreen": "Vollbildmodus beenden", + "Mute": "Ton aus", + "Unmute": "Ton ein", + "Playback Rate": "Wiedergabegeschwindigkeit", + "Subtitles": "Untertitel", + "subtitles off": "Untertitel aus", + "Captions": "Untertitel", + "captions off": "Untertitel aus", + "Chapters": "Kapitel", + "You aborted the media playback": "Sie haben die Videowiedergabe abgebrochen.", + "A network error caused the media download to fail part-way.": "Der Videodownload ist aufgrund eines Netzwerkfehlers fehlgeschlagen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Die Videowiedergabe wurde entweder wegen eines Problems mit einem beschädigten Video oder wegen verwendeten Funktionen, die vom Browser nicht unterstützt werden, abgebrochen.", + "No compatible source was found for this media.": "Für dieses Video wurde keine kompatible Quelle gefunden.", + "Play Video": "Video abspielen", + "Close": "Schließen", + "Modal Window": "Modales Fenster", + "This is a modal window": "Dies ist ein modales Fenster", + "This modal can be closed by pressing the Escape key or activating the close button.": "Durch Drücken der Esc-Taste bzw. Betätigung der Schaltfläche \"Schließen\" wird dieses modale Fenster geschlossen.", + ", opens captions settings dialog": ", öffnet Einstellungen für Untertitel", + ", opens subtitles settings dialog": ", öffnet Einstellungen für Untertitel", + ", selected": ", ausgewählt", + "captions settings": "Untertiteleinstellungen", + "subtitles settings": "Untertiteleinstellungen", + "descriptions settings": "Einstellungen für Beschreibungen", + "Close Modal Dialog": "Modales Fenster schließen", + "Descriptions": "Beschreibungen", + "descriptions off": "Beschreibungen aus", + "The media is encrypted and we do not have the keys to decrypt it.": "Die Entschlüsselungsschlüssel für den verschlüsselten Medieninhalt sind nicht verfügbar.", + ", opens descriptions settings dialog": ", öffnet Einstellungen für Beschreibungen", + "Audio Track": "Tonspur", + "Text": "Schrift", + "White": "Weiß", + "Black": "Schwarz", + "Red": "Rot", + "Green": "Grün", + "Blue": "Blau", + "Yellow": "Gelb", + "Magenta": "Magenta", + "Cyan": "Türkis", + "Background": "Hintergrund", + "Window": "Fenster", + "Transparent": "Durchsichtig", + "Semi-Transparent": "Halbdurchsichtig", + "Opaque": "Undurchsichtig", + "Font Size": "Schriftgröße", + "Text Edge Style": "Textkantenstil", + "None": "Kein", + "Raised": "Erhoben", + "Depressed": "Gedrückt", + "Uniform": "Uniform", + "Dropshadow": "Schlagschatten", + "Font Family": "Schriftfamilie", + "Proportional Sans-Serif": "Proportionale Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportionale Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Zwanglos", + "Script": "Schreibschrift", + "Small Caps": "Small-Caps", + "Reset": "Zurücksetzen", + "restore all settings to the default values": "Alle Einstellungen auf die Standardwerte zurücksetzen", + "Done": "Fertig", + "Caption Settings Dialog": "Einstellungsdialog für Untertitel", + "Beginning of dialog window. Escape will cancel and close the window.": "Anfang des Dialogfensters. Esc bricht ab und schließt das Fenster.", + "End of dialog window.": "Ende des Dialogfensters.", + "Audio Player": "Audio-Player", + "Video Player": "Video-Player", + "Progress Bar": "Fortschrittsbalken", + "progress bar timing: currentTime={1} duration={2}": "{1} von {2}", + "Volume Level": "Lautstärke", + "{1} is loading.": "{1} wird geladen.", + "Seek to live, currently behind live": "Zur Live-Übertragung wechseln. Aktuell wird es nicht live abgespielt.", + "Seek to live, currently playing live": "Zur Live-Übertragung wechseln. Es wird aktuell live abgespielt.", + "Exit Picture-in-Picture": "Bild-im-Bild-Modus beenden", + "Picture-in-Picture": "Bild-im-Bild-Modus" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/de.json b/js/libs/videojs/lang/de.json new file mode 100644 index 00000000..42b6768b --- /dev/null +++ b/js/libs/videojs/lang/de.json @@ -0,0 +1,90 @@ +{ + "Play": "Wiedergabe", + "Pause": "Pause", + "Replay": "Erneut abspielen", + "Current Time": "Aktueller Zeitpunkt", + "Duration": "Dauer", + "Remaining Time": "Verbleibende Zeit", + "Stream Type": "Streamtyp", + "LIVE": "LIVE", + "Loaded": "Geladen", + "Progress": "Status", + "Fullscreen": "Vollbild", + "Non-Fullscreen": "Vollbildmodus beenden", + "Mute": "Ton aus", + "Unmute": "Ton ein", + "Playback Rate": "Wiedergabegeschwindigkeit", + "Subtitles": "Untertitel", + "subtitles off": "Untertitel aus", + "Captions": "Untertitel", + "captions off": "Untertitel aus", + "Chapters": "Kapitel", + "You aborted the media playback": "Sie haben die Videowiedergabe abgebrochen.", + "A network error caused the media download to fail part-way.": "Der Videodownload ist aufgrund eines Netzwerkfehlers fehlgeschlagen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Die Videowiedergabe wurde entweder wegen eines Problems mit einem beschädigten Video oder wegen verwendeten Funktionen, die vom Browser nicht unterstützt werden, abgebrochen.", + "No compatible source was found for this media.": "Für dieses Video wurde keine kompatible Quelle gefunden.", + "Play Video": "Video abspielen", + "Close": "Schließen", + "Modal Window": "Modales Fenster", + "This is a modal window": "Dies ist ein modales Fenster", + "This modal can be closed by pressing the Escape key or activating the close button.": "Durch Drücken der Esc-Taste bzw. Betätigung der Schaltfläche \"Schließen\" wird dieses modale Fenster geschlossen.", + ", opens captions settings dialog": ", öffnet Einstellungen für Untertitel", + ", opens subtitles settings dialog": ", öffnet Einstellungen für Untertitel", + ", selected": ", ausgewählt", + "captions settings": "Untertiteleinstellungen", + "subtitles settings": "Untertiteleinstellungen", + "descriptions settings": "Einstellungen für Beschreibungen", + "Close Modal Dialog": "Modales Fenster schließen", + "Descriptions": "Beschreibungen", + "descriptions off": "Beschreibungen aus", + "The media is encrypted and we do not have the keys to decrypt it.": "Die Entschlüsselungsschlüssel für den verschlüsselten Medieninhalt sind nicht verfügbar.", + ", opens descriptions settings dialog": ", öffnet Einstellungen für Beschreibungen", + "Audio Track": "Tonspur", + "Text": "Schrift", + "White": "Weiß", + "Black": "Schwarz", + "Red": "Rot", + "Green": "Grün", + "Blue": "Blau", + "Yellow": "Gelb", + "Magenta": "Magenta", + "Cyan": "Türkis", + "Background": "Hintergrund", + "Window": "Fenster", + "Transparent": "Durchsichtig", + "Semi-Transparent": "Halbdurchsichtig", + "Opaque": "Undurchsichtig", + "Font Size": "Schriftgröße", + "Text Edge Style": "Textkantenstil", + "None": "Kein", + "Raised": "Erhoben", + "Depressed": "Gedrückt", + "Uniform": "Uniform", + "Dropshadow": "Schlagschatten", + "Font Family": "Schriftfamilie", + "Proportional Sans-Serif": "Proportionale Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportionale Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Zwanglos", + "Script": "Schreibschrift", + "Small Caps": "Small-Caps", + "Reset": "Zurücksetzen", + "restore all settings to the default values": "Alle Einstellungen auf die Standardwerte zurücksetzen", + "Done": "Fertig", + "Caption Settings Dialog": "Einstellungsdialog für Untertitel", + "Beginning of dialog window. Escape will cancel and close the window.": "Anfang des Dialogfensters. Esc bricht ab und schließt das Fenster.", + "End of dialog window.": "Ende des Dialogfensters.", + "Audio Player": "Audio-Player", + "Video Player": "Video-Player", + "Progress Bar": "Fortschrittsbalken", + "progress bar timing: currentTime={1} duration={2}": "{1} von {2}", + "Volume Level": "Lautstärke", + "{1} is loading.": "{1} wird geladen.", + "Seek to live, currently behind live": "Zur Live-Übertragung wechseln. Aktuell wird es nicht live abgespielt.", + "Seek to live, currently playing live": "Zur Live-Übertragung wechseln. Es wird aktuell live abgespielt.", + "Exit Picture-in-Picture": "Bild-im-Bild-Modus beenden", + "Picture-in-Picture": "Bild-im-Bild-Modus" +} + diff --git a/js/libs/videojs/lang/el.js b/js/libs/videojs/lang/el.js index 67bd1682..795b430d 100644 --- a/js/libs/videojs/lang/el.js +++ b/js/libs/videojs/lang/el.js @@ -1,40 +1,40 @@ -videojs.addLanguage("el",{ - "Play": "Aναπαραγωγή", - "Pause": "Παύση", - "Current Time": "Τρέχων χρόνος", - "Duration Time": "Συνολικός χρόνος", - "Remaining Time": "Υπολοιπόμενος χρόνος", - "Stream Type": "Τύπος ροής", - "LIVE": "ΖΩΝΤΑΝΑ", - "Loaded": "Φόρτωση επιτυχής", - "Progress": "Πρόοδος", - "Fullscreen": "Πλήρης οθόνη", - "Non-Fullscreen": "Έξοδος από πλήρη οθόνη", - "Mute": "Σίγαση", - "Unmute": "Kατάργηση σίγασης", - "Playback Rate": "Ρυθμός αναπαραγωγής", - "Subtitles": "Υπότιτλοι", - "subtitles off": "απόκρυψη υπότιτλων", - "Captions": "Λεζάντες", - "captions off": "απόκρυψη λεζάντων", - "Chapters": "Κεφάλαια", - "Close Modal Dialog": "Κλείσιμο παραθύρου", - "Descriptions": "Περιγραφές", - "descriptions off": "απόκρυψη περιγραφών", - "Audio Track": "Ροή ήχου", - "You aborted the media playback": "Ακυρώσατε την αναπαραγωγή", - "A network error caused the media download to fail part-way.": "Ένα σφάλμα δικτύου προκάλεσε την αποτυχία μεταφόρτωσης του αρχείου προς αναπαραγωγή.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Το αρχείο προς αναπαραγωγή δεν ήταν δυνατό να φορτωθεί είτε γιατί υπήρξε σφάλμα στον διακομιστή ή το δίκτυο, είτε γιατί ο τύπος του αρχείου δεν υποστηρίζεται.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Η αναπαραγωγή ακυρώθηκε είτε λόγω κατεστραμμένου αρχείου, είτε γιατί το αρχείο απαιτεί λειτουργίες που δεν υποστηρίζονται από το πρόγραμμα περιήγησης που χρησιμοποιείτε.", - "No compatible source was found for this media.": "Δεν βρέθηκε συμβατή πηγή αναπαραγωγής για το συγκεκριμένο αρχείο.", - "The media is encrypted and we do not have the keys to decrypt it.": "Το αρχείο προς αναπαραγωγή είναι κρυπτογραφημένo και δεν υπάρχουν τα απαραίτητα κλειδιά αποκρυπτογράφησης.", - "Play Video": "Αναπαραγωγή βίντεο", - "Close": "Κλείσιμο", - "Modal Window": "Aναδυόμενο παράθυρο", - "This is a modal window": "Το παρών είναι ένα αναδυόμενο παράθυρο", - "This modal can be closed by pressing the Escape key or activating the close button.": "Αυτό το παράθυρο μπορεί να εξαφανιστεί πατώντας το πλήκτρο Escape ή πατώντας το κουμπί κλεισίματος.", - ", opens captions settings dialog": ", εμφανίζει τις ρυθμίσεις για τις λεζάντες", - ", opens subtitles settings dialog": ", εμφανίζει τις ρυθμίσεις για τους υπότιτλους", - ", opens descriptions settings dialog": ", εμφανίζει τις ρυθμίσεις για τις περιγραφές", - ", selected": ", επιλεγμένο" +videojs.addLanguage('el', { + "Play": "Aναπαραγωγή", + "Pause": "Παύση", + "Current Time": "Τρέχων χρόνος", + "Duration": "Συνολικός χρόνος", + "Remaining Time": "Υπολοιπόμενος χρόνος", + "Stream Type": "Τύπος ροής", + "LIVE": "ΖΩΝΤΑΝΑ", + "Loaded": "Φόρτωση επιτυχής", + "Progress": "Πρόοδος", + "Fullscreen": "Πλήρης οθόνη", + "Non-Fullscreen": "Έξοδος από πλήρη οθόνη", + "Mute": "Σίγαση", + "Unmute": "Kατάργηση σίγασης", + "Playback Rate": "Ρυθμός αναπαραγωγής", + "Subtitles": "Υπότιτλοι", + "subtitles off": "απόκρυψη υπότιτλων", + "Captions": "Λεζάντες", + "captions off": "απόκρυψη λεζάντων", + "Chapters": "Κεφάλαια", + "Close Modal Dialog": "Κλείσιμο παραθύρου", + "Descriptions": "Περιγραφές", + "descriptions off": "απόκρυψη περιγραφών", + "Audio Track": "Ροή ήχου", + "You aborted the media playback": "Ακυρώσατε την αναπαραγωγή", + "A network error caused the media download to fail part-way.": "Ένα σφάλμα δικτύου προκάλεσε την αποτυχία μεταφόρτωσης του αρχείου προς αναπαραγωγή.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Το αρχείο προς αναπαραγωγή δεν ήταν δυνατό να φορτωθεί είτε γιατί υπήρξε σφάλμα στον διακομιστή ή το δίκτυο, είτε γιατί ο τύπος του αρχείου δεν υποστηρίζεται.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Η αναπαραγωγή ακυρώθηκε είτε λόγω κατεστραμμένου αρχείου, είτε γιατί το αρχείο απαιτεί λειτουργίες που δεν υποστηρίζονται από το πρόγραμμα περιήγησης που χρησιμοποιείτε.", + "No compatible source was found for this media.": "Δεν βρέθηκε συμβατή πηγή αναπαραγωγής για το συγκεκριμένο αρχείο.", + "The media is encrypted and we do not have the keys to decrypt it.": "Το αρχείο προς αναπαραγωγή είναι κρυπτογραφημένo και δεν υπάρχουν τα απαραίτητα κλειδιά αποκρυπτογράφησης.", + "Play Video": "Αναπαραγωγή βίντεο", + "Close": "Κλείσιμο", + "Modal Window": "Aναδυόμενο παράθυρο", + "This is a modal window": "Το παρών είναι ένα αναδυόμενο παράθυρο", + "This modal can be closed by pressing the Escape key or activating the close button.": "Αυτό το παράθυρο μπορεί να εξαφανιστεί πατώντας το πλήκτρο Escape ή πατώντας το κουμπί κλεισίματος.", + ", opens captions settings dialog": ", εμφανίζει τις ρυθμίσεις για τις λεζάντες", + ", opens subtitles settings dialog": ", εμφανίζει τις ρυθμίσεις για τους υπότιτλους", + ", opens descriptions settings dialog": ", εμφανίζει τις ρυθμίσεις για τις περιγραφές", + ", selected": ", επιλεγμένο" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/el.json b/js/libs/videojs/lang/el.json new file mode 100644 index 00000000..16b48b83 --- /dev/null +++ b/js/libs/videojs/lang/el.json @@ -0,0 +1,40 @@ +{ + "Play": "Aναπαραγωγή", + "Pause": "Παύση", + "Current Time": "Τρέχων χρόνος", + "Duration": "Συνολικός χρόνος", + "Remaining Time": "Υπολοιπόμενος χρόνος", + "Stream Type": "Τύπος ροής", + "LIVE": "ΖΩΝΤΑΝΑ", + "Loaded": "Φόρτωση επιτυχής", + "Progress": "Πρόοδος", + "Fullscreen": "Πλήρης οθόνη", + "Non-Fullscreen": "Έξοδος από πλήρη οθόνη", + "Mute": "Σίγαση", + "Unmute": "Kατάργηση σίγασης", + "Playback Rate": "Ρυθμός αναπαραγωγής", + "Subtitles": "Υπότιτλοι", + "subtitles off": "απόκρυψη υπότιτλων", + "Captions": "Λεζάντες", + "captions off": "απόκρυψη λεζάντων", + "Chapters": "Κεφάλαια", + "Close Modal Dialog": "Κλείσιμο παραθύρου", + "Descriptions": "Περιγραφές", + "descriptions off": "απόκρυψη περιγραφών", + "Audio Track": "Ροή ήχου", + "You aborted the media playback": "Ακυρώσατε την αναπαραγωγή", + "A network error caused the media download to fail part-way.": "Ένα σφάλμα δικτύου προκάλεσε την αποτυχία μεταφόρτωσης του αρχείου προς αναπαραγωγή.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Το αρχείο προς αναπαραγωγή δεν ήταν δυνατό να φορτωθεί είτε γιατί υπήρξε σφάλμα στον διακομιστή ή το δίκτυο, είτε γιατί ο τύπος του αρχείου δεν υποστηρίζεται.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Η αναπαραγωγή ακυρώθηκε είτε λόγω κατεστραμμένου αρχείου, είτε γιατί το αρχείο απαιτεί λειτουργίες που δεν υποστηρίζονται από το πρόγραμμα περιήγησης που χρησιμοποιείτε.", + "No compatible source was found for this media.": "Δεν βρέθηκε συμβατή πηγή αναπαραγωγής για το συγκεκριμένο αρχείο.", + "The media is encrypted and we do not have the keys to decrypt it.": "Το αρχείο προς αναπαραγωγή είναι κρυπτογραφημένo και δεν υπάρχουν τα απαραίτητα κλειδιά αποκρυπτογράφησης.", + "Play Video": "Αναπαραγωγή βίντεο", + "Close": "Κλείσιμο", + "Modal Window": "Aναδυόμενο παράθυρο", + "This is a modal window": "Το παρών είναι ένα αναδυόμενο παράθυρο", + "This modal can be closed by pressing the Escape key or activating the close button.": "Αυτό το παράθυρο μπορεί να εξαφανιστεί πατώντας το πλήκτρο Escape ή πατώντας το κουμπί κλεισίματος.", + ", opens captions settings dialog": ", εμφανίζει τις ρυθμίσεις για τις λεζάντες", + ", opens subtitles settings dialog": ", εμφανίζει τις ρυθμίσεις για τους υπότιτλους", + ", opens descriptions settings dialog": ", εμφανίζει τις ρυθμίσεις για τις περιγραφές", + ", selected": ", επιλεγμένο" +} diff --git a/js/libs/videojs/lang/en.js b/js/libs/videojs/lang/en.js index 901d05d6..ef630d1a 100644 --- a/js/libs/videojs/lang/en.js +++ b/js/libs/videojs/lang/en.js @@ -1,84 +1,89 @@ -videojs.addLanguage("en",{ - "Audio Player": "Audio Player", - "Video Player": "Video Player", - "Play": "Play", - "Pause": "Pause", - "Replay": "Replay", - "Current Time": "Current Time", - "Duration Time": "Duration Time", - "Remaining Time": "Remaining Time", - "Stream Type": "Stream Type", - "LIVE": "LIVE", - "Loaded": "Loaded", - "Progress": "Progress", - "Progress Bar": "Progress Bar", - "progress bar timing: currentTime={1} duration={2}": "{1} of {2}", - "Fullscreen": "Fullscreen", - "Non-Fullscreen": "Non-Fullscreen", - "Mute": "Mute", - "Unmute": "Unmute", - "Playback Rate": "Playback Rate", - "Subtitles": "Subtitles", - "subtitles off": "subtitles off", - "Captions": "Captions", - "captions off": "captions off", - "Chapters": "Chapters", - "Descriptions": "Descriptions", - "descriptions off": "descriptions off", - "Audio Track": "Audio Track", - "Volume Level": "Volume Level", - "You aborted the media playback": "You aborted the media playback", - "A network error caused the media download to fail part-way.": "A network error caused the media download to fail part-way.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "The media could not be loaded, either because the server or network failed or because the format is not supported.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.", - "No compatible source was found for this media.": "No compatible source was found for this media.", - "The media is encrypted and we do not have the keys to decrypt it.": "The media is encrypted and we do not have the keys to decrypt it.", - "Play Video": "Play Video", - "Close": "Close", - "Close Modal Dialog": "Close Modal Dialog", - "Modal Window": "Modal Window", - "This is a modal window": "This is a modal window", - "This modal can be closed by pressing the Escape key or activating the close button.": "This modal can be closed by pressing the Escape key or activating the close button.", - ", opens captions settings dialog": ", opens captions settings dialog", - ", opens subtitles settings dialog": ", opens subtitles settings dialog", - ", opens descriptions settings dialog": ", opens descriptions settings dialog", - ", selected": ", selected", - "captions settings": "captions settings", - "subtitles settings": "subititles settings", - "descriptions settings": "descriptions settings", - "Text": "Text", - "White": "White", - "Black": "Black", - "Red": "Red", - "Green": "Green", - "Blue": "Blue", - "Yellow": "Yellow", - "Magenta": "Magenta", - "Cyan": "Cyan", - "Background": "Background", - "Window": "Window", - "Transparent": "Transparent", - "Semi-Transparent": "Semi-Transparent", - "Opaque": "Opaque", - "Font Size": "Font Size", - "Text Edge Style": "Text Edge Style", - "None": "None", - "Raised": "Raised", - "Depressed": "Depressed", - "Uniform": "Uniform", - "Dropshadow": "Dropshadow", - "Font Family": "Font Family", - "Proportional Sans-Serif": "Proportional Sans-Serif", - "Monospace Sans-Serif": "Monospace Sans-Serif", - "Proportional Serif": "Proportional Serif", - "Monospace Serif": "Monospace Serif", - "Casual": "Casual", - "Script": "Script", - "Small Caps": "Small Caps", - "Reset": "Reset", - "restore all settings to the default values": "restore all settings to the default values", - "Done": "Done", - "Caption Settings Dialog": "Caption Settings Dialog", - "Beginning of dialog window. Escape will cancel and close the window.": "Beginning of dialog window. Escape will cancel and close the window.", - "End of dialog window.": "End of dialog window." +videojs.addLanguage('en', { + "Audio Player": "Audio Player", + "Video Player": "Video Player", + "Play": "Play", + "Pause": "Pause", + "Replay": "Replay", + "Current Time": "Current Time", + "Duration": "Duration", + "Remaining Time": "Remaining Time", + "Stream Type": "Stream Type", + "LIVE": "LIVE", + "Seek to live, currently behind live": "Seek to live, currently behind live", + "Seek to live, currently playing live": "Seek to live, currently playing live", + "Loaded": "Loaded", + "Progress": "Progress", + "Progress Bar": "Progress Bar", + "progress bar timing: currentTime={1} duration={2}": "{1} of {2}", + "Fullscreen": "Fullscreen", + "Non-Fullscreen": "Exit Fullscreen", + "Mute": "Mute", + "Unmute": "Unmute", + "Playback Rate": "Playback Rate", + "Subtitles": "Subtitles", + "subtitles off": "subtitles off", + "Captions": "Captions", + "captions off": "captions off", + "Chapters": "Chapters", + "Descriptions": "Descriptions", + "descriptions off": "descriptions off", + "Audio Track": "Audio Track", + "Volume Level": "Volume Level", + "You aborted the media playback": "You aborted the media playback", + "A network error caused the media download to fail part-way.": "A network error caused the media download to fail part-way.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "The media could not be loaded, either because the server or network failed or because the format is not supported.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.", + "No compatible source was found for this media.": "No compatible source was found for this media.", + "The media is encrypted and we do not have the keys to decrypt it.": "The media is encrypted and we do not have the keys to decrypt it.", + "Play Video": "Play Video", + "Close": "Close", + "Close Modal Dialog": "Close Modal Dialog", + "Modal Window": "Modal Window", + "This is a modal window": "This is a modal window", + "This modal can be closed by pressing the Escape key or activating the close button.": "This modal can be closed by pressing the Escape key or activating the close button.", + ", opens captions settings dialog": ", opens captions settings dialog", + ", opens subtitles settings dialog": ", opens subtitles settings dialog", + ", opens descriptions settings dialog": ", opens descriptions settings dialog", + ", selected": ", selected", + "captions settings": "captions settings", + "subtitles settings": "subtitles settings", + "descriptions settings": "descriptions settings", + "Text": "Text", + "White": "White", + "Black": "Black", + "Red": "Red", + "Green": "Green", + "Blue": "Blue", + "Yellow": "Yellow", + "Magenta": "Magenta", + "Cyan": "Cyan", + "Background": "Background", + "Window": "Window", + "Transparent": "Transparent", + "Semi-Transparent": "Semi-Transparent", + "Opaque": "Opaque", + "Font Size": "Font Size", + "Text Edge Style": "Text Edge Style", + "None": "None", + "Raised": "Raised", + "Depressed": "Depressed", + "Uniform": "Uniform", + "Dropshadow": "Dropshadow", + "Font Family": "Font Family", + "Proportional Sans-Serif": "Proportional Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportional Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Casual", + "Script": "Script", + "Small Caps": "Small Caps", + "Reset": "Reset", + "restore all settings to the default values": "restore all settings to the default values", + "Done": "Done", + "Caption Settings Dialog": "Caption Settings Dialog", + "Beginning of dialog window. Escape will cancel and close the window.": "Beginning of dialog window. Escape will cancel and close the window.", + "End of dialog window.": "End of dialog window.", + "{1} is loading.": "{1} is loading.", + "Exit Picture-in-Picture": "Exit Picture-in-Picture", + "Picture-in-Picture": "Picture-in-Picture" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/en.json b/js/libs/videojs/lang/en.json new file mode 100644 index 00000000..649120c5 --- /dev/null +++ b/js/libs/videojs/lang/en.json @@ -0,0 +1,89 @@ +{ + "Audio Player": "Audio Player", + "Video Player": "Video Player", + "Play": "Play", + "Pause": "Pause", + "Replay": "Replay", + "Current Time": "Current Time", + "Duration": "Duration", + "Remaining Time": "Remaining Time", + "Stream Type": "Stream Type", + "LIVE": "LIVE", + "Seek to live, currently behind live": "Seek to live, currently behind live", + "Seek to live, currently playing live": "Seek to live, currently playing live", + "Loaded": "Loaded", + "Progress": "Progress", + "Progress Bar": "Progress Bar", + "progress bar timing: currentTime={1} duration={2}": "{1} of {2}", + "Fullscreen": "Fullscreen", + "Non-Fullscreen": "Exit Fullscreen", + "Mute": "Mute", + "Unmute": "Unmute", + "Playback Rate": "Playback Rate", + "Subtitles": "Subtitles", + "subtitles off": "subtitles off", + "Captions": "Captions", + "captions off": "captions off", + "Chapters": "Chapters", + "Descriptions": "Descriptions", + "descriptions off": "descriptions off", + "Audio Track": "Audio Track", + "Volume Level": "Volume Level", + "You aborted the media playback": "You aborted the media playback", + "A network error caused the media download to fail part-way.": "A network error caused the media download to fail part-way.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "The media could not be loaded, either because the server or network failed or because the format is not supported.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.", + "No compatible source was found for this media.": "No compatible source was found for this media.", + "The media is encrypted and we do not have the keys to decrypt it.": "The media is encrypted and we do not have the keys to decrypt it.", + "Play Video": "Play Video", + "Close": "Close", + "Close Modal Dialog": "Close Modal Dialog", + "Modal Window": "Modal Window", + "This is a modal window": "This is a modal window", + "This modal can be closed by pressing the Escape key or activating the close button.": "This modal can be closed by pressing the Escape key or activating the close button.", + ", opens captions settings dialog": ", opens captions settings dialog", + ", opens subtitles settings dialog": ", opens subtitles settings dialog", + ", opens descriptions settings dialog": ", opens descriptions settings dialog", + ", selected": ", selected", + "captions settings": "captions settings", + "subtitles settings": "subtitles settings", + "descriptions settings": "descriptions settings", + "Text": "Text", + "White": "White", + "Black": "Black", + "Red": "Red", + "Green": "Green", + "Blue": "Blue", + "Yellow": "Yellow", + "Magenta": "Magenta", + "Cyan": "Cyan", + "Background": "Background", + "Window": "Window", + "Transparent": "Transparent", + "Semi-Transparent": "Semi-Transparent", + "Opaque": "Opaque", + "Font Size": "Font Size", + "Text Edge Style": "Text Edge Style", + "None": "None", + "Raised": "Raised", + "Depressed": "Depressed", + "Uniform": "Uniform", + "Dropshadow": "Dropshadow", + "Font Family": "Font Family", + "Proportional Sans-Serif": "Proportional Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportional Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Casual", + "Script": "Script", + "Small Caps": "Small Caps", + "Reset": "Reset", + "restore all settings to the default values": "restore all settings to the default values", + "Done": "Done", + "Caption Settings Dialog": "Caption Settings Dialog", + "Beginning of dialog window. Escape will cancel and close the window.": "Beginning of dialog window. Escape will cancel and close the window.", + "End of dialog window.": "End of dialog window.", + "{1} is loading.": "{1} is loading.", + "Exit Picture-in-Picture": "Exit Picture-in-Picture", + "Picture-in-Picture": "Picture-in-Picture" +} diff --git a/js/libs/videojs/lang/es.js b/js/libs/videojs/lang/es.js index b9f26b82..8656b790 100644 --- a/js/libs/videojs/lang/es.js +++ b/js/libs/videojs/lang/es.js @@ -1,27 +1,89 @@ -videojs.addLanguage("es",{ - "Play": "Reproducción", - "Play Video": "Reproducción Vídeo", - "Pause": "Pausa", - "Current Time": "Tiempo reproducido", - "Duration Time": "Duración total", - "Remaining Time": "Tiempo restante", - "Stream Type": "Tipo de secuencia", - "LIVE": "DIRECTO", - "Loaded": "Cargado", - "Progress": "Progreso", - "Fullscreen": "Pantalla completa", - "Non-Fullscreen": "Pantalla no completa", - "Mute": "Silenciar", - "Unmute": "No silenciado", - "Playback Rate": "Velocidad de reproducción", - "Subtitles": "Subtítulos", - "subtitles off": "Subtítulos desactivados", - "Captions": "Subtítulos especiales", - "captions off": "Subtítulos especiales desactivados", - "Chapters": "Capítulos", - "You aborted the media playback": "Ha interrumpido la reproducción del vídeo.", - "A network error caused the media download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.", - "No compatible source was found for this media.": "No se ha encontrado ninguna fuente compatible con este vídeo." +videojs.addLanguage('es', { + "Play": "Reproducir", + "Play Video": "Reproducir Vídeo", + "Pause": "Pausa", + "Current Time": "Tiempo reproducido", + "Duration": "Duración total", + "Remaining Time": "Tiempo restante", + "Stream Type": "Tipo de secuencia", + "LIVE": "DIRECTO", + "Loaded": "Cargado", + "Progress": "Progreso", + "Fullscreen": "Pantalla completa", + "Non-Fullscreen": "Pantalla no completa", + "Mute": "Silenciar", + "Unmute": "No silenciado", + "Playback Rate": "Velocidad de reproducción", + "Subtitles": "Subtítulos", + "subtitles off": "Subtítulos desactivados", + "Captions": "Subtítulos especiales", + "captions off": "Subtítulos especiales desactivados", + "Chapters": "Capítulos", + "You aborted the media playback": "Ha interrumpido la reproducción del vídeo.", + "A network error caused the media download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.", + "No compatible source was found for this media.": "No se ha encontrado ninguna fuente compatible con este vídeo.", + "Audio Player": "Reproductor de audio", + "Video Player": "Reproductor de video", + "Replay": "Volver a reproducir", + "Seek to live, currently behind live": "Buscar en vivo, actualmente demorado con respecto a la transmisión en vivo", + "Seek to live, currently playing live": "Buscar en vivo, actualmente reproduciendo en vivo", + "Progress Bar": "Barra de progreso", + "progress bar timing: currentTime={1} duration={2}": "{1} de {2}", + "Descriptions": "Descripciones", + "descriptions off": "descripciones desactivadas", + "Audio Track": "Pista de audio", + "Volume Level": "Nivel de volumen", + "The media is encrypted and we do not have the keys to decrypt it.": "El material audiovisual está cifrado y no tenemos las claves para descifrarlo.", + "Close": "Cerrar", + "Modal Window": "Ventana modal", + "This is a modal window": "Esta es una ventana modal", + "This modal can be closed by pressing the Escape key or activating the close button.": "Esta ventana modal puede cerrarse presionando la tecla Escape o activando el botón de cierre.", + ", opens captions settings dialog": ", abre el diálogo de configuración de leyendas", + ", opens subtitles settings dialog": ", abre el diálogo de configuración de subtítulos", + ", selected": ", seleccionado", + "Close Modal Dialog": "Cierra cuadro de diálogo modal", + ", opens descriptions settings dialog": ", abre el diálogo de configuración de las descripciones", + "captions settings": "configuración de leyendas", + "subtitles settings": "configuración de subtítulos", + "descriptions settings": "configuración de descripciones", + "Text": "Texto", + "White": "Blanco", + "Black": "Negro", + "Red": "Rojo", + "Green": "Verde", + "Blue": "Azul", + "Yellow": "Amarillo", + "Magenta": "Magenta", + "Cyan": "Cian", + "Background": "Fondo", + "Window": "Ventana", + "Transparent": "Transparente", + "Semi-Transparent": "Semitransparente", + "Opaque": "Opaca", + "Font Size": "Tamaño de fuente", + "Text Edge Style": "Estilo de borde del texto", + "None": "Ninguno", + "Raised": "En relieve", + "Depressed": "Hundido", + "Uniform": "Uniforme", + "Dropshadow": "Sombra paralela", + "Font Family": "Familia de fuente", + "Proportional Sans-Serif": "Sans-Serif proporcional", + "Monospace Sans-Serif": "Sans-Serif monoespacio", + "Proportional Serif": "Serif proporcional", + "Monospace Serif": "Serif monoespacio", + "Casual": "Informal", + "Script": "Cursiva", + "Small Caps": "Minúsculas", + "Reset": "Restablecer", + "restore all settings to the default values": "restablece todas las configuraciones a los valores predeterminados", + "Done": "Listo", + "Caption Settings Dialog": "Diálogo de configuración de leyendas", + "Beginning of dialog window. Escape will cancel and close the window.": "Comienzo de la ventana de diálogo. La tecla Escape cancelará la operación y cerrará la ventana.", + "End of dialog window.": "Final de la ventana de diálogo.", + "{1} is loading.": "{1} se está cargando.", + "Exit Picture-in-Picture": "Salir de imagen sobre imagen", + "Picture-in-Picture": "Imagen sobre imagen" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/es.json b/js/libs/videojs/lang/es.json new file mode 100644 index 00000000..cd0b11cc --- /dev/null +++ b/js/libs/videojs/lang/es.json @@ -0,0 +1,89 @@ +{ + "Play": "Reproducir", + "Play Video": "Reproducir Vídeo", + "Pause": "Pausa", + "Current Time": "Tiempo reproducido", + "Duration": "Duración total", + "Remaining Time": "Tiempo restante", + "Stream Type": "Tipo de secuencia", + "LIVE": "DIRECTO", + "Loaded": "Cargado", + "Progress": "Progreso", + "Fullscreen": "Pantalla completa", + "Non-Fullscreen": "Pantalla no completa", + "Mute": "Silenciar", + "Unmute": "No silenciado", + "Playback Rate": "Velocidad de reproducción", + "Subtitles": "Subtítulos", + "subtitles off": "Subtítulos desactivados", + "Captions": "Subtítulos especiales", + "captions off": "Subtítulos especiales desactivados", + "Chapters": "Capítulos", + "You aborted the media playback": "Ha interrumpido la reproducción del vídeo.", + "A network error caused the media download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.", + "No compatible source was found for this media.": "No se ha encontrado ninguna fuente compatible con este vídeo.", + "Audio Player": "Reproductor de audio", + "Video Player": "Reproductor de video", + "Replay": "Volver a reproducir", + "Seek to live, currently behind live": "Buscar en vivo, actualmente demorado con respecto a la transmisión en vivo", + "Seek to live, currently playing live": "Buscar en vivo, actualmente reproduciendo en vivo", + "Progress Bar": "Barra de progreso", + "progress bar timing: currentTime={1} duration={2}": "{1} de {2}", + "Descriptions": "Descripciones", + "descriptions off": "descripciones desactivadas", + "Audio Track": "Pista de audio", + "Volume Level": "Nivel de volumen", + "The media is encrypted and we do not have the keys to decrypt it.": "El material audiovisual está cifrado y no tenemos las claves para descifrarlo.", + "Close": "Cerrar", + "Modal Window": "Ventana modal", + "This is a modal window": "Esta es una ventana modal", + "This modal can be closed by pressing the Escape key or activating the close button.": "Esta ventana modal puede cerrarse presionando la tecla Escape o activando el botón de cierre.", + ", opens captions settings dialog": ", abre el diálogo de configuración de leyendas", + ", opens subtitles settings dialog": ", abre el diálogo de configuración de subtítulos", + ", selected": ", seleccionado", + "Close Modal Dialog": "Cierra cuadro de diálogo modal", + ", opens descriptions settings dialog": ", abre el diálogo de configuración de las descripciones", + "captions settings": "configuración de leyendas", + "subtitles settings": "configuración de subtítulos", + "descriptions settings": "configuración de descripciones", + "Text": "Texto", + "White": "Blanco", + "Black": "Negro", + "Red": "Rojo", + "Green": "Verde", + "Blue": "Azul", + "Yellow": "Amarillo", + "Magenta": "Magenta", + "Cyan": "Cian", + "Background": "Fondo", + "Window": "Ventana", + "Transparent": "Transparente", + "Semi-Transparent": "Semitransparente", + "Opaque": "Opaca", + "Font Size": "Tamaño de fuente", + "Text Edge Style": "Estilo de borde del texto", + "None": "Ninguno", + "Raised": "En relieve", + "Depressed": "Hundido", + "Uniform": "Uniforme", + "Dropshadow": "Sombra paralela", + "Font Family": "Familia de fuente", + "Proportional Sans-Serif": "Sans-Serif proporcional", + "Monospace Sans-Serif": "Sans-Serif monoespacio", + "Proportional Serif": "Serif proporcional", + "Monospace Serif": "Serif monoespacio", + "Casual": "Informal", + "Script": "Cursiva", + "Small Caps": "Minúsculas", + "Reset": "Restablecer", + "restore all settings to the default values": "restablece todas las configuraciones a los valores predeterminados", + "Done": "Listo", + "Caption Settings Dialog": "Diálogo de configuración de leyendas", + "Beginning of dialog window. Escape will cancel and close the window.": "Comienzo de la ventana de diálogo. La tecla Escape cancelará la operación y cerrará la ventana.", + "End of dialog window.": "Final de la ventana de diálogo.", + "{1} is loading.": "{1} se está cargando.", + "Exit Picture-in-Picture": "Salir de imagen sobre imagen", + "Picture-in-Picture": "Imagen sobre imagen" +} diff --git a/js/libs/videojs/lang/fa.js b/js/libs/videojs/lang/fa.js index b2e818e4..fa79f68f 100644 --- a/js/libs/videojs/lang/fa.js +++ b/js/libs/videojs/lang/fa.js @@ -1,26 +1,89 @@ -videojs.addLanguage("fa",{ - "Play": "پخش", - "Pause": "وقفه", - "Current Time": "زمان کنونی", - "Duration Time": "مدت زمان", - "Remaining Time": "زمان باقیمانده", - "Stream Type": "نوع استریم", - "LIVE": "زنده", - "Loaded": "فراخوانی شده", - "Progress": "پیشرفت", - "Fullscreen": "تمام صفحه", - "Non-Fullscreen": "نمایش عادی", - "Mute": "بی صدا", - "Unmute": "بهمراه صدا", - "Playback Rate": "سرعت پخش", - "Subtitles": "زیرنویس", - "subtitles off": "بدون زیرنویس", - "Captions": "عنوان", - "captions off": "بدون عنوان", - "Chapters": "فصل", - "You aborted the media playback": "شما پخش را متوقف کردید.", - "A network error caused the media download to fail part-way.": "مشکل در دریافت ویدئو ...", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "فرمت پشتیبانی نمیشود یا خطایی روی داده است.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "مشکل در دریافت ویدئو ...", - "No compatible source was found for this media.": "هیچ ورودی ای برای این رسانه شناسایی نشد." +videojs.addLanguage('fa', { + "Audio Player": "پخش کننده صوت", + "Video Player": "پخش کننده ویدیو", + "Play": "پخش", + "Pause": "توقف", + "Replay": "پخش مجدد", + "Current Time": "زمان فعلی", + "Duration": "مدت", + "Remaining Time": "زمان باقی‌مانده", + "Stream Type": "نوع استریم", + "LIVE": "زنده", + "Seek to live, currently behind live": "پخش زنده، هم اکنون عقب تر از پخش زنده", + "Seek to live, currently playing live": "پخش زنده، در حال پخش زنده", + "Loaded": "بارگیری شده", + "Progress": "پیشرفت", + "Progress Bar": "نوار پیشرفت", + "progress bar timing: currentTime={1} duration={2}": "{1} از {2}", + "Fullscreen": "تمام‌صفحه", + "Non-Fullscreen": "غیر تمام‌صفحه", + "Mute": "بی صدا", + "Unmute": "صدادار", + "Playback Rate": "سرعت پخش", + "Subtitles": "زیرنویس ها", + "subtitles off": "بدون زیرنویس", + "Captions": "توضیحات", + "captions off": "بدون توضیحات", + "Chapters": "بخش‌ها", + "Descriptions": "توصیفات", + "descriptions off": "بدون توصیفات", + "Audio Track": "ترَک صوتی", + "Volume Level": "سطح صدا", + "You aborted the media playback": "شما پخش رسانه را قطع نمودید", + "A network error caused the media download to fail part-way.": "وقوع مشکلی در شبکه باعث اختلال در دانلود رسانه شد.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": ".رسانه قابل بارگیری نیست. ممکن است مشکلی در شبکه یا سرور رخ داده باشد یا فرمت رسانه در دستگاه شما پشتیبانی نشود", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "پخش رسانه به علت اشکال در آن یا عدم پشتیبانی مرورگر شما قطع شد.", + "No compatible source was found for this media.": "هیچ منبع سازگاری برای پخش این رسانه پیدا نشد.", + "The media is encrypted and we do not have the keys to decrypt it.": "این رسانه رمزنگاری شده است و کلیدهای رمزگشایی آن موجود نیست.", + "Play Video": "پخش ویدیو", + "Close": "بستن", + "Close Modal Dialog": "بستن پنجره", + "Modal Window": "پنجره محاوره", + "This is a modal window": "این پنجره قابل بستن است", + "This modal can be closed by pressing the Escape key or activating the close button.": "این پنجره با کلید Escape یا دکمه بستن قابل بسته شدن میباشد.", + ", opens captions settings dialog": ", تنظیمات توضیجات را باز میکند", + ", opens subtitles settings dialog": ", تنظیمات زیرنویس را باز میکند", + ", opens descriptions settings dialog": ", تنظیمات توصیفات را باز میکند", + ", selected": "، انتخاب شد", + "captions settings": "تنظیمات توضیحات", + "subtitles settings": "تنظیمات زیرنویس", + "descriptions settings": "تنظیمات توصیفات", + "Text": "متن", + "White": "سفید", + "Black": "سیاه", + "Red": "قرمز", + "Green": "سبز", + "Blue": "آبی", + "Yellow": "زرد", + "Magenta": "ارغوانی", + "Cyan": "فیروزه‌ای", + "Background": "پس زمینه", + "Window": "پنجره", + "Transparent": "شفاف", + "Semi-Transparent": "نیمه شفاف", + "Opaque": "مات", + "Font Size": "اندازه قلم", + "Text Edge Style": "سبک لبه متن", + "None": "هیچ", + "Raised": "برجسته", + "Depressed": "فرورفته", + "Uniform": "یکنواخت", + "Dropshadow": "سایه دار", + "Font Family": "نوع قلم", + "Proportional Sans-Serif": "Sans-Serif متناسب", + "Monospace Sans-Serif": "Sans-Serif هم عرض", + "Proportional Serif": "Serif متناسب", + "Monospace Serif": "Serif هم عرض", + "Casual": "فانتزی", + "Script": "دست خط", + "Small Caps": "حروف بزرگ کوچک", + "Reset": "تنظیم مجدد", + "restore all settings to the default values": "بازنشانی همه تنظیمات به مقادیر پیش‌فرض", + "Done": "انجام", + "Caption Settings Dialog": "پنجره تنظیمات توضیحات", + "Beginning of dialog window. Escape will cancel and close the window.": "شروع پنجره محاوره‌ای. دکمه Escape عملیات را لغو کرده و پنجره را میبندد.", + "End of dialog window.": "پایان پنجره محاوره‌ای.", + "{1} is loading.": "{1} در حال بارگیری است.", + "Exit Picture-in-Picture": "خروج از حالت تصویر در تصویر", + "Picture-in-Picture": "تصویر در تصویر" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/fa.json b/js/libs/videojs/lang/fa.json new file mode 100644 index 00000000..0ddd8514 --- /dev/null +++ b/js/libs/videojs/lang/fa.json @@ -0,0 +1,89 @@ +{ + "Audio Player": "پخش کننده صوت", + "Video Player": "پخش کننده ویدیو", + "Play": "پخش", + "Pause": "توقف", + "Replay": "پخش مجدد", + "Current Time": "زمان فعلی", + "Duration": "مدت", + "Remaining Time": "زمان باقی‌مانده", + "Stream Type": "نوع استریم", + "LIVE": "زنده", + "Seek to live, currently behind live": "پخش زنده، هم اکنون عقب تر از پخش زنده", + "Seek to live, currently playing live": "پخش زنده، در حال پخش زنده", + "Loaded": "بارگیری شده", + "Progress": "پیشرفت", + "Progress Bar": "نوار پیشرفت", + "progress bar timing: currentTime={1} duration={2}": "{1} از {2}", + "Fullscreen": "تمام‌صفحه", + "Non-Fullscreen": "غیر تمام‌صفحه", + "Mute": "بی صدا", + "Unmute": "صدادار", + "Playback Rate": "سرعت پخش", + "Subtitles": "زیرنویس ها", + "subtitles off": "بدون زیرنویس", + "Captions": "توضیحات", + "captions off": "بدون توضیحات", + "Chapters": "بخش‌ها", + "Descriptions": "توصیفات", + "descriptions off": "بدون توصیفات", + "Audio Track": "ترَک صوتی", + "Volume Level": "سطح صدا", + "You aborted the media playback": "شما پخش رسانه را قطع نمودید", + "A network error caused the media download to fail part-way.": "وقوع مشکلی در شبکه باعث اختلال در دانلود رسانه شد.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": ".رسانه قابل بارگیری نیست. ممکن است مشکلی در شبکه یا سرور رخ داده باشد یا فرمت رسانه در دستگاه شما پشتیبانی نشود", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "پخش رسانه به علت اشکال در آن یا عدم پشتیبانی مرورگر شما قطع شد.", + "No compatible source was found for this media.": "هیچ منبع سازگاری برای پخش این رسانه پیدا نشد.", + "The media is encrypted and we do not have the keys to decrypt it.": "این رسانه رمزنگاری شده است و کلیدهای رمزگشایی آن موجود نیست.", + "Play Video": "پخش ویدیو", + "Close": "بستن", + "Close Modal Dialog": "بستن پنجره", + "Modal Window": "پنجره محاوره", + "This is a modal window": "این پنجره قابل بستن است", + "This modal can be closed by pressing the Escape key or activating the close button.": "این پنجره با کلید Escape یا دکمه بستن قابل بسته شدن میباشد.", + ", opens captions settings dialog": ", تنظیمات توضیجات را باز میکند", + ", opens subtitles settings dialog": ", تنظیمات زیرنویس را باز میکند", + ", opens descriptions settings dialog": ", تنظیمات توصیفات را باز میکند", + ", selected": "، انتخاب شد", + "captions settings": "تنظیمات توضیحات", + "subtitles settings": "تنظیمات زیرنویس", + "descriptions settings": "تنظیمات توصیفات", + "Text": "متن", + "White": "سفید", + "Black": "سیاه", + "Red": "قرمز", + "Green": "سبز", + "Blue": "آبی", + "Yellow": "زرد", + "Magenta": "ارغوانی", + "Cyan": "فیروزه‌ای", + "Background": "پس زمینه", + "Window": "پنجره", + "Transparent": "شفاف", + "Semi-Transparent": "نیمه شفاف", + "Opaque": "مات", + "Font Size": "اندازه قلم", + "Text Edge Style": "سبک لبه متن", + "None": "هیچ", + "Raised": "برجسته", + "Depressed": "فرورفته", + "Uniform": "یکنواخت", + "Dropshadow": "سایه دار", + "Font Family": "نوع قلم", + "Proportional Sans-Serif": "Sans-Serif متناسب", + "Monospace Sans-Serif": "Sans-Serif هم عرض", + "Proportional Serif": "Serif متناسب", + "Monospace Serif": "Serif هم عرض", + "Casual": "فانتزی", + "Script": "دست خط", + "Small Caps": "حروف بزرگ کوچک", + "Reset": "تنظیم مجدد", + "restore all settings to the default values": "بازنشانی همه تنظیمات به مقادیر پیش‌فرض", + "Done": "انجام", + "Caption Settings Dialog": "پنجره تنظیمات توضیحات", + "Beginning of dialog window. Escape will cancel and close the window.": "شروع پنجره محاوره‌ای. دکمه Escape عملیات را لغو کرده و پنجره را میبندد.", + "End of dialog window.": "پایان پنجره محاوره‌ای.", + "{1} is loading.": "{1} در حال بارگیری است.", + "Exit Picture-in-Picture": "خروج از حالت تصویر در تصویر", + "Picture-in-Picture": "تصویر در تصویر" +} diff --git a/js/libs/videojs/lang/fi.js b/js/libs/videojs/lang/fi.js index 157c3acb..e14fb8c9 100644 --- a/js/libs/videojs/lang/fi.js +++ b/js/libs/videojs/lang/fi.js @@ -1,26 +1,26 @@ -videojs.addLanguage("fi",{ - "Play": "Toisto", - "Pause": "Tauko", - "Current Time": "Tämänhetkinen aika", - "Duration Time": "Kokonaisaika", - "Remaining Time": "Jäljellä oleva aika", - "Stream Type": "Lähetystyyppi", - "LIVE": "LIVE", - "Loaded": "Ladattu", - "Progress": "Edistyminen", - "Fullscreen": "Koko näyttö", - "Non-Fullscreen": "Koko näyttö pois", - "Mute": "Ääni pois", - "Unmute": "Ääni päällä", - "Playback Rate": "Toistonopeus", - "Subtitles": "Tekstitys", - "subtitles off": "Tekstitys pois", - "Captions": "Tekstitys", - "captions off": "Tekstitys pois", - "Chapters": "Kappaleet", - "You aborted the media playback": "Olet keskeyttänyt videotoiston.", - "A network error caused the media download to fail part-way.": "Verkkovirhe keskeytti videon latauksen.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videon lataus ei onnistunut joko palvelin- tai verkkovirheestä tai väärästä formaatista johtuen.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videon toisto keskeytyi, koska media on vaurioitunut tai käyttää käyttää toimintoja, joita selaimesi ei tue.", - "No compatible source was found for this media.": "Tälle videolle ei löytynyt yhteensopivaa lähdettä." +videojs.addLanguage('fi', { + "Play": "Toisto", + "Pause": "Tauko", + "Current Time": "Tämänhetkinen aika", + "Duration": "Kokonaisaika", + "Remaining Time": "Jäljellä oleva aika", + "Stream Type": "Lähetystyyppi", + "LIVE": "LIVE", + "Loaded": "Ladattu", + "Progress": "Edistyminen", + "Fullscreen": "Koko näyttö", + "Non-Fullscreen": "Koko näyttö pois", + "Mute": "Ääni pois", + "Unmute": "Ääni päällä", + "Playback Rate": "Toistonopeus", + "Subtitles": "Tekstitys", + "subtitles off": "Tekstitys pois", + "Captions": "Tekstitys", + "captions off": "Tekstitys pois", + "Chapters": "Kappaleet", + "You aborted the media playback": "Olet keskeyttänyt videotoiston.", + "A network error caused the media download to fail part-way.": "Verkkovirhe keskeytti videon latauksen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videon lataus ei onnistunut joko palvelin- tai verkkovirheestä tai väärästä formaatista johtuen.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videon toisto keskeytyi, koska media on vaurioitunut tai käyttää käyttää toimintoja, joita selaimesi ei tue.", + "No compatible source was found for this media.": "Tälle videolle ei löytynyt yhteensopivaa lähdettä." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/fi.json b/js/libs/videojs/lang/fi.json new file mode 100644 index 00000000..9cd419b0 --- /dev/null +++ b/js/libs/videojs/lang/fi.json @@ -0,0 +1,26 @@ +{ + "Play": "Toisto", + "Pause": "Tauko", + "Current Time": "Tämänhetkinen aika", + "Duration": "Kokonaisaika", + "Remaining Time": "Jäljellä oleva aika", + "Stream Type": "Lähetystyyppi", + "LIVE": "LIVE", + "Loaded": "Ladattu", + "Progress": "Edistyminen", + "Fullscreen": "Koko näyttö", + "Non-Fullscreen": "Koko näyttö pois", + "Mute": "Ääni pois", + "Unmute": "Ääni päällä", + "Playback Rate": "Toistonopeus", + "Subtitles": "Tekstitys", + "subtitles off": "Tekstitys pois", + "Captions": "Tekstitys", + "captions off": "Tekstitys pois", + "Chapters": "Kappaleet", + "You aborted the media playback": "Olet keskeyttänyt videotoiston.", + "A network error caused the media download to fail part-way.": "Verkkovirhe keskeytti videon latauksen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videon lataus ei onnistunut joko palvelin- tai verkkovirheestä tai väärästä formaatista johtuen.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videon toisto keskeytyi, koska media on vaurioitunut tai käyttää käyttää toimintoja, joita selaimesi ei tue.", + "No compatible source was found for this media.": "Tälle videolle ei löytynyt yhteensopivaa lähdettä." +} diff --git a/js/libs/videojs/lang/fr.js b/js/libs/videojs/lang/fr.js index bb4094fb..cf5b57ce 100644 --- a/js/libs/videojs/lang/fr.js +++ b/js/libs/videojs/lang/fr.js @@ -1,84 +1,84 @@ -videojs.addLanguage("fr",{ - "Audio Player": "Lecteur audio", - "Video Player": "Lecteur vidéo", - "Play": "Lecture", - "Pause": "Pause", - "Replay": "Revoir", - "Current Time": "Temps actuel", - "Duration Time": "Durée", - "Remaining Time": "Temps restant", - "Stream Type": "Type de flux", - "LIVE": "EN DIRECT", - "Loaded": "Chargé", - "Progress": "Progression", - "Progress Bar": "Barre de progression", - "progress bar timing: currentTime={1} duration={2}": "{1} de {2}", - "Fullscreen": "Plein écran", - "Non-Fullscreen": "Fenêtré", - "Mute": "Sourdine", - "Unmute": "Son activé", - "Playback Rate": "Vitesse de lecture", - "Subtitles": "Sous-titres", - "subtitles off": "Sous-titres désactivés", - "Captions": "Sous-titres transcrits", - "captions off": "Sous-titres transcrits désactivés", - "Chapters": "Chapitres", - "Descriptions": "Descriptions", - "descriptions off": "descriptions désactivées", - "Audio Track": "Piste audio", - "Volume Level": "Niveau de volume", - "You aborted the media playback": "Vous avez interrompu la lecture de la vidéo.", - "A network error caused the media download to fail part-way.": "Une erreur de réseau a interrompu le téléchargement de la vidéo.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Cette vidéo n'a pas pu être chargée, soit parce que le serveur ou le réseau a échoué ou parce que le format n'est pas reconnu.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La lecture de la vidéo a été interrompue à cause d'un problème de corruption ou parce que la vidéo utilise des fonctionnalités non prises en charge par votre navigateur.", - "No compatible source was found for this media.": "Aucune source compatible n'a été trouvée pour cette vidéo.", - "The media is encrypted and we do not have the keys to decrypt it.": "Le média est chiffré et nous n'avons pas les clés pour le déchiffrer.", - "Play Video": "Lire la vidéo", - "Close": "Fermer", - "Close Modal Dialog": "Fermer la boîte de dialogue modale", - "Modal Window": "Fenêtre modale", - "This is a modal window": "Ceci est une fenêtre modale", - "This modal can be closed by pressing the Escape key or activating the close button.": "Ce modal peut être fermé en appuyant sur la touche Échap ou activer le bouton de fermeture.", - ", opens captions settings dialog": ", ouvrir les paramètres des sous-titres transcrits", - ", opens subtitles settings dialog": ", ouvrir les paramètres des sous-titres", - ", opens descriptions settings dialog": ", ouvrir les paramètres des descriptions", - ", selected": ", sélectionné", - "captions settings": "Paramètres des sous-titres transcrits", - "subtitles settings": "Paramètres des sous-titres", - "descriptions settings": "Paramètres des descriptions", - "Text": "Texte", - "White": "Blanc", - "Black": "Noir", - "Red": "Rouge", - "Green": "Vert", - "Blue": "Bleu", - "Yellow": "Jaune", - "Magenta": "Magenta", - "Cyan": "Cyan", - "Background": "Arrière-plan", - "Window": "Fenêtre", - "Transparent": "Transparent", - "Semi-Transparent": "Semi-transparent", - "Opaque": "Opaque", - "Font Size": "Taille des caractères", - "Text Edge Style": "Style des contours du texte", - "None": "Aucun", - "Raised": "Élevé", - "Depressed": "Enfoncé", - "Uniform": "Uniforme", - "Dropshadow": "Ombre portée", - "Font Family": "Famille de polices", - "Proportional Sans-Serif": "Polices à chasse variable sans empattement (Proportional Sans-Serif)", - "Monospace Sans-Serif": "Polices à chasse fixe sans empattement (Monospace Sans-Serif)", - "Proportional Serif": "Polices à chasse variable avec empattement (Proportional Serif)", - "Monospace Serif": "Polices à chasse fixe avec empattement (Monospace Serif)", - "Casual": "Manuscrite", - "Script": "Scripte", - "Small Caps": "Petites capitales", - "Reset": "Réinitialiser", - "restore all settings to the default values": "Restaurer tous les paramètres aux valeurs par défaut", - "Done": "Terminé", - "Caption Settings Dialog": "Boîte de dialogue des paramètres des sous-titres transcrits", - "Beginning of dialog window. Escape will cancel and close the window.": "Début de la fenêtre de dialogue. La touche d'échappement annulera et fermera la fenêtre.", - "End of dialog window.": "Fin de la fenêtre de dialogue." +videojs.addLanguage('fr', { + "Audio Player": "Lecteur audio", + "Video Player": "Lecteur vidéo", + "Play": "Lecture", + "Pause": "Pause", + "Replay": "Revoir", + "Current Time": "Temps actuel", + "Duration": "Durée", + "Remaining Time": "Temps restant", + "Stream Type": "Type de flux", + "LIVE": "EN DIRECT", + "Loaded": "Chargé", + "Progress": "Progression", + "Progress Bar": "Barre de progression", + "progress bar timing: currentTime={1} duration={2}": "{1} de {2}", + "Fullscreen": "Plein écran", + "Non-Fullscreen": "Fenêtré", + "Mute": "Sourdine", + "Unmute": "Son activé", + "Playback Rate": "Vitesse de lecture", + "Subtitles": "Sous-titres", + "subtitles off": "Sous-titres désactivés", + "Captions": "Sous-titres transcrits", + "captions off": "Sous-titres transcrits désactivés", + "Chapters": "Chapitres", + "Descriptions": "Descriptions", + "descriptions off": "descriptions désactivées", + "Audio Track": "Piste audio", + "Volume Level": "Niveau de volume", + "You aborted the media playback": "Vous avez interrompu la lecture de la vidéo.", + "A network error caused the media download to fail part-way.": "Une erreur de réseau a interrompu le téléchargement de la vidéo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Cette vidéo n'a pas pu être chargée, soit parce que le serveur ou le réseau a échoué ou parce que le format n'est pas reconnu.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La lecture de la vidéo a été interrompue à cause d'un problème de corruption ou parce que la vidéo utilise des fonctionnalités non prises en charge par votre navigateur.", + "No compatible source was found for this media.": "Aucune source compatible n'a été trouvée pour cette vidéo.", + "The media is encrypted and we do not have the keys to decrypt it.": "Le média est chiffré et nous n'avons pas les clés pour le déchiffrer.", + "Play Video": "Lire la vidéo", + "Close": "Fermer", + "Close Modal Dialog": "Fermer la boîte de dialogue modale", + "Modal Window": "Fenêtre modale", + "This is a modal window": "Ceci est une fenêtre modale", + "This modal can be closed by pressing the Escape key or activating the close button.": "Ce modal peut être fermé en appuyant sur la touche Échap ou activer le bouton de fermeture.", + ", opens captions settings dialog": ", ouvrir les paramètres des sous-titres transcrits", + ", opens subtitles settings dialog": ", ouvrir les paramètres des sous-titres", + ", opens descriptions settings dialog": ", ouvrir les paramètres des descriptions", + ", selected": ", sélectionné", + "captions settings": "Paramètres des sous-titres transcrits", + "subtitles settings": "Paramètres des sous-titres", + "descriptions settings": "Paramètres des descriptions", + "Text": "Texte", + "White": "Blanc", + "Black": "Noir", + "Red": "Rouge", + "Green": "Vert", + "Blue": "Bleu", + "Yellow": "Jaune", + "Magenta": "Magenta", + "Cyan": "Cyan", + "Background": "Arrière-plan", + "Window": "Fenêtre", + "Transparent": "Transparent", + "Semi-Transparent": "Semi-transparent", + "Opaque": "Opaque", + "Font Size": "Taille des caractères", + "Text Edge Style": "Style des contours du texte", + "None": "Aucun", + "Raised": "Élevé", + "Depressed": "Enfoncé", + "Uniform": "Uniforme", + "Dropshadow": "Ombre portée", + "Font Family": "Famille de polices", + "Proportional Sans-Serif": "Polices à chasse variable sans empattement (Proportional Sans-Serif)", + "Monospace Sans-Serif": "Polices à chasse fixe sans empattement (Monospace Sans-Serif)", + "Proportional Serif": "Polices à chasse variable avec empattement (Proportional Serif)", + "Monospace Serif": "Polices à chasse fixe avec empattement (Monospace Serif)", + "Casual": "Manuscrite", + "Script": "Scripte", + "Small Caps": "Petites capitales", + "Reset": "Réinitialiser", + "restore all settings to the default values": "Restaurer tous les paramètres aux valeurs par défaut", + "Done": "Terminé", + "Caption Settings Dialog": "Boîte de dialogue des paramètres des sous-titres transcrits", + "Beginning of dialog window. Escape will cancel and close the window.": "Début de la fenêtre de dialogue. La touche d'échappement annulera et fermera la fenêtre.", + "End of dialog window.": "Fin de la fenêtre de dialogue." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/fr.json b/js/libs/videojs/lang/fr.json new file mode 100644 index 00000000..8bfeafde --- /dev/null +++ b/js/libs/videojs/lang/fr.json @@ -0,0 +1,84 @@ +{ + "Audio Player": "Lecteur audio", + "Video Player": "Lecteur vidéo", + "Play": "Lecture", + "Pause": "Pause", + "Replay": "Revoir", + "Current Time": "Temps actuel", + "Duration": "Durée", + "Remaining Time": "Temps restant", + "Stream Type": "Type de flux", + "LIVE": "EN DIRECT", + "Loaded": "Chargé", + "Progress": "Progression", + "Progress Bar": "Barre de progression", + "progress bar timing: currentTime={1} duration={2}": "{1} de {2}", + "Fullscreen": "Plein écran", + "Non-Fullscreen": "Fenêtré", + "Mute": "Sourdine", + "Unmute": "Son activé", + "Playback Rate": "Vitesse de lecture", + "Subtitles": "Sous-titres", + "subtitles off": "Sous-titres désactivés", + "Captions": "Sous-titres transcrits", + "captions off": "Sous-titres transcrits désactivés", + "Chapters": "Chapitres", + "Descriptions": "Descriptions", + "descriptions off": "descriptions désactivées", + "Audio Track": "Piste audio", + "Volume Level": "Niveau de volume", + "You aborted the media playback": "Vous avez interrompu la lecture de la vidéo.", + "A network error caused the media download to fail part-way.": "Une erreur de réseau a interrompu le téléchargement de la vidéo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Cette vidéo n'a pas pu être chargée, soit parce que le serveur ou le réseau a échoué ou parce que le format n'est pas reconnu.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La lecture de la vidéo a été interrompue à cause d'un problème de corruption ou parce que la vidéo utilise des fonctionnalités non prises en charge par votre navigateur.", + "No compatible source was found for this media.": "Aucune source compatible n'a été trouvée pour cette vidéo.", + "The media is encrypted and we do not have the keys to decrypt it.": "Le média est chiffré et nous n'avons pas les clés pour le déchiffrer.", + "Play Video": "Lire la vidéo", + "Close": "Fermer", + "Close Modal Dialog": "Fermer la boîte de dialogue modale", + "Modal Window": "Fenêtre modale", + "This is a modal window": "Ceci est une fenêtre modale", + "This modal can be closed by pressing the Escape key or activating the close button.": "Ce modal peut être fermé en appuyant sur la touche Échap ou activer le bouton de fermeture.", + ", opens captions settings dialog": ", ouvrir les paramètres des sous-titres transcrits", + ", opens subtitles settings dialog": ", ouvrir les paramètres des sous-titres", + ", opens descriptions settings dialog": ", ouvrir les paramètres des descriptions", + ", selected": ", sélectionné", + "captions settings": "Paramètres des sous-titres transcrits", + "subtitles settings": "Paramètres des sous-titres", + "descriptions settings": "Paramètres des descriptions", + "Text": "Texte", + "White": "Blanc", + "Black": "Noir", + "Red": "Rouge", + "Green": "Vert", + "Blue": "Bleu", + "Yellow": "Jaune", + "Magenta": "Magenta", + "Cyan": "Cyan", + "Background": "Arrière-plan", + "Window": "Fenêtre", + "Transparent": "Transparent", + "Semi-Transparent": "Semi-transparent", + "Opaque": "Opaque", + "Font Size": "Taille des caractères", + "Text Edge Style": "Style des contours du texte", + "None": "Aucun", + "Raised": "Élevé", + "Depressed": "Enfoncé", + "Uniform": "Uniforme", + "Dropshadow": "Ombre portée", + "Font Family": "Famille de polices", + "Proportional Sans-Serif": "Polices à chasse variable sans empattement (Proportional Sans-Serif)", + "Monospace Sans-Serif": "Polices à chasse fixe sans empattement (Monospace Sans-Serif)", + "Proportional Serif": "Polices à chasse variable avec empattement (Proportional Serif)", + "Monospace Serif": "Polices à chasse fixe avec empattement (Monospace Serif)", + "Casual": "Manuscrite", + "Script": "Scripte", + "Small Caps": "Petites capitales", + "Reset": "Réinitialiser", + "restore all settings to the default values": "Restaurer tous les paramètres aux valeurs par défaut", + "Done": "Terminé", + "Caption Settings Dialog": "Boîte de dialogue des paramètres des sous-titres transcrits", + "Beginning of dialog window. Escape will cancel and close the window.": "Début de la fenêtre de dialogue. La touche d'échappement annulera et fermera la fenêtre.", + "End of dialog window.": "Fin de la fenêtre de dialogue." +} diff --git a/js/libs/videojs/lang/gd.js b/js/libs/videojs/lang/gd.js new file mode 100644 index 00000000..51ba7e77 --- /dev/null +++ b/js/libs/videojs/lang/gd.js @@ -0,0 +1,87 @@ +videojs.addLanguage('gd', { + "Audio Player": "Cluicheadair fuaime", + "Video Player": "Cluicheadair video", + "Play": "Cluich", + "Pause": "Cuir ’na stad", + "Replay": "Cluich a-rithist", + "Current Time": "An ùine làithreach", + "Duration": "Faide", + "Remaining Time": "An ùine air fhàgail", + "Stream Type": "Seòrsa an t-sruthaidh", + "LIVE": "BEÒ", + "Seek to live, currently behind live": "A’ sireadh sruth beò ’s air dheireadh", + "Seek to live, currently playing live": "A’ sireadh sruth beò ’s ‘ga chluich", + "Loaded": "Air a luchdadh", + "Progress": "Adhartas", + "Progress Bar": "Bàr adhartais", + "progress bar timing: currentTime={1} duration={2}": "{1} à {2}", + "Fullscreen": "Làn-sgrìn", + "Non-Fullscreen": "Fàg modh làn-sgrìn", + "Mute": "Mùch", + "Unmute": "Dì-mhùch", + "Playback Rate": "Reat na cluiche", + "Subtitles": "Fo-thiotalan", + "subtitles off": "fo-thiotalan dheth", + "Captions": "Caipseanan", + "captions off": "caipseanan dheth", + "Chapters": "Caibideil", + "Descriptions": "Tuairisgeulan", + "descriptions off": "tuairisgeulan dheth", + "Audio Track": "Traca fuaime", + "Volume Level": "Àirde na fuaime", + "You aborted the media playback": "Sguir thu de chluich a’ mheadhain", + "A network error caused the media download to fail part-way.": "Cha deach leinn an còrr dhen mheadhan a luchdadh a-nuas ri linn mearachd lìonraidh.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Cha b’ urrainn dhuinn am meadhan a luchdadh – dh’fhaoidte gun do dh’fhàillig leis an fhrithealaiche no an lìonra no nach cuir sinn taic ris an fhòrmat.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Sguir sinn de chluich a’ mheadhain – dh’fhaoidte gu bheil e coirbte no gu bheil gleus aig a’ mheadhan nach cuir am brabhsair taic ris.", + "No compatible source was found for this media.": "Cha ceach tùs co-chòrdail a lorg airson a’ mheadhain seo.", + "The media is encrypted and we do not have the keys to decrypt it.": "Tha am meadhan crioptaichte ’s chan eil iuchair dì-chrioptachaidh againn dha.", + "Play Video": "Cluich video", + "Close": "Dùin", + "Close Modal Dialog": "Dùin an còmhradh", + "Modal Window": "Uinneag mòdach", + "This is a modal window": "Seo uinneag mòdach", + "This modal can be closed by pressing the Escape key or activating the close button.": "’S urrainn dhut seo a dhùnadh leis an iuchair Escape no leis a’ phutan dùnaidh.", + ", opens captions settings dialog": ", fosglaidh e còmhradh nan roghainnean", + ", opens subtitles settings dialog": ", fosglaidh e còmhradh nam fo-thiotalan", + ", opens descriptions settings dialog": ", fosglaidh e còmhradh roghainnean nan tuairisgeulan", + ", selected": ", air a thaghadh", + "captions settings": "roghainnean nan caipseanan", + "subtitles settings": "roghainnean nam fo-thiotalan", + "descriptions settings": "roghainnean nan tuairisgeulan", + "Text": "Teacsa", + "White": "Geal", + "Black": "Dubh", + "Red": "Dearg", + "Green": "Uaine", + "Blue": "Gorm", + "Yellow": "Buidhe", + "Magenta": "Magenta", + "Cyan": "Saidhean", + "Background": "Cùlaibh", + "Window": "Uinneag", + "Transparent": "Trìd-shoilleir", + "Semi-Transparent": "Leth-thrìd-shoilleir", + "Opaque": "Trìd-dhoilleir", + "Font Size": "Meud a’ chrutha-chlò", + "Text Edge Style": "Stoidhle oir an teacsa", + "None": "Chan eil gin", + "Raised": "Àrdaichte", + "Depressed": "Air a bhrùthadh", + "Uniform": "Cunbhalach", + "Dropshadow": "Sgàil", + "Font Family": "Teaghlach a’ chrutha-chlò", + "Proportional Sans-Serif": "Sans-serif co-rèireach", + "Monospace Sans-Serif": "Sans-serif aon-leud", + "Proportional Serif": "Serif co-rèireach", + "Monospace Serif": "Serif aon-leud", + "Casual": "Fuasgailte", + "Script": "Sgriobt", + "Small Caps": "Ceann-litrichean beaga", + "Reset": "Ath-shuidhich", + "restore all settings to the default values": "till dhan a h-uile bun-roghainn", + "Done": "Deiseil", + "Caption Settings Dialog": "Còmhradh roghainnean nan caipseanan", + "Beginning of dialog window. Escape will cancel and close the window.": "Toiseach uinneag còmhraidh. Sguiridh Escape dheth ’s dùinidh e an uinneag", + "End of dialog window.": "Deireadh uinneag còmhraidh.", + "{1} is loading.": "Tha {1} ’ga luchdadh." +}); \ No newline at end of file diff --git a/js/libs/videojs/lang/gd.json b/js/libs/videojs/lang/gd.json new file mode 100644 index 00000000..76a598c4 --- /dev/null +++ b/js/libs/videojs/lang/gd.json @@ -0,0 +1,87 @@ +{ + "Audio Player": "Cluicheadair fuaime", + "Video Player": "Cluicheadair video", + "Play": "Cluich", + "Pause": "Cuir ’na stad", + "Replay": "Cluich a-rithist", + "Current Time": "An ùine làithreach", + "Duration": "Faide", + "Remaining Time": "An ùine air fhàgail", + "Stream Type": "Seòrsa an t-sruthaidh", + "LIVE": "BEÒ", + "Seek to live, currently behind live": "A’ sireadh sruth beò ’s air dheireadh", + "Seek to live, currently playing live": "A’ sireadh sruth beò ’s ‘ga chluich", + "Loaded": "Air a luchdadh", + "Progress": "Adhartas", + "Progress Bar": "Bàr adhartais", + "progress bar timing: currentTime={1} duration={2}": "{1} à {2}", + "Fullscreen": "Làn-sgrìn", + "Non-Fullscreen": "Fàg modh làn-sgrìn", + "Mute": "Mùch", + "Unmute": "Dì-mhùch", + "Playback Rate": "Reat na cluiche", + "Subtitles": "Fo-thiotalan", + "subtitles off": "fo-thiotalan dheth", + "Captions": "Caipseanan", + "captions off": "caipseanan dheth", + "Chapters": "Caibideil", + "Descriptions": "Tuairisgeulan", + "descriptions off": "tuairisgeulan dheth", + "Audio Track": "Traca fuaime", + "Volume Level": "Àirde na fuaime", + "You aborted the media playback": "Sguir thu de chluich a’ mheadhain", + "A network error caused the media download to fail part-way.": "Cha deach leinn an còrr dhen mheadhan a luchdadh a-nuas ri linn mearachd lìonraidh.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Cha b’ urrainn dhuinn am meadhan a luchdadh – dh’fhaoidte gun do dh’fhàillig leis an fhrithealaiche no an lìonra no nach cuir sinn taic ris an fhòrmat.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Sguir sinn de chluich a’ mheadhain – dh’fhaoidte gu bheil e coirbte no gu bheil gleus aig a’ mheadhan nach cuir am brabhsair taic ris.", + "No compatible source was found for this media.": "Cha ceach tùs co-chòrdail a lorg airson a’ mheadhain seo.", + "The media is encrypted and we do not have the keys to decrypt it.": "Tha am meadhan crioptaichte ’s chan eil iuchair dì-chrioptachaidh againn dha.", + "Play Video": "Cluich video", + "Close": "Dùin", + "Close Modal Dialog": "Dùin an còmhradh", + "Modal Window": "Uinneag mòdach", + "This is a modal window": "Seo uinneag mòdach", + "This modal can be closed by pressing the Escape key or activating the close button.": "’S urrainn dhut seo a dhùnadh leis an iuchair Escape no leis a’ phutan dùnaidh.", + ", opens captions settings dialog": ", fosglaidh e còmhradh nan roghainnean", + ", opens subtitles settings dialog": ", fosglaidh e còmhradh nam fo-thiotalan", + ", opens descriptions settings dialog": ", fosglaidh e còmhradh roghainnean nan tuairisgeulan", + ", selected": ", air a thaghadh", + "captions settings": "roghainnean nan caipseanan", + "subtitles settings": "roghainnean nam fo-thiotalan", + "descriptions settings": "roghainnean nan tuairisgeulan", + "Text": "Teacsa", + "White": "Geal", + "Black": "Dubh", + "Red": "Dearg", + "Green": "Uaine", + "Blue": "Gorm", + "Yellow": "Buidhe", + "Magenta": "Magenta", + "Cyan": "Saidhean", + "Background": "Cùlaibh", + "Window": "Uinneag", + "Transparent": "Trìd-shoilleir", + "Semi-Transparent": "Leth-thrìd-shoilleir", + "Opaque": "Trìd-dhoilleir", + "Font Size": "Meud a’ chrutha-chlò", + "Text Edge Style": "Stoidhle oir an teacsa", + "None": "Chan eil gin", + "Raised": "Àrdaichte", + "Depressed": "Air a bhrùthadh", + "Uniform": "Cunbhalach", + "Dropshadow": "Sgàil", + "Font Family": "Teaghlach a’ chrutha-chlò", + "Proportional Sans-Serif": "Sans-serif co-rèireach", + "Monospace Sans-Serif": "Sans-serif aon-leud", + "Proportional Serif": "Serif co-rèireach", + "Monospace Serif": "Serif aon-leud", + "Casual": "Fuasgailte", + "Script": "Sgriobt", + "Small Caps": "Ceann-litrichean beaga", + "Reset": "Ath-shuidhich", + "restore all settings to the default values": "till dhan a h-uile bun-roghainn", + "Done": "Deiseil", + "Caption Settings Dialog": "Còmhradh roghainnean nan caipseanan", + "Beginning of dialog window. Escape will cancel and close the window.": "Toiseach uinneag còmhraidh. Sguiridh Escape dheth ’s dùinidh e an uinneag", + "End of dialog window.": "Deireadh uinneag còmhraidh.", + "{1} is loading.": "Tha {1} ’ga luchdadh." +} diff --git a/js/libs/videojs/lang/gl.js b/js/libs/videojs/lang/gl.js index cc0686d5..fcef9ed1 100644 --- a/js/libs/videojs/lang/gl.js +++ b/js/libs/videojs/lang/gl.js @@ -1,27 +1,87 @@ -videojs.addLanguage("gl",{ - "Play": "Reprodución", - "Play Video": "Reprodución Vídeo", - "Pause": "Pausa", - "Current Time": "Tempo reproducido", - "Duration Time": "Duración total", - "Remaining Time": "Tempo restante", - "Stream Type": "Tipo de secuencia", - "LIVE": "DIRECTO", - "Loaded": "Cargado", - "Progress": "Progreso", - "Fullscreen": "Pantalla completa", - "Non-Fullscreen": "Pantalla non completa", - "Mute": "Silenciar", - "Unmute": "Non silenciado", - "Playback Rate": "Velocidade de reprodución", - "Subtitles": "Subtítulos", - "subtitles off": "Subtítulos desactivados", - "Captions": "Subtítulos con lenda", - "captions off": "Subtítulos con lenda desactivados", - "Chapters": "Capítulos", - "You aborted the media playback": "Interrompeches a reprodución do vídeo.", - "A network error caused the media download to fail part-way.": "Un erro de rede interrompeu a descarga do vídeo.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Non se puido cargar o vídeo debido a un fallo de rede ou do servidor ou porque o formato é incompatible.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A reproducción de vídeo interrompeuse por un problema de corrupción de datos ou porque o vídeo precisa funcións que o teu navegador non ofrece.", - "No compatible source was found for this media.": "Non se atopou ningunha fonte compatible con este vídeo." +videojs.addLanguage('gl', { + "Audio Player": "Reprodutor de son", + "Video Player": "Reprodutor de vídeo", + "Play": "Reproducir", + "Pause": "Pausa", + "Replay": "Repetir", + "Current Time": "Tempo reproducido", + "Duration": "Duración", + "Remaining Time": "Tempo restante", + "Stream Type": "Tipo de fluxo", + "LIVE": "EN DIRECTO", + "Seek to live, currently behind live": "Buscando directo, actualmente tras en directo", + "Seek to live, currently playing live": "Buscando directo, actualmente reproducindo en directo", + "Loaded": "Cargado", + "Progress": "Progresión", + "Progress Bar": "Barra de progreso", + "progress bar timing: currentTime={1} duration={2}": "{1} de {2}", + "Fullscreen": "Pantalla completa", + "Non-Fullscreen": "Xanela", + "Mute": "Silenciar", + "Unmute": "Son activado", + "Playback Rate": "Velocidade de reprodución", + "Subtitles": "Subtítulos", + "subtitles off": "subtítulos desactivados", + "Captions": "Subtítulos para xordos", + "captions off": "subtítulos para xordos desactivados", + "Chapters": "Capítulos", + "Descriptions": "Descricións", + "descriptions off": "descricións desactivadas", + "Audio Track": "Pista de son", + "Volume Level": "Nivel do volume", + "You aborted the media playback": "Vostede interrompeu a reprodución do medio.", + "A network error caused the media download to fail part-way.": "Un erro de rede interrompeu a descarga do medio.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Non foi posíbel cargar o medio por mor dun fallo de rede ou do servidor ou porque o formato non é compatíbel.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Interrompeuse a reprodución do medio por mor dun problema de estragamento dos datos ou porque o medio precisa funcións que o seu navegador non ofrece.", + "No compatible source was found for this media.": "Non se atopou ningunha orixe compatíbel con este vídeo.", + "The media is encrypted and we do not have the keys to decrypt it.": "O medio está cifrado e non temos as chaves para descifralo .", + "Play Video": "Reproducir vídeo", + "Close": "Pechar", + "Close Modal Dialog": "Pechar a caixa de diálogo modal", + "Modal Window": "Xanela modal", + "This is a modal window": "Esta é unha xanela modal", + "This modal can be closed by pressing the Escape key or activating the close button.": "Este diálogo modal pódese pechar premendo a tecla Escape ou activando o botón de pechar.", + ", opens captions settings dialog": ", abre o diálogo de axustes dos subtítulos para xordos", + ", opens subtitles settings dialog": ", abre o diálogo de axustes dos subtítulos", + ", opens descriptions settings dialog": ", abre o diálogo de axustes das descricións", + ", selected": ", séleccionado", + "captions settings": "axustes dos subtítulos para xordos", + "subtitles settings": "axustes dos subtítulos", + "descriptions settings": "axustes das descricións", + "Text": "Texto", + "White": "Branco", + "Black": "Negro", + "Red": "Vermello", + "Green": "Verde", + "Blue": "Azul", + "Yellow": "Marelo", + "Magenta": "Maxenta", + "Cyan": "Cian", + "Background": "Fondo", + "Window": "Xanela", + "Transparent": "Transparente", + "Semi-Transparent": "Semi-transparente", + "Opaque": "Opaca", + "Font Size": "Tamaño das letras", + "Text Edge Style": "Estilo do bordos do texto", + "None": "Ningún", + "Raised": "Érguida", + "Depressed": "Caída", + "Uniform": "Uniforme", + "Dropshadow": "Sombra caída", + "Font Family": "Familia de letras", + "Proportional Sans-Serif": "Sans-Serif proporcional", + "Monospace Sans-Serif": "Sans-Serif monoespazo (caixa fixa)", + "Proportional Serif": "Serif proporcional", + "Monospace Serif": "Serif monoespazo (caixa fixa)", + "Casual": "Manuscrito", + "Script": "Itálica", + "Small Caps": "Pequenas maiúsculas", + "Reset": "Reiniciar", + "restore all settings to the default values": "restaurar todos os axustes aos valores predeterminados", + "Done": "Feito", + "Caption Settings Dialog": "Diálogo de axustes dos subtítulos para xordos", + "Beginning of dialog window. Escape will cancel and close the window.": "Inicio da xanela de diálogo. A tecla Escape cancelará e pechará a xanela.", + "End of dialog window.": "Fin da xanela de diálogo.", + "{1} is loading.": "{1} está a cargar." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/gl.json b/js/libs/videojs/lang/gl.json new file mode 100644 index 00000000..b777c6c4 --- /dev/null +++ b/js/libs/videojs/lang/gl.json @@ -0,0 +1,87 @@ +{ + "Audio Player": "Reprodutor de son", + "Video Player": "Reprodutor de vídeo", + "Play": "Reproducir", + "Pause": "Pausa", + "Replay": "Repetir", + "Current Time": "Tempo reproducido", + "Duration": "Duración", + "Remaining Time": "Tempo restante", + "Stream Type": "Tipo de fluxo", + "LIVE": "EN DIRECTO", + "Seek to live, currently behind live": "Buscando directo, actualmente tras en directo", + "Seek to live, currently playing live": "Buscando directo, actualmente reproducindo en directo", + "Loaded": "Cargado", + "Progress": "Progresión", + "Progress Bar": "Barra de progreso", + "progress bar timing: currentTime={1} duration={2}": "{1} de {2}", + "Fullscreen": "Pantalla completa", + "Non-Fullscreen": "Xanela", + "Mute": "Silenciar", + "Unmute": "Son activado", + "Playback Rate": "Velocidade de reprodución", + "Subtitles": "Subtítulos", + "subtitles off": "subtítulos desactivados", + "Captions": "Subtítulos para xordos", + "captions off": "subtítulos para xordos desactivados", + "Chapters": "Capítulos", + "Descriptions": "Descricións", + "descriptions off": "descricións desactivadas", + "Audio Track": "Pista de son", + "Volume Level": "Nivel do volume", + "You aborted the media playback": "Vostede interrompeu a reprodución do medio.", + "A network error caused the media download to fail part-way.": "Un erro de rede interrompeu a descarga do medio.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Non foi posíbel cargar o medio por mor dun fallo de rede ou do servidor ou porque o formato non é compatíbel.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Interrompeuse a reprodución do medio por mor dun problema de estragamento dos datos ou porque o medio precisa funcións que o seu navegador non ofrece.", + "No compatible source was found for this media.": "Non se atopou ningunha orixe compatíbel con este vídeo.", + "The media is encrypted and we do not have the keys to decrypt it.": "O medio está cifrado e non temos as chaves para descifralo .", + "Play Video": "Reproducir vídeo", + "Close": "Pechar", + "Close Modal Dialog": "Pechar a caixa de diálogo modal", + "Modal Window": "Xanela modal", + "This is a modal window": "Esta é unha xanela modal", + "This modal can be closed by pressing the Escape key or activating the close button.": "Este diálogo modal pódese pechar premendo a tecla Escape ou activando o botón de pechar.", + ", opens captions settings dialog": ", abre o diálogo de axustes dos subtítulos para xordos", + ", opens subtitles settings dialog": ", abre o diálogo de axustes dos subtítulos", + ", opens descriptions settings dialog": ", abre o diálogo de axustes das descricións", + ", selected": ", séleccionado", + "captions settings": "axustes dos subtítulos para xordos", + "subtitles settings": "axustes dos subtítulos", + "descriptions settings": "axustes das descricións", + "Text": "Texto", + "White": "Branco", + "Black": "Negro", + "Red": "Vermello", + "Green": "Verde", + "Blue": "Azul", + "Yellow": "Marelo", + "Magenta": "Maxenta", + "Cyan": "Cian", + "Background": "Fondo", + "Window": "Xanela", + "Transparent": "Transparente", + "Semi-Transparent": "Semi-transparente", + "Opaque": "Opaca", + "Font Size": "Tamaño das letras", + "Text Edge Style": "Estilo do bordos do texto", + "None": "Ningún", + "Raised": "Érguida", + "Depressed": "Caída", + "Uniform": "Uniforme", + "Dropshadow": "Sombra caída", + "Font Family": "Familia de letras", + "Proportional Sans-Serif": "Sans-Serif proporcional", + "Monospace Sans-Serif": "Sans-Serif monoespazo (caixa fixa)", + "Proportional Serif": "Serif proporcional", + "Monospace Serif": "Serif monoespazo (caixa fixa)", + "Casual": "Manuscrito", + "Script": "Itálica", + "Small Caps": "Pequenas maiúsculas", + "Reset": "Reiniciar", + "restore all settings to the default values": "restaurar todos os axustes aos valores predeterminados", + "Done": "Feito", + "Caption Settings Dialog": "Diálogo de axustes dos subtítulos para xordos", + "Beginning of dialog window. Escape will cancel and close the window.": "Inicio da xanela de diálogo. A tecla Escape cancelará e pechará a xanela.", + "End of dialog window.": "Fin da xanela de diálogo.", + "{1} is loading.": "{1} está a cargar." +} diff --git a/js/libs/videojs/lang/he.js b/js/libs/videojs/lang/he.js index 0902297d..bc246895 100644 --- a/js/libs/videojs/lang/he.js +++ b/js/libs/videojs/lang/he.js @@ -1,84 +1,84 @@ -videojs.addLanguage("he",{ - "Audio Player": "נַגָּן שמע", - "Video Player": "נַגָּן וידאו", - "Play": "נַגֵּן", - "Pause": "השהה", - "Replay": "נַגֵּן שוב", - "Current Time": "זמן נוכחי", - "Duration Time": "זמן כולל", - "Remaining Time": "זמן נותר", - "Stream Type": "סוג Stream", - "LIVE": "שידור חי", - "Loaded": "נטען", - "Progress": "התקדמות", - "Progress Bar": "סרגל התקדמות", - "progress bar timing: currentTime={1} duration={2}": "{1} מתוך {2}", - "Fullscreen": "מסך מלא", - "Non-Fullscreen": "מסך לא מלא", - "Mute": "השתק", - "Unmute": "בטל השתקה", - "Playback Rate": "קצב ניגון", - "Subtitles": "כתוביות", - "subtitles off": "כתוביות כבויות", - "Captions": "כיתובים", - "captions off": "כיתובים כבויים", - "Chapters": "פרקים", - "Descriptions": "תיאורים", - "descriptions off": "תיאורים כבויים", - "Audio Track": "רצועת שמע", - "Volume Level": "רמת ווליום", - "You aborted the media playback": "ביטלת את השמעת המדיה", - "A network error caused the media download to fail part-way.": "שגיאת רשת גרמה להורדת המדיה להיכשל באמצע.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "לא ניתן לטעון את המדיה, או מכיוון שהרשת או השרת כשלו או מכיוון שהפורמט אינו נתמך.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "השמעת המדיה בוטלה בשל בעית השחטת מידע או מכיוון שהמדיה עשתה שימוש בתכונות שהדפדפן שלך לא תמך בהן.", - "No compatible source was found for this media.": "לא נמצא מקור תואם עבור מדיה זו.", - "The media is encrypted and we do not have the keys to decrypt it.": "המדיה מוצפנת ואין בידינו את המפתח כדי לפענח אותה.", - "Play Video": "נַגֵּן וידאו", - "Close": "סְגוֹר", - "Close Modal Dialog": "סְגוֹר דו-שיח מודאלי", - "Modal Window": "חלון מודאלי", - "This is a modal window": "זהו חלון מודאלי", - "This modal can be closed by pressing the Escape key or activating the close button.": "ניתן לסגור חלון מודאלי זה ע\"י לחיצה על כפתור ה-Escape או הפעלת כפתור הסגירה.", - ", opens captions settings dialog": ", פותח חלון הגדרות כיתובים", - ", opens subtitles settings dialog": ", פותח חלון הגדרות כתוביות", - ", opens descriptions settings dialog": ", פותח חלון הגדרות תיאורים", - ", selected": ", נבחר/ו", - "captions settings": "הגדרות כיתובים", - "subtitles settings": "הגדרות כתוביות", - "descriptions settings": "הגדרות תיאורים", - "Text": "טקסט", - "White": "לבן", - "Black": "שחור", - "Red": "אדום", - "Green": "ירוק", - "Blue": "כחול", - "Yellow": "צהוב", - "Magenta": "מַגֶ'נטָה", - "Cyan": "טורקיז", - "Background": "רקע", - "Window": "חלון", - "Transparent": "שקוף", - "Semi-Transparent": "שקוף למחצה", - "Opaque": "אָטוּם", - "Font Size": "גודל גופן", - "Text Edge Style": "סגנון קצוות טקסט", - "None": "ללא", - "Raised": "מורם", - "Depressed": "מורד", - "Uniform": "אחיד", - "Dropshadow": "הטלת צל", - "Font Family": "משפחת גופן", - "Proportional Sans-Serif": "פרופורציוני וללא תגיות (Proportional Sans-Serif)", - "Monospace Sans-Serif": "ברוחב אחיד וללא תגיות (Monospace Sans-Serif)", - "Proportional Serif": "פרופורציוני ועם תגיות (Proportional Serif)", - "Monospace Serif": "ברוחב אחיד ועם תגיות (Monospace Serif)", - "Casual": "אַגָבִי", - "Script": "תסריט", - "Small Caps": "אותיות קטנות", - "Reset": "אִפּוּס", - "restore all settings to the default values": "שחזר את כל ההגדרות לערכי ברירת המחדל", - "Done": "בוצע", - "Caption Settings Dialog": "דו-שיח הגדרות כיתובים", - "Beginning of dialog window. Escape will cancel and close the window.": "תחילת חלון דו-שיח. Escape יבטל ויסגור את החלון", - "End of dialog window.": "סוף חלון דו-שיח." +videojs.addLanguage('he', { + "Audio Player": "נַגָּן שמע", + "Video Player": "נַגָּן וידאו", + "Play": "נַגֵּן", + "Pause": "השהה", + "Replay": "נַגֵּן שוב", + "Current Time": "זמן נוכחי", + "Duration": "זמן כולל", + "Remaining Time": "זמן נותר", + "Stream Type": "סוג Stream", + "LIVE": "שידור חי", + "Loaded": "נטען", + "Progress": "התקדמות", + "Progress Bar": "סרגל התקדמות", + "progress bar timing: currentTime={1} duration={2}": "{1} מתוך {2}", + "Fullscreen": "מסך מלא", + "Non-Fullscreen": "מסך לא מלא", + "Mute": "השתק", + "Unmute": "בטל השתקה", + "Playback Rate": "קצב ניגון", + "Subtitles": "כתוביות", + "subtitles off": "כתוביות כבויות", + "Captions": "כיתובים", + "captions off": "כיתובים כבויים", + "Chapters": "פרקים", + "Descriptions": "תיאורים", + "descriptions off": "תיאורים כבויים", + "Audio Track": "רצועת שמע", + "Volume Level": "רמת ווליום", + "You aborted the media playback": "ביטלת את השמעת המדיה", + "A network error caused the media download to fail part-way.": "שגיאת רשת גרמה להורדת המדיה להיכשל באמצע.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "לא ניתן לטעון את המדיה, או מכיוון שהרשת או השרת כשלו או מכיוון שהפורמט אינו נתמך.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "השמעת המדיה בוטלה בשל בעית השחטת מידע או מכיוון שהמדיה עשתה שימוש בתכונות שהדפדפן שלך לא תמך בהן.", + "No compatible source was found for this media.": "לא נמצא מקור תואם עבור מדיה זו.", + "The media is encrypted and we do not have the keys to decrypt it.": "המדיה מוצפנת ואין בידינו את המפתח כדי לפענח אותה.", + "Play Video": "נַגֵּן וידאו", + "Close": "סְגוֹר", + "Close Modal Dialog": "סְגוֹר דו-שיח מודאלי", + "Modal Window": "חלון מודאלי", + "This is a modal window": "זהו חלון מודאלי", + "This modal can be closed by pressing the Escape key or activating the close button.": "ניתן לסגור חלון מודאלי זה ע\"י לחיצה על כפתור ה-Escape או הפעלת כפתור הסגירה.", + ", opens captions settings dialog": ", פותח חלון הגדרות כיתובים", + ", opens subtitles settings dialog": ", פותח חלון הגדרות כתוביות", + ", opens descriptions settings dialog": ", פותח חלון הגדרות תיאורים", + ", selected": ", נבחר/ו", + "captions settings": "הגדרות כיתובים", + "subtitles settings": "הגדרות כתוביות", + "descriptions settings": "הגדרות תיאורים", + "Text": "טקסט", + "White": "לבן", + "Black": "שחור", + "Red": "אדום", + "Green": "ירוק", + "Blue": "כחול", + "Yellow": "צהוב", + "Magenta": "מַגֶ'נטָה", + "Cyan": "טורקיז", + "Background": "רקע", + "Window": "חלון", + "Transparent": "שקוף", + "Semi-Transparent": "שקוף למחצה", + "Opaque": "אָטוּם", + "Font Size": "גודל גופן", + "Text Edge Style": "סגנון קצוות טקסט", + "None": "ללא", + "Raised": "מורם", + "Depressed": "מורד", + "Uniform": "אחיד", + "Dropshadow": "הטלת צל", + "Font Family": "משפחת גופן", + "Proportional Sans-Serif": "פרופורציוני וללא תגיות (Proportional Sans-Serif)", + "Monospace Sans-Serif": "ברוחב אחיד וללא תגיות (Monospace Sans-Serif)", + "Proportional Serif": "פרופורציוני ועם תגיות (Proportional Serif)", + "Monospace Serif": "ברוחב אחיד ועם תגיות (Monospace Serif)", + "Casual": "אַגָבִי", + "Script": "תסריט", + "Small Caps": "אותיות קטנות", + "Reset": "אִפּוּס", + "restore all settings to the default values": "שחזר את כל ההגדרות לערכי ברירת המחדל", + "Done": "בוצע", + "Caption Settings Dialog": "דו-שיח הגדרות כיתובים", + "Beginning of dialog window. Escape will cancel and close the window.": "תחילת חלון דו-שיח. Escape יבטל ויסגור את החלון", + "End of dialog window.": "סוף חלון דו-שיח." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/he.json b/js/libs/videojs/lang/he.json new file mode 100644 index 00000000..7bfb0d56 --- /dev/null +++ b/js/libs/videojs/lang/he.json @@ -0,0 +1,84 @@ +{ + "Audio Player": "נַגָּן שמע", + "Video Player": "נַגָּן וידאו", + "Play": "נַגֵּן", + "Pause": "השהה", + "Replay": "נַגֵּן שוב", + "Current Time": "זמן נוכחי", + "Duration": "זמן כולל", + "Remaining Time": "זמן נותר", + "Stream Type": "סוג Stream", + "LIVE": "שידור חי", + "Loaded": "נטען", + "Progress": "התקדמות", + "Progress Bar": "סרגל התקדמות", + "progress bar timing: currentTime={1} duration={2}": "{1} מתוך {2}", + "Fullscreen": "מסך מלא", + "Non-Fullscreen": "מסך לא מלא", + "Mute": "השתק", + "Unmute": "בטל השתקה", + "Playback Rate": "קצב ניגון", + "Subtitles": "כתוביות", + "subtitles off": "כתוביות כבויות", + "Captions": "כיתובים", + "captions off": "כיתובים כבויים", + "Chapters": "פרקים", + "Descriptions": "תיאורים", + "descriptions off": "תיאורים כבויים", + "Audio Track": "רצועת שמע", + "Volume Level": "רמת ווליום", + "You aborted the media playback": "ביטלת את השמעת המדיה", + "A network error caused the media download to fail part-way.": "שגיאת רשת גרמה להורדת המדיה להיכשל באמצע.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "לא ניתן לטעון את המדיה, או מכיוון שהרשת או השרת כשלו או מכיוון שהפורמט אינו נתמך.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "השמעת המדיה בוטלה בשל בעית השחטת מידע או מכיוון שהמדיה עשתה שימוש בתכונות שהדפדפן שלך לא תמך בהן.", + "No compatible source was found for this media.": "לא נמצא מקור תואם עבור מדיה זו.", + "The media is encrypted and we do not have the keys to decrypt it.": "המדיה מוצפנת ואין בידינו את המפתח כדי לפענח אותה.", + "Play Video": "נַגֵּן וידאו", + "Close": "סְגוֹר", + "Close Modal Dialog": "סְגוֹר דו-שיח מודאלי", + "Modal Window": "חלון מודאלי", + "This is a modal window": "זהו חלון מודאלי", + "This modal can be closed by pressing the Escape key or activating the close button.": "ניתן לסגור חלון מודאלי זה ע\"י לחיצה על כפתור ה-Escape או הפעלת כפתור הסגירה.", + ", opens captions settings dialog": ", פותח חלון הגדרות כיתובים", + ", opens subtitles settings dialog": ", פותח חלון הגדרות כתוביות", + ", opens descriptions settings dialog": ", פותח חלון הגדרות תיאורים", + ", selected": ", נבחר/ו", + "captions settings": "הגדרות כיתובים", + "subtitles settings": "הגדרות כתוביות", + "descriptions settings": "הגדרות תיאורים", + "Text": "טקסט", + "White": "לבן", + "Black": "שחור", + "Red": "אדום", + "Green": "ירוק", + "Blue": "כחול", + "Yellow": "צהוב", + "Magenta": "מַגֶ'נטָה", + "Cyan": "טורקיז", + "Background": "רקע", + "Window": "חלון", + "Transparent": "שקוף", + "Semi-Transparent": "שקוף למחצה", + "Opaque": "אָטוּם", + "Font Size": "גודל גופן", + "Text Edge Style": "סגנון קצוות טקסט", + "None": "ללא", + "Raised": "מורם", + "Depressed": "מורד", + "Uniform": "אחיד", + "Dropshadow": "הטלת צל", + "Font Family": "משפחת גופן", + "Proportional Sans-Serif": "פרופורציוני וללא תגיות (Proportional Sans-Serif)", + "Monospace Sans-Serif": "ברוחב אחיד וללא תגיות (Monospace Sans-Serif)", + "Proportional Serif": "פרופורציוני ועם תגיות (Proportional Serif)", + "Monospace Serif": "ברוחב אחיד ועם תגיות (Monospace Serif)", + "Casual": "אַגָבִי", + "Script": "תסריט", + "Small Caps": "אותיות קטנות", + "Reset": "אִפּוּס", + "restore all settings to the default values": "שחזר את כל ההגדרות לערכי ברירת המחדל", + "Done": "בוצע", + "Caption Settings Dialog": "דו-שיח הגדרות כיתובים", + "Beginning of dialog window. Escape will cancel and close the window.": "תחילת חלון דו-שיח. Escape יבטל ויסגור את החלון", + "End of dialog window.": "סוף חלון דו-שיח." +} diff --git a/js/libs/videojs/lang/hi.js b/js/libs/videojs/lang/hi.js new file mode 100644 index 00000000..87b7d5f2 --- /dev/null +++ b/js/libs/videojs/lang/hi.js @@ -0,0 +1,89 @@ +videojs.addLanguage('hi', { + "Audio Player": "ऑडियो प्लेयर", + "Video Player": "वीडियो प्लेयर", + "Play": "चलाएँ", + "Pause": "रोके", + "Replay": "फिर से चलाएँ", + "Current Time": "वर्तमान समय", + "Duration": "अवधि", + "Remaining Time": "शेष समय", + "Stream Type": "स्ट्रीम प्रकार", + "LIVE": "लाइव", + "Seek to live, currently behind live": "छोड़कर लाइव प्रसारण पर आगे बढ़ें, अभी लाइव प्रसारण से पीछे हैं", + "Seek to live, currently playing live": "छोड़कर लाइव प्रसारण पर आगे बढ़ें, अभी लाइव चल रहा है", + "Loaded": "लोड हुआ", + "Progress": "प्रगति", + "Progress Bar": "प्रोगेस बार", + "progress bar timing: currentTime={1} duration={2}": "{2} में से {1}", + "Fullscreen": "फ़ुल स्क्रीन", + "Non-Fullscreen": "फ़ुल स्क्रीन से बाहर निकलें", + "Mute": "म्यूट करें", + "Unmute": "अनम्यूट करें", + "Playback Rate": "चलाने की दर", + "Subtitles": "उपशीर्षक", + "subtitles off": "उपशीर्षक बंद", + "Captions": "कैप्शन", + "captions off": "कैप्शन बंद", + "Chapters": "अध्याय", + "Descriptions": "विवरण", + "descriptions off": "विवरण बंद", + "Audio Track": "ऑडियो ट्रैक", + "Volume Level": "वॉल्यूम स्तर", + "You aborted the media playback": "आपने मीडिया प्लेबैक को रोक दिया", + "A network error caused the media download to fail part-way.": "एक नेटवर्क त्रुटि के कारण मीडिया डाउनलोड आंशिक रूप से विफल हो गया।", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "मीडिया लोड नहीं किया जा सका, या तो सर्वर या नेटवर्क विफल होने के कारण या प्रारूप समर्थित नहीं होने के कारण।", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "मीडिया प्लेबैक निरस्त कर दिया गया, कारण: दूषण की समस्या या मीडिया ने उन सुविधाओं का उपयोग किया था जिनका आपके ब्राउज़र ने समर्थन नहीं किया।", + "No compatible source was found for this media.": "इस मीडिया के लिए कोई अनुकूल स्रोत नहीं मिला।.", + "The media is encrypted and we do not have the keys to decrypt it.": "मीडिया एन्क्रिप्टेड है और हमारे पास इसे डिक्रिप्ट करने की चाबी नहीं है।", + "Play Video": "वीडियो चलाएं", + "Close": "बंद करे", + "Close Modal Dialog": "मोडल डायलॉग बंद करें", + "Modal Window": "मोडल विंडो", + "This is a modal window": "यह एक मोडल विंडो है", + "This modal can be closed by pressing the Escape key or activating the close button.": "इस मोडल को एस्केप कुंजी दबाकर या बंद करें बटन को सक्रिय करके बंद किया जा सकता है।", + ", opens captions settings dialog": ", कैप्शन सेटिंग डायलॉग खोलता है", + ", opens subtitles settings dialog": ", उपशीर्षक सेटिंग्स संवाद खोलता है", + ", opens descriptions settings dialog": ", विवरण सेटिंग संवाद खोलता है", + ", selected": ", चुना गया", + "captions settings": "कैप्शन सेटिंग", + "subtitles settings": "उपशीर्षक सेटिंग", + "descriptions settings": "विवरण सेटिंग", + "Text": "टेक्स्ट", + "White": "सफेद", + "Black": "काला", + "Red": "लाल", + "Green": "हरा", + "Blue": "नीला", + "Yellow": "पीला", + "Magenta": "मैजेंटा", + "Cyan": "सियान", + "Background": "बैकग्राउंड", + "Window": "विंडो", + "Transparent": "पारदर्शी", + "Semi-Transparent": "अर्द्ध पारदर्शी", + "Opaque": "अपारदर्शी", + "Font Size": "फ़ॉन्ट आकार", + "Text Edge Style": "टेक्स्ट एज स्टाइल", + "None": "कोई नहीं", + "Raised": "उठा हुआ", + "Depressed": "उदास", + "Uniform": "वर्दी", + "Dropshadow": "परछाई", + "Font Family": "फॉण्ट परिवार", + "Proportional Sans-Serif": "प्रोपोरशनल साँस-सेरिफ", + "Monospace Sans-Serif": "मोनोस्पास साँस-सेरिफ", + "Proportional Serif": "प्रोपोरशनल सेरिफ", + "Monospace Serif": "मोनोस्पास सेरिफ", + "Casual": "आकस्मिक", + "Script": "स्क्रिप्ट", + "Small Caps": "छोटे अक्षर", + "Reset": "रीसेट करें", + "restore all settings to the default values": "सभी सेटिंग्स को डिफ़ॉल्ट मानों पर पुनर्स्थापित करें", + "Done": "पूर्ण", + "Caption Settings Dialog": "कैप्शन सेटिंग्स डायलॉग", + "Beginning of dialog window. Escape will cancel and close the window.": "डायलॉग विंडो की शुरुआत। एस्केप विंडो को रद्द और बंद कर देगा।", + "End of dialog window.": "संवाद विंडो का अंत।", + "{1} is loading.": "{1} लोड हो रहा है।", + "Exit Picture-in-Picture": "पिक्चर-इन-पिक्चर से बाहर निकलें", + "Picture-in-Picture": "पिक्चर-इन-पिक्चर" +}); \ No newline at end of file diff --git a/js/libs/videojs/lang/hi.json b/js/libs/videojs/lang/hi.json new file mode 100644 index 00000000..2825f64c --- /dev/null +++ b/js/libs/videojs/lang/hi.json @@ -0,0 +1,89 @@ +{ + "Audio Player": "ऑडियो प्लेयर", + "Video Player": "वीडियो प्लेयर", + "Play": "चलाएँ", + "Pause": "रोके", + "Replay": "फिर से चलाएँ", + "Current Time": "वर्तमान समय", + "Duration": "अवधि", + "Remaining Time": "शेष समय", + "Stream Type": "स्ट्रीम प्रकार", + "LIVE": "लाइव", + "Seek to live, currently behind live": "छोड़कर लाइव प्रसारण पर आगे बढ़ें, अभी लाइव प्रसारण से पीछे हैं", + "Seek to live, currently playing live": "छोड़कर लाइव प्रसारण पर आगे बढ़ें, अभी लाइव चल रहा है", + "Loaded": "लोड हुआ", + "Progress": "प्रगति", + "Progress Bar": "प्रोगेस बार", + "progress bar timing: currentTime={1} duration={2}": "{2} में से {1}", + "Fullscreen": "फ़ुल स्क्रीन", + "Non-Fullscreen": "फ़ुल स्क्रीन से बाहर निकलें", + "Mute": "म्यूट करें", + "Unmute": "अनम्यूट करें", + "Playback Rate": "चलाने की दर", + "Subtitles": "उपशीर्षक", + "subtitles off": "उपशीर्षक बंद", + "Captions": "कैप्शन", + "captions off": "कैप्शन बंद", + "Chapters": "अध्याय", + "Descriptions": "विवरण", + "descriptions off": "विवरण बंद", + "Audio Track": "ऑडियो ट्रैक", + "Volume Level": "वॉल्यूम स्तर", + "You aborted the media playback": "आपने मीडिया प्लेबैक को रोक दिया", + "A network error caused the media download to fail part-way.": "एक नेटवर्क त्रुटि के कारण मीडिया डाउनलोड आंशिक रूप से विफल हो गया।", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "मीडिया लोड नहीं किया जा सका, या तो सर्वर या नेटवर्क विफल होने के कारण या प्रारूप समर्थित नहीं होने के कारण।", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "मीडिया प्लेबैक निरस्त कर दिया गया, कारण: दूषण की समस्या या मीडिया ने उन सुविधाओं का उपयोग किया था जिनका आपके ब्राउज़र ने समर्थन नहीं किया।", + "No compatible source was found for this media.": "इस मीडिया के लिए कोई अनुकूल स्रोत नहीं मिला।.", + "The media is encrypted and we do not have the keys to decrypt it.": "मीडिया एन्क्रिप्टेड है और हमारे पास इसे डिक्रिप्ट करने की चाबी नहीं है।", + "Play Video": "वीडियो चलाएं", + "Close": "बंद करे", + "Close Modal Dialog": "मोडल डायलॉग बंद करें", + "Modal Window": "मोडल विंडो", + "This is a modal window": "यह एक मोडल विंडो है", + "This modal can be closed by pressing the Escape key or activating the close button.": "इस मोडल को एस्केप कुंजी दबाकर या बंद करें बटन को सक्रिय करके बंद किया जा सकता है।", + ", opens captions settings dialog": ", कैप्शन सेटिंग डायलॉग खोलता है", + ", opens subtitles settings dialog": ", उपशीर्षक सेटिंग्स संवाद खोलता है", + ", opens descriptions settings dialog": ", विवरण सेटिंग संवाद खोलता है", + ", selected": ", चुना गया", + "captions settings": "कैप्शन सेटिंग", + "subtitles settings": "उपशीर्षक सेटिंग", + "descriptions settings": "विवरण सेटिंग", + "Text": "टेक्स्ट", + "White": "सफेद", + "Black": "काला", + "Red": "लाल", + "Green": "हरा", + "Blue": "नीला", + "Yellow": "पीला", + "Magenta": "मैजेंटा", + "Cyan": "सियान", + "Background": "बैकग्राउंड", + "Window": "विंडो", + "Transparent": "पारदर्शी", + "Semi-Transparent": "अर्द्ध पारदर्शी", + "Opaque": "अपारदर्शी", + "Font Size": "फ़ॉन्ट आकार", + "Text Edge Style": "टेक्स्ट एज स्टाइल", + "None": "कोई नहीं", + "Raised": "उठा हुआ", + "Depressed": "उदास", + "Uniform": "वर्दी", + "Dropshadow": "परछाई", + "Font Family": "फॉण्ट परिवार", + "Proportional Sans-Serif": "प्रोपोरशनल साँस-सेरिफ", + "Monospace Sans-Serif": "मोनोस्पास साँस-सेरिफ", + "Proportional Serif": "प्रोपोरशनल सेरिफ", + "Monospace Serif": "मोनोस्पास सेरिफ", + "Casual": "आकस्मिक", + "Script": "स्क्रिप्ट", + "Small Caps": "छोटे अक्षर", + "Reset": "रीसेट करें", + "restore all settings to the default values": "सभी सेटिंग्स को डिफ़ॉल्ट मानों पर पुनर्स्थापित करें", + "Done": "पूर्ण", + "Caption Settings Dialog": "कैप्शन सेटिंग्स डायलॉग", + "Beginning of dialog window. Escape will cancel and close the window.": "डायलॉग विंडो की शुरुआत। एस्केप विंडो को रद्द और बंद कर देगा।", + "End of dialog window.": "संवाद विंडो का अंत।", + "{1} is loading.": "{1} लोड हो रहा है।", + "Exit Picture-in-Picture": "पिक्चर-इन-पिक्चर से बाहर निकलें", + "Picture-in-Picture": "पिक्चर-इन-पिक्चर" +} diff --git a/js/libs/videojs/lang/hr.js b/js/libs/videojs/lang/hr.js index 5e32a22b..2606362a 100644 --- a/js/libs/videojs/lang/hr.js +++ b/js/libs/videojs/lang/hr.js @@ -1,26 +1,26 @@ -videojs.addLanguage("hr",{ - "Play": "Pusti", - "Pause": "Pauza", - "Current Time": "Trenutno vrijeme", - "Duration Time": "Vrijeme trajanja", - "Remaining Time": "Preostalo vrijeme", - "Stream Type": "Način strimovanja", - "LIVE": "UŽIVO", - "Loaded": "Učitan", - "Progress": "Progres", - "Fullscreen": "Puni ekran", - "Non-Fullscreen": "Mali ekran", - "Mute": "Prigušen", - "Unmute": "Ne-prigušen", - "Playback Rate": "Stopa reprodukcije", - "Subtitles": "Podnaslov", - "subtitles off": "Podnaslov deaktiviran", - "Captions": "Titlovi", - "captions off": "Titlovi deaktivirani", - "Chapters": "Poglavlja", - "You aborted the media playback": "Isključili ste reprodukciju videa.", - "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", - "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." +videojs.addLanguage('hr', { + "Play": "Pusti", + "Pause": "Pauza", + "Current Time": "Trenutno vrijeme", + "Duration": "Vrijeme trajanja", + "Remaining Time": "Preostalo vrijeme", + "Stream Type": "Način strimovanja", + "LIVE": "UŽIVO", + "Loaded": "Učitan", + "Progress": "Progres", + "Fullscreen": "Puni ekran", + "Non-Fullscreen": "Mali ekran", + "Mute": "Prigušen", + "Unmute": "Ne-prigušen", + "Playback Rate": "Stopa reprodukcije", + "Subtitles": "Podnaslov", + "subtitles off": "Podnaslov deaktiviran", + "Captions": "Titlovi", + "captions off": "Titlovi deaktivirani", + "Chapters": "Poglavlja", + "You aborted the media playback": "Isključili ste reprodukciju videa.", + "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", + "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/hr.json b/js/libs/videojs/lang/hr.json new file mode 100644 index 00000000..32e1763f --- /dev/null +++ b/js/libs/videojs/lang/hr.json @@ -0,0 +1,26 @@ +{ + "Play": "Pusti", + "Pause": "Pauza", + "Current Time": "Trenutno vrijeme", + "Duration": "Vrijeme trajanja", + "Remaining Time": "Preostalo vrijeme", + "Stream Type": "Način strimovanja", + "LIVE": "UŽIVO", + "Loaded": "Učitan", + "Progress": "Progres", + "Fullscreen": "Puni ekran", + "Non-Fullscreen": "Mali ekran", + "Mute": "Prigušen", + "Unmute": "Ne-prigušen", + "Playback Rate": "Stopa reprodukcije", + "Subtitles": "Podnaslov", + "subtitles off": "Podnaslov deaktiviran", + "Captions": "Titlovi", + "captions off": "Titlovi deaktivirani", + "Chapters": "Poglavlja", + "You aborted the media playback": "Isključili ste reprodukciju videa.", + "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", + "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." +} diff --git a/js/libs/videojs/lang/hu.js b/js/libs/videojs/lang/hu.js index 5b5123d8..5b3bc828 100644 --- a/js/libs/videojs/lang/hu.js +++ b/js/libs/videojs/lang/hu.js @@ -1,26 +1,89 @@ -videojs.addLanguage("hu",{ - "Play": "Lejátszás", - "Pause": "Szünet", - "Current Time": "Aktuális időpont", - "Duration Time": "Hossz", - "Remaining Time": "Hátralévő idő", - "Stream Type": "Adatfolyam típusa", - "LIVE": "ÉLŐ", - "Loaded": "Betöltve", - "Progress": "Állapot", - "Fullscreen": "Teljes képernyő", - "Non-Fullscreen": "Normál méret", - "Mute": "Némítás", - "Unmute": "Némítás kikapcsolva", - "Playback Rate": "Lejátszási sebesség", - "Subtitles": "Feliratok", - "subtitles off": "Feliratok kikapcsolva", - "Captions": "Magyarázó szöveg", - "captions off": "Magyarázó szöveg kikapcsolva", - "Chapters": "Fejezetek", - "You aborted the media playback": "Leállította a lejátszást", - "A network error caused the media download to fail part-way.": "Hálózati hiba miatt a videó részlegesen töltődött le.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "A videó nem tölthető be hálózati vagy kiszolgálói hiba miatt, vagy a formátuma nem támogatott.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A lejátszás adatsérülés miatt leállt, vagy a videó egyes tulajdonságait a böngészője nem támogatja.", - "No compatible source was found for this media.": "Nincs kompatibilis forrás ehhez a videóhoz." +videojs.addLanguage('hu', { + "Play": "Lejátszás", + "Pause": "Szünet", + "Current Time": "Aktuális időpont", + "Duration": "Hossz", + "Remaining Time": "Hátralévő idő", + "Stream Type": "Adatfolyam típusa", + "LIVE": "ÉLŐ", + "Loaded": "Betöltve", + "Progress": "Állapot", + "Fullscreen": "Teljes képernyő", + "Non-Fullscreen": "Normál méret", + "Mute": "Némítás", + "Unmute": "Némítás kikapcsolva", + "Playback Rate": "Lejátszási sebesség", + "Subtitles": "Feliratok", + "subtitles off": "Feliratok kikapcsolva", + "Captions": "Magyarázó szöveg", + "captions off": "Magyarázó szöveg kikapcsolva", + "Chapters": "Fejezetek", + "You aborted the media playback": "Leállította a lejátszást", + "A network error caused the media download to fail part-way.": "Hálózati hiba miatt a videó részlegesen töltődött le.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "A videó nem tölthető be hálózati vagy kiszolgálói hiba miatt, vagy a formátuma nem támogatott.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A lejátszás adatsérülés miatt leállt, vagy a videó egyes tulajdonságait a böngészője nem támogatja.", + "No compatible source was found for this media.": "Nincs kompatibilis forrás ehhez a videóhoz.", + "Audio Player": "Audio lejátszó", + "Video Player": "Videó lejátszó", + "Replay": "Visszajátszás", + "Descriptions": "Leírások", + "descriptions off": "leírások kikapcsolva", + "Audio Track": "Hangsáv", + "Volume Level": "Hangerő", + "Play Video": "Videó lejátszása", + "Close": "Bezárás", + "Text": "Szöveg", + "White": "Fehér", + "Black": "Fekete", + "Red": "Piros", + "Green": "Zöld", + "Blue": "Kék", + "Yellow": "Sárga", + "Background": "Háttér", + "Window": "Ablak", + "Transparent": "Átlátszó", + "Semi-Transparent": "Félig átlátszó", + "Opaque": "Áttetsző", + "Font Size": "Betűméret", + "Font Family": "Betűtípus", + "Done": "Kész", + "Picture-in-Picture": "Kép a képben", + "Exit Picture-in-Picture": "Kilépés kép a képben módból", + "{1} is loading.": "{1} betöltése.", + "Reset": "Visszaállítás", + "restore all settings to the default values": "összes beállítás visszaállítása az alapértelmezett értékekre", + "The media is encrypted and we do not have the keys to decrypt it.": "A média titkosítva van és nincsenek kulcsok a visszafejtéshez.", + "Close Modal Dialog": "Felugró ablak bezárása", + "Modal Window": "Felugró ablak", + "This modal can be closed by pressing the Escape key or activating the close button.": "Ezt a felugró ablakot az Escape gomb megnyomásával vagy a bezáró gomb aktiválásával lehet bezárni.", + ", selected": ", kiválasztva", + "descriptions settings": "leírások beállítása", + "Text Edge Style": "Szövegél stílus", + "This is a modal window": "Ez egy felugró ablak", + "Cyan": "Cián", + "Dropshadow": "Árnyék", + "End of dialog window.": "Párbeszédablak vége.", + "Progress Bar": "Folyamatjelző sáv", + "Beginning of dialog window. Escape will cancel and close the window.": "Párbeszédablak eleje. Az Escape gomb befejezi és bezárja az ablakot.", + "Caption Settings Dialog": "Feliratbeállítások párbeszédablak", + ", opens descriptions settings dialog": ", megnyitja a leírások beállításainak párbeszédablakját", + ", opens captions settings dialog": ", megnyitja a magyarázó szövegek beállításainak párbeszédablakját", + ", opens subtitles settings dialog": ", megnyitja a feliratok beállításainak párbeszédablakját", + "Seek to live, currently behind live": "Élő adáshoz tekerés, jelenleg az élő adás mögött van", + "Seek to live, currently playing live": "Élő adáshoz tekerés, jelenleg az élő adásnál van", + "progress bar timing: currentTime={1} duration={2}": "{1} / {2}", + "Magenta": "Lila", + "Script": "Script", + "Casual": "Casual", + "Monospace Serif": "Monospace Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Sans-Serif": "Proportional Sans-Serif", + "Proportional Serif": "Proportional Serif", + "Uniform": "Uniform", + "Small Caps": "Kiskapitális", + "None": "Egyik sem", + "captions settings": "magyarázó szövegek beállításai", + "subtitles settings": "feliratok beállításai", + "Raised": "Emelt", + "Depressed": "Nyomott" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/hu.json b/js/libs/videojs/lang/hu.json new file mode 100644 index 00000000..6362af7a --- /dev/null +++ b/js/libs/videojs/lang/hu.json @@ -0,0 +1,89 @@ +{ + "Play": "Lejátszás", + "Pause": "Szünet", + "Current Time": "Aktuális időpont", + "Duration": "Hossz", + "Remaining Time": "Hátralévő idő", + "Stream Type": "Adatfolyam típusa", + "LIVE": "ÉLŐ", + "Loaded": "Betöltve", + "Progress": "Állapot", + "Fullscreen": "Teljes képernyő", + "Non-Fullscreen": "Normál méret", + "Mute": "Némítás", + "Unmute": "Némítás kikapcsolva", + "Playback Rate": "Lejátszási sebesség", + "Subtitles": "Feliratok", + "subtitles off": "Feliratok kikapcsolva", + "Captions": "Magyarázó szöveg", + "captions off": "Magyarázó szöveg kikapcsolva", + "Chapters": "Fejezetek", + "You aborted the media playback": "Leállította a lejátszást", + "A network error caused the media download to fail part-way.": "Hálózati hiba miatt a videó részlegesen töltődött le.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "A videó nem tölthető be hálózati vagy kiszolgálói hiba miatt, vagy a formátuma nem támogatott.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A lejátszás adatsérülés miatt leállt, vagy a videó egyes tulajdonságait a böngészője nem támogatja.", + "No compatible source was found for this media.": "Nincs kompatibilis forrás ehhez a videóhoz.", + "Audio Player": "Audio lejátszó", + "Video Player": "Videó lejátszó", + "Replay": "Visszajátszás", + "Descriptions": "Leírások", + "descriptions off": "leírások kikapcsolva", + "Audio Track": "Hangsáv", + "Volume Level": "Hangerő", + "Play Video": "Videó lejátszása", + "Close": "Bezárás", + "Text": "Szöveg", + "White": "Fehér", + "Black": "Fekete", + "Red": "Piros", + "Green": "Zöld", + "Blue": "Kék", + "Yellow": "Sárga", + "Background": "Háttér", + "Window": "Ablak", + "Transparent": "Átlátszó", + "Semi-Transparent": "Félig átlátszó", + "Opaque": "Áttetsző", + "Font Size": "Betűméret", + "Font Family": "Betűtípus", + "Done": "Kész", + "Picture-in-Picture": "Kép a képben", + "Exit Picture-in-Picture": "Kilépés kép a képben módból", + "{1} is loading.": "{1} betöltése.", + "Reset": "Visszaállítás", + "restore all settings to the default values": "összes beállítás visszaállítása az alapértelmezett értékekre", + "The media is encrypted and we do not have the keys to decrypt it.": "A média titkosítva van és nincsenek kulcsok a visszafejtéshez.", + "Close Modal Dialog": "Felugró ablak bezárása", + "Modal Window": "Felugró ablak", + "This modal can be closed by pressing the Escape key or activating the close button.": "Ezt a felugró ablakot az Escape gomb megnyomásával vagy a bezáró gomb aktiválásával lehet bezárni.", + ", selected": ", kiválasztva", + "descriptions settings": "leírások beállítása", + "Text Edge Style": "Szövegél stílus", + "This is a modal window": "Ez egy felugró ablak", + "Cyan": "Cián", + "Dropshadow": "Árnyék", + "End of dialog window.": "Párbeszédablak vége.", + "Progress Bar": "Folyamatjelző sáv", + "Beginning of dialog window. Escape will cancel and close the window.": "Párbeszédablak eleje. Az Escape gomb befejezi és bezárja az ablakot.", + "Caption Settings Dialog": "Feliratbeállítások párbeszédablak", + ", opens descriptions settings dialog": ", megnyitja a leírások beállításainak párbeszédablakját", + ", opens captions settings dialog": ", megnyitja a magyarázó szövegek beállításainak párbeszédablakját", + ", opens subtitles settings dialog": ", megnyitja a feliratok beállításainak párbeszédablakját", + "Seek to live, currently behind live": "Élő adáshoz tekerés, jelenleg az élő adás mögött van", + "Seek to live, currently playing live": "Élő adáshoz tekerés, jelenleg az élő adásnál van", + "progress bar timing: currentTime={1} duration={2}": "{1} / {2}", + "Magenta": "Lila", + "Script": "Script", + "Casual": "Casual", + "Monospace Serif": "Monospace Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Sans-Serif": "Proportional Sans-Serif", + "Proportional Serif": "Proportional Serif", + "Uniform": "Uniform", + "Small Caps": "Kiskapitális", + "None": "Egyik sem", + "captions settings": "magyarázó szövegek beállításai", + "subtitles settings": "feliratok beállításai", + "Raised": "Emelt", + "Depressed": "Nyomott" +} diff --git a/js/libs/videojs/lang/it.js b/js/libs/videojs/lang/it.js index 1f7394b5..18a1c4c1 100644 --- a/js/libs/videojs/lang/it.js +++ b/js/libs/videojs/lang/it.js @@ -1,26 +1,26 @@ -videojs.addLanguage("it",{ - "Play": "Play", - "Pause": "Pausa", - "Current Time": "Orario attuale", - "Duration Time": "Durata", - "Remaining Time": "Tempo rimanente", - "Stream Type": "Tipo del Streaming", - "LIVE": "LIVE", - "Loaded": "Caricato", - "Progress": "Stato", - "Fullscreen": "Schermo intero", - "Non-Fullscreen": "Chiudi schermo intero", - "Mute": "Muto", - "Unmute": "Audio", - "Playback Rate": "Tasso di riproduzione", - "Subtitles": "Sottotitoli", - "subtitles off": "Senza sottotitoli", - "Captions": "Sottotitoli non udenti", - "captions off": "Senza sottotitoli non udenti", - "Chapters": "Capitolo", - "You aborted the media playback": "La riproduzione del filmato è stata interrotta.", - "A network error caused the media download to fail part-way.": "Il download del filmato è stato interrotto a causa di un problema rete.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Il filmato non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La riproduzione del filmato è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.", - "No compatible source was found for this media.": "Non ci sono fonti compatibili per questo filmato." +videojs.addLanguage('it', { + "Play": "Play", + "Pause": "Pausa", + "Current Time": "Orario attuale", + "Duration": "Durata", + "Remaining Time": "Tempo rimanente", + "Stream Type": "Tipo del Streaming", + "LIVE": "LIVE", + "Loaded": "Caricato", + "Progress": "Stato", + "Fullscreen": "Schermo intero", + "Non-Fullscreen": "Chiudi schermo intero", + "Mute": "Muto", + "Unmute": "Audio", + "Playback Rate": "Tasso di riproduzione", + "Subtitles": "Sottotitoli", + "subtitles off": "Senza sottotitoli", + "Captions": "Sottotitoli non udenti", + "captions off": "Senza sottotitoli non udenti", + "Chapters": "Capitolo", + "You aborted the media playback": "La riproduzione del filmato è stata interrotta.", + "A network error caused the media download to fail part-way.": "Il download del filmato è stato interrotto a causa di un problema rete.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Il filmato non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La riproduzione del filmato è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.", + "No compatible source was found for this media.": "Non ci sono fonti compatibili per questo filmato." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/it.json b/js/libs/videojs/lang/it.json new file mode 100644 index 00000000..19f5a785 --- /dev/null +++ b/js/libs/videojs/lang/it.json @@ -0,0 +1,26 @@ +{ + "Play": "Play", + "Pause": "Pausa", + "Current Time": "Orario attuale", + "Duration": "Durata", + "Remaining Time": "Tempo rimanente", + "Stream Type": "Tipo del Streaming", + "LIVE": "LIVE", + "Loaded": "Caricato", + "Progress": "Stato", + "Fullscreen": "Schermo intero", + "Non-Fullscreen": "Chiudi schermo intero", + "Mute": "Muto", + "Unmute": "Audio", + "Playback Rate": "Tasso di riproduzione", + "Subtitles": "Sottotitoli", + "subtitles off": "Senza sottotitoli", + "Captions": "Sottotitoli non udenti", + "captions off": "Senza sottotitoli non udenti", + "Chapters": "Capitolo", + "You aborted the media playback": "La riproduzione del filmato è stata interrotta.", + "A network error caused the media download to fail part-way.": "Il download del filmato è stato interrotto a causa di un problema rete.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Il filmato non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La riproduzione del filmato è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.", + "No compatible source was found for this media.": "Non ci sono fonti compatibili per questo filmato." +} diff --git a/js/libs/videojs/lang/ja.js b/js/libs/videojs/lang/ja.js index 6c853b54..7d71cd10 100644 --- a/js/libs/videojs/lang/ja.js +++ b/js/libs/videojs/lang/ja.js @@ -1,26 +1,26 @@ -videojs.addLanguage("ja",{ - "Play": "再生", - "Pause": "一時停止", - "Current Time": "現在の時間", - "Duration Time": "長さ", - "Remaining Time": "残りの時間", - "Stream Type": "ストリームの種類", - "LIVE": "ライブ", - "Loaded": "ロード済み", - "Progress": "進行状況", - "Fullscreen": "フルスクリーン", - "Non-Fullscreen": "フルスクリーン以外", - "Mute": "ミュート", - "Unmute": "ミュート解除", - "Playback Rate": "再生レート", - "Subtitles": "サブタイトル", - "subtitles off": "サブタイトル オフ", - "Captions": "キャプション", - "captions off": "キャプション オフ", - "Chapters": "チャプター", - "You aborted the media playback": "動画再生を中止しました", - "A network error caused the media download to fail part-way.": "ネットワーク エラーにより動画のダウンロードが途中で失敗しました", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "サーバーまたはネットワークのエラー、またはフォーマットがサポートされていないため、動画をロードできませんでした", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "破損の問題、またはお使いのブラウザがサポートしていない機能が動画に使用されていたため、動画の再生が中止されました", - "No compatible source was found for this media.": "この動画に対して互換性のあるソースが見つかりませんでした" +videojs.addLanguage('ja', { + "Play": "再生", + "Pause": "一時停止", + "Current Time": "現在の時間", + "Duration": "長さ", + "Remaining Time": "残りの時間", + "Stream Type": "ストリームの種類", + "LIVE": "ライブ", + "Loaded": "ロード済み", + "Progress": "進行状況", + "Fullscreen": "フルスクリーン", + "Non-Fullscreen": "フルスクリーン以外", + "Mute": "ミュート", + "Unmute": "ミュート解除", + "Playback Rate": "再生レート", + "Subtitles": "サブタイトル", + "subtitles off": "サブタイトル オフ", + "Captions": "キャプション", + "captions off": "キャプション オフ", + "Chapters": "チャプター", + "You aborted the media playback": "動画再生を中止しました", + "A network error caused the media download to fail part-way.": "ネットワーク エラーにより動画のダウンロードが途中で失敗しました", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "サーバーまたはネットワークのエラー、またはフォーマットがサポートされていないため、動画をロードできませんでした", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "破損の問題、またはお使いのブラウザがサポートしていない機能が動画に使用されていたため、動画の再生が中止されました", + "No compatible source was found for this media.": "この動画に対して互換性のあるソースが見つかりませんでした" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/ja.json b/js/libs/videojs/lang/ja.json new file mode 100644 index 00000000..df5b6cf0 --- /dev/null +++ b/js/libs/videojs/lang/ja.json @@ -0,0 +1,26 @@ +{ + "Play": "再生", + "Pause": "一時停止", + "Current Time": "現在の時間", + "Duration": "長さ", + "Remaining Time": "残りの時間", + "Stream Type": "ストリームの種類", + "LIVE": "ライブ", + "Loaded": "ロード済み", + "Progress": "進行状況", + "Fullscreen": "フルスクリーン", + "Non-Fullscreen": "フルスクリーン以外", + "Mute": "ミュート", + "Unmute": "ミュート解除", + "Playback Rate": "再生レート", + "Subtitles": "サブタイトル", + "subtitles off": "サブタイトル オフ", + "Captions": "キャプション", + "captions off": "キャプション オフ", + "Chapters": "チャプター", + "You aborted the media playback": "動画再生を中止しました", + "A network error caused the media download to fail part-way.": "ネットワーク エラーにより動画のダウンロードが途中で失敗しました", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "サーバーまたはネットワークのエラー、またはフォーマットがサポートされていないため、動画をロードできませんでした", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "破損の問題、またはお使いのブラウザがサポートしていない機能が動画に使用されていたため、動画の再生が中止されました", + "No compatible source was found for this media.": "この動画に対して互換性のあるソースが見つかりませんでした" +} diff --git a/js/libs/videojs/lang/ko.js b/js/libs/videojs/lang/ko.js index ee3ce2a6..74048c9b 100644 --- a/js/libs/videojs/lang/ko.js +++ b/js/libs/videojs/lang/ko.js @@ -1,26 +1,26 @@ -videojs.addLanguage("ko",{ - "Play": "재생", - "Pause": "일시중지", - "Current Time": "현재 시간", - "Duration Time": "지정 기간", - "Remaining Time": "남은 시간", - "Stream Type": "스트리밍 유형", - "LIVE": "라이브", - "Loaded": "로드됨", - "Progress": "진행", - "Fullscreen": "전체 화면", - "Non-Fullscreen": "전체 화면 해제", - "Mute": "음소거", - "Unmute": "음소거 해제", - "Playback Rate": "재생 비율", - "Subtitles": "서브타이틀", - "subtitles off": "서브타이틀 끄기", - "Captions": "자막", - "captions off": "자막 끄기", - "Chapters": "챕터", - "You aborted the media playback": "비디오 재생을 취소했습니다.", - "A network error caused the media download to fail part-way.": "네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "비디오를 로드할 수 없습니다. 서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "비디오 재생이 취소됐습니다. 비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.", - "No compatible source was found for this media.": "비디오에 호환되지 않는 소스가 있습니다." +videojs.addLanguage('ko', { + "Play": "재생", + "Pause": "일시중지", + "Current Time": "현재 시간", + "Duration": "지정 기간", + "Remaining Time": "남은 시간", + "Stream Type": "스트리밍 유형", + "LIVE": "라이브", + "Loaded": "로드됨", + "Progress": "진행", + "Fullscreen": "전체 화면", + "Non-Fullscreen": "전체 화면 해제", + "Mute": "음소거", + "Unmute": "음소거 해제", + "Playback Rate": "재생 비율", + "Subtitles": "서브타이틀", + "subtitles off": "서브타이틀 끄기", + "Captions": "자막", + "captions off": "자막 끄기", + "Chapters": "챕터", + "You aborted the media playback": "비디오 재생을 취소했습니다.", + "A network error caused the media download to fail part-way.": "네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "비디오를 로드할 수 없습니다. 서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "비디오 재생이 취소됐습니다. 비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.", + "No compatible source was found for this media.": "비디오에 호환되지 않는 소스가 있습니다." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/ko.json b/js/libs/videojs/lang/ko.json new file mode 100644 index 00000000..879edaff --- /dev/null +++ b/js/libs/videojs/lang/ko.json @@ -0,0 +1,26 @@ +{ + "Play": "재생", + "Pause": "일시중지", + "Current Time": "현재 시간", + "Duration": "지정 기간", + "Remaining Time": "남은 시간", + "Stream Type": "스트리밍 유형", + "LIVE": "라이브", + "Loaded": "로드됨", + "Progress": "진행", + "Fullscreen": "전체 화면", + "Non-Fullscreen": "전체 화면 해제", + "Mute": "음소거", + "Unmute": "음소거 해제", + "Playback Rate": "재생 비율", + "Subtitles": "서브타이틀", + "subtitles off": "서브타이틀 끄기", + "Captions": "자막", + "captions off": "자막 끄기", + "Chapters": "챕터", + "You aborted the media playback": "비디오 재생을 취소했습니다.", + "A network error caused the media download to fail part-way.": "네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "비디오를 로드할 수 없습니다. 서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "비디오 재생이 취소됐습니다. 비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.", + "No compatible source was found for this media.": "비디오에 호환되지 않는 소스가 있습니다." +} diff --git a/js/libs/videojs/lang/nb.js b/js/libs/videojs/lang/nb.js index e4bbcc9d..2acc4fe4 100644 --- a/js/libs/videojs/lang/nb.js +++ b/js/libs/videojs/lang/nb.js @@ -1,26 +1,87 @@ -videojs.addLanguage("nb",{ - "Play": "Spill", - "Pause": "Pause", - "Current Time": "Aktuell tid", - "Duration Time": "Varighet", - "Remaining Time": "Gjenstående tid", - "Stream Type": "Type strøm", - "LIVE": "DIREKTE", - "Loaded": "Lastet inn", - "Progress": "Status", - "Fullscreen": "Fullskjerm", - "Non-Fullscreen": "Lukk fullskjerm", - "Mute": "Lyd av", - "Unmute": "Lyd på", - "Playback Rate": "Avspillingsrate", - "Subtitles": "Undertekst på", - "subtitles off": "Undertekst av", - "Captions": "Undertekst for hørselshemmede på", - "captions off": "Undertekst for hørselshemmede av", - "Chapters": "Kapitler", - "You aborted the media playback": "Du avbrøt avspillingen.", - "A network error caused the media download to fail part-way.": "En nettverksfeil avbrøt nedlasting av videoen.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikke lastes ned, på grunn av nettverksfeil eller serverfeil, eller fordi formatet ikke er støttet.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoavspillingen ble avbrudt på grunn av ødelagte data eller fordi videoen ville gjøre noe som nettleseren din ikke har støtte for.", - "No compatible source was found for this media.": "Fant ikke en kompatibel kilde for dette mediainnholdet." +videojs.addLanguage('nb', { + "Audio Player": "Lydspiller", + "Video Player": "Videospiller", + "Play": "Spill", + "Pause": "Pause", + "Replay": "Spill om igjen", + "Current Time": "Aktuell tid", + "Duration": "Varighet", + "Remaining Time": "Gjenstående tid", + "Stream Type": "Type strøm", + "LIVE": "DIREKTE", + "Seek to live, currently behind live": "Hopp til live, spiller tidligere i sendingen nå", + "Seek to live, currently playing live": "Hopp til live, spiller live nå", + "Loaded": "Lastet inn", + "Progress": "Framdrift", + "Progress Bar": "Framdriftsviser", + "progress bar timing: currentTime={1} duration={2}": "{1} av {2}", + "Fullscreen": "Fullskjerm", + "Non-Fullscreen": "Lukk fullskjerm", + "Mute": "Lyd av", + "Unmute": "Lyd på", + "Playback Rate": "Avspillingshastighet", + "Subtitles": "Teksting på", + "subtitles off": "Teksting av", + "Captions": "Teksting for hørselshemmede på", + "captions off": "Teksting for hørselshemmede av", + "Chapters": "Kapitler", + "Descriptions": "Beskrivelser", + "descriptions off": "beskrivelser av", + "Audio Track": "Lydspor", + "Volume Level": "Volumnivå", + "You aborted the media playback": "Du avbrøt avspillingen.", + "A network error caused the media download to fail part-way.": "En nettverksfeil avbrøt nedlasting av videoen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikke lastes ned, på grunn av nettverksfeil eller serverfeil, eller fordi formatet ikke er støttet.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoavspillingen ble avbrudt på grunn av ødelagte data eller fordi videoen ville gjøre noe som nettleseren din ikke har støtte for.", + "No compatible source was found for this media.": "Fant ikke en kompatibel kilde for dette mediainnholdet.", + "The media is encrypted and we do not have the keys to decrypt it.": "Mediefilen er kryptert og vi mangler nøkler for å dekryptere den.", + "Play Video": "Spill av video", + "Close": "Lukk", + "Close Modal Dialog": "Lukk dialogvinduet", + "Modal Window": "Dialogvindu", + "This is a modal window": "Dette er et dialogvindu", + "This modal can be closed by pressing the Escape key or activating the close button.": "Vinduet kan lukkes ved å trykke på Escape-tasten eller lukkeknappen.", + ", opens captions settings dialog": ", åpner innstillinger for teksting for hørselshemmede", + ", opens subtitles settings dialog": ", åpner innstillinger for teksting", + ", opens descriptions settings dialog": ", åpner innstillinger for beskrivelser", + ", selected": ", valgt", + "captions settings": "innstillinger for teksting", + "subtitles settings": "innstillinger for teksting", + "descriptions settings": "innstillinger for beskrivelser", + "Text": "Tekst", + "White": "Hvit", + "Black": "Svart", + "Red": "Rød", + "Green": "Grønn", + "Blue": "Blå", + "Yellow": "Gul", + "Magenta": "Magenta", + "Cyan": "Turkis", + "Background": "Bakgrunn", + "Window": "Vindu", + "Transparent": "Gjennomsiktig", + "Semi-Transparent": "Delvis gjennomsiktig", + "Opaque": "Ugjennomsiktig", + "Font Size": "Tekststørrelse", + "Text Edge Style": "Tekstkant", + "None": "Ingen", + "Raised": "Uthevet", + "Depressed": "Nedtrykt", + "Uniform": "Enkel", + "Dropshadow": "Skygge", + "Font Family": "Skrifttype", + "Proportional Sans-Serif": "Proporsjonal skrift uten seriffer", + "Monospace Sans-Serif": "Fastbreddeskrift uten seriffer", + "Proportional Serif": "Proporsjonal skrift med seriffer", + "Monospace Serif": "Fastbreddeskrift med seriffer", + "Casual": "Uformell", + "Script": "Skråskrift", + "Small Caps": "Kapitéler", + "Reset": "Tilbakestill", + "restore all settings to the default values": "tilbakestill alle innstillinger til standardverdiene", + "Done": "Ferdig", + "Caption Settings Dialog": "Innstillingsvindu for teksting for hørselshemmede", + "Beginning of dialog window. Escape will cancel and close the window.": "Begynnelse på dialogvindu. Trykk Escape for å avbryte og lukke vinduet.", + "End of dialog window.": "Avslutning på dialogvindu.", + "{1} is loading.": "{1} laster." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/nb.json b/js/libs/videojs/lang/nb.json new file mode 100644 index 00000000..a2c843d1 --- /dev/null +++ b/js/libs/videojs/lang/nb.json @@ -0,0 +1,87 @@ +{ + "Audio Player": "Lydspiller", + "Video Player": "Videospiller", + "Play": "Spill", + "Pause": "Pause", + "Replay": "Spill om igjen", + "Current Time": "Aktuell tid", + "Duration": "Varighet", + "Remaining Time": "Gjenstående tid", + "Stream Type": "Type strøm", + "LIVE": "DIREKTE", + "Seek to live, currently behind live": "Hopp til live, spiller tidligere i sendingen nå", + "Seek to live, currently playing live": "Hopp til live, spiller live nå", + "Loaded": "Lastet inn", + "Progress": "Framdrift", + "Progress Bar": "Framdriftsviser", + "progress bar timing: currentTime={1} duration={2}": "{1} av {2}", + "Fullscreen": "Fullskjerm", + "Non-Fullscreen": "Lukk fullskjerm", + "Mute": "Lyd av", + "Unmute": "Lyd på", + "Playback Rate": "Avspillingshastighet", + "Subtitles": "Teksting på", + "subtitles off": "Teksting av", + "Captions": "Teksting for hørselshemmede på", + "captions off": "Teksting for hørselshemmede av", + "Chapters": "Kapitler", + "Descriptions": "Beskrivelser", + "descriptions off": "beskrivelser av", + "Audio Track": "Lydspor", + "Volume Level": "Volumnivå", + "You aborted the media playback": "Du avbrøt avspillingen.", + "A network error caused the media download to fail part-way.": "En nettverksfeil avbrøt nedlasting av videoen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikke lastes ned, på grunn av nettverksfeil eller serverfeil, eller fordi formatet ikke er støttet.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoavspillingen ble avbrudt på grunn av ødelagte data eller fordi videoen ville gjøre noe som nettleseren din ikke har støtte for.", + "No compatible source was found for this media.": "Fant ikke en kompatibel kilde for dette mediainnholdet.", + "The media is encrypted and we do not have the keys to decrypt it.": "Mediefilen er kryptert og vi mangler nøkler for å dekryptere den.", + "Play Video": "Spill av video", + "Close": "Lukk", + "Close Modal Dialog": "Lukk dialogvinduet", + "Modal Window": "Dialogvindu", + "This is a modal window": "Dette er et dialogvindu", + "This modal can be closed by pressing the Escape key or activating the close button.": "Vinduet kan lukkes ved å trykke på Escape-tasten eller lukkeknappen.", + ", opens captions settings dialog": ", åpner innstillinger for teksting for hørselshemmede", + ", opens subtitles settings dialog": ", åpner innstillinger for teksting", + ", opens descriptions settings dialog": ", åpner innstillinger for beskrivelser", + ", selected": ", valgt", + "captions settings": "innstillinger for teksting", + "subtitles settings": "innstillinger for teksting", + "descriptions settings": "innstillinger for beskrivelser", + "Text": "Tekst", + "White": "Hvit", + "Black": "Svart", + "Red": "Rød", + "Green": "Grønn", + "Blue": "Blå", + "Yellow": "Gul", + "Magenta": "Magenta", + "Cyan": "Turkis", + "Background": "Bakgrunn", + "Window": "Vindu", + "Transparent": "Gjennomsiktig", + "Semi-Transparent": "Delvis gjennomsiktig", + "Opaque": "Ugjennomsiktig", + "Font Size": "Tekststørrelse", + "Text Edge Style": "Tekstkant", + "None": "Ingen", + "Raised": "Uthevet", + "Depressed": "Nedtrykt", + "Uniform": "Enkel", + "Dropshadow": "Skygge", + "Font Family": "Skrifttype", + "Proportional Sans-Serif": "Proporsjonal skrift uten seriffer", + "Monospace Sans-Serif": "Fastbreddeskrift uten seriffer", + "Proportional Serif": "Proporsjonal skrift med seriffer", + "Monospace Serif": "Fastbreddeskrift med seriffer", + "Casual": "Uformell", + "Script": "Skråskrift", + "Small Caps": "Kapitéler", + "Reset": "Tilbakestill", + "restore all settings to the default values": "tilbakestill alle innstillinger til standardverdiene", + "Done": "Ferdig", + "Caption Settings Dialog": "Innstillingsvindu for teksting for hørselshemmede", + "Beginning of dialog window. Escape will cancel and close the window.": "Begynnelse på dialogvindu. Trykk Escape for å avbryte og lukke vinduet.", + "End of dialog window.": "Avslutning på dialogvindu.", + "{1} is loading.": "{1} laster." +} diff --git a/js/libs/videojs/lang/nl.js b/js/libs/videojs/lang/nl.js index 4277d497..0d043e92 100644 --- a/js/libs/videojs/lang/nl.js +++ b/js/libs/videojs/lang/nl.js @@ -1,84 +1,84 @@ -videojs.addLanguage("nl",{ - "Audio Player": "Audiospeler", - "Video Player": "Videospeler", - "Play": "Afspelen", - "Pause": "Pauzeren", - "Replay": "Opnieuw afspelen", - "Current Time": "Huidige tijd", - "Duration Time": "Tijdsduur", - "Remaining Time": "Resterende tijd", - "Stream Type": "Streamtype", - "LIVE": "LIVE", - "Loaded": "Geladen", - "Progress": "Voortgang", - "Progress Bar": "Voortgangsbalk", - "progress bar timing: currentTime={1} duration={2}": "{1} van {2}", - "Fullscreen": "Volledig scherm", - "Non-Fullscreen": "Geen volledig scherm", - "Mute": "Dempen", - "Unmute": "Niet dempen", - "Playback Rate": "Afspeelsnelheid", - "Subtitles": "Ondertiteling", - "subtitles off": "ondertiteling uit", - "Captions": "Bijschriften", - "captions off": "bijschriften uit", - "Chapters": "Hoofdstukken", - "Descriptions": "Beschrijvingen", - "descriptions off": "beschrijvingen uit", - "Audio Track": "Audiospoor", - "Volume Level": "Geluidsniveau", - "You aborted the media playback": "U heeft het afspelen van de media afgebroken", - "A network error caused the media download to fail part-way.": "Een netwerkfout heeft ervoor gezorgd dat het downloaden van de media halverwege is mislukt.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "De media kon niet worden geladen, dit komt doordat of de server of het netwerk mislukt of doordat het formaat niet wordt ondersteund.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Het afspelen van de media is afgebroken door een probleem met beschadeigde gegevens of doordat de media functies gebruikt die uw browser niet ondersteund.", - "No compatible source was found for this media.": "Er is geen geschikte bron voor deze media gevonden.", - "The media is encrypted and we do not have the keys to decrypt it.": "De media is versleuteld en we hebben de sleutels niet om deze te ontsleutelen.", - "Play Video": "Video afspelen", - "Close": "Sluiten", - "Close Modal Dialog": "Extra venster sluiten", - "Modal Window": "Extra venster", - "This is a modal window": "Dit is een extra venster", - "This modal can be closed by pressing the Escape key or activating the close button.": "Dit venster kan worden gesloten door op de Escape-toets te drukken of door de sluiten-knop te activeren.", - ", opens captions settings dialog": ", opent instellingen-venster voor bijschriften", - ", opens subtitles settings dialog": ", opent instellingen-venster voor ondertitelingen", - ", opens descriptions settings dialog": ", opent instellingen-venster voor beschrijvingen", - ", selected": ", geselecteerd", - "captions settings": "bijschriften-instellingen", - "subtitles settings": "ondertiteling-instellingen", - "descriptions settings": "beschrijvingen-instellingen", - "Text": "Tekst", - "White": "Wit", - "Black": "Zwart", - "Red": "Rood", - "Green": "Groen", - "Blue": "Blauw", - "Yellow": "Geel", - "Magenta": "Magenta", - "Cyan": "Cyaan", - "Background": "Achtergrond", - "Window": "Venster", - "Transparent": "Transparant", - "Semi-Transparent": "Semi-transparant", - "Opaque": "Ondoorzichtig", - "Font Size": "Lettergrootte", - "Text Edge Style": "Stijl tekstrand", - "None": "Geen", - "Raised": "Verhoogd", - "Depressed": "Ingedrukt", - "Uniform": "Uniform", - "Dropshadow": "Schaduw", - "Font Family": "Lettertype", - "Proportional Sans-Serif": "Proportioneel sans-serif", - "Monospace Sans-Serif": "Monospace sans-serif", - "Proportional Serif": "Proportioneel serif", - "Monospace Serif": "Monospace serif", - "Casual": "Luchtig", - "Script": "Script", - "Small Caps": "Kleine hoofdletters", - "Reset": "Herstellen", - "restore all settings to the default values": "alle instellingen naar de standaardwaarden herstellen", - "Done": "Klaar", - "Caption Settings Dialog": "Venster voor bijschriften-instellingen", - "Beginning of dialog window. Escape will cancel and close the window.": "Begin van dialoogvenster. Escape zal annuleren en het venster sluiten.", - "End of dialog window.": "Einde van dialoogvenster." +videojs.addLanguage('nl', { + "Audio Player": "Audiospeler", + "Video Player": "Videospeler", + "Play": "Afspelen", + "Pause": "Pauzeren", + "Replay": "Opnieuw afspelen", + "Current Time": "Huidige tijd", + "Duration": "Tijdsduur", + "Remaining Time": "Resterende tijd", + "Stream Type": "Streamtype", + "LIVE": "LIVE", + "Loaded": "Geladen", + "Progress": "Voortgang", + "Progress Bar": "Voortgangsbalk", + "progress bar timing: currentTime={1} duration={2}": "{1} van {2}", + "Fullscreen": "Volledig scherm", + "Non-Fullscreen": "Geen volledig scherm", + "Mute": "Dempen", + "Unmute": "Niet dempen", + "Playback Rate": "Afspeelsnelheid", + "Subtitles": "Ondertiteling", + "subtitles off": "ondertiteling uit", + "Captions": "Bijschriften", + "captions off": "bijschriften uit", + "Chapters": "Hoofdstukken", + "Descriptions": "Beschrijvingen", + "descriptions off": "beschrijvingen uit", + "Audio Track": "Audiospoor", + "Volume Level": "Geluidsniveau", + "You aborted the media playback": "U heeft het afspelen van de media afgebroken", + "A network error caused the media download to fail part-way.": "Een netwerkfout heeft ervoor gezorgd dat het downloaden van de media halverwege is mislukt.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "De media kon niet worden geladen, dit komt doordat of de server of het netwerk mislukt of doordat het formaat niet wordt ondersteund.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Het afspelen van de media is afgebroken door een probleem met beschadeigde gegevens of doordat de media functies gebruikt die uw browser niet ondersteund.", + "No compatible source was found for this media.": "Er is geen geschikte bron voor deze media gevonden.", + "The media is encrypted and we do not have the keys to decrypt it.": "De media is versleuteld en we hebben de sleutels niet om deze te ontsleutelen.", + "Play Video": "Video afspelen", + "Close": "Sluiten", + "Close Modal Dialog": "Extra venster sluiten", + "Modal Window": "Extra venster", + "This is a modal window": "Dit is een extra venster", + "This modal can be closed by pressing the Escape key or activating the close button.": "Dit venster kan worden gesloten door op de Escape-toets te drukken of door de sluiten-knop te activeren.", + ", opens captions settings dialog": ", opent instellingen-venster voor bijschriften", + ", opens subtitles settings dialog": ", opent instellingen-venster voor ondertitelingen", + ", opens descriptions settings dialog": ", opent instellingen-venster voor beschrijvingen", + ", selected": ", geselecteerd", + "captions settings": "bijschriften-instellingen", + "subtitles settings": "ondertiteling-instellingen", + "descriptions settings": "beschrijvingen-instellingen", + "Text": "Tekst", + "White": "Wit", + "Black": "Zwart", + "Red": "Rood", + "Green": "Groen", + "Blue": "Blauw", + "Yellow": "Geel", + "Magenta": "Magenta", + "Cyan": "Cyaan", + "Background": "Achtergrond", + "Window": "Venster", + "Transparent": "Transparant", + "Semi-Transparent": "Semi-transparant", + "Opaque": "Ondoorzichtig", + "Font Size": "Lettergrootte", + "Text Edge Style": "Stijl tekstrand", + "None": "Geen", + "Raised": "Verhoogd", + "Depressed": "Ingedrukt", + "Uniform": "Uniform", + "Dropshadow": "Schaduw", + "Font Family": "Lettertype", + "Proportional Sans-Serif": "Proportioneel sans-serif", + "Monospace Sans-Serif": "Monospace sans-serif", + "Proportional Serif": "Proportioneel serif", + "Monospace Serif": "Monospace serif", + "Casual": "Luchtig", + "Script": "Script", + "Small Caps": "Kleine hoofdletters", + "Reset": "Herstellen", + "restore all settings to the default values": "alle instellingen naar de standaardwaarden herstellen", + "Done": "Klaar", + "Caption Settings Dialog": "Venster voor bijschriften-instellingen", + "Beginning of dialog window. Escape will cancel and close the window.": "Begin van dialoogvenster. Escape zal annuleren en het venster sluiten.", + "End of dialog window.": "Einde van dialoogvenster." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/nl.json b/js/libs/videojs/lang/nl.json new file mode 100644 index 00000000..c7d0b731 --- /dev/null +++ b/js/libs/videojs/lang/nl.json @@ -0,0 +1,84 @@ +{ + "Audio Player": "Audiospeler", + "Video Player": "Videospeler", + "Play": "Afspelen", + "Pause": "Pauzeren", + "Replay": "Opnieuw afspelen", + "Current Time": "Huidige tijd", + "Duration": "Tijdsduur", + "Remaining Time": "Resterende tijd", + "Stream Type": "Streamtype", + "LIVE": "LIVE", + "Loaded": "Geladen", + "Progress": "Voortgang", + "Progress Bar": "Voortgangsbalk", + "progress bar timing: currentTime={1} duration={2}": "{1} van {2}", + "Fullscreen": "Volledig scherm", + "Non-Fullscreen": "Geen volledig scherm", + "Mute": "Dempen", + "Unmute": "Niet dempen", + "Playback Rate": "Afspeelsnelheid", + "Subtitles": "Ondertiteling", + "subtitles off": "ondertiteling uit", + "Captions": "Bijschriften", + "captions off": "bijschriften uit", + "Chapters": "Hoofdstukken", + "Descriptions": "Beschrijvingen", + "descriptions off": "beschrijvingen uit", + "Audio Track": "Audiospoor", + "Volume Level": "Geluidsniveau", + "You aborted the media playback": "U heeft het afspelen van de media afgebroken", + "A network error caused the media download to fail part-way.": "Een netwerkfout heeft ervoor gezorgd dat het downloaden van de media halverwege is mislukt.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "De media kon niet worden geladen, dit komt doordat of de server of het netwerk mislukt of doordat het formaat niet wordt ondersteund.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Het afspelen van de media is afgebroken door een probleem met beschadeigde gegevens of doordat de media functies gebruikt die uw browser niet ondersteund.", + "No compatible source was found for this media.": "Er is geen geschikte bron voor deze media gevonden.", + "The media is encrypted and we do not have the keys to decrypt it.": "De media is versleuteld en we hebben de sleutels niet om deze te ontsleutelen.", + "Play Video": "Video afspelen", + "Close": "Sluiten", + "Close Modal Dialog": "Extra venster sluiten", + "Modal Window": "Extra venster", + "This is a modal window": "Dit is een extra venster", + "This modal can be closed by pressing the Escape key or activating the close button.": "Dit venster kan worden gesloten door op de Escape-toets te drukken of door de sluiten-knop te activeren.", + ", opens captions settings dialog": ", opent instellingen-venster voor bijschriften", + ", opens subtitles settings dialog": ", opent instellingen-venster voor ondertitelingen", + ", opens descriptions settings dialog": ", opent instellingen-venster voor beschrijvingen", + ", selected": ", geselecteerd", + "captions settings": "bijschriften-instellingen", + "subtitles settings": "ondertiteling-instellingen", + "descriptions settings": "beschrijvingen-instellingen", + "Text": "Tekst", + "White": "Wit", + "Black": "Zwart", + "Red": "Rood", + "Green": "Groen", + "Blue": "Blauw", + "Yellow": "Geel", + "Magenta": "Magenta", + "Cyan": "Cyaan", + "Background": "Achtergrond", + "Window": "Venster", + "Transparent": "Transparant", + "Semi-Transparent": "Semi-transparant", + "Opaque": "Ondoorzichtig", + "Font Size": "Lettergrootte", + "Text Edge Style": "Stijl tekstrand", + "None": "Geen", + "Raised": "Verhoogd", + "Depressed": "Ingedrukt", + "Uniform": "Uniform", + "Dropshadow": "Schaduw", + "Font Family": "Lettertype", + "Proportional Sans-Serif": "Proportioneel sans-serif", + "Monospace Sans-Serif": "Monospace sans-serif", + "Proportional Serif": "Proportioneel serif", + "Monospace Serif": "Monospace serif", + "Casual": "Luchtig", + "Script": "Script", + "Small Caps": "Kleine hoofdletters", + "Reset": "Herstellen", + "restore all settings to the default values": "alle instellingen naar de standaardwaarden herstellen", + "Done": "Klaar", + "Caption Settings Dialog": "Venster voor bijschriften-instellingen", + "Beginning of dialog window. Escape will cancel and close the window.": "Begin van dialoogvenster. Escape zal annuleren en het venster sluiten.", + "End of dialog window.": "Einde van dialoogvenster." +} \ No newline at end of file diff --git a/js/libs/videojs/lang/nn.js b/js/libs/videojs/lang/nn.js index 19f625e4..5823ca16 100644 --- a/js/libs/videojs/lang/nn.js +++ b/js/libs/videojs/lang/nn.js @@ -1,26 +1,87 @@ -videojs.addLanguage("nn",{ - "Play": "Spel", - "Pause": "Pause", - "Current Time": "Aktuell tid", - "Duration Time": "Varigheit", - "Remaining Time": "Tid attende", - "Stream Type": "Type straum", - "LIVE": "DIREKTE", - "Loaded": "Lasta inn", - "Progress": "Status", - "Fullscreen": "Fullskjerm", - "Non-Fullscreen": "Stenga fullskjerm", - "Mute": "Ljod av", - "Unmute": "Ljod på", - "Playback Rate": "Avspelingsrate", - "Subtitles": "Teksting på", - "subtitles off": "Teksting av", - "Captions": "Teksting for høyrselshemma på", - "captions off": "Teksting for høyrselshemma av", - "Chapters": "Kapitel", - "You aborted the media playback": "Du avbraut avspelinga.", - "A network error caused the media download to fail part-way.": "Ein nettverksfeil avbraut nedlasting av videoen.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikkje lastas ned, på grunn av ein nettverksfeil eller serverfeil, eller av di formatet ikkje er stoda.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoavspelinga blei broten på grunn av øydelagde data eller av di videoen ville gjera noe som nettlesaren din ikkje stodar.", - "No compatible source was found for this media.": "Fant ikke en kompatibel kilde for dette mediainnholdet." +videojs.addLanguage('nn', { + "Audio Player": "Lydspelar", + "Video Player": "Videospelar", + "Play": "Spel", + "Pause": "Pause", + "Replay": "Spel om att", + "Current Time": "Aktuell tid", + "Duration": "Varigheit", + "Remaining Time": "Tid attende", + "Stream Type": "Type straum", + "LIVE": "DIREKTE", + "Seek to live, currently behind live": "Hopp til live, spelar tidlegare i sendinga no", + "Seek to live, currently playing live": "Hopp til live, speler live no", + "Loaded": "Lasta inn", + "Progress": "Framdrift", + "Progress Bar": "Framdriftsvisar", + "progress bar timing: currentTime={1} duration={2}": "{1} av {2}", + "Fullscreen": "Fullskjerm", + "Non-Fullscreen": "Stenga fullskjerm", + "Mute": "Lyd av", + "Unmute": "Lyd på", + "Playback Rate": "Avspelingshastigheit", + "Subtitles": "Teksting på", + "subtitles off": "Teksting av", + "Captions": "Teksting for høyrselshemma på", + "captions off": "Teksting for høyrselshemma av", + "Chapters": "Kapitel", + "Descriptions": "Beskrivingar", + "descriptions off": "beskrivingar av", + "Audio Track": "Lydspor", + "Volume Level": "Volumnivå", + "You aborted the media playback": "Du avbraut avspelinga.", + "A network error caused the media download to fail part-way.": "Ein nettverksfeil avbraut nedlasting av videoen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikkje lastas ned, på grunn av ein nettverksfeil eller serverfeil, eller av di formatet ikkje er stoda.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoavspelinga blei broten på grunn av øydelagde data eller av di videoen ville gjera noe som nettlesaren din ikkje stodar.", + "No compatible source was found for this media.": "Fant ikke en kompatibel kilde for dette mediainnholdet.", + "The media is encrypted and we do not have the keys to decrypt it.": "Mediefila er kryptert og vi manglar nyklar for å dekryptere ho.", + "Play Video": "Spel av video", + "Close": "Lukk", + "Close Modal Dialog": "Lukk dialogvindauge", + "Modal Window": "Dialogvindauge", + "This is a modal window": "Dette er eit dialogvindauge", + "This modal can be closed by pressing the Escape key or activating the close button.": "Vindauget kan lukkast ved å trykke på Escape-tasten eller lukkeknappen.", + ", opens captions settings dialog": ", opnar innstillingar for teksting for høyrselshemma", + ", opens subtitles settings dialog": ", opnar innstillingar for teksting", + ", opens descriptions settings dialog": ", opnar innstillingar for beskrivingar", + ", selected": ", vald", + "captions settings": "innstillingar for teksting", + "subtitles settings": "innstillingar for teksting", + "descriptions settings": "innstillingar for skildringar", + "Text": "Tekst", + "White": "Kvit", + "Black": "Svart", + "Red": "Raud", + "Green": "Grøn", + "Blue": "Blå", + "Yellow": "Gul", + "Magenta": "Magenta", + "Cyan": "Turkis", + "Background": "Bakgrunn", + "Window": "Vindauge", + "Transparent": "Gjennomsiktig", + "Semi-Transparent": "Delvis gjennomsiktig", + "Opaque": "Ugjennomsiktig", + "Font Size": "Tekststorleik", + "Text Edge Style": "Tekstkant", + "None": "Ingen", + "Raised": "Utheva", + "Depressed": "Nedtrykt", + "Uniform": "Enkel", + "Dropshadow": "Skugge", + "Font Family": "Skrifttype", + "Proportional Sans-Serif": "Proporsjonal skrift utan seriffar", + "Monospace Sans-Serif": "Fastbreddeskrift utan seriffar", + "Proportional Serif": "Proporsjonal skrift med seriffar", + "Monospace Serif": "Fastbreddeskrift med seriffar", + "Casual": "Uformell", + "Script": "Skråskrift", + "Small Caps": "Kapitéler", + "Reset": "Tilbakestell", + "restore all settings to the default values": "tilbakestell alle innstillingar til standardverdiane", + "Done": "Ferdig", + "Caption Settings Dialog": "Innstillingsvindauge for teksting for høyrselshemma", + "Beginning of dialog window. Escape will cancel and close the window.": "Byrjing på dialogvindauge. Trykk Escape for å avbryte og lukke vindauget.", + "End of dialog window.": "Avslutning på dialogvindauge.", + "{1} is loading.": "{1} lastar." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/nn.json b/js/libs/videojs/lang/nn.json new file mode 100644 index 00000000..f02c064b --- /dev/null +++ b/js/libs/videojs/lang/nn.json @@ -0,0 +1,87 @@ +{ + "Audio Player": "Lydspelar", + "Video Player": "Videospelar", + "Play": "Spel", + "Pause": "Pause", + "Replay": "Spel om att", + "Current Time": "Aktuell tid", + "Duration": "Varigheit", + "Remaining Time": "Tid attende", + "Stream Type": "Type straum", + "LIVE": "DIREKTE", + "Seek to live, currently behind live": "Hopp til live, spelar tidlegare i sendinga no", + "Seek to live, currently playing live": "Hopp til live, speler live no", + "Loaded": "Lasta inn", + "Progress": "Framdrift", + "Progress Bar": "Framdriftsvisar", + "progress bar timing: currentTime={1} duration={2}": "{1} av {2}", + "Fullscreen": "Fullskjerm", + "Non-Fullscreen": "Stenga fullskjerm", + "Mute": "Lyd av", + "Unmute": "Lyd på", + "Playback Rate": "Avspelingshastigheit", + "Subtitles": "Teksting på", + "subtitles off": "Teksting av", + "Captions": "Teksting for høyrselshemma på", + "captions off": "Teksting for høyrselshemma av", + "Chapters": "Kapitel", + "Descriptions": "Beskrivingar", + "descriptions off": "beskrivingar av", + "Audio Track": "Lydspor", + "Volume Level": "Volumnivå", + "You aborted the media playback": "Du avbraut avspelinga.", + "A network error caused the media download to fail part-way.": "Ein nettverksfeil avbraut nedlasting av videoen.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Videoen kunne ikkje lastas ned, på grunn av ein nettverksfeil eller serverfeil, eller av di formatet ikkje er stoda.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Videoavspelinga blei broten på grunn av øydelagde data eller av di videoen ville gjera noe som nettlesaren din ikkje stodar.", + "No compatible source was found for this media.": "Fant ikke en kompatibel kilde for dette mediainnholdet.", + "The media is encrypted and we do not have the keys to decrypt it.": "Mediefila er kryptert og vi manglar nyklar for å dekryptere ho.", + "Play Video": "Spel av video", + "Close": "Lukk", + "Close Modal Dialog": "Lukk dialogvindauge", + "Modal Window": "Dialogvindauge", + "This is a modal window": "Dette er eit dialogvindauge", + "This modal can be closed by pressing the Escape key or activating the close button.": "Vindauget kan lukkast ved å trykke på Escape-tasten eller lukkeknappen.", + ", opens captions settings dialog": ", opnar innstillingar for teksting for høyrselshemma", + ", opens subtitles settings dialog": ", opnar innstillingar for teksting", + ", opens descriptions settings dialog": ", opnar innstillingar for beskrivingar", + ", selected": ", vald", + "captions settings": "innstillingar for teksting", + "subtitles settings": "innstillingar for teksting", + "descriptions settings": "innstillingar for skildringar", + "Text": "Tekst", + "White": "Kvit", + "Black": "Svart", + "Red": "Raud", + "Green": "Grøn", + "Blue": "Blå", + "Yellow": "Gul", + "Magenta": "Magenta", + "Cyan": "Turkis", + "Background": "Bakgrunn", + "Window": "Vindauge", + "Transparent": "Gjennomsiktig", + "Semi-Transparent": "Delvis gjennomsiktig", + "Opaque": "Ugjennomsiktig", + "Font Size": "Tekststorleik", + "Text Edge Style": "Tekstkant", + "None": "Ingen", + "Raised": "Utheva", + "Depressed": "Nedtrykt", + "Uniform": "Enkel", + "Dropshadow": "Skugge", + "Font Family": "Skrifttype", + "Proportional Sans-Serif": "Proporsjonal skrift utan seriffar", + "Monospace Sans-Serif": "Fastbreddeskrift utan seriffar", + "Proportional Serif": "Proporsjonal skrift med seriffar", + "Monospace Serif": "Fastbreddeskrift med seriffar", + "Casual": "Uformell", + "Script": "Skråskrift", + "Small Caps": "Kapitéler", + "Reset": "Tilbakestell", + "restore all settings to the default values": "tilbakestell alle innstillingar til standardverdiane", + "Done": "Ferdig", + "Caption Settings Dialog": "Innstillingsvindauge for teksting for høyrselshemma", + "Beginning of dialog window. Escape will cancel and close the window.": "Byrjing på dialogvindauge. Trykk Escape for å avbryte og lukke vindauget.", + "End of dialog window.": "Avslutning på dialogvindauge.", + "{1} is loading.": "{1} lastar." +} diff --git a/js/libs/videojs/lang/oc.js b/js/libs/videojs/lang/oc.js new file mode 100644 index 00000000..d86b8a73 --- /dev/null +++ b/js/libs/videojs/lang/oc.js @@ -0,0 +1,87 @@ +videojs.addLanguage('oc', { + "Audio Player": "Lector àudio", + "Video Player": "Lector vidèo", + "Play": "Lectura", + "Pause": "Pausa", + "Replay": "Tornar legir", + "Current Time": "Durada passada", + "Duration": "Durada", + "Remaining Time": "Temps restant", + "Stream Type": "Tipe de difusion", + "LIVE": "DIRÈCTE", + "Seek to live, currently behind live": "Trapar lo dirècte, actualament darrièr lo dirècte", + "Seek to live, currently playing live": "Trapar lo dirècte, actualament lo dirècte es en lectura", + "Loaded": "Cargat", + "Progress": "Progression", + "Progress Bar": "Barra de progression", + "progress bar timing: currentTime={1} duration={2}": "{1} sus {2}", + "Fullscreen": "Ecran complèt", + "Non-Fullscreen": "Pas en ecran complèt", + "Mute": "Copar lo son", + "Unmute": "Restablir lo son", + "Playback Rate": "Velocitat de lectura", + "Subtitles": "Sostítols", + "subtitles off": "Sostítols desactivats", + "Captions": "Legendas", + "captions off": "Legendas desactivadas", + "Chapters": "Capítols", + "Descriptions": "Descripcions", + "descriptions off": "descripcions desactivadas", + "Audio Track": "Pista àudio", + "Volume Level": "Nivèl del volum", + "You aborted the media playback": "Avètz copat la lectura del mèdia.", + "A network error caused the media download to fail part-way.": "Una error de ret a provocat un fracàs del telecargament.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Lo mèdia a pas pogut èsser cargat, siá perque lo servidor o lo ret a fracassat siá perque lo format es pas compatible.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La lectura del mèdia es copada a causa d’un problèma de corrupcion o perque lo mèdia utiliza de foncionalitats pas suportadas pel navigador.", + "No compatible source was found for this media.": "Cap de font compatiblas pas trobada per aqueste mèdia.", + "The media is encrypted and we do not have the keys to decrypt it.": "Lo mèdia es chifrat e avèm pas las claus per lo deschifrar.", + "Play Video": "Legir la vidèo", + "Close": "Tampar", + "Close Modal Dialog": "Tampar la fenèstra", + "Modal Window": "Fenèstra", + "This is a modal window": "Aquò es una fenèstra", + "This modal can be closed by pressing the Escape key or activating the close button.": "Aquesta fenèstra pòt èsser tampada en quichar Escapar sul clavièr o en activar lo boton de tampadura.", + ", opens captions settings dialog": ", dobrís la fenèstra de paramètres de legendas", + ", opens subtitles settings dialog": ", dobrís la fenèstra de paramètres de sostítols", + ", opens descriptions settings dialog": ", dobrís la fenèstra de paramètres de descripcions", + ", selected": ", seleccionat", + "captions settings": "paramètres de legendas", + "subtitles settings": "paramètres de sostítols", + "descriptions settings": "paramètres de descripcions", + "Text": "Tèxte", + "White": "Blanc", + "Black": "Negre", + "Red": "Roge", + "Green": "Verd", + "Blue": "Blau", + "Yellow": "Jaune", + "Magenta": "Magenta", + "Cyan": "Cian", + "Background": "Rèireplan", + "Window": "Fenèstra", + "Transparent": "Transparent", + "Semi-Transparent": "Semitransparent", + "Opaque": "Opac", + "Font Size": "Talha de la polissa", + "Text Edge Style": "Estil dels contorns del tèxte", + "None": "Cap", + "Raised": "Naut", + "Depressed": "Enfonsat", + "Uniform": "Unifòrme", + "Dropshadow": "Ombrat", + "Font Family": "Familha de polissa", + "Proportional Sans-Serif": "Sans-Serif proporcionala", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Serif proporcionala", + "Monospace Serif": "Serif proporcionala", + "Casual": "Manuscrita", + "Script": "Script", + "Small Caps": "Pichonas majusculas", + "Reset": "Reïnicializar", + "restore all settings to the default values": "O restablir tot a las valors per defaut", + "Done": "Acabat", + "Caption Settings Dialog": "Fenèstra de paramètres de legenda", + "Beginning of dialog window. Escape will cancel and close the window.": "Debuta de la fenèstra. Escapar anullarà e tamparà la fenèstra", + "End of dialog window.": "Fin de la fenèstra.", + "{1} is loading.": "{1} es a cargar." +}); \ No newline at end of file diff --git a/js/libs/videojs/lang/oc.json b/js/libs/videojs/lang/oc.json new file mode 100644 index 00000000..db9e8d76 --- /dev/null +++ b/js/libs/videojs/lang/oc.json @@ -0,0 +1,87 @@ +{ + "Audio Player": "Lector àudio", + "Video Player": "Lector vidèo", + "Play": "Lectura", + "Pause": "Pausa", + "Replay": "Tornar legir", + "Current Time": "Durada passada", + "Duration": "Durada", + "Remaining Time": "Temps restant", + "Stream Type": "Tipe de difusion", + "LIVE": "DIRÈCTE", + "Seek to live, currently behind live": "Trapar lo dirècte, actualament darrièr lo dirècte", + "Seek to live, currently playing live": "Trapar lo dirècte, actualament lo dirècte es en lectura", + "Loaded": "Cargat", + "Progress": "Progression", + "Progress Bar": "Barra de progression", + "progress bar timing: currentTime={1} duration={2}": "{1} sus {2}", + "Fullscreen": "Ecran complèt", + "Non-Fullscreen": "Pas en ecran complèt", + "Mute": "Copar lo son", + "Unmute": "Restablir lo son", + "Playback Rate": "Velocitat de lectura", + "Subtitles": "Sostítols", + "subtitles off": "Sostítols desactivats", + "Captions": "Legendas", + "captions off": "Legendas desactivadas", + "Chapters": "Capítols", + "Descriptions": "Descripcions", + "descriptions off": "descripcions desactivadas", + "Audio Track": "Pista àudio", + "Volume Level": "Nivèl del volum", + "You aborted the media playback": "Avètz copat la lectura del mèdia.", + "A network error caused the media download to fail part-way.": "Una error de ret a provocat un fracàs del telecargament.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Lo mèdia a pas pogut èsser cargat, siá perque lo servidor o lo ret a fracassat siá perque lo format es pas compatible.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La lectura del mèdia es copada a causa d’un problèma de corrupcion o perque lo mèdia utiliza de foncionalitats pas suportadas pel navigador.", + "No compatible source was found for this media.": "Cap de font compatiblas pas trobada per aqueste mèdia.", + "The media is encrypted and we do not have the keys to decrypt it.": "Lo mèdia es chifrat e avèm pas las claus per lo deschifrar.", + "Play Video": "Legir la vidèo", + "Close": "Tampar", + "Close Modal Dialog": "Tampar la fenèstra", + "Modal Window": "Fenèstra", + "This is a modal window": "Aquò es una fenèstra", + "This modal can be closed by pressing the Escape key or activating the close button.": "Aquesta fenèstra pòt èsser tampada en quichar Escapar sul clavièr o en activar lo boton de tampadura.", + ", opens captions settings dialog": ", dobrís la fenèstra de paramètres de legendas", + ", opens subtitles settings dialog": ", dobrís la fenèstra de paramètres de sostítols", + ", opens descriptions settings dialog": ", dobrís la fenèstra de paramètres de descripcions", + ", selected": ", seleccionat", + "captions settings": "paramètres de legendas", + "subtitles settings": "paramètres de sostítols", + "descriptions settings": "paramètres de descripcions", + "Text": "Tèxte", + "White": "Blanc", + "Black": "Negre", + "Red": "Roge", + "Green": "Verd", + "Blue": "Blau", + "Yellow": "Jaune", + "Magenta": "Magenta", + "Cyan": "Cian", + "Background": "Rèireplan", + "Window": "Fenèstra", + "Transparent": "Transparent", + "Semi-Transparent": "Semitransparent", + "Opaque": "Opac", + "Font Size": "Talha de la polissa", + "Text Edge Style": "Estil dels contorns del tèxte", + "None": "Cap", + "Raised": "Naut", + "Depressed": "Enfonsat", + "Uniform": "Unifòrme", + "Dropshadow": "Ombrat", + "Font Family": "Familha de polissa", + "Proportional Sans-Serif": "Sans-Serif proporcionala", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Serif proporcionala", + "Monospace Serif": "Serif proporcionala", + "Casual": "Manuscrita", + "Script": "Script", + "Small Caps": "Pichonas majusculas", + "Reset": "Reïnicializar", + "restore all settings to the default values": "O restablir tot a las valors per defaut", + "Done": "Acabat", + "Caption Settings Dialog": "Fenèstra de paramètres de legenda", + "Beginning of dialog window. Escape will cancel and close the window.": "Debuta de la fenèstra. Escapar anullarà e tamparà la fenèstra", + "End of dialog window.": "Fin de la fenèstra.", + "{1} is loading.": "{1} es a cargar." +} diff --git a/js/libs/videojs/lang/pl.js b/js/libs/videojs/lang/pl.js index 220b0882..789f3ab5 100644 --- a/js/libs/videojs/lang/pl.js +++ b/js/libs/videojs/lang/pl.js @@ -1,34 +1,34 @@ -videojs.addLanguage("pl",{ - "Play": "Odtwarzaj", - "Pause": "Pauza", - "Current Time": "Aktualny czas", - "Duration Time": "Czas trwania", - "Remaining Time": "Pozostały czas", - "Stream Type": "Typ strumienia", - "LIVE": "NA ŻYWO", - "Loaded": "Załadowany", - "Progress": "Status", - "Fullscreen": "Pełny ekran", - "Non-Fullscreen": "Pełny ekran niedostępny", - "Mute": "Wyłącz dźwięk", - "Unmute": "Włącz dźwięk", - "Playback Rate": "Szybkość odtwarzania", - "Subtitles": "Napisy", - "subtitles off": "Napisy wyłączone", - "Captions": "Transkrypcja", - "captions off": "Transkrypcja wyłączona", - "Chapters": "Rozdziały", - "You aborted the media playback": "Odtwarzanie zostało przerwane", - "A network error caused the media download to fail part-way.": "Problemy z siecią spowodowały błąd przy pobieraniu materiału wideo.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Materiał wideo nie może być załadowany, ponieważ wystąpił problem z siecią lub format nie jest obsługiwany", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Odtwarzanie materiału wideo zostało przerwane z powodu uszkodzonego pliku wideo lub z powodu błędu funkcji, które nie są wspierane przez przeglądarkę.", - "No compatible source was found for this media.": "Dla tego materiału wideo nie znaleziono kompatybilnego źródła.", - "Play Video": "Odtwarzaj wideo", - "Close": "Zamknij", - "Modal Window": "Okno Modala", - "This is a modal window": "To jest okno modala", - "This modal can be closed by pressing the Escape key or activating the close button.": "Ten modal możesz zamknąć naciskając przycisk Escape albo wybierając przycisk Zamknij.", - ", opens captions settings dialog": ", otwiera okno dialogowe ustawień transkrypcji", - ", opens subtitles settings dialog": ", otwiera okno dialogowe napisów", - ", selected": ", zaznaczone" +videojs.addLanguage('pl', { + "Play": "Odtwarzaj", + "Pause": "Pauza", + "Current Time": "Aktualny czas", + "Duration": "Czas trwania", + "Remaining Time": "Pozostały czas", + "Stream Type": "Typ strumienia", + "LIVE": "NA ŻYWO", + "Loaded": "Załadowany", + "Progress": "Status", + "Fullscreen": "Pełny ekran", + "Non-Fullscreen": "Pełny ekran niedostępny", + "Mute": "Wyłącz dźwięk", + "Unmute": "Włącz dźwięk", + "Playback Rate": "Szybkość odtwarzania", + "Subtitles": "Napisy", + "subtitles off": "Napisy wyłączone", + "Captions": "Transkrypcja", + "captions off": "Transkrypcja wyłączona", + "Chapters": "Rozdziały", + "You aborted the media playback": "Odtwarzanie zostało przerwane", + "A network error caused the media download to fail part-way.": "Problemy z siecią spowodowały błąd przy pobieraniu materiału wideo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Materiał wideo nie może być załadowany, ponieważ wystąpił problem z siecią lub format nie jest obsługiwany", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Odtwarzanie materiału wideo zostało przerwane z powodu uszkodzonego pliku wideo lub z powodu błędu funkcji, które nie są wspierane przez przeglądarkę.", + "No compatible source was found for this media.": "Dla tego materiału wideo nie znaleziono kompatybilnego źródła.", + "Play Video": "Odtwarzaj wideo", + "Close": "Zamknij", + "Modal Window": "Okno Modala", + "This is a modal window": "To jest okno modala", + "This modal can be closed by pressing the Escape key or activating the close button.": "Ten modal możesz zamknąć naciskając przycisk Escape albo wybierając przycisk Zamknij.", + ", opens captions settings dialog": ", otwiera okno dialogowe ustawień transkrypcji", + ", opens subtitles settings dialog": ", otwiera okno dialogowe napisów", + ", selected": ", zaznaczone" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/pl.json b/js/libs/videojs/lang/pl.json new file mode 100644 index 00000000..e22c36c0 --- /dev/null +++ b/js/libs/videojs/lang/pl.json @@ -0,0 +1,34 @@ +{ + "Play": "Odtwarzaj", + "Pause": "Pauza", + "Current Time": "Aktualny czas", + "Duration": "Czas trwania", + "Remaining Time": "Pozostały czas", + "Stream Type": "Typ strumienia", + "LIVE": "NA ŻYWO", + "Loaded": "Załadowany", + "Progress": "Status", + "Fullscreen": "Pełny ekran", + "Non-Fullscreen": "Pełny ekran niedostępny", + "Mute": "Wyłącz dźwięk", + "Unmute": "Włącz dźwięk", + "Playback Rate": "Szybkość odtwarzania", + "Subtitles": "Napisy", + "subtitles off": "Napisy wyłączone", + "Captions": "Transkrypcja", + "captions off": "Transkrypcja wyłączona", + "Chapters": "Rozdziały", + "You aborted the media playback": "Odtwarzanie zostało przerwane", + "A network error caused the media download to fail part-way.": "Problemy z siecią spowodowały błąd przy pobieraniu materiału wideo.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Materiał wideo nie może być załadowany, ponieważ wystąpił problem z siecią lub format nie jest obsługiwany", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Odtwarzanie materiału wideo zostało przerwane z powodu uszkodzonego pliku wideo lub z powodu błędu funkcji, które nie są wspierane przez przeglądarkę.", + "No compatible source was found for this media.": "Dla tego materiału wideo nie znaleziono kompatybilnego źródła.", + "Play Video": "Odtwarzaj wideo", + "Close": "Zamknij", + "Modal Window": "Okno Modala", + "This is a modal window": "To jest okno modala", + "This modal can be closed by pressing the Escape key or activating the close button.": "Ten modal możesz zamknąć naciskając przycisk Escape albo wybierając przycisk Zamknij.", + ", opens captions settings dialog": ", otwiera okno dialogowe ustawień transkrypcji", + ", opens subtitles settings dialog": ", otwiera okno dialogowe napisów", + ", selected": ", zaznaczone" +} diff --git a/js/libs/videojs/lang/pt-BR.js b/js/libs/videojs/lang/pt-BR.js index 5e94fa18..582f84a8 100644 --- a/js/libs/videojs/lang/pt-BR.js +++ b/js/libs/videojs/lang/pt-BR.js @@ -1,26 +1,87 @@ -videojs.addLanguage("pt-BR",{ - "Play": "Tocar", - "Pause": "Pausar", - "Current Time": "Tempo", - "Duration Time": "Duração", - "Remaining Time": "Tempo Restante", - "Stream Type": "Tipo de Stream", - "LIVE": "AO VIVO", - "Loaded": "Carregado", - "Progress": "Progresso", - "Fullscreen": "Tela Cheia", - "Non-Fullscreen": "Tela Normal", - "Mute": "Mudo", - "Unmute": "Habilitar Som", - "Playback Rate": "Velocidade", - "Subtitles": "Legendas", - "subtitles off": "Sem Legendas", - "Captions": "Anotações", - "captions off": "Sem Anotações", - "Chapters": "Capítulos", - "You aborted the media playback": "Você parou a execução do vídeo.", - "A network error caused the media download to fail part-way.": "Um erro na rede fez o vídeo parar parcialmente.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "O vídeo não pode ser carregado, ou porque houve um problema com sua rede ou pelo formato do vídeo não ser suportado.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A execução foi interrompida por um problema com o vídeo ou por seu navegador não dar suporte ao seu formato.", - "No compatible source was found for this media.": "Não foi encontrada fonte de vídeo compatível." +videojs.addLanguage('pt-BR', { + "Audio Player": "Reprodutor de áudio", + "Video Player": "Reprodutor de vídeo", + "Play": "Tocar", + "Pause": "Pausar", + "Replay": "Tocar novamente", + "Current Time": "Tempo", + "Duration": "Duração", + "Remaining Time": "Tempo Restante", + "Stream Type": "Tipo de Stream", + "LIVE": "AO VIVO", + "Loaded": "Carregado", + "Progress": "Progresso", + "Progress Bar": "Barra de progresso", + "progress bar timing: currentTime={1} duration={2}": "{1} de {2}", + "Fullscreen": "Tela Cheia", + "Non-Fullscreen": "Tela Normal", + "Mute": "Mudo", + "Unmute": "Habilitar Som", + "Playback Rate": "Velocidade", + "Subtitles": "Legendas", + "subtitles off": "Sem Legendas", + "Captions": "Anotações", + "captions off": "Sem Anotações", + "Chapters": "Capítulos", + "Descriptions": "Descrições", + "descriptions off": "sem descrições", + "Audio Track": "Faixa de áudio", + "Volume Level": "Nível de volume", + "You aborted the media playback": "Você parou a execução do vídeo.", + "A network error caused the media download to fail part-way.": "Um erro na rede causou falha durante o download da mídia.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "A mídia não pode ser carregada, por uma falha de rede ou servidor ou o formato não é suportado.", + "No compatible source was found for this media.": "Nenhuma fonte foi encontrada para esta mídia.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A reprodução foi interrompida devido à um problema de mídia corrompida ou porque a mídia utiliza funções que seu navegador não suporta.", + "The media is encrypted and we do not have the keys to decrypt it.": "A mídia está criptografada e não temos as chaves para descriptografar.", + "Play Video": "Tocar Vídeo", + "Close": "Fechar", + "Close Modal Dialog": "Fechar Diálogo Modal", + "Modal Window": "Janela Modal", + "This is a modal window": "Isso é uma janela-modal", + "This modal can be closed by pressing the Escape key or activating the close button.": "Esta janela pode ser fechada pressionando a tecla de Escape.", + ", opens captions settings dialog": ", abre as configurações de legendas de comentários", + ", opens subtitles settings dialog": ", abre as configurações de legendas", + ", opens descriptions settings dialog": ", abre as configurações", + ", selected": ", selecionada", + "captions settings": "configurações de legendas de comentários", + "subtitles settings": "configurações de legendas", + "descriptions settings": "configurações das descrições", + "Text": "Texto", + "White": "Branco", + "Black": "Preto", + "Red": "Vermelho", + "Green": "Verde", + "Blue": "Azul", + "Yellow": "Amarelo", + "Magenta": "Magenta", + "Cyan": "Ciano", + "Background": "Plano-de-Fundo", + "Window": "Janela", + "Transparent": "Transparente", + "Semi-Transparent": "Semi-Transparente", + "Opaque": "Opaco", + "Font Size": "Tamanho da Fonte", + "Text Edge Style": "Estilo da Borda", + "None": "Nenhum", + "Raised": "Elevado", + "Depressed": "Acachapado", + "Uniform": "Uniforme", + "Dropshadow": "Sombra de projeção", + "Font Family": "Família da Fonte", + "Proportional Sans-Serif": "Sans-Serif(Sem serifa) Proporcional", + "Monospace Sans-Serif": "Sans-Serif(Sem serifa) Monoespaçada", + "Proportional Serif": "Serifa Proporcional", + "Monospace Serif": "Serifa Monoespaçada", + "Casual": "Casual", + "Script": "Script", + "Small Caps": "Maiúsculas Pequenas", + "Reset": "Redefinir", + "restore all settings to the default values": "restaurar todas as configurações aos valores padrão", + "Done": "Salvar", + "Caption Settings Dialog": "Caíxa-de-Diálogo das configurações de Legendas", + "Beginning of dialog window. Escape will cancel and close the window.": "Iniciando a Janela-de-Diálogo. Pressionar Escape irá cancelar e fechar a janela.", + "End of dialog window.": "Fim da Janela-de-Diálogo", + "{1} is loading.": "{1} está carregando.", + "Exit Picture-in-Picture": "Sair de Picture-in-Picture", + "Picture-in-Picture": "Picture-in-Picture" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/pt-BR.json b/js/libs/videojs/lang/pt-BR.json new file mode 100644 index 00000000..0ce4e54c --- /dev/null +++ b/js/libs/videojs/lang/pt-BR.json @@ -0,0 +1,88 @@ +{ + "Audio Player": "Reprodutor de áudio", + "Video Player": "Reprodutor de vídeo", + "Play": "Tocar", + "Pause": "Pausar", + "Replay": "Tocar novamente", + "Current Time": "Tempo", + "Duration": "Duração", + "Remaining Time": "Tempo Restante", + "Stream Type": "Tipo de Stream", + "LIVE": "AO VIVO", + "Loaded": "Carregado", + "Progress": "Progresso", + "Progress Bar": "Barra de progresso", + "progress bar timing: currentTime={1} duration={2}": "{1} de {2}", + "Fullscreen": "Tela Cheia", + "Non-Fullscreen": "Tela Normal", + "Mute": "Mudo", + "Unmute": "Habilitar Som", + "Playback Rate": "Velocidade", + "Subtitles": "Legendas", + "subtitles off": "Sem Legendas", + "Captions": "Anotações", + "captions off": "Sem Anotações", + "Chapters": "Capítulos", + "Descriptions": "Descrições", + "descriptions off": "sem descrições", + "Audio Track": "Faixa de áudio", + "Volume Level": "Nível de volume", + "You aborted the media playback": "Você parou a execução do vídeo.", + "A network error caused the media download to fail part-way.": "Um erro na rede causou falha durante o download da mídia.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "A mídia não pode ser carregada, por uma falha de rede ou servidor ou o formato não é suportado.", + "No compatible source was found for this media.": "Não foi encontrada fonte de mídia compatível.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A reprodução foi interrompida devido à um problema de mídia corrompida ou porque a mídia utiliza funções que seu navegador não suporta.", + "No compatible source was found for this media.": "Nenhuma fonte foi encontrada para esta mídia.", + "The media is encrypted and we do not have the keys to decrypt it.": "A mídia está criptografada e não temos as chaves para descriptografar.", + "Play Video": "Tocar Vídeo", + "Close": "Fechar", + "Close Modal Dialog": "Fechar Diálogo Modal", + "Modal Window": "Janela Modal", + "This is a modal window": "Isso é uma janela-modal", + "This modal can be closed by pressing the Escape key or activating the close button.": "Esta janela pode ser fechada pressionando a tecla de Escape.", + ", opens captions settings dialog": ", abre as configurações de legendas de comentários", + ", opens subtitles settings dialog": ", abre as configurações de legendas", + ", opens descriptions settings dialog": ", abre as configurações", + ", selected": ", selecionada", + "captions settings": "configurações de legendas de comentários", + "subtitles settings": "configurações de legendas", + "descriptions settings": "configurações das descrições", + "Text": "Texto", + "White": "Branco", + "Black": "Preto", + "Red": "Vermelho", + "Green": "Verde", + "Blue": "Azul", + "Yellow": "Amarelo", + "Magenta": "Magenta", + "Cyan": "Ciano", + "Background": "Plano-de-Fundo", + "Window": "Janela", + "Transparent": "Transparente", + "Semi-Transparent": "Semi-Transparente", + "Opaque": "Opaco", + "Font Size": "Tamanho da Fonte", + "Text Edge Style": "Estilo da Borda", + "None": "Nenhum", + "Raised": "Elevado", + "Depressed": "Acachapado", + "Uniform": "Uniforme", + "Dropshadow": "Sombra de projeção", + "Font Family": "Família da Fonte", + "Proportional Sans-Serif": "Sans-Serif(Sem serifa) Proporcional", + "Monospace Sans-Serif": "Sans-Serif(Sem serifa) Monoespaçada", + "Proportional Serif": "Serifa Proporcional", + "Monospace Serif": "Serifa Monoespaçada", + "Casual": "Casual", + "Script": "Script", + "Small Caps": "Maiúsculas Pequenas", + "Reset": "Redefinir", + "restore all settings to the default values": "restaurar todas as configurações aos valores padrão", + "Done": "Salvar", + "Caption Settings Dialog": "Caíxa-de-Diálogo das configurações de Legendas", + "Beginning of dialog window. Escape will cancel and close the window.": "Iniciando a Janela-de-Diálogo. Pressionar Escape irá cancelar e fechar a janela.", + "End of dialog window.": "Fim da Janela-de-Diálogo", + "{1} is loading.": "{1} está carregando.", + "Exit Picture-in-Picture": "Sair de Picture-in-Picture", + "Picture-in-Picture": "Picture-in-Picture" +} diff --git a/js/libs/videojs/lang/pt-PT.js b/js/libs/videojs/lang/pt-PT.js index f301dd53..ed85f68e 100644 --- a/js/libs/videojs/lang/pt-PT.js +++ b/js/libs/videojs/lang/pt-PT.js @@ -1,41 +1,41 @@ -videojs.addLanguage("pt-PT",{ - "Play": "Reproduzir", - "Pause": "Parar", - "Replay": "Reiniciar", - "Current Time": "Tempo Atual", - "Duration Time": "Duração", - "Remaining Time": "Tempo Restante", - "Stream Type": "Tipo de Stream", - "LIVE": "EM DIRETO", - "Loaded": "Carregado", - "Progress": "Progresso", - "Fullscreen": "Ecrã inteiro", - "Non-Fullscreen": "Ecrã normal", - "Mute": "Desativar som", - "Unmute": "Ativar som", - "Playback Rate": "Velocidade de reprodução", - "Subtitles": "Legendas", - "subtitles off": "desativar legendas", - "Captions": "Anotações", - "captions off": "desativar anotações", - "Chapters": "Capítulos", - "Close Modal Dialog": "Fechar Janela Modal", - "Descriptions": "Descrições", - "descriptions off": "desativar descrições", - "Audio Track": "Faixa Áudio", - "You aborted the media playback": "Parou a reprodução do vídeo.", - "A network error caused the media download to fail part-way.": "Um erro na rede fez o vídeo falhar parcialmente.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "O vídeo não pode ser carregado, ou porque houve um problema na rede ou no servidor, ou porque formato do vídeo não é compatível.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A reprodução foi interrompida por um problema com o vídeo ou porque o formato não é compatível com o seu navegador.", - "No compatible source was found for this media.": "Não foi encontrada uma fonte de vídeo compatível.", - "The media is encrypted and we do not have the keys to decrypt it.": "O vídeo está encriptado e não há uma chave para o desencriptar.", - "Play Video": "Reproduzir Vídeo", - "Close": "Fechar", - "Modal Window": "Janela Modal", - "This is a modal window": "Isto é uma janela modal", - "This modal can be closed by pressing the Escape key or activating the close button.": "Esta modal pode ser fechada pressionando a tecla ESC ou ativando o botão de fechar.", - ", opens captions settings dialog": ", abre janela com definições de legendas", - ", opens subtitles settings dialog": ", abre janela com definições de legendas", - ", opens descriptions settings dialog": ", abre janela com definições de descrições", - ", selected": ", seleccionado" +videojs.addLanguage('pt-PT', { + "Play": "Reproduzir", + "Pause": "Parar", + "Replay": "Reiniciar", + "Current Time": "Tempo Atual", + "Duration": "Duração", + "Remaining Time": "Tempo Restante", + "Stream Type": "Tipo de Stream", + "LIVE": "EM DIRETO", + "Loaded": "Carregado", + "Progress": "Progresso", + "Fullscreen": "Ecrã inteiro", + "Non-Fullscreen": "Ecrã normal", + "Mute": "Desativar som", + "Unmute": "Ativar som", + "Playback Rate": "Velocidade de reprodução", + "Subtitles": "Legendas", + "subtitles off": "desativar legendas", + "Captions": "Anotações", + "captions off": "desativar anotações", + "Chapters": "Capítulos", + "Close Modal Dialog": "Fechar Janela Modal", + "Descriptions": "Descrições", + "descriptions off": "desativar descrições", + "Audio Track": "Faixa Áudio", + "You aborted the media playback": "Parou a reprodução do vídeo.", + "A network error caused the media download to fail part-way.": "Um erro na rede fez o vídeo falhar parcialmente.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "O vídeo não pode ser carregado, ou porque houve um problema na rede ou no servidor, ou porque formato do vídeo não é compatível.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A reprodução foi interrompida por um problema com o vídeo ou porque o formato não é compatível com o seu navegador.", + "No compatible source was found for this media.": "Não foi encontrada uma fonte de vídeo compatível.", + "The media is encrypted and we do not have the keys to decrypt it.": "O vídeo está encriptado e não há uma chave para o desencriptar.", + "Play Video": "Reproduzir Vídeo", + "Close": "Fechar", + "Modal Window": "Janela Modal", + "This is a modal window": "Isto é uma janela modal", + "This modal can be closed by pressing the Escape key or activating the close button.": "Esta modal pode ser fechada pressionando a tecla ESC ou ativando o botão de fechar.", + ", opens captions settings dialog": ", abre janela com definições de legendas", + ", opens subtitles settings dialog": ", abre janela com definições de legendas", + ", opens descriptions settings dialog": ", abre janela com definições de descrições", + ", selected": ", seleccionado" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/pt-PT.json b/js/libs/videojs/lang/pt-PT.json new file mode 100644 index 00000000..39d8c664 --- /dev/null +++ b/js/libs/videojs/lang/pt-PT.json @@ -0,0 +1,41 @@ +{ + "Play": "Reproduzir", + "Pause": "Parar", + "Replay": "Reiniciar", + "Current Time": "Tempo Atual", + "Duration": "Duração", + "Remaining Time": "Tempo Restante", + "Stream Type": "Tipo de Stream", + "LIVE": "EM DIRETO", + "Loaded": "Carregado", + "Progress": "Progresso", + "Fullscreen": "Ecrã inteiro", + "Non-Fullscreen": "Ecrã normal", + "Mute": "Desativar som", + "Unmute": "Ativar som", + "Playback Rate": "Velocidade de reprodução", + "Subtitles": "Legendas", + "subtitles off": "desativar legendas", + "Captions": "Anotações", + "captions off": "desativar anotações", + "Chapters": "Capítulos", + "Close Modal Dialog": "Fechar Janela Modal", + "Descriptions": "Descrições", + "descriptions off": "desativar descrições", + "Audio Track": "Faixa Áudio", + "You aborted the media playback": "Parou a reprodução do vídeo.", + "A network error caused the media download to fail part-way.": "Um erro na rede fez o vídeo falhar parcialmente.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "O vídeo não pode ser carregado, ou porque houve um problema na rede ou no servidor, ou porque formato do vídeo não é compatível.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "A reprodução foi interrompida por um problema com o vídeo ou porque o formato não é compatível com o seu navegador.", + "No compatible source was found for this media.": "Não foi encontrada uma fonte de vídeo compatível.", + "The media is encrypted and we do not have the keys to decrypt it.": "O vídeo está encriptado e não há uma chave para o desencriptar.", + "Play Video": "Reproduzir Vídeo", + "Close": "Fechar", + "Modal Window": "Janela Modal", + "This is a modal window": "Isto é uma janela modal", + "This modal can be closed by pressing the Escape key or activating the close button.": "Esta modal pode ser fechada pressionando a tecla ESC ou ativando o botão de fechar.", + ", opens captions settings dialog": ", abre janela com definições de legendas", + ", opens subtitles settings dialog": ", abre janela com definições de legendas", + ", opens descriptions settings dialog": ", abre janela com definições de descrições", + ", selected": ", seleccionado" +} \ No newline at end of file diff --git a/js/libs/videojs/lang/ro.js b/js/libs/videojs/lang/ro.js new file mode 100644 index 00000000..824d89e8 --- /dev/null +++ b/js/libs/videojs/lang/ro.js @@ -0,0 +1,89 @@ +videojs.addLanguage('ro', { + "Audio Player": "Player audio", + "Video Player": "Player video", + "Play": "Piesă", + "Pause": "Pauză", + "Replay": "Reluare", + "Current Time": "Ora curentă", + "Duration": "Durată", + "Remaining Time": "Timp rămas", + "Stream Type": "Tip flux", + "LIVE": "ÎN DIRECT", + "Seek to live, currently behind live": "Căutare în direct; în prezent, sunteți în urmă", + "Seek to live, currently playing live": "Căutare în direct; în prezent, se redă în direct", + "Loaded": "Încărcat", + "Progress": "Progres", + "Progress Bar": "Bară de progres", + "progress bar timing: currentTime={1} duration={2}": "{1} din {2}", + "Fullscreen": "Ecran complet", + "Non-Fullscreen": "Ecran parțial", + "Mute": "Suprimare sunet", + "Unmute": "Activare sunet", + "Playback Rate": "Rată de redare", + "Subtitles": "Subtitrări", + "subtitles off": "subtitrări dezactivate", + "Captions": "Indicații scrise", + "captions off": "indicații scrise dezactivate", + "Chapters": "Capitole", + "Descriptions": "Descrieri", + "descriptions off": "descrieri dezactivate", + "Audio Track": "Pistă audio", + "Volume Level": "Nivel volum", + "You aborted the media playback": "Ați abandonat redarea media", + "A network error caused the media download to fail part-way.": "O eroare de rețea a provocat eșecul descărcării conținutului media în timpul procesului.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Conținutul media nu a putut fi încărcat, fie pentru că serverul sau rețeaua a eșuat, fie pentru că formatul nu este acceptat.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Redarea media a fost întreruptă din cauza conținutului corupt sau din cauza faptului că acest conținut media folosește funcții pe care browserul dvs. nu le acceptă.", + "No compatible source was found for this media.": "Nu au fost găsite surse compatibile pentru acest conținut media.", + "The media is encrypted and we do not have the keys to decrypt it.": "Conținutul media este criptată și nu avem cheile pentru decriptare.", + "Play Video": "Redare video", + "Close": "Închidere", + "Close Modal Dialog": "Închidere dialog modal", + "Modal Window": "Fereastră modală", + "This is a modal window": "Aceasta este o fereastră modală", + "This modal can be closed by pressing the Escape key or activating the close button.": "Această fereastră modală poate fi închisă cu tasta Escape sau butonul de închidere.", + ", opens captions settings dialog": ", deschide dialogul de setări pentru indicații scrise", + ", opens subtitles settings dialog": ", deschide dialogul de setări pentru subtitrări", + ", opens descriptions settings dialog": ", deschide dialogul de setări pentru descrieri", + ", selected": ", selectat", + "captions settings": "setări indicații scrise", + "subtitles settings": "setări subtitrări", + "descriptions settings": "setări descrieri", + "Text": "Text", + "White": "Alb", + "Black": "Negru", + "Red": "Roșu", + "Green": "Verde", + "Blue": "Albastru", + "Yellow": "Galben", + "Magenta": "Magenta", + "Cyan": "Cyan", + "Background": "Fundal", + "Window": "Fereastră", + "Transparent": "Transparent", + "Semi-Transparent": "Semitransparent", + "Opaque": "Opac", + "Font Size": "Mărime font", + "Text Edge Style": "Stil margine text", + "None": "Fără", + "Raised": "Ridicat", + "Depressed": "Apăsat", + "Uniform": "Uniformă", + "Dropshadow": "Umbră", + "Font Family": "Familie fonturi", + "Proportional Sans-Serif": "Sans-serif proporțional", + "Monospace Sans-Serif": "Sans-serif monospațiu", + "Proportional Serif": "Serif proporțional", + "Monospace Serif": "Serif monospațiu", + "Casual": "Informal", + "Script": "Script", + "Small Caps": "Majuscule mici", + "Reset": "Resetare", + "restore all settings to the default values": "readuceți toate setările la valorile implicite", + "Done": "Terminat", + "Caption Settings Dialog": "Dialog setări indicații scrise", + "Beginning of dialog window. Escape will cancel and close the window.": "Începutul ferestrei de dialog. Tasta Escape va anula și va închide fereastra.", + "End of dialog window.": "Sfârșitul ferestrei de dialog.", + "{1} is loading.": "{1} se încarcă.", + "Exit Picture-in-Picture": "Închidere imagine în imagine", + "Picture-in-Picture": "Imagine în imagine" +}); \ No newline at end of file diff --git a/js/libs/videojs/lang/ro.json b/js/libs/videojs/lang/ro.json new file mode 100644 index 00000000..bed65d61 --- /dev/null +++ b/js/libs/videojs/lang/ro.json @@ -0,0 +1,89 @@ +{ + "Audio Player": "Player audio", + "Video Player": "Player video", + "Play": "Piesă", + "Pause": "Pauză", + "Replay": "Reluare", + "Current Time": "Ora curentă", + "Duration": "Durată", + "Remaining Time": "Timp rămas", + "Stream Type": "Tip flux", + "LIVE": "ÎN DIRECT", + "Seek to live, currently behind live": "Căutare în direct; în prezent, sunteți în urmă", + "Seek to live, currently playing live": "Căutare în direct; în prezent, se redă în direct", + "Loaded": "Încărcat", + "Progress": "Progres", + "Progress Bar": "Bară de progres", + "progress bar timing: currentTime={1} duration={2}": "{1} din {2}", + "Fullscreen": "Ecran complet", + "Non-Fullscreen": "Ecran parțial", + "Mute": "Suprimare sunet", + "Unmute": "Activare sunet", + "Playback Rate": "Rată de redare", + "Subtitles": "Subtitrări", + "subtitles off": "subtitrări dezactivate", + "Captions": "Indicații scrise", + "captions off": "indicații scrise dezactivate", + "Chapters": "Capitole", + "Descriptions": "Descrieri", + "descriptions off": "descrieri dezactivate", + "Audio Track": "Pistă audio", + "Volume Level": "Nivel volum", + "You aborted the media playback": "Ați abandonat redarea media", + "A network error caused the media download to fail part-way.": "O eroare de rețea a provocat eșecul descărcării conținutului media în timpul procesului.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Conținutul media nu a putut fi încărcat, fie pentru că serverul sau rețeaua a eșuat, fie pentru că formatul nu este acceptat.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Redarea media a fost întreruptă din cauza conținutului corupt sau din cauza faptului că acest conținut media folosește funcții pe care browserul dvs. nu le acceptă.", + "No compatible source was found for this media.": "Nu au fost găsite surse compatibile pentru acest conținut media.", + "The media is encrypted and we do not have the keys to decrypt it.": "Conținutul media este criptată și nu avem cheile pentru decriptare.", + "Play Video": "Redare video", + "Close": "Închidere", + "Close Modal Dialog": "Închidere dialog modal", + "Modal Window": "Fereastră modală", + "This is a modal window": "Aceasta este o fereastră modală", + "This modal can be closed by pressing the Escape key or activating the close button.": "Această fereastră modală poate fi închisă cu tasta Escape sau butonul de închidere.", + ", opens captions settings dialog": ", deschide dialogul de setări pentru indicații scrise", + ", opens subtitles settings dialog": ", deschide dialogul de setări pentru subtitrări", + ", opens descriptions settings dialog": ", deschide dialogul de setări pentru descrieri", + ", selected": ", selectat", + "captions settings": "setări indicații scrise", + "subtitles settings": "setări subtitrări", + "descriptions settings": "setări descrieri", + "Text": "Text", + "White": "Alb", + "Black": "Negru", + "Red": "Roșu", + "Green": "Verde", + "Blue": "Albastru", + "Yellow": "Galben", + "Magenta": "Magenta", + "Cyan": "Cyan", + "Background": "Fundal", + "Window": "Fereastră", + "Transparent": "Transparent", + "Semi-Transparent": "Semitransparent", + "Opaque": "Opac", + "Font Size": "Mărime font", + "Text Edge Style": "Stil margine text", + "None": "Fără", + "Raised": "Ridicat", + "Depressed": "Apăsat", + "Uniform": "Uniformă", + "Dropshadow": "Umbră", + "Font Family": "Familie fonturi", + "Proportional Sans-Serif": "Sans-serif proporțional", + "Monospace Sans-Serif": "Sans-serif monospațiu", + "Proportional Serif": "Serif proporțional", + "Monospace Serif": "Serif monospațiu", + "Casual": "Informal", + "Script": "Script", + "Small Caps": "Majuscule mici", + "Reset": "Resetare", + "restore all settings to the default values": "readuceți toate setările la valorile implicite", + "Done": "Terminat", + "Caption Settings Dialog": "Dialog setări indicații scrise", + "Beginning of dialog window. Escape will cancel and close the window.": "Începutul ferestrei de dialog. Tasta Escape va anula și va închide fereastra.", + "End of dialog window.": "Sfârșitul ferestrei de dialog.", + "{1} is loading.": "{1} se încarcă.", + "Exit Picture-in-Picture": "Închidere imagine în imagine", + "Picture-in-Picture": "Imagine în imagine" +} diff --git a/js/libs/videojs/lang/ru.js b/js/libs/videojs/lang/ru.js index 82e11bfb..973daf3f 100644 --- a/js/libs/videojs/lang/ru.js +++ b/js/libs/videojs/lang/ru.js @@ -1,84 +1,85 @@ -videojs.addLanguage("ru",{ - "Audio Player": "Аудио проигрыватель", - "Video Player": "Видео проигрыватель", - "Play": "Воспроизвести", - "Pause": "Приостановить", - "Replay": "Воспроизвести снова", - "Current Time": "Текущее время", - "Duration Time": "Продолжительность", - "Remaining Time": "Оставшееся время", - "Stream Type": "Тип потока", - "LIVE": "ОНЛАЙН", - "Loaded": "Загрузка", - "Progress": "Прогресс", - "Progress Bar": "Индикатор загрузки", - "progress bar timing: currentTime={1} duration={2}": "{1} из {2}", - "Fullscreen": "Полноэкранный режим", - "Non-Fullscreen": "Неполноэкранный режим", - "Mute": "Без звука", - "Unmute": "Со звуком", - "Playback Rate": "Скорость воспроизведения", - "Subtitles": "Субтитры", - "subtitles off": "Субтитры выкл.", - "Captions": "Подписи", - "captions off": "Подписи выкл.", - "Chapters": "Главы", - "Descriptions": "Описания", - "descriptions off": "Отключить описания", - "Audio Track": "Звуковая дорожка", - "Volume Level": "Уровень громкости", - "You aborted the media playback": "Вы прервали воспроизведение видео", - "A network error caused the media download to fail part-way.": "Ошибка сети вызвала сбой во время загрузки видео.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Невозможно загрузить видео из-за сетевого или серверного сбоя либо формат не поддерживается.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Воспроизведение видео было приостановлено из-за повреждения либо в связи с тем, что видео использует функции, неподдерживаемые вашим браузером.", - "No compatible source was found for this media.": "Совместимые источники для этого видео отсутствуют.", - "The media is encrypted and we do not have the keys to decrypt it.": "Видео в зашифрованном виде, и у нас нет ключей для расшифровки.", - "Play Video": "Воспроизвести видео", - "Close": "Закрыть", - "Close Modal Dialog": "Закрыть модальное окно", - "Modal Window": "Модальное окно", - "This is a modal window": "Это модальное окно", - "This modal can be closed by pressing the Escape key or activating the close button.": "Модальное окно можно закрыть нажав Esc или кнопку закрытия окна.", - ", opens captions settings dialog": ", откроется диалог настройки подписей", - ", opens subtitles settings dialog": ", откроется диалог настройки субтитров", - ", opens descriptions settings dialog": ", откроется диалог настройки описаний", - ", selected": ", выбрано", - "captions settings": "настройки подписей", - "subtitles settings": "настройки субтитров", - "descriptions settings": "настройки описаний", - "Text": "Текст", - "White": "Белый", - "Black": "Черный", - "Red": "Красный", - "Green": "Зеленый", - "Blue": "Синий", - "Yellow": "Желтый", - "Magenta": "Пурпурный", - "Cyan": "Голубой", - "Background": "Фон", - "Window": "Окно", - "Transparent": "Прозрачный", - "Semi-Transparent": "Полупрозрачный", - "Opaque": "Прозрачность", - "Font Size": "Размер шрифта", - "Text Edge Style": "Стиль края текста", - "None": "Ничего", - "Raised": "Поднятый", - "Depressed": "Пониженный", - "Uniform": "Одинаковый", - "Dropshadow": "Тень", - "Font Family": "Шрифт", - "Proportional Sans-Serif": "Пропорциональный без засечек", - "Monospace Sans-Serif": "Моноширинный без засечек", - "Proportional Serif": "Пропорциональный с засечками", - "Monospace Serif": "Моноширинный с засечками", - "Casual": "Случайный", - "Script": "Письменный", - "Small Caps": "Малые прописные", - "Reset": "Сбросить", - "restore all settings to the default values": "сбросить все найстройки по умолчанию", - "Done": "Готово", - "Caption Settings Dialog": "Диалог настроек подписи", - "Beginning of dialog window. Escape will cancel and close the window.": "Начало диалоговго окна. Кнопка Escape закроет или отменит окно", - "End of dialog window.": "Конец диалогового окна." +videojs.addLanguage('ru', { + "Audio Player": "Аудио проигрыватель", + "Video Player": "Видео проигрыватель", + "Play": "Воспроизвести", + "Pause": "Приостановить", + "Replay": "Воспроизвести снова", + "Current Time": "Текущее время", + "Duration": "Продолжительность", + "Remaining Time": "Оставшееся время", + "Stream Type": "Тип потока", + "LIVE": "ОНЛАЙН", + "Loaded": "Загрузка", + "Progress": "Прогресс", + "Progress Bar": "Индикатор загрузки", + "progress bar timing: currentTime={1} duration={2}": "{1} из {2}", + "Fullscreen": "Полноэкранный режим", + "Non-Fullscreen": "Неполноэкранный режим", + "Mute": "Без звука", + "Unmute": "Со звуком", + "Playback Rate": "Скорость воспроизведения", + "Subtitles": "Субтитры", + "subtitles off": "Субтитры выкл.", + "Captions": "Подписи", + "captions off": "Подписи выкл.", + "Chapters": "Главы", + "Descriptions": "Описания", + "descriptions off": "Отключить описания", + "Audio Track": "Звуковая дорожка", + "Volume Level": "Уровень громкости", + "You aborted the media playback": "Вы прервали воспроизведение видео", + "A network error caused the media download to fail part-way.": "Ошибка сети вызвала сбой во время загрузки видео.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Невозможно загрузить видео из-за сетевого или серверного сбоя либо формат не поддерживается.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Воспроизведение видео было приостановлено из-за повреждения либо в связи с тем, что видео использует функции, неподдерживаемые вашим браузером.", + "No compatible source was found for this media.": "Совместимые источники для этого видео отсутствуют.", + "The media is encrypted and we do not have the keys to decrypt it.": "Видео в зашифрованном виде, и у нас нет ключей для расшифровки.", + "Play Video": "Воспроизвести видео", + "Close": "Закрыть", + "Close Modal Dialog": "Закрыть модальное окно", + "Modal Window": "Модальное окно", + "This is a modal window": "Это модальное окно", + "This modal can be closed by pressing the Escape key or activating the close button.": "Модальное окно можно закрыть нажав Esc или кнопку закрытия окна.", + ", opens captions settings dialog": ", откроется диалог настройки подписей", + ", opens subtitles settings dialog": ", откроется диалог настройки субтитров", + ", opens descriptions settings dialog": ", откроется диалог настройки описаний", + ", selected": ", выбрано", + "captions settings": "настройки подписей", + "subtitles settings": "настройки субтитров", + "descriptions settings": "настройки описаний", + "Text": "Текст", + "White": "Белый", + "Black": "Черный", + "Red": "Красный", + "Green": "Зеленый", + "Blue": "Синий", + "Yellow": "Желтый", + "Magenta": "Пурпурный", + "Cyan": "Голубой", + "Background": "Фон", + "Window": "Окно", + "Transparent": "Прозрачный", + "Semi-Transparent": "Полупрозрачный", + "Opaque": "Прозрачность", + "Font Size": "Размер шрифта", + "Text Edge Style": "Стиль края текста", + "None": "Ничего", + "Raised": "Поднятый", + "Depressed": "Пониженный", + "Uniform": "Одинаковый", + "Dropshadow": "Тень", + "Font Family": "Шрифт", + "Proportional Sans-Serif": "Пропорциональный без засечек", + "Monospace Sans-Serif": "Моноширинный без засечек", + "Proportional Serif": "Пропорциональный с засечками", + "Monospace Serif": "Моноширинный с засечками", + "Casual": "Случайный", + "Script": "Письменный", + "Small Caps": "Малые прописные", + "Reset": "Сбросить", + "restore all settings to the default values": "сбросить все найстройки по умолчанию", + "Done": "Готово", + "Caption Settings Dialog": "Диалог настроек подписи", + "Beginning of dialog window. Escape will cancel and close the window.": "Начало диалоговго окна. Кнопка Escape закроет или отменит окно", + "End of dialog window.": "Конец диалогового окна.", + "{1} is loading.": "{1} загружается." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/ru.json b/js/libs/videojs/lang/ru.json new file mode 100644 index 00000000..eb6b33f8 --- /dev/null +++ b/js/libs/videojs/lang/ru.json @@ -0,0 +1,85 @@ +{ + "Audio Player": "Аудио проигрыватель", + "Video Player": "Видео проигрыватель", + "Play": "Воспроизвести", + "Pause": "Приостановить", + "Replay": "Воспроизвести снова", + "Current Time": "Текущее время", + "Duration": "Продолжительность", + "Remaining Time": "Оставшееся время", + "Stream Type": "Тип потока", + "LIVE": "ОНЛАЙН", + "Loaded": "Загрузка", + "Progress": "Прогресс", + "Progress Bar": "Индикатор загрузки", + "progress bar timing: currentTime={1} duration={2}": "{1} из {2}", + "Fullscreen": "Полноэкранный режим", + "Non-Fullscreen": "Неполноэкранный режим", + "Mute": "Без звука", + "Unmute": "Со звуком", + "Playback Rate": "Скорость воспроизведения", + "Subtitles": "Субтитры", + "subtitles off": "Субтитры выкл.", + "Captions": "Подписи", + "captions off": "Подписи выкл.", + "Chapters": "Главы", + "Descriptions": "Описания", + "descriptions off": "Отключить описания", + "Audio Track": "Звуковая дорожка", + "Volume Level": "Уровень громкости", + "You aborted the media playback": "Вы прервали воспроизведение видео", + "A network error caused the media download to fail part-way.": "Ошибка сети вызвала сбой во время загрузки видео.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Невозможно загрузить видео из-за сетевого или серверного сбоя либо формат не поддерживается.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Воспроизведение видео было приостановлено из-за повреждения либо в связи с тем, что видео использует функции, неподдерживаемые вашим браузером.", + "No compatible source was found for this media.": "Совместимые источники для этого видео отсутствуют.", + "The media is encrypted and we do not have the keys to decrypt it.": "Видео в зашифрованном виде, и у нас нет ключей для расшифровки.", + "Play Video": "Воспроизвести видео", + "Close": "Закрыть", + "Close Modal Dialog": "Закрыть модальное окно", + "Modal Window": "Модальное окно", + "This is a modal window": "Это модальное окно", + "This modal can be closed by pressing the Escape key or activating the close button.": "Модальное окно можно закрыть нажав Esc или кнопку закрытия окна.", + ", opens captions settings dialog": ", откроется диалог настройки подписей", + ", opens subtitles settings dialog": ", откроется диалог настройки субтитров", + ", opens descriptions settings dialog": ", откроется диалог настройки описаний", + ", selected": ", выбрано", + "captions settings": "настройки подписей", + "subtitles settings": "настройки субтитров", + "descriptions settings": "настройки описаний", + "Text": "Текст", + "White": "Белый", + "Black": "Черный", + "Red": "Красный", + "Green": "Зеленый", + "Blue": "Синий", + "Yellow": "Желтый", + "Magenta": "Пурпурный", + "Cyan": "Голубой", + "Background": "Фон", + "Window": "Окно", + "Transparent": "Прозрачный", + "Semi-Transparent": "Полупрозрачный", + "Opaque": "Прозрачность", + "Font Size": "Размер шрифта", + "Text Edge Style": "Стиль края текста", + "None": "Ничего", + "Raised": "Поднятый", + "Depressed": "Пониженный", + "Uniform": "Одинаковый", + "Dropshadow": "Тень", + "Font Family": "Шрифт", + "Proportional Sans-Serif": "Пропорциональный без засечек", + "Monospace Sans-Serif": "Моноширинный без засечек", + "Proportional Serif": "Пропорциональный с засечками", + "Monospace Serif": "Моноширинный с засечками", + "Casual": "Случайный", + "Script": "Письменный", + "Small Caps": "Малые прописные", + "Reset": "Сбросить", + "restore all settings to the default values": "сбросить все найстройки по умолчанию", + "Done": "Готово", + "Caption Settings Dialog": "Диалог настроек подписи", + "Beginning of dialog window. Escape will cancel and close the window.": "Начало диалоговго окна. Кнопка Escape закроет или отменит окно", + "End of dialog window.": "Конец диалогового окна.", + "{1} is loading.": "{1} загружается." +} diff --git a/js/libs/videojs/lang/sk.js b/js/libs/videojs/lang/sk.js index 083fdc05..e3f9d800 100644 --- a/js/libs/videojs/lang/sk.js +++ b/js/libs/videojs/lang/sk.js @@ -1,84 +1,85 @@ -videojs.addLanguage("sk",{ - "Audio Player": "Zvukový prehrávač", - "Video Player": "Video prehrávač", - "Play": "Prehrať", - "Pause": "Pozastaviť", - "Replay": "Prehrať znova", - "Current Time": "Aktuálny čas", - "Duration Time": "Čas trvania", - "Remaining Time": "Zostávajúci čas", - "Stream Type": "Typ stopy", - "LIVE": "NAŽIVO", - "Loaded": "Načítané", - "Progress": "Priebeh", - "Progress Bar": "Ukazovateľ priebehu", - "progress bar timing: currentTime={1} duration={2}": "časovanie ukazovateľa priebehu: currentTime={1} duration={2}", - "Fullscreen": "Režim celej obrazovky", - "Non-Fullscreen": "Režim normálnej obrazovky", - "Mute": "Stlmiť", - "Unmute": "Zrušiť stlmenie", - "Playback Rate": "Rýchlosť prehrávania", - "Subtitles": "Titulky", - "subtitles off": "titulky vypnuté", - "Captions": "Popisky", - "captions off": "popisky vypnuté", - "Chapters": "Kapitoly", - "Descriptions": "Opisy", - "descriptions off": "opisy vypnuté", - "Audio Track": "Zvuková stopa", - "Volume Level": "Úroveň hlasitosti", - "You aborted the media playback": "Prerušili ste prehrávanie", - "A network error caused the media download to fail part-way.": "Sťahovanie súboru bolo zrušené pre chybu na sieti.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Súbor sa nepodarilo načítať pre chybu servera, sieťového pripojenia, alebo je formát súboru nepodporovaný.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Prehrávanie súboru bolo prerušené pre poškodené dáta, alebo súbor používa vlastnosti, ktoré váš prehliadač nepodporuje.", - "No compatible source was found for this media.": "Nebol nájdený žiaden kompatibilný zdroj pre tento súbor.", - "The media is encrypted and we do not have the keys to decrypt it.": "Súbor je zašifrovaný a nie je k dispozícii kľúč na rozšifrovanie.", - "Play Video": "Prehrať video", - "Close": "Zatvoriť", - "Close Modal Dialog": "Zatvoriť modálne okno", - "Modal Window": "Modálne okno", - "This is a modal window": "Toto je modálne okno", - "This modal can be closed by pressing the Escape key or activating the close button.": "Toto modálne okno je možné zatvoriť stlačením klávesy Escape, alebo aktivovaním tlačidla na zatvorenie.", - ", opens captions settings dialog": ", otvorí okno nastavení popiskov", - ", opens subtitles settings dialog": ", otvorí okno nastavení titulkov", - ", opens descriptions settings dialog": ", otvorí okno nastavení opisov", - ", selected": ", označené", - "captions settings": "nastavenia popiskov", - "subtitles settings": "nastavenia titulkov", - "descriptions settings": "nastavenia opisov", - "Text": "Text", - "White": "Biela", - "Black": "Čierna", - "Red": "Červená", - "Green": "Zelená", - "Blue": "Modrá", - "Yellow": "Žltá", - "Magenta": "Ružová", - "Cyan": "Tyrkysová", - "Background": "Pozadie", - "Window": "Okno", - "Transparent": "Priesvitné", - "Semi-Transparent": "Polopriesvitné", - "Opaque": "Plné", - "Font Size": "Veľkosť písma", - "Text Edge Style": "Typ okrajov písma", - "None": "Žiadne", - "Raised": "Zvýšené", - "Depressed": "Znížené", - "Uniform": "Pravidelné", - "Dropshadow": "S tieňom", - "Font Family": "Typ písma", - "Proportional Sans-Serif": "Proporčné bezpätkové", - "Monospace Sans-Serif": "Pravidelné, bezpätkové", - "Proportional Serif": "Proporčné pätkové", - "Monospace Serif": "Pravidelné pätkové", - "Casual": "Bežné", - "Script": "Písané", - "Small Caps": "Malé kapitálky", - "Reset": "Resetovať", - "restore all settings to the default values": "všetky nastavenia na základné hodnoty", - "Done": "Hotovo", - "Caption Settings Dialog": "Okno nastavení popiskov", - "Beginning of dialog window. Escape will cancel and close the window.": "Začiatok okna. Klávesa Escape zruší a zavrie okno.", - "End of dialog window.": "Koniec okna." +videojs.addLanguage('sk', { + "Audio Player": "Zvukový prehrávač", + "Video Player": "Video prehrávač", + "Play": "Prehrať", + "Pause": "Pozastaviť", + "Replay": "Prehrať znova", + "Current Time": "Aktuálny čas", + "Duration": "Čas trvania", + "Remaining Time": "Zostávajúci čas", + "Stream Type": "Typ stopy", + "LIVE": "NAŽIVO", + "Loaded": "Načítané", + "Progress": "Priebeh", + "Progress Bar": "Ukazovateľ priebehu", + "progress bar timing: currentTime={1} duration={2}": "časovanie ukazovateľa priebehu: currentTime={1} duration={2}", + "Fullscreen": "Režim celej obrazovky", + "Non-Fullscreen": "Režim normálnej obrazovky", + "Mute": "Stlmiť", + "Unmute": "Zrušiť stlmenie", + "Playback Rate": "Rýchlosť prehrávania", + "Subtitles": "Titulky", + "subtitles off": "titulky vypnuté", + "Captions": "Popisky", + "captions off": "popisky vypnuté", + "Chapters": "Kapitoly", + "Descriptions": "Opisy", + "descriptions off": "opisy vypnuté", + "Audio Track": "Zvuková stopa", + "Volume Level": "Úroveň hlasitosti", + "You aborted the media playback": "Prerušili ste prehrávanie", + "A network error caused the media download to fail part-way.": "Sťahovanie súboru bolo zrušené pre chybu na sieti.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Súbor sa nepodarilo načítať pre chybu servera, sieťového pripojenia, alebo je formát súboru nepodporovaný.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Prehrávanie súboru bolo prerušené pre poškodené dáta, alebo súbor používa vlastnosti, ktoré váš prehliadač nepodporuje.", + "No compatible source was found for this media.": "Nebol nájdený žiaden kompatibilný zdroj pre tento súbor.", + "The media is encrypted and we do not have the keys to decrypt it.": "Súbor je zašifrovaný a nie je k dispozícii kľúč na rozšifrovanie.", + "Play Video": "Prehrať video", + "Close": "Zatvoriť", + "Close Modal Dialog": "Zatvoriť modálne okno", + "Modal Window": "Modálne okno", + "This is a modal window": "Toto je modálne okno", + "This modal can be closed by pressing the Escape key or activating the close button.": "Toto modálne okno je možné zatvoriť stlačením klávesy Escape, alebo aktivovaním tlačidla na zatvorenie.", + ", opens captions settings dialog": ", otvorí okno nastavení popiskov", + ", opens subtitles settings dialog": ", otvorí okno nastavení titulkov", + ", opens descriptions settings dialog": ", otvorí okno nastavení opisov", + ", selected": ", označené", + "captions settings": "nastavenia popiskov", + "subtitles settings": "nastavenia titulkov", + "descriptions settings": "nastavenia opisov", + "Text": "Text", + "White": "Biela", + "Black": "Čierna", + "Red": "Červená", + "Green": "Zelená", + "Blue": "Modrá", + "Yellow": "Žltá", + "Magenta": "Ružová", + "Cyan": "Tyrkysová", + "Background": "Pozadie", + "Window": "Okno", + "Transparent": "Priesvitné", + "Semi-Transparent": "Polopriesvitné", + "Opaque": "Plné", + "Font Size": "Veľkosť písma", + "Text Edge Style": "Typ okrajov písma", + "None": "Žiadne", + "Raised": "Zvýšené", + "Depressed": "Znížené", + "Uniform": "Pravidelné", + "Dropshadow": "S tieňom", + "Font Family": "Typ písma", + "Proportional Sans-Serif": "Proporčné bezpätkové", + "Monospace Sans-Serif": "Pravidelné, bezpätkové", + "Proportional Serif": "Proporčné pätkové", + "Monospace Serif": "Pravidelné pätkové", + "Casual": "Bežné", + "Script": "Písané", + "Small Caps": "Malé kapitálky", + "Reset": "Resetovať", + "restore all settings to the default values": "všetky nastavenia na základné hodnoty", + "Done": "Hotovo", + "Caption Settings Dialog": "Okno nastavení popiskov", + "Beginning of dialog window. Escape will cancel and close the window.": "Začiatok okna. Klávesa Escape zruší a zavrie okno.", + "End of dialog window.": "Koniec okna.", + "{1} is loading.": "{1} sa načíta." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/sk.json b/js/libs/videojs/lang/sk.json new file mode 100644 index 00000000..9c3f560a --- /dev/null +++ b/js/libs/videojs/lang/sk.json @@ -0,0 +1,85 @@ +{ + "Audio Player": "Zvukový prehrávač", + "Video Player": "Video prehrávač", + "Play": "Prehrať", + "Pause": "Pozastaviť", + "Replay": "Prehrať znova", + "Current Time": "Aktuálny čas", + "Duration": "Čas trvania", + "Remaining Time": "Zostávajúci čas", + "Stream Type": "Typ stopy", + "LIVE": "NAŽIVO", + "Loaded": "Načítané", + "Progress": "Priebeh", + "Progress Bar": "Ukazovateľ priebehu", + "progress bar timing: currentTime={1} duration={2}": "časovanie ukazovateľa priebehu: currentTime={1} duration={2}", + "Fullscreen": "Režim celej obrazovky", + "Non-Fullscreen": "Režim normálnej obrazovky", + "Mute": "Stlmiť", + "Unmute": "Zrušiť stlmenie", + "Playback Rate": "Rýchlosť prehrávania", + "Subtitles": "Titulky", + "subtitles off": "titulky vypnuté", + "Captions": "Popisky", + "captions off": "popisky vypnuté", + "Chapters": "Kapitoly", + "Descriptions": "Opisy", + "descriptions off": "opisy vypnuté", + "Audio Track": "Zvuková stopa", + "Volume Level": "Úroveň hlasitosti", + "You aborted the media playback": "Prerušili ste prehrávanie", + "A network error caused the media download to fail part-way.": "Sťahovanie súboru bolo zrušené pre chybu na sieti.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Súbor sa nepodarilo načítať pre chybu servera, sieťového pripojenia, alebo je formát súboru nepodporovaný.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Prehrávanie súboru bolo prerušené pre poškodené dáta, alebo súbor používa vlastnosti, ktoré váš prehliadač nepodporuje.", + "No compatible source was found for this media.": "Nebol nájdený žiaden kompatibilný zdroj pre tento súbor.", + "The media is encrypted and we do not have the keys to decrypt it.": "Súbor je zašifrovaný a nie je k dispozícii kľúč na rozšifrovanie.", + "Play Video": "Prehrať video", + "Close": "Zatvoriť", + "Close Modal Dialog": "Zatvoriť modálne okno", + "Modal Window": "Modálne okno", + "This is a modal window": "Toto je modálne okno", + "This modal can be closed by pressing the Escape key or activating the close button.": "Toto modálne okno je možné zatvoriť stlačením klávesy Escape, alebo aktivovaním tlačidla na zatvorenie.", + ", opens captions settings dialog": ", otvorí okno nastavení popiskov", + ", opens subtitles settings dialog": ", otvorí okno nastavení titulkov", + ", opens descriptions settings dialog": ", otvorí okno nastavení opisov", + ", selected": ", označené", + "captions settings": "nastavenia popiskov", + "subtitles settings": "nastavenia titulkov", + "descriptions settings": "nastavenia opisov", + "Text": "Text", + "White": "Biela", + "Black": "Čierna", + "Red": "Červená", + "Green": "Zelená", + "Blue": "Modrá", + "Yellow": "Žltá", + "Magenta": "Ružová", + "Cyan": "Tyrkysová", + "Background": "Pozadie", + "Window": "Okno", + "Transparent": "Priesvitné", + "Semi-Transparent": "Polopriesvitné", + "Opaque": "Plné", + "Font Size": "Veľkosť písma", + "Text Edge Style": "Typ okrajov písma", + "None": "Žiadne", + "Raised": "Zvýšené", + "Depressed": "Znížené", + "Uniform": "Pravidelné", + "Dropshadow": "S tieňom", + "Font Family": "Typ písma", + "Proportional Sans-Serif": "Proporčné bezpätkové", + "Monospace Sans-Serif": "Pravidelné, bezpätkové", + "Proportional Serif": "Proporčné pätkové", + "Monospace Serif": "Pravidelné pätkové", + "Casual": "Bežné", + "Script": "Písané", + "Small Caps": "Malé kapitálky", + "Reset": "Resetovať", + "restore all settings to the default values": "všetky nastavenia na základné hodnoty", + "Done": "Hotovo", + "Caption Settings Dialog": "Okno nastavení popiskov", + "Beginning of dialog window. Escape will cancel and close the window.": "Začiatok okna. Klávesa Escape zruší a zavrie okno.", + "End of dialog window.": "Koniec okna.", + "{1} is loading.": "{1} sa načíta." +} diff --git a/js/libs/videojs/lang/sl.js b/js/libs/videojs/lang/sl.js new file mode 100644 index 00000000..f0284d3e --- /dev/null +++ b/js/libs/videojs/lang/sl.js @@ -0,0 +1,83 @@ +videojs.addLanguage('sl', { + "Audio Player": "Avdio predvajalnik", + "Video Player": "Video predvajalnik", + "Play": "Predvajaj", + "Pause": "Začasno ustavi", + "Replay": "Predvajaj ponovno", + "Current Time": "Trenutni čas", + "Duration": "Trajanje", + "Remaining Time": "Preostali čas", + "Stream Type": "Vrsta podatkovnega toka", + "LIVE": "V ŽIVO", + "Seek to live, currently behind live": "Spremljaj v živo (trenutno v zaostanku)", + "Seek to live, currently playing live": "Spremljaj v živo (trenutno v živo)", + "Loaded": "Naloženo", + "Progress": "Napredek", + "Progress Bar": "Vrstica napredka", + "progress bar timing: currentTime={1} duration={2}": "{1} od {2}", + "Fullscreen": "Celozaslonski prikaz", + "Non-Fullscreen": "Prikaz na delu zaslona", + "Mute": "Izključi zvok", + "Unmute": "Vključi zvok", + "Playback Rate": "Hitrost predvajanja", + "Subtitles": "Podnapisi", + "subtitles off": "podnapisi izklopljeni", + "Captions": "Zvočni zapis", + "captions off": "zvočni zapis izklopljen", + "Chapters": "Poglavja", + "Descriptions": "Opisi", + "descriptions off": "opisi izklopljeni", + "Audio Track": "Zvočni posnetek", + "Volume Level": "Raven glasnosti", + "You aborted the media playback": "Prekinili ste predvajanje.", + "A network error caused the media download to fail part-way.": "Prenos multimedijske datoteke ni uspel zaradi napake v omrežju.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Multimedijske datoteke ni bilo mogoče naložiti zaradi napake na strežniku oziroma omrežju ali ker ta oblika ni podprta.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Predvajanje datoteke je bilo prekinjeno zaradi napak v datoteki ali ker uporablja funkcije, ki jih brskalnik ne podpira.", + "No compatible source was found for this media.": "Za to datoteko ni bil najden noben združljiv vir.", + "The media is encrypted and we do not have the keys to decrypt it.": "Datoteka je šifrirana in predvajalnik nima ključev za njeno dešifriranje.", + "Play Video": "Predvajaj", + "Close": "Zapri", + "Close Modal Dialog": "Zapri modalno okno", + "Modal Window": "Modalno okno", + "This is a modal window": "To je modalno okno", + "This modal can be closed by pressing the Escape key or activating the close button.": "To okno lahko zaprete s pritiskom na tipko Escape ali z aktiviranjem gumba za zapiranje.", + ", opens captions settings dialog": ", odpre nastavitve za zvočni zapis", + ", opens subtitles settings dialog": ", odpre nastavitve za podnapise", + ", opens descriptions settings dialog": ", odpre nastavitve za opis", + ", selected": ", izbrano", + "captions settings": "nastavitve zvočnega zapisa", + "subtitles settings": "nastavitve podnapisov", + "descriptions settings": "nastavitve opisa", + "Text": "Tekst", + "White": "Bela", + "Black": "Črna", + "Red": "Rdeča", + "Green": "Zelena", + "Blue": "Modra", + "Yellow": "Rumena", + "Magenta": "Magenta", + "Cyan": "Cian", + "Background": "Ozadje", + "Window": "Okno", + "Transparent": "Prozorno", + "Semi-Transparent": "Delno prozorno", + "Opaque": "Neprozorno", + "Font Size": "Velikost pisave", + "Text Edge Style": "Slog roba besedila", + "None": "Brez", + "Raised": "Dvignjeno", + "Depressed": "Vtisnjeno", + "Uniform": "Enakomerno", + "Dropshadow": "S senco", + "Font Family": "Družina pisave", + "Small Caps": "Male črke", + "Reset": "Ponastavi", + "restore all settings to the default values": "obnovi vse nastavitve na privzete vrednosti", + "Done": "Končano", + "Caption Settings Dialog": "Pogovorno okno za nastavitve zvočnega zapisa", + "Beginning of dialog window. Escape will cancel and close the window.": "Začetek pogovornega okna. Escape bo preklical in zaprl okno.", + "End of dialog window.": "Konec pogovornega okna.", + "{1} is loading.": "{1} se nalaga.", + "Exit Picture-in-Picture": "Izhod iz slike v sliki", + "Picture-in-Picture": "Slika v sliki" +}); \ No newline at end of file diff --git a/js/libs/videojs/lang/sl.json b/js/libs/videojs/lang/sl.json new file mode 100644 index 00000000..0ddc50cb --- /dev/null +++ b/js/libs/videojs/lang/sl.json @@ -0,0 +1,83 @@ +{ + "Audio Player": "Avdio predvajalnik", + "Video Player": "Video predvajalnik", + "Play": "Predvajaj", + "Pause": "Začasno ustavi", + "Replay": "Predvajaj ponovno", + "Current Time": "Trenutni čas", + "Duration": "Trajanje", + "Remaining Time": "Preostali čas", + "Stream Type": "Vrsta podatkovnega toka", + "LIVE": "V ŽIVO", + "Seek to live, currently behind live": "Spremljaj v živo (trenutno v zaostanku)", + "Seek to live, currently playing live": "Spremljaj v živo (trenutno v živo)", + "Loaded": "Naloženo", + "Progress": "Napredek", + "Progress Bar": "Vrstica napredka", + "progress bar timing: currentTime={1} duration={2}": "{1} od {2}", + "Fullscreen": "Celozaslonski prikaz", + "Non-Fullscreen": "Prikaz na delu zaslona", + "Mute": "Izključi zvok", + "Unmute": "Vključi zvok", + "Playback Rate": "Hitrost predvajanja", + "Subtitles": "Podnapisi", + "subtitles off": "podnapisi izklopljeni", + "Captions": "Zvočni zapis", + "captions off": "zvočni zapis izklopljen", + "Chapters": "Poglavja", + "Descriptions": "Opisi", + "descriptions off": "opisi izklopljeni", + "Audio Track": "Zvočni posnetek", + "Volume Level": "Raven glasnosti", + "You aborted the media playback": "Prekinili ste predvajanje.", + "A network error caused the media download to fail part-way.": "Prenos multimedijske datoteke ni uspel zaradi napake v omrežju.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Multimedijske datoteke ni bilo mogoče naložiti zaradi napake na strežniku oziroma omrežju ali ker ta oblika ni podprta.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Predvajanje datoteke je bilo prekinjeno zaradi napak v datoteki ali ker uporablja funkcije, ki jih brskalnik ne podpira.", + "No compatible source was found for this media.": "Za to datoteko ni bil najden noben združljiv vir.", + "The media is encrypted and we do not have the keys to decrypt it.": "Datoteka je šifrirana in predvajalnik nima ključev za njeno dešifriranje.", + "Play Video": "Predvajaj", + "Close": "Zapri", + "Close Modal Dialog": "Zapri modalno okno", + "Modal Window": "Modalno okno", + "This is a modal window": "To je modalno okno", + "This modal can be closed by pressing the Escape key or activating the close button.": "To okno lahko zaprete s pritiskom na tipko Escape ali z aktiviranjem gumba za zapiranje.", + ", opens captions settings dialog": ", odpre nastavitve za zvočni zapis", + ", opens subtitles settings dialog": ", odpre nastavitve za podnapise", + ", opens descriptions settings dialog": ", odpre nastavitve za opis", + ", selected": ", izbrano", + "captions settings": "nastavitve zvočnega zapisa", + "subtitles settings": "nastavitve podnapisov", + "descriptions settings": "nastavitve opisa", + "Text": "Tekst", + "White": "Bela", + "Black": "Črna", + "Red": "Rdeča", + "Green": "Zelena", + "Blue": "Modra", + "Yellow": "Rumena", + "Magenta": "Magenta", + "Cyan": "Cian", + "Background": "Ozadje", + "Window": "Okno", + "Transparent": "Prozorno", + "Semi-Transparent": "Delno prozorno", + "Opaque": "Neprozorno", + "Font Size": "Velikost pisave", + "Text Edge Style": "Slog roba besedila", + "None": "Brez", + "Raised": "Dvignjeno", + "Depressed": "Vtisnjeno", + "Uniform": "Enakomerno", + "Dropshadow": "S senco", + "Font Family": "Družina pisave", + "Small Caps": "Male črke", + "Reset": "Ponastavi", + "restore all settings to the default values": "obnovi vse nastavitve na privzete vrednosti", + "Done": "Končano", + "Caption Settings Dialog": "Pogovorno okno za nastavitve zvočnega zapisa", + "Beginning of dialog window. Escape will cancel and close the window.": "Začetek pogovornega okna. Escape bo preklical in zaprl okno.", + "End of dialog window.": "Konec pogovornega okna.", + "{1} is loading.": "{1} se nalaga.", + "Exit Picture-in-Picture": "Izhod iz slike v sliki", + "Picture-in-Picture": "Slika v sliki" +} diff --git a/js/libs/videojs/lang/sr.js b/js/libs/videojs/lang/sr.js index 7c042b26..ba81d4dd 100644 --- a/js/libs/videojs/lang/sr.js +++ b/js/libs/videojs/lang/sr.js @@ -1,26 +1,26 @@ -videojs.addLanguage("sr",{ - "Play": "Pusti", - "Pause": "Pauza", - "Current Time": "Trenutno vrijeme", - "Duration Time": "Vrijeme trajanja", - "Remaining Time": "Preostalo vrijeme", - "Stream Type": "Način strimovanja", - "LIVE": "UŽIVO", - "Loaded": "Učitan", - "Progress": "Progres", - "Fullscreen": "Puni ekran", - "Non-Fullscreen": "Mali ekran", - "Mute": "Prigušen", - "Unmute": "Ne-prigušen", - "Playback Rate": "Stopa reprodukcije", - "Subtitles": "Podnaslov", - "subtitles off": "Podnaslov deaktiviran", - "Captions": "Titlovi", - "captions off": "Titlovi deaktivirani", - "Chapters": "Poglavlja", - "You aborted the media playback": "Isključili ste reprodukciju videa.", - "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili je format ne podržan.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", - "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." +videojs.addLanguage('sr', { + "Play": "Pusti", + "Pause": "Pauza", + "Current Time": "Trenutno vreme", + "Duration": "Vreme trajanja", + "Remaining Time": "Preostalo vreme", + "Stream Type": "Način strimovanja", + "LIVE": "UŽIVO", + "Loaded": "Učitan", + "Progress": "Progres", + "Fullscreen": "Pun ekran", + "Non-Fullscreen": "Mali ekran", + "Mute": "Prigušen", + "Unmute": "Ne-prigušen", + "Playback Rate": "Stopa reprodukcije", + "Subtitles": "Podnaslov", + "subtitles off": "Podnaslov deaktiviran", + "Captions": "Titlovi", + "captions off": "Titlovi deaktivirani", + "Chapters": "Poglavlja", + "You aborted the media playback": "Isključili ste reprodukciju videa.", + "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili format nije podržan.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", + "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/sr.json b/js/libs/videojs/lang/sr.json new file mode 100644 index 00000000..512466c8 --- /dev/null +++ b/js/libs/videojs/lang/sr.json @@ -0,0 +1,26 @@ +{ + "Play": "Pusti", + "Pause": "Pauza", + "Current Time": "Trenutno vreme", + "Duration": "Vreme trajanja", + "Remaining Time": "Preostalo vreme", + "Stream Type": "Način strimovanja", + "LIVE": "UŽIVO", + "Loaded": "Učitan", + "Progress": "Progres", + "Fullscreen": "Pun ekran", + "Non-Fullscreen": "Mali ekran", + "Mute": "Prigušen", + "Unmute": "Ne-prigušen", + "Playback Rate": "Stopa reprodukcije", + "Subtitles": "Podnaslov", + "subtitles off": "Podnaslov deaktiviran", + "Captions": "Titlovi", + "captions off": "Titlovi deaktivirani", + "Chapters": "Poglavlja", + "You aborted the media playback": "Isključili ste reprodukciju videa.", + "A network error caused the media download to fail part-way.": "Video se prestao preuzimati zbog greške na mreži.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video se ne može reproducirati zbog servera, greške u mreži ili format nije podržan.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Reprodukcija videa je zaustavljenja zbog greške u formatu ili zbog verzije vašeg pretraživača.", + "No compatible source was found for this media.": "Nije nađen nijedan kompatibilan izvor ovog videa." +} diff --git a/js/libs/videojs/lang/sv.js b/js/libs/videojs/lang/sv.js index 48ea77b0..71422ef0 100644 --- a/js/libs/videojs/lang/sv.js +++ b/js/libs/videojs/lang/sv.js @@ -1,26 +1,87 @@ -videojs.addLanguage("sv",{ - "Play": "Spela", - "Pause": "Pausa", - "Current Time": "Aktuell tid", - "Duration Time": "Total tid", - "Remaining Time": "Återstående tid", - "Stream Type": "Strömningstyp", - "LIVE": "LIVE", - "Loaded": "Laddad", - "Progress": "Förlopp", - "Fullscreen": "Fullskärm", - "Non-Fullscreen": "Ej fullskärm", - "Mute": "Ljud av", - "Unmute": "Ljud på", - "Playback Rate": "Uppspelningshastighet", - "Subtitles": "Text på", - "subtitles off": "Text av", - "Captions": "Text på", - "captions off": "Text av", - "Chapters": "Kapitel", - "You aborted the media playback": "Du har avbrutit videouppspelningen.", - "A network error caused the media download to fail part-way.": "Ett nätverksfel gjorde att nedladdningen av videon avbröts.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Det gick inte att ladda videon, antingen på grund av ett server- eller nätverksfel, eller för att formatet inte stöds.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Uppspelningen avbröts på grund av att videon är skadad, eller också för att videon använder funktioner som din webbläsare inte stöder.", - "No compatible source was found for this media.": "Det gick inte att hitta någon kompatibel källa för den här videon." +videojs.addLanguage('sv', { + ", opens captions settings dialog": ", öppnar dialogruta för textning", + ", opens descriptions settings dialog": ", öppnar dialogruta för inställningar", + ", opens subtitles settings dialog": ", öppnar dialogruta för undertexter", + ", selected": ", vald", + "A network error caused the media download to fail part-way.": "Ett nätverksfel gjorde att nedladdningen av videon avbröts.", + "Audio Player": "Ljudspelare", + "Audio Track": "Ljudspår", + "Background": "Bakgrund", + "Beginning of dialog window. Escape will cancel and close the window.": "Början av dialogfönster. Escape avbryter och stänger fönstret.", + "Black": "Svart", + "Blue": "Blå", + "Caption Settings Dialog": "Dialogruta för textningsinställningar", + "Captions": "Text på", + "Casual": "Casual", + "Chapters": "Kapitel", + "Close": "Stäng", + "Close Modal Dialog": "Stäng dialogruta", + "Current Time": "Aktuell tid", + "Cyan": "Cyan", + "Depressed": "Deprimerad", + "Descriptions": "Beskrivningar", + "Done": "Klar", + "Dropshadow": "DropSkugga", + "Duration": "Total tid", + "End of dialog window.": "Slutet av dialogfönster.", + "Font Family": "Typsnittsfamilj", + "Font Size": "Textstorlek", + "Fullscreen": "Fullskärm", + "Green": "Grön", + "LIVE": "LIVE", + "Loaded": "Laddad", + "Magenta": "Magenta", + "Modal Window": "dialogruta", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Monospace Serif": "Monospace Serif", + "Mute": "Ljud av", + "No compatible source was found for this media.": "Det gick inte att hitta någon kompatibel källa för den här videon.", + "Non-Fullscreen": "Ej fullskärm", + "None": "Ingen", + "Opaque": "Opak", + "Pause": "Pausa", + "Play": "Spela", + "Play Video": "Spela upp video", + "Playback Rate": "Uppspelningshastighet", + "Progress": "Förlopp", + "Progress Bar": "förloppsmätare", + "Proportional Sans-Serif": "Proportionell Sans-Serif", + "Proportional Serif": "Proportionell Serif", + "Raised": "Raised", + "Red": "Röd", + "Remaining Time": "Återstående tid", + "Replay": "Spela upp igen", + "Reset": "Återställ", + "Script": "Manus", + "Seek to live, currently behind live": "Återgå till live, uppspelningen är inte live", + "Seek to live, currently playing live": "Återgå till live, uppspelningen är live", + "Semi-Transparent": "Semi-transparent", + "Small Caps": "Small-Caps", + "Stream Type": "Strömningstyp", + "Subtitles": "Text på", + "Text": "Text", + "Text Edge Style": "Textkantstil", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Det gick inte att ladda videon, antingen på grund av ett server- eller nätverksfel, eller för att formatet inte stöds.", + "The media is encrypted and we do not have the keys to decrypt it.": "Mediat är krypterat och vi har inte nycklarna för att dekryptera det.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Uppspelningen avbröts på grund av att videon är skadad, eller också för att videon använder funktioner som din webbläsare inte stöder.", + "This is a modal window": "Det här är ett dialogruta", + "This modal can be closed by pressing the Escape key or activating the close button.": "Den här dialogrutan kan stängas genom att trycka på Escape-tangenten eller stäng knappen.", + "Transparent": "Transparent", + "Uniform": "Uniform", + "Unmute": "Ljud på", + "Video Player": "Videospelare", + "Volume Level": "Volymnivå", + "White": "Vit", + "Window": "Fönster", + "Yellow": "Gul", + "You aborted the media playback": "Du har avbrutit videouppspelningen.", + "captions off": "Text av", + "captions settings": "textningsinställningar", + "descriptions off": "beskrivningar av", + "descriptions settings": "beskrivningsinställningar", + "progress bar timing: currentTime={1} duration={2}": "{1} av {2}", + "restore all settings to the default values": "återställ alla inställningar till standardvärden", + "subtitles off": "Text av", + "subtitles settings": "undertextsinställningar", + "{1} is loading.": "{1} laddar." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/sv.json b/js/libs/videojs/lang/sv.json new file mode 100644 index 00000000..dc020f2f --- /dev/null +++ b/js/libs/videojs/lang/sv.json @@ -0,0 +1,87 @@ +{ + ", opens captions settings dialog": ", öppnar dialogruta för textning", + ", opens descriptions settings dialog": ", öppnar dialogruta för inställningar", + ", opens subtitles settings dialog": ", öppnar dialogruta för undertexter", + ", selected": ", vald", + "A network error caused the media download to fail part-way.": "Ett nätverksfel gjorde att nedladdningen av videon avbröts.", + "Audio Player": "Ljudspelare", + "Audio Track": "Ljudspår", + "Background": "Bakgrund", + "Beginning of dialog window. Escape will cancel and close the window.": "Början av dialogfönster. Escape avbryter och stänger fönstret.", + "Black": "Svart", + "Blue": "Blå", + "Caption Settings Dialog": "Dialogruta för textningsinställningar", + "Captions": "Text på", + "Casual": "Casual", + "Chapters": "Kapitel", + "Close": "Stäng", + "Close Modal Dialog": "Stäng dialogruta", + "Current Time": "Aktuell tid", + "Cyan": "Cyan", + "Depressed": "Deprimerad", + "Descriptions": "Beskrivningar", + "Done": "Klar", + "Dropshadow": "DropSkugga", + "Duration": "Total tid", + "End of dialog window.": "Slutet av dialogfönster.", + "Font Family": "Typsnittsfamilj", + "Font Size": "Textstorlek", + "Fullscreen": "Fullskärm", + "Green": "Grön", + "LIVE": "LIVE", + "Loaded": "Laddad", + "Magenta": "Magenta", + "Modal Window": "dialogruta", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Monospace Serif": "Monospace Serif", + "Mute": "Ljud av", + "No compatible source was found for this media.": "Det gick inte att hitta någon kompatibel källa för den här videon.", + "Non-Fullscreen": "Ej fullskärm", + "None": "Ingen", + "Opaque": "Opak", + "Pause": "Pausa", + "Play": "Spela", + "Play Video": "Spela upp video", + "Playback Rate": "Uppspelningshastighet", + "Progress": "Förlopp", + "Progress Bar": "förloppsmätare", + "Proportional Sans-Serif": "Proportionell Sans-Serif", + "Proportional Serif": "Proportionell Serif", + "Raised": "Raised", + "Red": "Röd", + "Remaining Time": "Återstående tid", + "Replay": "Spela upp igen", + "Reset": "Återställ", + "Script": "Manus", + "Seek to live, currently behind live": "Återgå till live, uppspelningen är inte live", + "Seek to live, currently playing live": "Återgå till live, uppspelningen är live", + "Semi-Transparent": "Semi-transparent", + "Small Caps": "Small-Caps", + "Stream Type": "Strömningstyp", + "Subtitles": "Text på", + "Text": "Text", + "Text Edge Style": "Textkantstil", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Det gick inte att ladda videon, antingen på grund av ett server- eller nätverksfel, eller för att formatet inte stöds.", + "The media is encrypted and we do not have the keys to decrypt it.": "Mediat är krypterat och vi har inte nycklarna för att dekryptera det.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Uppspelningen avbröts på grund av att videon är skadad, eller också för att videon använder funktioner som din webbläsare inte stöder.", + "This is a modal window": "Det här är ett dialogruta", + "This modal can be closed by pressing the Escape key or activating the close button.": "Den här dialogrutan kan stängas genom att trycka på Escape-tangenten eller stäng knappen.", + "Transparent": "Transparent", + "Uniform": "Uniform", + "Unmute": "Ljud på", + "Video Player": "Videospelare", + "Volume Level": "Volymnivå", + "White": "Vit", + "Window": "Fönster", + "Yellow": "Gul", + "You aborted the media playback": "Du har avbrutit videouppspelningen.", + "captions off": "Text av", + "captions settings": "textningsinställningar", + "descriptions off": "beskrivningar av", + "descriptions settings": "beskrivningsinställningar", + "progress bar timing: currentTime={1} duration={2}": "{1} av {2}", + "restore all settings to the default values": "återställ alla inställningar till standardvärden", + "subtitles off": "Text av", + "subtitles settings": "undertextsinställningar", + "{1} is loading.": "{1} laddar." +} diff --git a/js/libs/videojs/lang/th.js b/js/libs/videojs/lang/th.js new file mode 100644 index 00000000..63ac6886 --- /dev/null +++ b/js/libs/videojs/lang/th.js @@ -0,0 +1,89 @@ +videojs.addLanguage('th', { + "Audio Player": "โปรแกรมเล่นเสียง", + "Video Player": "โปรแกรมเล่นวิดีโอ", + "Play": "เล่น", + "Pause": "หยุดชั่วคราว", + "Replay": "เล่นซ้ำ", + "Current Time": "เวลาปัจจุบัน", + "Duration": "ระยะเวลา", + "Remaining Time": "เวลาที่เหลือ", + "Stream Type": "ประเภทของสตรีม", + "LIVE": "ถ่ายทอดสด", + "Seek to live, currently behind live": "หาโอกาสที่จะถ่ายทอดสด กำลังอยู่เบื้องหลังการถ่ายทอดสดในขณะนี้", + "Seek to live, currently playing live": "หาโอกาสที่จะถ่ายทอดสด กำลังเล่นแบบสดในขณะนี้", + "Loaded": "โหลดแล้ว", + "Progress": "ความคืบหน้า", + "Progress Bar": "แถบแสดงความคืบหน้า", + "progress bar timing: currentTime={1} duration={2}": "{1} ของ {2}", + "Fullscreen": "แบบเต็มหน้าจอ", + "Non-Fullscreen": "ไม่ใช่แบบเต็มหน้าจอ", + "Mute": "ปิดเสียง", + "Unmute": "ยกเลิกการปิดเสียง", + "Playback Rate": "อัตราการเล่น", + "Subtitles": "คำบรรยาย", + "subtitles off": "ปิดคำบรรยาย", + "Captions": "คำอธิบายภาพ", + "captions off": "ปิดคำอธิบายภาพ", + "Chapters": "บท", + "Descriptions": "คำอธิบาย", + "descriptions off": "ปิดคำอธิบาย", + "Audio Track": "แทร็กเสียง", + "Volume Level": "ระดับเสียง", + "You aborted the media playback": "คุณยกเลิกการเล่นสื่อแล้ว", + "A network error caused the media download to fail part-way.": "ข้อผิดพลาดของเครือข่ายทำให้การดาวน์โหลดสื่อไม่สำเร็จเป็นบางส่วน", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "ไม่สามารถโหลดสื่อได้ โดยอาจเป็นเพราะเซิร์ฟเวอร์หรือเครือข่ายล้มเหลว หรือเพราะรูปแบบไม่ได้รับการรองรับ", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "การเล่นสื่อถูกยกเลิกเนื่องจากปัญหาเกี่ยวกับความเสียหาย หรือเนื่องจากสื่อใช้ฟีเจอร์ที่เบราว์เซอร์ของคุณไม่รองรับ", + "No compatible source was found for this media.": "ไม่พบแหล่งที่เข้ากันได้สำหรับสื่อนี้", + "The media is encrypted and we do not have the keys to decrypt it.": "สื่อถูกเข้ารหัสลับแล้ว และเราไม่มีคีย์ที่จะถอดรหัสลับดังกล่าว", + "Play Video": "เล่นวิดีโอ", + "Close": "ปิด", + "Close Modal Dialog": "ปิดกล่องโต้ตอบโมดอล", + "Modal Window": "หน้าต่างโมดอล", + "This is a modal window": "รายการนี้เป็นหน้าต่างโมดอล", + "This modal can be closed by pressing the Escape key or activating the close button.": "คุณสามารถปิดโมดอลนี้โดยกดปุ่ม Escape หรือเปิดใช้งานปุ่มปิด", + ", opens captions settings dialog": ", เปิดกล่องโต้ตอบการตั้งค่าคำอธิบายภาพ", + ", opens subtitles settings dialog": ", เปิดกล่องโต้ตอบการตั้งค่าคำบรรยาย", + ", opens descriptions settings dialog": ", เปิดกล่องโต้ตอบการตั้งค่าคำอธิบาย", + ", selected": ", เลือกแล้ว", + "captions settings": "การตั้งค่าคำอธิบายภาพ", + "subtitles settings": "การตั้งค่าคำบรรยาย", + "descriptions settings": "การตั้งค่าคำอธิบาย", + "Text": "ข้อความ", + "White": "สีขาว", + "Black": "สีดำ", + "Red": "สีแดง", + "Green": "สีเขียว", + "Blue": "สีน้ำเงิน", + "Yellow": "สีเหลือง", + "Magenta": "สีม่วงแดง", + "Cyan": "สีน้ำเงินอมเขียว", + "Background": "พื้นหลัง", + "Window": "หน้าต่าง", + "Transparent": "โปร่งใส", + "Semi-Transparent": "กึ่งโปร่งใส", + "Opaque": "ทึบ", + "Font Size": "ขนาดแบบอักษร", + "Text Edge Style": "ลักษณะขอบข้อความ", + "None": "ไม่มี", + "Raised": "ยกขึ้น", + "Depressed": "ปล่อยออก", + "Uniform": "รูปแบบ", + "Dropshadow": "เพิ่มเงา", + "Font Family": "ตระกูลแบบอักษร", + "Proportional Sans-Serif": "Sans-Serif ตามสัดส่วน", + "Monospace Sans-Serif": "Sans-Serif ช่องว่างเดี่ยว", + "Proportional Serif": "Serif ตามสัดส่วน", + "Monospace Serif": "Serif ช่องว่างเดี่ยว", + "Casual": "ไม่เป็นทางการ", + "Script": "สคริปต์", + "Small Caps": "ตัวพิมพ์ใหญ่ขนาดเล็ก", + "Reset": "รีเซ็ต", + "restore all settings to the default values": "คืนค่าการตั้งค่าท้้งหมดให้เป็นค่าเริ่มต้น", + "Done": "เสร็จสิ้น", + "Caption Settings Dialog": "กล่องโต้ตอบการตั้งค่าคำอธิบายภาพ", + "Beginning of dialog window. Escape will cancel and close the window.": "การเริ่มต้นหน้าต่างกล่องโต้ตอบ Escape จะยกเลิกและปิดหน้าต่าง", + "End of dialog window.": "สิ้นสุดหน้าต่างกล่องโต้ตอบ", + "{1} is loading.": "กำลังโหลด {1}", + "Exit Picture-in-Picture": "ออกจากการเล่นภาพควบคู่", + "Picture-in-Picture": "การเล่นภาพควบคู่" +}); \ No newline at end of file diff --git a/js/libs/videojs/lang/th.json b/js/libs/videojs/lang/th.json new file mode 100644 index 00000000..2347145f --- /dev/null +++ b/js/libs/videojs/lang/th.json @@ -0,0 +1,89 @@ +{ + "Audio Player": "โปรแกรมเล่นเสียง", + "Video Player": "โปรแกรมเล่นวิดีโอ", + "Play": "เล่น", + "Pause": "หยุดชั่วคราว", + "Replay": "เล่นซ้ำ", + "Current Time": "เวลาปัจจุบัน", + "Duration": "ระยะเวลา", + "Remaining Time": "เวลาที่เหลือ", + "Stream Type": "ประเภทของสตรีม", + "LIVE": "ถ่ายทอดสด", + "Seek to live, currently behind live": "หาโอกาสที่จะถ่ายทอดสด กำลังอยู่เบื้องหลังการถ่ายทอดสดในขณะนี้", + "Seek to live, currently playing live": "หาโอกาสที่จะถ่ายทอดสด กำลังเล่นแบบสดในขณะนี้", + "Loaded": "โหลดแล้ว", + "Progress": "ความคืบหน้า", + "Progress Bar": "แถบแสดงความคืบหน้า", + "progress bar timing: currentTime={1} duration={2}": "{1} ของ {2}", + "Fullscreen": "แบบเต็มหน้าจอ", + "Non-Fullscreen": "ไม่ใช่แบบเต็มหน้าจอ", + "Mute": "ปิดเสียง", + "Unmute": "ยกเลิกการปิดเสียง", + "Playback Rate": "อัตราการเล่น", + "Subtitles": "คำบรรยาย", + "subtitles off": "ปิดคำบรรยาย", + "Captions": "คำอธิบายภาพ", + "captions off": "ปิดคำอธิบายภาพ", + "Chapters": "บท", + "Descriptions": "คำอธิบาย", + "descriptions off": "ปิดคำอธิบาย", + "Audio Track": "แทร็กเสียง", + "Volume Level": "ระดับเสียง", + "You aborted the media playback": "คุณยกเลิกการเล่นสื่อแล้ว", + "A network error caused the media download to fail part-way.": "ข้อผิดพลาดของเครือข่ายทำให้การดาวน์โหลดสื่อไม่สำเร็จเป็นบางส่วน", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "ไม่สามารถโหลดสื่อได้ โดยอาจเป็นเพราะเซิร์ฟเวอร์หรือเครือข่ายล้มเหลว หรือเพราะรูปแบบไม่ได้รับการรองรับ", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "การเล่นสื่อถูกยกเลิกเนื่องจากปัญหาเกี่ยวกับความเสียหาย หรือเนื่องจากสื่อใช้ฟีเจอร์ที่เบราว์เซอร์ของคุณไม่รองรับ", + "No compatible source was found for this media.": "ไม่พบแหล่งที่เข้ากันได้สำหรับสื่อนี้", + "The media is encrypted and we do not have the keys to decrypt it.": "สื่อถูกเข้ารหัสลับแล้ว และเราไม่มีคีย์ที่จะถอดรหัสลับดังกล่าว", + "Play Video": "เล่นวิดีโอ", + "Close": "ปิด", + "Close Modal Dialog": "ปิดกล่องโต้ตอบโมดอล", + "Modal Window": "หน้าต่างโมดอล", + "This is a modal window": "รายการนี้เป็นหน้าต่างโมดอล", + "This modal can be closed by pressing the Escape key or activating the close button.": "คุณสามารถปิดโมดอลนี้โดยกดปุ่ม Escape หรือเปิดใช้งานปุ่มปิด", + ", opens captions settings dialog": ", เปิดกล่องโต้ตอบการตั้งค่าคำอธิบายภาพ", + ", opens subtitles settings dialog": ", เปิดกล่องโต้ตอบการตั้งค่าคำบรรยาย", + ", opens descriptions settings dialog": ", เปิดกล่องโต้ตอบการตั้งค่าคำอธิบาย", + ", selected": ", เลือกแล้ว", + "captions settings": "การตั้งค่าคำอธิบายภาพ", + "subtitles settings": "การตั้งค่าคำบรรยาย", + "descriptions settings": "การตั้งค่าคำอธิบาย", + "Text": "ข้อความ", + "White": "สีขาว", + "Black": "สีดำ", + "Red": "สีแดง", + "Green": "สีเขียว", + "Blue": "สีน้ำเงิน", + "Yellow": "สีเหลือง", + "Magenta": "สีม่วงแดง", + "Cyan": "สีน้ำเงินอมเขียว", + "Background": "พื้นหลัง", + "Window": "หน้าต่าง", + "Transparent": "โปร่งใส", + "Semi-Transparent": "กึ่งโปร่งใส", + "Opaque": "ทึบ", + "Font Size": "ขนาดแบบอักษร", + "Text Edge Style": "ลักษณะขอบข้อความ", + "None": "ไม่มี", + "Raised": "ยกขึ้น", + "Depressed": "ปล่อยออก", + "Uniform": "รูปแบบ", + "Dropshadow": "เพิ่มเงา", + "Font Family": "ตระกูลแบบอักษร", + "Proportional Sans-Serif": "Sans-Serif ตามสัดส่วน", + "Monospace Sans-Serif": "Sans-Serif ช่องว่างเดี่ยว", + "Proportional Serif": "Serif ตามสัดส่วน", + "Monospace Serif": "Serif ช่องว่างเดี่ยว", + "Casual": "ไม่เป็นทางการ", + "Script": "สคริปต์", + "Small Caps": "ตัวพิมพ์ใหญ่ขนาดเล็ก", + "Reset": "รีเซ็ต", + "restore all settings to the default values": "คืนค่าการตั้งค่าท้้งหมดให้เป็นค่าเริ่มต้น", + "Done": "เสร็จสิ้น", + "Caption Settings Dialog": "กล่องโต้ตอบการตั้งค่าคำอธิบายภาพ", + "Beginning of dialog window. Escape will cancel and close the window.": "การเริ่มต้นหน้าต่างกล่องโต้ตอบ Escape จะยกเลิกและปิดหน้าต่าง", + "End of dialog window.": "สิ้นสุดหน้าต่างกล่องโต้ตอบ", + "{1} is loading.": "กำลังโหลด {1}", + "Exit Picture-in-Picture": "ออกจากการเล่นภาพควบคู่", + "Picture-in-Picture": "การเล่นภาพควบคู่" +} \ No newline at end of file diff --git a/js/libs/videojs/lang/tr.js b/js/libs/videojs/lang/tr.js index 641a27ba..f9edfeb7 100644 --- a/js/libs/videojs/lang/tr.js +++ b/js/libs/videojs/lang/tr.js @@ -1,76 +1,76 @@ -videojs.addLanguage("tr",{ - "Play": "Oynat", - "Pause": "Duraklat", - "Replay": "Yeniden Oynat", - "Current Time": "Süre", - "Duration Time": "Toplam Süre", - "Remaining Time": "Kalan Süre", - "Stream Type": "Yayın Tipi", - "LIVE": "CANLI", - "Loaded": "Yüklendi", - "Progress": "Yükleniyor", - "Fullscreen": "Tam Ekran", - "Non-Fullscreen": "Küçük Ekran", - "Mute": "Ses Kapa", - "Unmute": "Ses Aç", - "Playback Rate": "Oynatma Hızı", - "Subtitles": "Altyazı", - "subtitles off": "Altyazı Kapalı", - "Captions": "Altyazı", - "captions off": "Altyazı Kapalı", - "Chapters": "Bölümler", - "Close Modal Dialog": "Dialogu Kapat", - "Descriptions": "Açıklamalar", - "descriptions off": "Açıklamalar kapalı", - "Audio Track": "Ses Dosyası", - "You aborted the media playback": "Video oynatmayı iptal ettiniz", - "A network error caused the media download to fail part-way.": "Video indirilirken bağlantı sorunu oluştu.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video oynatılamadı, ağ ya da sunucu hatası veya belirtilen format desteklenmiyor.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Tarayıcınız desteklemediği için videoda hata oluştu.", - "No compatible source was found for this media.": "Video için kaynak bulunamadı.", - "The media is encrypted and we do not have the keys to decrypt it.": "Video, şifrelenmiş bir kaynaktan geliyor ve oynatmak için gerekli anahtar bulunamadı.", - "Play Video": "Videoyu Oynat", - "Close": "Kapat", - "Modal Window": "Modal Penceresi", - "This is a modal window": "Bu bir modal penceresidir", - "This modal can be closed by pressing the Escape key or activating the close button.": "Bu modal ESC tuşuna basarak ya da kapata tıklanarak kapatılabilir.", - ", opens captions settings dialog": ", altyazı ayarları menüsünü açar", - ", opens subtitles settings dialog": ", altyazı ayarları menüsünü açar", - ", opens descriptions settings dialog": ", açıklama ayarları menüsünü açar", - ", selected": ", seçildi", - "captions settings": "altyazı ayarları", - "subtitles settings": "altyazı ayarları", - "descriptions settings": "açıklama ayarları", - "Text": "Yazı", - "White": "Beyaz", - "Black": "Siyah", - "Red": "Kırmızı", - "Green": "Yeşil", - "Blue": "Mavi", - "Yellow": "Sarı", - "Magenta": "Macenta", - "Cyan": "Açık Mavi (Camgöbeği)", - "Background": "Arka plan", - "Window": "Pencere", - "Transparent": "Saydam", - "Semi-Transparent": "Yarı-Saydam", - "Opaque": "Mat", - "Font Size": "Yazı Boyutu", - "Text Edge Style": "Yazı Kenarlıkları", - "None": "Hiçbiri", - "Raised": "Kabartılmış", - "Depressed": "Yassı", - "Uniform": "Düz", - "Dropshadow": "Gölgeli", - "Font Family": "Yazı Tipi", - "Proportional Sans-Serif": "Orantılı Sans-Serif", - "Monospace Sans-Serif": "Eşaralıklı Sans-Serif", - "Proportional Serif": "Orantılı Serif", - "Monospace Serif": "Eşaralıklı Serif", - "Casual": "Gündelik", - "Script": "El Yazısı", - "Small Caps": "Küçük Boyutlu Büyük Harfli", - "Done": "Tamam", - "Caption Settings Dialog": "Altyazı Ayarları Menüsü", - "Beginning of dialog window. Escape will cancel and close the window.": "Diyalog penceresinin başlangıcı. ESC tuşu işlemi iptal edip pencereyi kapatacaktır." +videojs.addLanguage('tr', { + "Play": "Oynat", + "Pause": "Duraklat", + "Replay": "Yeniden Oynat", + "Current Time": "Süre", + "Duration": "Toplam Süre", + "Remaining Time": "Kalan Süre", + "Stream Type": "Yayın Tipi", + "LIVE": "CANLI", + "Loaded": "Yüklendi", + "Progress": "Yükleniyor", + "Fullscreen": "Tam Ekran", + "Non-Fullscreen": "Küçük Ekran", + "Mute": "Ses Kapa", + "Unmute": "Ses Aç", + "Playback Rate": "Oynatma Hızı", + "Subtitles": "Altyazı", + "subtitles off": "Altyazı Kapalı", + "Captions": "Altyazı", + "captions off": "Altyazı Kapalı", + "Chapters": "Bölümler", + "Close Modal Dialog": "Dialogu Kapat", + "Descriptions": "Açıklamalar", + "descriptions off": "Açıklamalar kapalı", + "Audio Track": "Ses Dosyası", + "You aborted the media playback": "Video oynatmayı iptal ettiniz", + "A network error caused the media download to fail part-way.": "Video indirilirken bağlantı sorunu oluştu.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video oynatılamadı, ağ ya da sunucu hatası veya belirtilen format desteklenmiyor.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Tarayıcınız desteklemediği için videoda hata oluştu.", + "No compatible source was found for this media.": "Video için kaynak bulunamadı.", + "The media is encrypted and we do not have the keys to decrypt it.": "Video, şifrelenmiş bir kaynaktan geliyor ve oynatmak için gerekli anahtar bulunamadı.", + "Play Video": "Videoyu Oynat", + "Close": "Kapat", + "Modal Window": "Modal Penceresi", + "This is a modal window": "Bu bir modal penceresidir", + "This modal can be closed by pressing the Escape key or activating the close button.": "Bu modal ESC tuşuna basarak ya da kapata tıklanarak kapatılabilir.", + ", opens captions settings dialog": ", altyazı ayarları menüsünü açar", + ", opens subtitles settings dialog": ", altyazı ayarları menüsünü açar", + ", opens descriptions settings dialog": ", açıklama ayarları menüsünü açar", + ", selected": ", seçildi", + "captions settings": "altyazı ayarları", + "subtitles settings": "altyazı ayarları", + "descriptions settings": "açıklama ayarları", + "Text": "Yazı", + "White": "Beyaz", + "Black": "Siyah", + "Red": "Kırmızı", + "Green": "Yeşil", + "Blue": "Mavi", + "Yellow": "Sarı", + "Magenta": "Macenta", + "Cyan": "Açık Mavi (Camgöbeği)", + "Background": "Arka plan", + "Window": "Pencere", + "Transparent": "Saydam", + "Semi-Transparent": "Yarı-Saydam", + "Opaque": "Mat", + "Font Size": "Yazı Boyutu", + "Text Edge Style": "Yazı Kenarlıkları", + "None": "Hiçbiri", + "Raised": "Kabartılmış", + "Depressed": "Yassı", + "Uniform": "Düz", + "Dropshadow": "Gölgeli", + "Font Family": "Yazı Tipi", + "Proportional Sans-Serif": "Orantılı Sans-Serif", + "Monospace Sans-Serif": "Eşaralıklı Sans-Serif", + "Proportional Serif": "Orantılı Serif", + "Monospace Serif": "Eşaralıklı Serif", + "Casual": "Gündelik", + "Script": "El Yazısı", + "Small Caps": "Küçük Boyutlu Büyük Harfli", + "Done": "Tamam", + "Caption Settings Dialog": "Altyazı Ayarları Menüsü", + "Beginning of dialog window. Escape will cancel and close the window.": "Diyalog penceresinin başlangıcı. ESC tuşu işlemi iptal edip pencereyi kapatacaktır." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/tr.json b/js/libs/videojs/lang/tr.json new file mode 100644 index 00000000..07e18370 --- /dev/null +++ b/js/libs/videojs/lang/tr.json @@ -0,0 +1,76 @@ +{ + "Play": "Oynat", + "Pause": "Duraklat", + "Replay": "Yeniden Oynat", + "Current Time": "Süre", + "Duration": "Toplam Süre", + "Remaining Time": "Kalan Süre", + "Stream Type": "Yayın Tipi", + "LIVE": "CANLI", + "Loaded": "Yüklendi", + "Progress": "Yükleniyor", + "Fullscreen": "Tam Ekran", + "Non-Fullscreen": "Küçük Ekran", + "Mute": "Ses Kapa", + "Unmute": "Ses Aç", + "Playback Rate": "Oynatma Hızı", + "Subtitles": "Altyazı", + "subtitles off": "Altyazı Kapalı", + "Captions": "Altyazı", + "captions off": "Altyazı Kapalı", + "Chapters": "Bölümler", + "Close Modal Dialog": "Dialogu Kapat", + "Descriptions": "Açıklamalar", + "descriptions off": "Açıklamalar kapalı", + "Audio Track": "Ses Dosyası", + "You aborted the media playback": "Video oynatmayı iptal ettiniz", + "A network error caused the media download to fail part-way.": "Video indirilirken bağlantı sorunu oluştu.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video oynatılamadı, ağ ya da sunucu hatası veya belirtilen format desteklenmiyor.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Tarayıcınız desteklemediği için videoda hata oluştu.", + "No compatible source was found for this media.": "Video için kaynak bulunamadı.", + "The media is encrypted and we do not have the keys to decrypt it.": "Video, şifrelenmiş bir kaynaktan geliyor ve oynatmak için gerekli anahtar bulunamadı.", + "Play Video": "Videoyu Oynat", + "Close": "Kapat", + "Modal Window": "Modal Penceresi", + "This is a modal window": "Bu bir modal penceresidir", + "This modal can be closed by pressing the Escape key or activating the close button.": "Bu modal ESC tuşuna basarak ya da kapata tıklanarak kapatılabilir.", + ", opens captions settings dialog": ", altyazı ayarları menüsünü açar", + ", opens subtitles settings dialog": ", altyazı ayarları menüsünü açar", + ", opens descriptions settings dialog": ", açıklama ayarları menüsünü açar", + ", selected": ", seçildi", + "captions settings": "altyazı ayarları", + "subtitles settings": "altyazı ayarları", + "descriptions settings": "açıklama ayarları", + "Text": "Yazı", + "White": "Beyaz", + "Black": "Siyah", + "Red": "Kırmızı", + "Green": "Yeşil", + "Blue": "Mavi", + "Yellow": "Sarı", + "Magenta": "Macenta", + "Cyan": "Açık Mavi (Camgöbeği)", + "Background": "Arka plan", + "Window": "Pencere", + "Transparent": "Saydam", + "Semi-Transparent": "Yarı-Saydam", + "Opaque": "Mat", + "Font Size": "Yazı Boyutu", + "Text Edge Style": "Yazı Kenarlıkları", + "None": "Hiçbiri", + "Raised": "Kabartılmış", + "Depressed": "Yassı", + "Uniform": "Düz", + "Dropshadow": "Gölgeli", + "Font Family": "Yazı Tipi", + "Proportional Sans-Serif": "Orantılı Sans-Serif", + "Monospace Sans-Serif": "Eşaralıklı Sans-Serif", + "Proportional Serif": "Orantılı Serif", + "Monospace Serif": "Eşaralıklı Serif", + "Casual": "Gündelik", + "Script": "El Yazısı", + "Small Caps": "Küçük Boyutlu Büyük Harfli", + "Done": "Tamam", + "Caption Settings Dialog": "Altyazı Ayarları Menüsü", + "Beginning of dialog window. Escape will cancel and close the window.": "Diyalog penceresinin başlangıcı. ESC tuşu işlemi iptal edip pencereyi kapatacaktır." +} diff --git a/js/libs/videojs/lang/uk.js b/js/libs/videojs/lang/uk.js index c7f46a72..2d801feb 100644 --- a/js/libs/videojs/lang/uk.js +++ b/js/libs/videojs/lang/uk.js @@ -1,40 +1,85 @@ -videojs.addLanguage("uk",{ - "Play": "Відтворити", - "Pause": "Призупинити", - "Current Time": "Поточний час", - "Duration Time": "Тривалість", - "Remaining Time": "Час, що залишився", - "Stream Type": "Тип потоку", - "LIVE": "НАЖИВО", - "Loaded": "Завантаження", - "Progress": "Прогрес", - "Fullscreen": "Повноекранний режим", - "Non-Fullscreen": "Неповноекранний режим", - "Mute": "Без звуку", - "Unmute": "Зі звуком", - "Playback Rate": "Швидкість відтворення", - "Subtitles": "Субтитри", - "subtitles off": "Без субтитрів", - "Captions": "Підписи", - "captions off": "Без підписів", - "Chapters": "Розділи", - "Close Modal Dialog": "Закрити модальний діалог", - "Descriptions": "Описи", - "descriptions off": "Без описів", - "Audio Track": "Аудіодоріжка", - "You aborted the media playback": "Ви припинили відтворення відео", - "A network error caused the media download to fail part-way.": "Помилка мережі викликала збій під час завантаження відео.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Неможливо завантажити відео через мережевий чи серверний збій або формат не підтримується.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Відтворення відео було припинено через пошкодження або у зв'язку з тим, що відео використовує функції, які не підтримуються вашим браузером.", - "No compatible source was found for this media.": "Сумісні джерела для цього відео відсутні.", - "The media is encrypted and we do not have the keys to decrypt it.": "Відео в зашифрованому вигляді, і ми не маємо ключі для розшифровки.", - "Play Video": "Відтворити відео", - "Close": "Закрити", - "Modal Window": "Модальне вікно", - "This is a modal window": "Це модальне вікно.", - "This modal can be closed by pressing the Escape key or activating the close button.": "Модальне вікно можна закрити, натиснувши клавішу Esc або кнопку закриття вікна.", - ", opens captions settings dialog": ", відкриється діалогове вікно налаштування підписів", - ", opens subtitles settings dialog": ", відкриється діалогове вікно налаштування субтитрів", - ", opens descriptions settings dialog": ", відкриється діалогове вікно налаштування описів", - ", selected": ", обраний" +videojs.addLanguage('uk', { + "Audio Player": "Аудіопрогравач", + "Video Player": "Відеопрогравач", + "Play": "Відтворити", + "Pause": "Призупинити", + "Replay": "Відтворити знову", + "Current Time": "Поточний час", + "Duration": "Тривалість", + "Remaining Time": "Час, що залишився", + "Stream Type": "Тип потоку", + "LIVE": "НАЖИВО", + "Loaded": "Завантаження", + "Progress": "Прогрес", + "Progress Bar": "Індикатор завантаження", + "progress bar timing: currentTime={1} duration={2}": "{1} з {2}", + "Fullscreen": "Повноекранний режим", + "Non-Fullscreen": "Неповноекранний режим", + "Mute": "Без звуку", + "Unmute": "Зі звуком", + "Playback Rate": "Швидкість відтворення", + "Subtitles": "Субтитри", + "subtitles off": "Без субтитрів", + "Captions": "Підписи", + "captions off": "Без підписів", + "Chapters": "Розділи", + "Close Modal Dialog": "Закрити модальний діалог", + "Descriptions": "Описи", + "descriptions off": "Без описів", + "Audio Track": "Аудіодоріжка", + "Volume Level": "Рівень гучності", + "You aborted the media playback": "Ви припинили відтворення відео", + "A network error caused the media download to fail part-way.": "Помилка мережі викликала збій під час завантаження відео.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Неможливо завантажити відео через мережевий чи серверний збій або формат не підтримується.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Відтворення відео було припинено через пошкодження або у зв'язку з тим, що відео використовує функції, які не підтримуються вашим браузером.", + "No compatible source was found for this media.": "Сумісні джерела для цього відео відсутні.", + "The media is encrypted and we do not have the keys to decrypt it.": "Відео в зашифрованому вигляді, і ми не маємо ключі для розшифровки.", + "Play Video": "Відтворити відео", + "Close": "Закрити", + "Modal Window": "Модальне вікно", + "This is a modal window": "Це модальне вікно.", + "This modal can be closed by pressing the Escape key or activating the close button.": "Модальне вікно можна закрити, натиснувши клавішу Esc або кнопку закриття вікна.", + ", opens captions settings dialog": ", відкриється діалогове вікно налаштування підписів", + ", opens subtitles settings dialog": ", відкриється діалогове вікно налаштування субтитрів", + ", opens descriptions settings dialog": ", відкриється діалогове вікно налаштування описів", + ", selected": ", обраний", + "captions settings": "налаштування підписів", + "subtitles settings": "налаштування субтитрів", + "descriptions settings": "налаштування описів", + "Text": "Текст", + "White": "Білий", + "Black": "Чорний", + "Red": "Червоний", + "Green": "Зелений", + "Blue": "Синій", + "Yellow": "Жовтий", + "Magenta": "Пурпурний", + "Cyan": "Блакитний", + "Background": "Фон", + "Window": "Вікно", + "Transparent": "Прозорий", + "Semi-Transparent": "Напівпрозорий", + "Opaque": "Прозорість", + "Font Size": "Розмір шрифту", + "Text Edge Style": "Стиль краю тексту", + "None": "Нічого", + "Raised": "Піднятий", + "Depressed": "Знижений", + "Uniform": "Однаковий", + "Dropshadow": "Тінь", + "Font Family": "Шрифт", + "Proportional Sans-Serif": "Пропорційний без засічок", + "Monospace Sans-Serif": "Моноширинний без засічок", + "Proportional Serif": "Пропорційний із засічками", + "Monospace Serif": "Моноширинний із засічками", + "Casual": "Випадковий", + "Script": "Писемний", + "Small Caps": "Малі прописні", + "Reset": "Скинути", + "restore all settings to the default values": "скинути всі налаштування за замовчуванням", + "Done": "Готово", + "Caption Settings Dialog": "Діалог налаштувань підпису", + "Beginning of dialog window. Escape will cancel and close the window.": "Початок діалоговго вікна. Кнопка Escape закриє або скасує вікно", + "End of dialog window.": "Кінець діалогового вікна.", + "{1} is loading.": "{1} завантажується." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/uk.json b/js/libs/videojs/lang/uk.json new file mode 100644 index 00000000..17a840d8 --- /dev/null +++ b/js/libs/videojs/lang/uk.json @@ -0,0 +1,85 @@ +{ + "Audio Player": "Аудіопрогравач", + "Video Player": "Відеопрогравач", + "Play": "Відтворити", + "Pause": "Призупинити", + "Replay": "Відтворити знову", + "Current Time": "Поточний час", + "Duration": "Тривалість", + "Remaining Time": "Час, що залишився", + "Stream Type": "Тип потоку", + "LIVE": "НАЖИВО", + "Loaded": "Завантаження", + "Progress": "Прогрес", + "Progress Bar": "Індикатор завантаження", + "progress bar timing: currentTime={1} duration={2}": "{1} з {2}", + "Fullscreen": "Повноекранний режим", + "Non-Fullscreen": "Неповноекранний режим", + "Mute": "Без звуку", + "Unmute": "Зі звуком", + "Playback Rate": "Швидкість відтворення", + "Subtitles": "Субтитри", + "subtitles off": "Без субтитрів", + "Captions": "Підписи", + "captions off": "Без підписів", + "Chapters": "Розділи", + "Close Modal Dialog": "Закрити модальний діалог", + "Descriptions": "Описи", + "descriptions off": "Без описів", + "Audio Track": "Аудіодоріжка", + "Volume Level": "Рівень гучності", + "You aborted the media playback": "Ви припинили відтворення відео", + "A network error caused the media download to fail part-way.": "Помилка мережі викликала збій під час завантаження відео.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Неможливо завантажити відео через мережевий чи серверний збій або формат не підтримується.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Відтворення відео було припинено через пошкодження або у зв'язку з тим, що відео використовує функції, які не підтримуються вашим браузером.", + "No compatible source was found for this media.": "Сумісні джерела для цього відео відсутні.", + "The media is encrypted and we do not have the keys to decrypt it.": "Відео в зашифрованому вигляді, і ми не маємо ключі для розшифровки.", + "Play Video": "Відтворити відео", + "Close": "Закрити", + "Modal Window": "Модальне вікно", + "This is a modal window": "Це модальне вікно.", + "This modal can be closed by pressing the Escape key or activating the close button.": "Модальне вікно можна закрити, натиснувши клавішу Esc або кнопку закриття вікна.", + ", opens captions settings dialog": ", відкриється діалогове вікно налаштування підписів", + ", opens subtitles settings dialog": ", відкриється діалогове вікно налаштування субтитрів", + ", opens descriptions settings dialog": ", відкриється діалогове вікно налаштування описів", + ", selected": ", обраний", + "captions settings": "налаштування підписів", + "subtitles settings": "налаштування субтитрів", + "descriptions settings": "налаштування описів", + "Text": "Текст", + "White": "Білий", + "Black": "Чорний", + "Red": "Червоний", + "Green": "Зелений", + "Blue": "Синій", + "Yellow": "Жовтий", + "Magenta": "Пурпурний", + "Cyan": "Блакитний", + "Background": "Фон", + "Window": "Вікно", + "Transparent": "Прозорий", + "Semi-Transparent": "Напівпрозорий", + "Opaque": "Прозорість", + "Font Size": "Розмір шрифту", + "Text Edge Style": "Стиль краю тексту", + "None": "Нічого", + "Raised": "Піднятий", + "Depressed": "Знижений", + "Uniform": "Однаковий", + "Dropshadow": "Тінь", + "Font Family": "Шрифт", + "Proportional Sans-Serif": "Пропорційний без засічок", + "Monospace Sans-Serif": "Моноширинний без засічок", + "Proportional Serif": "Пропорційний із засічками", + "Monospace Serif": "Моноширинний із засічками", + "Casual": "Випадковий", + "Script": "Писемний", + "Small Caps": "Малі прописні", + "Reset": "Скинути", + "restore all settings to the default values": "скинути всі налаштування за замовчуванням", + "Done": "Готово", + "Caption Settings Dialog": "Діалог налаштувань підпису", + "Beginning of dialog window. Escape will cancel and close the window.": "Початок діалоговго вікна. Кнопка Escape закриє або скасує вікно", + "End of dialog window.": "Кінець діалогового вікна.", + "{1} is loading.": "{1} завантажується." +} diff --git a/js/libs/videojs/lang/vi.js b/js/libs/videojs/lang/vi.js index b5faa63f..be0772e0 100644 --- a/js/libs/videojs/lang/vi.js +++ b/js/libs/videojs/lang/vi.js @@ -1,84 +1,84 @@ -videojs.addLanguage("vi",{ - "Audio Player": "Trình phát Audio", - "Video Player": "Trình phát Video", - "Play": "Phát", - "Pause": "Tạm dừng", - "Replay": "Phát lại", - "Current Time": "Thời gian hiện tại", - "Duration Time": "Độ dài", - "Remaining Time": "Thời gian còn lại", - "Stream Type": "Kiểu Stream", - "LIVE": "TRỰC TIẾP", - "Loaded": "Đã tải", - "Progress": "Tiến trình", - "Progress Bar": "Thanh tiến trình", - "progress bar timing: currentTime={1} duration={2}": "{1} của {2}", - "Fullscreen": "Toàn màn hình", - "Non-Fullscreen": "Thoát toàn màn hình", - "Mute": "Tắt tiếng", - "Unmute": "Bật âm thanh", - "Playback Rate": "Tỉ lệ phát lại", - "Subtitles": "Phụ đề", - "subtitles off": "tắt phụ đề", - "Captions": "Chú thích", - "captions off": "tắt chú thích", - "Chapters": "Chương", - "Descriptions": "Mô tả", - "descriptions off": "tắt mô tả", - "Audio Track": "Track âm thanh", - "Volume Level": "Mức âm lượng", - "You aborted the media playback": "Bạn đã hủy việc phát lại media.", - "A network error caused the media download to fail part-way.": "Một lỗi mạng dẫn đến việc tải media bị lỗi.", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video không tải được, mạng hay server có lỗi hoặc định dạng không được hỗ trợ.", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Phát media đã bị hủy do một sai lỗi hoặc media sử dụng những tính năng trình duyệt không hỗ trợ.", - "No compatible source was found for this media.": "Không có nguồn tương thích cho media này.", - "The media is encrypted and we do not have the keys to decrypt it.": "Media đã được mã hóa và chúng tôi không có để giải mã nó.", - "Play Video": "Phát Video", - "Close": "Đóng", - "Close Modal Dialog": "Đóng cửa sổ", - "Modal Window": "Cửa sổ", - "This is a modal window": "Đây là một cửa sổ", - "This modal can be closed by pressing the Escape key or activating the close button.": "Cửa sổ này có thể thoát bằng việc nhấn phím Esc hoặc kích hoạt nút đóng.", - ", opens captions settings dialog": ", mở hộp thoại cài đặt chú thích", - ", opens subtitles settings dialog": ", mở hộp thoại cài đặt phụ đề", - ", opens descriptions settings dialog": ", mở hộp thoại cài đặt mô tả", - ", selected": ", đã chọn", - "captions settings": "cài đặt chú thích", - "subtitles settings": "cài đặt phụ đề", - "descriptions settings": "cài đặt mô tả", - "Text": "Văn bản", - "White": "Trắng", - "Black": "Đen", - "Red": "Đỏ", - "Green": "Xanh lá cây", - "Blue": "Xanh da trời", - "Yellow": "Vàng", - "Magenta": "Đỏ tươi", - "Cyan": "Lam", - "Background": "Nền", - "Window": "Cửa sổ", - "Transparent": "Trong suốt", - "Semi-Transparent": "Bán trong suốt", - "Opaque": "Mờ", - "Font Size": "Kích cỡ phông chữ", - "Text Edge Style": "Dạng viền văn bản", - "None": "None", - "Raised": "Raised", - "Depressed": "Depressed", - "Uniform": "Uniform", - "Dropshadow": "Dropshadow", - "Font Family": "Phông chữ", - "Proportional Sans-Serif": "Proportional Sans-Serif", - "Monospace Sans-Serif": "Monospace Sans-Serif", - "Proportional Serif": "Proportional Serif", - "Monospace Serif": "Monospace Serif", - "Casual": "Casual", - "Script": "Script", - "Small Caps": "Small Caps", - "Reset": "Đặt lại", - "restore all settings to the default values": "khôi phục lại tất cả các cài đặt về giá trị mặc định", - "Done": "Xong", - "Caption Settings Dialog": "Hộp thoại cài đặt chú thích", - "Beginning of dialog window. Escape will cancel and close the window.": "Bắt đầu cửa sổ hộp thoại. Esc sẽ thoát và đóng cửa sổ.", - "End of dialog window.": "Kết thúc cửa sổ hộp thoại." +videojs.addLanguage('vi', { + "Audio Player": "Trình phát Audio", + "Video Player": "Trình phát Video", + "Play": "Phát", + "Pause": "Tạm dừng", + "Replay": "Phát lại", + "Current Time": "Thời gian hiện tại", + "Duration": "Độ dài", + "Remaining Time": "Thời gian còn lại", + "Stream Type": "Kiểu Stream", + "LIVE": "TRỰC TIẾP", + "Loaded": "Đã tải", + "Progress": "Tiến trình", + "Progress Bar": "Thanh tiến trình", + "progress bar timing: currentTime={1} duration={2}": "{1} của {2}", + "Fullscreen": "Toàn màn hình", + "Non-Fullscreen": "Thoát toàn màn hình", + "Mute": "Tắt tiếng", + "Unmute": "Bật âm thanh", + "Playback Rate": "Tỉ lệ phát lại", + "Subtitles": "Phụ đề", + "subtitles off": "tắt phụ đề", + "Captions": "Chú thích", + "captions off": "tắt chú thích", + "Chapters": "Chương", + "Descriptions": "Mô tả", + "descriptions off": "tắt mô tả", + "Audio Track": "Track âm thanh", + "Volume Level": "Mức âm lượng", + "You aborted the media playback": "Bạn đã hủy việc phát lại media.", + "A network error caused the media download to fail part-way.": "Một lỗi mạng dẫn đến việc tải media bị lỗi.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video không tải được, mạng hay server có lỗi hoặc định dạng không được hỗ trợ.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Phát media đã bị hủy do một sai lỗi hoặc media sử dụng những tính năng trình duyệt không hỗ trợ.", + "No compatible source was found for this media.": "Không có nguồn tương thích cho media này.", + "The media is encrypted and we do not have the keys to decrypt it.": "Media đã được mã hóa và chúng tôi không có để giải mã nó.", + "Play Video": "Phát Video", + "Close": "Đóng", + "Close Modal Dialog": "Đóng cửa sổ", + "Modal Window": "Cửa sổ", + "This is a modal window": "Đây là một cửa sổ", + "This modal can be closed by pressing the Escape key or activating the close button.": "Cửa sổ này có thể thoát bằng việc nhấn phím Esc hoặc kích hoạt nút đóng.", + ", opens captions settings dialog": ", mở hộp thoại cài đặt chú thích", + ", opens subtitles settings dialog": ", mở hộp thoại cài đặt phụ đề", + ", opens descriptions settings dialog": ", mở hộp thoại cài đặt mô tả", + ", selected": ", đã chọn", + "captions settings": "cài đặt chú thích", + "subtitles settings": "cài đặt phụ đề", + "descriptions settings": "cài đặt mô tả", + "Text": "Văn bản", + "White": "Trắng", + "Black": "Đen", + "Red": "Đỏ", + "Green": "Xanh lá cây", + "Blue": "Xanh da trời", + "Yellow": "Vàng", + "Magenta": "Đỏ tươi", + "Cyan": "Lam", + "Background": "Nền", + "Window": "Cửa sổ", + "Transparent": "Trong suốt", + "Semi-Transparent": "Bán trong suốt", + "Opaque": "Mờ", + "Font Size": "Kích cỡ phông chữ", + "Text Edge Style": "Dạng viền văn bản", + "None": "None", + "Raised": "Raised", + "Depressed": "Depressed", + "Uniform": "Uniform", + "Dropshadow": "Dropshadow", + "Font Family": "Phông chữ", + "Proportional Sans-Serif": "Proportional Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportional Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Casual", + "Script": "Script", + "Small Caps": "Small Caps", + "Reset": "Đặt lại", + "restore all settings to the default values": "khôi phục lại tất cả các cài đặt về giá trị mặc định", + "Done": "Xong", + "Caption Settings Dialog": "Hộp thoại cài đặt chú thích", + "Beginning of dialog window. Escape will cancel and close the window.": "Bắt đầu cửa sổ hộp thoại. Esc sẽ thoát và đóng cửa sổ.", + "End of dialog window.": "Kết thúc cửa sổ hộp thoại." }); \ No newline at end of file diff --git a/js/libs/videojs/lang/vi.json b/js/libs/videojs/lang/vi.json new file mode 100644 index 00000000..5e95b533 --- /dev/null +++ b/js/libs/videojs/lang/vi.json @@ -0,0 +1,84 @@ +{ + "Audio Player": "Trình phát Audio", + "Video Player": "Trình phát Video", + "Play": "Phát", + "Pause": "Tạm dừng", + "Replay": "Phát lại", + "Current Time": "Thời gian hiện tại", + "Duration": "Độ dài", + "Remaining Time": "Thời gian còn lại", + "Stream Type": "Kiểu Stream", + "LIVE": "TRỰC TIẾP", + "Loaded": "Đã tải", + "Progress": "Tiến trình", + "Progress Bar": "Thanh tiến trình", + "progress bar timing: currentTime={1} duration={2}": "{1} của {2}", + "Fullscreen": "Toàn màn hình", + "Non-Fullscreen": "Thoát toàn màn hình", + "Mute": "Tắt tiếng", + "Unmute": "Bật âm thanh", + "Playback Rate": "Tỉ lệ phát lại", + "Subtitles": "Phụ đề", + "subtitles off": "tắt phụ đề", + "Captions": "Chú thích", + "captions off": "tắt chú thích", + "Chapters": "Chương", + "Descriptions": "Mô tả", + "descriptions off": "tắt mô tả", + "Audio Track": "Track âm thanh", + "Volume Level": "Mức âm lượng", + "You aborted the media playback": "Bạn đã hủy việc phát lại media.", + "A network error caused the media download to fail part-way.": "Một lỗi mạng dẫn đến việc tải media bị lỗi.", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Video không tải được, mạng hay server có lỗi hoặc định dạng không được hỗ trợ.", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Phát media đã bị hủy do một sai lỗi hoặc media sử dụng những tính năng trình duyệt không hỗ trợ.", + "No compatible source was found for this media.": "Không có nguồn tương thích cho media này.", + "The media is encrypted and we do not have the keys to decrypt it.": "Media đã được mã hóa và chúng tôi không có để giải mã nó.", + "Play Video": "Phát Video", + "Close": "Đóng", + "Close Modal Dialog": "Đóng cửa sổ", + "Modal Window": "Cửa sổ", + "This is a modal window": "Đây là một cửa sổ", + "This modal can be closed by pressing the Escape key or activating the close button.": "Cửa sổ này có thể thoát bằng việc nhấn phím Esc hoặc kích hoạt nút đóng.", + ", opens captions settings dialog": ", mở hộp thoại cài đặt chú thích", + ", opens subtitles settings dialog": ", mở hộp thoại cài đặt phụ đề", + ", opens descriptions settings dialog": ", mở hộp thoại cài đặt mô tả", + ", selected": ", đã chọn", + "captions settings": "cài đặt chú thích", + "subtitles settings": "cài đặt phụ đề", + "descriptions settings": "cài đặt mô tả", + "Text": "Văn bản", + "White": "Trắng", + "Black": "Đen", + "Red": "Đỏ", + "Green": "Xanh lá cây", + "Blue": "Xanh da trời", + "Yellow": "Vàng", + "Magenta": "Đỏ tươi", + "Cyan": "Lam", + "Background": "Nền", + "Window": "Cửa sổ", + "Transparent": "Trong suốt", + "Semi-Transparent": "Bán trong suốt", + "Opaque": "Mờ", + "Font Size": "Kích cỡ phông chữ", + "Text Edge Style": "Dạng viền văn bản", + "None": "None", + "Raised": "Raised", + "Depressed": "Depressed", + "Uniform": "Uniform", + "Dropshadow": "Dropshadow", + "Font Family": "Phông chữ", + "Proportional Sans-Serif": "Proportional Sans-Serif", + "Monospace Sans-Serif": "Monospace Sans-Serif", + "Proportional Serif": "Proportional Serif", + "Monospace Serif": "Monospace Serif", + "Casual": "Casual", + "Script": "Script", + "Small Caps": "Small Caps", + "Reset": "Đặt lại", + "restore all settings to the default values": "khôi phục lại tất cả các cài đặt về giá trị mặc định", + "Done": "Xong", + "Caption Settings Dialog": "Hộp thoại cài đặt chú thích", + "Beginning of dialog window. Escape will cancel and close the window.": "Bắt đầu cửa sổ hộp thoại. Esc sẽ thoát và đóng cửa sổ.", + "End of dialog window.": "Kết thúc cửa sổ hộp thoại." +} diff --git a/js/libs/videojs/lang/zh-CN.js b/js/libs/videojs/lang/zh-CN.js index bc850b50..dcd07817 100644 --- a/js/libs/videojs/lang/zh-CN.js +++ b/js/libs/videojs/lang/zh-CN.js @@ -1,40 +1,89 @@ -videojs.addLanguage("zh-CN",{ - "Play": "播放", - "Pause": "暂停", - "Current Time": "当前时间", - "Duration Time": "时长", - "Remaining Time": "剩余时间", - "Stream Type": "媒体流类型", - "LIVE": "直播", - "Loaded": "加载完毕", - "Progress": "进度", - "Fullscreen": "全屏", - "Non-Fullscreen": "退出全屏", - "Mute": "静音", - "Unmute": "取消静音", - "Playback Rate": "播放速度", - "Subtitles": "字幕", - "subtitles off": "关闭字幕", - "Captions": "内嵌字幕", - "captions off": "关闭内嵌字幕", - "Chapters": "节目段落", - "Close Modal Dialog": "关闭弹窗", - "Descriptions": "描述", - "descriptions off": "关闭描述", - "Audio Track": "音轨", - "You aborted the media playback": "视频播放被终止", - "A network error caused the media download to fail part-way.": "网络错误导致视频下载中途失败。", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "视频因格式不支持或者服务器或网络的问题无法加载。", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。", - "No compatible source was found for this media.": "无法找到此视频兼容的源。", - "The media is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。", - "Play Video": "播放视频", - "Close": "关闭", - "Modal Window": "弹窗", - "This is a modal window": "这是一个弹窗", - "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按键或启用关闭按钮来关闭此弹窗。", - ", opens captions settings dialog": ", 开启标题设置弹窗", - ", opens subtitles settings dialog": ", 开启字幕设置弹窗", - ", opens descriptions settings dialog": ", 开启描述设置弹窗", - ", selected": ", 选择" +videojs.addLanguage('zh-CN', { + "Play": "播放", + "Pause": "暂停", + "Current Time": "当前时间", + "Duration": "时长", + "Remaining Time": "剩余时间", + "Stream Type": "媒体流类型", + "LIVE": "直播", + "Loaded": "加载完成", + "Progress": "进度", + "Fullscreen": "全屏", + "Non-Fullscreen": "退出全屏", + "Picture-in-Picture": "画中画", + "Exit Picture-in-Picture": "退出画中画", + "Mute": "静音", + "Unmute": "取消静音", + "Playback Rate": "播放速度", + "Subtitles": "字幕", + "subtitles off": "关闭字幕", + "Captions": "内嵌字幕", + "captions off": "关闭内嵌字幕", + "Chapters": "节目段落", + "Close Modal Dialog": "关闭弹窗", + "Descriptions": "描述", + "descriptions off": "关闭描述", + "Audio Track": "音轨", + "You aborted the media playback": "视频播放被终止", + "A network error caused the media download to fail part-way.": "网络错误导致视频下载中途失败。", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "视频因格式不支持或者服务器或网络的问题无法加载。", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。", + "No compatible source was found for this media.": "无法找到此视频兼容的源。", + "The media is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。", + "Play Video": "播放视频", + "Close": "关闭", + "Modal Window": "弹窗", + "This is a modal window": "这是一个弹窗", + "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按键或启用关闭按钮来关闭此弹窗。", + ", opens captions settings dialog": ", 开启标题设置弹窗", + ", opens subtitles settings dialog": ", 开启字幕设置弹窗", + ", opens descriptions settings dialog": ", 开启描述设置弹窗", + ", selected": ", 选择", + "captions settings": "字幕设定", + "Audio Player": "音频播放器", + "Video Player": "视频播放器", + "Replay": "重新播放", + "Progress Bar": "进度条", + "Volume Level": "音量", + "subtitles settings": "字幕设定", + "descriptions settings": "描述设定", + "Text": "文字", + "White": "白", + "Black": "黑", + "Red": "红", + "Green": "绿", + "Blue": "蓝", + "Yellow": "黄", + "Magenta": "紫红", + "Cyan": "青", + "Background": "背景", + "Window": "窗口", + "Transparent": "透明", + "Semi-Transparent": "半透明", + "Opaque": "不透明", + "Font Size": "字体尺寸", + "Text Edge Style": "字体边缘样式", + "None": "无", + "Raised": "浮雕", + "Depressed": "压低", + "Uniform": "均匀", + "Dropshadow": "下阴影", + "Font Family": "字体库", + "Proportional Sans-Serif": "比例无细体", + "Monospace Sans-Serif": "单间隔无细体", + "Proportional Serif": "比例细体", + "Monospace Serif": "单间隔细体", + "Casual": "舒适", + "Script": "手写体", + "Small Caps": "小型大写字体", + "Reset": "重置", + "restore all settings to the default values": "恢复全部设定至预设值", + "Done": "完成", + "Caption Settings Dialog": "字幕设定窗口", + "Beginning of dialog window. Escape will cancel and close the window.": "打开对话窗口。Escape键将取消并关闭对话窗口", + "End of dialog window.": "结束对话窗口", + "Seek to live, currently behind live": "尝试直播,当前为延时播放", + "Seek to live, currently playing live": "尝试直播,当前为实时播放", + "progress bar timing: currentTime={1} duration={2}": "{1}/{2}", + "{1} is loading.": "正在加载 {1}。" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/zh-CN.json b/js/libs/videojs/lang/zh-CN.json new file mode 100644 index 00000000..976bec11 --- /dev/null +++ b/js/libs/videojs/lang/zh-CN.json @@ -0,0 +1,89 @@ +{ + "Play": "播放", + "Pause": "暂停", + "Current Time": "当前时间", + "Duration": "时长", + "Remaining Time": "剩余时间", + "Stream Type": "媒体流类型", + "LIVE": "直播", + "Loaded": "加载完成", + "Progress": "进度", + "Fullscreen": "全屏", + "Non-Fullscreen": "退出全屏", + "Picture-in-Picture": "画中画", + "Exit Picture-in-Picture": "退出画中画", + "Mute": "静音", + "Unmute": "取消静音", + "Playback Rate": "播放速度", + "Subtitles": "字幕", + "subtitles off": "关闭字幕", + "Captions": "内嵌字幕", + "captions off": "关闭内嵌字幕", + "Chapters": "节目段落", + "Close Modal Dialog": "关闭弹窗", + "Descriptions": "描述", + "descriptions off": "关闭描述", + "Audio Track": "音轨", + "You aborted the media playback": "视频播放被终止", + "A network error caused the media download to fail part-way.": "网络错误导致视频下载中途失败。", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "视频因格式不支持或者服务器或网络的问题无法加载。", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。", + "No compatible source was found for this media.": "无法找到此视频兼容的源。", + "The media is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。", + "Play Video": "播放视频", + "Close": "关闭", + "Modal Window": "弹窗", + "This is a modal window": "这是一个弹窗", + "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按键或启用关闭按钮来关闭此弹窗。", + ", opens captions settings dialog": ", 开启标题设置弹窗", + ", opens subtitles settings dialog": ", 开启字幕设置弹窗", + ", opens descriptions settings dialog": ", 开启描述设置弹窗", + ", selected": ", 选择", + "captions settings": "字幕设定", + "Audio Player": "音频播放器", + "Video Player": "视频播放器", + "Replay": "重新播放", + "Progress Bar": "进度条", + "Volume Level": "音量", + "subtitles settings": "字幕设定", + "descriptions settings": "描述设定", + "Text": "文字", + "White": "白", + "Black": "黑", + "Red": "红", + "Green": "绿", + "Blue": "蓝", + "Yellow": "黄", + "Magenta": "紫红", + "Cyan": "青", + "Background": "背景", + "Window": "窗口", + "Transparent": "透明", + "Semi-Transparent": "半透明", + "Opaque": "不透明", + "Font Size": "字体尺寸", + "Text Edge Style": "字体边缘样式", + "None": "无", + "Raised": "浮雕", + "Depressed": "压低", + "Uniform": "均匀", + "Dropshadow": "下阴影", + "Font Family": "字体库", + "Proportional Sans-Serif": "比例无细体", + "Monospace Sans-Serif": "单间隔无细体", + "Proportional Serif": "比例细体", + "Monospace Serif": "单间隔细体", + "Casual": "舒适", + "Script": "手写体", + "Small Caps": "小型大写字体", + "Reset": "重置", + "restore all settings to the default values": "恢复全部设定至预设值", + "Done": "完成", + "Caption Settings Dialog": "字幕设定窗口", + "Beginning of dialog window. Escape will cancel and close the window.": "打开对话窗口。Escape键将取消并关闭对话窗口", + "End of dialog window.": "结束对话窗口", + "Seek to live, currently behind live": "尝试直播,当前为延时播放", + "Seek to live, currently playing live": "尝试直播,当前为实时播放", + "progress bar timing: currentTime={1} duration={2}": "{1}/{2}", + "{1} is loading.": "正在加载 {1}。" +} diff --git a/js/libs/videojs/lang/zh-Hans.js b/js/libs/videojs/lang/zh-Hans.js new file mode 100644 index 00000000..c95f9dc2 --- /dev/null +++ b/js/libs/videojs/lang/zh-Hans.js @@ -0,0 +1,89 @@ +videojs.addLanguage('zh-Hans', { + "Play": "播放", + "Pause": "暂停", + "Current Time": "当前时间", + "Duration": "时长", + "Remaining Time": "剩余时间", + "Stream Type": "媒体流类型", + "LIVE": "直播", + "Loaded": "加载完成", + "Progress": "进度", + "Fullscreen": "全屏", + "Non-Fullscreen": "退出全屏", + "Picture-in-Picture": "画中画", + "Exit Picture-in-Picture": "退出画中画", + "Mute": "静音", + "Unmute": "取消静音", + "Playback Rate": "播放速度", + "Subtitles": "字幕", + "subtitles off": "关闭字幕", + "Captions": "内嵌字幕", + "captions off": "关闭内嵌字幕", + "Chapters": "节目段落", + "Close Modal Dialog": "关闭弹窗", + "Descriptions": "描述", + "descriptions off": "关闭描述", + "Audio Track": "音轨", + "You aborted the media playback": "视频播放被终止", + "A network error caused the media download to fail part-way.": "网络错误导致视频下载中途失败。", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "视频因格式不支持或者服务器或网络的问题无法加载。", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。", + "No compatible source was found for this media.": "无法找到此视频兼容的源。", + "The media is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。", + "Play Video": "播放视频", + "Close": "关闭", + "Modal Window": "弹窗", + "This is a modal window": "这是一个弹窗", + "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按键或启用关闭按钮来关闭此弹窗。", + ", opens captions settings dialog": ", 开启标题设置弹窗", + ", opens subtitles settings dialog": ", 开启字幕设置弹窗", + ", opens descriptions settings dialog": ", 开启描述设置弹窗", + ", selected": ", 选择", + "captions settings": "字幕设定", + "Audio Player": "音频播放器", + "Video Player": "视频播放器", + "Replay": "重新播放", + "Progress Bar": "进度条", + "Volume Level": "音量", + "subtitles settings": "字幕设定", + "descriptions settings": "描述设定", + "Text": "文字", + "White": "白", + "Black": "黑", + "Red": "红", + "Green": "绿", + "Blue": "蓝", + "Yellow": "黄", + "Magenta": "紫红", + "Cyan": "青", + "Background": "背景", + "Window": "窗口", + "Transparent": "透明", + "Semi-Transparent": "半透明", + "Opaque": "不透明", + "Font Size": "字体尺寸", + "Text Edge Style": "字体边缘样式", + "None": "无", + "Raised": "浮雕", + "Depressed": "压低", + "Uniform": "均匀", + "Dropshadow": "下阴影", + "Font Family": "字体库", + "Proportional Sans-Serif": "比例无细体", + "Monospace Sans-Serif": "单间隔无细体", + "Proportional Serif": "比例细体", + "Monospace Serif": "单间隔细体", + "Casual": "舒适", + "Script": "手写体", + "Small Caps": "小型大写字体", + "Reset": "重置", + "restore all settings to the default values": "恢复全部设定至预设值", + "Done": "完成", + "Caption Settings Dialog": "字幕设定窗口", + "Beginning of dialog window. Escape will cancel and close the window.": "打开对话窗口。Escape键将取消并关闭对话窗口", + "End of dialog window.": "结束对话窗口", + "Seek to live, currently behind live": "尝试直播,当前为延时播放", + "Seek to live, currently playing live": "尝试直播,当前为实时播放", + "progress bar timing: currentTime={1} duration={2}": "{1}/{2}", + "{1} is loading.": "正在加载 {1}。" +}); \ No newline at end of file diff --git a/js/libs/videojs/lang/zh-Hans.json b/js/libs/videojs/lang/zh-Hans.json new file mode 100644 index 00000000..976bec11 --- /dev/null +++ b/js/libs/videojs/lang/zh-Hans.json @@ -0,0 +1,89 @@ +{ + "Play": "播放", + "Pause": "暂停", + "Current Time": "当前时间", + "Duration": "时长", + "Remaining Time": "剩余时间", + "Stream Type": "媒体流类型", + "LIVE": "直播", + "Loaded": "加载完成", + "Progress": "进度", + "Fullscreen": "全屏", + "Non-Fullscreen": "退出全屏", + "Picture-in-Picture": "画中画", + "Exit Picture-in-Picture": "退出画中画", + "Mute": "静音", + "Unmute": "取消静音", + "Playback Rate": "播放速度", + "Subtitles": "字幕", + "subtitles off": "关闭字幕", + "Captions": "内嵌字幕", + "captions off": "关闭内嵌字幕", + "Chapters": "节目段落", + "Close Modal Dialog": "关闭弹窗", + "Descriptions": "描述", + "descriptions off": "关闭描述", + "Audio Track": "音轨", + "You aborted the media playback": "视频播放被终止", + "A network error caused the media download to fail part-way.": "网络错误导致视频下载中途失败。", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "视频因格式不支持或者服务器或网络的问题无法加载。", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。", + "No compatible source was found for this media.": "无法找到此视频兼容的源。", + "The media is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。", + "Play Video": "播放视频", + "Close": "关闭", + "Modal Window": "弹窗", + "This is a modal window": "这是一个弹窗", + "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按键或启用关闭按钮来关闭此弹窗。", + ", opens captions settings dialog": ", 开启标题设置弹窗", + ", opens subtitles settings dialog": ", 开启字幕设置弹窗", + ", opens descriptions settings dialog": ", 开启描述设置弹窗", + ", selected": ", 选择", + "captions settings": "字幕设定", + "Audio Player": "音频播放器", + "Video Player": "视频播放器", + "Replay": "重新播放", + "Progress Bar": "进度条", + "Volume Level": "音量", + "subtitles settings": "字幕设定", + "descriptions settings": "描述设定", + "Text": "文字", + "White": "白", + "Black": "黑", + "Red": "红", + "Green": "绿", + "Blue": "蓝", + "Yellow": "黄", + "Magenta": "紫红", + "Cyan": "青", + "Background": "背景", + "Window": "窗口", + "Transparent": "透明", + "Semi-Transparent": "半透明", + "Opaque": "不透明", + "Font Size": "字体尺寸", + "Text Edge Style": "字体边缘样式", + "None": "无", + "Raised": "浮雕", + "Depressed": "压低", + "Uniform": "均匀", + "Dropshadow": "下阴影", + "Font Family": "字体库", + "Proportional Sans-Serif": "比例无细体", + "Monospace Sans-Serif": "单间隔无细体", + "Proportional Serif": "比例细体", + "Monospace Serif": "单间隔细体", + "Casual": "舒适", + "Script": "手写体", + "Small Caps": "小型大写字体", + "Reset": "重置", + "restore all settings to the default values": "恢复全部设定至预设值", + "Done": "完成", + "Caption Settings Dialog": "字幕设定窗口", + "Beginning of dialog window. Escape will cancel and close the window.": "打开对话窗口。Escape键将取消并关闭对话窗口", + "End of dialog window.": "结束对话窗口", + "Seek to live, currently behind live": "尝试直播,当前为延时播放", + "Seek to live, currently playing live": "尝试直播,当前为实时播放", + "progress bar timing: currentTime={1} duration={2}": "{1}/{2}", + "{1} is loading.": "正在加载 {1}。" +} diff --git a/js/libs/videojs/lang/zh-Hant.js b/js/libs/videojs/lang/zh-Hant.js new file mode 100644 index 00000000..cac064df --- /dev/null +++ b/js/libs/videojs/lang/zh-Hant.js @@ -0,0 +1,87 @@ +videojs.addLanguage('zh-Hant', { + "Play": "播放", + "Pause": "暫停", + "Current Time": "目前時間", + "Duration": "總共時間", + "Remaining Time": "剩餘時間", + "Stream Type": "串流類型", + "LIVE": "直播", + "Loaded": "載入完畢", + "Progress": "進度", + "Fullscreen": "全螢幕", + "Non-Fullscreen": "退出全螢幕", + "Mute": "靜音", + "Unmute": "取消靜音", + "Playback Rate": " 播放速率", + "Subtitles": "字幕", + "subtitles off": "關閉字幕", + "Captions": "內嵌字幕", + "captions off": "關閉內嵌字幕", + "Chapters": "章節", + "Close Modal Dialog": "關閉對話框", + "Descriptions": "描述", + "descriptions off": "關閉描述", + "Audio Track": "音軌", + "You aborted the media playback": "影片播放已終止", + "A network error caused the media download to fail part-way.": "網路錯誤導致影片下載失敗。", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "影片因格式不支援或者伺服器或網路的問題無法載入。", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由於影片檔案損毀或是該影片使用了您的瀏覽器不支援的功能,播放終止。", + "No compatible source was found for this media.": "無法找到相容此影片的來源。", + "The media is encrypted and we do not have the keys to decrypt it.": "影片已加密,無法解密。", + "Play Video": "播放影片", + "Close": "關閉", + "Modal Window": "對話框", + "This is a modal window": "這是一個對話框", + "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按鍵或啟用關閉按鈕來關閉此對話框。", + ", opens captions settings dialog": ", 開啟標題設定對話框", + ", opens subtitles settings dialog": ", 開啟字幕設定對話框", + ", opens descriptions settings dialog": ", 開啟描述設定對話框", + ", selected": ", 選擇", + "captions settings": "字幕設定", + "Audio Player": "音頻播放器", + "Video Player": "視頻播放器", + "Replay": "重播", + "Progress Bar": "進度小節", + "Volume Level": "音量", + "subtitles settings": "字幕設定", + "descriptions settings": "描述設定", + "Text": "文字", + "White": "白", + "Black": "黑", + "Red": "紅", + "Green": "綠", + "Blue": "藍", + "Yellow": "黃", + "Magenta": "紫紅", + "Cyan": "青", + "Background": "背景", + "Window": "視窗", + "Transparent": "透明", + "Semi-Transparent": "半透明", + "Opaque": "不透明", + "Font Size": "字型尺寸", + "Text Edge Style": "字型邊緣樣式", + "None": "無", + "Raised": "浮雕", + "Depressed": "壓低", + "Uniform": "均勻", + "Dropshadow": "下陰影", + "Font Family": "字型庫", + "Proportional Sans-Serif": "比例無細體", + "Monospace Sans-Serif": "單間隔無細體", + "Proportional Serif": "比例細體", + "Monospace Serif": "單間隔細體", + "Casual": "輕便的", + "Script": "手寫體", + "Small Caps": "小型大寫字體", + "Reset": "重置", + "restore all settings to the default values": "恢復全部設定至預設值", + "Done": "完成", + "Caption Settings Dialog": "字幕設定視窗", + "Beginning of dialog window. Escape will cancel and close the window.": "開始對話視窗。離開會取消及關閉視窗", + "End of dialog window.": "結束對話視窗", + "Seek to live, currently behind live": "試圖直播,目前延時播放", + "Seek to live, currently playing live": "試圖直播,目前即時播放", + "progress bar timing: currentTime={1} duration={2}": "{1}/{2}", + "{1} is loading.": "{1} 正在載入。" +}); \ No newline at end of file diff --git a/js/libs/videojs/lang/zh-Hant.json b/js/libs/videojs/lang/zh-Hant.json new file mode 100644 index 00000000..c2cd0f89 --- /dev/null +++ b/js/libs/videojs/lang/zh-Hant.json @@ -0,0 +1,87 @@ +{ + "Play": "播放", + "Pause": "暫停", + "Current Time": "目前時間", + "Duration": "總共時間", + "Remaining Time": "剩餘時間", + "Stream Type": "串流類型", + "LIVE": "直播", + "Loaded": "載入完畢", + "Progress": "進度", + "Fullscreen": "全螢幕", + "Non-Fullscreen": "退出全螢幕", + "Mute": "靜音", + "Unmute": "取消靜音", + "Playback Rate": " 播放速率", + "Subtitles": "字幕", + "subtitles off": "關閉字幕", + "Captions": "內嵌字幕", + "captions off": "關閉內嵌字幕", + "Chapters": "章節", + "Close Modal Dialog": "關閉對話框", + "Descriptions": "描述", + "descriptions off": "關閉描述", + "Audio Track": "音軌", + "You aborted the media playback": "影片播放已終止", + "A network error caused the media download to fail part-way.": "網路錯誤導致影片下載失敗。", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "影片因格式不支援或者伺服器或網路的問題無法載入。", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由於影片檔案損毀或是該影片使用了您的瀏覽器不支援的功能,播放終止。", + "No compatible source was found for this media.": "無法找到相容此影片的來源。", + "The media is encrypted and we do not have the keys to decrypt it.": "影片已加密,無法解密。", + "Play Video": "播放影片", + "Close": "關閉", + "Modal Window": "對話框", + "This is a modal window": "這是一個對話框", + "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按鍵或啟用關閉按鈕來關閉此對話框。", + ", opens captions settings dialog": ", 開啟標題設定對話框", + ", opens subtitles settings dialog": ", 開啟字幕設定對話框", + ", opens descriptions settings dialog": ", 開啟描述設定對話框", + ", selected": ", 選擇", + "captions settings": "字幕設定", + "Audio Player": "音頻播放器", + "Video Player": "視頻播放器", + "Replay": "重播", + "Progress Bar": "進度小節", + "Volume Level": "音量", + "subtitles settings": "字幕設定", + "descriptions settings": "描述設定", + "Text": "文字", + "White": "白", + "Black": "黑", + "Red": "紅", + "Green": "綠", + "Blue": "藍", + "Yellow": "黃", + "Magenta": "紫紅", + "Cyan": "青", + "Background": "背景", + "Window": "視窗", + "Transparent": "透明", + "Semi-Transparent": "半透明", + "Opaque": "不透明", + "Font Size": "字型尺寸", + "Text Edge Style": "字型邊緣樣式", + "None": "無", + "Raised": "浮雕", + "Depressed": "壓低", + "Uniform": "均勻", + "Dropshadow": "下陰影", + "Font Family": "字型庫", + "Proportional Sans-Serif": "比例無細體", + "Monospace Sans-Serif": "單間隔無細體", + "Proportional Serif": "比例細體", + "Monospace Serif": "單間隔細體", + "Casual": "輕便的", + "Script": "手寫體", + "Small Caps": "小型大寫字體", + "Reset": "重置", + "restore all settings to the default values": "恢復全部設定至預設值", + "Done": "完成", + "Caption Settings Dialog": "字幕設定視窗", + "Beginning of dialog window. Escape will cancel and close the window.": "開始對話視窗。離開會取消及關閉視窗", + "End of dialog window.": "結束對話視窗", + "Seek to live, currently behind live": "試圖直播,目前延時播放", + "Seek to live, currently playing live": "試圖直播,目前即時播放", + "progress bar timing: currentTime={1} duration={2}": "{1}/{2}", + "{1} is loading.": "{1} 正在載入。" +} diff --git a/js/libs/videojs/lang/zh-TW.js b/js/libs/videojs/lang/zh-TW.js index 30fdc9fe..a816c0fa 100644 --- a/js/libs/videojs/lang/zh-TW.js +++ b/js/libs/videojs/lang/zh-TW.js @@ -1,40 +1,87 @@ -videojs.addLanguage("zh-TW",{ - "Play": "播放", - "Pause": "暫停", - "Current Time": "目前時間", - "Duration Time": "總共時間", - "Remaining Time": "剩餘時間", - "Stream Type": "串流類型", - "LIVE": "直播", - "Loaded": "載入完畢", - "Progress": "進度", - "Fullscreen": "全螢幕", - "Non-Fullscreen": "退出全螢幕", - "Mute": "靜音", - "Unmute": "取消靜音", - "Playback Rate": " 播放速率", - "Subtitles": "字幕", - "subtitles off": "關閉字幕", - "Captions": "內嵌字幕", - "captions off": "關閉內嵌字幕", - "Chapters": "章節", - "Close Modal Dialog": "關閉對話框", - "Descriptions": "描述", - "descriptions off": "關閉描述", - "Audio Track": "音軌", - "You aborted the media playback": "影片播放已終止", - "A network error caused the media download to fail part-way.": "網路錯誤導致影片下載失敗。", - "The media could not be loaded, either because the server or network failed or because the format is not supported.": "影片因格式不支援或者伺服器或網路的問題無法載入。", - "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由於影片檔案損毀或是該影片使用了您的瀏覽器不支援的功能,播放終止。", - "No compatible source was found for this media.": "無法找到相容此影片的來源。", - "The media is encrypted and we do not have the keys to decrypt it.": "影片已加密,無法解密。", - "Play Video": "播放影片", - "Close": "關閉", - "Modal Window": "對話框", - "This is a modal window": "這是一個對話框", - "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按鍵或啟用關閉按鈕來關閉此對話框。", - ", opens captions settings dialog": ", 開啟標題設定對話框", - ", opens subtitles settings dialog": ", 開啟字幕設定對話框", - ", opens descriptions settings dialog": ", 開啟描述設定對話框", - ", selected": ", 選擇" +videojs.addLanguage('zh-TW', { + "Play": "播放", + "Pause": "暫停", + "Current Time": "目前時間", + "Duration": "總共時間", + "Remaining Time": "剩餘時間", + "Stream Type": "串流類型", + "LIVE": "直播", + "Loaded": "載入完畢", + "Progress": "進度", + "Fullscreen": "全螢幕", + "Non-Fullscreen": "退出全螢幕", + "Mute": "靜音", + "Unmute": "取消靜音", + "Playback Rate": " 播放速率", + "Subtitles": "字幕", + "subtitles off": "關閉字幕", + "Captions": "內嵌字幕", + "captions off": "關閉內嵌字幕", + "Chapters": "章節", + "Close Modal Dialog": "關閉對話框", + "Descriptions": "描述", + "descriptions off": "關閉描述", + "Audio Track": "音軌", + "You aborted the media playback": "影片播放已終止", + "A network error caused the media download to fail part-way.": "網路錯誤導致影片下載失敗。", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "影片因格式不支援或者伺服器或網路的問題無法載入。", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由於影片檔案損毀或是該影片使用了您的瀏覽器不支援的功能,播放終止。", + "No compatible source was found for this media.": "無法找到相容此影片的來源。", + "The media is encrypted and we do not have the keys to decrypt it.": "影片已加密,無法解密。", + "Play Video": "播放影片", + "Close": "關閉", + "Modal Window": "對話框", + "This is a modal window": "這是一個對話框", + "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按鍵或啟用關閉按鈕來關閉此對話框。", + ", opens captions settings dialog": ", 開啟標題設定對話框", + ", opens subtitles settings dialog": ", 開啟字幕設定對話框", + ", opens descriptions settings dialog": ", 開啟描述設定對話框", + ", selected": ", 選擇", + "captions settings": "字幕設定", + "Audio Player": "音頻播放器", + "Video Player": "視頻播放器", + "Replay": "重播", + "Progress Bar": "進度小節", + "Volume Level": "音量", + "subtitles settings": "字幕設定", + "descriptions settings": "描述設定", + "Text": "文字", + "White": "白", + "Black": "黑", + "Red": "紅", + "Green": "綠", + "Blue": "藍", + "Yellow": "黃", + "Magenta": "紫紅", + "Cyan": "青", + "Background": "背景", + "Window": "視窗", + "Transparent": "透明", + "Semi-Transparent": "半透明", + "Opaque": "不透明", + "Font Size": "字型尺寸", + "Text Edge Style": "字型邊緣樣式", + "None": "無", + "Raised": "浮雕", + "Depressed": "壓低", + "Uniform": "均勻", + "Dropshadow": "下陰影", + "Font Family": "字型庫", + "Proportional Sans-Serif": "比例無細體", + "Monospace Sans-Serif": "單間隔無細體", + "Proportional Serif": "比例細體", + "Monospace Serif": "單間隔細體", + "Casual": "輕便的", + "Script": "手寫體", + "Small Caps": "小型大寫字體", + "Reset": "重置", + "restore all settings to the default values": "恢復全部設定至預設值", + "Done": "完成", + "Caption Settings Dialog": "字幕設定視窗", + "Beginning of dialog window. Escape will cancel and close the window.": "開始對話視窗。離開會取消及關閉視窗", + "End of dialog window.": "結束對話視窗", + "Seek to live, currently behind live": "試圖直播,目前延時播放", + "Seek to live, currently playing live": "試圖直播,目前即時播放", + "progress bar timing: currentTime={1} duration={2}": "{1}/{2}", + "{1} is loading.": "{1} 正在載入。" }); \ No newline at end of file diff --git a/js/libs/videojs/lang/zh-TW.json b/js/libs/videojs/lang/zh-TW.json new file mode 100644 index 00000000..c2cd0f89 --- /dev/null +++ b/js/libs/videojs/lang/zh-TW.json @@ -0,0 +1,87 @@ +{ + "Play": "播放", + "Pause": "暫停", + "Current Time": "目前時間", + "Duration": "總共時間", + "Remaining Time": "剩餘時間", + "Stream Type": "串流類型", + "LIVE": "直播", + "Loaded": "載入完畢", + "Progress": "進度", + "Fullscreen": "全螢幕", + "Non-Fullscreen": "退出全螢幕", + "Mute": "靜音", + "Unmute": "取消靜音", + "Playback Rate": " 播放速率", + "Subtitles": "字幕", + "subtitles off": "關閉字幕", + "Captions": "內嵌字幕", + "captions off": "關閉內嵌字幕", + "Chapters": "章節", + "Close Modal Dialog": "關閉對話框", + "Descriptions": "描述", + "descriptions off": "關閉描述", + "Audio Track": "音軌", + "You aborted the media playback": "影片播放已終止", + "A network error caused the media download to fail part-way.": "網路錯誤導致影片下載失敗。", + "The media could not be loaded, either because the server or network failed or because the format is not supported.": "影片因格式不支援或者伺服器或網路的問題無法載入。", + "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "由於影片檔案損毀或是該影片使用了您的瀏覽器不支援的功能,播放終止。", + "No compatible source was found for this media.": "無法找到相容此影片的來源。", + "The media is encrypted and we do not have the keys to decrypt it.": "影片已加密,無法解密。", + "Play Video": "播放影片", + "Close": "關閉", + "Modal Window": "對話框", + "This is a modal window": "這是一個對話框", + "This modal can be closed by pressing the Escape key or activating the close button.": "可以按ESC按鍵或啟用關閉按鈕來關閉此對話框。", + ", opens captions settings dialog": ", 開啟標題設定對話框", + ", opens subtitles settings dialog": ", 開啟字幕設定對話框", + ", opens descriptions settings dialog": ", 開啟描述設定對話框", + ", selected": ", 選擇", + "captions settings": "字幕設定", + "Audio Player": "音頻播放器", + "Video Player": "視頻播放器", + "Replay": "重播", + "Progress Bar": "進度小節", + "Volume Level": "音量", + "subtitles settings": "字幕設定", + "descriptions settings": "描述設定", + "Text": "文字", + "White": "白", + "Black": "黑", + "Red": "紅", + "Green": "綠", + "Blue": "藍", + "Yellow": "黃", + "Magenta": "紫紅", + "Cyan": "青", + "Background": "背景", + "Window": "視窗", + "Transparent": "透明", + "Semi-Transparent": "半透明", + "Opaque": "不透明", + "Font Size": "字型尺寸", + "Text Edge Style": "字型邊緣樣式", + "None": "無", + "Raised": "浮雕", + "Depressed": "壓低", + "Uniform": "均勻", + "Dropshadow": "下陰影", + "Font Family": "字型庫", + "Proportional Sans-Serif": "比例無細體", + "Monospace Sans-Serif": "單間隔無細體", + "Proportional Serif": "比例細體", + "Monospace Serif": "單間隔細體", + "Casual": "輕便的", + "Script": "手寫體", + "Small Caps": "小型大寫字體", + "Reset": "重置", + "restore all settings to the default values": "恢復全部設定至預設值", + "Done": "完成", + "Caption Settings Dialog": "字幕設定視窗", + "Beginning of dialog window. Escape will cancel and close the window.": "開始對話視窗。離開會取消及關閉視窗", + "End of dialog window.": "結束對話視窗", + "Seek to live, currently behind live": "試圖直播,目前延時播放", + "Seek to live, currently playing live": "試圖直播,目前即時播放", + "progress bar timing: currentTime={1} duration={2}": "{1}/{2}", + "{1} is loading.": "{1} 正在載入。" +} diff --git a/js/libs/videojs/video.min.js b/js/libs/videojs/video.min.js new file mode 100644 index 00000000..8950a5a9 --- /dev/null +++ b/js/libs/videojs/video.min.js @@ -0,0 +1,27 @@ +/** + * @license + * Video.js 7.15.4 + * Copyright Brightcove, Inc. + * Available under Apache License Version 2.0 + * + * + * Includes vtt.js + * Available under Apache License Version 2.0 + * + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).videojs=t()}(this,function(){"use strict";var u="7.15.4",e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t){return e(t={exports:{}},t.exports),t.exports}for(var i,_="undefined"!=typeof window?window:"undefined"!=typeof e?e:"undefined"!=typeof self?self:{},n={},a=function(e,t){return n[e]=n[e]||[],t&&(n[e]=n[e].concat(t)),n[e]},r=function(e,t){t=a(e).indexOf(t);return!(t<=-1)&&(n[e]=n[e].slice(),n[e].splice(t,1),!0)},s="undefined"!=typeof e?e:"undefined"!=typeof window?window:{},o="undefined"!=typeof document?document:(o=s["__GLOBAL_DOCUMENT_CACHE@4"])||(s["__GLOBAL_DOCUMENT_CACHE@4"]={}),d=o,l={prefixed:!0},c=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror","fullscreen"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror","-webkit-full-screen"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror","-moz-full-screen"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError","-ms-fullscreen"]],h=c[0],p=0;p + * Copyright (c) 2014 David Björklund + * Available under the MIT license + * + */ +var $t=function(e){var n={};return e&&e.trim().split("\n").forEach(function(e){var t=e.indexOf(":"),i=e.slice(0,t).trim().toLowerCase(),t=e.slice(t+1).trim();"undefined"==typeof n[i]?n[i]=t:Array.isArray(n[i])?n[i].push(t):n[i]=[n[i],t]}),n},Jt=ei,P=ei;function Zt(e,t,i){var n=e;return Yt(t)?(i=t,"string"==typeof e&&(n={uri:e})):n=b({},t,{uri:e}),n.callback=i,n}function ei(e,t,i){return ti(t=Zt(e,t,i))}function ti(n){if("undefined"==typeof n.callback)throw new Error("callback argument missing");var r=!1,a=function(e,t,i){r||(r=!0,n.callback(e,t,i))};function s(){var e=void 0,e=l.response||l.responseText||function(e){try{if("document"===e.responseType)return e.responseXML;var t=e.responseXML&&"parsererror"===e.responseXML.documentElement.nodeName;if(""===e.responseType&&!t)return e.responseXML}catch(e){}return null}(l);if(m)try{e=JSON.parse(e)}catch(e){}return e}function t(e){return clearTimeout(u),(e=!(e instanceof Error)?new Error(""+(e||"Unknown XMLHttpRequest Error")):e).statusCode=0,a(e,g)}function e(){if(!o){clearTimeout(u);var e=n.useXDR&&void 0===l.status?200:1223===l.status?204:l.status,t=g,i=null;return 0!==e?(t={body:s(),statusCode:e,method:d,headers:{},url:c,rawRequest:l},l.getAllResponseHeaders&&(t.headers=$t(l.getAllResponseHeaders()))):i=new Error("Internal XMLHttpRequest Error"),a(i,t,t.body)}}var i,o,u,l=n.xhr||null,c=(l=l||new(n.cors||n.useXDR?ei.XDomainRequest:ei.XMLHttpRequest)).url=n.uri||n.url,d=l.method=n.method||"GET",h=n.body||n.data,p=l.headers=n.headers||{},f=!!n.sync,m=!1,g={body:void 0,headers:{},statusCode:0,method:d,url:c,rawRequest:l};if("json"in n&&!1!==n.json&&(m=!0,p.accept||p.Accept||(p.Accept="application/json"),"GET"!==d&&"HEAD"!==d&&(p["content-type"]||p["Content-Type"]||(p["Content-Type"]="application/json"),h=JSON.stringify(!0===n.json?h:n.json))),l.onreadystatechange=function(){4===l.readyState&&setTimeout(e,0)},l.onload=e,l.onerror=t,l.onprogress=function(){},l.onabort=function(){o=!0},l.ontimeout=t,l.open(d,c,!f,n.username,n.password),f||(l.withCredentials=!!n.withCredentials),!f&&0=e||r.startTime===r.endTime&&r.startTime<=e&&r.startTime+.5>=e)&&t.push(r)}if(o=!1,t.length!==this.activeCues_.length)o=!0;else for(var a=0;a]*>?)?/);return e=e[1]||e[2],t=t.substr(e.length),e}());)"<"!==i[0]?p.appendChild(e.document.createTextNode((s=i,yi.innerHTML=s,s=yi.textContent,yi.textContent="",s))):"/"!==i[1]?(a=pi(i.substr(1,i.length-2)))?(n=e.document.createProcessingInstruction("timestamp",a),p.appendChild(n)):(r=i.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/))&&(l=r[1],c=r[3],d=void 0,d=vi[l],(n=d?(d=e.document.createElement(d),(l=bi[l])&&c&&(d[l]=c.trim()),d):null)&&(o=p,Ti[(u=n).localName]&&Ti[u.localName]!==o.localName||(r[2]&&((a=r[2].split(".")).forEach(function(e){var t=/^bg_/.test(e),e=t?e.slice(3):e;_i.hasOwnProperty(e)&&(e=_i[e],n.style[t?"background-color":"color"]=e)}),n.className=a.join(" ")),f.push(r[1]),p.appendChild(n),p=n))):f.length&&f[f.length-1]===i.substr(2).replace(">","")&&(f.pop(),p=p.parentNode);return h}var Ei=[[1470,1470],[1472,1472],[1475,1475],[1478,1478],[1488,1514],[1520,1524],[1544,1544],[1547,1547],[1549,1549],[1563,1563],[1566,1610],[1645,1647],[1649,1749],[1765,1766],[1774,1775],[1786,1805],[1807,1808],[1810,1839],[1869,1957],[1969,1969],[1984,2026],[2036,2037],[2042,2042],[2048,2069],[2074,2074],[2084,2084],[2088,2088],[2096,2110],[2112,2136],[2142,2142],[2208,2208],[2210,2220],[8207,8207],[64285,64285],[64287,64296],[64298,64310],[64312,64316],[64318,64318],[64320,64321],[64323,64324],[64326,64449],[64467,64829],[64848,64911],[64914,64967],[65008,65020],[65136,65140],[65142,65276],[67584,67589],[67592,67592],[67594,67637],[67639,67640],[67644,67644],[67647,67669],[67671,67679],[67840,67867],[67872,67897],[67903,67903],[67968,68023],[68030,68031],[68096,68096],[68112,68115],[68117,68119],[68121,68147],[68160,68167],[68176,68184],[68192,68223],[68352,68405],[68416,68437],[68440,68466],[68472,68479],[68608,68680],[126464,126467],[126469,126495],[126497,126498],[126500,126500],[126503,126503],[126505,126514],[126516,126519],[126521,126521],[126523,126523],[126530,126530],[126535,126535],[126537,126537],[126539,126539],[126541,126543],[126545,126546],[126548,126548],[126551,126551],[126553,126553],[126555,126555],[126557,126557],[126559,126559],[126561,126562],[126564,126564],[126567,126570],[126572,126578],[126580,126583],[126585,126588],[126590,126590],[126592,126601],[126603,126619],[126625,126627],[126629,126633],[126635,126651],[1114109,1114109]];function ki(e){var t=[],i="";if(!e||!e.childNodes)return"ltr";function a(e,t){for(var i=t.childNodes.length-1;0<=i;i--)e.push(t.childNodes[i])}for(a(t,e);i=function e(t){if(!t||!t.length)return null;var i=t.pop(),n=i.textContent||i.innerText;if(n){var r=n.match(/^.*(\n|\r)/);return r?r[t.length=0]:n}return"ruby"===i.tagName?e(t):i.childNodes?(a(t,i),e(t)):void 0}(t);)for(var n=0;n=i[0]&&e<=i[1])return 1}}(i.charCodeAt(n)))return"rtl";return"ltr"}function Ci(){}function wi(e,t,i){Ci.call(this),this.cue=t,this.cueDiv=Si(e,t.text);var n={color:"rgba(255, 255, 255, 1)",backgroundColor:"rgba(0, 0, 0, 0.8)",position:"relative",left:0,right:0,top:0,bottom:0,display:"inline",writingMode:""===t.vertical?"horizontal-tb":"lr"===t.vertical?"vertical-lr":"vertical-rl",unicodeBidi:"plaintext"};this.applyStyles(n,this.cueDiv),this.div=e.document.createElement("div"),n={direction:ki(this.cueDiv),writingMode:""===t.vertical?"horizontal-tb":"lr"===t.vertical?"vertical-lr":"vertical-rl",unicodeBidi:"plaintext",textAlign:"middle"===t.align?"center":t.align,font:i.font,whiteSpace:"pre-line",position:"absolute"},this.applyStyles(n),this.div.appendChild(this.cueDiv);var r=0;switch(t.positionAlign){case"start":r=t.position;break;case"center":r=t.position-t.size/2;break;case"end":r=t.position-t.size}""===t.vertical?this.applyStyles({left:this.formatStyle(r,"%"),width:this.formatStyle(t.size,"%")}):this.applyStyles({top:this.formatStyle(r,"%"),height:this.formatStyle(t.size,"%")}),this.move=function(e){this.applyStyles({top:this.formatStyle(e.top,"px"),bottom:this.formatStyle(e.bottom,"px"),left:this.formatStyle(e.left,"px"),right:this.formatStyle(e.right,"px"),height:this.formatStyle(e.height,"px"),width:this.formatStyle(e.width,"px")})}}function Ii(e){var t,i,n,r;e.div&&(t=e.div.offsetHeight,i=e.div.offsetWidth,n=e.div.offsetTop,r=(r=e.div.childNodes)&&(r=r[0])&&r.getClientRects&&r.getClientRects(),e=e.div.getBoundingClientRect(),r=r?Math.max(r[0]&&r[0].height||0,e.height/r.length):0),this.left=e.left,this.right=e.right,this.top=e.top||n,this.height=e.height||t,this.bottom=e.bottom||n+(e.height||t),this.width=e.width||i,this.lineHeight=void 0!==r?r:e.lineHeight}function xi(e,t,o,u){var i,n=new Ii(t),r=t.cue,a=function(e){if("number"==typeof e.line&&(e.snapToLines||0<=e.line&&e.line<=100))return e.line;if(!e.track||!e.track.textTrackList||!e.track.textTrackList.mediaElement)return-1;for(var t=e.track,i=t.textTrackList,n=0,r=0;rd&&(c=c<0?-1:1,c*=Math.ceil(d/l)*l),a<0&&(c+=""===r.vertical?o.height:o.width,s=s.reverse()),n.move(h,c)}else{var p=n.lineHeight/o.height*100;switch(r.lineAlign){case"center":a-=p/2;break;case"end":a-=p}switch(r.vertical){case"":t.applyStyles({top:t.formatStyle(a,"%")});break;case"rl":t.applyStyles({left:t.formatStyle(a,"%")});break;case"lr":t.applyStyles({right:t.formatStyle(a,"%")})}s=["+y","-x","+x","-y"],n=new Ii(t)}n=function(e,t){for(var i,n=new Ii(e),r=1,a=0;ae.left&&this.tope.top},Ii.prototype.overlapsAny=function(e){for(var t=0;t=e.top&&this.bottom<=e.bottom&&this.left>=e.left&&this.right<=e.right},Ii.prototype.overlapsOppositeAxis=function(e,t){switch(t){case"+x":return this.lefte.right;case"+y":return this.tope.bottom}},Ii.prototype.intersectPercentage=function(e){return Math.max(0,Math.min(this.right,e.right)-Math.max(this.left,e.left))*Math.max(0,Math.min(this.bottom,e.bottom)-Math.max(this.top,e.top))/(this.height*this.width)},Ii.prototype.toCSSCompatValues=function(e){return{top:this.top-e.top,bottom:e.bottom-this.bottom,left:this.left-e.left,right:e.right-this.right,height:this.height,width:this.width}},Ii.getSimpleBoxPosition=function(e){var t=e.div?e.div.offsetHeight:e.tagName?e.offsetHeight:0,i=e.div?e.div.offsetWidth:e.tagName?e.offsetWidth:0,n=e.div?e.div.offsetTop:e.tagName?e.offsetTop:0;return{left:(e=e.div?e.div.getBoundingClientRect():e.tagName?e.getBoundingClientRect():e).left,right:e.right,top:e.top||n,height:e.height||t,bottom:e.bottom||n+(e.height||t),width:e.width||i}},Ai.StringDecoder=function(){return{decode:function(e){if(!e)return"";if("string"!=typeof e)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(e))}}},Ai.convertCueToDOMTree=function(e,t){return e&&t?Si(e,t):null};Ai.processCues=function(n,r,e){if(!n||!r||!e)return null;for(;e.firstChild;)e.removeChild(e.firstChild);var a=n.document.createElement("div");if(a.style.position="absolute",a.style.left="0",a.style.right="0",a.style.top="0",a.style.bottom="0",a.style.margin="1.5%",e.appendChild(a),function(e){for(var t=0;tt.length;u--)l.el_.removeChild(n[u-1]);n.length=t.length})},e}(gt)),gt.registerComponent("TimeTooltip",function(i){function e(e,t){t=i.call(this,e,t)||this;return t.update=Ke(Xe(yt(t),t.update),30),t}vt(e,i);var t=e.prototype;return t.createEl=function(){return i.prototype.createEl.call(this,"div",{className:"vjs-time-tooltip"},{"aria-hidden":"true"})},t.update=function(e,t,i){var n=ge(this.el_),r=me(this.player_.el()),a=e.width*t;r&&n&&(t=e.left-r.left+a,r=e.width-a+(r.right-e.right),t<(e=n.width/2)?e+=e-t:rn.width&&(e=n.width),e=Math.round(e),this.el_.style.right="-"+e+"px",this.write(i))},t.write=function(e){ie(this.el_,e)},t.updateTime=function(n,r,a,s){var o=this;this.requestNamedAnimationFrame("TimeTooltip#updateTime",function(){var e,t,i=o.player_.duration();i=o.player_.liveTracker&&o.player_.liveTracker.isLive()?((t=(e=o.player_.liveTracker.liveWindow())-r*e)<1?"":"-")+cn(t,e):cn(a,i),o.update(n,r,i),s&&s()})},e}(gt));L=function(i){function e(e,t){t=i.call(this,e,t)||this;return t.update=Ke(Xe(yt(t),t.update),30),t}vt(e,i);var t=e.prototype;return t.createEl=function(){return i.prototype.createEl.call(this,"div",{className:"vjs-play-progress vjs-slider-bar"},{"aria-hidden":"true"})},t.update=function(e,t){var i,n=this.getChild("timeTooltip");n&&(i=this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime(),n.updateTime(e,t,i))},e}(gt);L.prototype.options_={children:[]},G||O||L.prototype.options_.children.push("timeTooltip"),gt.registerComponent("PlayProgressBar",L);D=function(i){function e(e,t){t=i.call(this,e,t)||this;return t.update=Ke(Xe(yt(t),t.update),30),t}vt(e,i);var t=e.prototype;return t.createEl=function(){return i.prototype.createEl.call(this,"div",{className:"vjs-mouse-display"})},t.update=function(e,t){var i=this,n=t*this.player_.duration();this.getChild("timeTooltip").updateTime(e,t,n,function(){i.el_.style.left=e.width*t+"px"})},e}(gt);D.prototype.options_={children:["timeTooltip"]},gt.registerComponent("MouseTimeDisplay",D);W=function(a){function e(e,t){t=a.call(this,e,t)||this;return t.setEventHandlers_(),t}vt(e,a);var t=e.prototype;return t.setEventHandlers_=function(){var t=this;this.update_=Xe(this,this.update),this.update=Ke(this.update_,30),this.on(this.player_,["ended","durationchange","timeupdate"],this.update),this.player_.liveTracker&&this.on(this.player_.liveTracker,"liveedgechange",this.update),this.updateInterval=null,this.enableIntervalHandler_=function(e){return t.enableInterval_(e)},this.disableIntervalHandler_=function(e){return t.disableInterval_(e)},this.on(this.player_,["playing"],this.enableIntervalHandler_),this.on(this.player_,["ended","pause","waiting"],this.disableIntervalHandler_),"hidden"in d&&"visibilityState"in d&&this.on(d,"visibilitychange",this.toggleVisibility_)},t.toggleVisibility_=function(e){"hidden"===d.visibilityState?(this.cancelNamedAnimationFrame("SeekBar#update"),this.cancelNamedAnimationFrame("Slider#update"),this.disableInterval_(e)):(this.player_.ended()||this.player_.paused()||this.enableInterval_(),this.update())},t.enableInterval_=function(){this.updateInterval||(this.updateInterval=this.setInterval(this.update,30))},t.disableInterval_=function(e){this.player_.liveTracker&&this.player_.liveTracker.isLive()&&e&&"ended"!==e.type||this.updateInterval&&(this.clearInterval(this.updateInterval),this.updateInterval=null)},t.createEl=function(){return a.prototype.createEl.call(this,"div",{className:"vjs-progress-holder"},{"aria-label":this.localize("Progress Bar")})},t.update=function(e){var n=this;if("hidden"!==d.visibilityState){var r=a.prototype.update.call(this);return this.requestNamedAnimationFrame("SeekBar#update",function(){var e=n.player_.ended()?n.player_.duration():n.getCurrentTime_(),t=n.player_.liveTracker,i=n.player_.duration();t&&t.isLive()&&(i=n.player_.liveTracker.liveCurrentTime()),n.percent_!==r&&(n.el_.setAttribute("aria-valuenow",(100*r).toFixed(2)),n.percent_=r),n.currentTime_===e&&n.duration_===i||(n.el_.setAttribute("aria-valuetext",n.localize("progress bar timing: currentTime={1} duration={2}",[cn(e,i),cn(i,i)],"{1} of {2}")),n.currentTime_=e,n.duration_=i),n.bar&&n.bar.update(me(n.el()),n.getProgress())}),r}},t.userSeek_=function(e){this.player_.liveTracker&&this.player_.liveTracker.isLive()&&this.player_.liveTracker.nextSeekedFromUser(),this.player_.currentTime(e)},t.getCurrentTime_=function(){return this.player_.scrubbing()?this.player_.getCache().currentTime:this.player_.currentTime()},t.getPercent=function(){var e,t=this.getCurrentTime_(),i=this.player_.liveTracker;return i&&i.isLive()?(e=(t-i.seekableStart())/i.liveWindow(),i.atLiveEdge()&&(e=1)):e=t/this.player_.duration(),e},t.handleMouseDown=function(e){Ee(e)&&(e.stopPropagation(),this.player_.scrubbing(!0),this.videoWasPlaying=!this.player_.paused(),this.player_.pause(),a.prototype.handleMouseDown.call(this,e))},t.handleMouseMove=function(e){if(Ee(e)){var t=this.calculateDistance(e),i=this.player_.liveTracker;if(i&&i.isLive()){if(.99<=t)return void i.seekToLiveEdge();var n,r=i.seekableStart(),e=i.liveCurrentTime();if((n=(n=e<=(n=r+t*i.liveWindow())?e:n)<=r?r+.1:n)===1/0)return}else(n=t*this.player_.duration())===this.player_.duration()&&(n-=.1);this.userSeek_(n)}},t.enable=function(){a.prototype.enable.call(this);var e=this.getChild("mouseTimeDisplay");e&&e.show()},t.disable=function(){a.prototype.disable.call(this);var e=this.getChild("mouseTimeDisplay");e&&e.hide()},t.handleMouseUp=function(e){a.prototype.handleMouseUp.call(this,e),e&&e.stopPropagation(),this.player_.scrubbing(!1),this.player_.trigger({type:"timeupdate",target:this,manuallyTriggered:!0}),this.videoWasPlaying?It(this.player_.play()):this.update_()},t.stepForward=function(){this.userSeek_(this.player_.currentTime()+5)},t.stepBack=function(){this.userSeek_(this.player_.currentTime()-5)},t.handleAction=function(e){this.player_.paused()?this.player_.play():this.player_.pause()},t.handleKeyDown=function(e){var t,i=this.player_.liveTracker;Lt.isEventKey(e,"Space")||Lt.isEventKey(e,"Enter")?(e.preventDefault(),e.stopPropagation(),this.handleAction(e)):Lt.isEventKey(e,"Home")?(e.preventDefault(),e.stopPropagation(),this.userSeek_(0)):Lt.isEventKey(e,"End")?(e.preventDefault(),e.stopPropagation(),i&&i.isLive()?this.userSeek_(i.liveCurrentTime()):this.userSeek_(this.player_.duration())):/^[0-9]$/.test(Lt(e))?(e.preventDefault(),e.stopPropagation(),t=10*(Lt.codes[Lt(e)]-Lt.codes[0])/100,i&&i.isLive()?this.userSeek_(i.seekableStart()+i.liveWindow()*t):this.userSeek_(this.player_.duration()*t)):Lt.isEventKey(e,"PgDn")?(e.preventDefault(),e.stopPropagation(),this.userSeek_(this.player_.currentTime()-60)):Lt.isEventKey(e,"PgUp")?(e.preventDefault(),e.stopPropagation(),this.userSeek_(this.player_.currentTime()+60)):a.prototype.handleKeyDown.call(this,e)},t.dispose=function(){this.disableInterval_(),this.off(this.player_,["ended","durationchange","timeupdate"],this.update),this.player_.liveTracker&&this.off(this.player_.liveTracker,"liveedgechange",this.update),this.off(this.player_,["playing"],this.enableIntervalHandler_),this.off(this.player_,["ended","pause","waiting"],this.disableIntervalHandler_),"hidden"in d&&"visibilityState"in d&&this.off(d,"visibilitychange",this.toggleVisibility_),a.prototype.dispose.call(this)},e}(o);W.prototype.options_={children:["loadProgressBar","playProgressBar"],barName:"playProgressBar"},G||O||W.prototype.options_.children.splice(1,0,"mouseTimeDisplay"),gt.registerComponent("SeekBar",W);on=function(n){function e(e,t){var i=n.call(this,e,t)||this;return i.handleMouseMove=Ke(Xe(yt(i),i.handleMouseMove),30),i.throttledHandleMouseSeek=Ke(Xe(yt(i),i.handleMouseSeek),30),i.handleMouseUpHandler_=function(e){return i.handleMouseUp(e)},i.handleMouseDownHandler_=function(e){return i.handleMouseDown(e)},i.enable(),i}vt(e,n);var t=e.prototype;return t.createEl=function(){return n.prototype.createEl.call(this,"div",{className:"vjs-progress-control vjs-control"})},t.handleMouseMove=function(e){var t,i,n,r,a=this.getChild("seekBar");a&&(t=a.getChild("playProgressBar"),i=a.getChild("mouseTimeDisplay"),(t||i)&&(r=ge(n=a.el()),e=ye(n,e).x,e=dn(e,0,1),i&&i.update(r,e),t&&t.update(r,a.getProgress())))},t.handleMouseSeek=function(e){var t=this.getChild("seekBar");t&&t.handleMouseMove(e)},t.enabled=function(){return this.enabled_},t.disable=function(){var e;this.children().forEach(function(e){return e.disable&&e.disable()}),this.enabled()&&(this.off(["mousedown","touchstart"],this.handleMouseDownHandler_),this.off(this.el_,"mousemove",this.handleMouseMove),this.removeListenersAddedOnMousedownAndTouchstart(),this.addClass("disabled"),this.enabled_=!1,this.player_.scrubbing()&&(e=this.getChild("seekBar"),this.player_.scrubbing(!1),e.videoWasPlaying&&It(this.player_.play())))},t.enable=function(){this.children().forEach(function(e){return e.enable&&e.enable()}),this.enabled()||(this.on(["mousedown","touchstart"],this.handleMouseDownHandler_),this.on(this.el_,"mousemove",this.handleMouseMove),this.removeClass("disabled"),this.enabled_=!0)},t.removeListenersAddedOnMousedownAndTouchstart=function(){var e=this.el_.ownerDocument;this.off(e,"mousemove",this.throttledHandleMouseSeek),this.off(e,"touchmove",this.throttledHandleMouseSeek),this.off(e,"mouseup",this.handleMouseUpHandler_),this.off(e,"touchend",this.handleMouseUpHandler_)},t.handleMouseDown=function(e){var t=this.el_.ownerDocument,i=this.getChild("seekBar");i&&i.handleMouseDown(e),this.on(t,"mousemove",this.throttledHandleMouseSeek),this.on(t,"touchmove",this.throttledHandleMouseSeek),this.on(t,"mouseup",this.handleMouseUpHandler_),this.on(t,"touchend",this.handleMouseUpHandler_)},t.handleMouseUp=function(e){var t=this.getChild("seekBar");t&&t.handleMouseUp(e),this.removeListenersAddedOnMousedownAndTouchstart()},e}(gt);on.prototype.options_={children:["seekBar"]},gt.registerComponent("ProgressControl",on);A=function(n){function e(e,t){var i=n.call(this,e,t)||this;return i.on(e,["enterpictureinpicture","leavepictureinpicture"],function(e){return i.handlePictureInPictureChange(e)}),i.on(e,["disablepictureinpicturechanged","loadedmetadata"],function(e){return i.handlePictureInPictureEnabledChange(e)}),i.disable(),i}vt(e,n);var t=e.prototype;return t.buildCSSClass=function(){return"vjs-picture-in-picture-control "+n.prototype.buildCSSClass.call(this)},t.handlePictureInPictureEnabledChange=function(){d.pictureInPictureEnabled&&!1===this.player_.disablePictureInPicture()?this.enable():this.disable()},t.handlePictureInPictureChange=function(e){this.player_.isInPictureInPicture()?this.controlText("Exit Picture-in-Picture"):this.controlText("Picture-in-Picture"),this.handlePictureInPictureEnabledChange()},t.handleClick=function(e){this.player_.isInPictureInPicture()?this.player_.exitPictureInPicture():this.player_.requestPictureInPicture()},e}(sn);A.prototype.controlText_="Picture-in-Picture",gt.registerComponent("PictureInPictureToggle",A);qt=function(n){function e(e,t){var i=n.call(this,e,t)||this;return i.on(e,"fullscreenchange",function(e){return i.handleFullscreenChange(e)}),!1===d[e.fsApi_.fullscreenEnabled]&&i.disable(),i}vt(e,n);var t=e.prototype;return t.buildCSSClass=function(){return"vjs-fullscreen-control "+n.prototype.buildCSSClass.call(this)},t.handleFullscreenChange=function(e){this.player_.isFullscreen()?this.controlText("Non-Fullscreen"):this.controlText("Fullscreen")},t.handleClick=function(e){this.player_.isFullscreen()?this.player_.exitFullscreen():this.player_.requestFullscreen()},e}(sn);qt.prototype.controlText_="Fullscreen",gt.registerComponent("FullscreenToggle",qt);gt.registerComponent("VolumeLevel",function(t){function e(){return t.apply(this,arguments)||this}return vt(e,t),e.prototype.createEl=function(){var e=t.prototype.createEl.call(this,"div",{className:"vjs-volume-level"});return e.appendChild(t.prototype.createEl.call(this,"span",{className:"vjs-control-text"})),e},e}(gt)),gt.registerComponent("VolumeLevelTooltip",function(i){function e(e,t){t=i.call(this,e,t)||this;return t.update=Ke(Xe(yt(t),t.update),30),t}vt(e,i);var t=e.prototype;return t.createEl=function(){return i.prototype.createEl.call(this,"div",{className:"vjs-volume-tooltip"},{"aria-hidden":"true"})},t.update=function(e,t,i,n){if(!i){var r=me(this.el_),a=me(this.player_.el()),i=e.width*t;if(!a||!r)return;t=e.left-a.left+i,a=e.width-i+(a.right-e.right),e=r.width/2;tr.width&&(e=r.width),this.el_.style.right="-"+e+"px"}this.write(n+"%")},t.write=function(e){ie(this.el_,e)},t.updateVolume=function(e,t,i,n,r){var a=this;this.requestNamedAnimationFrame("VolumeLevelTooltip#updateVolume",function(){a.update(e,t,i,n.toFixed(0)),r&&r()})},e}(gt));P=function(i){function e(e,t){t=i.call(this,e,t)||this;return t.update=Ke(Xe(yt(t),t.update),30),t}vt(e,i);var t=e.prototype;return t.createEl=function(){return i.prototype.createEl.call(this,"div",{className:"vjs-mouse-display"})},t.update=function(e,t,i){var n=this,r=100*t;this.getChild("volumeLevelTooltip").updateVolume(e,t,i,r,function(){i?n.el_.style.bottom=e.height*t+"px":n.el_.style.left=e.width*t+"px"})},e}(gt);P.prototype.options_={children:["volumeLevelTooltip"]},gt.registerComponent("MouseVolumeLevelDisplay",P);e=function(n){function e(e,t){var i=n.call(this,e,t)||this;return i.on("slideractive",function(e){return i.updateLastVolume_(e)}),i.on(e,"volumechange",function(e){return i.updateARIAAttributes(e)}),e.ready(function(){return i.updateARIAAttributes()}),i}vt(e,n);var t=e.prototype;return t.createEl=function(){return n.prototype.createEl.call(this,"div",{className:"vjs-volume-bar vjs-slider-bar"},{"aria-label":this.localize("Volume Level"),"aria-live":"polite"})},t.handleMouseDown=function(e){Ee(e)&&n.prototype.handleMouseDown.call(this,e)},t.handleMouseMove=function(e){var t,i,n,r=this.getChild("mouseVolumeLevelDisplay");r&&(t=me(n=this.el()),i=this.vertical(),n=ye(n,e),n=i?n.y:n.x,n=dn(n,0,1),r.update(t,n,i)),Ee(e)&&(this.checkMuted(),this.player_.volume(this.calculateDistance(e)))},t.checkMuted=function(){this.player_.muted()&&this.player_.muted(!1)},t.getPercent=function(){return this.player_.muted()?0:this.player_.volume()},t.stepForward=function(){this.checkMuted(),this.player_.volume(this.player_.volume()+.1)},t.stepBack=function(){this.checkMuted(),this.player_.volume(this.player_.volume()-.1)},t.updateARIAAttributes=function(e){var t=this.player_.muted()?0:this.volumeAsPercentage_();this.el_.setAttribute("aria-valuenow",t),this.el_.setAttribute("aria-valuetext",t+"%")},t.volumeAsPercentage_=function(){return Math.round(100*this.player_.volume())},t.updateLastVolume_=function(){var e=this,t=this.player_.volume();this.one("sliderinactive",function(){0===e.player_.volume()&&e.player_.lastVolume_(t)})},e}(o);e.prototype.options_={children:["volumeLevel"],barName:"volumeLevel"},G||O||e.prototype.options_.children.splice(0,0,"mouseVolumeLevelDisplay"),e.prototype.playerEvent="volumechange",gt.registerComponent("VolumeBar",e);s=function(a){function e(e,t){var i,n,r;return(t=void 0===t?{}:t).vertical=t.vertical||!1,"undefined"!=typeof t.volumeBar&&!w(t.volumeBar)||(t.volumeBar=t.volumeBar||{},t.volumeBar.vertical=t.vertical),i=a.call(this,e,t)||this,n=yt(i),(r=e).tech_&&!r.tech_.featuresVolumeControl&&n.addClass("vjs-hidden"),n.on(r,"loadstart",function(){r.tech_.featuresVolumeControl?n.removeClass("vjs-hidden"):n.addClass("vjs-hidden")}),i.throttledHandleMouseMove=Ke(Xe(yt(i),i.handleMouseMove),30),i.handleMouseUpHandler_=function(e){return i.handleMouseUp(e)},i.on("mousedown",function(e){return i.handleMouseDown(e)}),i.on("touchstart",function(e){return i.handleMouseDown(e)}),i.on("mousemove",function(e){return i.handleMouseMove(e)}),i.on(i.volumeBar,["focus","slideractive"],function(){i.volumeBar.addClass("vjs-slider-active"),i.addClass("vjs-slider-active"),i.trigger("slideractive")}),i.on(i.volumeBar,["blur","sliderinactive"],function(){i.volumeBar.removeClass("vjs-slider-active"),i.removeClass("vjs-slider-active"),i.trigger("sliderinactive")}),i}vt(e,a);var t=e.prototype;return t.createEl=function(){var e="vjs-volume-horizontal";return this.options_.vertical&&(e="vjs-volume-vertical"),a.prototype.createEl.call(this,"div",{className:"vjs-volume-control vjs-control "+e})},t.handleMouseDown=function(e){var t=this.el_.ownerDocument;this.on(t,"mousemove",this.throttledHandleMouseMove),this.on(t,"touchmove",this.throttledHandleMouseMove),this.on(t,"mouseup",this.handleMouseUpHandler_),this.on(t,"touchend",this.handleMouseUpHandler_)},t.handleMouseUp=function(e){var t=this.el_.ownerDocument;this.off(t,"mousemove",this.throttledHandleMouseMove),this.off(t,"touchmove",this.throttledHandleMouseMove),this.off(t,"mouseup",this.handleMouseUpHandler_),this.off(t,"touchend",this.handleMouseUpHandler_)},t.handleMouseMove=function(e){this.volumeBar.handleMouseMove(e)},e}(gt);s.prototype.options_={children:["volumeBar"]},gt.registerComponent("VolumeControl",s);L=function(a){function e(e,t){var i,n,r=a.call(this,e,t)||this;return i=yt(r),(n=e).tech_&&!n.tech_.featuresMuteControl&&i.addClass("vjs-hidden"),i.on(n,"loadstart",function(){n.tech_.featuresMuteControl?i.removeClass("vjs-hidden"):i.addClass("vjs-hidden")}),r.on(e,["loadstart","volumechange"],function(e){return r.update(e)}),r}vt(e,a);var t=e.prototype;return t.buildCSSClass=function(){return"vjs-mute-control "+a.prototype.buildCSSClass.call(this)},t.handleClick=function(e){var t=this.player_.volume(),i=this.player_.lastVolume_();0===t?(this.player_.volume(i<.1?.1:i),this.player_.muted(!1)):this.player_.muted(!this.player_.muted())},t.update=function(e){this.updateIcon_(),this.updateControlText_()},t.updateIcon_=function(){var e=this.player_.volume(),t=3;G&&this.player_.tech_&&this.player_.tech_.el_&&this.player_.muted(this.player_.tech_.el_.muted),0===e||this.player_.muted()?t=0:e<.33?t=1:e<.67&&(t=2);for(var i=0;i<4;i++)se(this.el_,"vjs-vol-"+i);ae(this.el_,"vjs-vol-"+t)},t.updateControlText_=function(){var e=this.player_.muted()||0===this.player_.volume()?"Unmute":"Mute";this.controlText()!==e&&this.controlText(e)},e}(sn);L.prototype.controlText_="Mute",gt.registerComponent("MuteToggle",L);D=function(n){function e(e,t){var i;return"undefined"!=typeof(t=void 0===t?{}:t).inline?t.inline=t.inline:t.inline=!0,"undefined"!=typeof t.volumeControl&&!w(t.volumeControl)||(t.volumeControl=t.volumeControl||{},t.volumeControl.vertical=!t.inline),(i=n.call(this,e,t)||this).handleKeyPressHandler_=function(e){return i.handleKeyPress(e)},i.on(e,["loadstart"],function(e){return i.volumePanelState_(e)}),i.on(i.muteToggle,"keyup",function(e){return i.handleKeyPress(e)}),i.on(i.volumeControl,"keyup",function(e){return i.handleVolumeControlKeyUp(e)}),i.on("keydown",function(e){return i.handleKeyPress(e)}),i.on("mouseover",function(e){return i.handleMouseOver(e)}),i.on("mouseout",function(e){return i.handleMouseOut(e)}),i.on(i.volumeControl,["slideractive"],i.sliderActive_),i.on(i.volumeControl,["sliderinactive"],i.sliderInactive_),i}vt(e,n);var t=e.prototype;return t.sliderActive_=function(){this.addClass("vjs-slider-active")},t.sliderInactive_=function(){this.removeClass("vjs-slider-active")},t.volumePanelState_=function(){this.volumeControl.hasClass("vjs-hidden")&&this.muteToggle.hasClass("vjs-hidden")&&this.addClass("vjs-hidden"),this.volumeControl.hasClass("vjs-hidden")&&!this.muteToggle.hasClass("vjs-hidden")&&this.addClass("vjs-mute-toggle-only")},t.createEl=function(){var e="vjs-volume-panel-horizontal";return this.options_.inline||(e="vjs-volume-panel-vertical"),n.prototype.createEl.call(this,"div",{className:"vjs-volume-panel vjs-control "+e})},t.dispose=function(){this.handleMouseOut(),n.prototype.dispose.call(this)},t.handleVolumeControlKeyUp=function(e){Lt.isEventKey(e,"Esc")&&this.muteToggle.focus()},t.handleMouseOver=function(e){this.addClass("vjs-hover"),qe(d,"keyup",this.handleKeyPressHandler_)},t.handleMouseOut=function(e){this.removeClass("vjs-hover"),Ve(d,"keyup",this.handleKeyPressHandler_)},t.handleKeyPress=function(e){Lt.isEventKey(e,"Esc")&&this.handleMouseOut()},e}(gt);D.prototype.options_={children:["muteToggle","volumeControl"]},gt.registerComponent("VolumePanel",D);var pn=function(n){function e(e,t){var i=n.call(this,e,t)||this;return t&&(i.menuButton_=t.menuButton),i.focusedChild_=-1,i.on("keydown",function(e){return i.handleKeyDown(e)}),i.boundHandleBlur_=function(e){return i.handleBlur(e)},i.boundHandleTapClick_=function(e){return i.handleTapClick(e)},i}vt(e,n);var t=e.prototype;return t.addEventListenerForItem=function(e){e instanceof gt&&(this.on(e,"blur",this.boundHandleBlur_),this.on(e,["tap","click"],this.boundHandleTapClick_))},t.removeEventListenerForItem=function(e){e instanceof gt&&(this.off(e,"blur",this.boundHandleBlur_),this.off(e,["tap","click"],this.boundHandleTapClick_))},t.removeChild=function(e){"string"==typeof e&&(e=this.getChild(e)),this.removeEventListenerForItem(e),n.prototype.removeChild.call(this,e)},t.addItem=function(e){e=this.addChild(e);e&&this.addEventListenerForItem(e)},t.createEl=function(){var e=this.options_.contentElType||"ul";this.contentEl_=te(e,{className:"vjs-menu-content"}),this.contentEl_.setAttribute("role","menu");e=n.prototype.createEl.call(this,"div",{append:this.contentEl_,className:"vjs-menu"});return e.appendChild(this.contentEl_),qe(e,"click",function(e){e.preventDefault(),e.stopImmediatePropagation()}),e},t.dispose=function(){this.contentEl_=null,this.boundHandleBlur_=null,this.boundHandleTapClick_=null,n.prototype.dispose.call(this)},t.handleBlur=function(e){var t=e.relatedTarget||d.activeElement;this.children().some(function(e){return e.el()===t})||(e=this.menuButton_)&&e.buttonPressed_&&t!==e.el().firstChild&&e.unpressButton()},t.handleTapClick=function(t){var e;this.menuButton_&&(this.menuButton_.unpressButton(),e=this.children(),!Array.isArray(e)||(e=e.filter(function(e){return e.el()===t.target})[0])&&"CaptionSettingsMenuItem"!==e.name()&&this.menuButton_.focus())},t.handleKeyDown=function(e){Lt.isEventKey(e,"Left")||Lt.isEventKey(e,"Down")?(e.preventDefault(),e.stopPropagation(),this.stepForward()):(Lt.isEventKey(e,"Right")||Lt.isEventKey(e,"Up"))&&(e.preventDefault(),e.stopPropagation(),this.stepBack())},t.stepForward=function(){var e=0;void 0!==this.focusedChild_&&(e=this.focusedChild_+1),this.focus(e)},t.stepBack=function(){var e=0;void 0!==this.focusedChild_&&(e=this.focusedChild_-1),this.focus(e)},t.focus=function(e){void 0===e&&(e=0);var t=this.children().slice();t.length&&t[0].hasClass("vjs-menu-title")&&t.shift(),0=t.length&&(e=t.length-1),t[this.focusedChild_=e].el_.focus())},e}(gt);gt.registerComponent("Menu",pn);W=function(n){function e(e,t){var i;(i=n.call(this,e,t=void 0===t?{}:t)||this).menuButton_=new sn(e,t),i.menuButton_.controlText(i.controlText_),i.menuButton_.el_.setAttribute("aria-haspopup","true");t=sn.prototype.buildCSSClass();i.menuButton_.el_.className=i.buildCSSClass()+" "+t,i.menuButton_.removeClass("vjs-control"),i.addChild(i.menuButton_),i.update(),i.enabled_=!0;t=function(e){return i.handleClick(e)};return i.handleMenuKeyUp_=function(e){return i.handleMenuKeyUp(e)},i.on(i.menuButton_,"tap",t),i.on(i.menuButton_,"click",t),i.on(i.menuButton_,"keydown",function(e){return i.handleKeyDown(e)}),i.on(i.menuButton_,"mouseenter",function(){i.addClass("vjs-hover"),i.menu.show(),qe(d,"keyup",i.handleMenuKeyUp_)}),i.on("mouseleave",function(e){return i.handleMouseLeave(e)}),i.on("keydown",function(e){return i.handleSubmenuKeyDown(e)}),i}vt(e,n);var t=e.prototype;return t.update=function(){var e=this.createMenu();this.menu&&(this.menu.dispose(),this.removeChild(this.menu)),this.menu=e,this.addChild(e),this.buttonPressed_=!1,this.menuButton_.el_.setAttribute("aria-expanded","false"),this.items&&this.items.length<=this.hideThreshold_?this.hide():this.show()},t.createMenu=function(){var e,t=new pn(this.player_,{menuButton:this});if(this.hideThreshold_=0,this.options_.title&&(e=te("li",{className:"vjs-menu-title",textContent:ht(this.options_.title),tabIndex:-1}),e=new gt(this.player_,{el:e}),t.addItem(e)),this.items=this.createItems(),this.items)for(var i=0;it){n=i[r];break}this.player().playbackRate(n)},t.handlePlaybackRateschange=function(e){this.update()},t.playbackRates=function(){var e=this.player();return e.playbackRates&&e.playbackRates()||[]},t.playbackRateSupported=function(){return this.player().tech_&&this.player().tech_.featuresPlaybackRate&&this.playbackRates()&&0 select",id:"captions-background-color-%s",label:"Color",options:[s,W,A,on,qt,H,D,L]},backgroundOpacity:{selector:".vjs-bg-opacity > select",id:"captions-background-opacity-%s",label:"Transparency",options:[P,o,e]},color:{selector:".vjs-fg-color > select",id:"captions-foreground-color-%s",label:"Color",options:[W,s,A,on,qt,H,D,L]},edgeStyle:{selector:".vjs-edge-style > select",id:"%s",label:"Text Edge Style",options:[["none","None"],["raised","Raised"],["depressed","Depressed"],["uniform","Uniform"],["dropshadow","Dropshadow"]]},fontFamily:{selector:".vjs-font-family > select",id:"captions-font-family-%s",label:"Font Family",options:[["proportionalSansSerif","Proportional Sans-Serif"],["monospaceSansSerif","Monospace Sans-Serif"],["proportionalSerif","Proportional Serif"],["monospaceSerif","Monospace Serif"],["casual","Casual"],["script","Script"],["small-caps","Small Caps"]]},fontPercent:{selector:".vjs-font-percent > select",id:"captions-font-size-%s",label:"Font Size",options:[["0.50","50%"],["0.75","75%"],["1.00","100%"],["1.25","125%"],["1.50","150%"],["1.75","175%"],["2.00","200%"],["3.00","300%"],["4.00","400%"]],default:2,parser:function(e){return"1.00"===e?null:Number(e)}},textOpacity:{selector:".vjs-text-opacity > select",id:"captions-foreground-opacity-%s",label:"Transparency",options:[P,o]},windowColor:{selector:".vjs-window-color > select",id:"captions-window-color-%s",label:"Color"},windowOpacity:{selector:".vjs-window-opacity > select",id:"captions-window-opacity-%s",label:"Transparency",options:[e,o,P]}};function kn(e,t){if((e=t?t(e):e)&&"none"!==e)return e}En.windowColor.options=En.backgroundColor.options,gt.registerComponent("TextTrackSettings",function(n){function e(e,t){var i;return t.temporary=!1,(i=n.call(this,e,t)||this).updateDisplay=i.updateDisplay.bind(yt(i)),i.fill(),i.hasBeenOpened_=i.hasBeenFilled_=!0,i.endDialog=te("p",{className:"vjs-control-text",textContent:i.localize("End of dialog window.")}),i.el().appendChild(i.endDialog),i.setDefaults(),void 0===t.persistTextTrackSettings&&(i.options_.persistTextTrackSettings=i.options_.playerOptions.persistTextTrackSettings),i.on(i.$(".vjs-done-button"),"click",function(){i.saveSettings(),i.close()}),i.on(i.$(".vjs-default-button"),"click",function(){i.setDefaults(),i.updateDisplay()}),E(En,function(e){i.on(i.$(e.selector),"change",i.updateDisplay)}),i.options_.persistTextTrackSettings&&i.restoreSettings(),i}vt(e,n);var t=e.prototype;return t.dispose=function(){this.endDialog=null,n.prototype.dispose.call(this)},t.createElSelect_=function(e,t,i){var n=this;void 0===t&&(t=""),void 0===i&&(i="label");var e=En[e],r=e.id.replace("%s",this.id_),a=[t,r].join(" ").trim();return["<"+i+' id="'+r+'" class="'+("label"===i?"vjs-label":"")+'">',this.localize(e.label),"",'").join("")},t.createElFgColor_=function(){var e="captions-text-legend-"+this.id_;return['
','',this.localize("Text"),"",this.createElSelect_("color",e),'',this.createElSelect_("textOpacity",e),"","
"].join("")},t.createElBgColor_=function(){var e="captions-background-"+this.id_;return['
','',this.localize("Background"),"",this.createElSelect_("backgroundColor",e),'',this.createElSelect_("backgroundOpacity",e),"","
"].join("")},t.createElWinColor_=function(){var e="captions-window-"+this.id_;return['
','',this.localize("Window"),"",this.createElSelect_("windowColor",e),'',this.createElSelect_("windowOpacity",e),"","
"].join("")},t.createElColors_=function(){return te("div",{className:"vjs-track-settings-colors",innerHTML:[this.createElFgColor_(),this.createElBgColor_(),this.createElWinColor_()].join("")})},t.createElFont_=function(){return te("div",{className:"vjs-track-settings-font",innerHTML:['
',this.createElSelect_("fontPercent","","legend"),"
",'
',this.createElSelect_("edgeStyle","","legend"),"
",'
',this.createElSelect_("fontFamily","","legend"),"
"].join("")})},t.createElControls_=function(){var e=this.localize("restore all settings to the default values");return te("div",{className:"vjs-track-settings-controls",innerHTML:['",'"].join("")})},t.content=function(){return[this.createElColors_(),this.createElFont_(),this.createElControls_()]},t.label=function(){return this.localize("Caption Settings Dialog")},t.description=function(){return this.localize("Beginning of dialog window. Escape will cancel and close the window.")},t.buildCSSClass=function(){return n.prototype.buildCSSClass.call(this)+" vjs-text-track-settings"},t.getValues=function(){var i,n,e,r=this;return n=function(e,t,i){var n,t=(n=r.$(t.selector),t=t.parser,kn(n.options[n.options.selectedIndex].value,t));return void 0!==t&&(e[i]=t),e},void 0===(e={})&&(e=0),S(i=En).reduce(function(e,t){return n(e,i[t],t)},e)},t.setValues=function(i){var n=this;E(En,function(e,t){!function(e,t,i){if(t)for(var n=0;nthis.options_.liveTolerance,(t=!this.timeupdateSeen_||e===1/0?!1:t)!==this.behindLiveEdge_&&(this.behindLiveEdge_=t,this.trigger("liveedgechange")))},t.handleDurationchange=function(){this.toggleTracking()},t.toggleTracking=function(){this.player_.duration()===1/0&&this.liveWindow()>=this.options_.trackingThreshold?(this.player_.options_.liveui&&this.player_.addClass("vjs-liveui"),this.startTracking()):(this.player_.removeClass("vjs-liveui"),this.stopTracking())},t.startTracking=function(){this.isTracking()||(this.timeupdateSeen_||(this.timeupdateSeen_=this.player_.hasStarted()),this.trackingInterval_=this.setInterval(this.trackLiveHandler_,30),this.trackLive_(),this.on(this.player_,["play","pause"],this.trackLiveHandler_),this.timeupdateSeen_?this.on(this.player_,"seeked",this.handleSeeked_):(this.one(this.player_,"play",this.handlePlay_),this.one(this.player_,"timeupdate",this.handleFirstTimeupdate_)))},t.handleFirstTimeupdate=function(){this.timeupdateSeen_=!0,this.on(this.player_,"seeked",this.handleSeeked_)},t.handleSeeked=function(){var e=Math.abs(this.liveCurrentTime()-this.player_.currentTime());this.seekedBehindLive_=this.nextSeekedFromUser_&&2",lt:"<",quot:'"'}),t.HTML_ENTITIES=i({lt:"<",gt:">",amp:"&",quot:'"',apos:"'",Agrave:"À",Aacute:"Á",Acirc:"Â",Atilde:"Ã",Auml:"Ä",Aring:"Å",AElig:"Æ",Ccedil:"Ç",Egrave:"È",Eacute:"É",Ecirc:"Ê",Euml:"Ë",Igrave:"Ì",Iacute:"Í",Icirc:"Î",Iuml:"Ï",ETH:"Ð",Ntilde:"Ñ",Ograve:"Ò",Oacute:"Ó",Ocirc:"Ô",Otilde:"Õ",Ouml:"Ö",Oslash:"Ø",Ugrave:"Ù",Uacute:"Ú",Ucirc:"Û",Uuml:"Ü",Yacute:"Ý",THORN:"Þ",szlig:"ß",agrave:"à",aacute:"á",acirc:"â",atilde:"ã",auml:"ä",aring:"Ã¥",aelig:"æ",ccedil:"ç",egrave:"è",eacute:"é",ecirc:"ê",euml:"ë",igrave:"ì",iacute:"í",icirc:"î",iuml:"ï",eth:"ð",ntilde:"ñ",ograve:"ò",oacute:"ó",ocirc:"ô",otilde:"õ",ouml:"ö",oslash:"ø",ugrave:"ù",uacute:"ú",ucirc:"û",uuml:"ü",yacute:"ý",thorn:"þ",yuml:"ÿ",nbsp:" ",iexcl:"¡",cent:"¢",pound:"£",curren:"¤",yen:"Â¥",brvbar:"¦",sect:"§",uml:"¨",copy:"©",ordf:"ª",laquo:"«",not:"¬",shy:"­­",reg:"®",macr:"¯",deg:"°",plusmn:"±",sup2:"²",sup3:"³",acute:"´",micro:"µ",para:"¶",middot:"·",cedil:"¸",sup1:"¹",ordm:"º",raquo:"»",frac14:"¼",frac12:"½",frac34:"¾",iquest:"¿",times:"×",divide:"÷",forall:"∀",part:"∂",exist:"∃",empty:"∅",nabla:"∇",isin:"∈",notin:"∉",ni:"∋",prod:"∏",sum:"∑",minus:"−",lowast:"∗",radic:"√",prop:"∝",infin:"∞",ang:"∠",and:"∧",or:"∨",cap:"∩",cup:"∪",int:"∫",there4:"∴",sim:"∼",cong:"≅",asymp:"≈",ne:"≠",equiv:"≡",le:"≤",ge:"≥",sub:"⊂",sup:"⊃",nsub:"⊄",sube:"⊆",supe:"⊇",oplus:"⊕",otimes:"⊗",perp:"⊥",sdot:"⋅",Alpha:"Α",Beta:"Β",Gamma:"Γ",Delta:"Δ",Epsilon:"Ε",Zeta:"Ζ",Eta:"Η",Theta:"Θ",Iota:"Ι",Kappa:"Κ",Lambda:"Λ",Mu:"Μ",Nu:"Ν",Xi:"Ξ",Omicron:"Ο",Pi:"Π",Rho:"Ρ",Sigma:"Σ",Tau:"Τ",Upsilon:"Î¥",Phi:"Φ",Chi:"Χ",Psi:"Ψ",Omega:"Ω",alpha:"α",beta:"β",gamma:"γ",delta:"δ",epsilon:"ε",zeta:"ζ",eta:"η",theta:"θ",iota:"ι",kappa:"κ",lambda:"λ",mu:"μ",nu:"ν",xi:"ξ",omicron:"ο",pi:"π",rho:"ρ",sigmaf:"ς",sigma:"σ",tau:"τ",upsilon:"υ",phi:"φ",chi:"χ",psi:"ψ",omega:"ω",thetasym:"ϑ",upsih:"ϒ",piv:"ϖ",OElig:"Œ",oelig:"œ",Scaron:"Å ",scaron:"Å¡",Yuml:"Ÿ",fnof:"ƒ",circ:"ˆ",tilde:"˜",ensp:" ",emsp:" ",thinsp:" ",zwnj:"‌",zwj:"‍",lrm:"‎",rlm:"‏",ndash:"–",mdash:"—",lsquo:"‘",rsquo:"’",sbquo:"‚",ldquo:"“",rdquo:"”",bdquo:"„",dagger:"†",Dagger:"‡",bull:"•",hellip:"…",permil:"‰",prime:"′",Prime:"″",lsaquo:"‹",rsaquo:"›",oline:"‾",euro:"€",trade:"™",larr:"←",uarr:"↑",rarr:"→",darr:"↓",harr:"↔",crarr:"↵",lceil:"⌈",rceil:"⌉",lfloor:"⌊",rfloor:"⌋",loz:"◊",spades:"♠",clubs:"♣",hearts:"♥",diams:"♦"}),t.entityMap=t.HTML_ENTITIES});Rr.XML_ENTITIES,Rr.HTML_ENTITIES,Rr.entityMap;var Mr=Or.NAMESPACE,K=/[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,ai=new RegExp("[\\-\\.0-9"+K.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"),Nr=new RegExp("^"+K.source+ai.source+"*(?::"+K.source+ai.source+"*)?$"),Ur=0,Br=1,Fr=2,jr=3,Hr=4,qr=5,Vr=6,Wr=7;function zr(e,t){this.message=e,this.locator=t,Error.captureStackTrace&&Error.captureStackTrace(this,zr)}function Gr(){}function Xr(e,t){return t.lineNumber=e.lineNumber,t.columnNumber=e.columnNumber,t}function Kr(e,t,i){for(var n=e.tagName,r=null,a=e.length;a--;){var s=e[a],o=s.qName,u=s.value,o=0<(c=o.indexOf(":"))?(l=s.prefix=o.slice(0,c),d=o.slice(c+1),"xmlns"===l&&d):(l=null,"xmlns"===(d=o)&&"");s.localName=d,!1!==o&&(null==r&&(r={},Yr(i,i={})),i[o]=r[o]=u,s.uri=Mr.XMLNS,t.startPrefixMapping(o,u))}for(var l,a=e.length;a--;)(l=(s=e[a]).prefix)&&("xml"===l&&(s.uri=Mr.XML),"xmlns"!==l&&(s.uri=i[l||""]));var c,d=0<(c=n.indexOf(":"))?(l=e.prefix=n.slice(0,c),e.localName=n.slice(c+1)):(l=null,e.localName=n),h=e.uri=i[l||""];if(t.startElement(h,d,n,e),!e.closed)return e.currentNSMap=i,e.localNSMap=r,1;if(t.endElement(h,d,n),r)for(l in r)t.endPrefixMapping(l)}function Yr(e,t){for(var i in e)t[i]=e[i]}function Qr(){this.attributeNames={}}(zr.prototype=new Error).name=zr.name,Gr.prototype={parse:function(e,t,i){var n=this.domBuilder;n.startDocument(),Yr(t,t={}),function(i,e,n,r,a){function s(e){var t=e.slice(1,-1);return t in n?n[t]:"#"===t.charAt(0)?65535<(t=parseInt(t.substr(1).replace("x","0x")))?(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t))):String.fromCharCode(t):(a.error("entity not found:"+e),e)}function t(e){var t;f",y+3),_=i.substring(y+2,v).replace(/[ \t\n\r]+$/g,""),b=h.pop();v<0?(_=i.substring(y+2).replace(/[\s<].*/,""),a.error("end tag name: "+_+" is not complete:"+b.tagName),v=y+1+_.length):_.match(/\s",t);if(n){t=e.substring(t,n).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);return t?(t[0].length,i.processingInstruction(t[1],t[2]),n+2):-1}return-1}(i,y,r);break;case"!":d&&o(y),v=function(e,t,i,n){{if("-"===e.charAt(t+2)){if("-"!==e.charAt(t+3))return-1;var r=e.indexOf("--\x3e",t+4);return t",t+9);return i.startCDATA(),i.characters(e,t+9,r-t-9),i.endCDATA(),r+3}var a=function(e,t){var i,n=[],r=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;r.lastIndex=t,r.exec(e);for(;i=r.exec(e);)if(n.push(i),i[1])return n}(e,t),n=a.length;if(1":switch(l){case Ur:n.setTagName(e.slice(t,u));case qr:case Vr:case Wr:break;case Hr:case Br:"/"===(d=e.slice(t,u)).slice(-1)&&(n.closed=!0,d=d.slice(0,-1));case Fr:l===Fr&&(d=o),l==Hr?(a.warning('attribute "'+d+'" missed quot(")!'),s(o,d.replace(/&#?\w+;/g,r),t)):(Mr.isHTML(i[""])&&d.match(/^(?:disabled|checked|selected)$/i)||a.warning('attribute "'+d+'" missed value!! "'+d+'" instead!!'),s(d,d,t));break;case jr:throw new Error("attribute value missed!!")}return u;case"€":c=" ";default:if(c<=" ")switch(l){case Ur:n.setTagName(e.slice(t,u)),l=Vr;break;case Br:o=e.slice(t,u),l=Fr;break;case Hr:var d=e.slice(t,u).replace(/&#?\w+;/g,r);a.warning('attribute "'+d+'" missed quot(")!!'),s(o,d,t);case qr:l=Vr}else switch(l){case Fr:n.tagName,Mr.isHTML(i[""])&&o.match(/^(?:disabled|checked|selected)$/i)||a.warning('attribute "'+o+'" missed value!! "'+o+'" instead2!!'),s(o,o,t),t=u,l=Br;break;case qr:a.warning('attribute space is required"'+o+'"!!');case Vr:l=Br,t=u;break;case jr:l=Hr,t=u;break;case Wr:throw new Error("elements closed character '/' and '>' must be connected to")}}u++}}(i,y,k,C,s,a),w=k.length;if(!k.closed&&function(e,t,i,n){var r=n[i];null==r&&((r=e.lastIndexOf(""))",t),e=e.substring(t+1,a);if(/[&<]/.test(e))return/^script$/i.test(i)||(e=e.replace(/&#?\w+;/g,n)),r.characters(e,0,e.length),a}return t+1}(i,v,k.tagName,s,r):v++}}catch(e){if(e instanceof zr)throw e;a.error("element parse error: "+e),v=-1}f"==e&&">")||"&"==e&&"&"||'"'==e&&"""||"&#"+e.charCodeAt()+";"}function Ia(e,t){if(t(e))return 1;if(e=e.firstChild)do{if(Ia(e,t))return 1}while(e=e.nextSibling)}function xa(){}function Aa(e,t,i){e&&e._inc++,i.namespaceURI===Jr.XMLNS&&delete t._nsMap[i.prefix?i.localName:""]}function Pa(e,t,i){if(e&&e._inc){e._inc++;var n=t.childNodes;if(i)n[n.length++]=i;else{for(var r=t.firstChild,a=0;r;)r=(n[a++]=r).nextSibling;n.length=a}}}function La(e,t){var i=t.previousSibling,n=t.nextSibling;return i?i.nextSibling=n:e.firstChild=n,n?n.previousSibling=i:e.lastChild=i,Pa(e.ownerDocument,e),t}function Da(e,t,i){var n=t.parentNode;if(n&&n.removeChild(t),t.nodeType===pa){var r=t.firstChild;if(null==r)return t;var a=t.lastChild}else r=a=t;n=i?i.previousSibling:e.lastChild;for(r.previousSibling=n,a.nextSibling=i,n?n.nextSibling=r:e.firstChild=r,null==i?e.lastChild=a:i.previousSibling=a;r.parentNode=e,r!==a&&(r=r.nextSibling););return Pa(e.ownerDocument||e,e),t.nodeType==pa&&(t.firstChild=t.lastChild=null),t}function Oa(){this._nsMap={}}function Ra(){}function Ma(){}function Na(){}function Ua(){}function Ba(){}function Fa(){}function ja(){}function Ha(){}function qa(){}function Va(){}function Wa(){}function za(){}function Ga(e,t){var i,n=[],r=9==this.nodeType&&this.documentElement||this,a=r.prefix,s=r.namespaceURI;return Ya(this,n,e,t,i=s&&null==a&&null==(a=r.lookupPrefix(s))?[{namespace:s,prefix:null}]:i),n.join("")}function Xa(e,t,i){var n=e.prefix||"",r=e.namespaceURI;if(r&&("xml"!==n||r!==Jr.XML)&&r!==Jr.XMLNS){for(var a=i.length;a--;){var s=i[a];if(s.prefix===n)return s.namespace!==r}return 1}}function Ka(e,t,i){e.push(" ",t,'="',i.replace(/[<&"]/g,wa),'"')}function Ya(e,t,i,n,r){if(r=r||[],n){if(!(e=n(e)))return;if("string"==typeof e)return void t.push(e)}switch(e.nodeType){case ra:var a=e.attributes,s=a.length,o=e.firstChild,u=e.tagName,l=u;if(!(i=Jr.isHTML(e.namespaceURI)||i)&&!e.prefix&&e.namespaceURI){for(var c,d=0;d"),i&&/^script$/i.test(u))for(;o;)o.data?t.push(o.data):Ya(o,t,i,n,r.slice()),o=o.nextSibling;else for(;o;)Ya(o,t,i,n,r.slice()),o=o.nextSibling;t.push("")}else t.push("/>");return;case da:case pa:for(o=e.firstChild;o;)Ya(o,t,i,n,r.slice()),o=o.nextSibling;return;case aa:return Ka(t,e.name,e.value),0;case sa:return t.push(e.data.replace(/[<&]/g,wa).replace(/]]>/g,"]]>"));case oa:return t.push("");case ca:return t.push("\x3c!--",e.data,"--\x3e");case ha:var v=e.publicId,_=e.systemId;return t.push("")):_&&"."!=_?t.push(" SYSTEM ",_,">"):((_=e.internalSubset)&&t.push(" [",_,"]"),t.push(">")));case la:return t.push("");case ua:return t.push("&",e.nodeName,";");default:t.push("??",e.nodeName)}}function Qa(e,t,i){e[t]=i}Kt.INVALID_STATE_ERR=(fa[11]="Invalid state",11),Kt.SYNTAX_ERR=(fa[12]="Syntax error",12),Kt.INVALID_MODIFICATION_ERR=(fa[13]="Invalid modification",13),Kt.NAMESPACE_ERR=(fa[14]="Invalid namespace",14),Kt.INVALID_ACCESS_ERR=(fa[15]="Invalid access",15),ga.prototype=Error.prototype,ia(Kt,ga),ya.prototype={length:0,item:function(e){return this[e]||null},toString:function(e,t){for(var i=[],n=0;n=t+i||t?new java.lang.String(e,t,i)+"":e}function p(e,t){(e.currentElement||e.doc).appendChild(t)}i.prototype.parseFromString=function(e,t){var i=this.options,n=new f,r=i.domBuilder||new c,a=i.errorHandler,s=i.locator,o=i.xmlns||{},u=/\/x?html?$/.test(t),t=u?Rr.HTML_ENTITIES:Rr.XML_ENTITIES;return s&&r.setDocumentLocator(s),n.errorHandler=function(n,e,r){if(!n){if(e instanceof c)return e;n=e}var a={},s=n instanceof Function;function t(t){var i=n[t];!i&&s&&(i=2==n.length?function(e){n(t,e)}:n),a[t]=i?function(e){i("[xmldom "+t+"]\t"+e+h(r))}:function(){}}return r=r||{},t("warning"),t("error"),t("fatalError"),a}(a,r,s),n.domBuilder=i.domBuilder||r,u&&(o[""]=l.HTML),o.xml=o.xml||l.XML,e&&"string"==typeof e?n.parse(e,o,t):n.errorHandler.error("invalid doc source"),r.doc},c.prototype={startDocument:function(){this.doc=(new a).createDocument(null,null,null),this.locator&&(this.doc.documentURI=this.locator.systemId)},startElement:function(e,t,i,n){var r=this.doc,a=r.createElementNS(e,i||t),s=n.length;p(this,a),this.currentElement=a,this.locator&&d(this.locator,a);for(var o=0;o=e.length&&n.call(e,function(e,t){return e===(a[t]?a[t]&i[r+t]:i[r+t])})}function Us(e,t){return void 0===t&&(t=0),(e=Os(e)).length-t<10||!Ns(e,ao,{offset:t})?t:Us(e,t+=function(e,t){void 0===t&&(t=0);var i=(e=Os(e))[t+5],t=e[t+6]<<21|e[t+7]<<14|e[t+8]<<7|e[t+9];return(16&i)>>4?20+t:10+t}(e,t))}function Bs(e){return"string"==typeof e?Ms(e):e}function Fs(e,t,i){var n;void 0===i&&(i=!1),n=t,t=Array.isArray(n)?n.map(Bs):[Bs(n)],e=Os(e);var r=[];if(!t.length)return r;for(var a=0;a>>0,o=e.subarray(a+4,a+8);if(0==s)break;var u=a+s;if(u>e.length){if(i)break;u=e.length}s=e.subarray(a+8,u);Ns(o,t[0])&&(1===t.length?r.push(s):r.push.apply(r,Fs(s,t.slice(1),i))),a=u}return r}function js(e,t,i,n){void 0===i&&(i=!0),void 0===n&&(n=!1);var r=function(e){for(var t=1,i=0;i=t.length)return t.length;var n=js(t,i,!1);if(Ns(e.bytes,n.bytes))return i;var r=js(t,i+n.length);return qs(e,t,i+r.length+r.value+n.length)}function Vs(e,t){var i;i=t,t=Array.isArray(i)?i.map(Hs):[Hs(i)],e=Os(e);var n=[];if(!t.length)return n;for(var r=0;re.length?e.length:o+s.value,u=e.subarray(o,u);Ns(t[0],a.bytes)&&(1===t.length?n.push(u):n=n.concat(Vs(u,t.slice(1)))),r+=a.length+s.length+u.length}return n}function Ws(e,t,i,n){void 0===n&&(n=1/0),e=Os(e),i=[].concat(i);for(var r,a=0,s=0;a>1&63),-1!==i.indexOf(u)&&(r=a+o),a+=o+("h264"===t?1:2)}else a++}return e.subarray(0,0)} +/*! @name mpd-parser @version 0.19.0 @license Apache-2.0 */ +var zs="INVALID_NUMBER_OF_PERIOD",Gs="DASH_EMPTY_MANIFEST",Xs="DASH_INVALID_XML",Ks="NO_BASE_URL",Ys="SEGMENT_TIME_UNSPECIFIED",Qs="UNSUPPORTED_UTC_TIMING_SCHEME",$s={static:function(e){var t=e.duration,i=e.timescale,n=void 0===i?1:i,r=e.sourceDuration,i=e.periodDuration,e=rs(e.endNumber),n=t/n;return"number"==typeof e?{start:0,end:e}:"number"==typeof i?{start:0,end:i/n}:{start:0,end:r/n}},dynamic:function(e){var t=e.NOW,i=e.clientOffset,n=e.availabilityStartTime,r=e.timescale,a=void 0===r?1:r,s=e.duration,o=e.start,u=void 0===o?0:o,r=e.minimumUpdatePeriod,o=void 0===r?0:r,r=e.timeShiftBufferDepth,r=void 0===r?1/0:r,e=rs(e.endNumber),i=(t+i)/1e3,u=n+u,o=Math.ceil((i+o-u)*a/s),r=Math.floor((i-u-r)*a/s),s=Math.floor((i-u)*a/s);return{start:Math.max(0,r),end:"number"==typeof e?e:Math.min(o,s)}}},Js=/\$([A-z]*)(?:(%0)([0-9]+)d)?\$/g,Zs={mediaPresentationDuration:ks,availabilityStartTime:function(e){return/^\d+-\d+-\d+T\d+:\d+:\d+(\.\d+)?$/.test(e=e)&&(e+="Z"),Date.parse(e)/1e3},minimumUpdatePeriod:ks,suggestedPresentationDelay:ks,type:function(e){return e},timeShiftBufferDepth:ks,start:ks,width:function(e){return parseInt(e,10)},height:function(e){return parseInt(e,10)},bandwidth:function(e){return parseInt(e,10)},startNumber:function(e){return parseInt(e,10)},timescale:function(e){return parseInt(e,10)},presentationTimeOffset:function(e){return parseInt(e,10)},duration:function(e){var t=parseInt(e,10);return isNaN(t)?ks(e):t},d:function(e){return parseInt(e,10)},t:function(e){return parseInt(e,10)},r:function(e){return parseInt(e,10)},DEFAULT:function(e){return e}},eo={"urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b":"org.w3.clearkey","urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed":"com.widevine.alpha","urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95":"com.microsoft.playready","urn:uuid:f239e769-efa3-4850-9c16-a903c6932efb":"com.adobe.primetime"},to=Math.pow(2,32),io=function(e){var t=new DataView(e.buffer,e.byteOffset,e.byteLength),i={version:e[0],flags:new Uint8Array(e.subarray(1,4)),references:[],referenceId:t.getUint32(4),timescale:t.getUint32(8)},n=12;0===i.version?(i.earliestPresentationTime=t.getUint32(n),i.firstOffset=t.getUint32(n+4),n+=8):(i.earliestPresentationTime=t.getUint32(n)*to+t.getUint32(n+4),i.firstOffset=t.getUint32(n+8)*to+t.getUint32(n+12),n+=16);var r=t.getUint16(n+=2);for(n+=2;0>>7,referencedSize:2147483647&t.getUint32(n),subsegmentDuration:t.getUint32(n+4),startsWithSap:!!(128&e[n+8]),sapType:(112&e[n+8])>>>4,sapDeltaTime:268435455&t.getUint32(n+8)});return i},no=_.BigInt||Number,ro=[no("0x1"),no("0x100"),no("0x10000"),no("0x1000000"),no("0x100000000"),no("0x10000000000"),no("0x1000000000000"),no("0x100000000000000"),no("0x10000000000000000")],ao=Os([73,68,51]),so={EBML:Os([26,69,223,163]),DocType:Os([66,130]),Segment:Os([24,83,128,103]),SegmentInfo:Os([21,73,169,102]),Tracks:Os([22,84,174,107]),Track:Os([174]),TrackNumber:Os([215]),DefaultDuration:Os([35,227,131]),TrackEntry:Os([174]),TrackType:Os([131]),FlagDefault:Os([136]),CodecID:Os([134]),CodecPrivate:Os([99,162]),VideoTrack:Os([224]),AudioTrack:Os([225]),Cluster:Os([31,67,182,117]),Timestamp:Os([231]),TimestampScale:Os([42,215,177]),BlockGroup:Os([160]),BlockDuration:Os([155]),Block:Os([161]),SimpleBlock:Os([163])},oo=[128,64,32,16,8,4,2,1],uo=Os([0,0,0,1]),lo=Os([0,0,1]),co=Os([0,0,3]),ho={webm:Os([119,101,98,109]),matroska:Os([109,97,116,114,111,115,107,97]),flac:Os([102,76,97,67]),ogg:Os([79,103,103,83]),ac3:Os([11,119]),riff:Os([82,73,70,70]),avi:Os([65,86,73]),wav:Os([87,65,86,69]),"3gp":Os([102,116,121,112,51,103]),mp4:Os([102,116,121,112]),fmp4:Os([115,116,121,112]),mov:Os([102,116,121,112,113,116]),moov:Os([109,111,111,118]),moof:Os([109,111,111,102])},po={aac:function(e){var t=Us(e);return Ns(e,[255,16],{offset:t,mask:[255,22]})},mp3:function(e){var t=Us(e);return Ns(e,[255,2],{offset:t,mask:[255,6]})},webm:function(e){e=Vs(e,[so.EBML,so.DocType])[0];return Ns(e,ho.webm)},mkv:function(e){e=Vs(e,[so.EBML,so.DocType])[0];return Ns(e,ho.matroska)},mp4:function(e){return!po["3gp"](e)&&!po.mov(e)&&(!(!Ns(e,ho.mp4,{offset:4})&&!Ns(e,ho.fmp4,{offset:4}))||(!(!Ns(e,ho.moof,{offset:4})&&!Ns(e,ho.moov,{offset:4}))||void 0))},mov:function(e){return Ns(e,ho.mov,{offset:4})},"3gp":function(e){return Ns(e,ho["3gp"],{offset:4})},ac3:function(e){var t=Us(e);return Ns(e,ho.ac3,{offset:t})},ts:function(e){if(e.length<189&&1<=e.length)return 71===e[0];for(var t=0;t+188"):function(){}}function vo(e,t){var i,n=[];if(e&&e.length)for(i=0;i "+e.end(i));return t.join(", ")}function So(e){for(var t=[],i=0;iDate.now()}function Oo(e){return e.excludeUntil&&e.excludeUntil===1/0}function Ro(e){var t=Do(e);return!e.disabled&&!t}function Mo(e,t){return t.attributes&&t.attributes[e]}function No(e,t){if(1===e.playlists.length)return!0;var i=t.attributes.BANDWIDTH||Number.MAX_VALUE;return 0===e.playlists.filter(function(e){return!!Ro(e)&&(e.attributes.BANDWIDTH||0)n+.25*a.duration)return null;i=a}return{segment:i,estimatedStart:i.videoTimingInfo?i.videoTimingInfo.transmuxedPresentationStart:n-i.duration,type:i.videoTimingInfo?"accurate":"estimate"}}(n,t))?"estimate"===e.type?i({message:"Accurate programTime could not be determined. Please seek to e.seekTime and try again",seekTime:e.estimatedStart}):(t={mediaSeconds:n},(e=function(e,t){if(!t.dateTimeObject)return null;var i=t.videoTimingInfo.transmuxerPrependedSeconds,i=e-(t.videoTimingInfo.transmuxedPresentationStart+i);return new Date(t.dateTimeObject.getTime()+1e3*i)}(n,e.segment))&&(t.programDateTime=e.toISOString()),i(null,t)):i({message:"valid programTime was not found"}):i({message:"getProgramTime: playlist and time must be provided"})}function su(e){var t=e.programTime,i=e.playlist,n=e.retryCount,r=void 0===n?2:n,a=e.seekTo,s=e.pauseAfterSeek,o=void 0===s||s,u=e.tech,l=e.callback;if(!l)throw new Error("seekToProgramTime: callback must be provided");return"undefined"!=typeof t&&i&&a?i.endList||u.hasStarted_?function(e){if(!e.segments||0===e.segments.length)return!1;for(var t=0;ti||e.height>n})).filter(function(e){return e.width===h[0].width&&e.height===h[0].height}),c=p[p.length-1],p=p.filter(function(e){return e.bandwidth===c.bandwidth})[0]),a.experimentalLeastPixelDiffSelector&&(m=d.map(function(e){return e.pixelDiff=Math.abs(e.width-i)+Math.abs(e.height-n),e}),Ru(m,function(e,t){return e.pixelDiff===t.pixelDiff?t.bandwidth-e.bandwidth:e.pixelDiff-t.pixelDiff}),f=m[0]);var m=f||p||e||o||l[0]||u[0];if(m&&m.playlist){u="sortedPlaylistReps";return f?u="leastPixelDiffRep":p?u="resolutionPlusOneRep":e?u="resolutionBestRep":o?u="bandwidthBestRep":l[0]&&(u="enabledPlaylistReps"),pl("choosing "+Du(m)+" using "+u+" with options",s),m.playlist}return pl("could not choose a playlist with options",s),null}}function Uu(e){var t=e.inbandTextTracks,i=e.metadataArray,r=e.timestampOffset,n=e.videoDuration;if(i){var a=_.WebKitDataCue||_.VTTCue,s=t.metadataTrack_;if(s&&(i.forEach(function(e){var n=e.cueTime+r;!("number"!=typeof n||_.isNaN(n)||n<0)&&n<1/0&&e.frames.forEach(function(e){var t,i=new a(n,n,e.value||e.url||e.data||"");i.frame=e,i.value=e,t=i,Object.defineProperties(t.frame,{id:{get:function(){return ir.log.warn("cue.frame.id is deprecated. Use cue.value.key instead."),t.value.key}},value:{get:function(){return ir.log.warn("cue.frame.value is deprecated. Use cue.value.data instead."),t.value.data}},privateData:{get:function(){return ir.log.warn("cue.frame.privateData is deprecated. Use cue.value.data instead."),t.value.data}}}),s.addCue(i)})}),s.cues&&s.cues.length)){for(var o=s.cues,u=[],l=0;l=e&&r.endTime<=t&&i.removeCue(r)}function Fu(e){return"number"==typeof e&&isFinite(e)}function ju(e){var t=e.startOfSegment,i=e.duration,n=e.segment,r=e.part,a=e.playlist,s=a.mediaSequence,o=a.id,u=a.segments,l=e.mediaIndex,c=e.partIndex,d=e.timeline,h=(void 0===u?[]:u).length-1,p="mediaIndex/partIndex increment";return e.getMediaInfoForTime?p="getMediaInfoForTime ("+e.getMediaInfoForTime+")":e.isSyncRequest&&(p="getSyncSegmentCandidate (isSyncRequest)"),a="number"==typeof c,u=e.segment.uri?"segment":"pre-segment",e=a?wo({preloadSegment:n})-1:0,u+" ["+(s+l)+"/"+(s+h)+"]"+(a?" part ["+c+"/"+e+"]":"")+" segment start/end ["+n.start+" => "+n.end+"]"+(a?" part start/end ["+r.start+" => "+r.end+"]":"")+" startOfSegment ["+t+"] duration ["+i+"] timeline ["+d+"] selected by ["+p+"] playlist ["+o+"]"}function Hu(e){return e+"TimingInfo"}function qu(e){var t=e.timelineChangeController,i=e.currentTimeline,n=e.segmentTimeline,r=e.loaderType,e=e.audioDisabled;if(i!==n){if("audio"===r){i=t.lastTimelineChange({type:"main"});return!i||i.to!==n}if("main"===r&&e){t=t.pendingTimelineChange({type:"audio"});return t&&t.to===n?!1:!0}}}function Vu(e){var t=e.segmentDuration,e=e.maxDuration;return!!t&&Math.round(t)>e+Ku}function Wu(e,t){if("hls"!==t)return null;var i=function(e,t){e=e&&"number"==typeof e.start&&"number"==typeof e.end?e.end-e.start:0,t=t&&"number"==typeof t.start&&"number"==typeof t.end?t.end-t.start:0;return Math.max(e,t)}(e.audioTimingInfo,e.videoTimingInfo);if(!i)return null;var n=e.playlist.targetDuration,r=Vu({segmentDuration:i,maxDuration:2*n}),t=Vu({segmentDuration:i,maxDuration:n}),n="Segment with index "+e.mediaIndex+" from playlist "+e.playlist.id+" has a duration of "+i+" when the reported duration is "+e.duration+" and the target duration is "+n+". For HLS content, a duration in excess of the target duration may result in playback issues. See the HLS specification section on EXT-X-TARGETDURATION for more details: https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.3.1";return r||t?{severity:r?"warn":"info",message:n}:null}var zu=po,Gu=9e4,Xu=nr,Ku=1/30,Yu=ir.createTimeRange,Qu={liveEdgeDelay:Io,duration:Ao,seekable:function(e,t,i){var n=t||0,i=Lo(e,t,!0,i);return null===i?Yu():Yu(n,i)},getMediaInfoForTime:function(e){for(var t=e.playlist,i=e.currentTime,n=e.startingSegmentIndex,r=e.startingPartIndex,a=e.startTime,s=e.experimentalExactManifestTimings,o=i-a,u=ko(t),l=0,c=0;c=r+i)return o(e,{response:n.subarray(i,i+r),status:t.status,uri:t.uri});u.request=u.vhs_.xhr({uri:s,responseType:"arraybuffer",headers:Jo({byterange:a.sidx.byterange})},o)})):this.mediaRequest_=_.setTimeout(function(){return r(!1)},0)},t.dispose=function(){this.trigger("dispose"),this.stopRequest(),this.loadedPlaylists_={},_.clearTimeout(this.minimumUpdatePeriodTimeout_),_.clearTimeout(this.mediaRequest_),_.clearTimeout(this.mediaUpdateTimeout),this.mediaUpdateTimeout=null,this.mediaRequest_=null,this.minimumUpdatePeriodTimeout_=null,this.masterPlaylistLoader_.createMupOnMedia_&&(this.off("loadedmetadata",this.masterPlaylistLoader_.createMupOnMedia_),this.masterPlaylistLoader_.createMupOnMedia_=null),this.off()},t.hasPendingRequest=function(){return this.request||this.mediaRequest_},t.stopRequest=function(){var e;this.request&&(e=this.request,this.request=null,e.onreadystatechange=null,e.abort())},t.media=function(t){var i=this;if(!t)return this.media_;if("HAVE_NOTHING"===this.state)throw new Error("Cannot switch media playlist from "+this.state);var n=this.state;if("string"==typeof t){if(!this.masterPlaylistLoader_.master.playlists[t])throw new Error("Unknown playlist URI: "+t);t=this.masterPlaylistLoader_.master.playlists[t]}var e=!this.media_||t.id!==this.media_.id;if(e&&this.loadedPlaylists_[t.id]&&this.loadedPlaylists_[t.id].endList)return this.state="HAVE_METADATA",this.media_=t,void(e&&(this.trigger("mediachanging"),this.trigger("mediachange")));e&&(this.media_&&this.trigger("mediachanging"),this.addSidxSegments_(t,n,function(e){i.haveMetadata({startingState:n,playlist:t})}))},t.haveMetadata=function(e){var t=e.startingState,e=e.playlist;this.state="HAVE_METADATA",this.loadedPlaylists_[e.id]=e,this.mediaRequest_=null,this.refreshMedia_(e.id),"HAVE_MASTER"===t?this.trigger("loadedmetadata"):this.trigger("mediachange")},t.pause=function(){this.masterPlaylistLoader_.createMupOnMedia_&&(this.off("loadedmetadata",this.masterPlaylistLoader_.createMupOnMedia_),this.masterPlaylistLoader_.createMupOnMedia_=null),this.stopRequest(),_.clearTimeout(this.mediaUpdateTimeout),this.mediaUpdateTimeout=null,this.isMaster_&&(_.clearTimeout(this.masterPlaylistLoader_.minimumUpdatePeriodTimeout_),this.masterPlaylistLoader_.minimumUpdatePeriodTimeout_=null),"HAVE_NOTHING"===this.state&&(this.started=!1)},t.load=function(e){var t=this;_.clearTimeout(this.mediaUpdateTimeout),this.mediaUpdateTimeout=null;var i=this.media();e?(e=i?i.targetDuration/2*1e3:5e3,this.mediaUpdateTimeout=_.setTimeout(function(){return t.load()},e)):this.started?i&&!i.endList?(this.isMaster_&&!this.minimumUpdatePeriodTimeout_&&(this.trigger("minimumUpdatePeriod"),this.updateMinimumUpdatePeriodTimeout_()),this.trigger("mediaupdatetimeout")):this.trigger("loadedplaylist"):this.start()},t.start=function(){var i=this;this.started=!0,this.isMaster_?this.requestMaster_(function(e,t){i.haveMaster_(),i.hasPendingRequest()||i.media_||i.media(i.masterPlaylistLoader_.master.playlists[0])}):this.mediaRequest_=_.setTimeout(function(){return i.haveMaster_()},0)},t.requestMaster_=function(n){var r=this;this.request=this.vhs_.xhr({uri:this.masterPlaylistLoader_.srcUrl,withCredentials:this.withCredentials},function(e,t){if(!r.requestErrored_(e,t)){var i=t.responseText!==r.masterPlaylistLoader_.masterXml_;return r.masterPlaylistLoader_.masterXml_=t.responseText,t.responseHeaders&&t.responseHeaders.date?r.masterLoaded_=Date.parse(t.responseHeaders.date):r.masterLoaded_=Date.now(),r.masterPlaylistLoader_.srcUrl=go(r.handleManifestRedirects,r.masterPlaylistLoader_.srcUrl,t),i?(r.handleMaster_(),void r.syncClientServerClock_(function(){return n(t,i)})):n(t,i)}"HAVE_NOTHING"===r.state&&(r.started=!1)})},t.syncClientServerClock_=function(i){var n=this,r=Ds(this.masterPlaylistLoader_.masterXml_);return null===r?(this.masterPlaylistLoader_.clientOffset_=this.masterLoaded_-Date.now(),i()):"DIRECT"===r.method?(this.masterPlaylistLoader_.clientOffset_=r.value-Date.now(),i()):void(this.request=this.vhs_.xhr({uri:Xu(this.masterPlaylistLoader_.srcUrl,r.value),method:r.method,withCredentials:this.withCredentials},function(e,t){if(n.request){if(e)return n.masterPlaylistLoader_.clientOffset_=n.masterLoaded_-Date.now(),i();t="HEAD"===r.method?t.responseHeaders&&t.responseHeaders.date?Date.parse(t.responseHeaders.date):n.masterLoaded_:Date.parse(t.responseText);n.masterPlaylistLoader_.clientOffset_=t-Date.now(),i()}}))},t.haveMaster_=function(){this.state="HAVE_MASTER",this.isMaster_?this.trigger("loadedplaylist"):this.media_||this.media(this.childPlaylist_)},t.handleMaster_=function(){this.mediaRequest_=null;var e,t,t=(n={masterXml:this.masterPlaylistLoader_.masterXml_,srcUrl:this.masterPlaylistLoader_.srcUrl,clientOffset:this.masterPlaylistLoader_.clientOffset_,sidxMapping:this.masterPlaylistLoader_.sidxMapping_},e=n.masterXml,i=n.srcUrl,t=n.clientOffset,n=n.sidxMapping,n=Ls(e,{manifestUri:i,clientOffset:t,sidxMapping:n}),Vo(n,i),n),i=this.masterPlaylistLoader_.master;i&&(t=function(e,t,i){for(var a=!0,s=il(e,{duration:t.duration,minimumUpdatePeriod:t.minimumUpdatePeriod}),n=0;n>>1,e.samplingfrequencyindex<<7|e.channelcount<<3,6,1,2]))},f=function(e){return u(T.hdlr,I[e])},p=function(e){var t=new Uint8Array([0,0,0,0,0,0,0,2,0,0,0,3,0,1,95,144,e.duration>>>24&255,e.duration>>>16&255,e.duration>>>8&255,255&e.duration,85,196,0,0]);return e.samplerate&&(t[12]=e.samplerate>>>24&255,t[13]=e.samplerate>>>16&255,t[14]=e.samplerate>>>8&255,t[15]=255&e.samplerate),u(T.mdhd,t)},h=function(e){return u(T.mdia,p(e),f(e.type),a(e))},r=function(e){return u(T.mfhd,new Uint8Array([0,0,0,0,(4278190080&e)>>24,(16711680&e)>>16,(65280&e)>>8,255&e]))},a=function(e){return u(T.minf,"video"===e.type?u(T.vmhd,x):u(T.smhd,A),t(),g(e))},qe=function(e,t){for(var i=[],n=t.length;n--;)i[n]=v(t[n]);return u.apply(null,[T.moof,r(e)].concat(i))},s=function(e){for(var t=e.length,i=[];t--;)i[t]=c(e[t]);return u.apply(null,[T.moov,l(4294967295)].concat(i).concat(o(e)))},o=function(e){for(var t=e.length,i=[];t--;)i[t]=_(e[t]);return u.apply(null,[T.mvex].concat(i))},l=function(e){e=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,0,1,95,144,(4278190080&e)>>24,(16711680&e)>>16,(65280&e)>>8,255&e,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return u(T.mvhd,e)},m=function(e){for(var t,i=e.samples||[],n=new Uint8Array(4+i.length),r=0;r>>8),a.push(255&n[o].byteLength),a=a.concat(Array.prototype.slice.call(n[o]));for(o=0;o>>8),s.push(255&r[o].byteLength),s=s.concat(Array.prototype.slice.call(r[o]));return t=[T.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,(65280&e.width)>>8,255&e.width,(65280&e.height)>>8,255&e.height,0,72,0,0,0,72,0,0,0,0,0,0,0,1,19,118,105,100,101,111,106,115,45,99,111,110,116,114,105,98,45,104,108,115,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),u(T.avcC,new Uint8Array([1,e.profileIdc,e.profileCompatibility,e.levelIdc,255].concat([n.length],a,[r.length],s))),u(T.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192]))],e.sarRatio&&(i=e.sarRatio[0],e=e.sarRatio[1],t.push(u(T.pasp,new Uint8Array([(4278190080&i)>>24,(16711680&i)>>16,(65280&i)>>8,255&i,(4278190080&e)>>24,(16711680&e)>>16,(65280&e)>>8,255&e])))),u.apply(null,t)},N=function(e){return u(T.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,(65280&e.channelcount)>>8,255&e.channelcount,(65280&e.samplesize)>>8,255&e.samplesize,0,0,0,0,(65280&e.samplerate)>>8,255&e.samplerate,0,0]),i(e))},d=function(e){e=new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,(4278190080&e.id)>>24,(16711680&e.id)>>16,(65280&e.id)>>8,255&e.id,0,0,0,0,(4278190080&e.duration)>>24,(16711680&e.duration)>>16,(65280&e.duration)>>8,255&e.duration,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,(65280&e.width)>>8,255&e.width,0,0,(65280&e.height)>>8,255&e.height,0,0]);return u(T.tkhd,e)},v=function(e){var t,i=u(T.tfhd,new Uint8Array([0,0,0,58,(4278190080&e.id)>>24,(16711680&e.id)>>16,(65280&e.id)>>8,255&e.id,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0])),n=Math.floor(e.baseMediaDecodeTime/(1+H)),r=Math.floor(e.baseMediaDecodeTime%(1+H)),n=u(T.tfdt,new Uint8Array([1,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n,r>>>24&255,r>>>16&255,r>>>8&255,255&r]));return"audio"===e.type?(t=b(e,92),u(T.traf,i,n,t)):(r=m(e),t=b(e,r.length+92),u(T.traf,i,n,t,r))},c=function(e){return e.duration=e.duration||4294967295,u(T.trak,d(e),h(e))},_=function(e){var t=new Uint8Array([0,0,0,0,(4278190080&e.id)>>24,(16711680&e.id)>>16,(65280&e.id)>>8,255&e.id,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return"video"!==e.type&&(t[t.length-1]=0),u(T.trex,t)},U=function(e,t){var i=0,n=0,r=0,a=0;return e.length&&(void 0!==e[0].duration&&(i=1),void 0!==e[0].size&&(n=2),void 0!==e[0].flags&&(r=4),void 0!==e[0].compositionTimeOffset&&(a=8)),[0,0,i|n|r|a,1,(4278190080&e.length)>>>24,(16711680&e.length)>>>16,(65280&e.length)>>>8,255&e.length,(4278190080&t)>>>24,(16711680&t)>>>16,(65280&t)>>>8,255&t]},B=function(e,t){var i,n,r,a,s=e.samples||[];for(t+=20+16*s.length,t=U(s,t),(n=new Uint8Array(t.length+16*s.length)).set(t),i=t.length,a=0;a>>24,n[i++]=(16711680&r.duration)>>>16,n[i++]=(65280&r.duration)>>>8,n[i++]=255&r.duration,n[i++]=(4278190080&r.size)>>>24,n[i++]=(16711680&r.size)>>>16,n[i++]=(65280&r.size)>>>8,n[i++]=255&r.size,n[i++]=r.flags.isLeading<<2|r.flags.dependsOn,n[i++]=r.flags.isDependedOn<<6|r.flags.hasRedundancy<<4|r.flags.paddingValue<<1|r.flags.isNonSyncSample,n[i++]=61440&r.flags.degradationPriority,n[i++]=15&r.flags.degradationPriority,n[i++]=(4278190080&r.compositionTimeOffset)>>>24,n[i++]=(16711680&r.compositionTimeOffset)>>>16,n[i++]=(65280&r.compositionTimeOffset)>>>8,n[i++]=255&r.compositionTimeOffset;return u(T.trun,n)},F=function(e,t){var i,n,r,a,s=e.samples||[];for(t+=20+8*s.length,t=U(s,t),(i=new Uint8Array(t.length+8*s.length)).set(t),n=t.length,a=0;a>>24,i[n++]=(16711680&r.duration)>>>16,i[n++]=(65280&r.duration)>>>8,i[n++]=255&r.duration,i[n++]=(4278190080&r.size)>>>24,i[n++]=(16711680&r.size)>>>16,i[n++]=(65280&r.size)>>>8,i[n++]=255&r.size;return u(T.trun,i)},b=function(e,t){return("audio"===e.type?F:B)(e,t)};n=function(){return u(T.ftyp,S,E,S,k)};function q(e,t){var i={size:0,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0,degradationPriority:0,isNonSyncSample:1}};return i.dataOffset=t,i.compositionTimeOffset=e.pts-e.dts,i.duration=e.duration,i.size=4*e.length,i.size+=e.byteLength,e.keyFrame&&(i.flags.dependsOn=2,i.flags.isNonSyncSample=0),i}function V(e){for(var t=[];e--;)t.push(0);return t}function W(){var e,i;return z||(e={96e3:[ee,[227,64],V(154),[56]],88200:[ee,[231],V(170),[56]],64e3:[ee,[248,192],V(240),[56]],48e3:[ee,[255,192],V(268),[55,148,128],V(54),[112]],44100:[ee,[255,192],V(268),[55,163,128],V(84),[112]],32e3:[ee,[255,192],V(268),[55,234],V(226),[112]],24e3:[ee,[255,192],V(268),[55,255,128],V(268),[111,112],V(126),[224]],16e3:[ee,[255,192],V(268),[55,255,128],V(268),[111,255],V(269),[223,108],V(195),[1,192]],12e3:[te,V(268),[3,127,248],V(268),[6,255,240],V(268),[13,255,224],V(268),[27,253,128],V(259),[56]],11025:[te,V(268),[3,127,248],V(268),[6,255,240],V(268),[13,255,224],V(268),[27,255,192],V(268),[55,175,128],V(108),[112]],8e3:[te,V(268),[3,121,16],V(47),[7]]},i=e,z=Object.keys(i).reduce(function(e,t){return e[t]=new Uint8Array(i[t].reduce(function(e,t){return e.concat(t)},[])),e},{})),z}var z,G=function(e){return u(T.mdat,e)},X=qe,K=function(e){var t=n(),i=s(e),e=new Uint8Array(t.byteLength+i.byteLength);return e.set(t),e.set(i,t.byteLength),e},Y=function(e){var t,i,n=[],r=[];for(r.byteLength=0,r.nalCount=0,r.duration=0,t=n.byteLength=0;t=i?e:(t.minSegmentDts=1/0,e.filter(function(e){return e.dts>=i&&(t.minSegmentDts=Math.min(t.minSegmentDts,e.dts),t.minSegmentPts=t.minSegmentDts,!0)}))},fe=function(e){for(var t,i=[],n=0;n=this.virtualRowCount&&"function"==typeof this.beforeRowOverflow&&this.beforeRowOverflow(e),0this.virtualRowCount;)this.rows.shift(),this.rowIdx--},Ie.prototype.isEmpty=function(){return 0===this.rows.length||1===this.rows.length&&""===this.rows[0]},Ie.prototype.addText=function(e){this.rows[this.rowIdx]+=e},Ie.prototype.backspace=function(){var e;this.isEmpty()||(e=this.rows[this.rowIdx],this.rows[this.rowIdx]=e.substr(0,e.length-1))};function Ae(e){this.serviceNum=e,this.text="",this.currentWindow=new Ie(-1),this.windows=[]}Ae.prototype.init=function(e,t){this.startPts=e;for(var i=0;i<8;i++)this.windows[i]=new Ie(i),"function"==typeof t&&(this.windows[i].beforeRowOverflow=t)},Ae.prototype.setCurrentWindow=function(e){this.currentWindow=this.windows[e]};var Pe=function e(){e.prototype.init.call(this);var t=this;this.current708Packet=null,this.services={},this.push=function(e){(3===e.type||null===t.current708Packet)&&t.new708Packet(),t.add708Bytes(e)}};Pe.prototype=new j,Pe.prototype.new708Packet=function(){null!==this.current708Packet&&this.push708Packet(),this.current708Packet={data:[],ptsVals:[]}},Pe.prototype.add708Bytes=function(e){var t=e.ccData,i=t>>>8,t=255&t;this.current708Packet.ptsVals.push(e.pts),this.current708Packet.data.push(i),this.current708Packet.data.push(t)},Pe.prototype.push708Packet=function(){var e,t=this.current708Packet,i=t.data,n=null,r=0,a=i[r++];for(t.seq=a>>6,t.sizeCode=63&a;r>5)&&0>5,t.rowLock=(16&n)>>4,t.columnLock=(8&n)>>3,t.priority=7&n,n=i[++e],t.relativePositioning=(128&n)>>7,t.anchorVertical=127&n,n=i[++e],t.anchorHorizontal=n,n=i[++e],t.anchorPoint=(240&n)>>4,t.rowCount=15&n,n=i[++e],t.columnCount=63&n,n=i[++e],t.windowStyle=(56&n)>>3,t.penStyle=7&n,t.virtualRowCount=t.rowCount+1,e},Pe.prototype.setWindowAttributes=function(e,t){var i=this.current708Packet.data,n=i[e],t=t.currentWindow.winAttr,n=i[++e];return t.fillOpacity=(192&n)>>6,t.fillRed=(48&n)>>4,t.fillGreen=(12&n)>>2,t.fillBlue=3&n,n=i[++e],t.borderType=(192&n)>>6,t.borderRed=(48&n)>>4,t.borderGreen=(12&n)>>2,t.borderBlue=3&n,n=i[++e],t.borderType+=(128&n)>>5,t.wordWrap=(64&n)>>6,t.printDirection=(48&n)>>4,t.scrollDirection=(12&n)>>2,t.justify=3&n,n=i[++e],t.effectSpeed=(240&n)>>4,t.effectDirection=(12&n)>>2,t.displayEffect=3&n,e},Pe.prototype.flushDisplayed=function(e,t){for(var i=[],n=0;n<8;n++)t.windows[n].visible&&!t.windows[n].isEmpty()&&i.push(t.windows[n].getText());t.endPts=e,t.text=i.join("\n\n"),this.pushCaption(t),t.startPts=e},Pe.prototype.pushCaption=function(e){""!==e.text&&(this.trigger("data",{startPts:e.startPts,endPts:e.endPts,text:e.text,stream:"cc708_"+e.serviceNum}),e.text="",e.startPts=e.endPts)},Pe.prototype.displayWindows=function(e,t){var i=this.current708Packet.data[++e],n=this.getPts(e);this.flushDisplayed(n,t);for(var r=0;r<8;r++)i&1<>4,t.offset=(12&n)>>2,t.penSize=3&n,n=i[++e],t.italics=(128&n)>>7,t.underline=(64&n)>>6,t.edgeType=(56&n)>>3,t.fontStyle=7&n,e},Pe.prototype.setPenColor=function(e,t){var i=this.current708Packet.data,n=i[e],t=t.currentWindow.penColor,n=i[++e];return t.fgOpacity=(192&n)>>6,t.fgRed=(48&n)>>4,t.fgGreen=(12&n)>>2,t.fgBlue=3&n,n=i[++e],t.bgOpacity=(192&n)>>6,t.bgRed=(48&n)>>4,t.bgGreen=(12&n)>>2,t.bgBlue=3&n,n=i[++e],t.edgeRed=(48&n)>>4,t.edgeGreen=(12&n)>>2,t.edgeBlue=3&n,e},Pe.prototype.setPenLocation=function(e,t){var i=this.current708Packet.data,n=i[e],r=t.currentWindow.penLoc;return t.currentWindow.pendingNewLine=!0,n=i[++e],r.row=15&n,n=i[++e],r.column=63&n,e},Pe.prototype.reset=function(e,t){var i=this.getPts(e);return this.flushDisplayed(i,t),this.initService(t.serviceNum,e)};function Le(e){return null===e?"":(e=Oe[e]||e,String.fromCharCode(e))}function De(){for(var e=[],t=15;t--;)e.push("");return e}var Oe={42:225,92:233,94:237,95:243,96:250,123:231,124:247,125:209,126:241,127:9608,304:174,305:176,306:189,307:191,308:8482,309:162,310:163,311:9834,312:224,313:160,314:232,315:226,316:234,317:238,318:244,319:251,544:193,545:201,546:211,547:218,548:220,549:252,550:8216,551:161,552:42,553:39,554:8212,555:169,556:8480,557:8226,558:8220,559:8221,560:192,561:194,562:199,563:200,564:202,565:203,566:235,567:206,568:207,569:239,570:212,571:217,572:249,573:219,574:171,575:187,800:195,801:227,802:205,803:204,804:236,805:210,806:242,807:213,808:245,809:123,810:125,811:92,812:94,813:95,814:124,815:126,816:196,817:228,818:214,819:246,820:223,821:165,822:164,823:9474,824:197,825:229,826:216,827:248,828:9484,829:9488,830:9492,831:9496},Re=[4352,4384,4608,4640,5376,5408,5632,5664,5888,5920,4096,4864,4896,5120,5152],Me=function e(t,i){e.prototype.init.call(this),this.field_=t||0,this.dataChannel_=i||0,this.name_="CC"+(1+(this.field_<<1|this.dataChannel_)),this.setConstants(),this.reset(),this.push=function(e){var t,i,n,r,a=32639&e.ccData;a!==this.lastControlCode_?(4096==(61440&a)?this.lastControlCode_=a:a!==this.PADDING_&&(this.lastControlCode_=null),t=a>>>8,i=255&a,a===this.PADDING_||(a===this.RESUME_CAPTION_LOADING_?this.mode_="popOn":a===this.END_OF_CAPTION_?(this.mode_="popOn",this.clearFormatting(e.pts),this.flushDisplayed(e.pts),r=this.displayed_,this.displayed_=this.nonDisplayed_,this.nonDisplayed_=r,this.startPts_=e.pts):a===this.ROLL_UP_2_ROWS_?(this.rollUpRows_=2,this.setRollUp(e.pts)):a===this.ROLL_UP_3_ROWS_?(this.rollUpRows_=3,this.setRollUp(e.pts)):a===this.ROLL_UP_4_ROWS_?(this.rollUpRows_=4,this.setRollUp(e.pts)):a===this.CARRIAGE_RETURN_?(this.clearFormatting(e.pts),this.flushDisplayed(e.pts),this.shiftRowsUp_(),this.startPts_=e.pts):a===this.BACKSPACE_?"popOn"===this.mode_?this.nonDisplayed_[this.row_]=this.nonDisplayed_[this.row_].slice(0,-1):this.displayed_[this.row_]=this.displayed_[this.row_].slice(0,-1):a===this.ERASE_DISPLAYED_MEMORY_?(this.flushDisplayed(e.pts),this.displayed_=De()):a===this.ERASE_NON_DISPLAYED_MEMORY_?this.nonDisplayed_=De():a===this.RESUME_DIRECT_CAPTIONING_?("paintOn"!==this.mode_&&(this.flushDisplayed(e.pts),this.displayed_=De()),this.mode_="paintOn",this.startPts_=e.pts):this.isSpecialCharacter(t,i)?(n=Le((t=(3&t)<<8)|i),this[this.mode_](e.pts,n),this.column_++):this.isExtCharacter(t,i)?("popOn"===this.mode_?this.nonDisplayed_[this.row_]=this.nonDisplayed_[this.row_].slice(0,-1):this.displayed_[this.row_]=this.displayed_[this.row_].slice(0,-1),n=Le((t=(3&t)<<8)|i),this[this.mode_](e.pts,n),this.column_++):this.isMidRowCode(t,i)?(this.clearFormatting(e.pts),this[this.mode_](e.pts," "),this.column_++,14==(14&i)&&this.addFormatting(e.pts,["i"]),1==(1&i)&&this.addFormatting(e.pts,["u"])):this.isOffsetControlCode(t,i)?this.column_+=3&i:this.isPAC(t,i)?(r=Re.indexOf(7968&a),"rollUp"===this.mode_&&(r-this.rollUpRows_+1<0&&(r=this.rollUpRows_-1),this.setRollUp(e.pts,r)),r!==this.row_&&(this.clearFormatting(e.pts),this.row_=r),1&i&&-1===this.formatting_.indexOf("u")&&this.addFormatting(e.pts,["u"]),16==(16&a)&&(this.column_=4*((14&a)>>1)),this.isColorPAC(i)&&14==(14&i)&&this.addFormatting(e.pts,["i"])):this.isNormalChar(t)&&(0===i&&(i=null),n=Le(t),n+=Le(i),this[this.mode_](e.pts,n),this.column_+=n.length))):this.lastControlCode_=null}};Me.prototype=new j,Me.prototype.flushDisplayed=function(e){var t=this.displayed_.map(function(e,t){try{return e.trim()}catch(e){return this.trigger("log",{level:"warn",message:"Skipping a malformed 608 caption at index "+t+"."}),""}},this).join("\n").replace(/^\n+|\n+$/g,"");t.length&&this.trigger("data",{startPts:this.startPts_,endPts:e,text:t,stream:this.name_})},Me.prototype.reset=function(){this.mode_="popOn",this.topRow_=0,this.startPts_=0,this.displayed_=De(),this.nonDisplayed_=De(),this.lastControlCode_=null,this.column_=0,this.row_=14,this.rollUpRows_=2,this.formatting_=[]},Me.prototype.setConstants=function(){0===this.dataChannel_?(this.BASE_=16,this.EXT_=17,this.CONTROL_=(20|this.field_)<<8,this.OFFSET_=23):1===this.dataChannel_&&(this.BASE_=24,this.EXT_=25,this.CONTROL_=(28|this.field_)<<8,this.OFFSET_=31),this.PADDING_=0,this.RESUME_CAPTION_LOADING_=32|this.CONTROL_,this.END_OF_CAPTION_=47|this.CONTROL_,this.ROLL_UP_2_ROWS_=37|this.CONTROL_,this.ROLL_UP_3_ROWS_=38|this.CONTROL_,this.ROLL_UP_4_ROWS_=39|this.CONTROL_,this.CARRIAGE_RETURN_=45|this.CONTROL_,this.RESUME_DIRECT_CAPTIONING_=41|this.CONTROL_,this.BACKSPACE_=33|this.CONTROL_,this.ERASE_DISPLAYED_MEMORY_=44|this.CONTROL_,this.ERASE_NON_DISPLAYED_MEMORY_=46|this.CONTROL_},Me.prototype.isSpecialCharacter=function(e,t){return e===this.EXT_&&48<=t&&t<=63},Me.prototype.isExtCharacter=function(e,t){return(e===this.EXT_+1||e===this.EXT_+2)&&32<=t&&t<=63},Me.prototype.isMidRowCode=function(e,t){return e===this.EXT_&&32<=t&&t<=47},Me.prototype.isOffsetControlCode=function(e,t){return e===this.OFFSET_&&33<=t&&t<=35},Me.prototype.isPAC=function(e,t){return e>=this.BASE_&&e"},"");this[this.mode_](e,t)},Me.prototype.clearFormatting=function(e){var t;this.formatting_.length&&(t=this.formatting_.reverse().reduce(function(e,t){return e+""},""),this.formatting_=[],this[this.mode_](e,t))},Me.prototype.popOn=function(e,t){var i=this.nonDisplayed_[this.row_];this.nonDisplayed_[this.row_]=i+=t},Me.prototype.rollUp=function(e,t){var i=this.displayed_[this.row_];this.displayed_[this.row_]=i+=t},Me.prototype.shiftRowsUp_=function(){for(var e=0;e>>2,s*=4,s+=3&a[7],o.timeStamp=s,void 0===t.pts&&void 0===t.dts&&(t.pts=o.timeStamp,t.dts=o.timeStamp),this.trigger("timestamp",o))),t.frames.push(o),i+=10,(i+=n)>>4&&(i+=e[i]+1),0===t.pid)t.type="pat",n(e.subarray(i),t),this.trigger("data",t);else if(t.pid===this.pmtPid)for(t.type="pmt",n(e.subarray(i),t),this.trigger("data",t);this.packetsWaitingForPmt.length;)this.processPes_.apply(this,this.packetsWaitingForPmt.shift());else void 0===this.programMapTable?this.packetsWaitingForPmt.push([e,i,t]):this.processPes_(e,i,t)},this.processPes_=function(e,t,i){i.pid===this.programMapTable.video?i.streamType=Be.H264_STREAM_TYPE:i.pid===this.programMapTable.audio?i.streamType=Be.ADTS_STREAM_TYPE:i.streamType=this.programMapTable["timed-metadata"][i.pid],i.type="pes",i.data=e.subarray(t),this.trigger("data",i)}}).prototype=new j,ze.STREAM_TYPES={h264:27,adts:15},(Ge=function(){function n(e,t,i){var n,r,a,s,o=new Uint8Array(e.size),u={type:t},l=0,c=0;if(e.data.length&&!(e.size<9)){for(u.trackId=e.data[0].pid,l=0;l>>3,a.pts*=4,a.pts+=(6&r[13])>>>1,a.dts=a.pts,64&s&&(a.dts=(14&r[14])<<27|(255&r[15])<<20|(254&r[16])<<12|(255&r[17])<<5|(254&r[18])>>>3,a.dts*=4,a.dts+=(6&r[18])>>>1)),a.data=r.subarray(9+r[8])),t="video"===t||u.packetLength<=e.size,(i||t)&&(e.size=0,e.data.length=0),t&&d.trigger("data",u)}}var t,d=this,r=!1,a={data:[],size:0},s={data:[],size:0},o={data:[],size:0};Ge.prototype.init.call(this),this.push=function(i){({pat:function(){},pes:function(){var e,t;switch(i.streamType){case Be.H264_STREAM_TYPE:e=a,t="video";break;case Be.ADTS_STREAM_TYPE:e=s,t="audio";break;case Be.METADATA_STREAM_TYPE:e=o,t="timed-metadata";break;default:return}i.payloadUnitStartIndicator&&n(e,t,!0),e.data.push(i),e.size+=i.data.byteLength},pmt:function(){var e={type:"metadata",tracks:[]};null!==(t=i.programMapTable).video&&e.tracks.push({timelineStartInfo:{baseMediaDecodeTime:0},id:+t.video,codec:"avc",type:"video"}),null!==t.audio&&e.tracks.push({timelineStartInfo:{baseMediaDecodeTime:0},id:+t.audio,codec:"adts",type:"audio"}),r=!0,d.trigger("data",e)}})[i.type]()},this.reset=function(){a.size=0,a.data.length=0,s.size=0,s.data.length=0,this.trigger("reset")},this.flushStreams_=function(){n(a,"video"),n(s,"audio"),n(o,"timed-metadata")},this.flush=function(){var e;!r&&t&&(e={type:"metadata",tracks:[]},null!==t.video&&e.tracks.push({timelineStartInfo:{baseMediaDecodeTime:0},id:+t.video,codec:"avc",type:"video"}),null!==t.audio&&e.tracks.push({timelineStartInfo:{baseMediaDecodeTime:0},id:+t.audio,codec:"adts",type:"audio"}),d.trigger("data",e)),r=!1,this.flushStreams_(),this.trigger("done")}}).prototype=new j;var Ke,Ye={PAT_PID:0,MP2T_PACKET_LENGTH:188,TransportPacketStream:Xe,TransportParseStream:ze,ElementaryStream:Ge,TimestampRolloverStream:qe,CaptionStream:Ue.CaptionStream,Cea608Stream:Ue.Cea608Stream,Cea708Stream:Ue.Cea708Stream,MetadataStream:e};for(Ke in Be)Be.hasOwnProperty(Ke)&&(Ye[Ke]=Be[Ke]);var Qe=Ye,$e=se,Je=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],Ze=function(u){var l,c=0;Ze.prototype.init.call(this),this.skipWarn_=function(e,t){this.trigger("log",{level:"warn",message:"adts skiping bytes "+e+" to "+t+" in frame "+c+" outside syncword"})},this.push=function(e){var t,i,n,r,a,s,o=0;if(u||(c=0),"audio"===e.type){for(l&&l.length?(n=l,(l=new Uint8Array(n.byteLength+e.data.byteLength)).set(n),l.set(e.data,n.byteLength)):l=e.data;o+7>5,a=(r=1024*(1+(3&l[o+6])))*$e/Je[(60&l[o+2])>>>2],l.byteLength-o>>6&3),channelcount:(1&l[o+2])<<2|(192&l[o+3])>>>6,samplerate:Je[(60&l[o+2])>>>2],samplingfrequencyindex:(60&l[o+2])>>>2,samplesize:16,data:l.subarray(o+7+i,o+t)}),c++,o+=t}else"number"!=typeof s&&(s=o),o++;"number"==typeof s&&(this.skipWarn_(s,o),s=null),l=l.subarray(o)}},this.flush=function(){c=0,this.trigger("done")},this.reset=function(){l=void 0,this.trigger("reset")},this.endTimeline=function(){l=void 0,this.trigger("endedtimeline")}};Ze.prototype=new j;var et,tt,it=Ze,nt=function(n){var r=n.byteLength,a=0,s=0;this.length=function(){return 8*r},this.bitsAvailable=function(){return 8*r+s},this.loadWord=function(){var e=n.byteLength-r,t=new Uint8Array(4),i=Math.min(4,r);if(0===i)throw new Error("no bytes available");t.set(n.subarray(e,e+i)),a=new DataView(t.buffer).getUint32(0),s=8*i,r-=i},this.skipBits=function(e){var t;e>>32-t;return 0<(s-=t)?a<<=t:0>>e))return a<<=e,s-=e,e;return this.loadWord(),e+this.skipLeadingZeros()},this.skipUnsignedExpGolomb=function(){this.skipBits(1+this.skipLeadingZeros())},this.skipExpGolomb=function(){this.skipBits(1+this.skipLeadingZeros())},this.readUnsignedExpGolomb=function(){var e=this.skipLeadingZeros();return this.readBits(e+1)-1},this.readExpGolomb=function(){var e=this.readUnsignedExpGolomb();return 1&e?1+e>>>1:-1*(e>>>1)},this.readBoolean=function(){return 1===this.readBits(1)},this.readUnsignedByte=function(){return this.readBits(8)},this.loadWord()},rt=function(){var n,r,a=0;rt.prototype.init.call(this),this.push=function(e){for(var t,i=(r=r?((t=new Uint8Array(r.byteLength+e.data.byteLength)).set(r),t.set(e.data,r.byteLength),t):e.data).byteLength;a>4?i+20:i+10}function st(e,t){return e.length-t<10||e[t]!=="I".charCodeAt(0)||e[t+1]!=="D".charCodeAt(0)||e[t+2]!=="3".charCodeAt(0)?t:st(e,t+=at(e,t))}function ot(e){return e[0]<<21|e[1]<<14|e[2]<<7|e[3]}var qe={H264Stream:et,NalByteStream:rt},ut=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],lt={isLikelyAacData:function(e){var t=st(e,0);return e.length>=t+2&&255==(255&e[t])&&240==(240&e[t+1])&&16==(22&e[t+1])},parseId3TagSize:at,parseAdtsSize:function(e,t){var i=(224&e[t+5])>>5,n=e[t+4]<<3;return 6144&e[t+3]|n|i},parseType:function(e,t){return e[t]==="I".charCodeAt(0)&&e[t+1]==="D".charCodeAt(0)&&e[t+2]==="3".charCodeAt(0)?"timed-metadata":!0&e[t]&&240==(240&e[t+1])?"audio":null},parseSampleRate:function(e){for(var t=0;t+5>>2];t++}return null},parseAacTimestamp:function(e){var t,i=10;64&e[5]&&(i+=4,i+=ot(e.subarray(10,14)));do{if((t=ot(e.subarray(i+4,i+8)))<1)return null;if("PRIV"===String.fromCharCode(e[i],e[i+1],e[i+2],e[i+3]))for(var n=e.subarray(i+10,i+t+10),r=0;r>>2;return s*=4,s+=3&a[7]}}while(i+=10,(i+=t)a.length)break;t={type:"audio",data:a.subarray(r,r+n),pts:s,dts:s},this.trigger("data",t),r+=n}else{if(a.length-r<10)break;if(r+(n=lt.parseId3TagSize(a,r))>a.length)break;t={type:"timed-metadata",data:a.subarray(r,r+n)},this.trigger("data",t),r+=n}e=a.length-r,a=0i.pts?u++:(t++,a-=n.byteLength,s-=n.nalCount,o-=n.duration);return 0===t?e:t===e.length?null:((r=e.slice(t)).byteLength=a,r.duration=o,r.nalCount=s,r.pts=r[0].pts,r.dts=r[0].dts,r)},this.alignGopsAtEnd_=function(e){for(var t,i,n=l.length-1,r=e.length-1,a=null,s=!1;0<=n&&0<=r;){if(t=l[n],i=e[r],t.pts===i.pts){s=!0;break}t.pts>i.pts?n--:(n===l.length-1&&(a=r),r--)}if(!s&&null===a)return null;if(0===(u=s?r:a))return e;var o=e.slice(u),u=o.reduce(function(e,t){return e.byteLength+=t.byteLength,e.duration+=t.duration,e.nalCount+=t.nalCount,e},{byteLength:0,duration:0,nalCount:0});return o.byteLength=u.byteLength,o.duration=u.duration,o.nalCount=u.nalCount,o.pts=o[0].pts,o.dts=o[0].dts,o},this.alignGopsWith=function(e){l=e}}).prototype=new j,(mt=function(e,t){this.numberOfTracks=0,this.metadataStream=t,"undefined"!=typeof(e=e||{}).remux?this.remuxTracks=!!e.remux:this.remuxTracks=!0,"boolean"==typeof e.keepOriginalTimestamps?this.keepOriginalTimestamps=e.keepOriginalTimestamps:this.keepOriginalTimestamps=!1,this.pendingTracks=[],this.videoTrack=null,this.pendingBoxes=[],this.pendingCaptions=[],this.pendingMetadata=[],this.pendingBytes=0,this.emittedTracks=0,mt.prototype.init.call(this),this.push=function(e){return e.text?this.pendingCaptions.push(e):e.frames?this.pendingMetadata.push(e):(this.pendingTracks.push(e.track),this.pendingBytes+=e.boxes.byteLength,"video"===e.track.type&&(this.videoTrack=e.track,this.pendingBoxes.push(e.boxes)),void("audio"===e.track.type&&(this.audioTrack=e.track,this.pendingBoxes.unshift(e.boxes))))}}).prototype=new j,mt.prototype.flush=function(e){var t,i,n,r=0,a={captions:[],captionStreams:{},metadata:[],info:{}},s=0;if(this.pendingTracks.length=this.numberOfTracks&&(this.trigger("done"),this.emittedTracks=0))}if(this.videoTrack?(s=this.videoTrack.timelineStartInfo.pts,vt.forEach(function(e){a.info[e]=this.videoTrack[e]},this)):this.audioTrack&&(s=this.audioTrack.timelineStartInfo.pts,yt.forEach(function(e){a.info[e]=this.audioTrack[e]},this)),this.videoTrack||this.audioTrack){for(1===this.pendingTracks.length?a.type=this.pendingTracks[0].type:a.type="combined",this.emittedTracks+=this.pendingTracks.length,e=K(this.pendingTracks),a.initSegment=new Uint8Array(e.byteLength),a.initSegment.set(e),a.data=new Uint8Array(this.pendingBytes),n=0;n=this.numberOfTracks&&(this.trigger("done"),this.emittedTracks=0)},mt.prototype.setRemux=function(e){this.remuxTracks=e},(ft=function(n){var r,a,s=this,o=!0;ft.prototype.init.call(this),this.baseMediaDecodeTime=(n=n||{}).baseMediaDecodeTime||0,this.transmuxPipeline_={},this.setupAacPipeline=function(){var t={};(this.transmuxPipeline_=t).type="aac",t.metadataStream=new Qe.MetadataStream,t.aacStream=new gt,t.audioTimestampRolloverStream=new Qe.TimestampRolloverStream("audio"),t.timedMetadataTimestampRolloverStream=new Qe.TimestampRolloverStream("timed-metadata"),t.adtsStream=new it,t.coalesceStream=new mt(n,t.metadataStream),t.headOfPipeline=t.aacStream,t.aacStream.pipe(t.audioTimestampRolloverStream).pipe(t.adtsStream),t.aacStream.pipe(t.timedMetadataTimestampRolloverStream).pipe(t.metadataStream).pipe(t.coalesceStream),t.metadataStream.on("timestamp",function(e){t.aacStream.setTimestamp(e.timeStamp)}),t.aacStream.on("data",function(e){"timed-metadata"!==e.type&&"audio"!==e.type||t.audioSegmentStream||(a=a||{timelineStartInfo:{baseMediaDecodeTime:s.baseMediaDecodeTime},codec:"adts",type:"audio"},t.coalesceStream.numberOfTracks++,t.audioSegmentStream=new St(a,n),t.audioSegmentStream.on("log",s.getLogTrigger_("audioSegmentStream")),t.audioSegmentStream.on("timingInfo",s.trigger.bind(s,"audioTimingInfo")),t.adtsStream.pipe(t.audioSegmentStream).pipe(t.coalesceStream),s.trigger("trackinfo",{hasAudio:!!a,hasVideo:!!r}))}),t.coalesceStream.on("data",this.trigger.bind(this,"data")),t.coalesceStream.on("done",this.trigger.bind(this,"done"))},this.setupTsPipeline=function(){var i={};(this.transmuxPipeline_=i).type="ts",i.metadataStream=new Qe.MetadataStream,i.packetStream=new Qe.TransportPacketStream,i.parseStream=new Qe.TransportParseStream,i.elementaryStream=new Qe.ElementaryStream,i.timestampRolloverStream=new Qe.TimestampRolloverStream,i.adtsStream=new it,i.h264Stream=new _t,i.captionStream=new Qe.CaptionStream(n),i.coalesceStream=new mt(n,i.metadataStream),i.headOfPipeline=i.packetStream,i.packetStream.pipe(i.parseStream).pipe(i.elementaryStream).pipe(i.timestampRolloverStream),i.timestampRolloverStream.pipe(i.h264Stream),i.timestampRolloverStream.pipe(i.adtsStream),i.timestampRolloverStream.pipe(i.metadataStream).pipe(i.coalesceStream),i.h264Stream.pipe(i.captionStream).pipe(i.coalesceStream),i.elementaryStream.on("data",function(e){var t;if("metadata"===e.type){for(t=e.tracks.length;t--;)r||"video"!==e.tracks[t].type?a||"audio"!==e.tracks[t].type||((a=e.tracks[t]).timelineStartInfo.baseMediaDecodeTime=s.baseMediaDecodeTime):(r=e.tracks[t]).timelineStartInfo.baseMediaDecodeTime=s.baseMediaDecodeTime;r&&!i.videoSegmentStream&&(i.coalesceStream.numberOfTracks++,i.videoSegmentStream=new pt(r,n),i.videoSegmentStream.on("log",s.getLogTrigger_("videoSegmentStream")),i.videoSegmentStream.on("timelineStartInfo",function(e){a&&!n.keepOriginalTimestamps&&(a.timelineStartInfo=e,i.audioSegmentStream.setEarliestDts(e.dts-s.baseMediaDecodeTime))}),i.videoSegmentStream.on("processedGopsInfo",s.trigger.bind(s,"gopInfo")),i.videoSegmentStream.on("segmentTimingInfo",s.trigger.bind(s,"videoSegmentTimingInfo")),i.videoSegmentStream.on("baseMediaDecodeTime",function(e){a&&i.audioSegmentStream.setVideoBaseMediaDecodeTime(e)}),i.videoSegmentStream.on("timingInfo",s.trigger.bind(s,"videoTimingInfo")),i.h264Stream.pipe(i.videoSegmentStream).pipe(i.coalesceStream)),a&&!i.audioSegmentStream&&(i.coalesceStream.numberOfTracks++,i.audioSegmentStream=new St(a,n),i.audioSegmentStream.on("log",s.getLogTrigger_("audioSegmentStream")),i.audioSegmentStream.on("timingInfo",s.trigger.bind(s,"audioTimingInfo")),i.audioSegmentStream.on("segmentTimingInfo",s.trigger.bind(s,"audioSegmentTimingInfo")),i.adtsStream.pipe(i.audioSegmentStream).pipe(i.coalesceStream)),s.trigger("trackinfo",{hasAudio:!!a,hasVideo:!!r})}}),i.coalesceStream.on("data",this.trigger.bind(this,"data")),i.coalesceStream.on("id3Frame",function(e){e.dispatchType=i.metadataStream.dispatchType,s.trigger("id3Frame",e)}),i.coalesceStream.on("caption",this.trigger.bind(this,"caption")),i.coalesceStream.on("done",this.trigger.bind(this,"done"))},this.setBaseMediaDecodeTime=function(e){var t=this.transmuxPipeline_;n.keepOriginalTimestamps||(this.baseMediaDecodeTime=e),a&&(a.timelineStartInfo.dts=void 0,a.timelineStartInfo.pts=void 0,ye(a),t.audioTimestampRolloverStream&&t.audioTimestampRolloverStream.discontinuity()),r&&(t.videoSegmentStream&&(t.videoSegmentStream.gopCache_=[]),r.timelineStartInfo.dts=void 0,r.timelineStartInfo.pts=void 0,ye(r),t.captionStream.reset()),t.timestampRolloverStream&&t.timestampRolloverStream.discontinuity()},this.setAudioAppendStart=function(e){a&&this.transmuxPipeline_.audioSegmentStream.setAudioAppendStart(e)},this.setRemux=function(e){var t=this.transmuxPipeline_;n.remux=e,t&&t.coalesceStream&&t.coalesceStream.setRemux(e)},this.alignGopsWith=function(e){r&&this.transmuxPipeline_.videoSegmentStream&&this.transmuxPipeline_.videoSegmentStream.alignGopsWith(e)},this.getLogTrigger_=function(t){var i=this;return function(e){e.stream=t,i.trigger("log",e)}},this.push=function(e){if(o){var t=bt(e);if(t&&"aac"!==this.transmuxPipeline_.type?this.setupAacPipeline():t||"ts"===this.transmuxPipeline_.type||this.setupTsPipeline(),this.transmuxPipeline_)for(var i=Object.keys(this.transmuxPipeline_),n=0;n>>4&&(t+=e[4]+1),t}function It(e){switch(e){case 5:return"slice_layer_without_partitioning_rbsp_idr";case 6:return"sei_rbsp";case 7:return"seq_parameter_set_rbsp";case 8:return"pic_parameter_set_rbsp";case 9:return"access_unit_delimiter_rbsp";default:return null}}var xt={Transmuxer:ft,VideoSegmentStream:pt,AudioSegmentStream:St,AUDIO_PROPERTIES:yt,VIDEO_PROPERTIES:vt,generateSegmentTimingInfo:ht},e=function(e){return e>>>0},At=function(e){var t="";return t+=String.fromCharCode(e[0]),t+=String.fromCharCode(e[1]),t+=String.fromCharCode(e[2]),t+=String.fromCharCode(e[3])},Pt=e,Lt=function e(t,i){var n,r,a,s=[];if(!i.length)return null;for(n=0;n>>2,dependsOn:3&e[0],isDependedOn:(192&e[1])>>>6,hasRedundancy:(48&e[1])>>>4,paddingValue:(14&e[1])>>>1,isNonSyncSample:1&e[1],degradationPriority:e[2]<<8|e[3]}},Mt=function(e){var t,i={version:e[0],flags:new Uint8Array(e.subarray(1,4)),samples:[]},n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=1&i.flags[2],a=4&i.flags[2],s=1&i.flags[1],o=2&i.flags[1],u=4&i.flags[1],l=8&i.flags[1],c=n.getUint32(4),d=8;for(r&&(i.dataOffset=n.getInt32(d),d+=4),a&&c&&(t={flags:Rt(e.subarray(d,d+4))},d+=4,s&&(t.duration=n.getUint32(d),d+=4),o&&(t.size=n.getUint32(d),d+=4),l&&(1===i.version?t.compositionTimeOffset=n.getInt32(d):t.compositionTimeOffset=n.getUint32(d),d+=4),i.samples.push(t),c--);c--;)t={},s&&(t.duration=n.getUint32(d),d+=4),o&&(t.size=n.getUint32(d),d+=4),u&&(t.flags=Rt(e.subarray(d,d+4)),d+=4),l&&(1===i.version?t.compositionTimeOffset=n.getInt32(d):t.compositionTimeOffset=n.getUint32(d),d+=4),i.samples.push(t);return i},Nt=function(e){var t=new DataView(e.buffer,e.byteOffset,e.byteLength),i={version:e[0],flags:new Uint8Array(e.subarray(1,4)),trackId:t.getUint32(4)},n=1&i.flags[2],r=2&i.flags[2],a=8&i.flags[2],s=16&i.flags[2],o=32&i.flags[2],u=65536&i.flags[0],l=131072&i.flags[0],e=8;return n&&(e+=4,i.baseDataOffset=t.getUint32(12),e+=4),r&&(i.sampleDescriptionIndex=t.getUint32(e),e+=4),a&&(i.defaultSampleDuration=t.getUint32(e),e+=4),s&&(i.defaultSampleSize=t.getUint32(e),e+=4),o&&(i.defaultSampleFlags=t.getUint32(e)),u&&(i.durationIsEmpty=!0),!n&&l&&(i.baseDataOffsetIsMoof=!0),i},Ut=Ee,Bt=Ue.CaptionStream,Ft=function(){var t,r,a,s,o,i,n=!1;this.isInitialized=function(){return n},this.init=function(e){t=new Bt,n=!0,i=!!e&&e.isPartial,t.on("data",function(e){e.startTime=e.startPts/s,e.endTime=e.endPts/s,o.captions.push(e),o.captionStreams[e.stream]=!0}),t.on("log",function(e){o.logs.push(e)})},this.isNewInit=function(e,t){return!(e&&0===e.length||t&&"object"==typeof t&&0===Object.keys(t).length)&&(a!==e[0]||s!==t[a])},this.parse=function(e,t,i){if(!this.isInitialized())return null;if(!t||!i)return null;if(this.isNewInit(t,i))a=t[0],s=i[a];else if(null===a||!s)return r.push(e),null;for(;0>>2&63).replace(/^0/,"")):t.codec="mp4a.40.2"):t.codec=t.codec.toLowerCase()));e=Lt(e,["mdia","mdhd"])[0];e&&(t.timescale=qt(e)),s.push(t)}),s},Vt=j,Wt=e,zt=Ce,Gt={};Gt.ts={parseType:function(e,t){e=kt(e);return 0===e?"pat":e===t?"pmt":t?"pes":null},parsePat:function(e){var t=Ct(e),i=4+wt(e);return t&&(i+=e[i]+1),(31&e[i+10])<<8|e[i+11]},parsePmt:function(e){var t={},i=Ct(e),n=4+wt(e);if(i&&(n+=e[n]+1),1&e[n+5]){for(var r=3+((15&e[n+1])<<8|e[n+2])-4,a=12+((15&e[n+10])<<8|e[n+11]);a=e.byteLength)return null;var i=null,n=e[t+7];return 192&n&&((i={}).pts=(14&e[t+9])<<27|(255&e[t+10])<<20|(254&e[t+11])<<12|(255&e[t+12])<<5|(254&e[t+13])>>>3,i.pts*=4,i.pts+=(6&e[t+13])>>>1,i.dts=i.pts,64&n&&(i.dts=(14&e[t+14])<<27|(255&e[t+15])<<20|(254&e[t+16])<<12|(255&e[t+17])<<5|(254&e[t+18])>>>3,i.dts*=4,i.dts+=(6&e[t+18])>>>1)),i},videoPacketContainsKeyFrame:function(e){for(var t=4+wt(e),i=e.subarray(t),n=0,r=0,a=!1;re.length){i=!0;break}null===a&&(t=e.subarray(o,o+s),a=Gt.aac.parseAacTimestamp(t)),o+=s;break;case"audio":if(e.length-o<7){i=!0;break}if((s=Gt.aac.parseAdtsSize(e,o))>e.length){i=!0;break}null===r&&(t=e.subarray(o,o+s),r=Gt.aac.parseSampleRate(t)),n++,o+=s;break;default:o++}if(i)return null}if(null===r||null===a)return null;var u=Yt/r;return{audio:[{type:"audio",dts:a,pts:a},{type:"audio",dts:a+1024*n*u,pts:a+1024*n*u}]}}:Kt)(e);return r&&(r.audio||r.video)?(e=t,(t=r).audio&&t.audio.length&&("undefined"!=typeof(i=e)&&!isNaN(i)||(i=t.audio[0].dts),t.audio.forEach(function(e){e.dts=zt(e.dts,i),e.pts=zt(e.pts,i),e.dtsTime=e.dts/Yt,e.ptsTime=e.pts/Yt})),t.video&&t.video.length&&("undefined"!=typeof(n=e)&&!isNaN(n)||(n=t.video[0].dts),t.video.forEach(function(e){e.dts=zt(e.dts,n),e.pts=zt(e.pts,n),e.dtsTime=e.dts/Yt,e.ptsTime=e.pts/Yt}),t.firstKeyFrame&&((t=t.firstKeyFrame).dts=zt(t.dts,n),t.pts=zt(t.pts,n),t.dtsTime=t.dts/Yt,t.ptsTime=t.pts/Yt)),r):null},$t=function(){function e(e,t){this.options=t||{},this.self=e,this.init()}var t=e.prototype;return t.init=function(){var i,e;this.transmuxer&&this.transmuxer.dispose(),this.transmuxer=new xt.Transmuxer(this.options),i=this.self,(e=this.transmuxer).on("data",function(e){var t=e.initSegment;e.initSegment={data:t.buffer,byteOffset:t.byteOffset,byteLength:t.byteLength};t=e.data;e.data=t.buffer,i.postMessage({action:"data",segment:e,byteOffset:t.byteOffset,byteLength:t.byteLength},[e.data])}),e.on("done",function(e){i.postMessage({action:"done"})}),e.on("gopInfo",function(e){i.postMessage({action:"gopInfo",gopInfo:e})}),e.on("videoSegmentTimingInfo",function(e){var t={start:{decode:ue(e.start.dts),presentation:ue(e.start.pts)},end:{decode:ue(e.end.dts),presentation:ue(e.end.pts)},baseMediaDecodeTime:ue(e.baseMediaDecodeTime)};e.prependedContentDuration&&(t.prependedContentDuration=ue(e.prependedContentDuration)),i.postMessage({action:"videoSegmentTimingInfo",videoSegmentTimingInfo:t})}),e.on("audioSegmentTimingInfo",function(e){var t={start:{decode:ue(e.start.dts),presentation:ue(e.start.pts)},end:{decode:ue(e.end.dts),presentation:ue(e.end.pts)},baseMediaDecodeTime:ue(e.baseMediaDecodeTime)};e.prependedContentDuration&&(t.prependedContentDuration=ue(e.prependedContentDuration)),i.postMessage({action:"audioSegmentTimingInfo",audioSegmentTimingInfo:t})}),e.on("id3Frame",function(e){i.postMessage({action:"id3Frame",id3Frame:e})}),e.on("caption",function(e){i.postMessage({action:"caption",caption:e})}),e.on("trackinfo",function(e){i.postMessage({action:"trackinfo",trackInfo:e})}),e.on("audioTimingInfo",function(e){i.postMessage({action:"audioTimingInfo",audioTimingInfo:{start:ue(e.start),end:ue(e.end)}})}),e.on("videoTimingInfo",function(e){i.postMessage({action:"videoTimingInfo",videoTimingInfo:{start:ue(e.start),end:ue(e.end)}})}),e.on("log",function(e){i.postMessage({action:"log",log:e})})},t.pushMp4Captions=function(e){this.captionParser||(this.captionParser=new Ft,this.captionParser.init());var t=new Uint8Array(e.data,e.byteOffset,e.byteLength),e=this.captionParser.parse(t,e.trackIds,e.timescales);this.self.postMessage({action:"mp4Captions",captions:e&&e.captions||[],logs:e&&e.logs||[],data:t.buffer},[t.buffer])},t.probeMp4StartTime=function(e){var t=e.timescales,e=e.data,t=Vt(t,e);this.self.postMessage({action:"probeMp4StartTime",startTime:t,data:e},[e.buffer])},t.probeMp4Tracks=function(e){var t=e.data,e=Wt(t);this.self.postMessage({action:"probeMp4Tracks",tracks:e,data:t},[t.buffer])},t.probeTs=function(e){var t=e.data,i=e.baseStartTime,e="number"!=typeof i||isNaN(i)?void 0:i*se,i=Qt(t,e),e=null;i&&((e={hasVideo:i.video&&2===i.video.length||!1,hasAudio:i.audio&&2===i.audio.length||!1}).hasVideo&&(e.videoStart=i.video[0].ptsTime),e.hasAudio&&(e.audioStart=i.audio[0].ptsTime)),this.self.postMessage({action:"probeTs",result:e,data:t},[t.buffer])},t.clearAllMp4Captions=function(){this.captionParser&&this.captionParser.clearAllCaptions()},t.clearParsedMp4Captions=function(){this.captionParser&&this.captionParser.clearParsedCaptions()},t.push=function(e){e=new Uint8Array(e.data,e.byteOffset,e.byteLength);this.transmuxer.push(e)},t.reset=function(){this.transmuxer.reset()},t.setTimestampOffset=function(e){e=e.timestampOffset||0;this.transmuxer.setBaseMediaDecodeTime(Math.round(oe(e)))},t.setAudioAppendStart=function(e){this.transmuxer.setAudioAppendStart(Math.ceil(oe(e.appendStart)))},t.setRemux=function(e){this.transmuxer.setRemux(e.remux)},t.flush=function(e){this.transmuxer.flush(),self.postMessage({action:"done",type:"transmuxed"})},t.endTimeline=function(){this.transmuxer.endTimeline(),self.postMessage({action:"endedtimeline",type:"transmuxed"})},t.alignGopsWith=function(e){this.transmuxer.alignGopsWith(e.gopsToAlignWith.slice())},e}();self.onmessage=function(e){"init"===e.data.action&&e.data.options?this.messageHandlers=new $t(self,e.data.options):(this.messageHandlers||(this.messageHandlers=new $t(self)),e.data&&e.data.action&&"init"!==e.data.action&&this.messageHandlers[e.data.action]&&this.messageHandlers[e.data.action](e.data))}}))),sl=function(e){e.currentTransmux=null,e.transmuxQueue.length&&(e.currentTransmux=e.transmuxQueue.shift(),"function"==typeof e.currentTransmux?e.currentTransmux():hu(e.currentTransmux))},ol=function(e){fu("reset",e)},ul=function(e){var t=new al;t.currentTransmux=null,t.transmuxQueue=[];var i=t.terminate;return t.terminate=function(){return t.currentTransmux=null,t.transmuxQueue.length=0,i.call(t)},t.postMessage({action:"init",options:e}),t},ll=2,cl=-101,dl=-102,hl=yo("CodecUtils"),pl=yo("PlaylistSelector"),Kt=function(){var e=this.useDevicePixelRatio&&_.devicePixelRatio||1;return Nu(this.playlists.master,this.systemBandwidth,parseInt(Ou(this.tech_.el(),"width"),10)*e,parseInt(Ou(this.tech_.el(),"height"),10)*e,this.limitRenditionByPlayerDimensions,this.masterPlaylistController_)},fl=function(n){function e(e,t){var i=n.call(this)||this;if(!e)throw new TypeError("Initialization settings are required");if("function"!=typeof e.currentTime)throw new TypeError("No currentTime getter specified");if(!e.mediaSource)throw new TypeError("No MediaSource specified");return i.bandwidth=e.bandwidth,i.throughput={rate:0,count:0},i.roundTrip=NaN,i.resetStats_(),i.mediaIndex=null,i.partIndex=null,i.hasPlayed_=e.hasPlayed,i.currentTime_=e.currentTime,i.seekable_=e.seekable,i.seeking_=e.seeking,i.duration_=e.duration,i.mediaSource_=e.mediaSource,i.vhs_=e.vhs,i.loaderType_=e.loaderType,i.currentMediaInfo_=void 0,i.startingMediaInfo_=void 0,i.segmentMetadataTrack_=e.segmentMetadataTrack,i.goalBufferLength_=e.goalBufferLength,i.sourceType_=e.sourceType,i.sourceUpdater_=e.sourceUpdater,i.inbandTextTracks_=e.inbandTextTracks,i.state_="INIT",i.timelineChangeController_=e.timelineChangeController,i.shouldSaveSegmentTimingInfo_=!0,i.parse708captions_=e.parse708captions,i.experimentalExactManifestTimings=e.experimentalExactManifestTimings,i.checkBufferTimeout_=null,i.error_=void 0,i.currentTimeline_=-1,i.pendingSegment_=null,i.xhrOptions_=null,i.pendingSegments_=[],i.audioDisabled_=!1,i.isPendingTimestampOffset_=!1,i.gopBuffer_=[],i.timeMapping_=0,i.safeAppend_=11<=ir.browser.IE_VERSION,i.appendInitSegment_={audio:!0,video:!0},i.playlistOfLastInitSegment_={audio:null,video:null},i.callQueue_=[],i.loadQueue_=[],i.metadataQueue_={id3:[],caption:[]},i.waitingOnRemove_=!1,i.quotaExceededErrorRetryTimeout_=null,i.activeInitSegmentId_=null,i.initSegments_={},i.cacheEncryptionKeys_=e.cacheEncryptionKeys,i.keyCache_={},i.decrypter_=e.decrypter,i.syncController_=e.syncController,i.syncPoint_={segmentIndex:0,time:0},i.transmuxer_=i.createTransmuxer_(),i.triggerSyncInfoUpdate_=function(){return i.trigger("syncinfoupdate")},i.syncController_.on("syncinfoupdate",i.triggerSyncInfoUpdate_),i.mediaSource_.addEventListener("sourceopen",function(){i.isEndOfStream_()||(i.ended_=!1)}),i.fetchAtBuffer_=!1,i.logger_=yo("SegmentLoader["+i.loaderType_+"]"),Object.defineProperty(yt(i),"state",{get:function(){return this.state_},set:function(e){e!==this.state_&&(this.logger_(this.state_+" -> "+e),this.state_=e,this.trigger("statechange"))}}),i.sourceUpdater_.on("ready",function(){i.hasEnoughInfoToAppend_()&&i.processCallQueue_()}),"main"===i.loaderType_&&i.timelineChangeController_.on("pendingtimelinechange",function(){i.hasEnoughInfoToAppend_()&&i.processCallQueue_()}),"audio"===i.loaderType_&&i.timelineChangeController_.on("timelinechange",function(){i.hasEnoughInfoToLoad_()&&i.processLoadQueue_(),i.hasEnoughInfoToAppend_()&&i.processCallQueue_()}),i}vt(e,n);var t=e.prototype;return t.createTransmuxer_=function(){return ul({remux:!1,alignGopsAtEnd:this.safeAppend_,keepOriginalTimestamps:!0,parse708captions:this.parse708captions_})},t.resetStats_=function(){this.mediaBytesTransferred=0,this.mediaRequests=0,this.mediaRequestsAborted=0,this.mediaRequestsTimedout=0,this.mediaRequestsErrored=0,this.mediaTransferDuration=0,this.mediaSecondsLoaded=0,this.mediaAppends=0},t.dispose=function(){this.trigger("dispose"),this.state="DISPOSED",this.pause(),this.abort_(),this.transmuxer_&&this.transmuxer_.terminate(),this.resetStats_(),this.checkBufferTimeout_&&_.clearTimeout(this.checkBufferTimeout_),this.syncController_&&this.triggerSyncInfoUpdate_&&this.syncController_.off("syncinfoupdate",this.triggerSyncInfoUpdate_),this.off()},t.setAudio=function(e){this.audioDisabled_=!e,e?this.appendInitSegment_.audio=!0:this.sourceUpdater_.removeAudio(0,this.duration_())},t.abort=function(){"WAITING"===this.state?(this.abort_(),this.state="READY",this.paused()||this.monitorBuffer_()):this.pendingSegment_&&(this.pendingSegment_=null)},t.abort_=function(){this.pendingSegment_&&this.pendingSegment_.abortRequests&&this.pendingSegment_.abortRequests(),this.pendingSegment_=null,this.callQueue_=[],this.loadQueue_=[],this.metadataQueue_.id3=[],this.metadataQueue_.caption=[],this.timelineChangeController_.clearPendingTimelineChange(this.loaderType_),this.waitingOnRemove_=!1,_.clearTimeout(this.quotaExceededErrorRetryTimeout_),this.quotaExceededErrorRetryTimeout_=null},t.checkForAbort_=function(e){return"APPENDING"!==this.state||this.pendingSegment_?!this.pendingSegment_||this.pendingSegment_.requestId!==e:(this.state="READY",!0)},t.error=function(e){return"undefined"!=typeof e&&(this.logger_("error occurred:",e),this.error_=e),this.pendingSegment_=null,this.error_},t.endOfStream=function(){this.ended_=!0,this.transmuxer_&&ol(this.transmuxer_),this.gopBuffer_.length=0,this.pause(),this.trigger("ended")},t.buffered_=function(){var e=this.getMediaInfo_();if(!this.sourceUpdater_||!e)return ir.createTimeRanges();if("main"===this.loaderType_){var t=e.hasAudio,i=e.hasVideo,e=e.isMuxed;if(i&&t&&!this.audioDisabled_&&!e)return this.sourceUpdater_.buffered();if(i)return this.sourceUpdater_.videoBuffered()}return this.sourceUpdater_.audioBuffered()},t.initSegmentForMap=function(e,t){if(void 0===t&&(t=!1),!e)return null;var i=iu(e),n=this.initSegments_[i];return t&&!n&&e.bytes&&(this.initSegments_[i]=n={resolvedUri:e.resolvedUri,byterange:e.byterange,bytes:e.bytes,tracks:e.tracks,timescales:e.timescales}),n||e},t.segmentKey=function(e,t){if(void 0===t&&(t=!1),!e)return null;var i=nu(e),n=this.keyCache_[i];this.cacheEncryptionKeys_&&t&&!n&&e.bytes&&(this.keyCache_[i]=n={resolvedUri:e.resolvedUri,bytes:e.bytes});e={resolvedUri:(n||e).resolvedUri};return n&&(e.bytes=n.bytes),e},t.couldBeginLoading_=function(){return this.playlist_&&!this.paused()},t.load=function(){if(this.monitorBuffer_(),this.playlist_)return"INIT"===this.state&&this.couldBeginLoading_()?this.init_():void(!this.couldBeginLoading_()||"READY"!==this.state&&"INIT"!==this.state||(this.state="READY"))},t.init_=function(){return this.state="READY",this.resetEverything(),this.monitorBuffer_()},t.playlist=function(e,t){if(void 0===t&&(t={}),e){var i=this.playlist_,n=this.pendingSegment_;this.playlist_=e,this.xhrOptions_=t,"INIT"===this.state&&(e.syncInfo={mediaSequence:e.mediaSequence,time:0},"main"===this.loaderType_&&this.syncController_.setDateTimeMappingForStart(e));var r=null;if(i&&(i.id?r=i.id:i.uri&&(r=i.uri)),this.logger_("playlist update ["+r+" => "+(e.id||e.uri)+"]"),this.trigger("syncinfoupdate"),"INIT"===this.state&&this.couldBeginLoading_())return this.init_();if(!i||i.uri!==e.uri)return null!==this.mediaIndex&&this.resyncLoader(),this.currentMediaInfo_=void 0,void this.trigger("playlistupdate");t=e.mediaSequence-i.mediaSequence;this.logger_("live window shift ["+t+"]"),null!==this.mediaIndex&&(this.mediaIndex-=t,this.mediaIndex<0?(this.mediaIndex=null,this.partIndex=null):(r=this.playlist_.segments[this.mediaIndex],!this.partIndex||r.parts&&r.parts.length&&r.parts[this.partIndex]||(r=this.mediaIndex,this.logger_("currently processing part (index "+this.partIndex+") no longer exists."),this.resetLoader(),this.mediaIndex=r))),n&&(n.mediaIndex-=t,n.mediaIndex<0?(n.mediaIndex=null,n.partIndex=null):(0<=n.mediaIndex&&(n.segment=e.segments[n.mediaIndex]),0<=n.partIndex&&n.segment.parts&&(n.part=n.segment.parts[n.partIndex]))),this.syncController_.saveExpiredSegmentInfo(i,e)}},t.pause=function(){this.checkBufferTimeout_&&(_.clearTimeout(this.checkBufferTimeout_),this.checkBufferTimeout_=null)},t.paused=function(){return null===this.checkBufferTimeout_},t.resetEverything=function(e){this.ended_=!1,this.appendInitSegment_={audio:!0,video:!0},this.resetLoader(),this.remove(0,1/0,e),this.transmuxer_&&this.transmuxer_.postMessage({action:"clearAllMp4Captions"})},t.resetLoader=function(){this.fetchAtBuffer_=!1,this.resyncLoader()},t.resyncLoader=function(){this.transmuxer_&&ol(this.transmuxer_),this.mediaIndex=null,this.partIndex=null,this.syncPoint_=null,this.isPendingTimestampOffset_=!1,this.callQueue_=[],this.loadQueue_=[],this.metadataQueue_.id3=[],this.metadataQueue_.caption=[],this.abort(),this.transmuxer_&&this.transmuxer_.postMessage({action:"clearParsedMp4Captions"})},t.remove=function(e,t,i,n){if(void 0===i&&(i=function(){}),void 0===n&&(n=!1),(t=t===1/0?this.duration_():t)<=e)this.logger_("skipping remove because end ${end} is <= start ${start}");else if(this.sourceUpdater_&&this.getMediaInfo_()){var r,a=1,s=function(){0===--a&&i()};for(r in!n&&this.audioDisabled_||(a++,this.sourceUpdater_.removeAudio(e,t,s)),!n&&"main"!==this.loaderType_||(this.gopBuffer_=function(e,t,i,n){for(var r=Math.ceil((t-n)*Gu),a=Math.ceil((i-n)*Gu),n=e.slice(),s=e.length;s--&&!(e[s].pts<=a););if(-1===s)return n;for(var o=s+1;o--&&!(e[o].pts<=r););return o=Math.max(o,0),n.splice(o,s-o+1),n}(this.gopBuffer_,e,t,this.timeMapping_),a++,this.sourceUpdater_.removeVideo(e,t,s)),this.inbandTextTracks_)Bu(e,t,this.inbandTextTracks_[r]);Bu(e,t,this.segmentMetadataTrack_),s()}else this.logger_("skipping remove because no source updater or starting media info")},t.monitorBuffer_=function(){this.checkBufferTimeout_&&_.clearTimeout(this.checkBufferTimeout_),this.checkBufferTimeout_=_.setTimeout(this.monitorBufferTick_.bind(this),1)},t.monitorBufferTick_=function(){"READY"===this.state&&this.fillBuffer_(),this.checkBufferTimeout_&&_.clearTimeout(this.checkBufferTimeout_),this.checkBufferTimeout_=_.setTimeout(this.monitorBufferTick_.bind(this),500)},t.fillBuffer_=function(){var e;this.sourceUpdater_.updating()||(e=this.chooseNextRequest_())&&("number"==typeof e.timestampOffset&&(this.isPendingTimestampOffset_=!1,this.timelineChangeController_.pendingTimelineChange({type:this.loaderType_,from:this.currentTimeline_,to:e.timeline})),this.loadSegment_(e))},t.isEndOfStream_=function(e,t,i){if(void 0===e&&(e=this.mediaIndex),void 0===t&&(t=this.playlist_),void 0===i&&(i=this.partIndex),!t||!this.mediaSource_)return!1;var n="number"==typeof e&&t.segments[e],e=e+1===t.segments.length,n=!n||!n.parts||i+1===n.parts.length;return t.endList&&"open"===this.mediaSource_.readyState&&e&&n},t.chooseNextRequest_=function(){var e=Eo(this.buffered_())||0,t=Math.max(0,e-this.currentTime_()),i=!this.hasPlayed_()&&1<=t,n=t>=this.goalBufferLength_(),r=this.playlist_.segments;if(!r.length||i||n)return null;this.syncPoint_=this.syncPoint_||this.syncController_.getSyncPoint(this.playlist_,this.duration_(),this.currentTimeline_,this.currentTime_());t={partIndex:null,mediaIndex:null,startOfSegment:null,playlist:this.playlist_,isSyncRequest:Boolean(!this.syncPoint_)};t.isSyncRequest?t.mediaIndex=function(e,t,i){t=t||[];for(var n=[],r=0,a=0;a=r.length-1&&a&&!this.seeking_()?null:this.generateSegmentInfo_(t)},t.generateSegmentInfo_=function(e){var t=e.playlist,i=e.mediaIndex,n=e.startOfSegment,r=e.isSyncRequest,a=e.partIndex,s=e.forceTimestampOffset,o=e.getMediaInfoForTime,u=t.segments[i],e="number"==typeof a&&u.parts[a],o={requestId:"segment-loader-"+Math.random(),uri:e&&e.resolvedUri||u.resolvedUri,mediaIndex:i,partIndex:e?a:null,isSyncRequest:r,startOfSegment:n,playlist:t,bytes:null,encryptedBytes:null,timestampOffset:null,timeline:u.timeline,duration:e&&e.duration||u.duration,segment:u,part:e,byteLength:0,transmuxer:this.transmuxer_,getMediaInfoForTime:o},s="undefined"!=typeof s?s:this.isPendingTimestampOffset_;o.timestampOffset=this.timestampOffsetForSegment_({segmentTimeline:u.timeline,currentTimeline:this.currentTimeline_,startOfSegment:n,buffered:this.buffered_(),overrideCheck:s});s=Eo(this.sourceUpdater_.audioBuffered());return"number"==typeof s&&(o.audioAppendStart=s-this.sourceUpdater_.audioTimestampOffset()),this.sourceUpdater_.videoBuffered().length&&(o.gopsToAlignWith=function(e,t,i){if("undefined"==typeof t||null===t||!e.length)return[];for(var n=Math.ceil((t-i+3)*Gu),r=0;rn);r++);return e.slice(r)}(this.gopBuffer_,this.currentTime_()-this.sourceUpdater_.videoTimestampOffset(),this.timeMapping_)),o},t.timestampOffsetForSegment_=function(e){return i=(t=e).segmentTimeline,n=t.currentTimeline,r=t.startOfSegment,e=t.buffered,t.overrideCheck||i!==n?!(i "+p+" for "+e),t=m,i=v.vhs_.tech_,t[n=e]||(i.trigger({type:"usage",name:"vhs-608"}),i.trigger({type:"usage",name:"hls-608"}),/^cc708_/.test(r=n)&&(r="SERVICE"+n.split("_")[1]),(o=i.textTracks().getTrackById(r))?t[n]=o:(s=a=n,d=!1,(o=(i.options_.vhs&&i.options_.vhs.captionServices||{})[r])&&(a=o.label,s=o.language,d=o.default),t[n]=i.addRemoteTextTrack({kind:"captions",id:r,default:d,label:a,language:s},!1).track)),Bu(h,p,m[e]),l=(f={captionArray:f,inbandTextTracks:m,timestampOffset:g}).inbandTextTracks,m=f.captionArray,c=f.timestampOffset,m&&(u=_.WebKitDataCue||_.VTTCue,m.forEach(function(e){var t=e.stream;l[t].addCue(new u(e.startTime+c,e.endTime+c,e.text))}))}),this.transmuxer_&&this.transmuxer_.postMessage({action:"clearParsedMp4Captions"})):this.metadataQueue_.caption.push(this.handleCaptions_.bind(this,e,t)):this.logger_("SegmentLoader received no captions from a caption event"))},t.handleId3_=function(e,t,i){var n,r,a,s;this.earlyAbortWhenNeeded_(e.stats),this.checkForAbort_(e.requestId)||(this.pendingSegment_.hasAppendedData_?(n=null===this.sourceUpdater_.videoTimestampOffset()?this.sourceUpdater_.audioTimestampOffset():this.sourceUpdater_.videoTimestampOffset(),r=this.inbandTextTracks_,a=i,s=this.vhs_.tech_,r.metadataTrack_||(r.metadataTrack_=s.addRemoteTextTrack({kind:"metadata",label:"Timed Metadata"},!1).track,r.metadataTrack_.inBandMetadataTrackDispatchType=a),Uu({inbandTextTracks:this.inbandTextTracks_,metadataArray:t,timestampOffset:n,videoDuration:this.duration_()})):this.metadataQueue_.id3.push(this.handleId3_.bind(this,e,t,i)))},t.processMetadataQueue_=function(){this.metadataQueue_.id3.forEach(function(e){return e()}),this.metadataQueue_.caption.forEach(function(e){return e()}),this.metadataQueue_.id3=[],this.metadataQueue_.caption=[]},t.processCallQueue_=function(){var e=this.callQueue_;this.callQueue_=[],e.forEach(function(e){return e()})},t.processLoadQueue_=function(){var e=this.loadQueue_;this.loadQueue_=[],e.forEach(function(e){return e()})},t.hasEnoughInfoToLoad_=function(){if("audio"!==this.loaderType_)return!0;var e=this.pendingSegment_;return!!e&&(!this.getCurrentMediaInfo_()||!qu({timelineChangeController:this.timelineChangeController_,currentTimeline:this.currentTimeline_,segmentTimeline:e.timeline,loaderType:this.loaderType_,audioDisabled:this.audioDisabled_}))},t.getCurrentMediaInfo_=function(e){return(e=void 0===e?this.pendingSegment_:e)&&e.trackInfo||this.currentMediaInfo_},t.getMediaInfo_=function(e){return void 0===e&&(e=this.pendingSegment_),this.getCurrentMediaInfo_(e)||this.startingMediaInfo_},t.hasEnoughInfoToAppend_=function(){if(!this.sourceUpdater_.ready())return!1;if(this.waitingOnRemove_||this.quotaExceededErrorRetryTimeout_)return!1;var e=this.pendingSegment_,t=this.getCurrentMediaInfo_();if(!e||!t)return!1;var i=t.hasAudio,n=t.hasVideo,t=t.isMuxed;return!(n&&!e.videoTimingInfo)&&(!(i&&!this.audioDisabled_&&!t&&!e.audioTimingInfo)&&!qu({timelineChangeController:this.timelineChangeController_,currentTimeline:this.currentTimeline_,segmentTimeline:e.timeline,loaderType:this.loaderType_,audioDisabled:this.audioDisabled_}))},t.handleData_=function(e,t){if(this.earlyAbortWhenNeeded_(e.stats),!this.checkForAbort_(e.requestId))if(!this.callQueue_.length&&this.hasEnoughInfoToAppend_()){var i,n=this.pendingSegment_;if(this.setTimeMapping_(n.timeline),this.updateMediaSecondsLoaded_(n.segment),"closed"!==this.mediaSource_.readyState){if(e.map&&(e.map=this.initSegmentForMap(e.map,!0),n.segment.map=e.map),e.key&&this.segmentKey(e.key,!0),n.isFmp4=e.isFmp4,n.timingInfo=n.timingInfo||{},n.isFmp4?(this.trigger("fmp4"),n.timingInfo.start=n[Hu(t.type)].start):(i=this.getCurrentMediaInfo_(),(i="main"===this.loaderType_&&i&&i.hasVideo)&&(r=n.videoTimingInfo.start),n.timingInfo.start=this.trueSegmentStart_({currentStart:n.timingInfo.start,playlist:n.playlist,mediaIndex:n.mediaIndex,currentVideoTimestampOffset:this.sourceUpdater_.videoTimestampOffset(),useVideoTimingInfo:i,firstVideoFrameTimeForData:r,videoTimingInfo:n.videoTimingInfo,audioTimingInfo:n.audioTimingInfo})),this.updateAppendInitSegmentStatus(n,t.type),this.updateSourceBufferTimestampOffset_(n),n.isSyncRequest){this.updateTimingInfoEnd_(n),this.syncController_.saveSegmentTimingInfo({segmentInfo:n,shouldSaveTimelineMapping:"main"===this.loaderType_});var r=this.chooseNextRequest_();if(r.mediaIndex!==n.mediaIndex||r.partIndex!==n.partIndex)return void this.logger_("sync segment was incorrect, not appending");this.logger_("sync segment was correct, appending")}n.hasAppendedData_=!0,this.processMetadataQueue_(),this.appendData_(n,t)}}else this.callQueue_.push(this.handleData_.bind(this,e,t))},t.updateAppendInitSegmentStatus=function(e,t){"main"!==this.loaderType_||"number"!=typeof e.timestampOffset||e.changedTimestampOffset||(this.appendInitSegment_={audio:!0,video:!0}),this.playlistOfLastInitSegment_[t]!==e.playlist&&(this.appendInitSegment_[t]=!0)},t.getInitSegmentAndUpdateState_=function(e){var t=e.type,i=e.initSegment,n=e.map,r=e.playlist;if(n){e=iu(n);if(this.activeInitSegmentId_===e)return null;i=this.initSegmentForMap(n,!0).bytes,this.activeInitSegmentId_=e}return i&&this.appendInitSegment_[t]?(this.playlistOfLastInitSegment_[t]=r,this.appendInitSegment_[t]=!1,this.activeInitSegmentId_=null,i):null},t.handleQuotaExceededError_=function(e,t){var i=this,n=e.segmentInfo,r=e.type,a=e.bytes,s=this.sourceUpdater_.audioBuffered(),o=this.sourceUpdater_.videoBuffered();1=n);r++);return e.slice(0,r).concat(t)}(this.gopBuffer_,i.gopInfo,this.safeAppend_)),this.state="APPENDING",this.trigger("appending"),this.waitForAppendsToComplete_(e)}},t.setTimeMapping_=function(e){e=this.syncController_.mappingForTimeline(e);null!==e&&(this.timeMapping_=e)},t.updateMediaSecondsLoaded_=function(e){"number"==typeof e.start&&"number"==typeof e.end?this.mediaSecondsLoaded+=e.end-e.start:this.mediaSecondsLoaded+=e.duration},t.shouldUpdateTransmuxerTimestampOffset_=function(e){return null!==e&&("main"===this.loaderType_&&e!==this.sourceUpdater_.videoTimestampOffset()||!this.audioDisabled_&&e!==this.sourceUpdater_.audioTimestampOffset())},t.trueSegmentStart_=function(e){var t=e.currentStart,i=e.playlist,n=e.mediaIndex,r=e.firstVideoFrameTimeForData,a=e.currentVideoTimestampOffset,s=e.useVideoTimingInfo,o=e.videoTimingInfo,e=e.audioTimingInfo;if("undefined"!=typeof t)return t;if(!s)return e.start;i=i.segments[n-1];return 0!==n&&i&&"undefined"!=typeof i.start&&i.end===r+a?o.start:r},t.waitForAppendsToComplete_=function(e){var t=this.getCurrentMediaInfo_(e);if(!t)return this.error({message:"No starting media returned, likely due to an unsupported media format.",blacklistDuration:1/0}),void this.trigger("error");var i=t.hasAudio,n=t.hasVideo,t=t.isMuxed,n="main"===this.loaderType_&&n,t=!this.audioDisabled_&&i&&!t;if(e.waitingOnAppends=0,!e.hasAppendedData_)return e.timingInfo||"number"!=typeof e.timestampOffset||(this.isPendingTimestampOffset_=!0),e.timingInfo={start:0},e.waitingOnAppends++,this.isPendingTimestampOffset_||(this.updateSourceBufferTimestampOffset_(e),this.processMetadataQueue_()),void this.checkAppendsDone_(e);n&&e.waitingOnAppends++,t&&e.waitingOnAppends++,n&&this.sourceUpdater_.videoQueueCallback(this.checkAppendsDone_.bind(this,e)),t&&this.sourceUpdater_.audioQueueCallback(this.checkAppendsDone_.bind(this,e))},t.checkAppendsDone_=function(e){this.checkForAbort_(e.requestId)||(e.waitingOnAppends--,0===e.waitingOnAppends&&this.handleAppendsDone_())},t.checkForIllegalMediaSwitch=function(e){var t,i,e=(t=this.loaderType_,i=this.getCurrentMediaInfo_(),e=e,"main"===t&&i&&e?e.hasAudio||e.hasVideo?i.hasVideo&&!e.hasVideo?"Only audio found in segment when we expected video. We can't switch to audio only from a stream that had video. To get rid of this message, please add codec information to the manifest.":!i.hasVideo&&e.hasVideo?"Video found in segment when we expected only audio. We can't switch to a stream with video from an audio only stream. To get rid of this message, please add codec information to the manifest.":null:"Neither audio nor video found in segment.":null);return!!e&&(this.error({message:e,blacklistDuration:1/0}),this.trigger("error"),!0)},t.updateSourceBufferTimestampOffset_=function(e){var t;null===e.timestampOffset||"number"!=typeof e.timingInfo.start||e.changedTimestampOffset||"main"!==this.loaderType_||(t=!1,e.timestampOffset-=e.timingInfo.start,e.changedTimestampOffset=!0,e.timestampOffset!==this.sourceUpdater_.videoTimestampOffset()&&(this.sourceUpdater_.videoTimestampOffset(e.timestampOffset),t=!0),e.timestampOffset!==this.sourceUpdater_.audioTimestampOffset()&&(this.sourceUpdater_.audioTimestampOffset(e.timestampOffset),t=!0),t&&this.trigger("timestampoffset"))},t.updateTimingInfoEnd_=function(e){e.timingInfo=e.timingInfo||{};var t=this.getMediaInfo_(),t="main"===this.loaderType_&&t&&t.hasVideo&&e.videoTimingInfo?e.videoTimingInfo:e.audioTimingInfo;t&&(e.timingInfo.end="number"==typeof t.end?t.end:t.start+e.duration)},t.handleAppendsDone_=function(){if(this.pendingSegment_&&this.trigger("appendsdone"),!this.pendingSegment_)return this.state="READY",void(this.paused()||this.monitorBuffer_());var e=this.pendingSegment_;this.updateTimingInfoEnd_(e),this.shouldSaveSegmentTimingInfo_&&this.syncController_.saveSegmentTimingInfo({segmentInfo:e,shouldSaveTimelineMapping:"main"===this.loaderType_});var t=Wu(e,this.sourceType_);t&&("warn"===t.severity?ir.log.warn(t.message):this.logger_(t.message)),this.recordThroughput_(e),this.pendingSegment_=null,this.state="READY",!e.isSyncRequest||(this.trigger("syncinfoupdate"),e.hasAppendedData_)?(this.logger_("Appended "+ju(e)),this.addSegmentMetadataCue_(e),this.fetchAtBuffer_=!0,this.currentTimeline_!==e.timeline&&(this.timelineChangeController_.lastTimelineChange({type:this.loaderType_,from:this.currentTimeline_,to:e.timeline}),"main"!==this.loaderType_||this.audioDisabled_||this.timelineChangeController_.lastTimelineChange({type:"audio",from:this.currentTimeline_,to:e.timeline})),this.currentTimeline_=e.timeline,this.trigger("syncinfoupdate"),(t=e.segment).end&&this.currentTime_()-t.end>3*e.playlist.targetDuration?this.resetEverything():(null!==this.mediaIndex&&this.trigger("bandwidthupdate"),this.trigger("progress"),this.mediaIndex=e.mediaIndex,this.partIndex=e.partIndex,this.isEndOfStream_(e.mediaIndex,e.playlist,e.partIndex)&&this.endOfStream(),this.trigger("appended"),e.hasAppendedData_&&this.mediaAppends++,this.paused()||this.monitorBuffer_())):this.logger_("Throwing away un-appended sync request "+ju(e))},t.recordThroughput_=function(e){var t,i;e.duration<1/60?this.logger_("Ignoring segment's throughput because its duration of "+e.duration+" is less than the min to record "+1/60):(t=this.throughput.rate,i=Date.now()-e.endOfAllRequests+1,i=Math.floor(e.byteLength/i*8*1e3),this.throughput.rate+=(i-t)/++this.throughput.count)},t.addSegmentMetadataCue_=function(e){var t,i,n,r;this.segmentMetadataTrack_&&(i=(t=e.segment).start,r=t.end,Fu(i)&&Fu(r)&&(Bu(i,r,this.segmentMetadataTrack_),n=_.WebKitDataCue||_.VTTCue,e={custom:t.custom,dateTimeObject:t.dateTimeObject,dateTimeString:t.dateTimeString,bandwidth:e.playlist.attributes.BANDWIDTH,resolution:e.playlist.attributes.RESOLUTION,codecs:e.playlist.attributes.CODECS,byteLength:e.byteLength,uri:e.uri,timeline:e.timeline,playlist:e.playlist.id,start:i,end:r},(r=new n(i,r,JSON.stringify(e))).value=e,this.segmentMetadataTrack_.addCue(r)))},e}(ir.EventTarget);function ml(){}function gl(e){return"string"!=typeof e?e:e.replace(/./,function(e){return e.toUpperCase()})}function yl(e,t){var i=t[e+"Buffer"];return i&&i.updating||t.queuePending[e]}function vl(e,t){if(0!==t.queue.length){var i=0,n=t.queue[i];if("mediaSource"!==n.type){if("mediaSource"!==e&&t.ready()&&"closed"!==t.mediaSource.readyState&&!yl(e,t)){if(n.type!==e){if(null===(i=function(e,t){for(var i=0;i=e.playlist.segments.length){e=null;break}e=this.generateSegmentInfo_({playlist:e.playlist,mediaIndex:e.mediaIndex+1,startOfSegment:e.startOfSegment+e.duration,isSyncRequest:e.isSyncRequest})}return e},t.stopForError=function(e){this.error(e),this.state="READY",this.pause(),this.trigger("error")},t.segmentRequestFinished_=function(e,t,i){var n=this;if(this.subtitlesTrack_){if(this.saveTransferStats_(t.stats),!this.pendingSegment_)return this.state="READY",void(this.mediaRequestsAborted+=1);if(e)return e.code===cl&&this.handleTimeout_(),e.code===dl?this.mediaRequestsAborted+=1:this.mediaRequestsErrored+=1,void this.stopForError(e);var r=this.pendingSegment_;this.saveBandwidthRelatedStats_(r.duration,t.stats),this.state="APPENDING",this.trigger("appending");var a=r.segment;if(a.map&&(a.map.bytes=t.map.bytes),r.bytes=t.bytes,"function"!=typeof _.WebVTT&&this.subtitlesTrack_&&this.subtitlesTrack_.tech_){var s=function(){n.subtitlesTrack_.tech_.off("vttjsloaded",o),n.stopForError({message:"Error loading vtt.js"})},o=function(){n.subtitlesTrack_.tech_.off("vttjserror",s),n.segmentRequestFinished_(e,t,i)};return this.state="WAITING_ON_VTTJS",this.subtitlesTrack_.tech_.one("vttjsloaded",o),void this.subtitlesTrack_.tech_.one("vttjserror",s)}a.requested=!0;try{this.parseVTTCues_(r)}catch(e){return void this.stopForError({message:e.message})}if(this.updateTimeMapping_(r,this.syncController_.timelines[r.timeline],this.playlist_),r.cues.length?r.timingInfo={start:r.cues[0].startTime,end:r.cues[r.cues.length-1].endTime}:r.timingInfo={start:r.startOfSegment,end:r.startOfSegment+r.duration},r.isSyncRequest)return this.trigger("syncinfoupdate"),this.pendingSegment_=null,void(this.state="READY");r.byteLength=r.bytes.byteLength,this.mediaSecondsLoaded+=a.duration,r.cues.forEach(function(e){n.subtitlesTrack_.addCue(n.featuresNativeTextTracks_?new _.VTTCue(e.startTime,e.endTime,e.text):e)}),function(t){var e=t.cues;if(e)for(var i=0;iu)&&(r=void 0,r=o<0?i.start-Po({defaultDuration:t.targetDuration,durationList:t.segments,startIndex:e.mediaIndex,endIndex:a}):i.end+Po({defaultDuration:t.targetDuration,durationList:t.segments,startIndex:e.mediaIndex+1,endIndex:a}),this.discontinuities[s]={time:r,accuracy:u})}},t.dispose=function(){this.trigger("dispose"),this.off()},e}(ir.EventTarget),Xl=function(t){function e(){var e=t.call(this)||this;return e.pendingTimelineChanges_={},e.lastTimelineChanges_={},e}vt(e,t);var i=e.prototype;return i.clearPendingTimelineChange=function(e){this.pendingTimelineChanges_[e]=null,this.trigger("pendingtimelinechange")},i.pendingTimelineChange=function(e){var t=e.type,i=e.from,e=e.to;return"number"==typeof i&&"number"==typeof e&&(this.pendingTimelineChanges_[t]={type:t,from:i,to:e},this.trigger("pendingtimelinechange")),this.pendingTimelineChanges_[t]},i.lastTimelineChange=function(e){var t=e.type,i=e.from,e=e.to;return"number"==typeof i&&"number"==typeof e&&(this.lastTimelineChanges_[t]={type:t,from:i,to:e},delete this.pendingTimelineChanges_[t],this.trigger("timelinechange")),this.lastTimelineChanges_[t]},i.dispose=function(){this.trigger("dispose"),this.pendingTimelineChanges_={},this.lastTimelineChanges_={},this.off()},e}(ir.EventTarget),Kl=si(sr(K(function(){function e(e,t,i){return e(i={path:t,exports:{},require:function(e,t){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==t&&i.path)}},i.exports),i.exports}var t=e(function(e){function n(e,t){for(var i=0;i>7))^f]=f;for(e=t=0;!c[e];e^=i||1,t=p[t]||1)for(s=16843009*h[n=h[i=h[d[c[e]=r=(r=t^t<<1^t<<2^t<<3^t<<4)>>8^255&r^99]=e]]]^65537*n^257*i^16843008*e,a=257*h[r]^16843008*r,f=0;f<4;f++)u[f][e]=a=a<<24^a>>>8,l[f][r]=s=s<<24^s>>>8;for(f=0;f<5;f++)u[f]=u[f].slice(0),l[f]=l[f].slice(0);return o}(),this._tables=[[c[0][0].slice(),c[0][1].slice(),c[0][2].slice(),c[0][3].slice(),c[0][4].slice()],[c[1][0].slice(),c[1][1].slice(),c[1][2].slice(),c[1][3].slice(),c[1][4].slice()]];var r=this._tables[0][4],a=this._tables[1],s=e.length,o=1;if(4!==s&&6!==s&&8!==s)throw new Error("Invalid aes key size");var u=e.slice(0),l=[];for(this._key=[u,l],t=s;t<4*s+28;t++)n=u[t-1],(t%s==0||8===s&&t%s==4)&&(n=r[n>>>24]<<24^r[n>>16&255]<<16^r[n>>8&255]<<8^r[255&n],t%s==0&&(n=n<<8^n>>>24^o<<24,o=o<<1^283*(o>>7))),u[t]=u[t-s]^n;for(i=0;t;i++,t--)n=u[3&i?t:t-4],l[i]=t<=4||i<4?n:a[0][r[n>>>24]]^a[1][r[n>>16&255]]^a[2][r[n>>8&255]]^a[3][r[255&n]]}return e.prototype.decrypt=function(e,t,i,n,r,a){for(var s,o,u,l=this._key[1],c=e^l[0],d=n^l[1],h=i^l[2],p=t^l[3],f=l.length/4-2,m=4,t=this._tables[1],g=t[0],y=t[1],v=t[2],_=t[3],b=t[4],T=0;T>>24]^y[d>>16&255]^v[h>>8&255]^_[255&p]^l[m],o=g[d>>>24]^y[h>>16&255]^v[p>>8&255]^_[255&c]^l[m+1],u=g[h>>>24]^y[p>>16&255]^v[c>>8&255]^_[255&d]^l[m+2],p=g[p>>>24]^y[c>>16&255]^v[d>>8&255]^_[255&h]^l[m+3],m+=4,c=s,d=o,h=u;for(T=0;T<4;T++)r[(3&-T)+a]=b[c>>>24]<<24^b[d>>16&255]<<16^b[h>>8&255]<<8^b[255&p]^l[m++],s=c,c=d,d=h,h=p,p=s},e}(),l=function(t){function e(){var e=t.call(this,r)||this;return e.jobs=[],e.delay=1,e.timeout_=null,e}n(e,t);var i=e.prototype;return i.processJob_=function(){this.jobs.shift()(),this.jobs.length?this.timeout_=setTimeout(this.processJob_.bind(this),this.delay):this.timeout_=null},i.push=function(e){this.jobs.push(e),this.timeout_||(this.timeout_=setTimeout(this.processJob_.bind(this),this.delay))},e}(r),g=function(e){return e<<24|(65280&e)<<8|(16711680&e)>>8|e>>>24},a=function(){function u(e,t,i,n){var r=u.STEP,a=new Int32Array(e.buffer),s=new Uint8Array(e.byteLength),o=0;for(this.asyncStream_=new l,this.asyncStream_.push(this.decryptChunk_(a.subarray(o,o+r),t,i,s)),o=r;o>2),u=new m(Array.prototype.slice.call(t)),e=new Uint8Array(e.byteLength),l=new Int32Array(e.buffer),c=i[0],d=i[1],h=i[2],p=i[3],f=0;f "+n+" from "+t),this.tech_.trigger({type:"usage",name:"vhs-rendition-change-"+t})),this.masterPlaylistLoader_.media(e,i)},t.startABRTimer_=function(){var e=this;this.stopABRTimer_(),this.abrTimer_=_.setInterval(function(){return e.checkABR_()},250)},t.stopABRTimer_=function(){this.tech_.scrubbing&&this.tech_.scrubbing()||(_.clearInterval(this.abrTimer_),this.abrTimer_=null)},t.getAudioTrackPlaylists_=function(){var e=this.master(),t=e&&e.playlists||[];if(!e||!e.mediaGroups||!e.mediaGroups.AUDIO)return t;var i,n=e.mediaGroups.AUDIO,r=Object.keys(n);if(Object.keys(this.mediaTypes_.AUDIO.groups).length)i=this.mediaTypes_.AUDIO.activeTrack();else{var a,s=n.main||r.length&&n[r[0]];for(a in s)if(s[a].default){i={label:a};break}}if(!i)return t;var o,u=[];for(o in n)if(n[o][i.label]){var l=n[o][i.label];if(l.playlists&&l.playlists.length)u.push.apply(u,l.playlists);else if(l.uri)u.push(l);else if(e.playlists.length)for(var c=0;c "+i.id;if(!t)return u(l+" as current playlist is not set"),!0;if(i.id===t.id)return!1;if(!t.endList)return u(l+" as current playlist is live"),!0;e=o?rl.EXPERIMENTAL_MAX_BUFFER_LOW_WATER_LINE:rl.MAX_BUFFER_LOW_WATER_LINE;if(s= bufferLowWaterLine ("+n+" >= "+r+")";return o&&(r+=" and next bandwidth > current bandwidth ("+e+" > "+i+")"),u(r),!0}return u("not "+l+" as no switching criteria met"),!1}({currentPlaylist:t,nextPlaylist:e,forwardBuffer:i.length?i.end(i.length-1)-this.tech_.currentTime():0,bufferLowWaterLine:this.bufferLowWaterLine(),bufferHighWaterLine:this.bufferHighWaterLine(),duration:this.duration(),experimentalBufferBasedABR:this.experimentalBufferBasedABR,log:this.logger_})},t.setupSegmentLoaderListeners_=function(){var t=this;this.experimentalBufferBasedABR||(this.mainSegmentLoader_.on("bandwidthupdate",function(){var e=t.selectPlaylist();t.shouldSwitchToMedia_(e)&&t.switchMedia_(e,"bandwidthupdate"),t.tech_.trigger("bandwidthupdate")}),this.mainSegmentLoader_.on("progress",function(){t.trigger("progress")})),this.mainSegmentLoader_.on("error",function(){t.blacklistCurrentPlaylist(t.mainSegmentLoader_.error())}),this.mainSegmentLoader_.on("appenderror",function(){t.error=t.mainSegmentLoader_.error_,t.trigger("error")}),this.mainSegmentLoader_.on("syncinfoupdate",function(){t.onSyncInfoUpdate_()}),this.mainSegmentLoader_.on("timestampoffset",function(){t.tech_.trigger({type:"usage",name:"vhs-timestamp-offset"}),t.tech_.trigger({type:"usage",name:"hls-timestamp-offset"})}),this.audioSegmentLoader_.on("syncinfoupdate",function(){t.onSyncInfoUpdate_()}),this.audioSegmentLoader_.on("appenderror",function(){t.error=t.audioSegmentLoader_.error_,t.trigger("error")}),this.mainSegmentLoader_.on("ended",function(){t.logger_("main segment loader ended"),t.onEndOfStream()}),this.mainSegmentLoader_.on("earlyabort",function(e){t.experimentalBufferBasedABR||(t.delegateLoaders_("all",["abort"]),t.blacklistCurrentPlaylist({message:"Aborted early because there isn't enough bandwidth to complete the request without rebuffering."},120))});function e(){if(!t.sourceUpdater_.hasCreatedSourceBuffers())return t.tryToCreateSourceBuffers_();var e=t.getCodecsOrExclude_();e&&t.sourceUpdater_.addOrChangeSourceBuffers(e)}this.mainSegmentLoader_.on("trackinfo",e),this.audioSegmentLoader_.on("trackinfo",e),this.mainSegmentLoader_.on("fmp4",function(){t.triggeredFmp4Usage||(t.tech_.trigger({type:"usage",name:"vhs-fmp4"}),t.tech_.trigger({type:"usage",name:"hls-fmp4"}),t.triggeredFmp4Usage=!0)}),this.audioSegmentLoader_.on("fmp4",function(){t.triggeredFmp4Usage||(t.tech_.trigger({type:"usage",name:"vhs-fmp4"}),t.tech_.trigger({type:"usage",name:"hls-fmp4"}),t.triggeredFmp4Usage=!0)}),this.audioSegmentLoader_.on("ended",function(){t.logger_("audioSegmentLoader ended"),t.onEndOfStream()})},t.mediaSecondsLoaded_=function(){return Math.max(this.audioSegmentLoader_.mediaSecondsLoaded+this.mainSegmentLoader_.mediaSecondsLoaded)},t.load=function(){this.mainSegmentLoader_.load(),this.mediaTypes_.AUDIO.activePlaylistLoader&&this.audioSegmentLoader_.load(),this.mediaTypes_.SUBTITLES.activePlaylistLoader&&this.subtitleSegmentLoader_.load()},t.smoothQualityChange_=function(e){void 0===e&&(e=this.selectPlaylist()),this.fastQualityChange_(e)},t.fastQualityChange_=function(e){var t=this;(e=void 0===e?this.selectPlaylist():e)!==this.masterPlaylistLoader_.media()?(this.switchMedia_(e,"fast-quality"),this.mainSegmentLoader_.resetEverything(function(){ir.browser.IE_VERSION||ir.browser.IS_EDGE?t.tech_.setCurrentTime(t.tech_.currentTime()+.04):t.tech_.setCurrentTime(t.tech_.currentTime())})):this.logger_("skipping fastQualityChange because new media is same as old")},t.play=function(){if(!this.setupFirstPlay()){this.tech_.ended()&&this.tech_.setCurrentTime(0),this.hasPlayed_&&this.load();var e=this.tech_.seekable();return this.tech_.duration()===1/0&&this.tech_.currentTime()this.maxPlaylistRetries?1/0:Date.now()+1e3*t,i.excludeUntil=a,e.reason&&(i.lastExcludeReason_=e.reason),this.tech_.trigger("blacklistplaylist"),this.tech_.trigger({type:"usage",name:"vhs-rendition-blacklisted"}),this.tech_.trigger({type:"usage",name:"hls-rendition-blacklisted"});r=this.selectPlaylist();if(!r)return this.error="Playback cannot continue. No available working or supported playlists.",void this.trigger("error");t=e.internal?this.logger_:ir.log.warn,a=e.message?" "+e.message:"";t((e.internal?"Internal problem":"Problem")+" encountered with playlist "+i.id+"."+a+" Switching to playlist "+r.id+"."),r.attributes.AUDIO!==i.attributes.AUDIO&&this.delegateLoaders_("audio",["abort","pause"]),r.attributes.SUBTITLES!==i.attributes.SUBTITLES&&this.delegateLoaders_("subtitle",["abort","pause"]),this.delegateLoaders_("main",["abort","pause"]);a=r.targetDuration/2*1e3||5e3,a="number"==typeof r.lastRequest&&Date.now()-r.lastRequest<=a;return this.switchMedia_(r,"exclude",s||a)},t.pauseLoading=function(){this.delegateLoaders_("all",["abort","pause"]),this.stopABRTimer_()},t.delegateLoaders_=function(i,e){var n=this,r=[],t="all"===i;!t&&"main"!==i||r.push(this.masterPlaylistLoader_);var a=[];!t&&"audio"!==i||a.push("AUDIO"),!t&&"subtitle"!==i||(a.push("CLOSED-CAPTIONS"),a.push("SUBTITLES")),a.forEach(function(e){e=n.mediaTypes_[e]&&n.mediaTypes_[e].activePlaylistLoader;e&&r.push(e)}),["main","audio","subtitle"].forEach(function(e){var t=n[e+"SegmentLoader_"];!t||i!==e&&"all"!==i||r.push(t)}),r.forEach(function(t){return e.forEach(function(e){"function"==typeof t[e]&&t[e]()})})},t.setCurrentTime=function(e){var t=_o(this.tech_.buffered(),e);return this.masterPlaylistLoader_&&this.masterPlaylistLoader_.media()&&this.masterPlaylistLoader_.media().segments?t&&t.length?e:(this.mainSegmentLoader_.resetEverything(),this.mainSegmentLoader_.abort(),this.mediaTypes_.AUDIO.activePlaylistLoader&&(this.audioSegmentLoader_.resetEverything(),this.audioSegmentLoader_.abort()),this.mediaTypes_.SUBTITLES.activePlaylistLoader&&(this.subtitleSegmentLoader_.resetEverything(),this.subtitleSegmentLoader_.abort()),void this.load()):0},t.duration=function(){if(!this.masterPlaylistLoader_)return 0;var e=this.masterPlaylistLoader_.media();return e?e.endList?this.mediaSource?this.mediaSource.duration:Pl.Playlist.duration(e):1/0:0},t.seekable=function(){return this.seekable_},t.onSyncInfoUpdate_=function(){var e;if(this.masterPlaylistLoader_){var t=this.masterPlaylistLoader_.media();if(t){var i=this.syncController_.getExpiredTime(t,this.duration());if(null!==i){var n,r,a=this.masterPlaylistLoader_.master,s=Pl.Playlist.seekable(t,i,Pl.Playlist.liveEdgeDelay(a,t));if(0!==s.length){if(this.mediaTypes_.AUDIO.activePlaylistLoader){if(t=this.mediaTypes_.AUDIO.activePlaylistLoader.media(),null===(i=this.syncController_.getExpiredTime(t,this.duration())))return;if(0===(e=Pl.Playlist.seekable(t,i,Pl.Playlist.liveEdgeDelay(a,t))).length)return}this.seekable_&&this.seekable_.length&&(n=this.seekable_.end(0),r=this.seekable_.start(0)),!e||e.start(0)>s.end(0)||s.start(0)>e.end(0)?this.seekable_=s:this.seekable_=ir.createTimeRanges([[(e.start(0)>s.start(0)?e:s).start(0),(e.end(0) "'+a[e]+'"')}),u.length)return void this.blacklistCurrentPlaylist({playlist:this.media(),message:"Codec switching not supported: "+u.join(", ")+".",blacklistDuration:1/0,internal:!0})}return a}t=Object.keys(o).reduce(function(e,t){return e&&(e+=", "),e+=t+' does not support codec(s): "'+o[t].join(",")+'"'},"")+".";this.blacklistCurrentPlaylist({playlist:this.media(),internal:!0,message:t,blacklistDuration:1/0})}else this.blacklistCurrentPlaylist({playlist:this.media(),message:"Could not determine codecs for playlist.",blacklistDuration:1/0})},t.tryToCreateSourceBuffers_=function(){var e;"open"!==this.mediaSource.readyState||this.sourceUpdater_.hasCreatedSourceBuffers()||!this.areMediaTypesKnown_()||(e=this.getCodecsOrExclude_())&&(this.sourceUpdater_.createSourceBuffers(e),e=[e.video,e.audio].filter(Boolean).join(","),this.excludeIncompatibleVariants_(e))},t.excludeUnsupportedVariants_=function(){var n=this,r=this.master().playlists,a=[];Object.keys(r).forEach(function(e){var t,i=r[e];-1===a.indexOf(i.id)&&(a.push(i.id),t=[],!(e=Lu(n.master,i)).audio||vr(e.audio)||yr(e.audio)||t.push("audio codec "+e.audio),!e.video||vr(e.video)||yr(e.video)||t.push("video codec "+e.video),e.text&&"stpp.ttml.im1t"===e.text&&t.push("text codec "+e.text),t.length&&(i.excludeUntil=1/0,n.logger_("excluding "+i.id+" for unsupported: "+t.join(", "))))})},t.excludeIncompatibleVariants_=function(e){var r=this,a=[],s=this.master().playlists,e=Au(fr(e)),o=Pu(e),u=e.video&&fr(e.video)[0]||null,l=e.audio&&fr(e.audio)[0]||null;Object.keys(s).forEach(function(e){var t,i,n=s[e];-1===a.indexOf(n.id)&&n.excludeUntil!==1/0&&(a.push(n.id),t=[],i=Lu(r.masterPlaylistLoader_.master,n),e=Pu(i),(i.audio||i.video)&&(e!==o&&t.push('codec count "'+e+'" !== "'+o+'"'),r.sourceUpdater_.canChangeType()||(e=i.video&&fr(i.video)[0]||null,i=i.audio&&fr(i.audio)[0]||null,e&&u&&e.type.toLowerCase()!==u.type.toLowerCase()&&t.push('video codec "'+e.type+'" !== "'+u.type+'"'),i&&l&&i.type.toLowerCase()!==l.type.toLowerCase()&&t.push('audio codec "'+i.type+'" !== "'+l.type+'"')),t.length&&(n.excludeUntil=1/0,r.logger_("blacklisting "+n.id+": "+t.join(" && ")))))})},t.updateAdCues_=function(e){var t=0,i=this.seekable();i.length&&(t=i.start(0)),function(e,t,i){if(void 0===i&&(i=0),e.segments)for(var n=i,r=0;r=r.adStartTime&&t<=r.adEndTime)return r}return null}(t,n+u.duration/2)){if("cueIn"in u){o.endTime=n,o.adEndTime=n,n+=u.duration,o=null;continue}if(n=t.end(t.length-1)))return this.techWaiting_();5<=this.consecutiveUpdates&&e===this.lastRecordedTime?(this.consecutiveUpdates++,this.waiting_()):e===this.lastRecordedTime?this.consecutiveUpdates++:(this.consecutiveUpdates=0,this.lastRecordedTime=e)}},t.cancelTimer_=function(){this.consecutiveUpdates=0,this.timer_&&(this.logger_("cancelTimer_"),clearTimeout(this.timer_)),this.timer_=null},t.fixesBadSeeks_=function(){if(!this.tech_.seeking())return!1;var e,t=this.seekable(),i=this.tech_.currentTime();if(this.afterSeekableWindow_(t,i,this.media(),this.allowSeeksWithinUnsafeLiveWindow)&&(e=t.end(t.length-1)),"undefined"!=typeof(e=this.beforeSeekableWindow_(t,i)?(r=t.start(0))+(r===t.end(0)?0:.1):e))return this.logger_("Trying to seek outside of seekable at time "+i+" with seekable range "+To(t)+". Seeking to "+e+"."),this.tech_.setCurrentTime(e),!0;var n,r,a=this.tech_.buffered();return n={buffered:a,targetDuration:this.media().targetDuration,currentTime:i},r=n.buffered,t=n.targetDuration,n=n.currentTime,!(!r.length||r.end(0)-r.start(0)<2*t||n>r.start(0))&&r.start(0)-n "+t.end(0)+"]. Attempting to resume playback by seeking to the current time."),this.tech_.trigger({type:"usage",name:"vhs-unknown-waiting"}),this.tech_.trigger({type:"usage",name:"hls-unknown-waiting"})))},t.techWaiting_=function(){var e=this.seekable(),t=this.tech_.currentTime();if(this.tech_.seeking()&&this.fixesBadSeeks_())return!0;if(this.tech_.seeking()||null!==this.timer_)return!0;if(this.beforeSeekableWindow_(e,t)){var i=e.end(e.length-1);return this.logger_("Fell out of live window at time "+t+". Seeking to live point (seekable end) "+i),this.cancelTimer_(),this.tech_.setCurrentTime(i),this.tech_.trigger({type:"usage",name:"vhs-live-resync"}),this.tech_.trigger({type:"usage",name:"hls-live-resync"}),!0}e=this.tech_.vhs.masterPlaylistController_.sourceUpdater_,i=this.tech_.buffered();if(this.videoUnderflow_({audioBuffered:e.audioBuffered(),videoBuffered:e.videoBuffered(),currentTime:t}))return this.cancelTimer_(),this.tech_.setCurrentTime(t),this.tech_.trigger({type:"usage",name:"vhs-video-underflow"}),this.tech_.trigger({type:"usage",name:"hls-video-underflow"}),!0;e=bo(i,t);if(0 - * Copyright Brightcove, Inc. - * Available under Apache License Version 2.0 - * - * - * Includes vtt.js - * Available under Apache License Version 2.0 - * - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.videojs = factory()); -}(this, (function () { - - var version = "6.4.0"; - - var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - - - function createCommonjsModule(fn, module) { - return module = {exports: {}}, fn(module, module.exports), module.exports; - } - - var win; - - if (typeof window !== "undefined") { - win = window; - } else if (typeof commonjsGlobal !== "undefined") { - win = commonjsGlobal; - } else if (typeof self !== "undefined") { - win = self; - } else { - win = {}; - } - - var window_1 = win; - - var empty = {}; - - - var empty$1 = (Object.freeze || Object)({ - 'default': empty - }); - - var minDoc = (empty$1 && empty) || empty$1; - - var topLevel = typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : - typeof window !== 'undefined' ? window : {}; - - - var doccy; - - if (typeof document !== 'undefined') { - doccy = document; - } else { - doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4']; - - if (!doccy) { - doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc; - } - } - - var document_1 = doccy; - - /** - * @file browser.js - * @module browser - */ - var USER_AGENT = window_1.navigator && window_1.navigator.userAgent || ''; - var webkitVersionMap = /AppleWebKit\/([\d.]+)/i.exec(USER_AGENT); - var appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null; - - /* - * Device is an iPhone - * - * @type {Boolean} - * @constant - * @private - */ - var IS_IPAD = /iPad/i.test(USER_AGENT); - -// The Facebook app's UIWebView identifies as both an iPhone and iPad, so -// to identify iPhones, we need to exclude iPads. -// http://artsy.github.io/blog/2012/10/18/the-perils-of-ios-user-agent-sniffing/ - var IS_IPHONE = /iPhone/i.test(USER_AGENT) && !IS_IPAD; - var IS_IPOD = /iPod/i.test(USER_AGENT); - var IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD; - - var IOS_VERSION = function () { - var match = USER_AGENT.match(/OS (\d+)_/i); - - if (match && match[1]) { - return match[1]; - } - return null; - }(); - - var IS_ANDROID = /Android/i.test(USER_AGENT); - var ANDROID_VERSION = function () { - // This matches Android Major.Minor.Patch versions - // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned - var match = USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i); - - if (!match) { - return null; - } - - var major = match[1] && parseFloat(match[1]); - var minor = match[2] && parseFloat(match[2]); - - if (major && minor) { - return parseFloat(match[1] + '.' + match[2]); - } else if (major) { - return major; - } - return null; - }(); - -// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser - var IS_OLD_ANDROID = IS_ANDROID && /webkit/i.test(USER_AGENT) && ANDROID_VERSION < 2.3; - var IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537; - - var IS_FIREFOX = /Firefox/i.test(USER_AGENT); - var IS_EDGE = /Edge/i.test(USER_AGENT); - var IS_CHROME = !IS_EDGE && /Chrome/i.test(USER_AGENT); - var CHROME_VERSION = function () { - var match = USER_AGENT.match(/Chrome\/(\d+)/); - - if (match && match[1]) { - return parseFloat(match[1]); - } - return null; - }(); - var IS_IE8 = /MSIE\s8\.0/.test(USER_AGENT); - var IE_VERSION = function () { - var result = /MSIE\s(\d+)\.\d/.exec(USER_AGENT); - var version = result && parseFloat(result[1]); - - if (!version && /Trident\/7.0/i.test(USER_AGENT) && /rv:11.0/.test(USER_AGENT)) { - // IE 11 has a different user agent string than other IE versions - version = 11.0; - } - - return version; - }(); - - var IS_SAFARI = /Safari/i.test(USER_AGENT) && !IS_CHROME && !IS_ANDROID && !IS_EDGE; - var IS_ANY_SAFARI = IS_SAFARI || IS_IOS; - - var TOUCH_ENABLED = isReal() && ('ontouchstart' in window_1 || window_1.DocumentTouch && window_1.document instanceof window_1.DocumentTouch); - - var BACKGROUND_SIZE_SUPPORTED = isReal() && 'backgroundSize' in window_1.document.createElement('video').style; - - var browser = (Object.freeze || Object)({ - IS_IPAD: IS_IPAD, - IS_IPHONE: IS_IPHONE, - IS_IPOD: IS_IPOD, - IS_IOS: IS_IOS, - IOS_VERSION: IOS_VERSION, - IS_ANDROID: IS_ANDROID, - ANDROID_VERSION: ANDROID_VERSION, - IS_OLD_ANDROID: IS_OLD_ANDROID, - IS_NATIVE_ANDROID: IS_NATIVE_ANDROID, - IS_FIREFOX: IS_FIREFOX, - IS_EDGE: IS_EDGE, - IS_CHROME: IS_CHROME, - CHROME_VERSION: CHROME_VERSION, - IS_IE8: IS_IE8, - IE_VERSION: IE_VERSION, - IS_SAFARI: IS_SAFARI, - IS_ANY_SAFARI: IS_ANY_SAFARI, - TOUCH_ENABLED: TOUCH_ENABLED, - BACKGROUND_SIZE_SUPPORTED: BACKGROUND_SIZE_SUPPORTED - }); - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - - - var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - }; - - - var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; - }; - - - var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; - }; - - - var taggedTemplateLiteralLoose = function (strings, raw) { - strings.raw = raw; - return strings; - }; - - /** - * @file obj.js - * @module obj - */ - - /** - * @callback obj:EachCallback - * - * @param {Mixed} value - * The current key for the object that is being iterated over. - * - * @param {string} key - * The current key-value for object that is being iterated over - */ - - /** - * @callback obj:ReduceCallback - * - * @param {Mixed} accum - * The value that is accumulating over the reduce loop. - * - * @param {Mixed} value - * The current key for the object that is being iterated over. - * - * @param {string} key - * The current key-value for object that is being iterated over - * - * @return {Mixed} - * The new accumulated value. - */ - var toString = Object.prototype.toString; - - /** - * Get the keys of an Object - * - * @param {Object} - * The Object to get the keys from - * - * @return {string[]} - * An array of the keys from the object. Returns an empty array if the - * object passed in was invalid or had no keys. - * - * @private - */ - var keys = function keys(object) { - return isObject(object) ? Object.keys(object) : []; - }; - - /** - * Array-like iteration for objects. - * - * @param {Object} object - * The object to iterate over - * - * @param {obj:EachCallback} fn - * The callback function which is called for each key in the object. - */ - function each(object, fn) { - keys(object).forEach(function (key) { - return fn(object[key], key); - }); - } - - /** - * Array-like reduce for objects. - * - * @param {Object} object - * The Object that you want to reduce. - * - * @param {Function} fn - * A callback function which is called for each key in the object. It - * receives the accumulated value and the per-iteration value and key - * as arguments. - * - * @param {Mixed} [initial = 0] - * Starting value - * - * @return {Mixed} - * The final accumulated value. - */ - function reduce(object, fn) { - var initial = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; - - return keys(object).reduce(function (accum, key) { - return fn(accum, object[key], key); - }, initial); - } - - /** - * Object.assign-style object shallow merge/extend. - * - * @param {Object} target - * @param {Object} ...sources - * @return {Object} - */ - function assign(target) { - for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - sources[_key - 1] = arguments[_key]; - } - - if (Object.assign) { - return Object.assign.apply(Object, [target].concat(sources)); - } - - sources.forEach(function (source) { - if (!source) { - return; - } - - each(source, function (value, key) { - target[key] = value; - }); - }); - - return target; - } - - /** - * Returns whether a value is an object of any kind - including DOM nodes, - * arrays, regular expressions, etc. Not functions, though. - * - * This avoids the gotcha where using `typeof` on a `null` value - * results in `'object'`. - * - * @param {Object} value - * @return {Boolean} - */ - function isObject(value) { - return !!value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object'; - } - - /** - * Returns whether an object appears to be a "plain" object - that is, a - * direct instance of `Object`. - * - * @param {Object} value - * @return {Boolean} - */ - function isPlain(value) { - return isObject(value) && toString.call(value) === '[object Object]' && value.constructor === Object; - } - - /** - * @file log.js - * @module log - */ - var log = void 0; - -// This is the private tracking variable for logging level. - var level = 'all'; - -// This is the private tracking variable for the logging history. - var history = []; - - /** - * Log messages to the console and history based on the type of message - * - * @private - * @param {string} type - * The name of the console method to use. - * - * @param {Array} args - * The arguments to be passed to the matching console method. - * - * @param {boolean} [stringify] - * By default, only old IEs should get console argument stringification, - * but this is exposed as a parameter to facilitate testing. - */ - var logByType = function logByType(type, args) { - var stringify = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : !!IE_VERSION && IE_VERSION < 11; - - var lvl = log.levels[level]; - var lvlRegExp = new RegExp('^(' + lvl + ')$'); - - if (type !== 'log') { - - // Add the type to the front of the message when it's not "log". - args.unshift(type.toUpperCase() + ':'); - } - - // Add a clone of the args at this point to history. - if (history) { - history.push([].concat(args)); - } - - // Add console prefix after adding to history. - args.unshift('VIDEOJS:'); - - // If there's no console then don't try to output messages, but they will - // still be stored in history. - // - // Was setting these once outside of this function, but containing them - // in the function makes it easier to test cases where console doesn't exist - // when the module is executed. - var fn = window_1.console && window_1.console[type]; - - // Bail out if there's no console or if this type is not allowed by the - // current logging level. - if (!fn || !lvl || !lvlRegExp.test(type)) { - return; - } - - // IEs previous to 11 log objects uselessly as "[object Object]"; so, JSONify - // objects and arrays for those less-capable browsers. - if (stringify) { - args = args.map(function (a) { - if (isObject(a) || Array.isArray(a)) { - try { - return JSON.stringify(a); - } catch (x) { - return String(a); - } - } - - // Cast to string before joining, so we get null and undefined explicitly - // included in output (as we would in a modern console). - return String(a); - }).join(' '); - } - - // Old IE versions do not allow .apply() for console methods (they are - // reported as objects rather than functions). - if (!fn.apply) { - fn(args); - } else { - fn[Array.isArray(args) ? 'apply' : 'call'](window_1.console, args); - } - }; - - /** - * Logs plain debug messages. Similar to `console.log`. - * - * @class - * @param {Mixed[]} args - * One or more messages or objects that should be logged. - */ - log = function log() { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - logByType('log', args); - }; - - /** - * Enumeration of available logging levels, where the keys are the level names - * and the values are `|`-separated strings containing logging methods allowed - * in that logging level. These strings are used to create a regular expression - * matching the function name being called. - * - * Levels provided by video.js are: - * - * - `off`: Matches no calls. Any value that can be cast to `false` will have - * this effect. The most restrictive. - * - `all` (default): Matches only Video.js-provided functions (`log`, - * `log.warn`, and `log.error`). - * - `warn`: Matches `log.warn` and `log.error` calls. - * - `error`: Matches only `log.error` calls. - * - * @type {Object} - */ - log.levels = { - all: 'log|warn|error', - error: 'error', - off: '', - warn: 'warn|error', - DEFAULT: level - }; - - /** - * Get or set the current logging level. If a string matching a key from - * {@link log.levels} is provided, acts as a setter. Regardless of argument, - * returns the current logging level. - * - * @param {string} [lvl] - * Pass to set a new logging level. - * - * @return {string} - * The current logging level. - */ - log.level = function (lvl) { - if (typeof lvl === 'string') { - if (!log.levels.hasOwnProperty(lvl)) { - throw new Error('"' + lvl + '" in not a valid log level'); - } - level = lvl; - } - return level; - }; - - /** - * Returns an array containing everything that has been logged to the history. - * - * This array is a shallow clone of the internal history record. However, its - * contents are _not_ cloned; so, mutating objects inside this array will - * mutate them in history. - * - * @return {Array} - */ - log.history = function () { - return history ? [].concat(history) : []; - }; - - /** - * Clears the internal history tracking, but does not prevent further history - * tracking. - */ - log.history.clear = function () { - if (history) { - history.length = 0; - } - }; - - /** - * Disable history tracking if it is currently enabled. - */ - log.history.disable = function () { - if (history !== null) { - history.length = 0; - history = null; - } - }; - - /** - * Enable history tracking if it is currently disabled. - */ - log.history.enable = function () { - if (history === null) { - history = []; - } - }; - - /** - * Logs error messages. Similar to `console.error`. - * - * @param {Mixed[]} args - * One or more messages or objects that should be logged as an error - */ - log.error = function () { - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - return logByType('error', args); - }; - - /** - * Logs warning messages. Similar to `console.warn`. - * - * @param {Mixed[]} args - * One or more messages or objects that should be logged as a warning. - */ - log.warn = function () { - for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - - return logByType('warn', args); - }; - - var log$1 = log; - - function clean(s) { - return s.replace(/\n\r?\s*/g, '') - } - - - var tsml = function tsml(sa) { - var s = '' - , i = 0; - - for (; i < arguments.length; i++) - s += clean(sa[i]) + (arguments[i + 1] || ''); - - return s - }; - - /** - * @file computed-style.js - * @module computed-style - */ - /** - * A safe getComputedStyle with an IE8 fallback. - * - * This is needed because in Firefox, if the player is loaded in an iframe with - * `display:none`, then `getComputedStyle` returns `null`, so, we do a null-check to - * make sure that the player doesn't break in these cases. - * - * @param {Element} el - * The element you want the computed style of - * - * @param {string} prop - * The property name you want - * - * @see https://bugzilla.mozilla.org/show_bug.cgi?id=548397 - * - * @static - * @const - */ - function computedStyle(el, prop) { - if (!el || !prop) { - return ''; - } - - if (typeof window_1.getComputedStyle === 'function') { - var cs = window_1.getComputedStyle(el); - - return cs ? cs[prop] : ''; - } - - return el.currentStyle[prop] || ''; - } - - var _templateObject = taggedTemplateLiteralLoose(['Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set ', ' to ', '.'], ['Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set ', ' to ', '.']); - - /** - * @file dom.js - * @module dom - */ - /** - * Detect if a value is a string with any non-whitespace characters. - * - * @param {string} str - * The string to check - * - * @return {boolean} - * - True if the string is non-blank - * - False otherwise - * - */ - function isNonBlankString(str) { - return typeof str === 'string' && /\S/.test(str); - } - - /** - * Throws an error if the passed string has whitespace. This is used by - * class methods to be relatively consistent with the classList API. - * - * @param {string} str - * The string to check for whitespace. - * - * @throws {Error} - * Throws an error if there is whitespace in the string. - * - */ - function throwIfWhitespace(str) { - if (/\s/.test(str)) { - throw new Error('class has illegal whitespace characters'); - } - } - - /** - * Produce a regular expression for matching a className within an elements className. - * - * @param {string} className - * The className to generate the RegExp for. - * - * @return {RegExp} - * The RegExp that will check for a specific `className` in an elements - * className. - */ - function classRegExp(className) { - return new RegExp('(^|\\s)' + className + '($|\\s)'); - } - - /** - * Whether the current DOM interface appears to be real. - * - * @return {Boolean} - */ - function isReal() { - return ( - - // Both document and window will never be undefined thanks to `global`. - document_1 === window_1.document && - - // In IE < 9, DOM methods return "object" as their type, so all we can - // confidently check is that it exists. - typeof document_1.createElement !== 'undefined' - ); - } - - /** - * Determines, via duck typing, whether or not a value is a DOM element. - * - * @param {Mixed} value - * The thing to check - * - * @return {boolean} - * - True if it is a DOM element - * - False otherwise - */ - function isEl(value) { - return isObject(value) && value.nodeType === 1; - } - - /** - * Determines if the current DOM is embedded in an iframe. - * - * @return {boolean} - * - */ - function isInFrame() { - - // We need a try/catch here because Safari will throw errors when attempting - // to get either `parent` or `self` - try { - return window_1.parent !== window_1.self; - } catch (x) { - return true; - } - } - - /** - * Creates functions to query the DOM using a given method. - * - * @param {string} method - * The method to create the query with. - * - * @return {Function} - * The query method - */ - function createQuerier(method) { - return function (selector, context) { - if (!isNonBlankString(selector)) { - return document_1[method](null); - } - if (isNonBlankString(context)) { - context = document_1.querySelector(context); - } - - var ctx = isEl(context) ? context : document_1; - - return ctx[method] && ctx[method](selector); - }; - } - - /** - * Creates an element and applies properties. - * - * @param {string} [tagName='div'] - * Name of tag to be created. - * - * @param {Object} [properties={}] - * Element properties to be applied. - * - * @param {Object} [attributes={}] - * Element attributes to be applied. - * - * @param {String|Element|TextNode|Array|Function} [content] - * Contents for the element (see: {@link dom:normalizeContent}) - * - * @return {Element} - * The element that was created. - */ - function createEl() { - var tagName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'div'; - var properties = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var content = arguments[3]; - - var el = document_1.createElement(tagName); - - Object.getOwnPropertyNames(properties).forEach(function (propName) { - var val = properties[propName]; - - // See #2176 - // We originally were accepting both properties and attributes in the - // same object, but that doesn't work so well. - if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') { - log$1.warn(tsml(_templateObject, propName, val)); - el.setAttribute(propName, val); - - // Handle textContent since it's not supported everywhere and we have a - // method for it. - } else if (propName === 'textContent') { - textContent(el, val); - } else { - el[propName] = val; - } - }); - - Object.getOwnPropertyNames(attributes).forEach(function (attrName) { - el.setAttribute(attrName, attributes[attrName]); - }); - - if (content) { - appendContent(el, content); - } - - return el; - } - - /** - * Injects text into an element, replacing any existing contents entirely. - * - * @param {Element} el - * The element to add text content into - * - * @param {string} text - * The text content to add. - * - * @return {Element} - * The element with added text content. - */ - function textContent(el, text) { - if (typeof el.textContent === 'undefined') { - el.innerText = text; - } else { - el.textContent = text; - } - return el; - } - - /** - * Insert an element as the first child node of another - * - * @param {Element} child - * Element to insert - * - * @param {Element} parent - * Element to insert child into - */ - function prependTo(child, parent) { - if (parent.firstChild) { - parent.insertBefore(child, parent.firstChild); - } else { - parent.appendChild(child); - } - } - - /** - * Check if an element has a CSS class - * - * @param {Element} element - * Element to check - * - * @param {string} classToCheck - * Class name to check for - * - * @return {boolean} - * - True if the element had the class - * - False otherwise. - * - * @throws {Error} - * Throws an error if `classToCheck` has white space. - */ - function hasClass(element, classToCheck) { - throwIfWhitespace(classToCheck); - if (element.classList) { - return element.classList.contains(classToCheck); - } - return classRegExp(classToCheck).test(element.className); - } - - /** - * Add a CSS class name to an element - * - * @param {Element} element - * Element to add class name to. - * - * @param {string} classToAdd - * Class name to add. - * - * @return {Element} - * The dom element with the added class name. - */ - function addClass(element, classToAdd) { - if (element.classList) { - element.classList.add(classToAdd); - - // Don't need to `throwIfWhitespace` here because `hasElClass` will do it - // in the case of classList not being supported. - } else if (!hasClass(element, classToAdd)) { - element.className = (element.className + ' ' + classToAdd).trim(); - } - - return element; - } - - /** - * Remove a CSS class name from an element - * - * @param {Element} element - * Element to remove a class name from. - * - * @param {string} classToRemove - * Class name to remove - * - * @return {Element} - * The dom element with class name removed. - */ - function removeClass(element, classToRemove) { - if (element.classList) { - element.classList.remove(classToRemove); - } else { - throwIfWhitespace(classToRemove); - element.className = element.className.split(/\s+/).filter(function (c) { - return c !== classToRemove; - }).join(' '); - } - - return element; - } - - /** - * The callback definition for toggleElClass. - * - * @callback Dom~PredicateCallback - * @param {Element} element - * The DOM element of the Component. - * - * @param {string} classToToggle - * The `className` that wants to be toggled - * - * @return {boolean|undefined} - * - If true the `classToToggle` will get added to `element`. - * - If false the `classToToggle` will get removed from `element`. - * - If undefined this callback will be ignored - */ - - /** - * Adds or removes a CSS class name on an element depending on an optional - * condition or the presence/absence of the class name. - * - * @param {Element} element - * The element to toggle a class name on. - * - * @param {string} classToToggle - * The class that should be toggled - * - * @param {boolean|PredicateCallback} [predicate] - * See the return value for {@link Dom~PredicateCallback} - * - * @return {Element} - * The element with a class that has been toggled. - */ - function toggleClass(element, classToToggle, predicate) { - - // This CANNOT use `classList` internally because IE does not support the - // second parameter to the `classList.toggle()` method! Which is fine because - // `classList` will be used by the add/remove functions. - var has = hasClass(element, classToToggle); - - if (typeof predicate === 'function') { - predicate = predicate(element, classToToggle); - } - - if (typeof predicate !== 'boolean') { - predicate = !has; - } - - // If the necessary class operation matches the current state of the - // element, no action is required. - if (predicate === has) { - return; - } - - if (predicate) { - addClass(element, classToToggle); - } else { - removeClass(element, classToToggle); - } - - return element; - } - - /** - * Apply attributes to an HTML element. - * - * @param {Element} el - * Element to add attributes to. - * - * @param {Object} [attributes] - * Attributes to be applied. - */ - function setAttributes(el, attributes) { - Object.getOwnPropertyNames(attributes).forEach(function (attrName) { - var attrValue = attributes[attrName]; - - if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) { - el.removeAttribute(attrName); - } else { - el.setAttribute(attrName, attrValue === true ? '' : attrValue); - } - }); - } - - /** - * Get an element's attribute values, as defined on the HTML tag - * Attributes are not the same as properties. They're defined on the tag - * or with setAttribute (which shouldn't be used with HTML) - * This will return true or false for boolean attributes. - * - * @param {Element} tag - * Element from which to get tag attributes. - * - * @return {Object} - * All attributes of the element. - */ - function getAttributes(tag) { - var obj = {}; - - // known boolean attributes - // we can check for matching boolean properties, but older browsers - // won't know about HTML5 boolean attributes that we still read from - var knownBooleans = ',' + 'autoplay,controls,playsinline,loop,muted,default,defaultMuted' + ','; - - if (tag && tag.attributes && tag.attributes.length > 0) { - var attrs = tag.attributes; - - for (var i = attrs.length - 1; i >= 0; i--) { - var attrName = attrs[i].name; - var attrVal = attrs[i].value; - - // check for known booleans - // the matching element property will return a value for typeof - if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(',' + attrName + ',') !== -1) { - // the value of an included boolean attribute is typically an empty - // string ('') which would equal false if we just check for a false value. - // we also don't want support bad code like autoplay='false' - attrVal = attrVal !== null ? true : false; - } - - obj[attrName] = attrVal; - } - } - - return obj; - } - - /** - * Get the value of an element's attribute - * - * @param {Element} el - * A DOM element - * - * @param {string} attribute - * Attribute to get the value of - * - * @return {string} - * value of the attribute - */ - function getAttribute(el, attribute) { - return el.getAttribute(attribute); - } - - /** - * Set the value of an element's attribute - * - * @param {Element} el - * A DOM element - * - * @param {string} attribute - * Attribute to set - * - * @param {string} value - * Value to set the attribute to - */ - function setAttribute(el, attribute, value) { - el.setAttribute(attribute, value); - } - - /** - * Remove an element's attribute - * - * @param {Element} el - * A DOM element - * - * @param {string} attribute - * Attribute to remove - */ - function removeAttribute(el, attribute) { - el.removeAttribute(attribute); - } - - /** - * Attempt to block the ability to select text while dragging controls - */ - function blockTextSelection() { - document_1.body.focus(); - document_1.onselectstart = function () { - return false; - }; - } - - /** - * Turn off text selection blocking - */ - function unblockTextSelection() { - document_1.onselectstart = function () { - return true; - }; - } - - /** - * Identical to the native `getBoundingClientRect` function, but ensures that - * the method is supported at all (it is in all browsers we claim to support) - * and that the element is in the DOM before continuing. - * - * This wrapper function also shims properties which are not provided by some - * older browsers (namely, IE8). - * - * Additionally, some browsers do not support adding properties to a - * `ClientRect`/`DOMRect` object; so, we shallow-copy it with the standard - * properties (except `x` and `y` which are not widely supported). This helps - * avoid implementations where keys are non-enumerable. - * - * @param {Element} el - * Element whose `ClientRect` we want to calculate. - * - * @return {Object|undefined} - * Always returns a plain - */ - function getBoundingClientRect(el) { - if (el && el.getBoundingClientRect && el.parentNode) { - var rect = el.getBoundingClientRect(); - var result = {}; - - ['bottom', 'height', 'left', 'right', 'top', 'width'].forEach(function (k) { - if (rect[k] !== undefined) { - result[k] = rect[k]; - } - }); - - if (!result.height) { - result.height = parseFloat(computedStyle(el, 'height')); - } - - if (!result.width) { - result.width = parseFloat(computedStyle(el, 'width')); - } - - return result; - } - } - - /** - * The postion of a DOM element on the page. - * - * @typedef {Object} module:dom~Position - * - * @property {number} left - * Pixels to the left - * - * @property {number} top - * Pixels on top - */ - - /** - * Offset Left. - * getBoundingClientRect technique from - * John Resig - * - * @see http://ejohn.org/blog/getboundingclientrect-is-awesome/ - * - * @param {Element} el - * Element from which to get offset - * - * @return {module:dom~Position} - * The position of the element that was passed in. - */ - function findPosition(el) { - var box = void 0; - - if (el.getBoundingClientRect && el.parentNode) { - box = el.getBoundingClientRect(); - } - - if (!box) { - return { - left: 0, - top: 0 - }; - } - - var docEl = document_1.documentElement; - var body = document_1.body; - - var clientLeft = docEl.clientLeft || body.clientLeft || 0; - var scrollLeft = window_1.pageXOffset || body.scrollLeft; - var left = box.left + scrollLeft - clientLeft; - - var clientTop = docEl.clientTop || body.clientTop || 0; - var scrollTop = window_1.pageYOffset || body.scrollTop; - var top = box.top + scrollTop - clientTop; - - // Android sometimes returns slightly off decimal values, so need to round - return { - left: Math.round(left), - top: Math.round(top) - }; - } - - /** - * x and y coordinates for a dom element or mouse pointer - * - * @typedef {Object} Dom~Coordinates - * - * @property {number} x - * x coordinate in pixels - * - * @property {number} y - * y coordinate in pixels - */ - - /** - * Get pointer position in element - * Returns an object with x and y coordinates. - * The base on the coordinates are the bottom left of the element. - * - * @param {Element} el - * Element on which to get the pointer position on - * - * @param {EventTarget~Event} event - * Event object - * - * @return {Dom~Coordinates} - * A Coordinates object corresponding to the mouse position. - * - */ - function getPointerPosition(el, event) { - var position = {}; - var box = videojs.dom.findPosition(el); - var boxW = el.offsetWidth; - var boxH = el.offsetHeight; - - var boxY = box.top; - var boxX = box.left; - var pageY = event.pageY; - var pageX = event.pageX; - - if (event.changedTouches) { - pageX = event.changedTouches[0].pageX; - pageY = event.changedTouches[0].pageY; - } - - var scaleX = el.getBoundingClientRect().width / el.offsetWidth; - var scaleY = el.getBoundingClientRect().height / el.offsetHeight; - - position.y = Math.max(0, Math.min(1, (boxY - pageY + boxH) / (boxH * scaleY))); - position.x = Math.max(0, Math.min(1, (pageX - boxX) / (boxW * scaleX))); - - return position; - } - - /** - * Determines, via duck typing, whether or not a value is a text node. - * - * @param {Mixed} value - * Check if this value is a text node. - * - * @return {boolean} - * - True if it is a text node - * - False otherwise - */ - function isTextNode(value) { - return isObject(value) && value.nodeType === 3; - } - - /** - * Empties the contents of an element. - * - * @param {Element} el - * The element to empty children from - * - * @return {Element} - * The element with no children - */ - function emptyEl(el) { - while (el.firstChild) { - el.removeChild(el.firstChild); - } - return el; - } - - /** - * Normalizes content for eventual insertion into the DOM. - * - * This allows a wide range of content definition methods, but protects - * from falling into the trap of simply writing to `innerHTML`, which is - * an XSS concern. - * - * The content for an element can be passed in multiple types and - * combinations, whose behavior is as follows: - * - * @param {String|Element|TextNode|Array|Function} content - * - String: Normalized into a text node. - * - Element/TextNode: Passed through. - * - Array: A one-dimensional array of strings, elements, nodes, or functions - * (which return single strings, elements, or nodes). - * - Function: If the sole argument, is expected to produce a string, element, - * node, or array as defined above. - * - * @return {Array} - * All of the content that was passed in normalized. - */ - function normalizeContent(content) { - - // First, invoke content if it is a function. If it produces an array, - // that needs to happen before normalization. - if (typeof content === 'function') { - content = content(); - } - - // Next up, normalize to an array, so one or many items can be normalized, - // filtered, and returned. - return (Array.isArray(content) ? content : [content]).map(function (value) { - - // First, invoke value if it is a function to produce a new value, - // which will be subsequently normalized to a Node of some kind. - if (typeof value === 'function') { - value = value(); - } - - if (isEl(value) || isTextNode(value)) { - return value; - } - - if (typeof value === 'string' && /\S/.test(value)) { - return document_1.createTextNode(value); - } - }).filter(function (value) { - return value; - }); - } - - /** - * Normalizes and appends content to an element. - * - * @param {Element} el - * Element to append normalized content to. - * - * - * @param {String|Element|TextNode|Array|Function} content - * See the `content` argument of {@link dom:normalizeContent} - * - * @return {Element} - * The element with appended normalized content. - */ - function appendContent(el, content) { - normalizeContent(content).forEach(function (node) { - return el.appendChild(node); - }); - return el; - } - - /** - * Normalizes and inserts content into an element; this is identical to - * `appendContent()`, except it empties the element first. - * - * @param {Element} el - * Element to insert normalized content into. - * - * @param {String|Element|TextNode|Array|Function} content - * See the `content` argument of {@link dom:normalizeContent} - * - * @return {Element} - * The element with inserted normalized content. - * - */ - function insertContent(el, content) { - return appendContent(emptyEl(el), content); - } - - /** - * Finds a single DOM element matching `selector` within the optional - * `context` of another DOM element (defaulting to `document`). - * - * @param {string} selector - * A valid CSS selector, which will be passed to `querySelector`. - * - * @param {Element|String} [context=document] - * A DOM element within which to query. Can also be a selector - * string in which case the first matching element will be used - * as context. If missing (or no element matches selector), falls - * back to `document`. - * - * @return {Element|null} - * The element that was found or null. - */ - var $ = createQuerier('querySelector'); - - /** - * Finds a all DOM elements matching `selector` within the optional - * `context` of another DOM element (defaulting to `document`). - * - * @param {string} selector - * A valid CSS selector, which will be passed to `querySelectorAll`. - * - * @param {Element|String} [context=document] - * A DOM element within which to query. Can also be a selector - * string in which case the first matching element will be used - * as context. If missing (or no element matches selector), falls - * back to `document`. - * - * @return {NodeList} - * A element list of elements that were found. Will be empty if none were found. - * - */ - var $$ = createQuerier('querySelectorAll'); - - - var Dom = (Object.freeze || Object)({ - isReal: isReal, - isEl: isEl, - isInFrame: isInFrame, - createEl: createEl, - textContent: textContent, - prependTo: prependTo, - hasClass: hasClass, - addClass: addClass, - removeClass: removeClass, - toggleClass: toggleClass, - setAttributes: setAttributes, - getAttributes: getAttributes, - getAttribute: getAttribute, - setAttribute: setAttribute, - removeAttribute: removeAttribute, - blockTextSelection: blockTextSelection, - unblockTextSelection: unblockTextSelection, - getBoundingClientRect: getBoundingClientRect, - findPosition: findPosition, - getPointerPosition: getPointerPosition, - isTextNode: isTextNode, - emptyEl: emptyEl, - normalizeContent: normalizeContent, - appendContent: appendContent, - insertContent: insertContent, - $: $, - $$: $$ - }); - - /** - * @file guid.js - * @module guid - */ - - /** - * Unique ID for an element or function - * @type {Number} - */ - var _guid = 1; - - /** - * Get a unique auto-incrementing ID by number that has not been returned before. - * - * @return {number} - * A new unique ID. - */ - function newGUID() { - return _guid++; - } - - /** - * @file dom-data.js - * @module dom-data - */ - /** - * Element Data Store. - * - * Allows for binding data to an element without putting it directly on the - * element. Ex. Event listeners are stored here. - * (also from jsninja.com, slightly modified and updated for closure compiler) - * - * @type {Object} - * @private - */ - var elData = {}; - - /* - * Unique attribute name to store an element's guid in - * - * @type {String} - * @constant - * @private - */ - var elIdAttr = 'vdata' + new Date().getTime(); - - /** - * Returns the cache object where data for an element is stored - * - * @param {Element} el - * Element to store data for. - * - * @return {Object} - * The cache object for that el that was passed in. - */ - function getData(el) { - var id = el[elIdAttr]; - - if (!id) { - id = el[elIdAttr] = newGUID(); - } - - if (!elData[id]) { - elData[id] = {}; - } - - return elData[id]; - } - - /** - * Returns whether or not an element has cached data - * - * @param {Element} el - * Check if this element has cached data. - * - * @return {boolean} - * - True if the DOM element has cached data. - * - False otherwise. - */ - function hasData(el) { - var id = el[elIdAttr]; - - if (!id) { - return false; - } - - return !!Object.getOwnPropertyNames(elData[id]).length; - } - - /** - * Delete data for the element from the cache and the guid attr from getElementById - * - * @param {Element} el - * Remove cached data for this element. - */ - function removeData(el) { - var id = el[elIdAttr]; - - if (!id) { - return; - } - - // Remove all stored data - delete elData[id]; - - // Remove the elIdAttr property from the DOM node - try { - delete el[elIdAttr]; - } catch (e) { - if (el.removeAttribute) { - el.removeAttribute(elIdAttr); - } else { - // IE doesn't appear to support removeAttribute on the document element - el[elIdAttr] = null; - } - } - } - - /** - * @file events.js. An Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/) - * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible) - * This should work very similarly to jQuery's events, however it's based off the book version which isn't as - * robust as jquery's, so there's probably some differences. - * - * @module events - */ - - /** - * Clean up the listener cache and dispatchers - * - * @param {Element|Object} elem - * Element to clean up - * - * @param {string} type - * Type of event to clean up - */ - function _cleanUpEvents(elem, type) { - var data = getData(elem); - - // Remove the events of a particular type if there are none left - if (data.handlers[type].length === 0) { - delete data.handlers[type]; - // data.handlers[type] = null; - // Setting to null was causing an error with data.handlers - - // Remove the meta-handler from the element - if (elem.removeEventListener) { - elem.removeEventListener(type, data.dispatcher, false); - } else if (elem.detachEvent) { - elem.detachEvent('on' + type, data.dispatcher); - } - } - - // Remove the events object if there are no types left - if (Object.getOwnPropertyNames(data.handlers).length <= 0) { - delete data.handlers; - delete data.dispatcher; - delete data.disabled; - } - - // Finally remove the element data if there is no data left - if (Object.getOwnPropertyNames(data).length === 0) { - removeData(elem); - } - } - - /** - * Loops through an array of event types and calls the requested method for each type. - * - * @param {Function} fn - * The event method we want to use. - * - * @param {Element|Object} elem - * Element or object to bind listeners to - * - * @param {string} type - * Type of event to bind to. - * - * @param {EventTarget~EventListener} callback - * Event listener. - */ - function _handleMultipleEvents(fn, elem, types, callback) { - types.forEach(function (type) { - // Call the event method for each one of the types - fn(elem, type, callback); - }); - } - - /** - * Fix a native event to have standard property values - * - * @param {Object} event - * Event object to fix. - * - * @return {Object} - * Fixed event object. - */ - function fixEvent(event) { - - function returnTrue() { - return true; - } - - function returnFalse() { - return false; - } - - // Test if fixing up is needed - // Used to check if !event.stopPropagation instead of isPropagationStopped - // But native events return true for stopPropagation, but don't have - // other expected methods like isPropagationStopped. Seems to be a problem - // with the Javascript Ninja code. So we're just overriding all events now. - if (!event || !event.isPropagationStopped) { - var old = event || window_1.event; - - event = {}; - // Clone the old object so that we can modify the values event = {}; - // IE8 Doesn't like when you mess with native event properties - // Firefox returns false for event.hasOwnProperty('type') and other props - // which makes copying more difficult. - // TODO: Probably best to create a whitelist of event props - for (var key in old) { - // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y - // Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation - // and webkitMovementX/Y - if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' && key !== 'webkitMovementX' && key !== 'webkitMovementY') { - // Chrome 32+ warns if you try to copy deprecated returnValue, but - // we still want to if preventDefault isn't supported (IE8). - if (!(key === 'returnValue' && old.preventDefault)) { - event[key] = old[key]; - } - } - } - - // The event occurred on this element - if (!event.target) { - event.target = event.srcElement || document_1; - } - - // Handle which other element the event is related to - if (!event.relatedTarget) { - event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; - } - - // Stop the default browser action - event.preventDefault = function () { - if (old.preventDefault) { - old.preventDefault(); - } - event.returnValue = false; - old.returnValue = false; - event.defaultPrevented = true; - }; - - event.defaultPrevented = false; - - // Stop the event from bubbling - event.stopPropagation = function () { - if (old.stopPropagation) { - old.stopPropagation(); - } - event.cancelBubble = true; - old.cancelBubble = true; - event.isPropagationStopped = returnTrue; - }; - - event.isPropagationStopped = returnFalse; - - // Stop the event from bubbling and executing other handlers - event.stopImmediatePropagation = function () { - if (old.stopImmediatePropagation) { - old.stopImmediatePropagation(); - } - event.isImmediatePropagationStopped = returnTrue; - event.stopPropagation(); - }; - - event.isImmediatePropagationStopped = returnFalse; - - // Handle mouse position - if (event.clientX !== null && event.clientX !== undefined) { - var doc = document_1.documentElement; - var body = document_1.body; - - event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); - event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); - } - - // Handle key presses - event.which = event.charCode || event.keyCode; - - // Fix button for mouse clicks: - // 0 == left; 1 == middle; 2 == right - if (event.button !== null && event.button !== undefined) { - - // The following is disabled because it does not pass videojs-standard - // and... yikes. - /* eslint-disable */ - event.button = event.button & 1 ? 0 : event.button & 4 ? 1 : event.button & 2 ? 2 : 0; - /* eslint-enable */ - } - } - - // Returns fixed-up instance - return event; - } - - /** - * Whether passive event listeners are supported - */ - var _supportsPassive = false; - - (function () { - try { - var opts = Object.defineProperty({}, 'passive', { - get: function get() { - _supportsPassive = true; - } - }); - - window_1.addEventListener('test', null, opts); - } catch (e) { - // disregard - } - })(); - - /** - * Touch events Chrome expects to be passive - */ - var passiveEvents = ['touchstart', 'touchmove']; - - /** - * Add an event listener to element - * It stores the handler function in a separate cache object - * and adds a generic handler to the element's event, - * along with a unique id (guid) to the element. - * - * @param {Element|Object} elem - * Element or object to bind listeners to - * - * @param {string|string[]} type - * Type of event to bind to. - * - * @param {EventTarget~EventListener} fn - * Event listener. - */ - function on(elem, type, fn) { - if (Array.isArray(type)) { - return _handleMultipleEvents(on, elem, type, fn); - } - - var data = getData(elem); - - // We need a place to store all our handler data - if (!data.handlers) { - data.handlers = {}; - } - - if (!data.handlers[type]) { - data.handlers[type] = []; - } - - if (!fn.guid) { - fn.guid = newGUID(); - } - - data.handlers[type].push(fn); - - if (!data.dispatcher) { - data.disabled = false; - - data.dispatcher = function (event, hash) { - - if (data.disabled) { - return; - } - - event = fixEvent(event); - - var handlers = data.handlers[event.type]; - - if (handlers) { - // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off. - var handlersCopy = handlers.slice(0); - - for (var m = 0, n = handlersCopy.length; m < n; m++) { - if (event.isImmediatePropagationStopped()) { - break; - } else { - try { - handlersCopy[m].call(elem, event, hash); - } catch (e) { - log$1.error(e); - } - } - } - } - }; - } - - if (data.handlers[type].length === 1) { - if (elem.addEventListener) { - var options = false; - - if (_supportsPassive && passiveEvents.indexOf(type) > -1) { - options = {passive: true}; - } - elem.addEventListener(type, data.dispatcher, options); - } else if (elem.attachEvent) { - elem.attachEvent('on' + type, data.dispatcher); - } - } - } - - /** - * Removes event listeners from an element - * - * @param {Element|Object} elem - * Object to remove listeners from. - * - * @param {string|string[]} [type] - * Type of listener to remove. Don't include to remove all events from element. - * - * @param {EventTarget~EventListener} [fn] - * Specific listener to remove. Don't include to remove listeners for an event - * type. - */ - function off(elem, type, fn) { - // Don't want to add a cache object through getElData if not needed - if (!hasData(elem)) { - return; - } - - var data = getData(elem); - - // If no events exist, nothing to unbind - if (!data.handlers) { - return; - } - - if (Array.isArray(type)) { - return _handleMultipleEvents(off, elem, type, fn); - } - - // Utility function - var removeType = function removeType(t) { - data.handlers[t] = []; - _cleanUpEvents(elem, t); - }; - - // Are we removing all bound events? - if (type === undefined) { - for (var t in data.handlers) { - if (Object.prototype.hasOwnProperty.call(data.handlers || {}, t)) { - removeType(t); - } - } - return; - } - - var handlers = data.handlers[type]; - - // If no handlers exist, nothing to unbind - if (!handlers) { - return; - } - - // If no listener was provided, remove all listeners for type - if (!fn) { - removeType(type); - return; - } - - // We're only removing a single handler - if (fn.guid) { - for (var n = 0; n < handlers.length; n++) { - if (handlers[n].guid === fn.guid) { - handlers.splice(n--, 1); - } - } - } - - _cleanUpEvents(elem, type); - } - - /** - * Trigger an event for an element - * - * @param {Element|Object} elem - * Element to trigger an event on - * - * @param {EventTarget~Event|string} event - * A string (the type) or an event object with a type attribute - * - * @param {Object} [hash] - * data hash to pass along with the event - * - * @return {boolean|undefined} - * - Returns the opposite of `defaultPrevented` if default was prevented - * - Otherwise returns undefined - */ - function trigger(elem, event, hash) { - // Fetches element data and a reference to the parent (for bubbling). - // Don't want to add a data object to cache for every parent, - // so checking hasElData first. - var elemData = hasData(elem) ? getData(elem) : {}; - var parent = elem.parentNode || elem.ownerDocument; - // type = event.type || event, - // handler; - - // If an event name was passed as a string, creates an event out of it - if (typeof event === 'string') { - event = {type: event, target: elem}; - } - // Normalizes the event properties. - event = fixEvent(event); - - // If the passed element has a dispatcher, executes the established handlers. - if (elemData.dispatcher) { - elemData.dispatcher.call(elem, event, hash); - } - - // Unless explicitly stopped or the event does not bubble (e.g. media events) - // recursively calls this function to bubble the event up the DOM. - if (parent && !event.isPropagationStopped() && event.bubbles === true) { - trigger.call(null, parent, event, hash); - - // If at the top of the DOM, triggers the default action unless disabled. - } else if (!parent && !event.defaultPrevented) { - var targetData = getData(event.target); - - // Checks if the target has a default action for this event. - if (event.target[event.type]) { - // Temporarily disables event dispatching on the target as we have already executed the handler. - targetData.disabled = true; - // Executes the default action. - if (typeof event.target[event.type] === 'function') { - event.target[event.type](); - } - // Re-enables event dispatching. - targetData.disabled = false; - } - } - - // Inform the triggerer if the default was prevented by returning false - return !event.defaultPrevented; - } - - /** - * Trigger a listener only once for an event - * - * @param {Element|Object} elem - * Element or object to bind to. - * - * @param {string|string[]} type - * Name/type of event - * - * @param {Event~EventListener} fn - * Event Listener function - */ - function one(elem, type, fn) { - if (Array.isArray(type)) { - return _handleMultipleEvents(one, elem, type, fn); - } - var func = function func() { - off(elem, type, func); - fn.apply(this, arguments); - }; - - // copy the guid to the new function so it can removed using the original function's ID - func.guid = fn.guid = fn.guid || newGUID(); - on(elem, type, func); - } - - var Events = (Object.freeze || Object)({ - fixEvent: fixEvent, - on: on, - off: off, - trigger: trigger, - one: one - }); - - /** - * @file setup.js - Functions for setting up a player without - * user interaction based on the data-setup `attribute` of the video tag. - * - * @module setup - */ - var _windowLoaded = false; - var videojs$2 = void 0; - - /** - * Set up any tags that have a data-setup `attribute` when the player is started. - */ - var autoSetup = function autoSetup() { - - // Protect against breakage in non-browser environments. - if (!isReal()) { - return; - } - - // One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack* - // var vids = Array.prototype.slice.call(document.getElementsByTagName('video')); - // var audios = Array.prototype.slice.call(document.getElementsByTagName('audio')); - // var mediaEls = vids.concat(audios); - - // Because IE8 doesn't support calling slice on a node list, we need to loop - // through each list of elements to build up a new, combined list of elements. - var vids = document_1.getElementsByTagName('video'); - var audios = document_1.getElementsByTagName('audio'); - var mediaEls = []; - - if (vids && vids.length > 0) { - for (var i = 0, e = vids.length; i < e; i++) { - mediaEls.push(vids[i]); - } - } - - if (audios && audios.length > 0) { - for (var _i = 0, _e = audios.length; _i < _e; _i++) { - mediaEls.push(audios[_i]); - } - } - - // Check if any media elements exist - if (mediaEls && mediaEls.length > 0) { - - for (var _i2 = 0, _e2 = mediaEls.length; _i2 < _e2; _i2++) { - var mediaEl = mediaEls[_i2]; - - // Check if element exists, has getAttribute func. - // IE seems to consider typeof el.getAttribute == 'object' instead of - // 'function' like expected, at least when loading the player immediately. - if (mediaEl && mediaEl.getAttribute) { - - // Make sure this player hasn't already been set up. - if (mediaEl.player === undefined) { - var options = mediaEl.getAttribute('data-setup'); - - // Check if data-setup attr exists. - // We only auto-setup if they've added the data-setup attr. - if (options !== null) { - // Create new video.js instance. - videojs$2(mediaEl); - } - } - - // If getAttribute isn't defined, we need to wait for the DOM. - } else { - autoSetupTimeout(1); - break; - } - } - - // No videos were found, so keep looping unless page is finished loading. - } else if (!_windowLoaded) { - autoSetupTimeout(1); - } - }; - - /** - * Wait until the page is loaded before running autoSetup. This will be called in - * autoSetup if `hasLoaded` returns false. - * - * @param {number} wait - * How long to wait in ms - * - * @param {module:videojs} [vjs] - * The videojs library function - */ - function autoSetupTimeout(wait, vjs) { - if (vjs) { - videojs$2 = vjs; - } - - window_1.setTimeout(autoSetup, wait); - } - - if (isReal() && document_1.readyState === 'complete') { - _windowLoaded = true; - } else { - /** - * Listen for the load event on window, and set _windowLoaded to true. - * - * @listens load - */ - one(window_1, 'load', function () { - _windowLoaded = true; - }); - } - - /** - * @file stylesheet.js - * @module stylesheet - */ - /** - * Create a DOM syle element given a className for it. - * - * @param {string} className - * The className to add to the created style element. - * - * @return {Element} - * The element that was created. - */ - var createStyleElement = function createStyleElement(className) { - var style = document_1.createElement('style'); - - style.className = className; - - return style; - }; - - /** - * Add text to a DOM element. - * - * @param {Element} el - * The Element to add text content to. - * - * @param {string} content - * The text to add to the element. - */ - var setTextContent = function setTextContent(el, content) { - if (el.styleSheet) { - el.styleSheet.cssText = content; - } else { - el.textContent = content; - } - }; - - /** - * @file fn.js - * @module fn - */ - /** - * Bind (a.k.a proxy or Context). A simple method for changing the context of a function - * It also stores a unique id on the function so it can be easily removed from events. - * - * @param {Mixed} context - * The object to bind as scope. - * - * @param {Function} fn - * The function to be bound to a scope. - * - * @param {number} [uid] - * An optional unique ID for the function to be set - * - * @return {Function} - * The new function that will be bound into the context given - */ - var bind = function bind(context, fn, uid) { - // Make sure the function has a unique ID - if (!fn.guid) { - fn.guid = newGUID(); - } - - // Create the new function that changes the context - var bound = function bound() { - return fn.apply(context, arguments); - }; - - // Allow for the ability to individualize this function - // Needed in the case where multiple objects might share the same prototype - // IF both items add an event listener with the same function, then you try to remove just one - // it will remove both because they both have the same guid. - // when using this, you need to use the bind method when you remove the listener as well. - // currently used in text tracks - bound.guid = uid ? uid + '_' + fn.guid : fn.guid; - - return bound; - }; - - /** - * Wraps the given function, `fn`, with a new function that only invokes `fn` - * at most once per every `wait` milliseconds. - * - * @param {Function} fn - * The function to be throttled. - * - * @param {Number} wait - * The number of milliseconds by which to throttle. - * - * @return {Function} - */ - var throttle = function throttle(fn, wait) { - var last = Date.now(); - - var throttled = function throttled() { - var now = Date.now(); - - if (now - last >= wait) { - fn.apply(undefined, arguments); - last = now; - } - }; - - return throttled; - }; - - /** - * @file src/js/event-target.js - */ - /** - * `EventTarget` is a class that can have the same API as the DOM `EventTarget`. It - * adds shorthand functions that wrap around lengthy functions. For example: - * the `on` function is a wrapper around `addEventListener`. - * - * @see [EventTarget Spec]{@link https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget} - * @class EventTarget - */ - var EventTarget = function EventTarget() { - }; - - /** - * A Custom DOM event. - * - * @typedef {Object} EventTarget~Event - * @see [Properties]{@link https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent} - */ - - /** - * All event listeners should follow the following format. - * - * @callback EventTarget~EventListener - * @this {EventTarget} - * - * @param {EventTarget~Event} event - * the event that triggered this function - * - * @param {Object} [hash] - * hash of data sent during the event - */ - - /** - * An object containing event names as keys and booleans as values. - * - * > NOTE: If an event name is set to a true value here {@link EventTarget#trigger} - * will have extra functionality. See that function for more information. - * - * @property EventTarget.prototype.allowedEvents_ - * @private - */ - EventTarget.prototype.allowedEvents_ = {}; - - /** - * Adds an `event listener` to an instance of an `EventTarget`. An `event listener` is a - * function that will get called when an event with a certain name gets triggered. - * - * @param {string|string[]} type - * An event name or an array of event names. - * - * @param {EventTarget~EventListener} fn - * The function to call with `EventTarget`s - */ - EventTarget.prototype.on = function (type, fn) { - // Remove the addEventListener alias before calling Events.on - // so we don't get into an infinite type loop - var ael = this.addEventListener; - - this.addEventListener = function () { - }; - on(this, type, fn); - this.addEventListener = ael; - }; - - /** - * An alias of {@link EventTarget#on}. Allows `EventTarget` to mimic - * the standard DOM API. - * - * @function - * @see {@link EventTarget#on} - */ - EventTarget.prototype.addEventListener = EventTarget.prototype.on; - - /** - * Removes an `event listener` for a specific event from an instance of `EventTarget`. - * This makes it so that the `event listener` will no longer get called when the - * named event happens. - * - * @param {string|string[]} type - * An event name or an array of event names. - * - * @param {EventTarget~EventListener} fn - * The function to remove. - */ - EventTarget.prototype.off = function (type, fn) { - off(this, type, fn); - }; - - /** - * An alias of {@link EventTarget#off}. Allows `EventTarget` to mimic - * the standard DOM API. - * - * @function - * @see {@link EventTarget#off} - */ - EventTarget.prototype.removeEventListener = EventTarget.prototype.off; - - /** - * This function will add an `event listener` that gets triggered only once. After the - * first trigger it will get removed. This is like adding an `event listener` - * with {@link EventTarget#on} that calls {@link EventTarget#off} on itself. - * - * @param {string|string[]} type - * An event name or an array of event names. - * - * @param {EventTarget~EventListener} fn - * The function to be called once for each event name. - */ - EventTarget.prototype.one = function (type, fn) { - // Remove the addEventListener alialing Events.on - // so we don't get into an infinite type loop - var ael = this.addEventListener; - - this.addEventListener = function () { - }; - one(this, type, fn); - this.addEventListener = ael; - }; - - /** - * This function causes an event to happen. This will then cause any `event listeners` - * that are waiting for that event, to get called. If there are no `event listeners` - * for an event then nothing will happen. - * - * If the name of the `Event` that is being triggered is in `EventTarget.allowedEvents_`. - * Trigger will also call the `on` + `uppercaseEventName` function. - * - * Example: - * 'click' is in `EventTarget.allowedEvents_`, so, trigger will attempt to call - * `onClick` if it exists. - * - * @param {string|EventTarget~Event|Object} event - * The name of the event, an `Event`, or an object with a key of type set to - * an event name. - */ - EventTarget.prototype.trigger = function (event) { - var type = event.type || event; - - if (typeof event === 'string') { - event = {type: type}; - } - event = fixEvent(event); - - if (this.allowedEvents_[type] && this['on' + type]) { - this['on' + type](event); - } - - trigger(this, event); - }; - - /** - * An alias of {@link EventTarget#trigger}. Allows `EventTarget` to mimic - * the standard DOM API. - * - * @function - * @see {@link EventTarget#trigger} - */ - EventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger; - - /** - * @file mixins/evented.js - * @module evented - */ - /** - * Returns whether or not an object has had the evented mixin applied. - * - * @param {Object} object - * An object to test. - * - * @return {boolean} - * Whether or not the object appears to be evented. - */ - var isEvented = function isEvented(object) { - return object instanceof EventTarget || !!object.eventBusEl_ && ['on', 'one', 'off', 'trigger'].every(function (k) { - return typeof object[k] === 'function'; - }); - }; - - /** - * Whether a value is a valid event type - non-empty string or array. - * - * @private - * @param {string|Array} type - * The type value to test. - * - * @return {boolean} - * Whether or not the type is a valid event type. - */ - var isValidEventType = function isValidEventType(type) { - return ( - // The regex here verifies that the `type` contains at least one non- - // whitespace character. - typeof type === 'string' && /\S/.test(type) || Array.isArray(type) && !!type.length - ); - }; - - /** - * Validates a value to determine if it is a valid event target. Throws if not. - * - * @private - * @throws {Error} - * If the target does not appear to be a valid event target. - * - * @param {Object} target - * The object to test. - */ - var validateTarget = function validateTarget(target) { - if (!target.nodeName && !isEvented(target)) { - throw new Error('Invalid target; must be a DOM node or evented object.'); - } - }; - - /** - * Validates a value to determine if it is a valid event target. Throws if not. - * - * @private - * @throws {Error} - * If the type does not appear to be a valid event type. - * - * @param {string|Array} type - * The type to test. - */ - var validateEventType = function validateEventType(type) { - if (!isValidEventType(type)) { - throw new Error('Invalid event type; must be a non-empty string or array.'); - } - }; - - /** - * Validates a value to determine if it is a valid listener. Throws if not. - * - * @private - * @throws {Error} - * If the listener is not a function. - * - * @param {Function} listener - * The listener to test. - */ - var validateListener = function validateListener(listener) { - if (typeof listener !== 'function') { - throw new Error('Invalid listener; must be a function.'); - } - }; - - /** - * Takes an array of arguments given to `on()` or `one()`, validates them, and - * normalizes them into an object. - * - * @private - * @param {Object} self - * The evented object on which `on()` or `one()` was called. This - * object will be bound as the `this` value for the listener. - * - * @param {Array} args - * An array of arguments passed to `on()` or `one()`. - * - * @return {Object} - * An object containing useful values for `on()` or `one()` calls. - */ - var normalizeListenArgs = function normalizeListenArgs(self, args) { - - // If the number of arguments is less than 3, the target is always the - // evented object itself. - var isTargetingSelf = args.length < 3 || args[0] === self || args[0] === self.eventBusEl_; - var target = void 0; - var type = void 0; - var listener = void 0; - - if (isTargetingSelf) { - target = self.eventBusEl_; - - // Deal with cases where we got 3 arguments, but we are still listening to - // the evented object itself. - if (args.length >= 3) { - args.shift(); - } - - type = args[0]; - listener = args[1]; - } else { - target = args[0]; - type = args[1]; - listener = args[2]; - } - - validateTarget(target); - validateEventType(type); - validateListener(listener); - - listener = bind(self, listener); - - return {isTargetingSelf: isTargetingSelf, target: target, type: type, listener: listener}; - }; - - /** - * Adds the listener to the event type(s) on the target, normalizing for - * the type of target. - * - * @private - * @param {Element|Object} target - * A DOM node or evented object. - * - * @param {string} method - * The event binding method to use ("on" or "one"). - * - * @param {string|Array} type - * One or more event type(s). - * - * @param {Function} listener - * A listener function. - */ - var listen = function listen(target, method, type, listener) { - validateTarget(target); - - if (target.nodeName) { - Events[method](target, type, listener); - } else { - target[method](type, listener); - } - }; - - /** - * Contains methods that provide event capabilites to an object which is passed - * to {@link module:evented|evented}. - * - * @mixin EventedMixin - */ - var EventedMixin = { - - /** - * Add a listener to an event (or events) on this object or another evented - * object. - * - * @param {string|Array|Element|Object} targetOrType - * If this is a string or array, it represents the event type(s) - * that will trigger the listener. - * - * Another evented object can be passed here instead, which will - * cause the listener to listen for events on _that_ object. - * - * In either case, the listener's `this` value will be bound to - * this object. - * - * @param {string|Array|Function} typeOrListener - * If the first argument was a string or array, this should be the - * listener function. Otherwise, this is a string or array of event - * type(s). - * - * @param {Function} [listener] - * If the first argument was another evented object, this will be - * the listener function. - */ - on: function on$$1() { - var _this = this; - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - var _normalizeListenArgs = normalizeListenArgs(this, args), - isTargetingSelf = _normalizeListenArgs.isTargetingSelf, - target = _normalizeListenArgs.target, - type = _normalizeListenArgs.type, - listener = _normalizeListenArgs.listener; - - listen(target, 'on', type, listener); - - // If this object is listening to another evented object. - if (!isTargetingSelf) { - - // If this object is disposed, remove the listener. - var removeListenerOnDispose = function removeListenerOnDispose() { - return _this.off(target, type, listener); - }; - - // Use the same function ID as the listener so we can remove it later it - // using the ID of the original listener. - removeListenerOnDispose.guid = listener.guid; - - // Add a listener to the target's dispose event as well. This ensures - // that if the target is disposed BEFORE this object, we remove the - // removal listener that was just added. Otherwise, we create a memory leak. - var removeRemoverOnTargetDispose = function removeRemoverOnTargetDispose() { - return _this.off('dispose', removeListenerOnDispose); - }; - - // Use the same function ID as the listener so we can remove it later - // it using the ID of the original listener. - removeRemoverOnTargetDispose.guid = listener.guid; - - listen(this, 'on', 'dispose', removeListenerOnDispose); - listen(target, 'on', 'dispose', removeRemoverOnTargetDispose); - } - }, - - - /** - * Add a listener to an event (or events) on this object or another evented - * object. The listener will only be called once and then removed. - * - * @param {string|Array|Element|Object} targetOrType - * If this is a string or array, it represents the event type(s) - * that will trigger the listener. - * - * Another evented object can be passed here instead, which will - * cause the listener to listen for events on _that_ object. - * - * In either case, the listener's `this` value will be bound to - * this object. - * - * @param {string|Array|Function} typeOrListener - * If the first argument was a string or array, this should be the - * listener function. Otherwise, this is a string or array of event - * type(s). - * - * @param {Function} [listener] - * If the first argument was another evented object, this will be - * the listener function. - */ - one: function one$$1() { - var _this2 = this; - - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - var _normalizeListenArgs2 = normalizeListenArgs(this, args), - isTargetingSelf = _normalizeListenArgs2.isTargetingSelf, - target = _normalizeListenArgs2.target, - type = _normalizeListenArgs2.type, - listener = _normalizeListenArgs2.listener; - - // Targeting this evented object. - - - if (isTargetingSelf) { - listen(target, 'one', type, listener); - - // Targeting another evented object. - } else { - var wrapper = function wrapper() { - for (var _len3 = arguments.length, largs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - largs[_key3] = arguments[_key3]; - } - - _this2.off(target, type, wrapper); - listener.apply(null, largs); - }; - - // Use the same function ID as the listener so we can remove it later - // it using the ID of the original listener. - wrapper.guid = listener.guid; - listen(target, 'one', type, wrapper); - } - }, - - - /** - * Removes listener(s) from event(s) on an evented object. - * - * @param {string|Array|Element|Object} [targetOrType] - * If this is a string or array, it represents the event type(s). - * - * Another evented object can be passed here instead, in which case - * ALL 3 arguments are _required_. - * - * @param {string|Array|Function} [typeOrListener] - * If the first argument was a string or array, this may be the - * listener function. Otherwise, this is a string or array of event - * type(s). - * - * @param {Function} [listener] - * If the first argument was another evented object, this will be - * the listener function; otherwise, _all_ listeners bound to the - * event type(s) will be removed. - */ - off: function off$$1(targetOrType, typeOrListener, listener) { - - // Targeting this evented object. - if (!targetOrType || isValidEventType(targetOrType)) { - off(this.eventBusEl_, targetOrType, typeOrListener); - - // Targeting another evented object. - } else { - var target = targetOrType; - var type = typeOrListener; - - // Fail fast and in a meaningful way! - validateTarget(target); - validateEventType(type); - validateListener(listener); - - // Ensure there's at least a guid, even if the function hasn't been used - listener = bind(this, listener); - - // Remove the dispose listener on this evented object, which was given - // the same guid as the event listener in on(). - this.off('dispose', listener); - - if (target.nodeName) { - off(target, type, listener); - off(target, 'dispose', listener); - } else if (isEvented(target)) { - target.off(type, listener); - target.off('dispose', listener); - } - } - }, - - - /** - * Fire an event on this evented object, causing its listeners to be called. - * - * @param {string|Object} event - * An event type or an object with a type property. - * - * @param {Object} [hash] - * An additional object to pass along to listeners. - * - * @returns {boolean} - * Whether or not the default behavior was prevented. - */ - trigger: function trigger$$1(event, hash) { - return trigger(this.eventBusEl_, event, hash); - } - }; - - /** - * Applies {@link module:evented~EventedMixin|EventedMixin} to a target object. - * - * @param {Object} target - * The object to which to add event methods. - * - * @param {Object} [options={}] - * Options for customizing the mixin behavior. - * - * @param {String} [options.eventBusKey] - * By default, adds a `eventBusEl_` DOM element to the target object, - * which is used as an event bus. If the target object already has a - * DOM element that should be used, pass its key here. - * - * @return {Object} - * The target object. - */ - function evented(target) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var eventBusKey = options.eventBusKey; - - // Set or create the eventBusEl_. - - if (eventBusKey) { - if (!target[eventBusKey].nodeName) { - throw new Error('The eventBusKey "' + eventBusKey + '" does not refer to an element.'); - } - target.eventBusEl_ = target[eventBusKey]; - } else { - target.eventBusEl_ = createEl('span', {className: 'vjs-event-bus'}); - } - - assign(target, EventedMixin); - - // When any evented object is disposed, it removes all its listeners. - target.on('dispose', function () { - return target.off(); - }); - - return target; - } - - /** - * @file mixins/stateful.js - * @module stateful - */ - /** - * Contains methods that provide statefulness to an object which is passed - * to {@link module:stateful}. - * - * @mixin StatefulMixin - */ - var StatefulMixin = { - - /** - * A hash containing arbitrary keys and values representing the state of - * the object. - * - * @type {Object} - */ - state: {}, - - /** - * Set the state of an object by mutating its - * {@link module:stateful~StatefulMixin.state|state} object in place. - * - * @fires module:stateful~StatefulMixin#statechanged - * @param {Object|Function} stateUpdates - * A new set of properties to shallow-merge into the plugin state. - * Can be a plain object or a function returning a plain object. - * - * @returns {Object|undefined} - * An object containing changes that occurred. If no changes - * occurred, returns `undefined`. - */ - setState: function setState(stateUpdates) { - var _this = this; - - // Support providing the `stateUpdates` state as a function. - if (typeof stateUpdates === 'function') { - stateUpdates = stateUpdates(); - } - - var changes = void 0; - - each(stateUpdates, function (value, key) { - - // Record the change if the value is different from what's in the - // current state. - if (_this.state[key] !== value) { - changes = changes || {}; - changes[key] = { - from: _this.state[key], - to: value - }; - } - - _this.state[key] = value; - }); - - // Only trigger "statechange" if there were changes AND we have a trigger - // function. This allows us to not require that the target object be an - // evented object. - if (changes && isEvented(this)) { - - /** - * An event triggered on an object that is both - * {@link module:stateful|stateful} and {@link module:evented|evented} - * indicating that its state has changed. - * - * @event module:stateful~StatefulMixin#statechanged - * @type {Object} - * @property {Object} changes - * A hash containing the properties that were changed and - * the values they were changed `from` and `to`. - */ - this.trigger({ - changes: changes, - type: 'statechanged' - }); - } - - return changes; - } - }; - - /** - * Applies {@link module:stateful~StatefulMixin|StatefulMixin} to a target - * object. - * - * If the target object is {@link module:evented|evented} and has a - * `handleStateChanged` method, that method will be automatically bound to the - * `statechanged` event on itself. - * - * @param {Object} target - * The object to be made stateful. - * - * @param {Object} [defaultState] - * A default set of properties to populate the newly-stateful object's - * `state` property. - * - * @returns {Object} - * Returns the `target`. - */ - function stateful(target, defaultState) { - assign(target, StatefulMixin); - - // This happens after the mixing-in because we need to replace the `state` - // added in that step. - target.state = assign({}, target.state, defaultState); - - // Auto-bind the `handleStateChanged` method of the target object if it exists. - if (typeof target.handleStateChanged === 'function' && isEvented(target)) { - target.on('statechanged', target.handleStateChanged); - } - - return target; - } - - /** - * @file to-title-case.js - * @module to-title-case - */ - - /** - * Uppercase the first letter of a string. - * - * @param {string} string - * String to be uppercased - * - * @return {string} - * The string with an uppercased first letter - */ - function toTitleCase(string) { - if (typeof string !== 'string') { - return string; - } - - return string.charAt(0).toUpperCase() + string.slice(1); - } - - /** - * Compares the TitleCase versions of the two strings for equality. - * - * @param {string} str1 - * The first string to compare - * - * @param {string} str2 - * The second string to compare - * - * @return {boolean} - * Whether the TitleCase versions of the strings are equal - */ - function titleCaseEquals(str1, str2) { - return toTitleCase(str1) === toTitleCase(str2); - } - - /** - * @file merge-options.js - * @module merge-options - */ - /** - * Deep-merge one or more options objects, recursively merging **only** plain - * object properties. - * - * @param {Object[]} sources - * One or more objects to merge into a new object. - * - * @returns {Object} - * A new object that is the merged result of all sources. - */ - function mergeOptions() { - var result = {}; - - for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) { - sources[_key] = arguments[_key]; - } - - sources.forEach(function (source) { - if (!source) { - return; - } - - each(source, function (value, key) { - if (!isPlain(value)) { - result[key] = value; - return; - } - - if (!isPlain(result[key])) { - result[key] = {}; - } - - result[key] = mergeOptions(result[key], value); - }); - }); - - return result; - } - - /** - * Player Component - Base class for all UI objects - * - * @file component.js - */ - /** - * Base class for all UI Components. - * Components are UI objects which represent both a javascript object and an element - * in the DOM. They can be children of other components, and can have - * children themselves. - * - * Components can also use methods from {@link EventTarget} - */ - - var Component = function () { - - /** - * A callback that is called when a component is ready. Does not have any - * paramters and any callback value will be ignored. - * - * @callback Component~ReadyCallback - * @this Component - */ - - /** - * Creates an instance of this class. - * - * @param {Player} player - * The `Player` that this class should be attached to. - * - * @param {Object} [options] - * The key/value store of player options. - * - * @param {Object[]} [options.children] - * An array of children objects to intialize this component with. Children objects have - * a name property that will be used if more than one component of the same type needs to be - * added. - * - * @param {Component~ReadyCallback} [ready] - * Function that gets called when the `Component` is ready. - */ - function Component(player, options, ready) { - classCallCheck(this, Component); - - - // The component might be the player itself and we can't pass `this` to super - if (!player && this.play) { - this.player_ = player = this; // eslint-disable-line - } else { - this.player_ = player; - } - - // Make a copy of prototype.options_ to protect against overriding defaults - this.options_ = mergeOptions({}, this.options_); - - // Updated options with supplied options - options = this.options_ = mergeOptions(this.options_, options); - - // Get ID from options or options element if one is supplied - this.id_ = options.id || options.el && options.el.id; - - // If there was no ID from the options, generate one - if (!this.id_) { - // Don't require the player ID function in the case of mock players - var id = player && player.id && player.id() || 'no_player'; - - this.id_ = id + '_component_' + newGUID(); - } - - this.name_ = options.name || null; - - // Create element if one wasn't provided in options - if (options.el) { - this.el_ = options.el; - } else if (options.createEl !== false) { - this.el_ = this.createEl(); - } - - // Make this an evented object and use `el_`, if available, as its event bus - evented(this, {eventBusKey: this.el_ ? 'el_' : null}); - stateful(this, this.constructor.defaultState); - - this.children_ = []; - this.childIndex_ = {}; - this.childNameIndex_ = {}; - - // Add any child components in options - if (options.initChildren !== false) { - this.initChildren(); - } - - this.ready(ready); - // Don't want to trigger ready here or it will before init is actually - // finished for all children that run this constructor - - if (options.reportTouchActivity !== false) { - this.enableTouchActivity(); - } - } - - /** - * Dispose of the `Component` and all child components. - * - * @fires Component#dispose - */ - - - Component.prototype.dispose = function dispose() { - - /** - * Triggered when a `Component` is disposed. - * - * @event Component#dispose - * @type {EventTarget~Event} - * - * @property {boolean} [bubbles=false] - * set to false so that the close event does not - * bubble up - */ - this.trigger({type: 'dispose', bubbles: false}); - - // Dispose all children. - if (this.children_) { - for (var i = this.children_.length - 1; i >= 0; i--) { - if (this.children_[i].dispose) { - this.children_[i].dispose(); - } - } - } - - // Delete child references - this.children_ = null; - this.childIndex_ = null; - this.childNameIndex_ = null; - - if (this.el_) { - // Remove element from DOM - if (this.el_.parentNode) { - this.el_.parentNode.removeChild(this.el_); - } - - removeData(this.el_); - this.el_ = null; - } - }; - - /** - * Return the {@link Player} that the `Component` has attached to. - * - * @return {Player} - * The player that this `Component` has attached to. - */ - - - Component.prototype.player = function player() { - return this.player_; - }; - - /** - * Deep merge of options objects with new options. - * > Note: When both `obj` and `options` contain properties whose values are objects. - * The two properties get merged using {@link module:mergeOptions} - * - * @param {Object} obj - * The object that contains new options. - * - * @return {Object} - * A new object of `this.options_` and `obj` merged together. - * - * @deprecated since version 5 - */ - - - Component.prototype.options = function options(obj) { - log$1.warn('this.options() has been deprecated and will be moved to the constructor in 6.0'); - - if (!obj) { - return this.options_; - } - - this.options_ = mergeOptions(this.options_, obj); - return this.options_; - }; - - /** - * Get the `Component`s DOM element - * - * @return {Element} - * The DOM element for this `Component`. - */ - - - Component.prototype.el = function el() { - return this.el_; - }; - - /** - * Create the `Component`s DOM element. - * - * @param {string} [tagName] - * Element's DOM node type. e.g. 'div' - * - * @param {Object} [properties] - * An object of properties that should be set. - * - * @param {Object} [attributes] - * An object of attributes that should be set. - * - * @return {Element} - * The element that gets created. - */ - - - Component.prototype.createEl = function createEl$$1(tagName, properties, attributes) { - return createEl(tagName, properties, attributes); - }; - - /** - * Localize a string given the string in english. - * - * If tokens are provided, it'll try and run a simple token replacement on the provided string. - * The tokens it loooks for look like `{1}` with the index being 1-indexed into the tokens array. - * - * If a `defaultValue` is provided, it'll use that over `string`, - * if a value isn't found in provided language files. - * This is useful if you want to have a descriptive key for token replacement - * but have a succinct localized string and not require `en.json` to be included. - * - * Currently, it is used for the progress bar timing. - * ```js - * { - * "progress bar timing: currentTime={1} duration={2}": "{1} of {2}" - * } - * ``` - * It is then used like so: - * ```js - * this.localize('progress bar timing: currentTime={1} duration{2}', - * [this.player_.currentTime(), this.player_.duration()], - * '{1} of {2}'); - * ``` - * - * Which outputs something like: `01:23 of 24:56`. - * - * - * @param {string} string - * The string to localize and the key to lookup in the language files. - * @param {string[]} [tokens] - * If the current item has token replacements, provide the tokens here. - * @param {string} [defaultValue] - * Defaults to `string`. Can be a default value to use for token replacement - * if the lookup key is needed to be separate. - * - * @return {string} - * The localized string or if no localization exists the english string. - */ - - - Component.prototype.localize = function localize(string, tokens) { - var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : string; - - var code = this.player_.language && this.player_.language(); - var languages = this.player_.languages && this.player_.languages(); - var language = languages && languages[code]; - var primaryCode = code && code.split('-')[0]; - var primaryLang = languages && languages[primaryCode]; - - var localizedString = defaultValue; - - if (language && language[string]) { - localizedString = language[string]; - } else if (primaryLang && primaryLang[string]) { - localizedString = primaryLang[string]; - } - - if (tokens) { - localizedString = localizedString.replace(/\{(\d+)\}/g, function (match, index) { - var value = tokens[index - 1]; - var ret = value; - - if (typeof value === 'undefined') { - ret = match; - } - - return ret; - }); - } - - return localizedString; - }; - - /** - * Return the `Component`s DOM element. This is where children get inserted. - * This will usually be the the same as the element returned in {@link Component#el}. - * - * @return {Element} - * The content element for this `Component`. - */ - - - Component.prototype.contentEl = function contentEl() { - return this.contentEl_ || this.el_; - }; - - /** - * Get this `Component`s ID - * - * @return {string} - * The id of this `Component` - */ - - - Component.prototype.id = function id() { - return this.id_; - }; - - /** - * Get the `Component`s name. The name gets used to reference the `Component` - * and is set during registration. - * - * @return {string} - * The name of this `Component`. - */ - - - Component.prototype.name = function name() { - return this.name_; - }; - - /** - * Get an array of all child components - * - * @return {Array} - * The children - */ - - - Component.prototype.children = function children() { - return this.children_; - }; - - /** - * Returns the child `Component` with the given `id`. - * - * @param {string} id - * The id of the child `Component` to get. - * - * @return {Component|undefined} - * The child `Component` with the given `id` or undefined. - */ - - - Component.prototype.getChildById = function getChildById(id) { - return this.childIndex_[id]; - }; - - /** - * Returns the child `Component` with the given `name`. - * - * @param {string} name - * The name of the child `Component` to get. - * - * @return {Component|undefined} - * The child `Component` with the given `name` or undefined. - */ - - - Component.prototype.getChild = function getChild(name) { - if (!name) { - return; - } - - name = toTitleCase(name); - - return this.childNameIndex_[name]; - }; - - /** - * Add a child `Component` inside the current `Component`. - * - * - * @param {string|Component} child - * The name or instance of a child to add. - * - * @param {Object} [options={}] - * The key/value store of options that will get passed to children of - * the child. - * - * @param {number} [index=this.children_.length] - * The index to attempt to add a child into. - * - * @return {Component} - * The `Component` that gets added as a child. When using a string the - * `Component` will get created by this process. - */ - - - Component.prototype.addChild = function addChild(child) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.children_.length; - - var component = void 0; - var componentName = void 0; - - // If child is a string, create component with options - if (typeof child === 'string') { - componentName = toTitleCase(child); - - var componentClassName = options.componentClass || componentName; - - // Set name through options - options.name = componentName; - - // Create a new object & element for this controls set - // If there's no .player_, this is a player - var ComponentClass = Component.getComponent(componentClassName); - - if (!ComponentClass) { - throw new Error('Component ' + componentClassName + ' does not exist'); - } - - // data stored directly on the videojs object may be - // misidentified as a component to retain - // backwards-compatibility with 4.x. check to make sure the - // component class can be instantiated. - if (typeof ComponentClass !== 'function') { - return null; - } - - component = new ComponentClass(this.player_ || this, options); - - // child is a component instance - } else { - component = child; - } - - this.children_.splice(index, 0, component); - - if (typeof component.id === 'function') { - this.childIndex_[component.id()] = component; - } - - // If a name wasn't used to create the component, check if we can use the - // name function of the component - componentName = componentName || component.name && toTitleCase(component.name()); - - if (componentName) { - this.childNameIndex_[componentName] = component; - } - - // Add the UI object's element to the container div (box) - // Having an element is not required - if (typeof component.el === 'function' && component.el()) { - var childNodes = this.contentEl().children; - var refNode = childNodes[index] || null; - - this.contentEl().insertBefore(component.el(), refNode); - } - - // Return so it can stored on parent object if desired. - return component; - }; - - /** - * Remove a child `Component` from this `Component`s list of children. Also removes - * the child `Component`s element from this `Component`s element. - * - * @param {Component} component - * The child `Component` to remove. - */ - - - Component.prototype.removeChild = function removeChild(component) { - if (typeof component === 'string') { - component = this.getChild(component); - } - - if (!component || !this.children_) { - return; - } - - var childFound = false; - - for (var i = this.children_.length - 1; i >= 0; i--) { - if (this.children_[i] === component) { - childFound = true; - this.children_.splice(i, 1); - break; - } - } - - if (!childFound) { - return; - } - - this.childIndex_[component.id()] = null; - this.childNameIndex_[component.name()] = null; - - var compEl = component.el(); - - if (compEl && compEl.parentNode === this.contentEl()) { - this.contentEl().removeChild(component.el()); - } - }; - - /** - * Add and initialize default child `Component`s based upon options. - */ - - - Component.prototype.initChildren = function initChildren() { - var _this = this; - - var children = this.options_.children; - - if (children) { - // `this` is `parent` - var parentOptions = this.options_; - - var handleAdd = function handleAdd(child) { - var name = child.name; - var opts = child.opts; - - // Allow options for children to be set at the parent options - // e.g. videojs(id, { controlBar: false }); - // instead of videojs(id, { children: { controlBar: false }); - if (parentOptions[name] !== undefined) { - opts = parentOptions[name]; - } - - // Allow for disabling default components - // e.g. options['children']['posterImage'] = false - if (opts === false) { - return; - } - - // Allow options to be passed as a simple boolean if no configuration - // is necessary. - if (opts === true) { - opts = {}; - } - - // We also want to pass the original player options - // to each component as well so they don't need to - // reach back into the player for options later. - opts.playerOptions = _this.options_.playerOptions; - - // Create and add the child component. - // Add a direct reference to the child by name on the parent instance. - // If two of the same component are used, different names should be supplied - // for each - var newChild = _this.addChild(name, opts); - - if (newChild) { - _this[name] = newChild; - } - }; - - // Allow for an array of children details to passed in the options - var workingChildren = void 0; - var Tech = Component.getComponent('Tech'); - - if (Array.isArray(children)) { - workingChildren = children; - } else { - workingChildren = Object.keys(children); - } - - workingChildren - // children that are in this.options_ but also in workingChildren would - // give us extra children we do not want. So, we want to filter them out. - .concat(Object.keys(this.options_).filter(function (child) { - return !workingChildren.some(function (wchild) { - if (typeof wchild === 'string') { - return child === wchild; - } - return child === wchild.name; - }); - })).map(function (child) { - var name = void 0; - var opts = void 0; - - if (typeof child === 'string') { - name = child; - opts = children[name] || _this.options_[name] || {}; - } else { - name = child.name; - opts = child; - } - - return {name: name, opts: opts}; - }).filter(function (child) { - // we have to make sure that child.name isn't in the techOrder since - // techs are registerd as Components but can't aren't compatible - // See https://github.com/videojs/video.js/issues/2772 - var c = Component.getComponent(child.opts.componentClass || toTitleCase(child.name)); - - return c && !Tech.isTech(c); - }).forEach(handleAdd); - } - }; - - /** - * Builds the default DOM class name. Should be overriden by sub-components. - * - * @return {string} - * The DOM class name for this object. - * - * @abstract - */ - - - Component.prototype.buildCSSClass = function buildCSSClass() { - // Child classes can include a function that does: - // return 'CLASS NAME' + this._super(); - return ''; - }; - - /** - * Bind a listener to the component's ready state. - * Different from event listeners in that if the ready event has already happened - * it will trigger the function immediately. - * - * @return {Component} - * Returns itself; method can be chained. - */ - - - Component.prototype.ready = function ready(fn) { - var sync = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (!fn) { - return; - } - - if (!this.isReady_) { - this.readyQueue_ = this.readyQueue_ || []; - this.readyQueue_.push(fn); - return; - } - - if (sync) { - fn.call(this); - } else { - // Call the function asynchronously by default for consistency - this.setTimeout(fn, 1); - } - }; - - /** - * Trigger all the ready listeners for this `Component`. - * - * @fires Component#ready - */ - - - Component.prototype.triggerReady = function triggerReady() { - this.isReady_ = true; - - // Ensure ready is triggerd asynchronously - this.setTimeout(function () { - var readyQueue = this.readyQueue_; - - // Reset Ready Queue - this.readyQueue_ = []; - - if (readyQueue && readyQueue.length > 0) { - readyQueue.forEach(function (fn) { - fn.call(this); - }, this); - } - - // Allow for using event listeners also - /** - * Triggered when a `Component` is ready. - * - * @event Component#ready - * @type {EventTarget~Event} - */ - this.trigger('ready'); - }, 1); - }; - - /** - * Find a single DOM element matching a `selector`. This can be within the `Component`s - * `contentEl()` or another custom context. - * - * @param {string} selector - * A valid CSS selector, which will be passed to `querySelector`. - * - * @param {Element|string} [context=this.contentEl()] - * A DOM element within which to query. Can also be a selector string in - * which case the first matching element will get used as context. If - * missing `this.contentEl()` gets used. If `this.contentEl()` returns - * nothing it falls back to `document`. - * - * @return {Element|null} - * the dom element that was found, or null - * - * @see [Information on CSS Selectors](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors) - */ - - - Component.prototype.$ = function $$$1(selector, context) { - return $(selector, context || this.contentEl()); - }; - - /** - * Finds all DOM element matching a `selector`. This can be within the `Component`s - * `contentEl()` or another custom context. - * - * @param {string} selector - * A valid CSS selector, which will be passed to `querySelectorAll`. - * - * @param {Element|string} [context=this.contentEl()] - * A DOM element within which to query. Can also be a selector string in - * which case the first matching element will get used as context. If - * missing `this.contentEl()` gets used. If `this.contentEl()` returns - * nothing it falls back to `document`. - * - * @return {NodeList} - * a list of dom elements that were found - * - * @see [Information on CSS Selectors](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors) - */ - - - Component.prototype.$$ = function $$$$1(selector, context) { - return $$(selector, context || this.contentEl()); - }; - - /** - * Check if a component's element has a CSS class name. - * - * @param {string} classToCheck - * CSS class name to check. - * - * @return {boolean} - * - True if the `Component` has the class. - * - False if the `Component` does not have the class` - */ - - - Component.prototype.hasClass = function hasClass$$1(classToCheck) { - return hasClass(this.el_, classToCheck); - }; - - /** - * Add a CSS class name to the `Component`s element. - * - * @param {string} classToAdd - * CSS class name to add - */ - - - Component.prototype.addClass = function addClass$$1(classToAdd) { - addClass(this.el_, classToAdd); - }; - - /** - * Remove a CSS class name from the `Component`s element. - * - * @param {string} classToRemove - * CSS class name to remove - */ - - - Component.prototype.removeClass = function removeClass$$1(classToRemove) { - removeClass(this.el_, classToRemove); - }; - - /** - * Add or remove a CSS class name from the component's element. - * - `classToToggle` gets added when {@link Component#hasClass} would return false. - * - `classToToggle` gets removed when {@link Component#hasClass} would return true. - * - * @param {string} classToToggle - * The class to add or remove based on (@link Component#hasClass} - * - * @param {boolean|Dom~predicate} [predicate] - * An {@link Dom~predicate} function or a boolean - */ - - - Component.prototype.toggleClass = function toggleClass$$1(classToToggle, predicate) { - toggleClass(this.el_, classToToggle, predicate); - }; - - /** - * Show the `Component`s element if it is hidden by removing the - * 'vjs-hidden' class name from it. - */ - - - Component.prototype.show = function show() { - this.removeClass('vjs-hidden'); - }; - - /** - * Hide the `Component`s element if it is currently showing by adding the - * 'vjs-hidden` class name to it. - */ - - - Component.prototype.hide = function hide() { - this.addClass('vjs-hidden'); - }; - - /** - * Lock a `Component`s element in its visible state by adding the 'vjs-lock-showing' - * class name to it. Used during fadeIn/fadeOut. - * - * @private - */ - - - Component.prototype.lockShowing = function lockShowing() { - this.addClass('vjs-lock-showing'); - }; - - /** - * Unlock a `Component`s element from its visible state by removing the 'vjs-lock-showing' - * class name from it. Used during fadeIn/fadeOut. - * - * @private - */ - - - Component.prototype.unlockShowing = function unlockShowing() { - this.removeClass('vjs-lock-showing'); - }; - - /** - * Get the value of an attribute on the `Component`s element. - * - * @param {string} attribute - * Name of the attribute to get the value from. - * - * @return {string|null} - * - The value of the attribute that was asked for. - * - Can be an empty string on some browsers if the attribute does not exist - * or has no value - * - Most browsers will return null if the attibute does not exist or has - * no value. - * - * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute} - */ - - - Component.prototype.getAttribute = function getAttribute$$1(attribute) { - return getAttribute(this.el_, attribute); - }; - - /** - * Set the value of an attribute on the `Component`'s element - * - * @param {string} attribute - * Name of the attribute to set. - * - * @param {string} value - * Value to set the attribute to. - * - * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/setAttribute} - */ - - - Component.prototype.setAttribute = function setAttribute$$1(attribute, value) { - setAttribute(this.el_, attribute, value); - }; - - /** - * Remove an attribute from the `Component`s element. - * - * @param {string} attribute - * Name of the attribute to remove. - * - * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/removeAttribute} - */ - - - Component.prototype.removeAttribute = function removeAttribute$$1(attribute) { - removeAttribute(this.el_, attribute); - }; - - /** - * Get or set the width of the component based upon the CSS styles. - * See {@link Component#dimension} for more detailed information. - * - * @param {number|string} [num] - * The width that you want to set postfixed with '%', 'px' or nothing. - * - * @param {boolean} [skipListeners] - * Skip the componentresize event trigger - * - * @return {number|string} - * The width when getting, zero if there is no width. Can be a string - * postpixed with '%' or 'px'. - */ - - - Component.prototype.width = function width(num, skipListeners) { - return this.dimension('width', num, skipListeners); - }; - - /** - * Get or set the height of the component based upon the CSS styles. - * See {@link Component#dimension} for more detailed information. - * - * @param {number|string} [num] - * The height that you want to set postfixed with '%', 'px' or nothing. - * - * @param {boolean} [skipListeners] - * Skip the componentresize event trigger - * - * @return {number|string} - * The width when getting, zero if there is no width. Can be a string - * postpixed with '%' or 'px'. - */ - - - Component.prototype.height = function height(num, skipListeners) { - return this.dimension('height', num, skipListeners); - }; - - /** - * Set both the width and height of the `Component` element at the same time. - * - * @param {number|string} width - * Width to set the `Component`s element to. - * - * @param {number|string} height - * Height to set the `Component`s element to. - */ - - - Component.prototype.dimensions = function dimensions(width, height) { - // Skip componentresize listeners on width for optimization - this.width(width, true); - this.height(height); - }; - - /** - * Get or set width or height of the `Component` element. This is the shared code - * for the {@link Component#width} and {@link Component#height}. - * - * Things to know: - * - If the width or height in an number this will return the number postfixed with 'px'. - * - If the width/height is a percent this will return the percent postfixed with '%' - * - Hidden elements have a width of 0 with `window.getComputedStyle`. This function - * defaults to the `Component`s `style.width` and falls back to `window.getComputedStyle`. - * See [this]{@link http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/} - * for more information - * - If you want the computed style of the component, use {@link Component#currentWidth} - * and {@link {Component#currentHeight} - * - * @fires Component#componentresize - * - * @param {string} widthOrHeight - 8 'width' or 'height' - * - * @param {number|string} [num] - 8 New dimension - * - * @param {boolean} [skipListeners] - * Skip componentresize event trigger - * - * @return {number} - * The dimension when getting or 0 if unset - */ - - - Component.prototype.dimension = function dimension(widthOrHeight, num, skipListeners) { - if (num !== undefined) { - // Set to zero if null or literally NaN (NaN !== NaN) - if (num === null || num !== num) { - num = 0; - } - - // Check if using css width/height (% or px) and adjust - if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) { - this.el_.style[widthOrHeight] = num; - } else if (num === 'auto') { - this.el_.style[widthOrHeight] = ''; - } else { - this.el_.style[widthOrHeight] = num + 'px'; - } - - // skipListeners allows us to avoid triggering the resize event when setting both width and height - if (!skipListeners) { - /** - * Triggered when a component is resized. - * - * @event Component#componentresize - * @type {EventTarget~Event} - */ - this.trigger('componentresize'); - } - - return; - } - - // Not setting a value, so getting it - // Make sure element exists - if (!this.el_) { - return 0; - } - - // Get dimension value from style - var val = this.el_.style[widthOrHeight]; - var pxIndex = val.indexOf('px'); - - if (pxIndex !== -1) { - // Return the pixel value with no 'px' - return parseInt(val.slice(0, pxIndex), 10); - } - - // No px so using % or no style was set, so falling back to offsetWidth/height - // If component has display:none, offset will return 0 - // TODO: handle display:none and no dimension style using px - return parseInt(this.el_['offset' + toTitleCase(widthOrHeight)], 10); - }; - - /** - * Get the width or the height of the `Component` elements computed style. Uses - * `window.getComputedStyle`. - * - * @param {string} widthOrHeight - * A string containing 'width' or 'height'. Whichever one you want to get. - * - * @return {number} - * The dimension that gets asked for or 0 if nothing was set - * for that dimension. - */ - - - Component.prototype.currentDimension = function currentDimension(widthOrHeight) { - var computedWidthOrHeight = 0; - - if (widthOrHeight !== 'width' && widthOrHeight !== 'height') { - throw new Error('currentDimension only accepts width or height value'); - } - - if (typeof window_1.getComputedStyle === 'function') { - var computedStyle = window_1.getComputedStyle(this.el_); - - computedWidthOrHeight = computedStyle.getPropertyValue(widthOrHeight) || computedStyle[widthOrHeight]; - } - - // remove 'px' from variable and parse as integer - computedWidthOrHeight = parseFloat(computedWidthOrHeight); - - // if the computed value is still 0, it's possible that the browser is lying - // and we want to check the offset values. - // This code also runs on IE8 and wherever getComputedStyle doesn't exist. - if (computedWidthOrHeight === 0) { - var rule = 'offset' + toTitleCase(widthOrHeight); - - computedWidthOrHeight = this.el_[rule]; - } - - return computedWidthOrHeight; - }; - - /** - * An object that contains width and height values of the `Component`s - * computed style. Uses `window.getComputedStyle`. - * - * @typedef {Object} Component~DimensionObject - * - * @property {number} width - * The width of the `Component`s computed style. - * - * @property {number} height - * The height of the `Component`s computed style. - */ - - /** - * Get an object that contains width and height values of the `Component`s - * computed style. - * - * @return {Component~DimensionObject} - * The dimensions of the components element - */ - - - Component.prototype.currentDimensions = function currentDimensions() { - return { - width: this.currentDimension('width'), - height: this.currentDimension('height') - }; - }; - - /** - * Get the width of the `Component`s computed style. Uses `window.getComputedStyle`. - * - * @return {number} width - * The width of the `Component`s computed style. - */ - - - Component.prototype.currentWidth = function currentWidth() { - return this.currentDimension('width'); - }; - - /** - * Get the height of the `Component`s computed style. Uses `window.getComputedStyle`. - * - * @return {number} height - * The height of the `Component`s computed style. - */ - - - Component.prototype.currentHeight = function currentHeight() { - return this.currentDimension('height'); - }; - - /** - * Set the focus to this component - */ - - - Component.prototype.focus = function focus() { - this.el_.focus(); - }; - - /** - * Remove the focus from this component - */ - - - Component.prototype.blur = function blur() { - this.el_.blur(); - }; - - /** - * Emit a 'tap' events when touch event support gets detected. This gets used to - * support toggling the controls through a tap on the video. They get enabled - * because every sub-component would have extra overhead otherwise. - * - * @private - * @fires Component#tap - * @listens Component#touchstart - * @listens Component#touchmove - * @listens Component#touchleave - * @listens Component#touchcancel - * @listens Component#touchend - */ - - - Component.prototype.emitTapEvents = function emitTapEvents() { - // Track the start time so we can determine how long the touch lasted - var touchStart = 0; - var firstTouch = null; - - // Maximum movement allowed during a touch event to still be considered a tap - // Other popular libs use anywhere from 2 (hammer.js) to 15, - // so 10 seems like a nice, round number. - var tapMovementThreshold = 10; - - // The maximum length a touch can be while still being considered a tap - var touchTimeThreshold = 200; - - var couldBeTap = void 0; - - this.on('touchstart', function (event) { - // If more than one finger, don't consider treating this as a click - if (event.touches.length === 1) { - // Copy pageX/pageY from the object - firstTouch = { - pageX: event.touches[0].pageX, - pageY: event.touches[0].pageY - }; - // Record start time so we can detect a tap vs. "touch and hold" - touchStart = new Date().getTime(); - // Reset couldBeTap tracking - couldBeTap = true; - } - }); - - this.on('touchmove', function (event) { - // If more than one finger, don't consider treating this as a click - if (event.touches.length > 1) { - couldBeTap = false; - } else if (firstTouch) { - // Some devices will throw touchmoves for all but the slightest of taps. - // So, if we moved only a small distance, this could still be a tap - var xdiff = event.touches[0].pageX - firstTouch.pageX; - var ydiff = event.touches[0].pageY - firstTouch.pageY; - var touchDistance = Math.sqrt(xdiff * xdiff + ydiff * ydiff); - - if (touchDistance > tapMovementThreshold) { - couldBeTap = false; - } - } - }); - - var noTap = function noTap() { - couldBeTap = false; - }; - - // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s - this.on('touchleave', noTap); - this.on('touchcancel', noTap); - - // When the touch ends, measure how long it took and trigger the appropriate - // event - this.on('touchend', function (event) { - firstTouch = null; - // Proceed only if the touchmove/leave/cancel event didn't happen - if (couldBeTap === true) { - // Measure how long the touch lasted - var touchTime = new Date().getTime() - touchStart; - - // Make sure the touch was less than the threshold to be considered a tap - if (touchTime < touchTimeThreshold) { - // Don't let browser turn this into a click - event.preventDefault(); - /** - * Triggered when a `Component` is tapped. - * - * @event Component#tap - * @type {EventTarget~Event} - */ - this.trigger('tap'); - // It may be good to copy the touchend event object and change the - // type to tap, if the other event properties aren't exact after - // Events.fixEvent runs (e.g. event.target) - } - } - }); - }; - - /** - * This function reports user activity whenever touch events happen. This can get - * turned off by any sub-components that wants touch events to act another way. - * - * Report user touch activity when touch events occur. User activity gets used to - * determine when controls should show/hide. It is simple when it comes to mouse - * events, because any mouse event should show the controls. So we capture mouse - * events that bubble up to the player and report activity when that happens. - * With touch events it isn't as easy as `touchstart` and `touchend` toggle player - * controls. So touch events can't help us at the player level either. - * - * User activity gets checked asynchronously. So what could happen is a tap event - * on the video turns the controls off. Then the `touchend` event bubbles up to - * the player. Which, if it reported user activity, would turn the controls right - * back on. We also don't want to completely block touch events from bubbling up. - * Furthermore a `touchmove` event and anything other than a tap, should not turn - * controls back on. - * - * @listens Component#touchstart - * @listens Component#touchmove - * @listens Component#touchend - * @listens Component#touchcancel - */ - - - Component.prototype.enableTouchActivity = function enableTouchActivity() { - // Don't continue if the root player doesn't support reporting user activity - if (!this.player() || !this.player().reportUserActivity) { - return; - } - - // listener for reporting that the user is active - var report = bind(this.player(), this.player().reportUserActivity); - - var touchHolding = void 0; - - this.on('touchstart', function () { - report(); - // For as long as the they are touching the device or have their mouse down, - // we consider them active even if they're not moving their finger or mouse. - // So we want to continue to update that they are active - this.clearInterval(touchHolding); - // report at the same interval as activityCheck - touchHolding = this.setInterval(report, 250); - }); - - var touchEnd = function touchEnd(event) { - report(); - // stop the interval that maintains activity if the touch is holding - this.clearInterval(touchHolding); - }; - - this.on('touchmove', report); - this.on('touchend', touchEnd); - this.on('touchcancel', touchEnd); - }; - - /** - * A callback that has no parameters and is bound into `Component`s context. - * - * @callback Component~GenericCallback - * @this Component - */ - - /** - * Creates a function that runs after an `x` millisecond timeout. This function is a - * wrapper around `window.setTimeout`. There are a few reasons to use this one - * instead though: - * 1. It gets cleared via {@link Component#clearTimeout} when - * {@link Component#dispose} gets called. - * 2. The function callback will gets turned into a {@link Component~GenericCallback} - * - * > Note: You can use `window.clearTimeout` on the id returned by this function. This - * will cause its dispose listener not to get cleaned up! Please use - * {@link Component#clearTimeout} or {@link Component#dispose}. - * - * @param {Component~GenericCallback} fn - * The function that will be run after `timeout`. - * - * @param {number} timeout - * Timeout in milliseconds to delay before executing the specified function. - * - * @return {number} - * Returns a timeout ID that gets used to identify the timeout. It can also - * get used in {@link Component#clearTimeout} to clear the timeout that - * was set. - * - * @listens Component#dispose - * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout} - */ - - - Component.prototype.setTimeout = function setTimeout(fn, timeout) { - var _this2 = this; - - fn = bind(this, fn); - - var timeoutId = window_1.setTimeout(fn, timeout); - var disposeFn = function disposeFn() { - return _this2.clearTimeout(timeoutId); - }; - - disposeFn.guid = 'vjs-timeout-' + timeoutId; - - this.on('dispose', disposeFn); - - return timeoutId; - }; - - /** - * Clears a timeout that gets created via `window.setTimeout` or - * {@link Component#setTimeout}. If you set a timeout via {@link Component#setTimeout} - * use this function instead of `window.clearTimout`. If you don't your dispose - * listener will not get cleaned up until {@link Component#dispose}! - * - * @param {number} timeoutId - * The id of the timeout to clear. The return value of - * {@link Component#setTimeout} or `window.setTimeout`. - * - * @return {number} - * Returns the timeout id that was cleared. - * - * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearTimeout} - */ - - - Component.prototype.clearTimeout = function clearTimeout(timeoutId) { - window_1.clearTimeout(timeoutId); - - var disposeFn = function disposeFn() { - }; - - disposeFn.guid = 'vjs-timeout-' + timeoutId; - - this.off('dispose', disposeFn); - - return timeoutId; - }; - - /** - * Creates a function that gets run every `x` milliseconds. This function is a wrapper - * around `window.setInterval`. There are a few reasons to use this one instead though. - * 1. It gets cleared via {@link Component#clearInterval} when - * {@link Component#dispose} gets called. - * 2. The function callback will be a {@link Component~GenericCallback} - * - * @param {Component~GenericCallback} fn - * The function to run every `x` seconds. - * - * @param {number} interval - * Execute the specified function every `x` milliseconds. - * - * @return {number} - * Returns an id that can be used to identify the interval. It can also be be used in - * {@link Component#clearInterval} to clear the interval. - * - * @listens Component#dispose - * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval} - */ - - - Component.prototype.setInterval = function setInterval(fn, interval) { - var _this3 = this; - - fn = bind(this, fn); - - var intervalId = window_1.setInterval(fn, interval); - - var disposeFn = function disposeFn() { - return _this3.clearInterval(intervalId); - }; - - disposeFn.guid = 'vjs-interval-' + intervalId; - - this.on('dispose', disposeFn); - - return intervalId; - }; - - /** - * Clears an interval that gets created via `window.setInterval` or - * {@link Component#setInterval}. If you set an inteval via {@link Component#setInterval} - * use this function instead of `window.clearInterval`. If you don't your dispose - * listener will not get cleaned up until {@link Component#dispose}! - * - * @param {number} intervalId - * The id of the interval to clear. The return value of - * {@link Component#setInterval} or `window.setInterval`. - * - * @return {number} - * Returns the interval id that was cleared. - * - * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearInterval} - */ - - - Component.prototype.clearInterval = function clearInterval(intervalId) { - window_1.clearInterval(intervalId); - - var disposeFn = function disposeFn() { - }; - - disposeFn.guid = 'vjs-interval-' + intervalId; - - this.off('dispose', disposeFn); - - return intervalId; - }; - - /** - * Queues up a callback to be passed to requestAnimationFrame (rAF), but - * with a few extra bonuses: - * - * - Supports browsers that do not support rAF by falling back to - * {@link Component#setTimeout}. - * - * - The callback is turned into a {@link Component~GenericCallback} (i.e. - * bound to the component). - * - * - Automatic cancellation of the rAF callback is handled if the component - * is disposed before it is called. - * - * @param {Component~GenericCallback} fn - * A function that will be bound to this component and executed just - * before the browser's next repaint. - * - * @return {number} - * Returns an rAF ID that gets used to identify the timeout. It can - * also be used in {@link Component#cancelAnimationFrame} to cancel - * the animation frame callback. - * - * @listens Component#dispose - * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame} - */ - - - Component.prototype.requestAnimationFrame = function requestAnimationFrame(fn) { - var _this4 = this; - - if (this.supportsRaf_) { - fn = bind(this, fn); - - var id = window_1.requestAnimationFrame(fn); - var disposeFn = function disposeFn() { - return _this4.cancelAnimationFrame(id); - }; - - disposeFn.guid = 'vjs-raf-' + id; - this.on('dispose', disposeFn); - - return id; - } - - // Fall back to using a timer. - return this.setTimeout(fn, 1000 / 60); - }; - - /** - * Cancels a queued callback passed to {@link Component#requestAnimationFrame} - * (rAF). - * - * If you queue an rAF callback via {@link Component#requestAnimationFrame}, - * use this function instead of `window.cancelAnimationFrame`. If you don't, - * your dispose listener will not get cleaned up until {@link Component#dispose}! - * - * @param {number} id - * The rAF ID to clear. The return value of {@link Component#requestAnimationFrame}. - * - * @return {number} - * Returns the rAF ID that was cleared. - * - * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/window/cancelAnimationFrame} - */ - - - Component.prototype.cancelAnimationFrame = function cancelAnimationFrame(id) { - if (this.supportsRaf_) { - window_1.cancelAnimationFrame(id); - - var disposeFn = function disposeFn() { - }; - - disposeFn.guid = 'vjs-raf-' + id; - - this.off('dispose', disposeFn); - - return id; - } - - // Fall back to using a timer. - return this.clearTimeout(id); - }; - - /** - * Register a `Component` with `videojs` given the name and the component. - * - * > NOTE: {@link Tech}s should not be registered as a `Component`. {@link Tech}s - * should be registered using {@link Tech.registerTech} or - * {@link videojs:videojs.registerTech}. - * - * > NOTE: This function can also be seen on videojs as - * {@link videojs:videojs.registerComponent}. - * - * @param {string} name - * The name of the `Component` to register. - * - * @param {Component} ComponentToRegister - * The `Component` class to register. - * - * @return {Component} - * The `Component` that was registered. - */ - - - Component.registerComponent = function registerComponent(name, ComponentToRegister) { - if (typeof name !== 'string' || !name) { - throw new Error('Illegal component name, "' + name + '"; must be a non-empty string.'); - } - - var Tech = Component.getComponent('Tech'); - - // We need to make sure this check is only done if Tech has been registered. - var isTech = Tech && Tech.isTech(ComponentToRegister); - var isComp = Component === ComponentToRegister || Component.prototype.isPrototypeOf(ComponentToRegister.prototype); - - if (isTech || !isComp) { - var reason = void 0; - - if (isTech) { - reason = 'techs must be registered using Tech.registerTech()'; - } else { - reason = 'must be a Component subclass'; - } - - throw new Error('Illegal component, "' + name + '"; ' + reason + '.'); - } - - name = toTitleCase(name); - - if (!Component.components_) { - Component.components_ = {}; - } - - var Player = Component.getComponent('Player'); - - if (name === 'Player' && Player && Player.players) { - var players = Player.players; - var playerNames = Object.keys(players); - - // If we have players that were disposed, then their name will still be - // in Players.players. So, we must loop through and verify that the value - // for each item is not null. This allows registration of the Player component - // after all players have been disposed or before any were created. - if (players && playerNames.length > 0 && playerNames.map(function (pname) { - return players[pname]; - }).every(Boolean)) { - throw new Error('Can not register Player component after player has been created.'); - } - } - - Component.components_[name] = ComponentToRegister; - - return ComponentToRegister; - }; - - /** - * Get a `Component` based on the name it was registered with. - * - * @param {string} name - * The Name of the component to get. - * - * @return {Component} - * The `Component` that got registered under the given name. - * - * @deprecated In `videojs` 6 this will not return `Component`s that were not - * registered using {@link Component.registerComponent}. Currently we - * check the global `videojs` object for a `Component` name and - * return that if it exists. - */ - - - Component.getComponent = function getComponent(name) { - if (!name) { - return; - } - - name = toTitleCase(name); - - if (Component.components_ && Component.components_[name]) { - return Component.components_[name]; - } - }; - - return Component; - }(); - - /** - * Whether or not this component supports `requestAnimationFrame`. - * - * This is exposed primarily for testing purposes. - * - * @private - * @type {Boolean} - */ - - - Component.prototype.supportsRaf_ = typeof window_1.requestAnimationFrame === 'function' && typeof window_1.cancelAnimationFrame === 'function'; - - Component.registerComponent('Component', Component); - - /** - * @file time-ranges.js - * @module time-ranges - */ - - /** - * Returns the time for the specified index at the start or end - * of a TimeRange object. - * - * @function time-ranges:indexFunction - * - * @param {number} [index=0] - * The range number to return the time for. - * - * @return {number} - * The time that offset at the specified index. - * - * @depricated index must be set to a value, in the future this will throw an error. - */ - - /** - * An object that contains ranges of time for various reasons. - * - * @typedef {Object} TimeRange - * - * @property {number} length - * The number of time ranges represented by this Object - * - * @property {time-ranges:indexFunction} start - * Returns the time offset at which a specified time range begins. - * - * @property {time-ranges:indexFunction} end - * Returns the time offset at which a specified time range begins. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges - */ - - /** - * Check if any of the time ranges are over the maximum index. - * - * @param {string} fnName - * The function name to use for logging - * - * @param {number} index - * The index to check - * - * @param {number} maxIndex - * The maximum possible index - * - * @throws {Error} if the timeRanges provided are over the maxIndex - */ - function rangeCheck(fnName, index, maxIndex) { - if (typeof index !== 'number' || index < 0 || index > maxIndex) { - throw new Error('Failed to execute \'' + fnName + '\' on \'TimeRanges\': The index provided (' + index + ') is non-numeric or out of bounds (0-' + maxIndex + ').'); - } - } - - /** - * Check if any of the time ranges are over the maximum index. - * - * @param {string} fnName - * The function name to use for logging - * - * @param {string} valueIndex - * The proprety that should be used to get the time. should be 'start' or 'end' - * - * @param {Array} ranges - * An array of time ranges - * - * @param {Array} [rangeIndex=0] - * The index to start the search at - * - * @return {number} - * The time that offset at the specified index. - * - * - * @depricated rangeIndex must be set to a value, in the future this will throw an error. - * @throws {Error} if rangeIndex is more than the length of ranges - */ - function getRange(fnName, valueIndex, ranges, rangeIndex) { - rangeCheck(fnName, rangeIndex, ranges.length - 1); - return ranges[rangeIndex][valueIndex]; - } - - /** - * Create a time range object givent ranges of time. - * - * @param {Array} [ranges] - * An array of time ranges. - */ - function createTimeRangesObj(ranges) { - if (ranges === undefined || ranges.length === 0) { - return { - length: 0, - start: function start() { - throw new Error('This TimeRanges object is empty'); - }, - end: function end() { - throw new Error('This TimeRanges object is empty'); - } - }; - } - return { - length: ranges.length, - start: getRange.bind(null, 'start', 0, ranges), - end: getRange.bind(null, 'end', 1, ranges) - }; - } - - /** - * Should create a fake `TimeRange` object which mimics an HTML5 time range instance. - * - * @param {number|Array} start - * The start of a single range or an array of ranges - * - * @param {number} end - * The end of a single range. - * - * @private - */ - function createTimeRanges(start, end) { - if (Array.isArray(start)) { - return createTimeRangesObj(start); - } else if (start === undefined || end === undefined) { - return createTimeRangesObj(); - } - return createTimeRangesObj([[start, end]]); - } - - /** - * @file buffer.js - * @module buffer - */ - /** - * Compute the percentage of the media that has been buffered. - * - * @param {TimeRange} buffered - * The current `TimeRange` object representing buffered time ranges - * - * @param {number} duration - * Total duration of the media - * - * @return {number} - * Percent buffered of the total duration in decimal form. - */ - function bufferedPercent(buffered, duration) { - var bufferedDuration = 0; - var start = void 0; - var end = void 0; - - if (!duration) { - return 0; - } - - if (!buffered || !buffered.length) { - buffered = createTimeRanges(0, 0); - } - - for (var i = 0; i < buffered.length; i++) { - start = buffered.start(i); - end = buffered.end(i); - - // buffered end can be bigger than duration by a very small fraction - if (end > duration) { - end = duration; - } - - bufferedDuration += end - start; - } - - return bufferedDuration / duration; - } - - /** - * @file fullscreen-api.js - * @module fullscreen-api - * @private - */ - /** - * Store the browser-specific methods for the fullscreen API. - * - * @type {Object} - * @see [Specification]{@link https://fullscreen.spec.whatwg.org} - * @see [Map Approach From Screenfull.js]{@link https://github.com/sindresorhus/screenfull.js} - */ - var FullscreenApi = {}; - -// browser API methods - var apiMap = [['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'], -// WebKit - ['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'], -// Old WebKit (Safari 5.1) - ['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'], -// Mozilla - ['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'], -// Microsoft - ['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']]; - - var specApi = apiMap[0]; - var browserApi = void 0; - -// determine the supported set of functions - for (var i = 0; i < apiMap.length; i++) { - // check for exitFullscreen function - if (apiMap[i][1] in document_1) { - browserApi = apiMap[i]; - break; - } - } - -// map the browser API names to the spec API names - if (browserApi) { - for (var _i = 0; _i < browserApi.length; _i++) { - FullscreenApi[specApi[_i]] = browserApi[_i]; - } - } - - /** - * @file media-error.js - */ - /** - * A Custom `MediaError` class which mimics the standard HTML5 `MediaError` class. - * - * @param {number|string|Object|MediaError} value - * This can be of multiple types: - * - number: should be a standard error code - * - string: an error message (the code will be 0) - * - Object: arbitrary properties - * - `MediaError` (native): used to populate a video.js `MediaError` object - * - `MediaError` (video.js): will return itself if it's already a - * video.js `MediaError` object. - * - * @see [MediaError Spec]{@link https://dev.w3.org/html5/spec-author-view/video.html#mediaerror} - * @see [Encrypted MediaError Spec]{@link https://www.w3.org/TR/2013/WD-encrypted-media-20130510/#error-codes} - * - * @class MediaError - */ - function MediaError(value) { - - // Allow redundant calls to this constructor to avoid having `instanceof` - // checks peppered around the code. - if (value instanceof MediaError) { - return value; - } - - if (typeof value === 'number') { - this.code = value; - } else if (typeof value === 'string') { - // default code is zero, so this is a custom error - this.message = value; - } else if (isObject(value)) { - - // We assign the `code` property manually because native `MediaError` objects - // do not expose it as an own/enumerable property of the object. - if (typeof value.code === 'number') { - this.code = value.code; - } - - assign(this, value); - } - - if (!this.message) { - this.message = MediaError.defaultMessages[this.code] || ''; - } - } - - /** - * The error code that refers two one of the defined `MediaError` types - * - * @type {Number} - */ - MediaError.prototype.code = 0; - - /** - * An optional message that to show with the error. Message is not part of the HTML5 - * video spec but allows for more informative custom errors. - * - * @type {String} - */ - MediaError.prototype.message = ''; - - /** - * An optional status code that can be set by plugins to allow even more detail about - * the error. For example a plugin might provide a specific HTTP status code and an - * error message for that code. Then when the plugin gets that error this class will - * know how to display an error message for it. This allows a custom message to show - * up on the `Player` error overlay. - * - * @type {Array} - */ - MediaError.prototype.status = null; - - /** - * Errors indexed by the W3C standard. The order **CANNOT CHANGE**! See the - * specification listed under {@link MediaError} for more information. - * - * @enum {array} - * @readonly - * @property {string} 0 - MEDIA_ERR_CUSTOM - * @property {string} 1 - MEDIA_ERR_CUSTOM - * @property {string} 2 - MEDIA_ERR_ABORTED - * @property {string} 3 - MEDIA_ERR_NETWORK - * @property {string} 4 - MEDIA_ERR_SRC_NOT_SUPPORTED - * @property {string} 5 - MEDIA_ERR_ENCRYPTED - */ - MediaError.errorTypes = ['MEDIA_ERR_CUSTOM', 'MEDIA_ERR_ABORTED', 'MEDIA_ERR_NETWORK', 'MEDIA_ERR_DECODE', 'MEDIA_ERR_SRC_NOT_SUPPORTED', 'MEDIA_ERR_ENCRYPTED']; - - /** - * The default `MediaError` messages based on the {@link MediaError.errorTypes}. - * - * @type {Array} - * @constant - */ - MediaError.defaultMessages = { - 1: 'You aborted the media playback', - 2: 'A network error caused the media download to fail part-way.', - 3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.', - 4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.', - 5: 'The media is encrypted and we do not have the keys to decrypt it.' - }; - -// Add types as properties on MediaError -// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4; - for (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) { - MediaError[MediaError.errorTypes[errNum]] = errNum; - // values should be accessible on both the class and instance - MediaError.prototype[MediaError.errorTypes[errNum]] = errNum; - } - - var tuple = SafeParseTuple; - - function SafeParseTuple(obj, reviver) { - var json; - var error = null; - - try { - json = JSON.parse(obj, reviver); - } catch (err) { - error = err; - } - - return [error, json] - } - - /** - * @file text-track-list-converter.js Utilities for capturing text track state and - * re-creating tracks based on a capture. - * - * @module text-track-list-converter - */ - - /** - * Examine a single {@link TextTrack} and return a JSON-compatible javascript object that - * represents the {@link TextTrack}'s state. - * - * @param {TextTrack} track - * The text track to query. - * - * @return {Object} - * A serializable javascript representation of the TextTrack. - * @private - */ - var trackToJson_ = function trackToJson_(track) { - var ret = ['kind', 'label', 'language', 'id', 'inBandMetadataTrackDispatchType', 'mode', 'src'].reduce(function (acc, prop, i) { - - if (track[prop]) { - acc[prop] = track[prop]; - } - - return acc; - }, { - cues: track.cues && Array.prototype.map.call(track.cues, function (cue) { - return { - startTime: cue.startTime, - endTime: cue.endTime, - text: cue.text, - id: cue.id - }; - }) - }); - - return ret; - }; - - /** - * Examine a {@link Tech} and return a JSON-compatible javascript array that represents the - * state of all {@link TextTrack}s currently configured. The return array is compatible with - * {@link text-track-list-converter:jsonToTextTracks}. - * - * @param {Tech} tech - * The tech object to query - * - * @return {Array} - * A serializable javascript representation of the {@link Tech}s - * {@link TextTrackList}. - */ - var textTracksToJson = function textTracksToJson(tech) { - - var trackEls = tech.$$('track'); - - var trackObjs = Array.prototype.map.call(trackEls, function (t) { - return t.track; - }); - var tracks = Array.prototype.map.call(trackEls, function (trackEl) { - var json = trackToJson_(trackEl.track); - - if (trackEl.src) { - json.src = trackEl.src; - } - return json; - }); - - return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function (track) { - return trackObjs.indexOf(track) === -1; - }).map(trackToJson_)); - }; - - /** - * Create a set of remote {@link TextTrack}s on a {@link Tech} based on an array of javascript - * object {@link TextTrack} representations. - * - * @param {Array} json - * An array of `TextTrack` representation objects, like those that would be - * produced by `textTracksToJson`. - * - * @param {Tech} tech - * The `Tech` to create the `TextTrack`s on. - */ - var jsonToTextTracks = function jsonToTextTracks(json, tech) { - json.forEach(function (track) { - var addedTrack = tech.addRemoteTextTrack(track).track; - - if (!track.src && track.cues) { - track.cues.forEach(function (cue) { - return addedTrack.addCue(cue); - }); - } - }); - - return tech.textTracks(); - }; - - var textTrackConverter = {textTracksToJson: textTracksToJson, jsonToTextTracks: jsonToTextTracks, trackToJson_: trackToJson_}; - - /** - * @file modal-dialog.js - */ - var MODAL_CLASS_NAME = 'vjs-modal-dialog'; - var ESC = 27; - - /** - * The `ModalDialog` displays over the video and its controls, which blocks - * interaction with the player until it is closed. - * - * Modal dialogs include a "Close" button and will close when that button - * is activated - or when ESC is pressed anywhere. - * - * @extends Component - */ - - var ModalDialog = function (_Component) { - inherits(ModalDialog, _Component); - - /** - * Create an instance of this class. - * - * @param {Player} player - * The `Player` that this class should be attached to. - * - * @param {Object} [options] - * The key/value store of player options. - * - * @param {Mixed} [options.content=undefined] - * Provide customized content for this modal. - * - * @param {string} [options.description] - * A text description for the modal, primarily for accessibility. - * - * @param {boolean} [options.fillAlways=false] - * Normally, modals are automatically filled only the first time - * they open. This tells the modal to refresh its content - * every time it opens. - * - * @param {string} [options.label] - * A text label for the modal, primarily for accessibility. - * - * @param {boolean} [options.temporary=true] - * If `true`, the modal can only be opened once; it will be - * disposed as soon as it's closed. - * - * @param {boolean} [options.uncloseable=false] - * If `true`, the user will not be able to close the modal - * through the UI in the normal ways. Programmatic closing is - * still possible. - */ - function ModalDialog(player, options) { - classCallCheck(this, ModalDialog); - - var _this = possibleConstructorReturn(this, _Component.call(this, player, options)); - - _this.opened_ = _this.hasBeenOpened_ = _this.hasBeenFilled_ = false; - - _this.closeable(!_this.options_.uncloseable); - _this.content(_this.options_.content); - - // Make sure the contentEl is defined AFTER any children are initialized - // because we only want the contents of the modal in the contentEl - // (not the UI elements like the close button). - _this.contentEl_ = createEl('div', { - className: MODAL_CLASS_NAME + '-content' - }, { - role: 'document' - }); - - _this.descEl_ = createEl('p', { - className: MODAL_CLASS_NAME + '-description vjs-control-text', - id: _this.el().getAttribute('aria-describedby') - }); - - textContent(_this.descEl_, _this.description()); - _this.el_.appendChild(_this.descEl_); - _this.el_.appendChild(_this.contentEl_); - return _this; - } - - /** - * Create the `ModalDialog`'s DOM element - * - * @return {Element} - * The DOM element that gets created. - */ - - - ModalDialog.prototype.createEl = function createEl$$1() { - return _Component.prototype.createEl.call(this, 'div', { - className: this.buildCSSClass(), - tabIndex: -1 - }, { - 'aria-describedby': this.id() + '_description', - 'aria-hidden': 'true', - 'aria-label': this.label(), - 'role': 'dialog' - }); - }; - - /** - * Builds the default DOM `className`. - * - * @return {string} - * The DOM `className` for this object. - */ - - - ModalDialog.prototype.buildCSSClass = function buildCSSClass() { - return MODAL_CLASS_NAME + ' vjs-hidden ' + _Component.prototype.buildCSSClass.call(this); - }; - - /** - * Handles `keydown` events on the document, looking for ESC, which closes - * the modal. - * - * @param {EventTarget~Event} e - * The keypress that triggered this event. - * - * @listens keydown - */ - - - ModalDialog.prototype.handleKeyPress = function handleKeyPress(e) { - if (e.which === ESC && this.closeable()) { - this.close(); - } - }; - - /** - * Returns the label string for this modal. Primarily used for accessibility. - * - * @return {string} - * the localized or raw label of this modal. - */ - - - ModalDialog.prototype.label = function label() { - return this.localize(this.options_.label || 'Modal Window'); - }; - - /** - * Returns the description string for this modal. Primarily used for - * accessibility. - * - * @return {string} - * The localized or raw description of this modal. - */ - - - ModalDialog.prototype.description = function description() { - var desc = this.options_.description || this.localize('This is a modal window.'); - - // Append a universal closeability message if the modal is closeable. - if (this.closeable()) { - desc += ' ' + this.localize('This modal can be closed by pressing the Escape key or activating the close button.'); - } - - return desc; - }; - - /** - * Opens the modal. - * - * @fires ModalDialog#beforemodalopen - * @fires ModalDialog#modalopen - */ - - - ModalDialog.prototype.open = function open() { - if (!this.opened_) { - var player = this.player(); - - /** - * Fired just before a `ModalDialog` is opened. - * - * @event ModalDialog#beforemodalopen - * @type {EventTarget~Event} - */ - this.trigger('beforemodalopen'); - this.opened_ = true; - - // Fill content if the modal has never opened before and - // never been filled. - if (this.options_.fillAlways || !this.hasBeenOpened_ && !this.hasBeenFilled_) { - this.fill(); - } - - // If the player was playing, pause it and take note of its previously - // playing state. - this.wasPlaying_ = !player.paused(); - - if (this.options_.pauseOnOpen && this.wasPlaying_) { - player.pause(); - } - - if (this.closeable()) { - this.on(this.el_.ownerDocument, 'keydown', bind(this, this.handleKeyPress)); - } - - // Hide controls and note if they were enabled. - this.hadControls_ = player.controls(); - player.controls(false); - - this.show(); - this.conditionalFocus_(); - this.el().setAttribute('aria-hidden', 'false'); - - /** - * Fired just after a `ModalDialog` is opened. - * - * @event ModalDialog#modalopen - * @type {EventTarget~Event} - */ - this.trigger('modalopen'); - this.hasBeenOpened_ = true; - } - }; - - /** - * If the `ModalDialog` is currently open or closed. - * - * @param {boolean} [value] - * If given, it will open (`true`) or close (`false`) the modal. - * - * @return {boolean} - * the current open state of the modaldialog - */ - - - ModalDialog.prototype.opened = function opened(value) { - if (typeof value === 'boolean') { - this[value ? 'open' : 'close'](); - } - return this.opened_; - }; - - /** - * Closes the modal, does nothing if the `ModalDialog` is - * not open. - * - * @fires ModalDialog#beforemodalclose - * @fires ModalDialog#modalclose - */ - - - ModalDialog.prototype.close = function close() { - if (!this.opened_) { - return; - } - var player = this.player(); - - /** - * Fired just before a `ModalDialog` is closed. - * - * @event ModalDialog#beforemodalclose - * @type {EventTarget~Event} - */ - this.trigger('beforemodalclose'); - this.opened_ = false; - - if (this.wasPlaying_ && this.options_.pauseOnOpen) { - player.play(); - } - - if (this.closeable()) { - this.off(this.el_.ownerDocument, 'keydown', bind(this, this.handleKeyPress)); - } - - if (this.hadControls_) { - player.controls(true); - } - - this.hide(); - this.el().setAttribute('aria-hidden', 'true'); - - /** - * Fired just after a `ModalDialog` is closed. - * - * @event ModalDialog#modalclose - * @type {EventTarget~Event} - */ - this.trigger('modalclose'); - this.conditionalBlur_(); - - if (this.options_.temporary) { - this.dispose(); - } - }; - - /** - * Check to see if the `ModalDialog` is closeable via the UI. - * - * @param {boolean} [value] - * If given as a boolean, it will set the `closeable` option. - * - * @return {boolean} - * Returns the final value of the closable option. - */ - - - ModalDialog.prototype.closeable = function closeable(value) { - if (typeof value === 'boolean') { - var closeable = this.closeable_ = !!value; - var close = this.getChild('closeButton'); - - // If this is being made closeable and has no close button, add one. - if (closeable && !close) { - - // The close button should be a child of the modal - not its - // content element, so temporarily change the content element. - var temp = this.contentEl_; - - this.contentEl_ = this.el_; - close = this.addChild('closeButton', {controlText: 'Close Modal Dialog'}); - this.contentEl_ = temp; - this.on(close, 'close', this.close); - } - - // If this is being made uncloseable and has a close button, remove it. - if (!closeable && close) { - this.off(close, 'close', this.close); - this.removeChild(close); - close.dispose(); - } - } - return this.closeable_; - }; - - /** - * Fill the modal's content element with the modal's "content" option. - * The content element will be emptied before this change takes place. - */ - - - ModalDialog.prototype.fill = function fill() { - this.fillWith(this.content()); - }; - - /** - * Fill the modal's content element with arbitrary content. - * The content element will be emptied before this change takes place. - * - * @fires ModalDialog#beforemodalfill - * @fires ModalDialog#modalfill - * - * @param {Mixed} [content] - * The same rules apply to this as apply to the `content` option. - */ - - - ModalDialog.prototype.fillWith = function fillWith(content) { - var contentEl = this.contentEl(); - var parentEl = contentEl.parentNode; - var nextSiblingEl = contentEl.nextSibling; - - /** - * Fired just before a `ModalDialog` is filled with content. - * - * @event ModalDialog#beforemodalfill - * @type {EventTarget~Event} - */ - this.trigger('beforemodalfill'); - this.hasBeenFilled_ = true; - - // Detach the content element from the DOM before performing - // manipulation to avoid modifying the live DOM multiple times. - parentEl.removeChild(contentEl); - this.empty(); - insertContent(contentEl, content); - /** - * Fired just after a `ModalDialog` is filled with content. - * - * @event ModalDialog#modalfill - * @type {EventTarget~Event} - */ - this.trigger('modalfill'); - - // Re-inject the re-filled content element. - if (nextSiblingEl) { - parentEl.insertBefore(contentEl, nextSiblingEl); - } else { - parentEl.appendChild(contentEl); - } - - // make sure that the close button is last in the dialog DOM - var closeButton = this.getChild('closeButton'); - - if (closeButton) { - parentEl.appendChild(closeButton.el_); - } - }; - - /** - * Empties the content element. This happens anytime the modal is filled. - * - * @fires ModalDialog#beforemodalempty - * @fires ModalDialog#modalempty - */ - - - ModalDialog.prototype.empty = function empty() { - /** - * Fired just before a `ModalDialog` is emptied. - * - * @event ModalDialog#beforemodalempty - * @type {EventTarget~Event} - */ - this.trigger('beforemodalempty'); - emptyEl(this.contentEl()); - - /** - * Fired just after a `ModalDialog` is emptied. - * - * @event ModalDialog#modalempty - * @type {EventTarget~Event} - */ - this.trigger('modalempty'); - }; - - /** - * Gets or sets the modal content, which gets normalized before being - * rendered into the DOM. - * - * This does not update the DOM or fill the modal, but it is called during - * that process. - * - * @param {Mixed} [value] - * If defined, sets the internal content value to be used on the - * next call(s) to `fill`. This value is normalized before being - * inserted. To "clear" the internal content value, pass `null`. - * - * @return {Mixed} - * The current content of the modal dialog - */ - - - ModalDialog.prototype.content = function content(value) { - if (typeof value !== 'undefined') { - this.content_ = value; - } - return this.content_; - }; - - /** - * conditionally focus the modal dialog if focus was previously on the player. - * - * @private - */ - - - ModalDialog.prototype.conditionalFocus_ = function conditionalFocus_() { - var activeEl = document_1.activeElement; - var playerEl = this.player_.el_; - - this.previouslyActiveEl_ = null; - - if (playerEl.contains(activeEl) || playerEl === activeEl) { - this.previouslyActiveEl_ = activeEl; - - this.focus(); - - this.on(document_1, 'keydown', this.handleKeyDown); - } - }; - - /** - * conditionally blur the element and refocus the last focused element - * - * @private - */ - - - ModalDialog.prototype.conditionalBlur_ = function conditionalBlur_() { - if (this.previouslyActiveEl_) { - this.previouslyActiveEl_.focus(); - this.previouslyActiveEl_ = null; - } - - this.off(document_1, 'keydown', this.handleKeyDown); - }; - - /** - * Keydown handler. Attached when modal is focused. - * - * @listens keydown - */ - - - ModalDialog.prototype.handleKeyDown = function handleKeyDown(event) { - // exit early if it isn't a tab key - if (event.which !== 9) { - return; - } - - var focusableEls = this.focusableEls_(); - var activeEl = this.el_.querySelector(':focus'); - var focusIndex = void 0; - - for (var i = 0; i < focusableEls.length; i++) { - if (activeEl === focusableEls[i]) { - focusIndex = i; - break; - } - } - - if (document_1.activeElement === this.el_) { - focusIndex = 0; - } - - if (event.shiftKey && focusIndex === 0) { - focusableEls[focusableEls.length - 1].focus(); - event.preventDefault(); - } else if (!event.shiftKey && focusIndex === focusableEls.length - 1) { - focusableEls[0].focus(); - event.preventDefault(); - } - }; - - /** - * get all focusable elements - * - * @private - */ - - - ModalDialog.prototype.focusableEls_ = function focusableEls_() { - var allChildren = this.el_.querySelectorAll('*'); - - return Array.prototype.filter.call(allChildren, function (child) { - return (child instanceof window_1.HTMLAnchorElement || child instanceof window_1.HTMLAreaElement) && child.hasAttribute('href') || (child instanceof window_1.HTMLInputElement || child instanceof window_1.HTMLSelectElement || child instanceof window_1.HTMLTextAreaElement || child instanceof window_1.HTMLButtonElement) && !child.hasAttribute('disabled') || child instanceof window_1.HTMLIFrameElement || child instanceof window_1.HTMLObjectElement || child instanceof window_1.HTMLEmbedElement || child.hasAttribute('tabindex') && child.getAttribute('tabindex') !== -1 || child.hasAttribute('contenteditable'); - }); - }; - - return ModalDialog; - }(Component); - - /** - * Default options for `ModalDialog` default options. - * - * @type {Object} - * @private - */ - - - ModalDialog.prototype.options_ = { - pauseOnOpen: true, - temporary: true - }; - - Component.registerComponent('ModalDialog', ModalDialog); - - /** - * @file track-list.js - */ - /** - * Common functionaliy between {@link TextTrackList}, {@link AudioTrackList}, and - * {@link VideoTrackList} - * - * @extends EventTarget - */ - - var TrackList = function (_EventTarget) { - inherits(TrackList, _EventTarget); - - /** - * Create an instance of this class - * - * @param {Track[]} tracks - * A list of tracks to initialize the list with. - * - * @param {Object} [list] - * The child object with inheritance done manually for ie8. - * - * @abstract - */ - function TrackList() { - var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - - var _ret; - - var list = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - classCallCheck(this, TrackList); - - var _this = possibleConstructorReturn(this, _EventTarget.call(this)); - - if (!list) { - list = _this; // eslint-disable-line - if (IS_IE8) { - list = document_1.createElement('custom'); - for (var prop in TrackList.prototype) { - if (prop !== 'constructor') { - list[prop] = TrackList.prototype[prop]; - } - } - } - } - - list.tracks_ = []; - - /** - * @memberof TrackList - * @member {number} length - * The current number of `Track`s in the this Trackist. - * @instance - */ - Object.defineProperty(list, 'length', { - get: function get$$1() { - return this.tracks_.length; - } - }); - - for (var i = 0; i < tracks.length; i++) { - list.addTrack(tracks[i]); - } - - // must return the object, as for ie8 it will not be this - // but a reference to a document object - return _ret = list, possibleConstructorReturn(_this, _ret); - } - - /** - * Add a {@link Track} to the `TrackList` - * - * @param {Track} track - * The audio, video, or text track to add to the list. - * - * @fires TrackList#addtrack - */ - - - TrackList.prototype.addTrack = function addTrack(track) { - var index = this.tracks_.length; - - if (!('' + index in this)) { - Object.defineProperty(this, index, { - get: function get$$1() { - return this.tracks_[index]; - } - }); - } - - // Do not add duplicate tracks - if (this.tracks_.indexOf(track) === -1) { - this.tracks_.push(track); - /** - * Triggered when a track is added to a track list. - * - * @event TrackList#addtrack - * @type {EventTarget~Event} - * @property {Track} track - * A reference to track that was added. - */ - this.trigger({ - track: track, - type: 'addtrack' - }); - } - }; - - /** - * Remove a {@link Track} from the `TrackList` - * - * @param {Track} rtrack - * The audio, video, or text track to remove from the list. - * - * @fires TrackList#removetrack - */ - - - TrackList.prototype.removeTrack = function removeTrack(rtrack) { - var track = void 0; - - for (var i = 0, l = this.length; i < l; i++) { - if (this[i] === rtrack) { - track = this[i]; - if (track.off) { - track.off(); - } - - this.tracks_.splice(i, 1); - - break; - } - } - - if (!track) { - return; - } - - /** - * Triggered when a track is removed from track list. - * - * @event TrackList#removetrack - * @type {EventTarget~Event} - * @property {Track} track - * A reference to track that was removed. - */ - this.trigger({ - track: track, - type: 'removetrack' - }); - }; - - /** - * Get a Track from the TrackList by a tracks id - * - * @param {String} id - the id of the track to get - * @method getTrackById - * @return {Track} - * @private - */ - - - TrackList.prototype.getTrackById = function getTrackById(id) { - var result = null; - - for (var i = 0, l = this.length; i < l; i++) { - var track = this[i]; - - if (track.id === id) { - result = track; - break; - } - } - - return result; - }; - - return TrackList; - }(EventTarget); - - /** - * Triggered when a different track is selected/enabled. - * - * @event TrackList#change - * @type {EventTarget~Event} - */ - - /** - * Events that can be called with on + eventName. See {@link EventHandler}. - * - * @property {Object} TrackList#allowedEvents_ - * @private - */ - - - TrackList.prototype.allowedEvents_ = { - change: 'change', - addtrack: 'addtrack', - removetrack: 'removetrack' - }; - -// emulate attribute EventHandler support to allow for feature detection - for (var event in TrackList.prototype.allowedEvents_) { - TrackList.prototype['on' + event] = null; - } - - /** - * @file audio-track-list.js - */ - /** - * Anywhere we call this function we diverge from the spec - * as we only support one enabled audiotrack at a time - * - * @param {AudioTrackList} list - * list to work on - * - * @param {AudioTrack} track - * The track to skip - * - * @private - */ - var disableOthers = function disableOthers(list, track) { - for (var i = 0; i < list.length; i++) { - if (!Object.keys(list[i]).length || track.id === list[i].id) { - continue; - } - // another audio track is enabled, disable it - list[i].enabled = false; - } - }; - - /** - * The current list of {@link AudioTrack} for a media file. - * - * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist} - * @extends TrackList - */ - - var AudioTrackList = function (_TrackList) { - inherits(AudioTrackList, _TrackList); - - /** - * Create an instance of this class. - * - * @param {AudioTrack[]} [tracks=[]] - * A list of `AudioTrack` to instantiate the list with. - */ - function AudioTrackList() { - var _this, _ret; - - var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - classCallCheck(this, AudioTrackList); - - var list = void 0; - - // make sure only 1 track is enabled - // sorted from last index to first index - for (var i = tracks.length - 1; i >= 0; i--) { - if (tracks[i].enabled) { - disableOthers(tracks, tracks[i]); - break; - } - } - - // IE8 forces us to implement inheritance ourselves - // as it does not support Object.defineProperty properly - if (IS_IE8) { - list = document_1.createElement('custom'); - for (var prop in TrackList.prototype) { - if (prop !== 'constructor') { - list[prop] = TrackList.prototype[prop]; - } - } - for (var _prop in AudioTrackList.prototype) { - if (_prop !== 'constructor') { - list[_prop] = AudioTrackList.prototype[_prop]; - } - } - } - - list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this); - list.changing_ = false; - - return _ret = list, possibleConstructorReturn(_this, _ret); - } - - /** - * Add an {@link AudioTrack} to the `AudioTrackList`. - * - * @param {AudioTrack} track - * The AudioTrack to add to the list - * - * @fires TrackList#addtrack - */ - - - AudioTrackList.prototype.addTrack = function addTrack(track) { - var _this2 = this; - - if (track.enabled) { - disableOthers(this, track); - } - - _TrackList.prototype.addTrack.call(this, track); - // native tracks don't have this - if (!track.addEventListener) { - return; - } - - /** - * @listens AudioTrack#enabledchange - * @fires TrackList#change - */ - track.addEventListener('enabledchange', function () { - // when we are disabling other tracks (since we don't support - // more than one track at a time) we will set changing_ - // to true so that we don't trigger additional change events - if (_this2.changing_) { - return; - } - _this2.changing_ = true; - disableOthers(_this2, track); - _this2.changing_ = false; - _this2.trigger('change'); - }); - }; - - return AudioTrackList; - }(TrackList); - - /** - * @file video-track-list.js - */ - /** - * Un-select all other {@link VideoTrack}s that are selected. - * - * @param {VideoTrackList} list - * list to work on - * - * @param {VideoTrack} track - * The track to skip - * - * @private - */ - var disableOthers$1 = function disableOthers(list, track) { - for (var i = 0; i < list.length; i++) { - if (!Object.keys(list[i]).length || track.id === list[i].id) { - continue; - } - // another video track is enabled, disable it - list[i].selected = false; - } - }; - - /** - * The current list of {@link VideoTrack} for a video. - * - * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist} - * @extends TrackList - */ - - var VideoTrackList = function (_TrackList) { - inherits(VideoTrackList, _TrackList); - - /** - * Create an instance of this class. - * - * @param {VideoTrack[]} [tracks=[]] - * A list of `VideoTrack` to instantiate the list with. - */ - function VideoTrackList() { - var _this, _ret; - - var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - classCallCheck(this, VideoTrackList); - - var list = void 0; - - // make sure only 1 track is enabled - // sorted from last index to first index - for (var i = tracks.length - 1; i >= 0; i--) { - if (tracks[i].selected) { - disableOthers$1(tracks, tracks[i]); - break; - } - } - - // IE8 forces us to implement inheritance ourselves - // as it does not support Object.defineProperty properly - if (IS_IE8) { - list = document_1.createElement('custom'); - for (var prop in TrackList.prototype) { - if (prop !== 'constructor') { - list[prop] = TrackList.prototype[prop]; - } - } - for (var _prop in VideoTrackList.prototype) { - if (_prop !== 'constructor') { - list[_prop] = VideoTrackList.prototype[_prop]; - } - } - } - - list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this); - list.changing_ = false; - - /** - * @member {number} VideoTrackList#selectedIndex - * The current index of the selected {@link VideoTrack`}. - */ - Object.defineProperty(list, 'selectedIndex', { - get: function get$$1() { - for (var _i = 0; _i < this.length; _i++) { - if (this[_i].selected) { - return _i; - } - } - return -1; - }, - set: function set$$1() { - } - }); - - return _ret = list, possibleConstructorReturn(_this, _ret); - } - - /** - * Add a {@link VideoTrack} to the `VideoTrackList`. - * - * @param {VideoTrack} track - * The VideoTrack to add to the list - * - * @fires TrackList#addtrack - */ - - - VideoTrackList.prototype.addTrack = function addTrack(track) { - var _this2 = this; - - if (track.selected) { - disableOthers$1(this, track); - } - - _TrackList.prototype.addTrack.call(this, track); - // native tracks don't have this - if (!track.addEventListener) { - return; - } - - /** - * @listens VideoTrack#selectedchange - * @fires TrackList#change - */ - track.addEventListener('selectedchange', function () { - if (_this2.changing_) { - return; - } - _this2.changing_ = true; - disableOthers$1(_this2, track); - _this2.changing_ = false; - _this2.trigger('change'); - }); - }; - - return VideoTrackList; - }(TrackList); - - /** - * @file text-track-list.js - */ - /** - * The current list of {@link TextTrack} for a media file. - * - * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist} - * @extends TrackList - */ - - var TextTrackList = function (_TrackList) { - inherits(TextTrackList, _TrackList); - - /** - * Create an instance of this class. - * - * @param {TextTrack[]} [tracks=[]] - * A list of `TextTrack` to instantiate the list with. - */ - function TextTrackList() { - var _this, _ret; - - var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - classCallCheck(this, TextTrackList); - - var list = void 0; - - // IE8 forces us to implement inheritance ourselves - // as it does not support Object.defineProperty properly - if (IS_IE8) { - list = document_1.createElement('custom'); - for (var prop in TrackList.prototype) { - if (prop !== 'constructor') { - list[prop] = TrackList.prototype[prop]; - } - } - for (var _prop in TextTrackList.prototype) { - if (_prop !== 'constructor') { - list[_prop] = TextTrackList.prototype[_prop]; - } - } - } - - list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this); - return _ret = list, possibleConstructorReturn(_this, _ret); - } - - /** - * Add a {@link TextTrack} to the `TextTrackList` - * - * @param {TextTrack} track - * The text track to add to the list. - * - * @fires TrackList#addtrack - */ - - - TextTrackList.prototype.addTrack = function addTrack(track) { - _TrackList.prototype.addTrack.call(this, track); - - /** - * @listens TextTrack#modechange - * @fires TrackList#change - */ - track.addEventListener('modechange', bind(this, function () { - this.trigger('change'); - })); - - var nonLanguageTextTrackKind = ['metadata', 'chapters']; - - if (nonLanguageTextTrackKind.indexOf(track.kind) === -1) { - track.addEventListener('modechange', bind(this, function () { - this.trigger('selectedlanguagechange'); - })); - } - }; - - return TextTrackList; - }(TrackList); - - /** - * @file html-track-element-list.js - */ - - /** - * The current list of {@link HtmlTrackElement}s. - */ - - var HtmlTrackElementList = function () { - - /** - * Create an instance of this class. - * - * @param {HtmlTrackElement[]} [tracks=[]] - * A list of `HtmlTrackElement` to instantiate the list with. - */ - function HtmlTrackElementList() { - var trackElements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - classCallCheck(this, HtmlTrackElementList); - - var list = this; // eslint-disable-line - - if (IS_IE8) { - list = document_1.createElement('custom'); - - for (var prop in HtmlTrackElementList.prototype) { - if (prop !== 'constructor') { - list[prop] = HtmlTrackElementList.prototype[prop]; - } - } - } - - list.trackElements_ = []; - - /** - * @memberof HtmlTrackElementList - * @member {number} length - * The current number of `Track`s in the this Trackist. - * @instance - */ - Object.defineProperty(list, 'length', { - get: function get$$1() { - return this.trackElements_.length; - } - }); - - for (var i = 0, length = trackElements.length; i < length; i++) { - list.addTrackElement_(trackElements[i]); - } - - if (IS_IE8) { - return list; - } - } - - /** - * Add an {@link HtmlTrackElement} to the `HtmlTrackElementList` - * - * @param {HtmlTrackElement} trackElement - * The track element to add to the list. - * - * @private - */ - - - HtmlTrackElementList.prototype.addTrackElement_ = function addTrackElement_(trackElement) { - var index = this.trackElements_.length; - - if (!('' + index in this)) { - Object.defineProperty(this, index, { - get: function get$$1() { - return this.trackElements_[index]; - } - }); - } - - // Do not add duplicate elements - if (this.trackElements_.indexOf(trackElement) === -1) { - this.trackElements_.push(trackElement); - } - }; - - /** - * Get an {@link HtmlTrackElement} from the `HtmlTrackElementList` given an - * {@link TextTrack}. - * - * @param {TextTrack} track - * The track associated with a track element. - * - * @return {HtmlTrackElement|undefined} - * The track element that was found or undefined. - * - * @private - */ - - - HtmlTrackElementList.prototype.getTrackElementByTrack_ = function getTrackElementByTrack_(track) { - var trackElement_ = void 0; - - for (var i = 0, length = this.trackElements_.length; i < length; i++) { - if (track === this.trackElements_[i].track) { - trackElement_ = this.trackElements_[i]; - - break; - } - } - - return trackElement_; - }; - - /** - * Remove a {@link HtmlTrackElement} from the `HtmlTrackElementList` - * - * @param {HtmlTrackElement} trackElement - * The track element to remove from the list. - * - * @private - */ - - - HtmlTrackElementList.prototype.removeTrackElement_ = function removeTrackElement_(trackElement) { - for (var i = 0, length = this.trackElements_.length; i < length; i++) { - if (trackElement === this.trackElements_[i]) { - this.trackElements_.splice(i, 1); - - break; - } - } - }; - - return HtmlTrackElementList; - }(); - - /** - * @file text-track-cue-list.js - */ - /** - * @typedef {Object} TextTrackCueList~TextTrackCue - * - * @property {string} id - * The unique id for this text track cue - * - * @property {number} startTime - * The start time for this text track cue - * - * @property {number} endTime - * The end time for this text track cue - * - * @property {boolean} pauseOnExit - * Pause when the end time is reached if true. - * - * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcue} - */ - - /** - * A List of TextTrackCues. - * - * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist} - */ - - var TextTrackCueList = function () { - - /** - * Create an instance of this class.. - * - * @param {Array} cues - * A list of cues to be initialized with - */ - function TextTrackCueList(cues) { - classCallCheck(this, TextTrackCueList); - - var list = this; // eslint-disable-line - - if (IS_IE8) { - list = document_1.createElement('custom'); - - for (var prop in TextTrackCueList.prototype) { - if (prop !== 'constructor') { - list[prop] = TextTrackCueList.prototype[prop]; - } - } - } - - TextTrackCueList.prototype.setCues_.call(list, cues); - - /** - * @memberof TextTrackCueList - * @member {number} length - * The current number of `TextTrackCue`s in the TextTrackCueList. - * @instance - */ - Object.defineProperty(list, 'length', { - get: function get$$1() { - return this.length_; - } - }); - - if (IS_IE8) { - return list; - } - } - - /** - * A setter for cues in this list. Creates getters - * an an index for the cues. - * - * @param {Array} cues - * An array of cues to set - * - * @private - */ - - - TextTrackCueList.prototype.setCues_ = function setCues_(cues) { - var oldLength = this.length || 0; - var i = 0; - var l = cues.length; - - this.cues_ = cues; - this.length_ = cues.length; - - var defineProp = function defineProp(index) { - if (!('' + index in this)) { - Object.defineProperty(this, '' + index, { - get: function get$$1() { - return this.cues_[index]; - } - }); - } - }; - - if (oldLength < l) { - i = oldLength; - - for (; i < l; i++) { - defineProp.call(this, i); - } - } - }; - - /** - * Get a `TextTrackCue` that is currently in the `TextTrackCueList` by id. - * - * @param {string} id - * The id of the cue that should be searched for. - * - * @return {TextTrackCueList~TextTrackCue|null} - * A single cue or null if none was found. - */ - - - TextTrackCueList.prototype.getCueById = function getCueById(id) { - var result = null; - - for (var i = 0, l = this.length; i < l; i++) { - var cue = this[i]; - - if (cue.id === id) { - result = cue; - break; - } - } - - return result; - }; - - return TextTrackCueList; - }(); - - /** - * @file track-kinds.js - */ - - /** - * All possible `VideoTrackKind`s - * - * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-videotrack-kind - * @typedef VideoTrack~Kind - * @enum - */ - var VideoTrackKind = { - alternative: 'alternative', - captions: 'captions', - main: 'main', - sign: 'sign', - subtitles: 'subtitles', - commentary: 'commentary' - }; - - /** - * All possible `AudioTrackKind`s - * - * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-audiotrack-kind - * @typedef AudioTrack~Kind - * @enum - */ - var AudioTrackKind = { - 'alternative': 'alternative', - 'descriptions': 'descriptions', - 'main': 'main', - 'main-desc': 'main-desc', - 'translation': 'translation', - 'commentary': 'commentary' - }; - - /** - * All possible `TextTrackKind`s - * - * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-texttrack-kind - * @typedef TextTrack~Kind - * @enum - */ - var TextTrackKind = { - subtitles: 'subtitles', - captions: 'captions', - descriptions: 'descriptions', - chapters: 'chapters', - metadata: 'metadata' - }; - - /** - * All possible `TextTrackMode`s - * - * @see https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode - * @typedef TextTrack~Mode - * @enum - */ - var TextTrackMode = { - disabled: 'disabled', - hidden: 'hidden', - showing: 'showing' - }; - - /** - * @file track.js - */ - /** - * A Track class that contains all of the common functionality for {@link AudioTrack}, - * {@link VideoTrack}, and {@link TextTrack}. - * - * > Note: This class should not be used directly - * - * @see {@link https://html.spec.whatwg.org/multipage/embedded-content.html} - * @extends EventTarget - * @abstract - */ - - var Track = function (_EventTarget) { - inherits(Track, _EventTarget); - - /** - * Create an instance of this class. - * - * @param {Object} [options={}] - * Object of option names and values - * - * @param {string} [options.kind=''] - * A valid kind for the track type you are creating. - * - * @param {string} [options.id='vjs_track_' + Guid.newGUID()] - * A unique id for this AudioTrack. - * - * @param {string} [options.label=''] - * The menu label for this track. - * - * @param {string} [options.language=''] - * A valid two character language code. - * - * @abstract - */ - function Track() { - var _ret; - - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - classCallCheck(this, Track); - - var _this = possibleConstructorReturn(this, _EventTarget.call(this)); - - var track = _this; // eslint-disable-line - - if (IS_IE8) { - track = document_1.createElement('custom'); - for (var prop in Track.prototype) { - if (prop !== 'constructor') { - track[prop] = Track.prototype[prop]; - } - } - } - - var trackProps = { - id: options.id || 'vjs_track_' + newGUID(), - kind: options.kind || '', - label: options.label || '', - language: options.language || '' - }; - - /** - * @memberof Track - * @member {string} id - * The id of this track. Cannot be changed after creation. - * @instance - * - * @readonly - */ - - /** - * @memberof Track - * @member {string} kind - * The kind of track that this is. Cannot be changed after creation. - * @instance - * - * @readonly - */ - - /** - * @memberof Track - * @member {string} label - * The label of this track. Cannot be changed after creation. - * @instance - * - * @readonly - */ - - /** - * @memberof Track - * @member {string} language - * The two letter language code for this track. Cannot be changed after - * creation. - * @instance - * - * @readonly - */ - - var _loop = function _loop(key) { - Object.defineProperty(track, key, { - get: function get$$1() { - return trackProps[key]; - }, - set: function set$$1() { - } - }); - }; - - for (var key in trackProps) { - _loop(key); - } - - return _ret = track, possibleConstructorReturn(_this, _ret); - } - - return Track; - }(EventTarget); - - /** - * @file url.js - * @module url - */ - /** - * @typedef {Object} url:URLObject - * - * @property {string} protocol - * The protocol of the url that was parsed. - * - * @property {string} hostname - * The hostname of the url that was parsed. - * - * @property {string} port - * The port of the url that was parsed. - * - * @property {string} pathname - * The pathname of the url that was parsed. - * - * @property {string} search - * The search query of the url that was parsed. - * - * @property {string} hash - * The hash of the url that was parsed. - * - * @property {string} host - * The host of the url that was parsed. - */ - - /** - * Resolve and parse the elements of a URL. - * - * @param {String} url - * The url to parse - * - * @return {url:URLObject} - * An object of url details - */ - var parseUrl = function parseUrl(url) { - var props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host']; - - // add the url to an anchor and let the browser parse the URL - var a = document_1.createElement('a'); - - a.href = url; - - // IE8 (and 9?) Fix - // ie8 doesn't parse the URL correctly until the anchor is actually - // added to the body, and an innerHTML is needed to trigger the parsing - var addToBody = a.host === '' && a.protocol !== 'file:'; - var div = void 0; - - if (addToBody) { - div = document_1.createElement('div'); - div.innerHTML = ''; - a = div.firstChild; - // prevent the div from affecting layout - div.setAttribute('style', 'display:none; position:absolute;'); - document_1.body.appendChild(div); - } - - // Copy the specific URL properties to a new object - // This is also needed for IE8 because the anchor loses its - // properties when it's removed from the dom - var details = {}; - - for (var i = 0; i < props.length; i++) { - details[props[i]] = a[props[i]]; - } - - // IE9 adds the port to the host property unlike everyone else. If - // a port identifier is added for standard ports, strip it. - if (details.protocol === 'http:') { - details.host = details.host.replace(/:80$/, ''); - } - - if (details.protocol === 'https:') { - details.host = details.host.replace(/:443$/, ''); - } - - if (!details.protocol) { - details.protocol = window_1.location.protocol; - } - - if (addToBody) { - document_1.body.removeChild(div); - } - - return details; - }; - - /** - * Get absolute version of relative URL. Used to tell flash correct URL. - * - * - * @param {string} url - * URL to make absolute - * - * @return {string} - * Absolute URL - * - * @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue - */ - var getAbsoluteURL = function getAbsoluteURL(url) { - // Check if absolute URL - if (!url.match(/^https?:\/\//)) { - // Convert to absolute URL. Flash hosted off-site needs an absolute URL. - var div = document_1.createElement('div'); - - div.innerHTML = 'x'; - url = div.firstChild.href; - } - - return url; - }; - - /** - * Returns the extension of the passed file name. It will return an empty string - * if passed an invalid path. - * - * @param {string} path - * The fileName path like '/path/to/file.mp4' - * - * @returns {string} - * The extension in lower case or an empty string if no - * extension could be found. - */ - var getFileExtension = function getFileExtension(path) { - if (typeof path === 'string') { - var splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i; - var pathParts = splitPathRe.exec(path); - - if (pathParts) { - return pathParts.pop().toLowerCase(); - } - } - - return ''; - }; - - /** - * Returns whether the url passed is a cross domain request or not. - * - * @param {string} url - * The url to check. - * - * @return {boolean} - * Whether it is a cross domain request or not. - */ - var isCrossOrigin = function isCrossOrigin(url) { - var winLoc = window_1.location; - var urlInfo = parseUrl(url); - - // IE8 protocol relative urls will return ':' for protocol - var srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol; - - // Check if url is for another domain/origin - // IE8 doesn't know location.origin, so we won't rely on it here - var crossOrigin = srcProtocol + urlInfo.host !== winLoc.protocol + winLoc.host; - - return crossOrigin; - }; - - var Url = (Object.freeze || Object)({ - parseUrl: parseUrl, - getAbsoluteURL: getAbsoluteURL, - getFileExtension: getFileExtension, - isCrossOrigin: isCrossOrigin - }); - - var index$1 = isFunction; - - var toString$1 = Object.prototype.toString; - - function isFunction(fn) { - var string = toString$1.call(fn); - return string === '[object Function]' || - (typeof fn === 'function' && string !== '[object RegExp]') || - (typeof window !== 'undefined' && - // IE8 and below - (fn === window.setTimeout || - fn === window.alert || - fn === window.confirm || - fn === window.prompt)) - } - - var index$3 = createCommonjsModule(function (module, exports) { - exports = module.exports = trim; - - function trim(str) { - return str.replace(/^\s*|\s*$/g, ''); - } - - exports.left = function (str) { - return str.replace(/^\s*/, ''); - }; - - exports.right = function (str) { - return str.replace(/\s*$/, ''); - }; - }); - - var index$5 = forEach; - - var toString$2 = Object.prototype.toString; - var hasOwnProperty = Object.prototype.hasOwnProperty; - - function forEach(list, iterator, context) { - if (!index$1(iterator)) { - throw new TypeError('iterator must be a function') - } - - if (arguments.length < 3) { - context = this; - } - - if (toString$2.call(list) === '[object Array]') - forEachArray$1(list, iterator, context); - else if (typeof list === 'string') - forEachString(list, iterator, context); - else - forEachObject(list, iterator, context); - } - - function forEachArray$1(array, iterator, context) { - for (var i = 0, len = array.length; i < len; i++) { - if (hasOwnProperty.call(array, i)) { - iterator.call(context, array[i], i, array); - } - } - } - - function forEachString(string, iterator, context) { - for (var i = 0, len = string.length; i < len; i++) { - // no such thing as a sparse string. - iterator.call(context, string.charAt(i), i, string); - } - } - - function forEachObject(object, iterator, context) { - for (var k in object) { - if (hasOwnProperty.call(object, k)) { - iterator.call(context, object[k], k, object); - } - } - } - - var isArray = function (arg) { - return Object.prototype.toString.call(arg) === '[object Array]'; - }; - - var parseHeaders = function (headers) { - if (!headers) - return {} - - var result = {}; - - index$5( - index$3(headers).split('\n') - , function (row) { - var index = row.indexOf(':') - , key = index$3(row.slice(0, index)).toLowerCase() - , value = index$3(row.slice(index + 1)); - - if (typeof(result[key]) === 'undefined') { - result[key] = value; - } else if (isArray(result[key])) { - result[key].push(value); - } else { - result[key] = [result[key], value]; - } - } - ); - - return result - }; - - var immutable = extend; - - var hasOwnProperty$1 = Object.prototype.hasOwnProperty; - - function extend() { - var target = {}; - - for (var i = 0; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (hasOwnProperty$1.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target - } - - var index = createXHR; - createXHR.XMLHttpRequest = window_1.XMLHttpRequest || noop; - createXHR.XDomainRequest = "withCredentials" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window_1.XDomainRequest; - - forEachArray(["get", "put", "post", "patch", "head", "delete"], function (method) { - createXHR[method === "delete" ? "del" : method] = function (uri, options, callback) { - options = initParams(uri, options, callback); - options.method = method.toUpperCase(); - return _createXHR(options) - }; - }); - - function forEachArray(array, iterator) { - for (var i = 0; i < array.length; i++) { - iterator(array[i]); - } - } - - function isEmpty(obj) { - for (var i in obj) { - if (obj.hasOwnProperty(i)) return false - } - return true - } - - function initParams(uri, options, callback) { - var params = uri; - - if (index$1(options)) { - callback = options; - if (typeof uri === "string") { - params = {uri: uri}; - } - } else { - params = immutable(options, {uri: uri}); - } - - params.callback = callback; - return params - } - - function createXHR(uri, options, callback) { - options = initParams(uri, options, callback); - return _createXHR(options) - } - - function _createXHR(options) { - if (typeof options.callback === "undefined") { - throw new Error("callback argument missing") - } - - var called = false; - var callback = function cbOnce(err, response, body) { - if (!called) { - called = true; - options.callback(err, response, body); - } - }; - - function readystatechange() { - if (xhr.readyState === 4) { - setTimeout(loadFunc, 0); - } - } - - function getBody() { - // Chrome with requestType=blob throws errors arround when even testing access to responseText - var body = undefined; - - if (xhr.response) { - body = xhr.response; - } else { - body = xhr.responseText || getXml(xhr); - } - - if (isJson) { - try { - body = JSON.parse(body); - } catch (e) { - } - } - - return body - } - - function errorFunc(evt) { - clearTimeout(timeoutTimer); - if (!(evt instanceof Error)) { - evt = new Error("" + (evt || "Unknown XMLHttpRequest Error")); - } - evt.statusCode = 0; - return callback(evt, failureResponse) - } - - // will load the data & process the response in a special response object - function loadFunc() { - if (aborted) return - var status; - clearTimeout(timeoutTimer); - if (options.useXDR && xhr.status === undefined) { - //IE8 CORS GET successful response doesn't have a status field, but body is fine - status = 200; - } else { - status = (xhr.status === 1223 ? 204 : xhr.status); - } - var response = failureResponse; - var err = null; - - if (status !== 0) { - response = { - body: getBody(), - statusCode: status, - method: method, - headers: {}, - url: uri, - rawRequest: xhr - }; - if (xhr.getAllResponseHeaders) { //remember xhr can in fact be XDR for CORS in IE - response.headers = parseHeaders(xhr.getAllResponseHeaders()); - } - } else { - err = new Error("Internal XMLHttpRequest Error"); - } - return callback(err, response, response.body) - } - - var xhr = options.xhr || null; - - if (!xhr) { - if (options.cors || options.useXDR) { - xhr = new createXHR.XDomainRequest(); - } else { - xhr = new createXHR.XMLHttpRequest(); - } - } - - var key; - var aborted; - var uri = xhr.url = options.uri || options.url; - var method = xhr.method = options.method || "GET"; - var body = options.body || options.data; - var headers = xhr.headers = options.headers || {}; - var sync = !!options.sync; - var isJson = false; - var timeoutTimer; - var failureResponse = { - body: undefined, - headers: {}, - statusCode: 0, - method: method, - url: uri, - rawRequest: xhr - }; - - if ("json" in options && options.json !== false) { - isJson = true; - headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json"); //Don't override existing accept header declared by user - if (method !== "GET" && method !== "HEAD") { - headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json"); //Don't override existing accept header declared by user - body = JSON.stringify(options.json === true ? body : options.json); - } - } - - xhr.onreadystatechange = readystatechange; - xhr.onload = loadFunc; - xhr.onerror = errorFunc; - // IE9 must have onprogress be set to a unique function. - xhr.onprogress = function () { - // IE must die - }; - xhr.onabort = function () { - aborted = true; - }; - xhr.ontimeout = errorFunc; - xhr.open(method, uri, !sync, options.username, options.password); - //has to be after open - if (!sync) { - xhr.withCredentials = !!options.withCredentials; - } - // Cannot set timeout with sync request - // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly - // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent - if (!sync && options.timeout > 0) { - timeoutTimer = setTimeout(function () { - if (aborted) return - aborted = true;//IE9 may still call readystatechange - xhr.abort("timeout"); - var e = new Error("XMLHttpRequest timeout"); - e.code = "ETIMEDOUT"; - errorFunc(e); - }, options.timeout); - } - - if (xhr.setRequestHeader) { - for (key in headers) { - if (headers.hasOwnProperty(key)) { - xhr.setRequestHeader(key, headers[key]); - } - } - } else if (options.headers && !isEmpty(options.headers)) { - throw new Error("Headers cannot be set on an XDomainRequest object") - } - - if ("responseType" in options) { - xhr.responseType = options.responseType; - } - - if ("beforeSend" in options && - typeof options.beforeSend === "function" - ) { - options.beforeSend(xhr); - } - - // Microsoft Edge browser sends "undefined" when send is called with undefined value. - // XMLHttpRequest spec says to pass null as body to indicate no body - // See https://github.com/naugtur/xhr/issues/100. - xhr.send(body || null); - - return xhr - - - } - - function getXml(xhr) { - if (xhr.responseType === "document") { - return xhr.responseXML - } - var firefoxBugTakenEffect = xhr.responseXML && xhr.responseXML.documentElement.nodeName === "parsererror"; - if (xhr.responseType === "" && !firefoxBugTakenEffect) { - return xhr.responseXML - } - - return null - } - - function noop() { - } - - /** - * @file text-track.js - */ - /** - * Takes a webvtt file contents and parses it into cues - * - * @param {string} srcContent - * webVTT file contents - * - * @param {TextTrack} track - * TextTrack to add cues to. Cues come from the srcContent. - * - * @private - */ - var parseCues = function parseCues(srcContent, track) { - var parser = new window_1.WebVTT.Parser(window_1, window_1.vttjs, window_1.WebVTT.StringDecoder()); - var errors = []; - - parser.oncue = function (cue) { - track.addCue(cue); - }; - - parser.onparsingerror = function (error) { - errors.push(error); - }; - - parser.onflush = function () { - track.trigger({ - type: 'loadeddata', - target: track - }); - }; - - parser.parse(srcContent); - if (errors.length > 0) { - if (window_1.console && window_1.console.groupCollapsed) { - window_1.console.groupCollapsed('Text Track parsing errors for ' + track.src); - } - errors.forEach(function (error) { - return log$1.error(error); - }); - if (window_1.console && window_1.console.groupEnd) { - window_1.console.groupEnd(); - } - } - - parser.flush(); - }; - - /** - * Load a `TextTrack` from a specifed url. - * - * @param {string} src - * Url to load track from. - * - * @param {TextTrack} track - * Track to add cues to. Comes from the content at the end of `url`. - * - * @private - */ - var loadTrack = function loadTrack(src, track) { - var opts = { - uri: src - }; - var crossOrigin = isCrossOrigin(src); - - if (crossOrigin) { - opts.cors = crossOrigin; - } - - index(opts, bind(this, function (err, response, responseBody) { - if (err) { - return log$1.error(err, response); - } - - track.loaded_ = true; - - // Make sure that vttjs has loaded, otherwise, wait till it finished loading - // NOTE: this is only used for the alt/video.novtt.js build - if (typeof window_1.WebVTT !== 'function') { - if (track.tech_) { - var loadHandler = function loadHandler() { - return parseCues(responseBody, track); - }; - - track.tech_.on('vttjsloaded', loadHandler); - track.tech_.on('vttjserror', function () { - log$1.error('vttjs failed to load, stopping trying to process ' + track.src); - track.tech_.off('vttjsloaded', loadHandler); - }); - } - } else { - parseCues(responseBody, track); - } - })); - }; - - /** - * A representation of a single `TextTrack`. - * - * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack} - * @extends Track - */ - - var TextTrack = function (_Track) { - inherits(TextTrack, _Track); - - /** - * Create an instance of this class. - * - * @param {Object} options={} - * Object of option names and values - * - * @param {Tech} options.tech - * A reference to the tech that owns this TextTrack. - * - * @param {TextTrack~Kind} [options.kind='subtitles'] - * A valid text track kind. - * - * @param {TextTrack~Mode} [options.mode='disabled'] - * A valid text track mode. - * - * @param {string} [options.id='vjs_track_' + Guid.newGUID()] - * A unique id for this TextTrack. - * - * @param {string} [options.label=''] - * The menu label for this track. - * - * @param {string} [options.language=''] - * A valid two character language code. - * - * @param {string} [options.srclang=''] - * A valid two character language code. An alternative, but deprioritized - * vesion of `options.language` - * - * @param {string} [options.src] - * A url to TextTrack cues. - * - * @param {boolean} [options.default] - * If this track should default to on or off. - */ - function TextTrack() { - var _this, _ret; - - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - classCallCheck(this, TextTrack); - - if (!options.tech) { - throw new Error('A tech was not provided.'); - } - - var settings = mergeOptions(options, { - kind: TextTrackKind[options.kind] || 'subtitles', - language: options.language || options.srclang || '' - }); - var mode = TextTrackMode[settings.mode] || 'disabled'; - var default_ = settings['default']; - - if (settings.kind === 'metadata' || settings.kind === 'chapters') { - mode = 'hidden'; - } - // on IE8 this will be a document element - // for every other browser this will be a normal object - var tt = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this); - - tt.tech_ = settings.tech; - - if (IS_IE8) { - for (var prop in TextTrack.prototype) { - if (prop !== 'constructor') { - tt[prop] = TextTrack.prototype[prop]; - } - } - } - - tt.cues_ = []; - tt.activeCues_ = []; - - var cues = new TextTrackCueList(tt.cues_); - var activeCues = new TextTrackCueList(tt.activeCues_); - var changed = false; - var timeupdateHandler = bind(tt, function () { - - // Accessing this.activeCues for the side-effects of updating itself - // due to it's nature as a getter function. Do not remove or cues will - // stop updating! - /* eslint-disable no-unused-expressions */ - this.activeCues; - /* eslint-enable no-unused-expressions */ - if (changed) { - this.trigger('cuechange'); - changed = false; - } - }); - - if (mode !== 'disabled') { - tt.tech_.ready(function () { - tt.tech_.on('timeupdate', timeupdateHandler); - }, true); - } - - /** - * @memberof TextTrack - * @member {boolean} default - * If this track was set to be on or off by default. Cannot be changed after - * creation. - * @instance - * - * @readonly - */ - Object.defineProperty(tt, 'default', { - get: function get$$1() { - return default_; - }, - set: function set$$1() { - } - }); - - /** - * @memberof TextTrack - * @member {string} mode - * Set the mode of this TextTrack to a valid {@link TextTrack~Mode}. Will - * not be set if setting to an invalid mode. - * @instance - * - * @fires TextTrack#modechange - */ - Object.defineProperty(tt, 'mode', { - get: function get$$1() { - return mode; - }, - set: function set$$1(newMode) { - var _this2 = this; - - if (!TextTrackMode[newMode]) { - return; - } - mode = newMode; - if (mode === 'showing') { - - this.tech_.ready(function () { - _this2.tech_.on('timeupdate', timeupdateHandler); - }, true); - } - /** - * An event that fires when mode changes on this track. This allows - * the TextTrackList that holds this track to act accordingly. - * - * > Note: This is not part of the spec! - * - * @event TextTrack#modechange - * @type {EventTarget~Event} - */ - this.trigger('modechange'); - } - }); - - /** - * @memberof TextTrack - * @member {TextTrackCueList} cues - * The text track cue list for this TextTrack. - * @instance - */ - Object.defineProperty(tt, 'cues', { - get: function get$$1() { - if (!this.loaded_) { - return null; - } - - return cues; - }, - set: function set$$1() { - } - }); - - /** - * @memberof TextTrack - * @member {TextTrackCueList} activeCues - * The list text track cues that are currently active for this TextTrack. - * @instance - */ - Object.defineProperty(tt, 'activeCues', { - get: function get$$1() { - if (!this.loaded_) { - return null; - } - - // nothing to do - if (this.cues.length === 0) { - return activeCues; - } - - var ct = this.tech_.currentTime(); - var active = []; - - for (var i = 0, l = this.cues.length; i < l; i++) { - var cue = this.cues[i]; - - if (cue.startTime <= ct && cue.endTime >= ct) { - active.push(cue); - } else if (cue.startTime === cue.endTime && cue.startTime <= ct && cue.startTime + 0.5 >= ct) { - active.push(cue); - } - } - - changed = false; - - if (active.length !== this.activeCues_.length) { - changed = true; - } else { - for (var _i = 0; _i < active.length; _i++) { - if (this.activeCues_.indexOf(active[_i]) === -1) { - changed = true; - } - } - } - - this.activeCues_ = active; - activeCues.setCues_(this.activeCues_); - - return activeCues; - }, - set: function set$$1() { - } - }); - - if (settings.src) { - tt.src = settings.src; - loadTrack(settings.src, tt); - } else { - tt.loaded_ = true; - } - - return _ret = tt, possibleConstructorReturn(_this, _ret); - } - - /** - * Add a cue to the internal list of cues. - * - * @param {TextTrack~Cue} cue - * The cue to add to our internal list - */ - - - TextTrack.prototype.addCue = function addCue(originalCue) { - var cue = originalCue; - - if (window_1.vttjs && !(originalCue instanceof window_1.vttjs.VTTCue)) { - cue = new window_1.vttjs.VTTCue(originalCue.startTime, originalCue.endTime, originalCue.text); - - for (var prop in originalCue) { - if (!(prop in cue)) { - cue[prop] = originalCue[prop]; - } - } - - // make sure that `id` is copied over - cue.id = originalCue.id; - cue.originalCue_ = originalCue; - } - - var tracks = this.tech_.textTracks(); - - for (var i = 0; i < tracks.length; i++) { - if (tracks[i] !== this) { - tracks[i].removeCue(cue); - } - } - - this.cues_.push(cue); - this.cues.setCues_(this.cues_); - }; - - /** - * Remove a cue from our internal list - * - * @param {TextTrack~Cue} removeCue - * The cue to remove from our internal list - */ - - - TextTrack.prototype.removeCue = function removeCue(_removeCue) { - var i = this.cues_.length; - - while (i--) { - var cue = this.cues_[i]; - - if (cue === _removeCue || cue.originalCue_ && cue.originalCue_ === _removeCue) { - this.cues_.splice(i, 1); - this.cues.setCues_(this.cues_); - break; - } - } - }; - - return TextTrack; - }(Track); - - /** - * cuechange - One or more cues in the track have become active or stopped being active. - */ - - - TextTrack.prototype.allowedEvents_ = { - cuechange: 'cuechange' - }; - - /** - * A representation of a single `AudioTrack`. If it is part of an {@link AudioTrackList} - * only one `AudioTrack` in the list will be enabled at a time. - * - * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotrack} - * @extends Track - */ - - var AudioTrack = function (_Track) { - inherits(AudioTrack, _Track); - - /** - * Create an instance of this class. - * - * @param {Object} [options={}] - * Object of option names and values - * - * @param {AudioTrack~Kind} [options.kind=''] - * A valid audio track kind - * - * @param {string} [options.id='vjs_track_' + Guid.newGUID()] - * A unique id for this AudioTrack. - * - * @param {string} [options.label=''] - * The menu label for this track. - * - * @param {string} [options.language=''] - * A valid two character language code. - * - * @param {boolean} [options.enabled] - * If this track is the one that is currently playing. If this track is part of - * an {@link AudioTrackList}, only one {@link AudioTrack} will be enabled. - */ - function AudioTrack() { - var _this, _ret; - - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - classCallCheck(this, AudioTrack); - - var settings = mergeOptions(options, { - kind: AudioTrackKind[options.kind] || '' - }); - // on IE8 this will be a document element - // for every other browser this will be a normal object - var track = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this); - var enabled = false; - - if (IS_IE8) { - for (var prop in AudioTrack.prototype) { - if (prop !== 'constructor') { - track[prop] = AudioTrack.prototype[prop]; - } - } - } - /** - * @memberof AudioTrack - * @member {boolean} enabled - * If this `AudioTrack` is enabled or not. When setting this will - * fire {@link AudioTrack#enabledchange} if the state of enabled is changed. - * @instance - * - * @fires VideoTrack#selectedchange - */ - Object.defineProperty(track, 'enabled', { - get: function get$$1() { - return enabled; - }, - set: function set$$1(newEnabled) { - // an invalid or unchanged value - if (typeof newEnabled !== 'boolean' || newEnabled === enabled) { - return; - } - enabled = newEnabled; - - /** - * An event that fires when enabled changes on this track. This allows - * the AudioTrackList that holds this track to act accordingly. - * - * > Note: This is not part of the spec! Native tracks will do - * this internally without an event. - * - * @event AudioTrack#enabledchange - * @type {EventTarget~Event} - */ - this.trigger('enabledchange'); - } - }); - - // if the user sets this track to selected then - // set selected to that true value otherwise - // we keep it false - if (settings.enabled) { - track.enabled = settings.enabled; - } - track.loaded_ = true; - - return _ret = track, possibleConstructorReturn(_this, _ret); - } - - return AudioTrack; - }(Track); - - /** - * A representation of a single `VideoTrack`. - * - * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#videotrack} - * @extends Track - */ - - var VideoTrack = function (_Track) { - inherits(VideoTrack, _Track); - - /** - * Create an instance of this class. - * - * @param {Object} [options={}] - * Object of option names and values - * - * @param {string} [options.kind=''] - * A valid {@link VideoTrack~Kind} - * - * @param {string} [options.id='vjs_track_' + Guid.newGUID()] - * A unique id for this AudioTrack. - * - * @param {string} [options.label=''] - * The menu label for this track. - * - * @param {string} [options.language=''] - * A valid two character language code. - * - * @param {boolean} [options.selected] - * If this track is the one that is currently playing. - */ - function VideoTrack() { - var _this, _ret; - - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - classCallCheck(this, VideoTrack); - - var settings = mergeOptions(options, { - kind: VideoTrackKind[options.kind] || '' - }); - - // on IE8 this will be a document element - // for every other browser this will be a normal object - var track = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this); - var selected = false; - - if (IS_IE8) { - for (var prop in VideoTrack.prototype) { - if (prop !== 'constructor') { - track[prop] = VideoTrack.prototype[prop]; - } - } - } - - /** - * @memberof VideoTrack - * @member {boolean} selected - * If this `VideoTrack` is selected or not. When setting this will - * fire {@link VideoTrack#selectedchange} if the state of selected changed. - * @instance - * - * @fires VideoTrack#selectedchange - */ - Object.defineProperty(track, 'selected', { - get: function get$$1() { - return selected; - }, - set: function set$$1(newSelected) { - // an invalid or unchanged value - if (typeof newSelected !== 'boolean' || newSelected === selected) { - return; - } - selected = newSelected; - - /** - * An event that fires when selected changes on this track. This allows - * the VideoTrackList that holds this track to act accordingly. - * - * > Note: This is not part of the spec! Native tracks will do - * this internally without an event. - * - * @event VideoTrack#selectedchange - * @type {EventTarget~Event} - */ - this.trigger('selectedchange'); - } - }); - - // if the user sets this track to selected then - // set selected to that true value otherwise - // we keep it false - if (settings.selected) { - track.selected = settings.selected; - } - - return _ret = track, possibleConstructorReturn(_this, _ret); - } - - return VideoTrack; - }(Track); - - /** - * @file html-track-element.js - */ - - /** - * @memberof HTMLTrackElement - * @typedef {HTMLTrackElement~ReadyState} - * @enum {number} - */ - var NONE = 0; - var LOADING = 1; - var LOADED = 2; - var ERROR = 3; - - /** - * A single track represented in the DOM. - * - * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#htmltrackelement} - * @extends EventTarget - */ - - var HTMLTrackElement = function (_EventTarget) { - inherits(HTMLTrackElement, _EventTarget); - - /** - * Create an instance of this class. - * - * @param {Object} options={} - * Object of option names and values - * - * @param {Tech} options.tech - * A reference to the tech that owns this HTMLTrackElement. - * - * @param {TextTrack~Kind} [options.kind='subtitles'] - * A valid text track kind. - * - * @param {TextTrack~Mode} [options.mode='disabled'] - * A valid text track mode. - * - * @param {string} [options.id='vjs_track_' + Guid.newGUID()] - * A unique id for this TextTrack. - * - * @param {string} [options.label=''] - * The menu label for this track. - * - * @param {string} [options.language=''] - * A valid two character language code. - * - * @param {string} [options.srclang=''] - * A valid two character language code. An alternative, but deprioritized - * vesion of `options.language` - * - * @param {string} [options.src] - * A url to TextTrack cues. - * - * @param {boolean} [options.default] - * If this track should default to on or off. - */ - function HTMLTrackElement() { - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - classCallCheck(this, HTMLTrackElement); - - var _this = possibleConstructorReturn(this, _EventTarget.call(this)); - - var readyState = void 0; - var trackElement = _this; // eslint-disable-line - - if (IS_IE8) { - trackElement = document_1.createElement('custom'); - - for (var prop in HTMLTrackElement.prototype) { - if (prop !== 'constructor') { - trackElement[prop] = HTMLTrackElement.prototype[prop]; - } - } - } - - var track = new TextTrack(options); - - trackElement.kind = track.kind; - trackElement.src = track.src; - trackElement.srclang = track.language; - trackElement.label = track.label; - trackElement['default'] = track['default']; - - /** - * @memberof HTMLTrackElement - * @member {HTMLTrackElement~ReadyState} readyState - * The current ready state of the track element. - * @instance - */ - Object.defineProperty(trackElement, 'readyState', { - get: function get$$1() { - return readyState; - } - }); - - /** - * @memberof HTMLTrackElement - * @member {TextTrack} track - * The underlying TextTrack object. - * @instance - * - */ - Object.defineProperty(trackElement, 'track', { - get: function get$$1() { - return track; - } - }); - - readyState = NONE; - - /** - * @listens TextTrack#loadeddata - * @fires HTMLTrackElement#load - */ - track.addEventListener('loadeddata', function () { - readyState = LOADED; - - trackElement.trigger({ - type: 'load', - target: trackElement - }); - }); - - if (IS_IE8) { - var _ret; - - return _ret = trackElement, possibleConstructorReturn(_this, _ret); - } - return _this; - } - - return HTMLTrackElement; - }(EventTarget); - - HTMLTrackElement.prototype.allowedEvents_ = { - load: 'load' - }; - - HTMLTrackElement.NONE = NONE; - HTMLTrackElement.LOADING = LOADING; - HTMLTrackElement.LOADED = LOADED; - HTMLTrackElement.ERROR = ERROR; - - /* - * This file contains all track properties that are used in - * player.js, tech.js, html5.js and possibly other techs in the future. - */ - - var NORMAL = { - audio: { - ListClass: AudioTrackList, - TrackClass: AudioTrack, - capitalName: 'Audio' - }, - video: { - ListClass: VideoTrackList, - TrackClass: VideoTrack, - capitalName: 'Video' - }, - text: { - ListClass: TextTrackList, - TrackClass: TextTrack, - capitalName: 'Text' - } - }; - - Object.keys(NORMAL).forEach(function (type) { - NORMAL[type].getterName = type + 'Tracks'; - NORMAL[type].privateName = type + 'Tracks_'; - }); - - var REMOTE = { - remoteText: { - ListClass: TextTrackList, - TrackClass: TextTrack, - capitalName: 'RemoteText', - getterName: 'remoteTextTracks', - privateName: 'remoteTextTracks_' - }, - remoteTextEl: { - ListClass: HtmlTrackElementList, - TrackClass: HTMLTrackElement, - capitalName: 'RemoteTextTrackEls', - getterName: 'remoteTextTrackEls', - privateName: 'remoteTextTrackEls_' - } - }; - - var ALL = mergeOptions(NORMAL, REMOTE); - - REMOTE.names = Object.keys(REMOTE); - NORMAL.names = Object.keys(NORMAL); - ALL.names = [].concat(REMOTE.names).concat(NORMAL.names); - - /** - * Copyright 2013 vtt.js Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ - /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - var _objCreate = Object.create || (function () { - function F() { - } - - return function (o) { - if (arguments.length !== 1) { - throw new Error('Object.create shim only accepts one parameter.'); - } - F.prototype = o; - return new F(); - }; - })(); - -// Creates a new ParserError object from an errorData object. The errorData -// object should have default code and message properties. The default message -// property can be overriden by passing in a message parameter. -// See ParsingError.Errors below for acceptable errors. - function ParsingError(errorData, message) { - this.name = "ParsingError"; - this.code = errorData.code; - this.message = message || errorData.message; - } - - ParsingError.prototype = _objCreate(Error.prototype); - ParsingError.prototype.constructor = ParsingError; - -// ParsingError metadata for acceptable ParsingErrors. - ParsingError.Errors = { - BadSignature: { - code: 0, - message: "Malformed WebVTT signature." - }, - BadTimeStamp: { - code: 1, - message: "Malformed time stamp." - } - }; - -// Try to parse input as a time stamp. - function parseTimeStamp(input) { - - function computeSeconds(h, m, s, f) { - return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000; - } - - var m = input.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/); - if (!m) { - return null; - } - - if (m[3]) { - // Timestamp takes the form of [hours]:[minutes]:[seconds].[milliseconds] - return computeSeconds(m[1], m[2], m[3].replace(":", ""), m[4]); - } else if (m[1] > 59) { - // Timestamp takes the form of [hours]:[minutes].[milliseconds] - // First position is hours as it's over 59. - return computeSeconds(m[1], m[2], 0, m[4]); - } else { - // Timestamp takes the form of [minutes]:[seconds].[milliseconds] - return computeSeconds(0, m[1], m[2], m[4]); - } - } - -// A settings object holds key/value pairs and will ignore anything but the first -// assignment to a specific key. - function Settings() { - this.values = _objCreate(null); - } - - Settings.prototype = { - // Only accept the first assignment to any key. - set: function (k, v) { - if (!this.get(k) && v !== "") { - this.values[k] = v; - } - }, - // Return the value for a key, or a default value. - // If 'defaultKey' is passed then 'dflt' is assumed to be an object with - // a number of possible default values as properties where 'defaultKey' is - // the key of the property that will be chosen; otherwise it's assumed to be - // a single value. - get: function (k, dflt, defaultKey) { - if (defaultKey) { - return this.has(k) ? this.values[k] : dflt[defaultKey]; - } - return this.has(k) ? this.values[k] : dflt; - }, - // Check whether we have a value for a key. - has: function (k) { - return k in this.values; - }, - // Accept a setting if its one of the given alternatives. - alt: function (k, v, a) { - for (var n = 0; n < a.length; ++n) { - if (v === a[n]) { - this.set(k, v); - break; - } - } - }, - // Accept a setting if its a valid (signed) integer. - integer: function (k, v) { - if (/^-?\d+$/.test(v)) { // integer - this.set(k, parseInt(v, 10)); - } - }, - // Accept a setting if its a valid percentage. - percent: function (k, v) { - var m; - if ((m = v.match(/^([\d]{1,3})(\.[\d]*)?%$/))) { - v = parseFloat(v); - if (v >= 0 && v <= 100) { - this.set(k, v); - return true; - } - } - return false; - } - }; - -// Helper function to parse input into groups separated by 'groupDelim', and -// interprete each group as a key/value pair separated by 'keyValueDelim'. - function parseOptions(input, callback, keyValueDelim, groupDelim) { - var groups = groupDelim ? input.split(groupDelim) : [input]; - for (var i in groups) { - if (typeof groups[i] !== "string") { - continue; - } - var kv = groups[i].split(keyValueDelim); - if (kv.length !== 2) { - continue; - } - var k = kv[0]; - var v = kv[1]; - callback(k, v); - } - } - - function parseCue(input, cue, regionList) { - // Remember the original input if we need to throw an error. - var oInput = input; - - // 4.1 WebVTT timestamp - function consumeTimeStamp() { - var ts = parseTimeStamp(input); - if (ts === null) { - throw new ParsingError(ParsingError.Errors.BadTimeStamp, - "Malformed timestamp: " + oInput); - } - // Remove time stamp from input. - input = input.replace(/^[^\sa-zA-Z-]+/, ""); - return ts; - } - - // 4.4.2 WebVTT cue settings - function consumeCueSettings(input, cue) { - var settings = new Settings(); - - parseOptions(input, function (k, v) { - switch (k) { - case "region": - // Find the last region we parsed with the same region id. - for (var i = regionList.length - 1; i >= 0; i--) { - if (regionList[i].id === v) { - settings.set(k, regionList[i].region); - break; - } - } - break; - case "vertical": - settings.alt(k, v, ["rl", "lr"]); - break; - case "line": - var vals = v.split(","), - vals0 = vals[0]; - settings.integer(k, vals0); - settings.percent(k, vals0) ? settings.set("snapToLines", false) : null; - settings.alt(k, vals0, ["auto"]); - if (vals.length === 2) { - settings.alt("lineAlign", vals[1], ["start", "middle", "end"]); - } - break; - case "position": - vals = v.split(","); - settings.percent(k, vals[0]); - if (vals.length === 2) { - settings.alt("positionAlign", vals[1], ["start", "middle", "end"]); - } - break; - case "size": - settings.percent(k, v); - break; - case "align": - settings.alt(k, v, ["start", "middle", "end", "left", "right"]); - break; - } - }, /:/, /\s/); - - // Apply default values for any missing fields. - cue.region = settings.get("region", null); - cue.vertical = settings.get("vertical", ""); - cue.line = settings.get("line", "auto"); - cue.lineAlign = settings.get("lineAlign", "start"); - cue.snapToLines = settings.get("snapToLines", true); - cue.size = settings.get("size", 100); - cue.align = settings.get("align", "middle"); - cue.position = settings.get("position", { - start: 0, - left: 0, - middle: 50, - end: 100, - right: 100 - }, cue.align); - cue.positionAlign = settings.get("positionAlign", { - start: "start", - left: "start", - middle: "middle", - end: "end", - right: "end" - }, cue.align); - } - - function skipWhitespace() { - input = input.replace(/^\s+/, ""); - } - - // 4.1 WebVTT cue timings. - skipWhitespace(); - cue.startTime = consumeTimeStamp(); // (1) collect cue start time - skipWhitespace(); - if (input.substr(0, 3) !== "-->") { // (3) next characters must match "-->" - throw new ParsingError(ParsingError.Errors.BadTimeStamp, - "Malformed time stamp (time stamps must be separated by '-->'): " + - oInput); - } - input = input.substr(3); - skipWhitespace(); - cue.endTime = consumeTimeStamp(); // (5) collect cue end time - - // 4.1 WebVTT cue settings list. - skipWhitespace(); - consumeCueSettings(input, cue); - } - - var ESCAPE = { - "&": "&", - "<": "<", - ">": ">", - "‎": "\u200e", - "‏": "\u200f", - " ": "\u00a0" - }; - - var TAG_NAME = { - c: "span", - i: "i", - b: "b", - u: "u", - ruby: "ruby", - rt: "rt", - v: "span", - lang: "span" - }; - - var TAG_ANNOTATION = { - v: "title", - lang: "lang" - }; - - var NEEDS_PARENT = { - rt: "ruby" - }; - -// Parse content into a document fragment. - function parseContent(window, input) { - function nextToken() { - // Check for end-of-string. - if (!input) { - return null; - } - - // Consume 'n' characters from the input. - function consume(result) { - input = input.substr(result.length); - return result; - } - - var m = input.match(/^([^<]*)(<[^>]+>?)?/); - // If there is some text before the next tag, return it, otherwise return - // the tag. - return consume(m[1] ? m[1] : m[2]); - } - - // Unescape a string 's'. - function unescape1(e) { - return ESCAPE[e]; - } - - function unescape(s) { - while ((m = s.match(/&(amp|lt|gt|lrm|rlm|nbsp);/))) { - s = s.replace(m[0], unescape1); - } - return s; - } - - function shouldAdd(current, element) { - return !NEEDS_PARENT[element.localName] || - NEEDS_PARENT[element.localName] === current.localName; - } - - // Create an element for this tag. - function createElement(type, annotation) { - var tagName = TAG_NAME[type]; - if (!tagName) { - return null; - } - var element = window.document.createElement(tagName); - element.localName = tagName; - var name = TAG_ANNOTATION[type]; - if (name && annotation) { - element[name] = annotation.trim(); - } - return element; - } - - var rootDiv = window.document.createElement("div"), - current = rootDiv, - t, - tagStack = []; - - while ((t = nextToken()) !== null) { - if (t[0] === '<') { - if (t[1] === "/") { - // If the closing tag matches, move back up to the parent node. - if (tagStack.length && - tagStack[tagStack.length - 1] === t.substr(2).replace(">", "")) { - tagStack.pop(); - current = current.parentNode; - } - // Otherwise just ignore the end tag. - continue; - } - var ts = parseTimeStamp(t.substr(1, t.length - 2)); - var node; - if (ts) { - // Timestamps are lead nodes as well. - node = window.document.createProcessingInstruction("timestamp", ts); - current.appendChild(node); - continue; - } - var m = t.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/); - // If we can't parse the tag, skip to the next tag. - if (!m) { - continue; - } - // Try to construct an element, and ignore the tag if we couldn't. - node = createElement(m[1], m[3]); - if (!node) { - continue; - } - // Determine if the tag should be added based on the context of where it - // is placed in the cuetext. - if (!shouldAdd(current, node)) { - continue; - } - // Set the class list (as a list of classes, separated by space). - if (m[2]) { - node.className = m[2].substr(1).replace('.', ' '); - } - // Append the node to the current node, and enter the scope of the new - // node. - tagStack.push(m[1]); - current.appendChild(node); - current = node; - continue; - } - - // Text nodes are leaf nodes. - current.appendChild(window.document.createTextNode(unescape(t))); - } - - return rootDiv; - } - -// This is a list of all the Unicode characters that have a strong -// right-to-left category. What this means is that these characters are -// written right-to-left for sure. It was generated by pulling all the strong -// right-to-left characters out of the Unicode data table. That table can -// found at: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt - var strongRTLRanges = [[0x5be, 0x5be], [0x5c0, 0x5c0], [0x5c3, 0x5c3], [0x5c6, 0x5c6], - [0x5d0, 0x5ea], [0x5f0, 0x5f4], [0x608, 0x608], [0x60b, 0x60b], [0x60d, 0x60d], - [0x61b, 0x61b], [0x61e, 0x64a], [0x66d, 0x66f], [0x671, 0x6d5], [0x6e5, 0x6e6], - [0x6ee, 0x6ef], [0x6fa, 0x70d], [0x70f, 0x710], [0x712, 0x72f], [0x74d, 0x7a5], - [0x7b1, 0x7b1], [0x7c0, 0x7ea], [0x7f4, 0x7f5], [0x7fa, 0x7fa], [0x800, 0x815], - [0x81a, 0x81a], [0x824, 0x824], [0x828, 0x828], [0x830, 0x83e], [0x840, 0x858], - [0x85e, 0x85e], [0x8a0, 0x8a0], [0x8a2, 0x8ac], [0x200f, 0x200f], - [0xfb1d, 0xfb1d], [0xfb1f, 0xfb28], [0xfb2a, 0xfb36], [0xfb38, 0xfb3c], - [0xfb3e, 0xfb3e], [0xfb40, 0xfb41], [0xfb43, 0xfb44], [0xfb46, 0xfbc1], - [0xfbd3, 0xfd3d], [0xfd50, 0xfd8f], [0xfd92, 0xfdc7], [0xfdf0, 0xfdfc], - [0xfe70, 0xfe74], [0xfe76, 0xfefc], [0x10800, 0x10805], [0x10808, 0x10808], - [0x1080a, 0x10835], [0x10837, 0x10838], [0x1083c, 0x1083c], [0x1083f, 0x10855], - [0x10857, 0x1085f], [0x10900, 0x1091b], [0x10920, 0x10939], [0x1093f, 0x1093f], - [0x10980, 0x109b7], [0x109be, 0x109bf], [0x10a00, 0x10a00], [0x10a10, 0x10a13], - [0x10a15, 0x10a17], [0x10a19, 0x10a33], [0x10a40, 0x10a47], [0x10a50, 0x10a58], - [0x10a60, 0x10a7f], [0x10b00, 0x10b35], [0x10b40, 0x10b55], [0x10b58, 0x10b72], - [0x10b78, 0x10b7f], [0x10c00, 0x10c48], [0x1ee00, 0x1ee03], [0x1ee05, 0x1ee1f], - [0x1ee21, 0x1ee22], [0x1ee24, 0x1ee24], [0x1ee27, 0x1ee27], [0x1ee29, 0x1ee32], - [0x1ee34, 0x1ee37], [0x1ee39, 0x1ee39], [0x1ee3b, 0x1ee3b], [0x1ee42, 0x1ee42], - [0x1ee47, 0x1ee47], [0x1ee49, 0x1ee49], [0x1ee4b, 0x1ee4b], [0x1ee4d, 0x1ee4f], - [0x1ee51, 0x1ee52], [0x1ee54, 0x1ee54], [0x1ee57, 0x1ee57], [0x1ee59, 0x1ee59], - [0x1ee5b, 0x1ee5b], [0x1ee5d, 0x1ee5d], [0x1ee5f, 0x1ee5f], [0x1ee61, 0x1ee62], - [0x1ee64, 0x1ee64], [0x1ee67, 0x1ee6a], [0x1ee6c, 0x1ee72], [0x1ee74, 0x1ee77], - [0x1ee79, 0x1ee7c], [0x1ee7e, 0x1ee7e], [0x1ee80, 0x1ee89], [0x1ee8b, 0x1ee9b], - [0x1eea1, 0x1eea3], [0x1eea5, 0x1eea9], [0x1eeab, 0x1eebb], [0x10fffd, 0x10fffd]]; - - function isStrongRTLChar(charCode) { - for (var i = 0; i < strongRTLRanges.length; i++) { - var currentRange = strongRTLRanges[i]; - if (charCode >= currentRange[0] && charCode <= currentRange[1]) { - return true; - } - } - - return false; - } - - function determineBidi(cueDiv) { - var nodeStack = [], - text = "", - charCode; - - if (!cueDiv || !cueDiv.childNodes) { - return "ltr"; - } - - function pushNodes(nodeStack, node) { - for (var i = node.childNodes.length - 1; i >= 0; i--) { - nodeStack.push(node.childNodes[i]); - } - } - - function nextTextNode(nodeStack) { - if (!nodeStack || !nodeStack.length) { - return null; - } - - var node = nodeStack.pop(), - text = node.textContent || node.innerText; - if (text) { - // TODO: This should match all unicode type B characters (paragraph - // separator characters). See issue #115. - var m = text.match(/^.*(\n|\r)/); - if (m) { - nodeStack.length = 0; - return m[0]; - } - return text; - } - if (node.tagName === "ruby") { - return nextTextNode(nodeStack); - } - if (node.childNodes) { - pushNodes(nodeStack, node); - return nextTextNode(nodeStack); - } - } - - pushNodes(nodeStack, cueDiv); - while ((text = nextTextNode(nodeStack))) { - for (var i = 0; i < text.length; i++) { - charCode = text.charCodeAt(i); - if (isStrongRTLChar(charCode)) { - return "rtl"; - } - } - } - return "ltr"; - } - - function computeLinePos(cue) { - if (typeof cue.line === "number" && - (cue.snapToLines || (cue.line >= 0 && cue.line <= 100))) { - return cue.line; - } - if (!cue.track || !cue.track.textTrackList || - !cue.track.textTrackList.mediaElement) { - return -1; - } - var track = cue.track, - trackList = track.textTrackList, - count = 0; - for (var i = 0; i < trackList.length && trackList[i] !== track; i++) { - if (trackList[i].mode === "showing") { - count++; - } - } - return ++count * -1; - } - - function StyleBox() { - } - -// Apply styles to a div. If there is no div passed then it defaults to the -// div on 'this'. - StyleBox.prototype.applyStyles = function (styles, div) { - div = div || this.div; - for (var prop in styles) { - if (styles.hasOwnProperty(prop)) { - div.style[prop] = styles[prop]; - } - } - }; - - StyleBox.prototype.formatStyle = function (val, unit) { - return val === 0 ? 0 : val + unit; - }; - -// Constructs the computed display state of the cue (a div). Places the div -// into the overlay which should be a block level element (usually a div). - function CueStyleBox(window, cue, styleOptions) { - var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent); - var color = "rgba(255, 255, 255, 1)"; - var backgroundColor = "rgba(0, 0, 0, 0.8)"; - - if (isIE8) { - color = "rgb(255, 255, 255)"; - backgroundColor = "rgb(0, 0, 0)"; - } - - StyleBox.call(this); - this.cue = cue; - - // Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will - // have inline positioning and will function as the cue background box. - this.cueDiv = parseContent(window, cue.text); - var styles = { - color: color, - backgroundColor: backgroundColor, - position: "relative", - left: 0, - right: 0, - top: 0, - bottom: 0, - display: "inline" - }; - - if (!isIE8) { - styles.writingMode = cue.vertical === "" ? "horizontal-tb" - : cue.vertical === "lr" ? "vertical-lr" - : "vertical-rl"; - styles.unicodeBidi = "plaintext"; - } - this.applyStyles(styles, this.cueDiv); - - // Create an absolutely positioned div that will be used to position the cue - // div. Note, all WebVTT cue-setting alignments are equivalent to the CSS - // mirrors of them except "middle" which is "center" in CSS. - this.div = window.document.createElement("div"); - styles = { - textAlign: cue.align === "middle" ? "center" : cue.align, - font: styleOptions.font, - whiteSpace: "pre-line", - position: "absolute" - }; - - if (!isIE8) { - styles.direction = determineBidi(this.cueDiv); - styles.writingMode = cue.vertical === "" ? "horizontal-tb" - : cue.vertical === "lr" ? "vertical-lr" - : "vertical-rl".stylesunicodeBidi = "plaintext"; - } - - this.applyStyles(styles); - - this.div.appendChild(this.cueDiv); - - // Calculate the distance from the reference edge of the viewport to the text - // position of the cue box. The reference edge will be resolved later when - // the box orientation styles are applied. - var textPos = 0; - switch (cue.positionAlign) { - case "start": - textPos = cue.position; - break; - case "middle": - textPos = cue.position - (cue.size / 2); - break; - case "end": - textPos = cue.position - cue.size; - break; - } - - // Horizontal box orientation; textPos is the distance from the left edge of the - // area to the left edge of the box and cue.size is the distance extending to - // the right from there. - if (cue.vertical === "") { - this.applyStyles({ - left: this.formatStyle(textPos, "%"), - width: this.formatStyle(cue.size, "%") - }); - // Vertical box orientation; textPos is the distance from the top edge of the - // area to the top edge of the box and cue.size is the height extending - // downwards from there. - } else { - this.applyStyles({ - top: this.formatStyle(textPos, "%"), - height: this.formatStyle(cue.size, "%") - }); - } - - this.move = function (box) { - this.applyStyles({ - top: this.formatStyle(box.top, "px"), - bottom: this.formatStyle(box.bottom, "px"), - left: this.formatStyle(box.left, "px"), - right: this.formatStyle(box.right, "px"), - height: this.formatStyle(box.height, "px"), - width: this.formatStyle(box.width, "px") - }); - }; - } - - CueStyleBox.prototype = _objCreate(StyleBox.prototype); - CueStyleBox.prototype.constructor = CueStyleBox; - -// Represents the co-ordinates of an Element in a way that we can easily -// compute things with such as if it overlaps or intersects with another Element. -// Can initialize it with either a StyleBox or another BoxPosition. - function BoxPosition(obj) { - var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent); - - // Either a BoxPosition was passed in and we need to copy it, or a StyleBox - // was passed in and we need to copy the results of 'getBoundingClientRect' - // as the object returned is readonly. All co-ordinate values are in reference - // to the viewport origin (top left). - var lh, height, width, top; - if (obj.div) { - height = obj.div.offsetHeight; - width = obj.div.offsetWidth; - top = obj.div.offsetTop; - - var rects = (rects = obj.div.childNodes) && (rects = rects[0]) && - rects.getClientRects && rects.getClientRects(); - obj = obj.div.getBoundingClientRect(); - // In certain cases the outter div will be slightly larger then the sum of - // the inner div's lines. This could be due to bold text, etc, on some platforms. - // In this case we should get the average line height and use that. This will - // result in the desired behaviour. - lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length) - : 0; - - } - this.left = obj.left; - this.right = obj.right; - this.top = obj.top || top; - this.height = obj.height || height; - this.bottom = obj.bottom || (top + (obj.height || height)); - this.width = obj.width || width; - this.lineHeight = lh !== undefined ? lh : obj.lineHeight; - - if (isIE8 && !this.lineHeight) { - this.lineHeight = 13; - } - } - -// Move the box along a particular axis. Optionally pass in an amount to move -// the box. If no amount is passed then the default is the line height of the -// box. - BoxPosition.prototype.move = function (axis, toMove) { - toMove = toMove !== undefined ? toMove : this.lineHeight; - switch (axis) { - case "+x": - this.left += toMove; - this.right += toMove; - break; - case "-x": - this.left -= toMove; - this.right -= toMove; - break; - case "+y": - this.top += toMove; - this.bottom += toMove; - break; - case "-y": - this.top -= toMove; - this.bottom -= toMove; - break; - } - }; - -// Check if this box overlaps another box, b2. - BoxPosition.prototype.overlaps = function (b2) { - return this.left < b2.right && - this.right > b2.left && - this.top < b2.bottom && - this.bottom > b2.top; - }; - -// Check if this box overlaps any other boxes in boxes. - BoxPosition.prototype.overlapsAny = function (boxes) { - for (var i = 0; i < boxes.length; i++) { - if (this.overlaps(boxes[i])) { - return true; - } - } - return false; - }; - -// Check if this box is within another box. - BoxPosition.prototype.within = function (container) { - return this.top >= container.top && - this.bottom <= container.bottom && - this.left >= container.left && - this.right <= container.right; - }; - -// Check if this box is entirely within the container or it is overlapping -// on the edge opposite of the axis direction passed. For example, if "+x" is -// passed and the box is overlapping on the left edge of the container, then -// return true. - BoxPosition.prototype.overlapsOppositeAxis = function (container, axis) { - switch (axis) { - case "+x": - return this.left < container.left; - case "-x": - return this.right > container.right; - case "+y": - return this.top < container.top; - case "-y": - return this.bottom > container.bottom; - } - }; - -// Find the percentage of the area that this box is overlapping with another -// box. - BoxPosition.prototype.intersectPercentage = function (b2) { - var x = Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)), - y = Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)), - intersectArea = x * y; - return intersectArea / (this.height * this.width); - }; - -// Convert the positions from this box to CSS compatible positions using -// the reference container's positions. This has to be done because this -// box's positions are in reference to the viewport origin, whereas, CSS -// values are in referecne to their respective edges. - BoxPosition.prototype.toCSSCompatValues = function (reference) { - return { - top: this.top - reference.top, - bottom: reference.bottom - this.bottom, - left: this.left - reference.left, - right: reference.right - this.right, - height: this.height, - width: this.width - }; - }; - -// Get an object that represents the box's position without anything extra. -// Can pass a StyleBox, HTMLElement, or another BoxPositon. - BoxPosition.getSimpleBoxPosition = function (obj) { - var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0; - var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0; - var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0; - - obj = obj.div ? obj.div.getBoundingClientRect() : - obj.tagName ? obj.getBoundingClientRect() : obj; - var ret = { - left: obj.left, - right: obj.right, - top: obj.top || top, - height: obj.height || height, - bottom: obj.bottom || (top + (obj.height || height)), - width: obj.width || width - }; - return ret; - }; - -// Move a StyleBox to its specified, or next best, position. The containerBox -// is the box that contains the StyleBox, such as a div. boxPositions are -// a list of other boxes that the styleBox can't overlap with. - function moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) { - - // Find the best position for a cue box, b, on the video. The axis parameter - // is a list of axis, the order of which, it will move the box along. For example: - // Passing ["+x", "-x"] will move the box first along the x axis in the positive - // direction. If it doesn't find a good position for it there it will then move - // it along the x axis in the negative direction. - function findBestPosition(b, axis) { - var bestPosition, - specifiedPosition = new BoxPosition(b), - percentage = 1; // Highest possible so the first thing we get is better. - - for (var i = 0; i < axis.length; i++) { - while (b.overlapsOppositeAxis(containerBox, axis[i]) || - (b.within(containerBox) && b.overlapsAny(boxPositions))) { - b.move(axis[i]); - } - // We found a spot where we aren't overlapping anything. This is our - // best position. - if (b.within(containerBox)) { - return b; - } - var p = b.intersectPercentage(containerBox); - // If we're outside the container box less then we were on our last try - // then remember this position as the best position. - if (percentage > p) { - bestPosition = new BoxPosition(b); - percentage = p; - } - // Reset the box position to the specified position. - b = new BoxPosition(specifiedPosition); - } - return bestPosition || specifiedPosition; - } - - var boxPosition = new BoxPosition(styleBox), - cue = styleBox.cue, - linePos = computeLinePos(cue), - axis = []; - - // If we have a line number to align the cue to. - if (cue.snapToLines) { - var size; - switch (cue.vertical) { - case "": - axis = ["+y", "-y"]; - size = "height"; - break; - case "rl": - axis = ["+x", "-x"]; - size = "width"; - break; - case "lr": - axis = ["-x", "+x"]; - size = "width"; - break; - } - - var step = boxPosition.lineHeight, - position = step * Math.round(linePos), - maxPosition = containerBox[size] + step, - initialAxis = axis[0]; - - // If the specified intial position is greater then the max position then - // clamp the box to the amount of steps it would take for the box to - // reach the max position. - if (Math.abs(position) > maxPosition) { - position = position < 0 ? -1 : 1; - position *= Math.ceil(maxPosition / step) * step; - } - - // If computed line position returns negative then line numbers are - // relative to the bottom of the video instead of the top. Therefore, we - // need to increase our initial position by the length or width of the - // video, depending on the writing direction, and reverse our axis directions. - if (linePos < 0) { - position += cue.vertical === "" ? containerBox.height : containerBox.width; - axis = axis.reverse(); - } - - // Move the box to the specified position. This may not be its best - // position. - boxPosition.move(initialAxis, position); - - } else { - // If we have a percentage line value for the cue. - var calculatedPercentage = (boxPosition.lineHeight / containerBox.height) * 100; - - switch (cue.lineAlign) { - case "middle": - linePos -= (calculatedPercentage / 2); - break; - case "end": - linePos -= calculatedPercentage; - break; - } - - // Apply initial line position to the cue box. - switch (cue.vertical) { - case "": - styleBox.applyStyles({ - top: styleBox.formatStyle(linePos, "%") - }); - break; - case "rl": - styleBox.applyStyles({ - left: styleBox.formatStyle(linePos, "%") - }); - break; - case "lr": - styleBox.applyStyles({ - right: styleBox.formatStyle(linePos, "%") - }); - break; - } - - axis = ["+y", "-x", "+x", "-y"]; - - // Get the box position again after we've applied the specified positioning - // to it. - boxPosition = new BoxPosition(styleBox); - } - - var bestPosition = findBestPosition(boxPosition, axis); - styleBox.move(bestPosition.toCSSCompatValues(containerBox)); - } - - function WebVTT$1() { - // Nothing - } - -// Helper to allow strings to be decoded instead of the default binary utf8 data. - WebVTT$1.StringDecoder = function () { - return { - decode: function (data) { - if (!data) { - return ""; - } - if (typeof data !== "string") { - throw new Error("Error - expected string data."); - } - return decodeURIComponent(encodeURIComponent(data)); - } - }; - }; - - WebVTT$1.convertCueToDOMTree = function (window, cuetext) { - if (!window || !cuetext) { - return null; - } - return parseContent(window, cuetext); - }; - - var FONT_SIZE_PERCENT = 0.05; - var FONT_STYLE = "sans-serif"; - var CUE_BACKGROUND_PADDING = "1.5%"; - -// Runs the processing model over the cues and regions passed to it. -// @param overlay A block level element (usually a div) that the computed cues -// and regions will be placed into. - WebVTT$1.processCues = function (window, cues, overlay) { - if (!window || !cues || !overlay) { - return null; - } - - // Remove all previous children. - while (overlay.firstChild) { - overlay.removeChild(overlay.firstChild); - } - - var paddedOverlay = window.document.createElement("div"); - paddedOverlay.style.position = "absolute"; - paddedOverlay.style.left = "0"; - paddedOverlay.style.right = "0"; - paddedOverlay.style.top = "0"; - paddedOverlay.style.bottom = "0"; - paddedOverlay.style.margin = CUE_BACKGROUND_PADDING; - overlay.appendChild(paddedOverlay); - - // Determine if we need to compute the display states of the cues. This could - // be the case if a cue's state has been changed since the last computation or - // if it has not been computed yet. - function shouldCompute(cues) { - for (var i = 0; i < cues.length; i++) { - if (cues[i].hasBeenReset || !cues[i].displayState) { - return true; - } - } - return false; - } - - // We don't need to recompute the cues' display states. Just reuse them. - if (!shouldCompute(cues)) { - for (var i = 0; i < cues.length; i++) { - paddedOverlay.appendChild(cues[i].displayState); - } - return; - } - - var boxPositions = [], - containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay), - fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100; - var styleOptions = { - font: fontSize + "px " + FONT_STYLE - }; - - (function () { - var styleBox, cue; - - for (var i = 0; i < cues.length; i++) { - cue = cues[i]; - - // Compute the intial position and styles of the cue div. - styleBox = new CueStyleBox(window, cue, styleOptions); - paddedOverlay.appendChild(styleBox.div); - - // Move the cue div to it's correct line position. - moveBoxToLinePosition(window, styleBox, containerBox, boxPositions); - - // Remember the computed div so that we don't have to recompute it later - // if we don't have too. - cue.displayState = styleBox.div; - - boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox)); - } - })(); - }; - - WebVTT$1.Parser = function (window, vttjs, decoder) { - if (!decoder) { - decoder = vttjs; - vttjs = {}; - } - if (!vttjs) { - vttjs = {}; - } - - this.window = window; - this.vttjs = vttjs; - this.state = "INITIAL"; - this.buffer = ""; - this.decoder = decoder || new TextDecoder("utf8"); - this.regionList = []; - }; - - WebVTT$1.Parser.prototype = { - // If the error is a ParsingError then report it to the consumer if - // possible. If it's not a ParsingError then throw it like normal. - reportOrThrowError: function (e) { - if (e instanceof ParsingError) { - this.onparsingerror && this.onparsingerror(e); - } else { - throw e; - } - }, - parse: function (data) { - var self = this; - - // If there is no data then we won't decode it, but will just try to parse - // whatever is in buffer already. This may occur in circumstances, for - // example when flush() is called. - if (data) { - // Try to decode the data that we received. - self.buffer += self.decoder.decode(data, {stream: true}); - } - - function collectNextLine() { - var buffer = self.buffer; - var pos = 0; - while (pos < buffer.length && buffer[pos] !== '\r' && buffer[pos] !== '\n') { - ++pos; - } - var line = buffer.substr(0, pos); - // Advance the buffer early in case we fail below. - if (buffer[pos] === '\r') { - ++pos; - } - if (buffer[pos] === '\n') { - ++pos; - } - self.buffer = buffer.substr(pos); - return line; - } - - // 3.4 WebVTT region and WebVTT region settings syntax - function parseRegion(input) { - var settings = new Settings(); - - parseOptions(input, function (k, v) { - switch (k) { - case "id": - settings.set(k, v); - break; - case "width": - settings.percent(k, v); - break; - case "lines": - settings.integer(k, v); - break; - case "regionanchor": - case "viewportanchor": - var xy = v.split(','); - if (xy.length !== 2) { - break; - } - // We have to make sure both x and y parse, so use a temporary - // settings object here. - var anchor = new Settings(); - anchor.percent("x", xy[0]); - anchor.percent("y", xy[1]); - if (!anchor.has("x") || !anchor.has("y")) { - break; - } - settings.set(k + "X", anchor.get("x")); - settings.set(k + "Y", anchor.get("y")); - break; - case "scroll": - settings.alt(k, v, ["up"]); - break; - } - }, /=/, /\s/); - - // Create the region, using default values for any values that were not - // specified. - if (settings.has("id")) { - var region = new (self.vttjs.VTTRegion || self.window.VTTRegion)(); - region.width = settings.get("width", 100); - region.lines = settings.get("lines", 3); - region.regionAnchorX = settings.get("regionanchorX", 0); - region.regionAnchorY = settings.get("regionanchorY", 100); - region.viewportAnchorX = settings.get("viewportanchorX", 0); - region.viewportAnchorY = settings.get("viewportanchorY", 100); - region.scroll = settings.get("scroll", ""); - // Register the region. - self.onregion && self.onregion(region); - // Remember the VTTRegion for later in case we parse any VTTCues that - // reference it. - self.regionList.push({ - id: settings.get("id"), - region: region - }); - } - } - - // draft-pantos-http-live-streaming-20 - // https://tools.ietf.org/html/draft-pantos-http-live-streaming-20#section-3.5 - // 3.5 WebVTT - function parseTimestampMap(input) { - var settings = new Settings(); - - parseOptions(input, function (k, v) { - switch (k) { - case "MPEGT": - settings.integer(k + 'S', v); - break; - case "LOCA": - settings.set(k + 'L', parseTimeStamp(v)); - break; - } - }, /[^\d]:/, /,/); - - self.ontimestampmap && self.ontimestampmap({ - "MPEGTS": settings.get("MPEGTS"), - "LOCAL": settings.get("LOCAL") - }); - } - - // 3.2 WebVTT metadata header syntax - function parseHeader(input) { - if (input.match(/X-TIMESTAMP-MAP/)) { - // This line contains HLS X-TIMESTAMP-MAP metadata - parseOptions(input, function (k, v) { - switch (k) { - case "X-TIMESTAMP-MAP": - parseTimestampMap(v); - break; - } - }, /=/); - } else { - parseOptions(input, function (k, v) { - switch (k) { - case "Region": - // 3.3 WebVTT region metadata header syntax - parseRegion(v); - break; - } - }, /:/); - } - - } - - // 5.1 WebVTT file parsing. - try { - var line; - if (self.state === "INITIAL") { - // We can't start parsing until we have the first line. - if (!/\r\n|\n/.test(self.buffer)) { - return this; - } - - line = collectNextLine(); - - var m = line.match(/^WEBVTT([ \t].*)?$/); - if (!m || !m[0]) { - throw new ParsingError(ParsingError.Errors.BadSignature); - } - - self.state = "HEADER"; - } - - var alreadyCollectedLine = false; - while (self.buffer) { - // We can't parse a line until we have the full line. - if (!/\r\n|\n/.test(self.buffer)) { - return this; - } - - if (!alreadyCollectedLine) { - line = collectNextLine(); - } else { - alreadyCollectedLine = false; - } - - switch (self.state) { - case "HEADER": - // 13-18 - Allow a header (metadata) under the WEBVTT line. - if (/:/.test(line)) { - parseHeader(line); - } else if (!line) { - // An empty line terminates the header and starts the body (cues). - self.state = "ID"; - } - continue; - case "NOTE": - // Ignore NOTE blocks. - if (!line) { - self.state = "ID"; - } - continue; - case "ID": - // Check for the start of NOTE blocks. - if (/^NOTE($|[ \t])/.test(line)) { - self.state = "NOTE"; - break; - } - // 19-29 - Allow any number of line terminators, then initialize new cue values. - if (!line) { - continue; - } - self.cue = new (self.vttjs.VTTCue || self.window.VTTCue)(0, 0, ""); - self.state = "CUE"; - // 30-39 - Check if self line contains an optional identifier or timing data. - if (line.indexOf("-->") === -1) { - self.cue.id = line; - continue; - } - // Process line as start of a cue. - /*falls through*/ - case "CUE": - // 40 - Collect cue timings and settings. - try { - parseCue(line, self.cue, self.regionList); - } catch (e) { - self.reportOrThrowError(e); - // In case of an error ignore rest of the cue. - self.cue = null; - self.state = "BADCUE"; - continue; - } - self.state = "CUETEXT"; - continue; - case "CUETEXT": - var hasSubstring = line.indexOf("-->") !== -1; - // 34 - If we have an empty line then report the cue. - // 35 - If we have the special substring '-->' then report the cue, - // but do not collect the line as we need to process the current - // one as a new cue. - if (!line || hasSubstring && (alreadyCollectedLine = true)) { - // We are done parsing self cue. - self.oncue && self.oncue(self.cue); - self.cue = null; - self.state = "ID"; - continue; - } - if (self.cue.text) { - self.cue.text += "\n"; - } - self.cue.text += line; - continue; - case "BADCUE": // BADCUE - // 54-62 - Collect and discard the remaining cue. - if (!line) { - self.state = "ID"; - } - continue; - } - } - } catch (e) { - self.reportOrThrowError(e); - - // If we are currently parsing a cue, report what we have. - if (self.state === "CUETEXT" && self.cue && self.oncue) { - self.oncue(self.cue); - } - self.cue = null; - // Enter BADWEBVTT state if header was not parsed correctly otherwise - // another exception occurred so enter BADCUE state. - self.state = self.state === "INITIAL" ? "BADWEBVTT" : "BADCUE"; - } - return this; - }, - flush: function () { - var self = this; - try { - // Finish decoding the stream. - self.buffer += self.decoder.decode(); - // Synthesize the end of the current cue or region. - if (self.cue || self.state === "HEADER") { - self.buffer += "\n\n"; - self.parse(); - } - // If we've flushed, parsed, and we're still on the INITIAL state then - // that means we don't have enough of the stream to parse the first - // line. - if (self.state === "INITIAL") { - throw new ParsingError(ParsingError.Errors.BadSignature); - } - } catch (e) { - self.reportOrThrowError(e); - } - self.onflush && self.onflush(); - return this; - } - }; - - var vtt$1 = WebVTT$1; - - /** - * Copyright 2013 vtt.js Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - var autoKeyword = "auto"; - var directionSetting = { - "": true, - "lr": true, - "rl": true - }; - var alignSetting = { - "start": true, - "middle": true, - "end": true, - "left": true, - "right": true - }; - - function findDirectionSetting(value) { - if (typeof value !== "string") { - return false; - } - var dir = directionSetting[value.toLowerCase()]; - return dir ? value.toLowerCase() : false; - } - - function findAlignSetting(value) { - if (typeof value !== "string") { - return false; - } - var align = alignSetting[value.toLowerCase()]; - return align ? value.toLowerCase() : false; - } - - function extend$1(obj) { - var i = 1; - for (; i < arguments.length; i++) { - var cobj = arguments[i]; - for (var p in cobj) { - obj[p] = cobj[p]; - } - } - - return obj; - } - - function VTTCue(startTime, endTime, text) { - var cue = this; - var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent); - var baseObj = {}; - - if (isIE8) { - cue = document.createElement('custom'); - } else { - baseObj.enumerable = true; - } - - /** - * Shim implementation specific properties. These properties are not in - * the spec. - */ - - // Lets us know when the VTTCue's data has changed in such a way that we need - // to recompute its display state. This lets us compute its display state - // lazily. - cue.hasBeenReset = false; - - /** - * VTTCue and TextTrackCue properties - * http://dev.w3.org/html5/webvtt/#vttcue-interface - */ - - var _id = ""; - var _pauseOnExit = false; - var _startTime = startTime; - var _endTime = endTime; - var _text = text; - var _region = null; - var _vertical = ""; - var _snapToLines = true; - var _line = "auto"; - var _lineAlign = "start"; - var _position = 50; - var _positionAlign = "middle"; - var _size = 50; - var _align = "middle"; - - Object.defineProperty(cue, - "id", extend$1({}, baseObj, { - get: function () { - return _id; - }, - set: function (value) { - _id = "" + value; - } - })); - - Object.defineProperty(cue, - "pauseOnExit", extend$1({}, baseObj, { - get: function () { - return _pauseOnExit; - }, - set: function (value) { - _pauseOnExit = !!value; - } - })); - - Object.defineProperty(cue, - "startTime", extend$1({}, baseObj, { - get: function () { - return _startTime; - }, - set: function (value) { - if (typeof value !== "number") { - throw new TypeError("Start time must be set to a number."); - } - _startTime = value; - this.hasBeenReset = true; - } - })); - - Object.defineProperty(cue, - "endTime", extend$1({}, baseObj, { - get: function () { - return _endTime; - }, - set: function (value) { - if (typeof value !== "number") { - throw new TypeError("End time must be set to a number."); - } - _endTime = value; - this.hasBeenReset = true; - } - })); - - Object.defineProperty(cue, - "text", extend$1({}, baseObj, { - get: function () { - return _text; - }, - set: function (value) { - _text = "" + value; - this.hasBeenReset = true; - } - })); - - Object.defineProperty(cue, - "region", extend$1({}, baseObj, { - get: function () { - return _region; - }, - set: function (value) { - _region = value; - this.hasBeenReset = true; - } - })); - - Object.defineProperty(cue, - "vertical", extend$1({}, baseObj, { - get: function () { - return _vertical; - }, - set: function (value) { - var setting = findDirectionSetting(value); - // Have to check for false because the setting an be an empty string. - if (setting === false) { - throw new SyntaxError("An invalid or illegal string was specified."); - } - _vertical = setting; - this.hasBeenReset = true; - } - })); - - Object.defineProperty(cue, - "snapToLines", extend$1({}, baseObj, { - get: function () { - return _snapToLines; - }, - set: function (value) { - _snapToLines = !!value; - this.hasBeenReset = true; - } - })); - - Object.defineProperty(cue, - "line", extend$1({}, baseObj, { - get: function () { - return _line; - }, - set: function (value) { - if (typeof value !== "number" && value !== autoKeyword) { - throw new SyntaxError("An invalid number or illegal string was specified."); - } - _line = value; - this.hasBeenReset = true; - } - })); - - Object.defineProperty(cue, - "lineAlign", extend$1({}, baseObj, { - get: function () { - return _lineAlign; - }, - set: function (value) { - var setting = findAlignSetting(value); - if (!setting) { - throw new SyntaxError("An invalid or illegal string was specified."); - } - _lineAlign = setting; - this.hasBeenReset = true; - } - })); - - Object.defineProperty(cue, - "position", extend$1({}, baseObj, { - get: function () { - return _position; - }, - set: function (value) { - if (value < 0 || value > 100) { - throw new Error("Position must be between 0 and 100."); - } - _position = value; - this.hasBeenReset = true; - } - })); - - Object.defineProperty(cue, - "positionAlign", extend$1({}, baseObj, { - get: function () { - return _positionAlign; - }, - set: function (value) { - var setting = findAlignSetting(value); - if (!setting) { - throw new SyntaxError("An invalid or illegal string was specified."); - } - _positionAlign = setting; - this.hasBeenReset = true; - } - })); - - Object.defineProperty(cue, - "size", extend$1({}, baseObj, { - get: function () { - return _size; - }, - set: function (value) { - if (value < 0 || value > 100) { - throw new Error("Size must be between 0 and 100."); - } - _size = value; - this.hasBeenReset = true; - } - })); - - Object.defineProperty(cue, - "align", extend$1({}, baseObj, { - get: function () { - return _align; - }, - set: function (value) { - var setting = findAlignSetting(value); - if (!setting) { - throw new SyntaxError("An invalid or illegal string was specified."); - } - _align = setting; - this.hasBeenReset = true; - } - })); - - /** - * Other spec defined properties - */ - - // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state - cue.displayState = undefined; - - if (isIE8) { - return cue; - } - } - - /** - * VTTCue methods - */ - - VTTCue.prototype.getCueAsHTML = function () { - // Assume WebVTT.convertCueToDOMTree is on the global. - return WebVTT.convertCueToDOMTree(window, this.text); - }; - - var vttcue = VTTCue; - - /** - * Copyright 2013 vtt.js Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - var scrollSetting = { - "": true, - "up": true - }; - - function findScrollSetting(value) { - if (typeof value !== "string") { - return false; - } - var scroll = scrollSetting[value.toLowerCase()]; - return scroll ? value.toLowerCase() : false; - } - - function isValidPercentValue(value) { - return typeof value === "number" && (value >= 0 && value <= 100); - } - -// VTTRegion shim http://dev.w3.org/html5/webvtt/#vttregion-interface - function VTTRegion() { - var _width = 100; - var _lines = 3; - var _regionAnchorX = 0; - var _regionAnchorY = 100; - var _viewportAnchorX = 0; - var _viewportAnchorY = 100; - var _scroll = ""; - - Object.defineProperties(this, { - "width": { - enumerable: true, - get: function () { - return _width; - }, - set: function (value) { - if (!isValidPercentValue(value)) { - throw new Error("Width must be between 0 and 100."); - } - _width = value; - } - }, - "lines": { - enumerable: true, - get: function () { - return _lines; - }, - set: function (value) { - if (typeof value !== "number") { - throw new TypeError("Lines must be set to a number."); - } - _lines = value; - } - }, - "regionAnchorY": { - enumerable: true, - get: function () { - return _regionAnchorY; - }, - set: function (value) { - if (!isValidPercentValue(value)) { - throw new Error("RegionAnchorX must be between 0 and 100."); - } - _regionAnchorY = value; - } - }, - "regionAnchorX": { - enumerable: true, - get: function () { - return _regionAnchorX; - }, - set: function (value) { - if (!isValidPercentValue(value)) { - throw new Error("RegionAnchorY must be between 0 and 100."); - } - _regionAnchorX = value; - } - }, - "viewportAnchorY": { - enumerable: true, - get: function () { - return _viewportAnchorY; - }, - set: function (value) { - if (!isValidPercentValue(value)) { - throw new Error("ViewportAnchorY must be between 0 and 100."); - } - _viewportAnchorY = value; - } - }, - "viewportAnchorX": { - enumerable: true, - get: function () { - return _viewportAnchorX; - }, - set: function (value) { - if (!isValidPercentValue(value)) { - throw new Error("ViewportAnchorX must be between 0 and 100."); - } - _viewportAnchorX = value; - } - }, - "scroll": { - enumerable: true, - get: function () { - return _scroll; - }, - set: function (value) { - var setting = findScrollSetting(value); - // Have to check for false as an empty string is a legal value. - if (setting === false) { - throw new SyntaxError("An invalid or illegal string was specified."); - } - _scroll = setting; - } - } - }); - } - - var vttregion = VTTRegion; - - var browserIndex = createCommonjsModule(function (module) { - /** - * Copyright 2013 vtt.js Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Default exports for Node. Export the extended versions of VTTCue and -// VTTRegion in Node since we likely want the capability to convert back and -// forth between JSON. If we don't then it's not that big of a deal since we're -// off browser. - - - var vttjs = module.exports = { - WebVTT: vtt$1, - VTTCue: vttcue, - VTTRegion: vttregion - }; - - window_1.vttjs = vttjs; - window_1.WebVTT = vttjs.WebVTT; - - var cueShim = vttjs.VTTCue; - var regionShim = vttjs.VTTRegion; - var nativeVTTCue = window_1.VTTCue; - var nativeVTTRegion = window_1.VTTRegion; - - vttjs.shim = function () { - window_1.VTTCue = cueShim; - window_1.VTTRegion = regionShim; - }; - - vttjs.restore = function () { - window_1.VTTCue = nativeVTTCue; - window_1.VTTRegion = nativeVTTRegion; - }; - - if (!window_1.VTTCue) { - vttjs.shim(); - } - }); - - /** - * @file tech.js - */ - - /** - * An Object containing a structure like: `{src: 'url', type: 'mimetype'}` or string - * that just contains the src url alone. - * * `var SourceObject = {src: 'http://ex.com/video.mp4', type: 'video/mp4'};` - * `var SourceString = 'http://example.com/some-video.mp4';` - * - * @typedef {Object|string} Tech~SourceObject - * - * @property {string} src - * The url to the source - * - * @property {string} type - * The mime type of the source - */ - - /** - * A function used by {@link Tech} to create a new {@link TextTrack}. - * - * @private - * - * @param {Tech} self - * An instance of the Tech class. - * - * @param {string} kind - * `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata) - * - * @param {string} [label] - * Label to identify the text track - * - * @param {string} [language] - * Two letter language abbreviation - * - * @param {Object} [options={}] - * An object with additional text track options - * - * @return {TextTrack} - * The text track that was created. - */ - function createTrackHelper(self, kind, label, language) { - var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - - var tracks = self.textTracks(); - - options.kind = kind; - - if (label) { - options.label = label; - } - if (language) { - options.language = language; - } - options.tech = self; - - var track = new ALL.text.TrackClass(options); - - tracks.addTrack(track); - - return track; - } - - /** - * This is the base class for media playback technology controllers, such as - * {@link Flash} and {@link HTML5} - * - * @extends Component - */ - - var Tech = function (_Component) { - inherits(Tech, _Component); - - /** - * Create an instance of this Tech. - * - * @param {Object} [options] - * The key/value store of player options. - * - * @param {Component~ReadyCallback} ready - * Callback function to call when the `HTML5` Tech is ready. - */ - function Tech() { - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var ready = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () { - }; - classCallCheck(this, Tech); - - // we don't want the tech to report user activity automatically. - // This is done manually in addControlsListeners - options.reportTouchActivity = false; - - // keep track of whether the current source has played at all to - // implement a very limited played() - var _this = possibleConstructorReturn(this, _Component.call(this, null, options, ready)); - - _this.hasStarted_ = false; - _this.on('playing', function () { - this.hasStarted_ = true; - }); - _this.on('loadstart', function () { - this.hasStarted_ = false; - }); - - ALL.names.forEach(function (name) { - var props = ALL[name]; - - if (options && options[props.getterName]) { - _this[props.privateName] = options[props.getterName]; - } - }); - - // Manually track progress in cases where the browser/flash player doesn't report it. - if (!_this.featuresProgressEvents) { - _this.manualProgressOn(); - } - - // Manually track timeupdates in cases where the browser/flash player doesn't report it. - if (!_this.featuresTimeupdateEvents) { - _this.manualTimeUpdatesOn(); - } - - ['Text', 'Audio', 'Video'].forEach(function (track) { - if (options['native' + track + 'Tracks'] === false) { - _this['featuresNative' + track + 'Tracks'] = false; - } - }); - - if (options.nativeCaptions === false || options.nativeTextTracks === false) { - _this.featuresNativeTextTracks = false; - } else if (options.nativeCaptions === true || options.nativeTextTracks === true) { - _this.featuresNativeTextTracks = true; - } - - if (!_this.featuresNativeTextTracks) { - _this.emulateTextTracks(); - } - - _this.autoRemoteTextTracks_ = new ALL.text.ListClass(); - - _this.initTrackListeners(); - - // Turn on component tap events only if not using native controls - if (!options.nativeControlsForTouch) { - _this.emitTapEvents(); - } - - if (_this.constructor) { - _this.name_ = _this.constructor.name || 'Unknown Tech'; - } - return _this; - } - - /* Fallbacks for unsupported event types - ================================================================================ */ - - /** - * Polyfill the `progress` event for browsers that don't support it natively. - * - * @see {@link Tech#trackProgress} - */ - - - Tech.prototype.manualProgressOn = function manualProgressOn() { - this.on('durationchange', this.onDurationChange); - - this.manualProgress = true; - - // Trigger progress watching when a source begins loading - this.one('ready', this.trackProgress); - }; - - /** - * Turn off the polyfill for `progress` events that was created in - * {@link Tech#manualProgressOn} - */ - - - Tech.prototype.manualProgressOff = function manualProgressOff() { - this.manualProgress = false; - this.stopTrackingProgress(); - - this.off('durationchange', this.onDurationChange); - }; - - /** - * This is used to trigger a `progress` event when the buffered percent changes. It - * sets an interval function that will be called every 500 milliseconds to check if the - * buffer end percent has changed. - * - * > This function is called by {@link Tech#manualProgressOn} - * - * @param {EventTarget~Event} event - * The `ready` event that caused this to run. - * - * @listens Tech#ready - * @fires Tech#progress - */ - - - Tech.prototype.trackProgress = function trackProgress(event) { - this.stopTrackingProgress(); - this.progressInterval = this.setInterval(bind(this, function () { - // Don't trigger unless buffered amount is greater than last time - - var numBufferedPercent = this.bufferedPercent(); - - if (this.bufferedPercent_ !== numBufferedPercent) { - /** - * See {@link Player#progress} - * - * @event Tech#progress - * @type {EventTarget~Event} - */ - this.trigger('progress'); - } - - this.bufferedPercent_ = numBufferedPercent; - - if (numBufferedPercent === 1) { - this.stopTrackingProgress(); - } - }), 500); - }; - - /** - * Update our internal duration on a `durationchange` event by calling - * {@link Tech#duration}. - * - * @param {EventTarget~Event} event - * The `durationchange` event that caused this to run. - * - * @listens Tech#durationchange - */ - - - Tech.prototype.onDurationChange = function onDurationChange(event) { - this.duration_ = this.duration(); - }; - - /** - * Get and create a `TimeRange` object for buffering. - * - * @return {TimeRange} - * The time range object that was created. - */ - - - Tech.prototype.buffered = function buffered() { - return createTimeRanges(0, 0); - }; - - /** - * Get the percentage of the current video that is currently buffered. - * - * @return {number} - * A number from 0 to 1 that represents the decimal percentage of the - * video that is buffered. - * - */ - - - Tech.prototype.bufferedPercent = function bufferedPercent$$1() { - return bufferedPercent(this.buffered(), this.duration_); - }; - - /** - * Turn off the polyfill for `progress` events that was created in - * {@link Tech#manualProgressOn} - * Stop manually tracking progress events by clearing the interval that was set in - * {@link Tech#trackProgress}. - */ - - - Tech.prototype.stopTrackingProgress = function stopTrackingProgress() { - this.clearInterval(this.progressInterval); - }; - - /** - * Polyfill the `timeupdate` event for browsers that don't support it. - * - * @see {@link Tech#trackCurrentTime} - */ - - - Tech.prototype.manualTimeUpdatesOn = function manualTimeUpdatesOn() { - this.manualTimeUpdates = true; - - this.on('play', this.trackCurrentTime); - this.on('pause', this.stopTrackingCurrentTime); - }; - - /** - * Turn off the polyfill for `timeupdate` events that was created in - * {@link Tech#manualTimeUpdatesOn} - */ - - - Tech.prototype.manualTimeUpdatesOff = function manualTimeUpdatesOff() { - this.manualTimeUpdates = false; - this.stopTrackingCurrentTime(); - this.off('play', this.trackCurrentTime); - this.off('pause', this.stopTrackingCurrentTime); - }; - - /** - * Sets up an interval function to track current time and trigger `timeupdate` every - * 250 milliseconds. - * - * @listens Tech#play - * @triggers Tech#timeupdate - */ - - - Tech.prototype.trackCurrentTime = function trackCurrentTime() { - if (this.currentTimeInterval) { - this.stopTrackingCurrentTime(); - } - this.currentTimeInterval = this.setInterval(function () { - /** - * Triggered at an interval of 250ms to indicated that time is passing in the video. - * - * @event Tech#timeupdate - * @type {EventTarget~Event} - */ - this.trigger({type: 'timeupdate', target: this, manuallyTriggered: true}); - - // 42 = 24 fps // 250 is what Webkit uses // FF uses 15 - }, 250); - }; - - /** - * Stop the interval function created in {@link Tech#trackCurrentTime} so that the - * `timeupdate` event is no longer triggered. - * - * @listens {Tech#pause} - */ - - - Tech.prototype.stopTrackingCurrentTime = function stopTrackingCurrentTime() { - this.clearInterval(this.currentTimeInterval); - - // #1002 - if the video ends right before the next timeupdate would happen, - // the progress bar won't make it all the way to the end - this.trigger({type: 'timeupdate', target: this, manuallyTriggered: true}); - }; - - /** - * Turn off all event polyfills, clear the `Tech`s {@link AudioTrackList}, - * {@link VideoTrackList}, and {@link TextTrackList}, and dispose of this Tech. - * - * @fires Component#dispose - */ - - - Tech.prototype.dispose = function dispose() { - - // clear out all tracks because we can't reuse them between techs - this.clearTracks(NORMAL.names); - - // Turn off any manual progress or timeupdate tracking - if (this.manualProgress) { - this.manualProgressOff(); - } - - if (this.manualTimeUpdates) { - this.manualTimeUpdatesOff(); - } - - _Component.prototype.dispose.call(this); - }; - - /** - * Clear out a single `TrackList` or an array of `TrackLists` given their names. - * - * > Note: Techs without source handlers should call this between sources for `video` - * & `audio` tracks. You don't want to use them between tracks! - * - * @param {string[]|string} types - * TrackList names to clear, valid names are `video`, `audio`, and - * `text`. - */ - - - Tech.prototype.clearTracks = function clearTracks(types) { - var _this2 = this; - - types = [].concat(types); - // clear out all tracks because we can't reuse them between techs - types.forEach(function (type) { - var list = _this2[type + 'Tracks']() || []; - var i = list.length; - - while (i--) { - var track = list[i]; - - if (type === 'text') { - _this2.removeRemoteTextTrack(track); - } - list.removeTrack(track); - } - }); - }; - - /** - * Remove any TextTracks added via addRemoteTextTrack that are - * flagged for automatic garbage collection - */ - - - Tech.prototype.cleanupAutoTextTracks = function cleanupAutoTextTracks() { - var list = this.autoRemoteTextTracks_ || []; - var i = list.length; - - while (i--) { - var track = list[i]; - - this.removeRemoteTextTrack(track); - } - }; - - /** - * Reset the tech, which will removes all sources and reset the internal readyState. - * - * @abstract - */ - - - Tech.prototype.reset = function reset() { - }; - - /** - * Get or set an error on the Tech. - * - * @param {MediaError} [err] - * Error to set on the Tech - * - * @return {MediaError|null} - * The current error object on the tech, or null if there isn't one. - */ - - - Tech.prototype.error = function error(err) { - if (err !== undefined) { - this.error_ = new MediaError(err); - this.trigger('error'); - } - return this.error_; - }; - - /** - * Returns the `TimeRange`s that have been played through for the current source. - * - * > NOTE: This implementation is incomplete. It does not track the played `TimeRange`. - * It only checks wether the source has played at all or not. - * - * @return {TimeRange} - * - A single time range if this video has played - * - An empty set of ranges if not. - */ - - - Tech.prototype.played = function played() { - if (this.hasStarted_) { - return createTimeRanges(0, 0); - } - return createTimeRanges(); - }; - - /** - * Causes a manual time update to occur if {@link Tech#manualTimeUpdatesOn} was - * previously called. - * - * @fires Tech#timeupdate - */ - - - Tech.prototype.setCurrentTime = function setCurrentTime() { - // improve the accuracy of manual timeupdates - if (this.manualTimeUpdates) { - /** - * A manual `timeupdate` event. - * - * @event Tech#timeupdate - * @type {EventTarget~Event} - */ - this.trigger({type: 'timeupdate', target: this, manuallyTriggered: true}); - } - }; - - /** - * Turn on listeners for {@link VideoTrackList}, {@link {AudioTrackList}, and - * {@link TextTrackList} events. - * - * This adds {@link EventTarget~EventListeners} for `addtrack`, and `removetrack`. - * - * @fires Tech#audiotrackchange - * @fires Tech#videotrackchange - * @fires Tech#texttrackchange - */ - - - Tech.prototype.initTrackListeners = function initTrackListeners() { - var _this3 = this; - - /** - * Triggered when tracks are added or removed on the Tech {@link AudioTrackList} - * - * @event Tech#audiotrackchange - * @type {EventTarget~Event} - */ - - /** - * Triggered when tracks are added or removed on the Tech {@link VideoTrackList} - * - * @event Tech#videotrackchange - * @type {EventTarget~Event} - */ - - /** - * Triggered when tracks are added or removed on the Tech {@link TextTrackList} - * - * @event Tech#texttrackchange - * @type {EventTarget~Event} - */ - NORMAL.names.forEach(function (name) { - var props = NORMAL[name]; - var trackListChanges = function trackListChanges() { - _this3.trigger(name + 'trackchange'); - }; - - var tracks = _this3[props.getterName](); - - tracks.addEventListener('removetrack', trackListChanges); - tracks.addEventListener('addtrack', trackListChanges); - - _this3.on('dispose', function () { - tracks.removeEventListener('removetrack', trackListChanges); - tracks.removeEventListener('addtrack', trackListChanges); - }); - }); - }; - - /** - * Emulate TextTracks using vtt.js if necessary - * - * @fires Tech#vttjsloaded - * @fires Tech#vttjserror - */ - - - Tech.prototype.addWebVttScript_ = function addWebVttScript_() { - var _this4 = this; - - if (window_1.WebVTT) { - return; - } - - // Initially, Tech.el_ is a child of a dummy-div wait until the Component system - // signals that the Tech is ready at which point Tech.el_ is part of the DOM - // before inserting the WebVTT script - if (document_1.body.contains(this.el())) { - - // load via require if available and vtt.js script location was not passed in - // as an option. novtt builds will turn the above require call into an empty object - // which will cause this if check to always fail. - if (!this.options_['vtt.js'] && isPlain(browserIndex) && Object.keys(browserIndex).length > 0) { - this.trigger('vttjsloaded'); - return; - } - - // load vtt.js via the script location option or the cdn of no location was - // passed in - var script = document_1.createElement('script'); - - script.src = this.options_['vtt.js'] || 'https://vjs.zencdn.net/vttjs/0.12.4/vtt.min.js'; - script.onload = function () { - /** - * Fired when vtt.js is loaded. - * - * @event Tech#vttjsloaded - * @type {EventTarget~Event} - */ - _this4.trigger('vttjsloaded'); - }; - script.onerror = function () { - /** - * Fired when vtt.js was not loaded due to an error - * - * @event Tech#vttjsloaded - * @type {EventTarget~Event} - */ - _this4.trigger('vttjserror'); - }; - this.on('dispose', function () { - script.onload = null; - script.onerror = null; - }); - // but have not loaded yet and we set it to true before the inject so that - // we don't overwrite the injected window.WebVTT if it loads right away - window_1.WebVTT = true; - this.el().parentNode.appendChild(script); - } else { - this.ready(this.addWebVttScript_); - } - }; - - /** - * Emulate texttracks - * - */ - - - Tech.prototype.emulateTextTracks = function emulateTextTracks() { - var _this5 = this; - - var tracks = this.textTracks(); - var remoteTracks = this.remoteTextTracks(); - var handleAddTrack = function handleAddTrack(e) { - return tracks.addTrack(e.track); - }; - var handleRemoveTrack = function handleRemoveTrack(e) { - return tracks.removeTrack(e.track); - }; - - remoteTracks.on('addtrack', handleAddTrack); - remoteTracks.on('removetrack', handleRemoveTrack); - - this.addWebVttScript_(); - - var updateDisplay = function updateDisplay() { - return _this5.trigger('texttrackchange'); - }; - - var textTracksChanges = function textTracksChanges() { - updateDisplay(); - - for (var i = 0; i < tracks.length; i++) { - var track = tracks[i]; - - track.removeEventListener('cuechange', updateDisplay); - if (track.mode === 'showing') { - track.addEventListener('cuechange', updateDisplay); - } - } - }; - - textTracksChanges(); - tracks.addEventListener('change', textTracksChanges); - tracks.addEventListener('addtrack', textTracksChanges); - tracks.addEventListener('removetrack', textTracksChanges); - - this.on('dispose', function () { - remoteTracks.off('addtrack', handleAddTrack); - remoteTracks.off('removetrack', handleRemoveTrack); - tracks.removeEventListener('change', textTracksChanges); - tracks.removeEventListener('addtrack', textTracksChanges); - tracks.removeEventListener('removetrack', textTracksChanges); - - for (var i = 0; i < tracks.length; i++) { - var track = tracks[i]; - - track.removeEventListener('cuechange', updateDisplay); - } - }); - }; - - /** - * Create and returns a remote {@link TextTrack} object. - * - * @param {string} kind - * `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata) - * - * @param {string} [label] - * Label to identify the text track - * - * @param {string} [language] - * Two letter language abbreviation - * - * @return {TextTrack} - * The TextTrack that gets created. - */ - - - Tech.prototype.addTextTrack = function addTextTrack(kind, label, language) { - if (!kind) { - throw new Error('TextTrack kind is required but was not provided'); - } - - return createTrackHelper(this, kind, label, language); - }; - - /** - * Create an emulated TextTrack for use by addRemoteTextTrack - * - * This is intended to be overridden by classes that inherit from - * Tech in order to create native or custom TextTracks. - * - * @param {Object} options - * The object should contain the options to initialize the TextTrack with. - * - * @param {string} [options.kind] - * `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata). - * - * @param {string} [options.label]. - * Label to identify the text track - * - * @param {string} [options.language] - * Two letter language abbreviation. - * - * @return {HTMLTrackElement} - * The track element that gets created. - */ - - - Tech.prototype.createRemoteTextTrack = function createRemoteTextTrack(options) { - var track = mergeOptions(options, { - tech: this - }); - - return new REMOTE.remoteTextEl.TrackClass(track); - }; - - /** - * Creates a remote text track object and returns an html track element. - * - * > Note: This can be an emulated {@link HTMLTrackElement} or a native one. - * - * @param {Object} options - * See {@link Tech#createRemoteTextTrack} for more detailed properties. - * - * @param {boolean} [manualCleanup=true] - * - When false: the TextTrack will be automatically removed from the video - * element whenever the source changes - * - When True: The TextTrack will have to be cleaned up manually - * - * @return {HTMLTrackElement} - * An Html Track Element. - * - * @deprecated The default functionality for this function will be equivalent - * to "manualCleanup=false" in the future. The manualCleanup parameter will - * also be removed. - */ - - - Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack() { - var _this6 = this; - - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - var manualCleanup = arguments[1]; - - var htmlTrackElement = this.createRemoteTextTrack(options); - - if (manualCleanup !== true && manualCleanup !== false) { - // deprecation warning - log$1.warn('Calling addRemoteTextTrack without explicitly setting the "manualCleanup" parameter to `true` is deprecated and default to `false` in future version of video.js'); - manualCleanup = true; - } - - // store HTMLTrackElement and TextTrack to remote list - this.remoteTextTrackEls().addTrackElement_(htmlTrackElement); - this.remoteTextTracks().addTrack(htmlTrackElement.track); - - if (manualCleanup !== true) { - // create the TextTrackList if it doesn't exist - this.ready(function () { - return _this6.autoRemoteTextTracks_.addTrack(htmlTrackElement.track); - }); - } - - return htmlTrackElement; - }; - - /** - * Remove a remote text track from the remote `TextTrackList`. - * - * @param {TextTrack} track - * `TextTrack` to remove from the `TextTrackList` - */ - - - Tech.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) { - var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track); - - // remove HTMLTrackElement and TextTrack from remote list - this.remoteTextTrackEls().removeTrackElement_(trackElement); - this.remoteTextTracks().removeTrack(track); - this.autoRemoteTextTracks_.removeTrack(track); - }; - - /** - * Gets available media playback quality metrics as specified by the W3C's Media - * Playback Quality API. - * - * @see [Spec]{@link https://wicg.github.io/media-playback-quality} - * - * @return {Object} - * An object with supported media playback quality metrics - * - * @abstract - */ - - - Tech.prototype.getVideoPlaybackQuality = function getVideoPlaybackQuality() { - return {}; - }; - - /** - * A method to set a poster from a `Tech`. - * - * @abstract - */ - - - Tech.prototype.setPoster = function setPoster() { - }; - - /** - * A method to check for the presence of the 'playsinine'