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