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