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