{"version":3,"sources":["plyr.js","node_modules/rangetouch/dist/rangetouch.mjs","src/js/utils/is.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/arrays.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/load-sprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/load-image.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/utils/numbers.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/plyr.js"],"names":["navigator","global","factory","exports","module","define","amd","globalThis","self","Plyr","this","_toPropertyKey","t","i","r","e","Symbol","toPrimitive","call","TypeError","String","Number","_toPrimitive","_defineProperty$1","obj","key","value","Object","defineProperty","enumerable","configurable","writable","_defineProperties","n","length","_defineProperty","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","apply","_objectSpread2","arguments","forEach","getOwnPropertyDescriptors","defineProperties","defaults","addCSS","thumbWidth","watch","getConstructor","constructor","instanceOf","isNullOrUndefined","isObject","isString","isArray","Array","isNodeList","NodeList","is","Element","Event","round","concat","match","Math","max","getDecimalPlaces","parseFloat","toFixed","RangeTouch","_classCallCheck","element","document","querySelector","rangeTouch","config","init","prototype","_createClass","enabled","style","userSelect","webKitUserSelect","touchAction","listeners","set","target","changedTouches","o","getAttribute","s","u","c","getBoundingClientRect","a","width","clientX","left","disabled","preventDefault","get","bubbles","dispatchEvent","trigger","type","from","querySelectorAll","MutationObserver","addedNodes","includes","matches","observe","body","childList","subtree","map","documentElement","input","Boolean","isFunction","isEmpty","nullOrUndefined","object","number","isNaN","string","boolean","function","array","weakMap","WeakMap","nodeList","nodeType","ownerDocument","textNode","Text","event","keyboardEvent","KeyboardEvent","cue","window","TextTrackCue","VTTCue","track","TextTrack","kind","promise","Promise","then","url","URL","startsWith","hostname","_","empty","transitionEndEvent","createElement","events","WebkitTransition","MozTransition","OTransition","transition","find","undefined","repaint","delay","setTimeout","hidden","offsetHeight","browser","isIE","documentMode","isEdge","test","userAgent","isWebKit","isIPhone","maxTouchPoints","isIPadOS","platform","isIos","getDeep","path","split","reduce","extend","sources","source","shift","assign","wrap","elements","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","setAttribute","text","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","replace","parts","charAt","class","id","toggleHidden","hide","toggleClass","force","method","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","setFocus","focusVisible","focus","preventScroll","defaultCodecs","support","audio","video","check","provider","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","playsinline","mime","mediaType","isHTML5","media","canPlayType","textTracks","range","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","options","addEventListener","removeEventListener","toggleListener","callback","toggle","passive","capture","eventListeners","on","off","once","onceCallback","args","triggerEvent","detail","CustomEvent","plyr","unbindListeners","item","ready","resolve","silencePromise","dedupe","indexOf","closest","prev","curr","abs","supportsCSS","declaration","CSS","supports","standardRatios","out","x","y","validateAspectRatio","every","reduceAspectRatio","ratio","height","getDivider","w","h","divider","getAspectRatio","parse","embed","videoWidth","videoHeight","setAspectRatio","isVideo","padding","aspectRatio","paddingBottom","isVimeo","vimeo","premium","offsetWidth","parseInt","getComputedStyle","offset","fullscreen","active","transform","add","classNames","videoFixedRatio","roundAspectRatio","tolerance","closestRatio","html5","getSources","getQualityOptions","quality","forced","setup","player","speed","onChange","currentTime","paused","preload","readyState","playbackRate","src","play","load","cancelRequests","blankVideo","debug","log","format","toString","replaceAll","RegExp","toTitleCase","toUpperCase","slice","toLowerCase","toCamelCase","toPascalCase","getHTML","innerHTML","resources","youtube","i18n","seekTime","title","k","v","Storage","store","localStorage","getItem","json","JSON","storage","setItem","stringify","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","error","loadSprite","prefix","hasId","isCached","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","trunc","formatTime","time","displayHours","inverted","hours","mins","secs","getSeconds","controls","getIconUrl","iconUrl","location","host","top","cors","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","props","label","labelPressed","iconPressed","some","control","button","createRange","min","step","autocomplete","role","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","children","node","bind","currentTrack","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","val","getElementsByTagName","nodeValue","current","buffered","percent","setProperty","updateSeekTooltip","_this$config$markers","_this$config$markers$","tooltips","tipElement","visible","show","clientRect","pageX","point","markers","points","insertAdjacentHTML","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","setMarkers","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sort","b","sorting","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","minimumSpeed","maximumSpeed","values","popup","p","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","position","opacity","removeAttribute","scrollWidth","scrollHeight","size","restore","propertyName","setDownloadUrl","download","create","defaultAttributes","progressContainer","inner","home","backButton","href","urls","isEmbed","inject","floor","random","seektime","addProperty","controlPressed","labels","setMediaMetadata","mediaSession","metadata","MediaMetadata","mediaMetadata","artist","album","artwork","_this$config$markers2","_this$config$markers3","containerFragment","createDocumentFragment","pointsFragment","tipVisible","toggleTip","markerElement","marker","tip","parseUrl","safe","parser","buildUrlParams","params","URLSearchParams","isYouTube","protocol","blob","createObjectURL","languages","userLanguage","trackEvents","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","has","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","advertisement","qualityBadge","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","hash","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","providers","types","noop","Console","console","Function","Fullscreen","scrollPosition","scrollX","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","activeElement","first","last","shiftKey","forceFallback","nativeSupported","requestFullscreen","webkitEnterFullscreen","toggleFallback","navigationUI","action","cancelFullScreen","exit","enter","el","parentElement","proxy","trapFocus","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","useNative","pre","getRootNode","fullscreenElement","shadowRoot","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","now","migrateStyles","getPropertyValue","removeProperty","Listeners","handleKey","firstTouch","setGutter","useNativeAspectRatio","maxWidth","margin","viewportWidth","viewportHeight","clientWidth","innerWidth","clientHeight","innerHeight","resized","isAudio","ended","togglePlay","proxyEvents","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","forward","toggleCaptions","rect","currentTarget","attribute","hasAttribute","done","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","increaseVolume","lastKey","focusTimer","lastKeyDown","altKey","ctrlKey","metaKey","repeat","increment","decreaseVolume","usingNative","loadjs_umd","fn","createCommonjsModule","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","q","splice","executeCallbacks","success","loadFile","numTries","isLegacyIECss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathname","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","code","defaultPrevented","loadFiles","paths","loadjs","arg1","arg2","loadFn","returnPromise","deps","isDefined","loadScript","assurePlaybackState","hasPlayed","Vimeo","frameParams","found","parseHash","hashParam","sidedock","gesture","$2","thumbnail_url","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","setMuted","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","fragment","firstChild","stripHTML","getPaused","seconds","getHost","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","onPlaybackRateChange","instance","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","google","ima","manager","destroy","displayContainer","remove","startSafetyTimer","managerPromise","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","loader","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","countdownTimer","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","cuePoints","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","initialized","zIndex","handlers","safetyTimer","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","clamp","parseVtt","vttDataString","processedList","frame","line","startTime","lineSplit","matchTimes","endTime","fitRatio","outer","PreviewThumbnails","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","thumbnails","promises","getThumbnail","thumbnail","frames","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","_this$player$config$m","_this$player$config$m2","percentage","mousePosX","thumb","showImageAtCurrentTime","toggleThumbContainer","mouseDown","toggleScrubbingContainer","ceil","lastTime","scrubbing","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","findIndex","hasThumb","qualityIndex","loadedImages","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","scrubberRect","containerRect","right","clamped","multiplier","lastMouseMoveTime","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","crossorigin","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","original","unload","failed","jQuery","getProviderByUrl","search","truthy","searchParams","inputIsValid","fauxDuration","realDuration","Infinity","hasAudio","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","setPreviewThumbnails","thumbnailSource"],"mappings":"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","file":"plyr.min.js","sourcesContent":["typeof navigator === \"object\" && (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('Plyr', factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Plyr = factory());\n})(this, (function () { 'use strict';\n\n function _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n }\n function _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : String(i);\n }\n function _defineProperty$1(obj, key, value) {\n key = _toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n }\n\n function _classCallCheck(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n function _defineProperties(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n }\n function _createClass(e, t, n) {\n return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e;\n }\n function _defineProperty(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n }\n function ownKeys(e, t) {\n var n = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n return n;\n }\n function _objectSpread2(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys(Object(n), !0).forEach(function (t) {\n _defineProperty(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n return e;\n }\n var defaults$1 = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n };\n function matches$1(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n }\n function trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n }\n var getConstructor$1 = function (e) {\n return null != e ? e.constructor : null;\n },\n instanceOf$1 = function (e, t) {\n return !!(e && t && e instanceof t);\n },\n isNullOrUndefined$1 = function (e) {\n return null == e;\n },\n isObject$1 = function (e) {\n return getConstructor$1(e) === Object;\n },\n isNumber$1 = function (e) {\n return getConstructor$1(e) === Number && !Number.isNaN(e);\n },\n isString$1 = function (e) {\n return getConstructor$1(e) === String;\n },\n isBoolean$1 = function (e) {\n return getConstructor$1(e) === Boolean;\n },\n isFunction$1 = function (e) {\n return getConstructor$1(e) === Function;\n },\n isArray$1 = function (e) {\n return Array.isArray(e);\n },\n isNodeList$1 = function (e) {\n return instanceOf$1(e, NodeList);\n },\n isElement$1 = function (e) {\n return instanceOf$1(e, Element);\n },\n isEvent$1 = function (e) {\n return instanceOf$1(e, Event);\n },\n isEmpty$1 = function (e) {\n return isNullOrUndefined$1(e) || (isString$1(e) || isArray$1(e) || isNodeList$1(e)) && !e.length || isObject$1(e) && !Object.keys(e).length;\n },\n is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n nodeList: isNodeList$1,\n element: isElement$1,\n event: isEvent$1,\n empty: isEmpty$1\n };\n function getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n }\n function round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n return Math.round(e / t) * t;\n }\n var RangeTouch = function () {\n function e(t, n) {\n _classCallCheck(this, e), is$1.element(t) ? this.element = t : is$1.string(t) && (this.element = document.querySelector(t)), is$1.element(this.element) && is$1.empty(this.element.rangeTouch) && (this.config = _objectSpread2({}, defaults$1, {}, n), this.init());\n }\n return _createClass(e, [{\n key: \"init\",\n value: function () {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function () {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function (e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function (t) {\n if (!e.enabled || !is$1.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function (t) {\n e.enabled && is$1.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function (t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is$1.empty(t) || is$1.string(t) ? r = Array.from(document.querySelectorAll(is$1.string(t) ? t : 'input[type=\"range\"]')) : is$1.element(t) ? r = [t] : is$1.nodeList(t) ? r = Array.from(t) : is$1.array(t) && (r = t.filter(is$1.element)), is$1.empty(r)) return null;\n var i = _objectSpread2({}, defaults$1, {}, n);\n if (is$1.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is$1.element(n) && matches$1(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function () {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n }();\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n\n const getConstructor = input => input !== null && typeof input !== 'undefined' ? input.constructor : null;\n const instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\n const isNullOrUndefined = input => input === null || typeof input === 'undefined';\n const isObject = input => getConstructor(input) === Object;\n const isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\n const isString = input => getConstructor(input) === String;\n const isBoolean = input => getConstructor(input) === Boolean;\n const isFunction = input => typeof input === 'function';\n const isArray = input => Array.isArray(input);\n const isWeakMap = input => instanceOf(input, WeakMap);\n const isNodeList = input => instanceOf(input, NodeList);\n const isTextNode = input => getConstructor(input) === Text;\n const isEvent = input => instanceOf(input, Event);\n const isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\n const isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\n const isTrack = input => instanceOf(input, TextTrack) || !isNullOrUndefined(input) && isString(input.kind);\n const isPromise = input => instanceOf(input, Promise) && isFunction(input.then);\n const isElement = input => input !== null && typeof input === 'object' && input.nodeType === 1 && typeof input.style === 'object' && typeof input.ownerDocument === 'object';\n const isEmpty = input => isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;\n const isUrl = input => {\n // Accept a URL object\n if (instanceOf(input, window.URL)) {\n return true;\n }\n\n // Must be string from here\n if (!isString(input)) {\n return false;\n }\n\n // Add the protocol if required\n let string = input;\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = `http://${input}`;\n }\n try {\n return !isEmpty(new URL(string).hostname);\n } catch (_) {\n return false;\n }\n };\n var is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n weakMap: isWeakMap,\n nodeList: isNodeList,\n element: isElement,\n textNode: isTextNode,\n event: isEvent,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty\n };\n\n // ==========================================================================\n // Animation utils\n // ==========================================================================\n\n const transitionEndEvent = (() => {\n const element = document.createElement('span');\n const events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n const type = Object.keys(events).find(event => element.style[event] !== undefined);\n return is.string(type) ? events[type] : false;\n })();\n\n // Force repaint of element\n function repaint(element, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (_) {\n // Do nothing\n }\n }, delay);\n }\n\n // ==========================================================================\n // Browser sniffing\n // Unfortunately, due to mixed support, UA sniffing is required\n // ==========================================================================\n\n const isIE = Boolean(window.document.documentMode);\n const isEdge = /Edge/g.test(navigator.userAgent);\n const isWebKit = 'WebkitAppearance' in document.documentElement.style && !/Edge/g.test(navigator.userAgent);\n const isIPhone = /iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1;\n // navigator.platform may be deprecated but this check is still required\n const isIPadOS = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n const isIos = /iPad|iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1;\n var browser = {\n isIE,\n isEdge,\n isWebKit,\n isIPhone,\n isIPadOS,\n isIos\n };\n\n // ==========================================================================\n // Object utils\n // ==========================================================================\n\n\n // Clone nested objects\n function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n // Get a nested value in an object\n function getDeep(object, path) {\n return path.split('.').reduce((obj, key) => obj && obj[key], object);\n }\n\n // Deep extend destination object with N more objects\n function extend(target = {}, ...sources) {\n if (!sources.length) {\n return target;\n }\n const source = sources.shift();\n if (!is.object(source)) {\n return target;\n }\n Object.keys(source).forEach(key => {\n if (is.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, {\n [key]: {}\n });\n }\n extend(target[key], source[key]);\n } else {\n Object.assign(target, {\n [key]: source[key]\n });\n }\n });\n return extend(target, ...sources);\n }\n\n // ==========================================================================\n // Element utils\n // ==========================================================================\n\n\n // Wrap an element\n function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n const targets = elements.length ? elements : [elements];\n\n // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n Array.from(targets).reverse().forEach((element, index) => {\n const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n // Cache the current parent and sibling.\n const parent = element.parentNode;\n const sibling = element.nextSibling;\n\n // Wrap the element (is automatically removed from its current\n // parent).\n child.appendChild(element);\n\n // If the element had a sibling, insert the wrapper before\n // the sibling to maintain the HTML structure; otherwise, just\n // append it to the parent.\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n }\n\n // Set attributes\n function setAttributes(element, attributes) {\n if (!is.element(element) || is.empty(attributes)) return;\n\n // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n Object.entries(attributes).filter(([, value]) => !is.nullOrUndefined(value)).forEach(([key, value]) => element.setAttribute(key, value));\n }\n\n // Create a DocumentFragment\n function createElement(type, attributes, text) {\n // Create a new \n const element = document.createElement(type);\n\n // Set all passed attributes\n if (is.object(attributes)) {\n setAttributes(element, attributes);\n }\n\n // Add text node\n if (is.string(text)) {\n element.innerText = text;\n }\n\n // Return built element\n return element;\n }\n\n // Insert an element after another\n function insertAfter(element, target) {\n if (!is.element(element) || !is.element(target)) return;\n target.parentNode.insertBefore(element, target.nextSibling);\n }\n\n // Insert a DocumentFragment\n function insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) return;\n parent.appendChild(createElement(type, attributes, text));\n }\n\n // Remove element(s)\n function removeElement(element) {\n if (is.nodeList(element) || is.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n if (!is.element(element) || !is.element(element.parentNode)) {\n return;\n }\n element.parentNode.removeChild(element);\n }\n\n // Remove all child elements\n function emptyElement(element) {\n if (!is.element(element)) return;\n let {\n length\n } = element.childNodes;\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n }\n\n // Replace element\n function replaceElement(newChild, oldChild) {\n if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) return null;\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n }\n\n // Get an attribute object from a string selector\n function getAttributesFromSelector(sel, existingAttributes) {\n // For example:\n // '.test' to { class: 'test' }\n // '#test' to { id: 'test' }\n // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n if (!is.string(sel) || is.empty(sel)) return {};\n const attributes = {};\n const existing = extend({}, existingAttributes);\n sel.split(',').forEach(s => {\n // Remove whitespace\n const selector = s.trim();\n const className = selector.replace('.', '');\n const stripped = selector.replace(/[[\\]]/g, '');\n // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n // Get the first character\n const start = selector.charAt(0);\n switch (start) {\n case '.':\n // Add to existing classname\n if (is.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\n break;\n case '#':\n // ID selector\n attributes.id = selector.replace('#', '');\n break;\n case '[':\n // Attribute selector\n attributes[key] = value;\n break;\n }\n });\n return extend(existing, attributes);\n }\n\n // Toggle hidden\n function toggleHidden(element, hidden) {\n if (!is.element(element)) return;\n let hide = hidden;\n if (!is.boolean(hide)) {\n hide = !element.hidden;\n }\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\n }\n\n // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n function toggleClass(element, className, force) {\n if (is.nodeList(element)) {\n return Array.from(element).map(e => toggleClass(e, className, force));\n }\n if (is.element(element)) {\n let method = 'toggle';\n if (typeof force !== 'undefined') {\n method = force ? 'add' : 'remove';\n }\n element.classList[method](className);\n return element.classList.contains(className);\n }\n return false;\n }\n\n // Has class name\n function hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n }\n\n // Element matches selector\n function matches(element, selector) {\n const {\n prototype\n } = Element;\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n const method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n }\n\n // Closest ancestor element matching selector (also tests element itself)\n function closest$1(element, selector) {\n const {\n prototype\n } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n const method = prototype.closest || closestElement;\n return method.call(element, selector);\n }\n\n // Find all elements\n function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n }\n\n // Find a single element\n function getElement(selector) {\n return this.elements.container.querySelector(selector);\n }\n\n // Set focus and tab focus class\n function setFocus(element = null, focusVisible = false) {\n if (!is.element(element)) return;\n\n // Set regular focus\n element.focus({\n preventScroll: true,\n focusVisible\n });\n }\n\n // ==========================================================================\n // Plyr support checks\n // ==========================================================================\n\n\n // Default codecs for checking mimetype support\n const defaultCodecs = {\n 'audio/ogg': 'vorbis',\n 'audio/wav': '1',\n 'video/webm': 'vp8, vorbis',\n 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n 'video/ogg': 'theora'\n };\n\n // Check for feature support\n const support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check(type, provider) {\n const api = support[type] || provider !== 'html5';\n const ui = api && support.rangeInput;\n return {\n api,\n ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: (() => {\n // While iPhone's support picture-in-picture for some apps, seemingly Safari isn't one of them\n // It will throw the following error when trying to enter picture-in-picture\n // `NotSupportedError: The Picture-in-Picture mode is not supported.`\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n return false;\n })(),\n // Airplay support\n // Safari only currently\n airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\n // Check for mime type support against a player instance\n // Credits: http://diveintohtml5.info/everything.html\n // Related: http://www.leanbackplayer.com/test/h5mt.html\n mime(input) {\n if (is.empty(input)) {\n return false;\n }\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (_) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // Sliders\n rangeInput: (() => {\n const range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\n })(),\n // Touch\n // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n touch: 'ontouchstart' in document.documentElement,\n // Detect transitions support\n transitions: transitionEndEvent !== false,\n // Reduced motion iOS & MacOS setting\n // https://webkit.org/blog/7551/responsive-design-for-motion/\n reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches\n };\n\n // ==========================================================================\n // Event utils\n // ==========================================================================\n\n\n // Check for passive event listener support\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n const supportsPassiveListeners = (() => {\n // Test via a getter in the options object to see if the passive property is accessed\n let supported = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (_) {\n // Do nothing\n }\n return supported;\n })();\n\n // Toggle event listener\n function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n return;\n }\n\n // Allow multiple events\n const events = event.split(' ');\n // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n let options = capture;\n\n // If passive events listeners are supported\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive,\n // Whether the listener is a capturing listener or not\n capture\n };\n }\n\n // If a single node is passed, bind the event listener\n events.forEach(type => {\n if (this && this.eventListeners && toggle) {\n // Cache event listener\n this.eventListeners.push({\n element,\n type,\n callback,\n options\n });\n }\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n }\n\n // Bind event handler\n function on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n }\n\n // Unbind event handler\n function off(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, false, passive, capture);\n }\n\n // Bind once-only event handler\n function once(element, events = '', callback, passive = true, capture = false) {\n const onceCallback = (...args) => {\n off(element, events, onceCallback, passive, capture);\n callback.apply(this, args);\n };\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n }\n\n // Trigger event\n function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n // Bail if no element\n if (!is.element(element) || is.empty(type)) {\n return;\n }\n\n // Create and dispatch the event\n const event = new CustomEvent(type, {\n bubbles,\n detail: {\n ...detail,\n plyr: this\n }\n });\n\n // Dispatch the event\n element.dispatchEvent(event);\n }\n\n // Unbind all cached event listeners\n function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(item => {\n const {\n element,\n type,\n callback,\n options\n } = item;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n }\n\n // Run method when / if player is ready\n function ready() {\n return new Promise(resolve => this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)).then(() => {});\n }\n\n /**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n }\n\n // ==========================================================================\n // Array utils\n // ==========================================================================\n\n\n // Remove duplicates in an array\n function dedupe(array) {\n if (!is.array(array)) {\n return array;\n }\n return array.filter((item, index) => array.indexOf(item) === index);\n }\n\n // Get the closest value in an array\n function closest(array, value) {\n if (!is.array(array) || !array.length) {\n return null;\n }\n return array.reduce((prev, curr) => Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev);\n }\n\n // ==========================================================================\n // Style utils\n // ==========================================================================\n\n\n // Check support for a CSS declaration\n function supportsCSS(declaration) {\n if (!window || !window.CSS) {\n return false;\n }\n return window.CSS.supports(declaration);\n }\n\n // Standard/common aspect ratios\n const standardRatios = [[1, 1], [4, 3], [3, 4], [5, 4], [4, 5], [3, 2], [2, 3], [16, 10], [10, 16], [16, 9], [9, 16], [21, 9], [9, 21], [32, 9], [9, 32]].reduce((out, [x, y]) => ({\n ...out,\n [x / y]: [x, y]\n }), {});\n\n // Validate an aspect ratio\n function validateAspectRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n const ratio = is.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is.number);\n }\n\n // Reduce an aspect ratio to it's lowest form\n function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n const [width, height] = ratio;\n const getDivider = (w, h) => h === 0 ? w : getDivider(h, w % h);\n const divider = getDivider(width, height);\n return [width / divider, height / divider];\n }\n\n // Calculate an aspect ratio\n function getAspectRatio(input) {\n const parse = ratio => validateAspectRatio(ratio) ? ratio.split(':').map(Number) : null;\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({\n ratio\n } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const {\n videoWidth,\n videoHeight\n } = this.media;\n ratio = [videoWidth, videoHeight];\n }\n return reduceAspectRatio(ratio);\n }\n\n // Set aspect ratio for responsive container\n function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n const {\n wrapper\n } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n if (!is.array(ratio)) {\n return {};\n }\n const [x, y] = reduceAspectRatio(ratio);\n const useNative = supportsCSS(`aspect-ratio: ${x}/${y}`);\n const padding = 100 / x * y;\n if (useNative) {\n wrapper.style.aspectRatio = `${x}/${y}`;\n } else {\n wrapper.style.paddingBottom = `${padding}%`;\n }\n\n // For Vimeo we have an extra
to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.add(this.config.classNames.videoFixedRatio);\n }\n return {\n padding,\n ratio\n };\n }\n\n // Round an aspect ratio to closest standard ratio\n function roundAspectRatio(x, y, tolerance = 0.05) {\n const ratio = x / y;\n const closestRatio = closest(Object.keys(standardRatios), ratio);\n\n // Check match is within tolerance\n if (Math.abs(closestRatio - ratio) <= tolerance) {\n return standardRatios[closestRatio];\n }\n\n // No match\n return [x, y];\n }\n\n // Get the size of the viewport\n // https://stackoverflow.com/questions/1248081/how-to-get-the-browser-viewport-dimensions\n function getViewportSize() {\n const width = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\n const height = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\n return [width, height];\n }\n\n // ==========================================================================\n // Plyr HTML5 helpers\n // ==========================================================================\n\n const html5 = {\n getSources() {\n if (!this.isHTML5) {\n return [];\n }\n const sources = Array.from(this.media.querySelectorAll('source'));\n\n // Filter out unsupported sources (if type is specified)\n return sources.filter(source => {\n const type = source.getAttribute('type');\n if (is.empty(type)) {\n return true;\n }\n return support.mime.call(this, type);\n });\n },\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\n // Get sizes from elements\n return html5.getSources.call(this).map(source => Number(source.getAttribute('data-res'))).filter(Boolean);\n },\n setup() {\n if (!this.isHTML5) {\n return;\n }\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\n\n // Quality\n Object.defineProperty(player.media, 'quality', {\n get() {\n // Get sources\n const sources = html5.getSources.call(player);\n const source = sources.find(s => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('data-res'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find(s => Number(s.getAttribute('data-res')) === input);\n\n // No matching source found\n if (!source) {\n return;\n }\n\n // Get current state\n const {\n currentTime,\n paused,\n preload,\n readyState,\n playbackRate\n } = player.media;\n\n // Set new source\n player.media.src = source.getAttribute('src');\n\n // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', () => {\n player.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests() {\n if (!this.isHTML5) {\n return;\n }\n\n // Remove child sources\n removeElement(html5.getSources.call(this));\n\n // Set blank video src attribute\n // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n this.media.setAttribute('src', this.config.blankVideo);\n\n // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n this.media.load();\n\n // Debugging\n this.debug.log('Cancelled network requests');\n }\n };\n\n // ==========================================================================\n // String utils\n // ==========================================================================\n\n\n // Generate a random ID\n function generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n }\n\n // Format string\n function format(input, ...args) {\n if (is.empty(input)) return input;\n return input.toString().replace(/{(\\d+)}/g, (_, i) => args[i].toString());\n }\n\n // Get percentage\n function getPercentage(current, max) {\n if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n return 0;\n }\n return (current / max * 100).toFixed(2);\n }\n\n // Replace all occurrences of a string in a string\n const replaceAll = (input = '', find = '', replace = '') => input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n // Convert to title case\n const toTitleCase = (input = '') => input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase());\n\n // Convert string to pascalCase\n function toPascalCase(input = '') {\n let string = input.toString();\n\n // Convert kebab case\n string = replaceAll(string, '-', ' ');\n\n // Convert snake case\n string = replaceAll(string, '_', ' ');\n\n // Convert to title case\n string = toTitleCase(string);\n\n // Convert to pascal case\n return replaceAll(string, ' ', '');\n }\n\n // Convert string to pascalCase\n function toCamelCase(input = '') {\n let string = input.toString();\n\n // Convert to pascal case\n string = toPascalCase(string);\n\n // Convert first character to lowercase\n return string.charAt(0).toLowerCase() + string.slice(1);\n }\n\n // Remove HTML from a string\n function stripHTML(source) {\n const fragment = document.createDocumentFragment();\n const element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n }\n\n // Like outerHTML, but also works for DocumentFragment\n function getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n }\n\n // ==========================================================================\n // Plyr internationalization\n // ==========================================================================\n\n\n // Skip i18n for abbreviations and brand names\n const resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n };\n const i18n = {\n get(key = '', config = {}) {\n if (is.empty(key) || is.empty(config)) {\n return '';\n }\n let string = getDeep(config.i18n, key);\n if (is.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n return '';\n }\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\n });\n return string;\n }\n };\n\n class Storage {\n constructor(player) {\n _defineProperty$1(this, \"get\", key => {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n const store = window.localStorage.getItem(this.key);\n if (is.empty(store)) {\n return null;\n }\n const json = JSON.parse(store);\n return is.string(key) && key.length ? json[key] : json;\n });\n _defineProperty$1(this, \"set\", object => {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n }\n\n // Can only store objectst\n if (!is.object(object)) {\n return;\n }\n\n // Get current storage\n let storage = this.get();\n\n // Default to empty object\n if (is.empty(storage)) {\n storage = {};\n }\n\n // Update the working copy of the values\n extend(storage, object);\n\n // Update storage\n try {\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n } catch (_) {\n // Do nothing\n }\n });\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n }\n\n // Check for actual support (see if we can use it)\n static get supported() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n const test = '___test';\n\n // Try to use it (it might be disabled, e.g. user is in private mode)\n // see: https://github.com/sampotts/plyr/issues/131\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (_) {\n return false;\n }\n }\n }\n\n // ==========================================================================\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n // ==========================================================================\n\n function fetch(url, responseType = 'text') {\n return new Promise((resolve, reject) => {\n try {\n const request = new XMLHttpRequest();\n\n // Check for CORS support\n if (!('withCredentials' in request)) {\n return;\n }\n request.addEventListener('load', () => {\n if (responseType === 'text') {\n try {\n resolve(JSON.parse(request.responseText));\n } catch (_) {\n resolve(request.responseText);\n }\n } else {\n resolve(request.response);\n }\n });\n request.addEventListener('error', () => {\n throw new Error(request.status);\n });\n request.open('GET', url, true);\n\n // Set the required response type\n request.responseType = responseType;\n request.send();\n } catch (error) {\n reject(error);\n }\n });\n }\n\n // ==========================================================================\n // Sprite loader\n // ==========================================================================\n\n\n // Load an external SVG sprite\n function loadSprite(url, id) {\n if (!is.string(url)) {\n return;\n }\n const prefix = 'cache';\n const hasId = is.string(id);\n let isCached = false;\n const exists = () => document.getElementById(id) !== null;\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data;\n\n // Check again incase of race condition\n if (hasId && exists()) {\n return;\n }\n\n // Inject the SVG to the body\n document.body.insertAdjacentElement('afterbegin', container);\n };\n\n // Only load once if ID set\n if (!hasId || !exists()) {\n const useStorage = Storage.supported;\n // Create container\n const container = document.createElement('div');\n container.setAttribute('hidden', '');\n if (hasId) {\n container.setAttribute('id', id);\n }\n\n // Check in cache\n if (useStorage) {\n const cached = window.localStorage.getItem(`${prefix}-${id}`);\n isCached = cached !== null;\n if (isCached) {\n const data = JSON.parse(cached);\n update(container, data.content);\n }\n }\n\n // Get the sprite\n fetch(url).then(result => {\n if (is.empty(result)) {\n return;\n }\n if (useStorage) {\n try {\n window.localStorage.setItem(`${prefix}-${id}`, JSON.stringify({\n content: result\n }));\n } catch (_) {\n // Do nothing\n }\n }\n update(container, result);\n }).catch(() => {});\n }\n }\n\n // ==========================================================================\n // Time utils\n // ==========================================================================\n\n\n // Time helpers\n const getHours = value => Math.trunc(value / 60 / 60 % 60, 10);\n const getMinutes = value => Math.trunc(value / 60 % 60, 10);\n const getSeconds = value => Math.trunc(value % 60, 10);\n\n // Format time to UI friendly string\n function formatTime(time = 0, displayHours = false, inverted = false) {\n // Bail if the value isn't a number\n if (!is.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = value => `0${value}`.slice(-2);\n // Breakdown to hours, mins, secs\n let hours = getHours(time);\n const mins = getMinutes(time);\n const secs = getSeconds(time);\n\n // Do we need to display hours?\n if (displayHours || hours > 0) {\n hours = `${hours}:`;\n } else {\n hours = '';\n }\n\n // Render\n return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n }\n\n // ==========================================================================\n // Plyr controls\n // TODO: This needs to be split into smaller files and cleaned up\n // ==========================================================================\n\n\n // TODO: Don't export a massive object - break down and create class\n const controls = {\n // Get icon URL\n getIconUrl() {\n const url = new URL(this.config.iconUrl, window.location);\n const host = window.location.host ? window.location.host : window.top.location.host;\n const cors = url.host !== host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors\n };\n },\n // Find the UI controls\n findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n // Buttons\n this.elements.buttons = {\n play: getElements.call(this, this.config.selectors.buttons.play),\n pause: getElement.call(this, this.config.selectors.buttons.pause),\n restart: getElement.call(this, this.config.selectors.buttons.restart),\n rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n mute: getElement.call(this, this.config.selectors.buttons.mute),\n pip: getElement.call(this, this.config.selectors.buttons.pip),\n airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n settings: getElement.call(this, this.config.selectors.buttons.settings),\n captions: getElement.call(this, this.config.selectors.buttons.captions),\n fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)\n };\n\n // Progress\n this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n // Inputs\n this.elements.inputs = {\n seek: getElement.call(this, this.config.selectors.inputs.seek),\n volume: getElement.call(this, this.config.selectors.inputs.volume)\n };\n\n // Display\n this.elements.display = {\n buffer: getElement.call(this, this.config.selectors.display.buffer),\n currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n duration: getElement.call(this, this.config.selectors.display.duration)\n };\n\n // Seek tooltip\n if (is.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`);\n }\n return true;\n } catch (error) {\n // Log it\n this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n // Restore native video controls\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create icon\n createIcon(type, attributes) {\n const namespace = 'http://www.w3.org/2000/svg';\n const iconUrl = controls.getIconUrl.call(this);\n const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n // Create \n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n }));\n\n // Create the to reference sprite\n const use = document.createElementNS(namespace, 'use');\n const path = `${iconPath}-${type}`;\n\n // Set `href` attributes\n // https://github.com/sampotts/plyr/issues/460\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add to \n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = {\n ...attr,\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n };\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge(text) {\n if (is.empty(text)) {\n return null;\n }\n const badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a
`);\n }\n\n // Set position\n tipElement.style.left = `${percent}%`;\n\n // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n // Duration\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert);\n\n // Ignore updates while seeking\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n }\n\n // Playing progress\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate() {\n // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n if (!this.supported.ui || !this.config.invertTime && this.currentTime) {\n return;\n }\n\n // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n if (this.duration >= 2 ** 32) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n }\n\n // Update ARIA values\n if (is.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n }\n\n // If there's a spot to display duration\n const hasDuration = is.element(this.elements.display.duration);\n\n // If there's only one time display, display duration there\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n }\n\n // If there's a duration element, update content\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n }\n if (this.config.markers.enabled) {\n controls.setMarkers.call(this);\n }\n\n // Update the tooltip (if visible)\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting(setting, container, input) {\n const pane = this.elements.settings.panels[setting];\n let value = null;\n let list = container;\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is.empty(input) ? input : this[setting];\n\n // Get default\n if (is.empty(value)) {\n value = this.config[setting].default;\n }\n\n // Unsupported value\n if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n return;\n }\n\n // Disabled value\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n return;\n }\n }\n\n // Get the list if we need to\n if (!is.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n }\n\n // If there's no list it means it's not been rendered...\n if (!is.element(list)) {\n return;\n }\n\n // Update the label\n const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n label.innerHTML = controls.getLabel.call(this, setting, value);\n\n // Find the radio option and check it\n const target = list && list.querySelector(`[value=\"${value}\"]`);\n if (is.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : `${value}×`;\n case 'quality':\n if (is.number(value)) {\n const label = i18n.get(`qualityLabel.${value}`, this.config);\n if (!label.length) {\n return `${value}p`;\n }\n return label;\n }\n return toTitleCase(value);\n case 'captions':\n return captions.getLabel.call(this);\n default:\n return null;\n }\n },\n // Set the quality menu\n setQualityMenu(options) {\n // Menu required\n if (!is.element(this.elements.settings.panels.quality)) {\n return;\n }\n const type = 'quality';\n const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n // Set options if passed and filter based on uniqueness and config\n if (is.array(options)) {\n this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n }\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Get the badge HTML for HD, 4K etc\n const getBadge = quality => {\n const label = i18n.get(`qualityBadge.${quality}`, this.config);\n if (!label.length) {\n return null;\n }\n return controls.createBadge.call(this, label);\n };\n\n // Sort options by the config and then render options\n this.options.quality.sort((a, b) => {\n const sorting = this.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(quality => {\n controls.createMenuItem.call(this, {\n value: quality,\n list,\n type,\n title: controls.getLabel.call(this, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\n const button = createElement(\n 'button',\n extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n type: 'button',\n class: this.config.classNames.control,\n 'data-plyr-loop-action': option,\n }),\n i18n.get(option, this.config)\n );\n if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n\n // Set a list of available captions languages\n setCaptionsMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.captions)) {\n return;\n }\n\n // TODO: Captions or language? Currently it's mixed\n const type = 'captions';\n const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n const tracks = captions.getTracks.call(this);\n const toggle = Boolean(tracks.length);\n\n // Toggle the pane and tab\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If there's no captions, bail\n if (!toggle) {\n return;\n }\n\n // Generate options data\n const options = tracks.map((track, value) => ({\n value,\n checked: this.captions.toggled && this.currentTrack === value,\n title: captions.getLabel.call(this, track),\n badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n list,\n type: 'language'\n }));\n\n // Add the \"Disabled\" option to turn off captions\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list,\n type: 'language'\n });\n\n // Generate options\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.speed)) {\n return;\n }\n const type = 'speed';\n const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n // Filter out invalid speeds\n this.options.speed = this.options.speed.filter(o => o >= this.minimumSpeed && o <= this.maximumSpeed);\n\n // Toggle the pane and tab\n const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle);\n\n // Empty the menu\n emptyElement(list);\n\n // Check if we need to toggle the parent\n controls.checkMenu.call(this);\n\n // If we're hiding, nothing more to do\n if (!toggle) {\n return;\n }\n\n // Create items\n this.options.speed.forEach(speed => {\n controls.createMenuItem.call(this, {\n value: speed,\n list,\n type,\n title: controls.getLabel.call(this, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu() {\n const {\n buttons\n } = this.elements.settings;\n const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem(pane, focusVisible = false) {\n if (this.elements.settings.popup.hidden) {\n return;\n }\n let target = pane;\n if (!is.element(target)) {\n target = Object.values(this.elements.settings.panels).find(p => !p.hidden);\n }\n const firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, focusVisible);\n },\n // Show/hide menu\n toggleMenu(input) {\n const {\n popup\n } = this.elements.settings;\n const button = this.elements.buttons.settings;\n\n // Menu and button are required\n if (!is.element(popup) || !is.element(button)) {\n return;\n }\n\n // True toggle by default\n const {\n hidden\n } = popup;\n let show = hidden;\n if (is.boolean(input)) {\n show = input;\n } else if (is.keyboardEvent(input) && input.key === 'Escape') {\n show = false;\n } else if (is.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(target);\n\n // If the click was inside the menu or if the click\n // wasn't the button or menu item and we're trying to\n // show the menu (a doc click shouldn't show the menu)\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n }\n\n // Set button attributes\n button.setAttribute('aria-expanded', show);\n\n // Show the actual popup\n toggleHidden(popup, !show);\n\n // Add class hook\n toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n // Focus the first item if key interaction\n if (show && is.keyboardEvent(input)) {\n controls.focusFirstMenuItem.call(this, null, true);\n } else if (!show && !hidden) {\n // If closing, re-focus the button\n setFocus.call(this, button, is.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize(tab) {\n const clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden');\n\n // Append to parent so we get the \"real\" size\n tab.parentNode.appendChild(clone);\n\n // Get the sizes before we remove\n const width = clone.scrollWidth;\n const height = clone.scrollHeight;\n\n // Remove from the DOM\n removeElement(clone);\n return {\n width,\n height\n };\n },\n // Show a panel in the menu\n showMenuPanel(type = '', focusVisible = false) {\n const target = this.elements.container.querySelector(`#plyr-settings-${this.id}-${type}`);\n\n // Nothing to show, bail\n if (!is.element(target)) {\n return;\n }\n\n // Hide all other panels\n const container = target.parentNode;\n const current = Array.from(container.children).find(node => !node.hidden);\n\n // If we can do fancy animations, we'll animate the height/width\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = `${current.scrollWidth}px`;\n container.style.height = `${current.scrollHeight}px`;\n\n // Get potential sizes\n const size = controls.getMenuSize.call(this, target);\n\n // Restore auto height/width\n const restore = event => {\n // We're only bothered about height and width on the container\n if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n return;\n }\n\n // Revert back to auto\n container.style.width = '';\n container.style.height = '';\n\n // Only listen once\n off.call(this, container, transitionEndEvent, restore);\n };\n\n // Listen for the transition finishing and restore auto height/width\n on.call(this, container, transitionEndEvent, restore);\n\n // Set dimensions to target\n container.style.width = `${size.width}px`;\n container.style.height = `${size.height}px`;\n }\n\n // Set attributes on current tab\n toggleHidden(current, true);\n\n // Set attributes on target\n toggleHidden(target, false);\n\n // Focus the first item\n controls.focusFirstMenuItem.call(this, target, focusVisible);\n },\n // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = {\n class: 'plyr__controls__item'\n };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach(control => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`\n });\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`\n }));\n\n // Buffer progress\n progress.appendChild(createProgress.call(this, 'buffer'));\n\n // TODO: Add loop display indicator\n\n // Seek tooltip\n if (this.config.tooltips.seek) {\n const tooltip = createElement('span', {\n class: this.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n this.elements.display.seekTooltip = tooltip;\n }\n this.elements.progress = progress;\n progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let {\n volume\n } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim()\n }));\n this.elements.volume = volume;\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos && !browser.isIPadOS) {\n // Set the attributes\n const attributes = {\n max: 1,\n step: 0.05,\n value: this.config.volume\n };\n\n // Create the volume range slider\n volume.appendChild(createRange.call(this, 'volume', extend(attributes, {\n id: `plyr-volume-${data.id}`\n })));\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement('div', extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(this, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': `plyr-settings-${data.id}`,\n 'aria-expanded': false\n }));\n const popup = createElement('div', {\n class: 'plyr__menu__container',\n id: `plyr-settings-${data.id}`,\n hidden: ''\n });\n const inner = createElement('div');\n const home = createElement('div', {\n id: `plyr-settings-${data.id}-home`\n });\n\n // Create the menu\n const menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n this.elements.settings.panels.home = home;\n\n // Build the menu items\n this.config.settings.forEach(type => {\n // TODO: bundle this with the createMenuItem helper and bindings\n const menuItem = createElement('button', extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n }));\n\n // Bind menu shortcuts for keyboard users\n bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n showMenuPanel.call(this, type, false);\n });\n const flex = createElement('span', null, i18n.get(type, this.config));\n const value = createElement('span', {\n class: this.config.classNames.menu.value\n });\n\n // Speed contains HTML entities\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem);\n\n // Build the panes\n const pane = createElement('div', {\n id: `plyr-settings-${data.id}-${type}`,\n hidden: ''\n });\n\n // Back button\n const backButton = createElement('button', {\n type: 'button',\n class: `${this.config.classNames.control} ${this.config.classNames.control}--back`\n });\n\n // Visible label\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, this.config)));\n\n // Screen reader label\n backButton.appendChild(createElement('span', {\n class: this.config.classNames.hidden\n }, i18n.get('menuBack', this.config)));\n\n // Go back via keyboard\n on.call(this, pane, 'keydown', event => {\n if (event.key !== 'ArrowLeft') return;\n\n // Prevent seek\n event.preventDefault();\n event.stopPropagation();\n\n // Show the respective menu\n showMenuPanel.call(this, 'home', true);\n }, false);\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n showMenuPanel.call(this, 'home', false);\n });\n\n // Add to pane\n pane.appendChild(backButton);\n\n // Menu\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n this.elements.settings.buttons[type] = menuItem;\n this.elements.settings.panels[type] = pane;\n });\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank'\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n const {\n download\n } = this.config.urls;\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider\n });\n }\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject() {\n // Sprite\n if (this.config.loadSprite) {\n const icon = controls.getIconUrl.call(this);\n\n // Only load external sprite using AJAX\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n }\n\n // Create a unique ID\n this.id = Math.floor(Math.random() * 10000);\n\n // Null by default\n let container = null;\n this.elements.controls = null;\n\n // Set template properties\n const props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n let update = true;\n\n // If function, run it and use output\n if (is.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n }\n\n // Convert falsy controls to empty array (primarily for empty strings)\n if (!this.config.controls) {\n this.config.controls = [];\n }\n if (is.element(this.config.controls) || is.string(this.config.controls)) {\n // HTMLElement or Non-empty string passed as the option\n container = this.config.controls;\n } else {\n // Create controls\n container = controls.create.call(this, {\n id: this.id,\n seektime: this.config.seekTime,\n speed: this.speed,\n quality: this.quality,\n captions: captions.getLabel.call(this)\n // TODO: Looping\n // loop: 'None',\n });\n update = false;\n }\n\n // Replace props with their value\n const replace = input => {\n let result = input;\n Object.entries(props).forEach(([key, value]) => {\n result = replaceAll(result, `{${key}}`, value);\n });\n return result;\n };\n\n // Update markup\n if (update) {\n if (is.string(this.config.controls)) {\n container = replace(container);\n }\n }\n\n // Controls container\n let target;\n\n // Inject to custom location\n if (is.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n }\n\n // Inject into the container by default\n if (!is.element(target)) {\n target = this.elements.container;\n }\n\n // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container);\n\n // Find the elements if need be\n if (!is.element(this.elements.controls)) {\n controls.findElements.call(this);\n }\n\n // Add pressed property to buttons\n if (!is.empty(this.elements.buttons)) {\n const addProperty = button => {\n const className = this.config.classNames.controlPressed;\n button.setAttribute('aria-pressed', 'false');\n Object.defineProperty(button, 'pressed', {\n configurable: true,\n enumerable: true,\n get() {\n return hasClass(button, className);\n },\n set(pressed = false) {\n toggleClass(button, className, pressed);\n button.setAttribute('aria-pressed', pressed ? 'true' : 'false');\n }\n });\n };\n\n // Toggle classname when pressed property is set\n Object.values(this.elements.buttons).filter(Boolean).forEach(button => {\n if (is.array(button) || is.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n }\n\n // Edge sometimes doesn't finish the paint so force a repaint\n if (browser.isEdge) {\n repaint(target);\n }\n\n // Setup tooltips\n if (this.config.tooltips.controls) {\n const {\n classNames,\n selectors\n } = this.config;\n const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n const labels = getElements.call(this, selector);\n Array.from(labels).forEach(label => {\n toggleClass(label, this.config.classNames.hidden, false);\n toggleClass(label, this.config.classNames.tooltip, true);\n });\n }\n },\n // Set media metadata\n setMediaMetadata() {\n try {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.metadata = new window.MediaMetadata({\n title: this.config.mediaMetadata.title,\n artist: this.config.mediaMetadata.artist,\n album: this.config.mediaMetadata.album,\n artwork: this.config.mediaMetadata.artwork\n });\n }\n } catch (_) {\n // Do nothing\n }\n },\n // Add markers\n setMarkers() {\n var _this$config$markers2, _this$config$markers3;\n if (!this.duration || this.elements.markers) return;\n\n // Get valid points\n const points = (_this$config$markers2 = this.config.markers) === null || _this$config$markers2 === void 0 ? void 0 : (_this$config$markers3 = _this$config$markers2.points) === null || _this$config$markers3 === void 0 ? void 0 : _this$config$markers3.filter(({\n time\n }) => time > 0 && time < this.duration);\n if (!(points !== null && points !== void 0 && points.length)) return;\n const containerFragment = document.createDocumentFragment();\n const pointsFragment = document.createDocumentFragment();\n let tipElement = null;\n const tipVisible = `${this.config.classNames.tooltip}--visible`;\n const toggleTip = show => toggleClass(tipElement, tipVisible, show);\n\n // Inject markers to progress container\n points.forEach(point => {\n const markerElement = createElement('span', {\n class: this.config.classNames.marker\n }, '');\n const left = `${point.time / this.duration * 100}%`;\n if (tipElement) {\n // Show on hover\n markerElement.addEventListener('mouseenter', () => {\n if (point.label) return;\n tipElement.style.left = left;\n tipElement.innerHTML = point.label;\n toggleTip(true);\n });\n\n // Hide on leave\n markerElement.addEventListener('mouseleave', () => {\n toggleTip(false);\n });\n }\n markerElement.addEventListener('click', () => {\n this.currentTime = point.time;\n });\n markerElement.style.left = left;\n pointsFragment.appendChild(markerElement);\n });\n containerFragment.appendChild(pointsFragment);\n\n // Inject a tooltip if needed\n if (!this.config.tooltips.seek) {\n tipElement = createElement('span', {\n class: this.config.classNames.tooltip\n }, '');\n containerFragment.appendChild(tipElement);\n }\n this.elements.markers = {\n points: pointsFragment,\n tip: tipElement\n };\n this.elements.progress.appendChild(containerFragment);\n }\n };\n\n // ==========================================================================\n // URL utils\n // ==========================================================================\n\n\n /**\n * Parse a string to a URL object\n * @param {String} input - the URL to be parsed\n * @param {Boolean} safe - failsafe parsing\n */\n function parseUrl(input, safe = true) {\n let url = input;\n if (safe) {\n const parser = document.createElement('a');\n parser.href = url;\n url = parser.href;\n }\n try {\n return new URL(url);\n } catch (_) {\n return null;\n }\n }\n\n // Convert object to URLSearchParams\n function buildUrlParams(input) {\n const params = new URLSearchParams();\n if (is.object(input)) {\n Object.entries(input).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n return params;\n }\n\n // ==========================================================================\n // Plyr Captions\n // TODO: Create as class\n // ==========================================================================\n\n const captions = {\n // Setup captions\n setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n }\n\n // Only Vimeo and HTML5 video supported at this point\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n return;\n }\n\n // Inject the container\n if (!is.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n this.elements.captions.setAttribute('dir', 'auto');\n insertAfter(this.elements.captions, this.elements.wrapper);\n }\n\n // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n if (browser.isIE && window.URL) {\n const elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(track => {\n const src = track.getAttribute('src');\n const url = parseUrl(src);\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(blob => {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(() => {\n removeElement(track);\n });\n }\n });\n }\n\n // Get and set initial data\n // The \"preferred\" options are not realized unless / until the wanted language has a match\n // * languages: Array of user's browser languages.\n // * language: The language preferred by user settings or config\n // * active: The state preferred by user settings or config\n // * toggled: The real captions state\n\n const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n // Use first browser language when language is 'auto'\n if (language === 'auto') {\n [language] = languages;\n }\n let active = this.storage.get('captions');\n if (!is.boolean(active)) {\n ({\n active\n } = this.config.captions);\n }\n Object.assign(this.captions, {\n toggled: false,\n active,\n language,\n languages\n });\n\n // Watch changes to textTracks and update captions menu\n if (this.isHTML5) {\n const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n }\n\n // Update available languages in list next tick (the event must not be triggered before the listeners)\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update() {\n const tracks = captions.getTracks.call(this, true);\n // Get the wanted language\n const {\n active,\n language,\n meta,\n currentTrackNode\n } = this.captions;\n const languageExists = Boolean(tracks.find(track => track.language === language));\n\n // Handle tracks (add event listener and \"pseudo\"-default)\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(track => !meta.get(track)).forEach(track => {\n this.debug.log('Track added', track);\n\n // Attempt to store if the original dom element was \"default\"\n meta.set(track, {\n default: track.mode === 'showing'\n });\n\n // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\n\n // Add event listener for cue changes\n on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n });\n }\n\n // Update language first time it matches, or if the previous matching track was removed\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n }\n\n // Enable or disable captions based on track length\n if (this.elements) {\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n }\n\n // Update available languages in list\n if (is.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle(input, passive = true) {\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n const {\n toggled\n } = this.captions; // Current state\n const activeClass = this.config.classNames.captions.active;\n // Get the next state\n // If the method is called without parameter, toggle based on current value\n const active = is.nullOrUndefined(input) ? !toggled : input;\n\n // Update state and trigger event\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n }\n\n // Force language if the call isn't passive and there is no matching language to toggle to\n if (!this.language && active && !passive) {\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n // Override user preferences to avoid switching languages if a matching track is added\n this.captions.language = track.language;\n\n // Set caption, but don't store in localStorage as user preference\n captions.set.call(this, tracks.indexOf(track));\n return;\n }\n\n // Toggle button if it's enabled\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n }\n\n // Add class hook\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // Trigger event (not used internally)\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n }\n\n // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\n });\n },\n // Set captions by track index\n // Used internally for the currentTrack setter with the passive option forced to false\n set(index, passive = true) {\n const tracks = captions.getTracks.call(this);\n\n // Disable captions if setting to -1\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n if (!is.number(index)) {\n this.debug.warn('Invalid caption argument', index);\n return;\n }\n if (!(index in tracks)) {\n this.debug.warn('Track not found', index);\n return;\n }\n if (this.captions.currentTrack !== index) {\n this.captions.currentTrack = index;\n const track = tracks[index];\n const {\n language\n } = track || {};\n\n // Store reference to node for invalidation on remove\n this.captions.currentTrackNode = track;\n\n // Update settings menu\n controls.updateSetting.call(this, 'captions');\n\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language\n });\n }\n\n // Handle Vimeo captions\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n }\n\n // Trigger event\n triggerEvent.call(this, this.media, 'languagechange');\n }\n\n // Show captions\n captions.toggle.call(this, true, passive);\n if (this.isHTML5 && this.isVideo) {\n // If we change the active track while a cue is already displayed we need to update it\n captions.updateCues.call(this);\n }\n },\n // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage(input, passive = true) {\n if (!is.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n }\n // Normalize\n const language = input.toLowerCase();\n this.captions.language = language;\n\n // Set currentTrack\n const tracks = captions.getTracks.call(this);\n const track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\n },\n // Get current valid caption tracks\n // If update is false it will also ignore tracks without metadata\n // This is used to \"freeze\" the language options when captions.update is false\n getTracks(update = false) {\n // Handle media or textTracks missing or null\n const tracks = Array.from((this.media || {}).textTracks || []);\n // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n return tracks.filter(track => !this.isHTML5 || update || this.captions.meta.has(track)).filter(track => ['captions', 'subtitles'].includes(track.kind));\n },\n // Match tracks based on languages and get the first\n findTrack(languages, force = false) {\n const tracks = captions.getTracks.call(this);\n const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n let track;\n languages.every(language => {\n track = sorted.find(t => t.language === language);\n return !track; // Break iteration if there is a match\n });\n\n // If no match is found but is required, get first\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel(track) {\n let currentTrack = track;\n if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n if (is.track(currentTrack)) {\n if (!is.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n if (!is.empty(currentTrack.language)) {\n return track.language.toUpperCase();\n }\n return i18n.get('enabled', this.config);\n }\n return i18n.get('disabled', this.config);\n },\n // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n if (!is.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n }\n\n // Only accept array or empty input\n if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n let cues = input;\n\n // Get cues from track\n if (!cues) {\n const track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(cue => cue.getCueAsHTML()).map(getHTML);\n }\n\n // Set new caption text\n const content = cues.map(cueText => cueText.trim()).join('\\n');\n const changed = content !== this.elements.captions.innerHTML;\n if (changed) {\n // Empty the container and create a new child element\n emptyElement(this.elements.captions);\n const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption);\n\n // Trigger event\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n };\n\n // ==========================================================================\n // Plyr default config\n // ==========================================================================\n\n const defaults = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\n // Allow inline playback on iOS\n playsinline: true,\n // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\n // Display the media duration on load in the current time position\n // If you have opted to display both duration and currentTime, this is ignored\n displayDuration: true,\n // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.7.8/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false\n // start: null,\n // end: null,\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\n },\n // Captions settings\n captions: {\n active: false,\n language: 'auto',\n // Listen to new tracks added after Plyr is initialized.\n // This is needed for streaming captions, but may result in unselectable options\n update: false\n },\n // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large',\n // 'restart',\n // 'rewind',\n 'play',\n // 'fast-forward',\n 'progress', 'current-time',\n // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay',\n // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\n // Localisation\n i18n: {\n restart: 'Restart',\n rewind: 'Rewind {seektime}s',\n play: 'Play',\n pause: 'Pause',\n fastForward: 'Forward {seektime}s',\n seek: 'Seek',\n seekLabel: '{currentTime} of {duration}',\n played: 'Played',\n buffered: 'Buffered',\n currentTime: 'Current time',\n duration: 'Duration',\n volume: 'Volume',\n mute: 'Mute',\n unmute: 'Unmute',\n enableCaptions: 'Enable captions',\n disableCaptions: 'Disable captions',\n download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\n menuBack: 'Go back to previous menu',\n speed: 'Speed',\n normal: 'Normal',\n quality: 'Quality',\n loop: 'Loop',\n start: 'Start',\n end: 'End',\n all: 'All',\n reset: 'Reset',\n disabled: 'Disabled',\n enabled: 'Enabled',\n advertisement: 'Ad',\n qualityBadge: {\n 2160: '4K',\n 1440: 'HD',\n 1080: 'HD',\n 720: 'HD',\n 576: 'SD',\n 480: 'SD'\n }\n },\n // URLs\n urls: {\n download: null,\n vimeo: {\n sdk: 'https://player.vimeo.com/api/player.js',\n iframe: 'https://player.vimeo.com/video/{0}?{1}',\n api: 'https://vimeo.com/api/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\n }\n },\n // Custom control listeners\n listeners: {\n seek: null,\n play: null,\n pause: null,\n restart: null,\n rewind: null,\n fastForward: null,\n mute: null,\n volume: null,\n captions: null,\n download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [\n // Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange',\n // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready',\n // YouTube\n 'statechange',\n // Quality\n 'qualitychange',\n // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\n // Selectors\n // Change these to match your template if using custom HTML\n selectors: {\n editable: 'input, textarea, select, [contenteditable]',\n container: '.plyr',\n controls: {\n container: null,\n wrapper: '.plyr__controls'\n },\n labels: '[data-plyr]',\n buttons: {\n play: '[data-plyr=\"play\"]',\n pause: '[data-plyr=\"pause\"]',\n restart: '[data-plyr=\"restart\"]',\n rewind: '[data-plyr=\"rewind\"]',\n fastForward: '[data-plyr=\"fast-forward\"]',\n mute: '[data-plyr=\"mute\"]',\n captions: '[data-plyr=\"captions\"]',\n download: '[data-plyr=\"download\"]',\n fullscreen: '[data-plyr=\"fullscreen\"]',\n pip: '[data-plyr=\"pip\"]',\n airplay: '[data-plyr=\"airplay\"]',\n settings: '[data-plyr=\"settings\"]',\n loop: '[data-plyr=\"loop\"]'\n },\n inputs: {\n seek: '[data-plyr=\"seek\"]',\n volume: '[data-plyr=\"volume\"]',\n speed: '[data-plyr=\"speed\"]',\n language: '[data-plyr=\"language\"]',\n quality: '[data-plyr=\"quality\"]'\n },\n display: {\n currentTime: '.plyr__time--current',\n duration: '.plyr__time--duration',\n buffer: '.plyr__progress__buffer',\n loop: '.plyr__progress__loop',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\n },\n // Class hooks added to the player in different states\n classNames: {\n type: 'plyr--{0}',\n provider: 'plyr--{0}',\n video: 'plyr__video-wrapper',\n embed: 'plyr__video-embed',\n videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\n embedContainer: 'plyr__video-embed__container',\n poster: 'plyr__poster',\n posterEnabled: 'plyr__poster-enabled',\n ads: 'plyr__ads',\n control: 'plyr__control',\n controlPressed: 'plyr__control--pressed',\n playing: 'plyr--playing',\n paused: 'plyr--paused',\n stopped: 'plyr--stopped',\n loading: 'plyr--loading',\n hover: 'plyr--hover',\n tooltip: 'plyr__tooltip',\n cues: 'plyr__cues',\n marker: 'plyr__progress__marker',\n hidden: 'plyr__sr-only',\n hideControls: 'plyr--hide-controls',\n isTouch: 'plyr--is-touch',\n uiSupported: 'plyr--full-ui',\n noTransition: 'plyr--no-transition',\n display: {\n time: 'plyr__time'\n },\n menu: {\n value: 'plyr__menu__value',\n badge: 'plyr__badge',\n open: 'plyr--menu-open'\n },\n captions: {\n enabled: 'plyr--captions-enabled',\n active: 'plyr--captions-active'\n },\n fullscreen: {\n enabled: 'plyr--fullscreen-enabled',\n fallback: 'plyr--fullscreen-fallback'\n },\n pip: {\n supported: 'plyr--pip-supported',\n active: 'plyr--pip-active'\n },\n airplay: {\n supported: 'plyr--airplay-supported',\n active: 'plyr--airplay-active'\n },\n previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n hash: 'data-plyr-embed-hash'\n }\n },\n // Advertisements plugin\n // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n ads: {\n enabled: false,\n publisherId: '',\n tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n },\n // Media Metadata\n mediaMetadata: {\n title: '',\n artist: '',\n album: '',\n artwork: []\n },\n // Markers\n markers: {\n enabled: false,\n points: []\n }\n };\n\n // ==========================================================================\n // Plyr states\n // ==========================================================================\n\n const pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n };\n\n // ==========================================================================\n // Plyr supported types and providers\n // ==========================================================================\n\n const providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n };\n const types = {\n audio: 'audio',\n video: 'video'\n };\n\n /**\n * Get provider by URL\n * @param {String} url\n */\n function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n }\n\n // Vimeo\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n return null;\n }\n\n // ==========================================================================\n // Console wrapper\n // ==========================================================================\n\n const noop = () => {};\n class Console {\n constructor(enabled = false) {\n this.enabled = window.console && enabled;\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n get log() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n get warn() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n get error() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }\n\n class Fullscreen {\n constructor(player) {\n _defineProperty$1(this, \"onChange\", () => {\n if (!this.supported) return;\n\n // Update toggle button\n const button = this.player.elements.buttons.fullscreen;\n if (is.element(button)) {\n button.pressed = this.active;\n }\n\n // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n });\n _defineProperty$1(this, \"toggleFallback\", (toggle = false) => {\n // Store or restore scroll position\n if (toggle) {\n this.scrollPosition = {\n x: window.scrollX ?? 0,\n y: window.scrollY ?? 0\n };\n } else {\n window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n }\n\n // Toggle scroll\n document.body.style.overflow = toggle ? 'hidden' : '';\n\n // Toggle class hook\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n // Force full viewport on iPhone X+\n if (browser.isIos) {\n let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n const property = 'viewport-fit=cover';\n\n // Inject the viewport meta if required\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n }\n\n // Check if the property already exists\n const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n if (!hasProperty) viewport.content += `,${property}`;\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(part => part.trim() !== property).join(',');\n }\n }\n\n // Toggle button and fire events\n this.onChange();\n });\n // Trap focus inside container\n _defineProperty$1(this, \"trapFocus\", event => {\n // Bail if iOS/iPadOS, not active, not the tab key\n if (browser.isIos || browser.isIPadOS || !this.active || event.key !== 'Tab') return;\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\n if (focused === last && !event.shiftKey) {\n // Move focus to first element that can be tabbed if Shift isn't used\n first.focus();\n event.preventDefault();\n } else if (focused === first && event.shiftKey) {\n // Move focus to last element that can be tabbed if Shift is used\n last.focus();\n event.preventDefault();\n }\n });\n // Update UI\n _defineProperty$1(this, \"update\", () => {\n if (this.supported) {\n let mode;\n if (this.forceFallback) mode = 'Fallback (forced)';else if (Fullscreen.nativeSupported) mode = 'Native';else mode = 'Fallback';\n this.player.debug.log(`${mode} fullscreen enabled`);\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n }\n\n // Add styling hook to show button\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.supported);\n });\n // Make an element fullscreen\n _defineProperty$1(this, \"enter\", () => {\n if (!this.supported) return;\n\n // iOS native fullscreen doesn't need the request step\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.isVimeo) {\n this.player.embed.requestFullscreen();\n } else {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.nativeSupported || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is.empty(this.prefix)) {\n this.target[`${this.prefix}Request${this.property}`]();\n }\n });\n // Bail from fullscreen\n _defineProperty$1(this, \"exit\", () => {\n if (!this.supported) return;\n\n // iOS native fullscreen\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n if (this.player.isVimeo) {\n this.player.embed.exitFullscreen();\n } else {\n this.target.webkitEnterFullscreen();\n }\n silencePromise(this.player.play());\n } else if (!Fullscreen.nativeSupported || this.forceFallback) {\n this.toggleFallback(false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is.empty(this.prefix)) {\n const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[`${this.prefix}${action}${this.property}`]();\n }\n });\n // Toggle state\n _defineProperty$1(this, \"toggle\", () => {\n if (!this.active) this.enter();else this.exit();\n });\n // Keep reference to parent\n this.player = player;\n\n // Get prefix\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property;\n\n // Scroll position\n this.scrollPosition = {\n x: 0,\n y: 0\n };\n\n // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen = player.config.fullscreen.container && closest$1(this.player.elements.container, player.config.fullscreen.container);\n\n // Register event listeners\n // Handle event (incase user presses escape etc)\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`, () => {\n // TODO: Filter for target??\n this.onChange();\n });\n\n // Fullscreen toggle on double click\n on.call(this.player, this.player.elements.container, 'dblclick', event => {\n // Ignore double click in controls\n if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n return;\n }\n this.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', event => this.trapFocus(event));\n\n // Update the UI\n this.update();\n }\n\n // Determine if native supported\n static get nativeSupported() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n\n // If we're actually using native\n get useNative() {\n return Fullscreen.nativeSupported && !this.forceFallback;\n }\n\n // Get the prefix for handlers\n static get prefix() {\n // No prefix\n if (is.function(document.exitFullscreen)) return '';\n\n // Check for fullscreen support by vendor prefix\n let value = '';\n const prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(pre => {\n if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n value = pre;\n return true;\n }\n return false;\n });\n return value;\n }\n static get property() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n\n // Determine if fullscreen is supported\n get supported() {\n return [\n // Fullscreen is enabled in config\n this.player.config.fullscreen.enabled,\n // Must be a video\n this.player.isVideo,\n // Either native is supported or fallback enabled\n Fullscreen.nativeSupported || this.player.config.fullscreen.fallback,\n // YouTube has no way to trigger fullscreen, so on devices with no native support, playsinline\n // must be enabled and iosNative fullscreen must be disabled to offer the fullscreen fallback\n !this.player.isYouTube || Fullscreen.nativeSupported || !browser.isIos || this.player.config.playsinline && !this.player.config.fullscreen.iosNative].every(Boolean);\n }\n\n // Get active state\n get active() {\n if (!this.supported) return false;\n\n // Fallback using classname\n if (!Fullscreen.nativeSupported || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n const element = !this.prefix ? this.target.getRootNode().fullscreenElement : this.target.getRootNode()[`${this.prefix}${this.property}Element`];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n }\n\n // Get target element\n get target() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen ?? this.player.elements.container;\n }\n }\n\n // ==========================================================================\n // Load image avoiding xhr/fetch CORS issues\n // Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n // By default it checks if it is at least 1px, but you can add a second argument to change this\n // ==========================================================================\n\n function loadImage(src, minWidth = 1) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n const handler = () => {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src\n });\n });\n }\n\n // ==========================================================================\n // Plyr UI\n // ==========================================================================\n\n const ui = {\n addStyleHook() {\n toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n },\n // Toggle native HTML5 media controls\n toggleNativeControls(toggle = false) {\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build() {\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media();\n\n // Don't setup interface if no support\n if (!this.supported.ui) {\n this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n // Restore native controls\n ui.toggleNativeControls.call(this, true);\n\n // Bail\n return;\n }\n\n // Inject custom controls if not present\n if (!is.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this);\n\n // Re-attach control listeners\n this.listeners.controls();\n }\n\n // Remove native controls\n ui.toggleNativeControls.call(this);\n\n // Setup captions for HTML5\n if (this.isHTML5) {\n captions.setup.call(this);\n }\n\n // Reset volume\n this.volume = null;\n\n // Reset mute state\n this.muted = null;\n\n // Reset loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = null;\n\n // Reset volume display\n controls.updateVolume.call(this);\n\n // Reset time display\n controls.timeUpdate.call(this);\n\n // Reset duration display\n controls.durationUpdate.call(this);\n\n // Update the UI\n ui.checkPlaying.call(this);\n\n // Check for picture-in-picture support\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo);\n\n // Check for airplay support\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n // Add touch class\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n // Ready for API calls\n this.ready = true;\n\n // Ready event at end of execution stack\n setTimeout(() => {\n triggerEvent.call(this, this.media, 'ready');\n }, 0);\n\n // Set the title\n ui.setTitle.call(this);\n\n // Assure the poster image is set, if the property was added before the element was created\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(() => {});\n }\n\n // Manually set the duration if user has overridden it.\n // The event listeners for it doesn't get called if preload is disabled (#701)\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n\n // Media metadata\n if (this.config.mediaMetadata) {\n controls.setMediaMetadata.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle() {\n // Find the current text\n let label = i18n.get('play', this.config);\n\n // If there's a media title set, use that for the label\n if (is.string(this.config.title) && !is.empty(this.config.title)) {\n label += `, ${this.config.title}`;\n }\n\n // If there's a play button, set label\n Array.from(this.elements.buttons.play || []).forEach(button => {\n button.setAttribute('aria-label', label);\n });\n\n // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n if (this.isEmbed) {\n const iframe = getElement.call(this, 'iframe');\n if (!is.element(iframe)) {\n return;\n }\n\n // Default to media type\n const title = !is.empty(this.config.title) ? this.config.title : 'video';\n const format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster(poster, passive = true) {\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n }\n\n // Set property synchronously to respect the call order\n this.media.setAttribute('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\n\n // Wait until ui is ready\n return ready.call(this)\n // Load image\n .then(() => loadImage(poster)).catch(error => {\n // Hide poster on error unless it's been set by another call\n if (poster === this.poster) {\n ui.togglePoster.call(this, false);\n }\n // Rethrow\n throw error;\n }).then(() => {\n // Prevent race conditions\n if (poster !== this.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(() => {\n Object.assign(this.elements.poster.style, {\n backgroundImage: `url('${poster}')`,\n // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n backgroundSize: ''\n });\n ui.togglePoster.call(this, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying(event) {\n // Class hooks\n toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n // Set state\n Array.from(this.elements.buttons.play || []).forEach(target => {\n Object.assign(target, {\n pressed: this.playing\n });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\n });\n\n // Only update controls on non timeupdate events\n if (is.event(event) && event.type === 'timeupdate') {\n return;\n }\n\n // Toggle controls\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading(event) {\n this.loading = ['stalled', 'waiting'].includes(event.type);\n\n // Clear timer\n clearTimeout(this.timers.loading);\n\n // Timer to prevent flicker when seeking\n this.timers.loading = setTimeout(() => {\n // Update progress bar loading class state\n toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n // Update controls visibility\n ui.toggleControls.call(this);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const {\n controls: controlsElement\n } = this.elements;\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({\n ...this.media.style\n })\n // We're only fussed about Plyr specific properties\n .filter(key => !is.empty(key) && is.string(key) && key.startsWith('--plyr')).forEach(key => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n };\n\n class Listeners {\n constructor(_player) {\n // Device is touch enabled\n _defineProperty$1(this, \"firstTouch\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n player.touch = true;\n\n // Add touch class\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n });\n // Global window & document listeners\n _defineProperty$1(this, \"global\", (toggle = true) => {\n const {\n player\n } = this;\n\n // Keyboard shortcuts\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n }\n\n // Click anywhere closes menu\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n // Detect touch by events\n once.call(player, document.body, 'touchstart', this.firstTouch);\n });\n // Container listeners\n _defineProperty$1(this, \"container\", () => {\n const {\n player\n } = this;\n const {\n config,\n elements,\n timers\n } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n }\n\n // Toggle controls on mouse events and entering fullscreen\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', event => {\n const {\n controls: controlsElement\n } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n }\n\n // Show, then hide after a timeout unless another control event occurs\n const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n let delay = 0;\n if (show) {\n ui.toggleControls.call(player, true);\n // Use longer timeout for touch devices\n delay = player.touch ? 3000 : 2000;\n }\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Set a gutter for Vimeo\n const setGutter = () => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n const target = elements.wrapper;\n const {\n active\n } = player.fullscreen;\n const [videoWidth, videoHeight] = getAspectRatio.call(player);\n const useNativeAspectRatio = supportsCSS(`aspect-ratio: ${videoWidth} / ${videoHeight}`);\n\n // If not active, remove styles\n if (!active) {\n if (useNativeAspectRatio) {\n target.style.width = null;\n target.style.height = null;\n } else {\n target.style.maxWidth = null;\n target.style.margin = null;\n }\n return;\n }\n\n // Determine which dimension will overflow and constrain view\n const [viewportWidth, viewportHeight] = getViewportSize();\n const overflow = viewportWidth / viewportHeight > videoWidth / videoHeight;\n if (useNativeAspectRatio) {\n target.style.width = overflow ? 'auto' : '100%';\n target.style.height = overflow ? '100%' : 'auto';\n } else {\n target.style.maxWidth = overflow ? `${viewportHeight / videoHeight * videoWidth}px` : null;\n target.style.margin = overflow ? '0 auto' : null;\n }\n };\n\n // Handle resizing\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setGutter, 50);\n };\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', event => {\n const {\n target\n } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n // Set Vimeo gutter\n setGutter();\n\n // Watch for resizes\n const method = event.type === 'enterfullscreen' ? on : off;\n method.call(player, window, 'resize', resized);\n });\n });\n // Listen for media events\n _defineProperty$1(this, \"media\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n\n // Time change on media\n on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n // Display duration\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event => controls.durationUpdate.call(player, event));\n\n // Handle the media finishing\n on.call(player, player.media, 'ended', () => {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart();\n\n // Call pause otherwise IE11 will start playing the video again\n player.pause();\n }\n });\n\n // Check for buffer progress\n on.call(player, player.media, 'progress playing seeking seeked', event => controls.updateProgress.call(player, event));\n\n // Handle volume changes\n on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n // Handle play/pause\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', event => ui.checkPlaying.call(player, event));\n\n // Loading state\n on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n // Click video\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n // Bail if there's no wrapper (this should never happen)\n if (!is.element(wrapper)) {\n return;\n }\n\n // On click play, pause or restart\n on.call(player, elements.container, 'click', event => {\n const targets = [elements.container, wrapper];\n\n // Ignore if click if not container or in video wrapper\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n }\n\n // Touch devices will just show controls (if hidden)\n if (player.touch && player.config.hideControls) {\n return;\n }\n if (player.ended) {\n this.proxy(event, player.restart, 'restart');\n this.proxy(event, () => {\n silencePromise(player.play());\n }, 'play');\n } else {\n this.proxy(event, () => {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n }\n\n // Disable right click\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', event => {\n event.preventDefault();\n }, false);\n }\n\n // Volume change\n on.call(player, player.media, 'volumechange', () => {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n });\n\n // Speed change\n on.call(player, player.media, 'ratechange', () => {\n // Update UI\n controls.updateSetting.call(player, 'speed');\n\n // Save to storage\n player.storage.set({\n speed: player.speed\n });\n });\n\n // Quality change\n on.call(player, player.media, 'qualitychange', event => {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n });\n\n // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\n });\n\n // Proxy events to container\n // Bubble up key events for Edge\n const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, event => {\n let {\n detail = {}\n } = event;\n\n // Get error details from media\n if (event.type === 'error') {\n detail = player.media.error;\n }\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n });\n // Run default and custom handlers\n _defineProperty$1(this, \"proxy\", (event, defaultHandler, customHandlerKey) => {\n const {\n player\n } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n let returned = true;\n\n // Execute custom handler\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n }\n\n // Only call default handler if not prevented in custom handler\n if (returned !== false && is.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n });\n // Trigger custom and default handlers\n _defineProperty$1(this, \"bind\", (element, type, defaultHandler, customHandlerKey, passive = true) => {\n const {\n player\n } = this;\n const customHandler = player.config.listeners[customHandlerKey];\n const hasCustomHandler = is.function(customHandler);\n on.call(player, element, type, event => this.proxy(event, defaultHandler, customHandlerKey), passive && !hasCustomHandler);\n });\n // Listen for control events\n _defineProperty$1(this, \"controls\", () => {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n // IE doesn't support input event, so we fallback to change\n const inputEvent = browser.isIE ? 'change' : 'input';\n\n // Play/pause toggle\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(button => {\n this.bind(button, 'click', () => {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(elements.buttons.rewind, 'click', () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind');\n\n // Rewind\n this.bind(elements.buttons.fastForward, 'click', () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward');\n\n // Mute toggle\n this.bind(elements.buttons.mute, 'click', () => {\n player.muted = !player.muted;\n }, 'mute');\n\n // Captions toggle\n this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n // Download\n this.bind(elements.buttons.download, 'click', () => {\n triggerEvent.call(player, player.media, 'download');\n }, 'download');\n\n // Fullscreen toggle\n this.bind(elements.buttons.fullscreen, 'click', () => {\n player.fullscreen.toggle();\n }, 'fullscreen');\n\n // Picture-in-Picture\n this.bind(elements.buttons.pip, 'click', () => {\n player.pip = 'toggle';\n }, 'pip');\n\n // Airplay\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n // Settings menu - click toggle\n this.bind(elements.buttons.settings, 'click', event => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\n\n // Settings menu - keyboard toggle\n // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n this.bind(elements.buttons.settings, 'keyup', event => {\n if (![' ', 'Enter'].includes(event.key)) {\n return;\n }\n\n // Because return triggers a click anyway, all we need to do is set focus\n if (event.key === 'Enter') {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n }\n\n // Prevent scroll\n event.preventDefault();\n\n // Prevent playing video (Firefox)\n event.stopPropagation();\n\n // Toggle menu\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n );\n\n // Escape closes menu\n this.bind(elements.settings.menu, 'keydown', event => {\n if (event.key === 'Escape') {\n controls.toggleMenu.call(player, event);\n }\n });\n\n // Set range input alternative \"value\", which matches the tooltip time (#954)\n this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n const rect = elements.progress.getBoundingClientRect();\n const percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n });\n\n // Pause while seeking\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n const seek = event.currentTarget;\n const attribute = 'play-on-seeked';\n if (is.keyboardEvent(event) && !['ArrowLeft', 'ArrowRight'].includes(event.key)) {\n return;\n }\n\n // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\n // Done seeking\n const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n // If we're done seeking and it was playing, resume playback\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\n }\n });\n\n // Fix range inputs on iOS\n // Super weird iOS bug where after you interact with an ,\n // it takes over further interactions on the page. This is a hack\n if (browser.isIos) {\n const inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n }\n\n // Seek\n this.bind(elements.inputs.seek, inputEvent, event => {\n const seek = event.currentTarget;\n // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n let seekTo = seek.getAttribute('seek-value');\n if (is.empty(seekTo)) {\n seekTo = seek.value;\n }\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek');\n\n // Seek tooltip\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', event => controls.updateSeekTooltip.call(player, event));\n\n // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', event => {\n const {\n previewThumbnails\n } = player;\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n });\n\n // Polyfill for lower fill in for webkit\n if (browser.isWebKit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n });\n }\n\n // Current time invert\n // Only if one time element is used for both currentTime and duration\n if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', () => {\n // Do nothing if we're at the start\n if (player.currentTime === 0) {\n return;\n }\n player.config.invertTime = !player.config.invertTime;\n controls.timeUpdate.call(player);\n });\n }\n\n // Volume\n this.bind(elements.inputs.volume, inputEvent, event => {\n player.volume = event.target.value;\n }, 'volume');\n\n // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mouseenter mouseleave', event => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n\n // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(c => !c.contains(elements.container)).forEach(child => {\n this.bind(child, 'mouseenter mouseleave', event => {\n if (elements.controls) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }\n });\n });\n }\n\n // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n });\n\n // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const {\n config,\n timers\n } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n });\n\n // Mouse wheel for volume\n this.bind(elements.inputs.volume, 'wheel', event => {\n // Detect \"natural\" scroll - supported on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n const inverted = event.webkitDirectionInvertedFromDevice;\n // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map(value => inverted ? -value : value);\n // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n // Change the volume by 2%\n player.increaseVolume(direction / 50);\n\n // Don't break page scrolling at max and min\n const {\n volume\n } = player.media;\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n });\n this.player = _player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\n this.handleKey = this.handleKey.bind(this);\n this.toggleMenu = this.toggleMenu.bind(this);\n this.firstTouch = this.firstTouch.bind(this);\n }\n\n // Handle key presses\n handleKey(event) {\n const {\n player\n } = this;\n const {\n elements\n } = player;\n const {\n key,\n type,\n altKey,\n ctrlKey,\n metaKey,\n shiftKey\n } = event;\n const pressed = type === 'keydown';\n const repeat = pressed && key === this.lastKey;\n\n // Bail if a modifier key is set\n if (altKey || ctrlKey || metaKey || shiftKey) {\n return;\n }\n\n // If the event is bubbled from the media element\n // Firefox doesn't get the key for whatever reason\n if (!key) {\n return;\n }\n\n // Seek by increment\n const seekByIncrement = increment => {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * increment;\n };\n\n // Handle the key on keydown\n // Reset on keyup\n if (pressed) {\n // Check focused element\n // and if the focused element is not editable (e.g. text input)\n // and any that accept key input http://webaim.org/techniques/keyboard/\n const focused = document.activeElement;\n if (is.element(focused)) {\n const {\n editable\n } = player.config.selectors;\n const {\n seek\n } = elements.inputs;\n if (focused !== seek && matches(focused, editable)) {\n return;\n }\n if (event.key === ' ' && matches(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n }\n\n // Which keys should we prevent default\n const preventDefault = [' ', 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'c', 'f', 'k', 'l', 'm'];\n\n // If the key is found prevent default (e.g. prevent scrolling for arrows)\n if (preventDefault.includes(key)) {\n event.preventDefault();\n event.stopPropagation();\n }\n switch (key) {\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n if (!repeat) {\n seekByIncrement(parseInt(key, 10));\n }\n break;\n case ' ':\n case 'k':\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\n break;\n case 'ArrowUp':\n player.increaseVolume(0.1);\n break;\n case 'ArrowDown':\n player.decreaseVolume(0.1);\n break;\n case 'm':\n if (!repeat) {\n player.muted = !player.muted;\n }\n break;\n case 'ArrowRight':\n player.forward();\n break;\n case 'ArrowLeft':\n player.rewind();\n break;\n case 'f':\n player.fullscreen.toggle();\n break;\n case 'c':\n if (!repeat) {\n player.toggleCaptions();\n }\n break;\n case 'l':\n player.loop = !player.loop;\n break;\n }\n\n // Escape is handle natively when in full screen\n // So we only need to worry about non native\n if (key === 'Escape' && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n }\n\n // Store last key for next cycle\n this.lastKey = key;\n } else {\n this.lastKey = null;\n }\n }\n\n // Toggle menu\n toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n }\n }\n\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n function createCommonjsModule(fn, module) {\n \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n }\n\n var loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\n var devnull = function () {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q;\n\n // define callback function\n fn = function (bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n };\n\n // register callback\n while (i--) {\n bundleId = bundleIds[i];\n\n // execute callback if in result cache\n r = bundleResultCache[bundleId];\n if (r) {\n fn(bundleId, r);\n continue;\n }\n\n // add to callback queue\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId];\n\n // cache result\n bundleResultCache[bundleId] = pathsNotFound;\n\n // exit if queue is empty\n if (!q) return;\n\n // empty callback queue\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\n }\n }\n\n /**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n };\n\n // success and error callbacks\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n function loadFile(path, callbackFn, args, numTries) {\n var doc = document,\n async = args.async,\n maxTries = (args.numRetries || 0) + 1,\n beforeCallbackFn = args.before || devnull,\n pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\n // image\n e = doc.createElement('img');\n e.src = pathStripped;\n } else {\n // javascript\n e = doc.createElement('script');\n e.src = path;\n e.async = async === undefined ? true : async;\n }\n e.onload = e.onerror = e.onbeforeload = function (ev) {\n var result = ev.type[0];\n\n // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\n try {\n if (!e.sheet.cssText.length) result = 'e';\n } catch (x) {\n // sheets objects created from load errors don't allow access to\n // `cssText` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n }\n\n // handle retries in case of load failure\n if (result == 'e') {\n // increment counter\n numTries += 1;\n\n // exit function and try again\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n }\n\n // execute callback\n callbackFn(path, result, ev.defaultPrevented);\n };\n\n // add to document (unless callback returns `false`)\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i;\n\n // define callback function\n fn = function (path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path);\n\n // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n };\n\n // load scripts\n for (i = 0; i < x; i++) loadFile(paths[i], fn, args);\n }\n\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n function loadjs(paths, arg1, arg2) {\n var bundleId, args;\n\n // bundleId (if string)\n if (arg1 && arg1.trim) bundleId = arg1;\n\n // args (default is {})\n args = (bundleId ? arg2 : arg1) || {};\n\n // throw error if bundle is already defined\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n\n // resolve Promise\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\n }\n\n /**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\n loadjs.ready = function ready(deps, args) {\n // subscribe to bundle load event\n subscribe(deps, function (depsNotFound) {\n // execute callbacks\n executeCallbacks(args, depsNotFound);\n });\n return loadjs;\n };\n\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n\n /**\n * Reset loadjs dependencies statuses\n */\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n };\n\n // export\n return loadjs;\n });\n });\n\n // ==========================================================================\n // Load an external script\n // ==========================================================================\n\n function loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n }\n\n // ==========================================================================\n // Vimeo plugin\n // ==========================================================================\n\n\n // Parse Vimeo ID from URL\n function parseId$1(url) {\n if (is.empty(url)) {\n return null;\n }\n if (is.number(Number(url))) {\n return url;\n }\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n }\n\n // Try to extract a hash for private videos from the URL\n function parseHash(url) {\n /* This regex matches a hexadecimal hash if given in any of these forms:\n * - [https://player.]vimeo.com/video/{id}/{hash}[?params]\n * - [https://player.]vimeo.com/video/{id}?h={hash}[¶ms]\n * - [https://player.]vimeo.com/video/{id}?[params]&h={hash}\n * - video/{id}/{hash}\n * If matched, the hash is available in capture group 4\n */\n const regex = /^.*(vimeo.com\\/|video\\/)(\\d+)(\\?.*&*h=|\\/)+([\\d,a-f]+)/;\n const found = url.match(regex);\n return found && found.length === 5 ? found[4] : null;\n }\n\n // Set playback state and trigger change (only on actual change)\n function assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n const vimeo = {\n setup() {\n const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(() => {\n vimeo.ready.call(player);\n }).catch(error => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const {\n premium,\n referrerPolicy,\n ...frameParams\n } = config;\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n let hash = '';\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n // hash can also be set as attribute on the
\n hash = player.media.getAttribute(player.config.attributes.embed.hash);\n } else {\n hash = parseHash(source);\n }\n const hashParam = hash ? {\n h: hash\n } : {};\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: player.config.playsinline,\n // hash has to be added to iframe-URL\n ...hashParam,\n ...frameParams\n });\n const id = parseId$1(source);\n // Build an iframe\n const iframe = createElement('iframe');\n const src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture', 'encrypted-media', 'accelerometer', 'gyroscope'].join('; '));\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(response => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\n }\n\n // Setup instance\n // https://github.com/vimeo/player.js\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0;\n\n // Disable native text track rendering\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n }\n\n // Create a faux HTML5 API using the Vimeo API\n player.media.play = () => {\n assurePlaybackState$1.call(player, true);\n return player.embed.play();\n };\n player.media.pause = () => {\n assurePlaybackState$1.call(player, false);\n return player.embed.pause();\n };\n player.media.stop = () => {\n player.pause();\n player.currentTime = 0;\n };\n\n // Seeking\n let {\n currentTime\n } = player.media;\n Object.defineProperty(player.media, 'currentTime', {\n get() {\n return currentTime;\n },\n set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n\n // Get current paused state and volume etc\n const {\n embed,\n media,\n paused,\n volume\n } = player;\n const restorePause = paused && !embed.hasPlayed;\n\n // Set seeking state and trigger event\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking');\n\n // If paused, mute until seek is complete\n Promise.resolve(restorePause && embed.setVolume(0))\n // Seek\n .then(() => embed.setCurrentTime(time))\n // Restore paused\n .then(() => restorePause && embed.pause())\n // Restore volume\n .then(() => restorePause && embed.setVolume(volume)).catch(() => {\n // Do nothing\n });\n }\n });\n\n // Playback speed\n let speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get() {\n return speed;\n },\n set(input) {\n player.embed.setPlaybackRate(input).then(() => {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n });\n\n // Volume\n let {\n volume\n } = player.config;\n Object.defineProperty(player.media, 'volume', {\n get() {\n return volume;\n },\n set(input) {\n player.embed.setVolume(input).then(() => {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n });\n\n // Muted\n let {\n muted\n } = player.config;\n Object.defineProperty(player.media, 'muted', {\n get() {\n return muted;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : false;\n player.embed.setMuted(toggle ? true : player.config.muted).then(() => {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n });\n\n // Loop\n let {\n loop\n } = player.config;\n Object.defineProperty(player.media, 'loop', {\n get() {\n return loop;\n },\n set(input) {\n const toggle = is.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(() => {\n loop = toggle;\n });\n }\n });\n\n // Source\n let currentSrc;\n player.embed.getVideoUrl().then(value => {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(error => {\n this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get() {\n return currentSrc;\n }\n });\n\n // Ended\n Object.defineProperty(player.media, 'ended', {\n get() {\n return player.currentTime === player.duration;\n }\n });\n\n // Set aspect ratio based on video size\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n const [width, height] = dimensions;\n player.embed.ratio = roundAspectRatio(width, height);\n setAspectRatio.call(this);\n });\n\n // Set autopause\n player.embed.setAutopause(player.config.autopause).then(state => {\n player.config.autopause = state;\n });\n\n // Get title\n player.embed.getVideoTitle().then(title => {\n player.config.title = title;\n ui.setTitle.call(this);\n });\n\n // Get current time\n player.embed.getCurrentTime().then(value => {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n\n // Get duration\n player.embed.getDuration().then(value => {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n });\n\n // Get captions\n player.embed.getTextTracks().then(tracks => {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', ({\n cues = []\n }) => {\n const strippedCues = cues.map(cue => stripHTML(cue.text));\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', () => {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(paused => {\n assurePlaybackState$1.call(player, !paused);\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n if (is.element(player.embed.element) && player.supported.ui) {\n const frame = player.embed.element;\n\n // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', () => {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', () => {\n assurePlaybackState$1.call(player, false);\n });\n player.embed.on('timeupdate', data => {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', data => {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress');\n\n // Check all loaded\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n\n // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n player.embed.getDuration().then(value => {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', () => {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', () => {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', detail => {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n });\n\n // Rebuild UI\n if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\n }\n };\n\n // ==========================================================================\n // YouTube plugin\n // ==========================================================================\n\n\n // Parse YouTube ID from URL\n function parseId(url) {\n if (is.empty(url)) {\n return null;\n }\n const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n }\n\n // Set playback state and trigger change (only on actual change)\n function assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n function getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n }\n const youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch(error => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(data => {\n if (is.object(data)) {\n const {\n title,\n height,\n width\n } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = roundAspectRatio(width, height);\n }\n setAspectRatio.call(this);\n }).catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && player.media.getAttribute('id');\n if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n }\n\n // Get the source URL or ID\n let source = player.media.getAttribute('src');\n\n // Get from
if needed\n if (is.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n }\n\n // Replace the