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