{"version":3,"sources":["plyr.mjs","node_modules/.pnpm/rangetouch@2.0.1/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/.pnpm/loadjs@4.2.0/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":["_defineProperty$1","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","_toPrimitive","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","String","Number","arg","_classCallCheck","e","t","_defineProperties","n","length","r","_createClass","prototype","_defineProperty","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","apply","_objectSpread2","arguments","forEach","getOwnPropertyDescriptors","defineProperties","defaults","addCSS","thumbWidth","watch","matches","Array","from","document","querySelectorAll","includes","this","trigger","Event","bubbles","dispatchEvent","getConstructor","constructor","instanceOf","isNullOrUndefined","isObject","isNumber","isNaN","isString","isBoolean","Boolean","isFunction","Function","isArray","isNodeList","NodeList","isElement","Element","isEvent","isEmpty","is","nullOrUndefined","object","number","string","boolean","function","array","nodeList","element","event","empty","getDecimalPlaces","concat","match","Math","max","round","parseFloat","toFixed","RangeTouch","querySelector","rangeTouch","config","init","enabled","style","userSelect","webKitUserSelect","touchAction","listeners","set","target","i","changedTouches","o","getAttribute","s","u","c","getBoundingClientRect","a","width","clientX","left","disabled","preventDefault","get","type","MutationObserver","addedNodes","observe","body","childList","subtree","map","documentElement","isWeakMap","WeakMap","isTextNode","Text","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isPromise","Promise","then","nodeType","ownerDocument","isUrl","URL","startsWith","hostname","_","weakMap","textNode","keyboardEvent","cue","track","promise","url","transitionEndEvent","createElement","events","WebkitTransition","MozTransition","OTransition","transition","find","repaint","delay","setTimeout","hidden","offsetHeight","isIE","documentMode","isEdge","test","navigator","userAgent","isWebKit","isIPhone","maxTouchPoints","isIPadOS","platform","isIos","browser","cloneDeep","JSON","parse","stringify","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","insertAfter","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","closest","el","parentElement","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","prev","curr","abs","supportsCSS","declaration","CSS","supports","standardRatios","out","x","y","validateAspectRatio","every","reduceAspectRatio","ratio","height","getDivider","w","h","divider","getAspectRatio","embed","videoWidth","videoHeight","setAspectRatio","isVideo","padding","aspectRatio","paddingBottom","isVimeo","vimeo","premium","offsetWidth","parseInt","getComputedStyle","offset","fullscreen","active","transform","add","classNames","videoFixedRatio","roundAspectRatio","tolerance","closestRatio","getViewportSize","clientWidth","innerWidth","clientHeight","innerHeight","html5","getSources","getQualityOptions","quality","forced","setup","player","speed","onChange","currentTime","paused","preload","readyState","playbackRate","src","play","load","cancelRequests","blankVideo","debug","log","generateId","prefix","floor","random","format","toString","getPercentage","current","replaceAll","RegExp","toTitleCase","toUpperCase","slice","toLowerCase","toPascalCase","toCamelCase","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","resources","youtube","i18n","seekTime","title","k","v","Storage","store","localStorage","getItem","json","storage","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","error","loadSprite","hasId","isCached","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","trunc","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","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","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","seektime","addProperty","controlPressed","labels","setMediaMetadata","mediaSession","metadata","MediaMetadata","mediaMetadata","artist","album","artwork","_this$config$markers2","_this$config$markers3","containerFragment","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","global","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","inactive","providers","types","getProviderByUrl","noop","Console","console","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","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","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","commonjsGlobal","globalThis","self","createCommonjsModule","fn","module","exports","loadjs_umd","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","factory","loadScript","parseId","$2","parseHash","found","assurePlaybackState","hasPlayed","Vimeo","frameParams","hashParam","sidedock","gesture","thumbnail_url","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","setMuted","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","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","destroy","manager","displayContainer","remove","Ads","google","ima","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","Plyr","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","original","unload","failed","jQuery","search","truthy","searchParams","inputIsValid","fauxDuration","realDuration","Infinity","hasAudio","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","setPreviewThumbnails","thumbnailSource","static"],"mappings":"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","file":"plyr.min.mjs","sourcesContent":["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}\nfunction _toPrimitive(input, hint) {\n if (typeof input !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (typeof res !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}\nfunction _toPropertyKey(arg) {\n var key = _toPrimitive(arg, \"string\");\n return typeof key === \"symbol\" ? key : String(key);\n}\n\nfunction _classCallCheck(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n}\nfunction _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}\nfunction _createClass(e, t, n) {\n return t && _defineProperties(e.prototype, t), n && _defineProperties(e, n), e;\n}\nfunction _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}\nfunction 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}\nfunction _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}\nvar defaults$1 = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n};\nfunction matches$1(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n}\nfunction trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n}\nvar 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 };\nfunction 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}\nfunction 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}\nvar 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\nconst getConstructor = input => input !== null && typeof input !== 'undefined' ? input.constructor : null;\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => typeof input === 'function';\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || !isNullOrUndefined(input) && isString(input.kind);\nconst isPromise = input => instanceOf(input, Promise) && isFunction(input.then);\nconst isElement = input => input !== null && typeof input === 'object' && input.nodeType === 1 && typeof input.style === 'object' && typeof input.ownerDocument === 'object';\nconst isEmpty = input => isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;\nconst 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};\nvar 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// ==========================================================================\nconst 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\nfunction 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\nconst isIE = Boolean(window.document.documentMode);\nconst isEdge = /Edge/g.test(navigator.userAgent);\nconst isWebKit = 'WebkitAppearance' in document.documentElement.style && !/Edge/g.test(navigator.userAgent);\nconst isIPhone = /iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1;\n// navigator.platform may be deprecated but this check is still required\nconst isIPadOS = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\nconst isIos = /iPad|iPhone|iPod/gi.test(navigator.userAgent) && navigator.maxTouchPoints > 1;\nvar browser = {\n isIE,\n isEdge,\n isWebKit,\n isIPhone,\n isIPadOS,\n isIos\n};\n\n// ==========================================================================\n\n// Clone nested objects\nfunction cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nfunction 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\nfunction 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\n// Wrap an element\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction insertElement(type, parent, attributes, text) {\n if (!is.element(parent)) return;\n parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction hasClass(element, className) {\n return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nfunction 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)\nfunction 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\nfunction getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nfunction getElement(selector) {\n return this.elements.container.querySelector(selector);\n}\n\n// Set focus and tab focus class\nfunction 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\n// Default codecs for checking mimetype support\nconst 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\nconst 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\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\nconst 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\nfunction 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\nfunction on(element, events = '', callback, passive = true, capture = false) {\n toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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 */\nfunction silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\n// ==========================================================================\n\n// Remove duplicates in an array\nfunction 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\nfunction 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\n// Check support for a CSS declaration\nfunction supportsCSS(declaration) {\n if (!window || !window.CSS) {\n return false;\n }\n return window.CSS.supports(declaration);\n}\n\n// Standard/common aspect ratios\nconst 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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// ==========================================================================\nconst 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('size'))).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('size'));\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('size')) === 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\n// Generate a random ID\nfunction generateId(prefix) {\n return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nfunction 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\nfunction 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\nconst replaceAll = (input = '', find = '', replace = '') => input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n// Convert to title case\nconst toTitleCase = (input = '') => input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase());\n\n// Convert string to pascalCase\nfunction 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\nfunction 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\nfunction 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\nfunction getHTML(element) {\n const wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n\n// ==========================================================================\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n};\nconst 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\nclass 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\nfunction 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\n// Load an external SVG sprite\nfunction 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\n// Time helpers\nconst getHours = value => Math.trunc(value / 60 / 60 % 60, 10);\nconst getMinutes = value => Math.trunc(value / 60 % 60, 10);\nconst getSeconds = value => Math.trunc(value % 60, 10);\n\n// Format time to UI friendly string\nfunction 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\n// TODO: Don't export a massive object - break down and create class\nconst 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\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\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 */\nfunction 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\nfunction 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// ==========================================================================\nconst 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\nconst 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\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\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\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\nconst pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n};\n\n// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nconst providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n};\nconst types = {\n audio: 'audio',\n video: 'video'\n};\n\n/**\n * Get provider by URL\n * @param {String} url\n */\nfunction 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\nconst noop = () => {};\nclass 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\nclass 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\nfunction 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// ==========================================================================\nconst 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\nclass 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\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar 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// ==========================================================================\nfunction loadScript(url) {\n return new Promise((resolve, reject) => {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n}\n\n// ==========================================================================\n\n// Parse Vimeo ID from URL\nfunction 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\nfunction 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)\nfunction 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}\nconst 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\n// Parse YouTube ID from URL\nfunction 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)\nfunction 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}\nfunction 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}\nconst 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