forked from kitodo/kitodo-presentation
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDlfMediaPlayer.js
More file actions
3 lines (3 loc) · 123 KB
/
DlfMediaPlayer.js
File metadata and controls
3 lines (3 loc) · 123 KB
1
2
3
/*! For license information please see DlfMediaPlayer.js.LICENSE.txt */
(()=>{"use strict";var e,t={6266:(e,t,s)=>{s(4715);var i=s(3838),n=s.n(i);function r(e,t={},s=[]){const i=document.createElement(e);for(const[e,s]of Object.entries(t))"$"===e[0]?i.addEventListener(e.substring(1),s):i[e]=s;for(const e of s)"string"==typeof e?i.append(document.createTextNode(e)):e instanceof HTMLElement&&i.append(e);return i}function a(e,[t,s]){return e<t?t:e>s?s:e}function o(e,t){return e<t?-1:e>t?1:0}function l(e,t){let s=e;for(const[e,i]of Object.entries(t))void 0!==i&&(s=s.split(`{${e}}`).join(i));return s}function h(e,t){return e.toString().padStart(t,"0")}function d(e,t){return new Promise((s,i)=>{const n=new FileReader;n.onload=()=>{"string"==typeof n.result?s(n.result):i(null)},n.onerror=()=>{i(n.error)},n[t](e)})}function c(e,t){const s=URL.createObjectURL(e);let i;try{i=t(s)}catch(e){throw URL.revokeObjectURL(s),e}if(i instanceof Promise){const e=i;return new Promise((t,i)=>{e.then(e=>{URL.revokeObjectURL(s),t(e)}).catch(e=>{URL.revokeObjectURL(s),i(e)})})}return URL.revokeObjectURL(s),i}async function u(e){const t=r("img");return t.decoding="async",t.src=e,await t.decode(),t}function p(e,t){"string"==typeof e?r("a",{href:e,download:t}).click():c(e,e=>{p(e,t)})}function m(e){return e.preventDefault(),!1}function f(e,t){const s=[],i=Array.isArray(t)?t:[t];for(let t=0;t<e.length;t++){if(t>0)for(const e of i){const t="string"==typeof e?e:e.cloneNode(!0);s.push(t)}s.push(e[t])}return s}function g(e,t,s){s?e.classList.add(t):e.classList.remove(t)}function v(e){return e.filter(e=>null!==e)}function b(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||null}class y extends n().ui.Element{static register(e,t={}){const s=e.mkid();return n().ui.Controls.registerElement(s,{create:(s,i)=>new this(s,i,e,t)}),s}constructor(e,t,s,i={}){super(e,t),this.env=s;const n=i.element??r("button");e.appendChild(n),this.dlf={config:i,element:n};const{onClickAction:a}=i;this.eventManager&&a&&(this.eventManager.listen(n,"click",()=>{a.isAvailable()&&a.execute()}),this.eventManager.listen(this.player,"loaded",()=>{this.updateControlPanelButton()})),this.updateControlPanelButton()}updateControlPanelButton(){for(const e of this.dlf.element.getAttributeNames())if(e.startsWith("data-t-")){const t=e.substring(7),s=this.dlf.element.getAttribute(e);s&&this.dlf.element.setAttribute(t,this.env.t(s))}let e=this.dlf.element.title??"";this.dlf.element.ariaLabel=e,this.dlf.element.title="",g(this.dlf.element,"shaka-tooltip",""!==e);const{onClickAction:t}=this.dlf.config;t&&g(this.dlf.element,"shaka-hidden",!t.isAvailable())}}class k{constructor(){this.tasks={}}get(e){const t=this.tasks[e]??=this.createTask(e);return this.resumeTask(t)}getCached(e){const t=this.tasks[e]?.state;return 4===t?.type?t.image:null}abortPending(){for(const[e,t]of Object.entries(this.tasks))this.stopTask(t)}createTask(e){return{state:{type:0,url:e},promise:null,stopNext:!1}}stopTask(e){e.stopNext=!0}resumeTask(e){return e.stopNext=!1,null===e.promise&&(e.promise=new Promise(async(t,s)=>{try{for(;;){if(4===e.state.type){t(e.state.image);break}if(e.stopNext){e.promise=null;break}await this.progressTask(e)}}catch(e){s(e)}})),e.promise}async progressTask(e){switch(e.state.type){case 0:{const t=new AbortController,s=e.state.url,i=fetch(s,{signal:t.signal});e.state={type:1,abortController:t,responsePromise:i};break}case 1:{const t=await e.state.responsePromise;if(!t.ok)throw t;e.state={type:2,imageBlob:await t.blob()};break}case 2:e.state={type:3,imagePromise:(t=e.state.imageBlob,c(t,u))};break;case 3:{const t=await e.state.imagePromise;e.state={type:4,image:t};break}case 4:break;default:throw new Error(`Unhandled LoadState type: ${e.state}`)}var t}}function w(e,t=null){const s=function(e,t=0){const s=Math.floor(e/3600),i=Math.floor(e/60%60),n=e%1;return{hours:s,minutes:i,totalMinutes:60*s+i,seconds:Math.floor(e%60),fractional:n,frames:Math.floor(n*t)}}(e,t??0);return{h:`${s.hours}`,hh:h(s.hours,2),m:`${s.totalMinutes}`,mm:h(s.minutes,2),ss:h(s.seconds,2),ff:h(s.frames,2),"00":h(Math.floor(100*s.fractional),2),"000":h(Math.floor(1e3*s.fractional),3)}}function T(e,t,s=null){let i=t?"{h}:{mm}:{ss}":"{m}:{ss}";return s?(i+=":{ff}",t||(i+="f")):i+=".{00}",l(i,w(e,s))}class C{constructor(e){this.seekBar=e.seekBar,this.player=e.player,this.network=e.network,this.interaction=e.interaction,this.fps=null,this.chapters=null,this.thumbnailTracks=[],this.snapToThumbnail=null,this.lastRendered=null,this.isChanging=!1,this.deltaStart=null,this.current=null,this.renderAnimationFrame=null,this.seekMode="wide",this.openDisplayTimeout=null,this.handlers={onWindowBlur:this.onWindowBlur.bind(this),onWindowResize:this.onWindowResize.bind(this),onPointerMove:this.onPointerMove.bind(this),onPointerDown:this.onPointerDown.bind(this),onPointerUpOrCancel:this.onPointerUpOrCancel.bind(this)},this.$container=r("div",{className:"dlf-media-thumbnail-preview"},[r("div",{className:"content-box"},[this.$display=r("div",{className:"display"},[this.$img=r("img")]),this.$info=r("span",{className:"info"},[this.$chapterText=r("span",{className:"chapter-text"}),this.$timecodeText=r("span",{className:"timecode-text"})])])]),this.$seekMarker=r("div",{className:"seek-marker"}),this.$seekThumbBar=r("div",{className:"seek-thumb-bar"}),this.seekBar.append(this.$seekMarker,this.$seekThumbBar,this.$container),this.ensureDisplaySize(160,90),window.addEventListener("blur",this.handlers.onWindowBlur),window.addEventListener("resize",this.handlers.onWindowResize),document.addEventListener("pointermove",this.handlers.onPointerMove),document.addEventListener("pointerdown",this.handlers.onPointerDown),document.addEventListener("pointerup",this.handlers.onPointerUpOrCancel),document.addEventListener("pointercancel",this.handlers.onPointerUpOrCancel)}release(){window.removeEventListener("blur",this.handlers.onWindowBlur),window.removeEventListener("resize",this.handlers.onWindowResize),document.removeEventListener("pointermove",this.handlers.onPointerMove),document.removeEventListener("pointerdown",this.handlers.onPointerDown),document.removeEventListener("pointerup",this.handlers.onPointerUpOrCancel),document.removeEventListener("pointercancel",this.handlers.onPointerUpOrCancel)}setFps(e){this.fps=e,this.currentRenderBest()}setChapters(e){this.chapters=e,this.currentRenderBest()}async setThumbnailTracks(e){this.thumbnailTracks=e.slice(),this.thumbnailTracks.sort((e,t)=>t.bandwidth-e.bandwidth),await this.activateThumbnailSnap(!1)}async activateThumbnailSnap(e){this.snapToThumbnail=e?this.lastRendered?.thumb.track??this.thumbnailTracks[0]??null:null,this.current&&(this.current.seekPosition=await this.snapPosition(this.current.rawSeekPosition)),this.current&&this.renderSeekPosition(this.current.seekPosition),this.currentRenderBest()}setSeekMode(e){this.seekMode=e,this.currentRenderBest()}onWindowBlur(){this.cancelPreview()}onWindowResize(){this.cancelPreview()}async onPointerMove(e){const t=this.mouseEventToPosition(e);if(void 0===t)return this.setIsVisible(!1);const s=await this.snapPosition(t);"touch"===e.pointerType&&this.beginChange();let i=[];if(this.showThumbnailImage()){const e=s.seconds,t=.01*this.player.getStats().estimatedBandwidth;i=await this.getThumbnails(e,t)}const n=null===this.current;this.current={rawSeekPosition:t,seekPosition:s,thumbs:i},this.isChanging&&1&e.buttons&&this.interaction?.onChange?.(s),this.currentRenderBest(n)}async onPointerDown(e){if(1&e.buttons){const t=this.mouseEventToPosition(e,"mouse"===e.pointerType);if(void 0!==t){const e=await this.snapPosition(t);this.beginChange(),this.interaction?.onChange?.(e)}}}onPointerUpOrCancel(e){this.endChange(),"mouse"===e.pointerType&&void 0!==this.mouseEventToPosition(e)||this.setIsVisible(!1)}mouseEventToPosition(e,t=!0){const s=this.saneVideoDuration();if(void 0===s)return;if(null!==document.querySelector("input[type=button]:hover, button:hover"))return;const i=this.seekBar.getBoundingClientRect();let n=i.left;if(null!==this.deltaStart){const e=i.width/s;n=this.deltaStart.clientX-this.deltaStart.seconds*e}if(!this.isChanging)if(this.isVisible&&t){const{right:t,bottom:s}=i;if(!(n<=e.clientX&&e.clientX<=t&&e.clientY<=s))return;let{top:r}="wide"===this.seekMode?this.$container.getBoundingClientRect():this.seekBar.getBoundingClientRect();if(null!==this.openDisplayTimeout&&(r+=(s-r)/2),!(r<=e.clientY))return}else if(!(e.target instanceof Node&&this.seekBar.contains(e.target)))return;const r=s/i.width;return{absoluteRaw:a(e.clientX-n,[0,i.width]),secondsPerPixel:r}}async snapPosition(e){let{absoluteRaw:t,secondsPerPixel:s}=e,i=t*s;const n=this.chapters?.timeToChapter(i+2*s);let r=!1;if(!this.isChanging){if(null!==this.snapToThumbnail){const e=await this.getSingleThumbnail(this.snapToThumbnail,i);null!==e&&(i=e.imageTime,t=i/s)}n&&(i-n.timecode)/s<6&&(null===this.snapToThumbnail&&(i=n.timecode,t=i/s),r=!0)}return{absolute:t,seconds:i,chapter:n,onChapterMarker:r}}ensureDisplaySize(e,t){const s=Math.floor(160/e*t);this.$display.clientHeight!==s&&(this.$display.style.height=`${s}px`)}currentRenderBest(e=!1){e&&null===this.openDisplayTimeout?this.openDisplayTimeout=setTimeout(()=>{this.openDisplayTimeout=null,this.currentRenderBest()},100):null===this.openDisplayTimeout&&null===this.renderAnimationFrame&&(this.renderAnimationFrame=window.requestAnimationFrame(()=>{this.renderAnimationFrame=null;const e=this.current;if(null!==e){this.setIsVisible(!0,e.thumbs.length>0,!1),this.renderSeekPosition(e.seekPosition);for(const t of e.thumbs){const s=t.uris[0];if(void 0===s)continue;const i=this.network.getCached(s);if(null!==i){this.renderImageAndShow(s,t,i,e.seekPosition);break}this.network.get(s).then(()=>{this.currentRenderBest()})}}}))}renderImageAndShow(e,t,s,i){this.ensureDisplaySize(t.width,t.height),this.renderImage(e,t,s),this.setIsVisible(!0),this.positionContainer(i),this.renderSeekPosition(i,t)}renderImage(e,t,s,i=!1){if(i||null===this.lastRendered||t.imageTime!==this.lastRendered.thumb.imageTime||t.bandwidth!==this.lastRendered.thumb.bandwidth){const{positionX:i,positionY:n,width:r}=t,a=160/r;this.$img.replaceWith(s),this.$img=s,this.$img.style.transform=[`scale(${a})`,`translateX(-${i}px)`,`translateY(-${n}px)`].join(" "),this.$img.style.transformOrigin="left top",this.lastRendered={uri:e,thumb:t,tilesetImage:s}}}positionContainer(e){const t=a(e.absolute-this.$container.offsetWidth/2,[0,this.seekBar.clientWidth-this.$container.offsetWidth]);this.$container.style.left=`${t}px`}renderSeekPosition(e,t=null){const s=this.saneVideoDuration();if(void 0===s)return void this.setIsVisible(!1);this.$seekMarker.style.left=`${e.absolute}px`,null!==t&&null!==this.snapToThumbnail&&(this.$seekThumbBar.style.left=t.startTime/s*100+"%",this.$seekThumbBar.style.width=t.duration/s*100+"%"),e.onChapterMarker?this.$info.classList.add("on-chapter-marker"):this.$info.classList.remove("on-chapter-marker");const i=e.chapter?.title??"";this.$chapterText.innerText=i,g(this.$chapterText,"displayed",""!==i),this.$timecodeText.innerText=T(e.seconds,s>=3600,this.fps),this.positionContainer(e)}cancelPreview(){this.setIsVisible(!1),this.endChange()}beginChange(e=null){this.isChanging||(this.deltaStart=this.convertDelta(e),this.interaction?.onChangeStart?.(),document.body.classList.add("seek-or-scrub"),this.isChanging=!0)}convertDelta(e){if(null===e)return null;const t=this.player.getMediaElement();return null===t?null:{clientX:e,seconds:t.currentTime}}endChange(){this.isChanging&&(this.deltaStart=null,this.interaction?.onChangeEnd?.(),document.body.classList.remove("seek-or-scrub"),this.isChanging=!1)}get isVisible(){return null!==this.current}setIsVisible(e,t=e,s=t){e||(this.current=null),g(this.$container,"dlf-visible",e),g(this.$seekMarker,"dlf-visible",e),g(this.$seekThumbBar,"dlf-visible",s&&null!==this.snapToThumbnail),g(this.$display,"is-open",t),g(this.$img,"dlf-visible",s),function(e){e.draggable=!1,e.ondragstart=m}(this.$img)}async getThumbnails(e,t){let s=[];if(null!==this.snapToThumbnail)s=[this.snapToThumbnail];else{let e=this.thumbnailTracks.find(e=>e.bandwidth<t);if(void 0!==e){let t=this.thumbnailTracks[this.thumbnailTracks.length-1];s=e===t?[e]:[e,t]}}const i=s.map(t=>this.getSingleThumbnail(t,e));return v(await Promise.all(i))}async getSingleThumbnail(e,t){const s=await e.getThumb(t),i=this.saneVideoDuration();return null===s||void 0===i?null:(r=i,(n=s).startTime<r&&n.imageTime<r?{...n,duration:Math.min(n.duration,r-n.startTime)}:null);var n,r}showThumbnailImage(){const e=this.player.getMediaElement();return 300<=.4*(e?.clientHeight??0)}saneVideoDuration(){const e=this.player.getMediaElement()?.duration;return void 0!==e&&e>0?e:void 0}}class S extends n().ui.Element{static register(){n().ui.Controls.registerSeekBar({create:(e,t)=>new S(e,t)})}constructor(e,t){super(e,t),this.$container=r("div",{className:"dlf-media-flat-seek-bar"},[this.$range=r("div",{className:"range"})]),e.prepend(this.$container),this.dlf={mediaProperties:{poster:null,chapters:null,fps:null,variantGroups:null},hasRenderedChapters:!1,value:0,uiConfig:t.getConfig(),wasPlaying:!1,seekTimer:null,thumbnailPreview:null,lastGradientStr:""},this.dlf.seekTimer=new(n().util.Timer)(()=>{null!==this.video&&(this.video.currentTime=this.getValue(),this.controls?.dispatchEvent(new CustomEvent("dlf-media-manual-seek",{})))}),null!==this.player&&(this.dlf.thumbnailPreview=new C({seekBar:this.$container,player:this.player,network:new k,interaction:{onChangeStart:()=>{this.controls?.setSeeking(!0),null!==this.video&&(this.dlf.wasPlaying=!this.video.paused,this.video.pause())},onChange:e=>{this.dlf.value=e.seconds,this.update(),this.dlf.seekTimer?.tickAfter(.125)},onChangeEnd:()=>{this.dlf.seekTimer?.tickNow(),this.controls?.setSeeking(!1),this.dlf.wasPlaying&&this.video?.play()}}})),this.eventManager&&(this.eventManager.listen(this.player,"loaded",()=>{this.update()}),this.eventManager.listen(this.player,"variantchanged",()=>{this.updatePreviewImageTracks()}),this.eventManager.listen(this.controls,"dlf-media-properties",e=>{const t=e.detail;this.dlf.mediaProperties=t.fullProps;const{chapters:s,fps:i,variantGroups:n}=t.updateProps;void 0!==s&&(this.dlf.hasRenderedChapters=!1,this.dlf.thumbnailPreview?.setChapters(s),this.update()),void 0!==i&&this.dlf.thumbnailPreview?.setFps(i?.rate??null),n&&this.updatePreviewImageTracks()}),this.controls?.dispatchEvent(new CustomEvent("dlf-media-seek-bar",{detail:{seekBar:this}})))}release(){null!==this.dlf.seekTimer&&(this.dlf.seekTimer.stop(),this.dlf.seekTimer=null),null!==this.dlf.thumbnailPreview&&(this.dlf.thumbnailPreview.release(),this.dlf.thumbnailPreview=null),super.release()}get thumbnailPreview(){return this.dlf.thumbnailPreview}isThumbnailPreviewOpen(){return this.dlf.thumbnailPreview?.isVisible??!1}endSeek(){this.dlf.thumbnailPreview?.endChange(),this.dlf.thumbnailPreview?.setIsVisible(!1)}setThumbnailSnap(e){this.dlf.thumbnailPreview?.activateThumbnailSnap(e)}renderChapterMarkers(e,t){this.$range.querySelectorAll(".dlf-media-chapter-marker").forEach(e=>{e.remove()});for(const s of e){const e=s.timecode/t;if(!(0<=e&&e<1))continue;const i=document.createElement("span");i.className="dlf-media-chapter-marker",i.style.position="absolute",i.style.left=100*e+"%",this.$range.append(i)}}updatePreviewImageTracks(){if(null===this.dlf.thumbnailPreview)return void console.warn("FlatSeekBar: Missing thumbnail preview");const{variantGroups:e}=this.dlf.mediaProperties;if(null===e)return;const t=e.findThumbnailTracks();this.dlf.thumbnailPreview.setThumbnailTracks(t)}getValue(){return this.dlf.value}isShowing(){return!0}setValue(e){this.controls?.isSeeking()||(this.dlf.value=e)}makeColor(e,t){return`${e} ${100*t}%`}update(){if(null===this.video)return void console.warn("FlatSeekBar: Missing video");const e=this.video.duration;if(!(e>0))return;const{chapters:t}=this.dlf.mediaProperties;null==t||this.dlf.hasRenderedChapters||(this.renderChapterMarkers(t,e),this.dlf.hasRenderedChapters=!0);const s=getComputedStyle(this.$container),i={base:s.getPropertyValue("--base-color")||"rgba(255, 255, 255, 0.3)",buffered:s.getPropertyValue("--buffered-color")||"rgba(255, 255, 255, 0.54)",played:s.getPropertyValue("--played-color")||"rgb(255, 255, 255)"},n=this.getValue(),r=this.video.buffered.length,a=r?this.video.buffered.start(0):0,o=r?this.video.buffered.end(r-1):0,l={start:0,end:e},h=l.end-l.start,d=Math.max(a,l.start),c=Math.min(o,l.end),u=Math.min(Math.max(n,l.start),l.end),p=(d-l.start)/h||0,m=(c-l.start)/h||0,f=(u-l.start)/h||0,g=this.dlf.uiConfig.showUnbufferedStart?i.base:i.played,v="linear-gradient("+["to right",this.makeColor(g,p),this.makeColor(i.played,p),this.makeColor(i.played,f),this.makeColor(i.buffered,f),this.makeColor(i.buffered,m),this.makeColor(i.base,m)].join(",")+")";v!==this.dlf.lastGradientStr&&(this.dlf.lastGradientStr=v,this.$range.style.background=v)}}class P extends y{constructor(e,t,s,i={}){const n=r("button",{className:"material-icons-round shaka-fullscreen-button shaka-tooltip"},["fullscreen"]);n.setAttribute("data-t-title","control.bookmark.tooltip"),super(e,t,s,{...i,element:n}),this.eventManager&&this.eventManager.listen(document,"fullscreenchange",this.updateFullScreenButton.bind(this)),this.updateFullScreenButton()}updateControlPanelButton(){}updateFullScreenButton(){document.fullscreenEnabled?(this.dlf.element.textContent=document.fullscreenElement?"fullscreen_exit":"fullscreen",this.dlf.element.ariaLabel=document.fullscreenElement?this.env.t("control.fullscreen_exit.tooltip"):this.env.t("control.fullscreen.tooltip")):this.dlf.element.classList.add("shaka-hidden")}}n().ui.SettingsMenu;class x extends n().ui.PlaybackRateSelection{static register(e){const t=e.mkid();return n().ui.OverflowMenu.registerElement(t,{create:(t,s)=>new x(t,s,e)}),t}constructor(e,t,s){super(e,t),this.$playRateTooltip=r("div",{className:"dlf-playrate-tooltip"});const i=this.player?.getPlaybackRate()||1;this.$playRateTooltip.textContent=this.getRateStr(i),this.$container=r("div",{className:"shaka-range-container dlf-playrate-slider"},[this.$input=r("input",{className:"shaka-range-element",type:"range",valueAsNumber:Math.log2(i),min:"-1",max:"1",step:"0.01",$input:()=>{const e=2**this.$input.valueAsNumber,t=this.player?.getMediaElement();t&&(t.playbackRate=e,t.defaultPlaybackRate=e)}}),this.$playRateTooltip]),null!==this.player&&this.menu.insertBefore(this.$container,this.backButton.nextSibling),null!==this.eventManager&&this.eventManager.listen(this.player,"ratechange",()=>{if(null!==this.player){const e=this.player.getPlaybackRate();this.$input.valueAsNumber=Math.log2(e);const t=this.getRateStr(e);this.currentSelection.textContent=t,this.button.setAttribute("shaka-status",t),this.updateTooltip(e,this.$input)}})}getRateStr(e){return`${e.toLocaleString(void 0,{maximumFractionDigits:2})}x`}updateTooltip(e,t){const s=t.valueAsNumber,i=t.min?parseFloat(t.min):0,n=t.max?parseFloat(t.max):100,r=Number(100*(s-i)/(n-i));this.$playRateTooltip.textContent=this.getRateStr(e),this.$playRateTooltip.style.left=`calc(${r}% + (${17-.35*r}px))`}}const _=0,M=1,$=2;class E extends n().ui.Element{static register(e){const t=e.mkid();return n().ui.Controls.registerElement(t,{create:(t,s)=>new E(t,s,e)}),t}constructor(e,t,s){super(e,t);const i=r("button",{className:"shaka-current-time shaka-tooltip",ariaLabel:s.t("control.time.tooltip")});if(e.appendChild(i),this.dlf={env:s,currentTime:i},this.state={isReady:!1,activeMode:0,totalSeconds:0,duration:0,mediaProperties:{chapters:null,fps:null}},this.eventManager){this.eventManager.listen(i,"click",()=>{this.render({activeMode:(this.state.activeMode+1)%3})});const e=this.updateTime.bind(this);this.eventManager.listen(this.controls,"timeandseekrangeupdated",e),this.eventManager.listen(this.controls,"dlf-media-properties",e=>{const t=e.detail;this.render({mediaProperties:t.fullProps})})}}updateTime(){if(null===this.controls||null===this.video||this.video.readyState<1)this.render({isReady:!1});else{let e=this.video.duration;e>=0||(e=0),this.render({isReady:!0,duration:e,totalSeconds:a(this.controls.getDisplayTime(),[0,e])})}}render(e){const t=Object.assign({},this.state,e);if(Object.keys(e).some(t=>e[t]!==this.state[t])){const e={[_]:"current-time",[M]:"remaining-time",[$]:"current-frame"}[t.activeMode]??"current-time";this.dlf.currentTime.textContent=this.getTimecodeText(e,t)}this.state=t}getTimecodeText(e,{isReady:t,totalSeconds:s,duration:i,mediaProperties:n}){if(t&&0!==i){const t=i>=3600,{chapters:r,fps:a}=n,o=a?.rate??null,l={get chapterTitle(){return r?.timeToChapter(s)?.title??"_"},get currentTime(){return T(s,t,o)},get totalTime(){return T(i,t,o)},get remainingTime(){return T(i-s,t,o)},get currentFrame(){return a?.vifa.get()??-1}};return this.dlf.env.t(`control.time.${e}.text`,l)}return this.dlf.env.t("player.loading")}}class A extends n().ui.SettingsMenu{static register(e){const t=e.mkid();return n().ui.OverflowMenu.registerElement(t,{create:(t,s)=>new A(t,s,e)}),t}constructor(e,t,s){super(e,t,"switch_video"),this.dlf={env:s,activeCheck:r("i",{className:"material-icons-round shaka-chosen-item"},["done"]),variantGroups:null},this.updateStrings(),this.updateVisibility(),this.menuButtons={},this.eventManager&&(this.eventManager.listen(this.controls,"dlf-media-properties",e=>{const t=e.detail,{variantGroups:s}=t.updateProps;if(void 0!==s)try{this.setVariantGroups(s)}catch(e){console.error(e)}}),this.eventManager.listen(this.player,"variantchanged",()=>{this.markActiveGroup()}))}setVariantGroups(e){if(this.dlf.variantGroups=e,this.clearMenu(),this.updateVisibility(),null!==e){for(const t of e){const e=r("button",{$click:()=>{this.dlf.variantGroups?.selectGroupByKey(t.key)}},[r("span",{},[t.key])]);this.menu.appendChild(e),this.menuButtons[t.key]=e}this.markActiveGroup()}}clearMenu(){for(const e of Object.values(this.menuButtons))e.remove();this.menuButtons={}}markActiveGroup(){const e=this.dlf.variantGroups?.findActiveGroup();e&&(this.menuButtons[e.key]?.appendChild(this.dlf.activeCheck),this.currentSelection.textContent=e.key)}updateVisibility(){(this.dlf.variantGroups?.numGroups??0)>0?this.button.classList.remove("shaka-hidden"):this.button.classList.add("shaka-hidden")}updateStrings(){const e=this.dlf.env.t("control.back"),t=this.dlf.env.t("control.video-track.title");this.backButton.ariaLabel=e,this.button.ariaLabel=t,this.nameSpan.textContent=t,this.backSpan.textContent=t}}class R{constructor(e){this.elements=e.slice(),this.elements.sort((e,t)=>e.timecode-t.timecode),this.elementToIndex=new Map;for(const[e,t]of this.elements.entries())this.elementToIndex.set(t,e)}at(e){return this.elements[e]}indexOf(e){return this.elementToIndex.get(e)}advance(e,t=1){const s=this.indexOf(e);if(void 0!==s)return this.elements[s+t]}timeToElement(e){return this.timeToEntry(e)?.[1]}timeToEntry(e){if(0===this.elements.length)return;let t=0,s=this.elements.length-1;for(;t+1<s;){const i=Math.floor((t+s)/2);this.elements[i].timecode<=e?t=i:s=i}const i=this.elements[s];if(i.timecode<=e)return[s,i];const n=this.elements[t];return n.timecode<=e?[t,n]:void 0}find(e){return this.elements.find(e)}[Symbol.iterator](){return this.elements.values()}*reversed(){for(let e=this.elements.length-1;e>=0;e--)yield this.elements[e]}}class B extends R{timeToChapter(e){return this.timeToElement(e)}filter(e){return new B(this.elements.filter(e))}static isEqual(e,t){return e===t||null!==e&&null!==t&&e.timecode===t.timecode&&!!globalThis.dlfUtils?.arrayEqualsByIdentity(e.fileIds,t.fileIds)}}class q{constructor(){this.__listeners=new Map}addEventListener(e,t,s={}){if(arguments.length<2)throw new TypeError("TypeError: Failed to execute 'addEventListener' on 'EventTarget': 2 arguments required, but only "+arguments.length+" present.");const i=this.__listeners,n=e.toString();i.has(n)||i.set(n,new Map);const r=i.get(n);r.has(t)||r.set(t,s)}removeEventListener(e,t,s){if(arguments.length<2)throw new TypeError("TypeError: Failed to execute 'addEventListener' on 'EventTarget': 2 arguments required, but only "+arguments.length+" present.");const i=this.__listeners,n=e.toString();if(i.has(n)){const e=i.get(n);e.has(t)&&e.delete(t)}}dispatchEvent(e){if(!(e instanceof Event))throw new TypeError("Failed to execute 'dispatchEvent' on 'EventTarget': parameter 1 is not of type 'Event'.");const t=e.type,s=this.__listeners.get(t);if(s)for(var i of s.entries()){const t=i[0],n=i[1];try{"function"==typeof t?t.call(this,e):t&&"function"==typeof t.handleEvent&&t.handleEvent(e)}catch(e){setTimeout(()=>{throw e})}n&&n.once&&s.delete(t)}return!0}}class F extends q{constructor(){super(),this.cnt_=0,this.activeSegment_=null,this.segments_={}}get activeSegment(){return this.activeSegment_}add(e){const t=e.id??this.makeId(),s=this.segments_[t]={labelText:"",editable:!0,...e,id:t,toTimeRange(){return{startTime:this.startTime,endTime:this.endTime??null}}};return this.dispatchEvent(new CustomEvent("add",{detail:{segments:[s]}})),this.activateSegmentById(s.id),s}update(e,t=!1){const s=this.segments_[e.id],i=Object.assign({},s);if(void 0!==s){for(const[t,i]of Object.entries(e))void 0!==i&&(s[t]=i);this.dispatchEvent(new CustomEvent("update",{detail:{segment:s,prevSegment:i}})),t&&this.activateSegment(s)}}removeById(e){const t=this.segments_[e];delete this.segments_[e],void 0!==t&&this.dispatchEvent(new CustomEvent("remove",{detail:{segments:[t]}})),null!==this.activeSegment_&&e===this.activeSegment_.id&&this.activateSegment(null)}removeAll(){this.segments_={},this.dispatchEvent(new CustomEvent("remove_all",{detail:{}})),this.activateSegment(null)}activateSegmentById(e){const t=this.segments_[e];void 0!==t&&this.activateSegment(t)}activateSegment(e){e!==this.activeSegment_&&(this.activeSegment_=e,this.dispatchEvent(new CustomEvent("activate_segment",{detail:{segment:this.activeSegment_}})))}getSegment(e){return this.segments_[e]}getSegments(){return Object.values(this.segments_)}makeId(){return"dlf.segments."+this.cnt_++}}var I=s(2065);class L{constructor(){this.idCnt=0,this.testElements={},this.lang={twoLetterIsoCode:"en",phrasesInput:{},phrasesCompiled:{}}}getLocation(){return new URL(window.location.href)}supportsMediaSource(){return void 0!==window.MediaSource&&void 0!==window.MediaSource.isTypeSupported}supportsCanvasExport(e){var t;return(t=this.getTestElement("canvas").toDataURL(e),t.match(/data:(.*);/)?.[1])===e}supportsVideoMime(e){return""!==this.getTestElement("video").canPlayType(e)}getKeyboardVariant(){return navigator.userAgent.includes("Mac")?"mac":"ibm"}isInFullScreen(){return null!==b()}async toggleFullScreen(e,t){if(document.fullscreenElement)screen.orientation&&screen.orientation.unlock(),await document.exitFullscreen();else try{if(document.pictureInPictureElement&&await document.exitPictureInPicture(),await e.requestFullscreen({navigationUI:"hide"}),t&&screen.orientation)try{await screen.orientation.lock("landscape")}catch(e){}}catch(e){console.log(e)}}mkid(){return"__autoid_"+ ++this.idCnt}uuidv4(){return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,e=>{const t=Number(e);return(t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)})}setLang(e){this.lang={twoLetterIsoCode:e.twoLetterIsoCode,phrasesInput:e.phrases,phrasesCompiled:{}}}t(e,t={},s=void 0){let i=this.lang.phrasesCompiled[e];if(void 0===i){const t=this.lang.phrasesInput[e];if(void 0===t)return"function"==typeof s?s():(console.error(`Warning: Translation key '${e}' not defined, fallback not provided.`),e);i=this.lang.phrasesCompiled[e]=new I.Ay(t,this.lang.twoLetterIsoCode,{},{ignoreTag:!0})}return i.format(t)}getTestElement(e){return this.testElements[e]??document.createElement(e)}}class N{constructor(){this.listeners_=[]}record(e){const t=EventTarget.prototype.addEventListener,s=q.prototype.addEventListener,i=this;try{EventTarget.prototype.addEventListener=function(e,s,n){i.listeners_.push({target:this,type:e,callback:s,options:n}),t.call(this,e,s,n)},q.prototype.addEventListener=function(e,t,n){i.listeners_.push({target:this,type:e,callback:t,options:n}),s.call(this,e,t,n)},e()}finally{EventTarget.prototype.addEventListener=t,q.prototype.addEventListener=s}}removeAll(){for(const e of this.listeners_)e.target.removeEventListener(e.type,e.callback,e.options)}}function O(e){return"function"==typeof e?{isAvailable:()=>!0,execute:e}:{isAvailable:e.isAvailable??(()=>!0),execute:e.execute??(()=>!1)}}function D(e){return"audio"===e||"video"===e}var V=s(7007),U=s.n(V);class G{constructor(e={}){this.config={tapMaxDelay:200,tapMaxDistance:20,swipeMinDistance:100,holdMinDelay:200,allowGesture:()=>!0,...e},this.last={tapdown:null,tapup:null},this.holdTimeout=null,this.tapCount=0,this.handlers={contextmenu:this.handleContextMenu.bind(this),pointerdown:this.handlePointerDown.bind(this),pointerup:this.handlePointerUp.bind(this),pointercancel:this.handlePointerCancel.bind(this),pointerleave:this.handlePointerLeave.bind(this)},this.events=new(U())}register(e){e.addEventListener("contextmenu",this.handlers.contextmenu),e.addEventListener("pointerdown",this.handlers.pointerdown),e.addEventListener("pointerup",this.handlers.pointerup),e.addEventListener("pointercancel",this.handlers.pointercancel),e.addEventListener("pointerleave",this.handlers.pointerleave)}deregister(e){e.removeEventListener("contextmenu",this.handlers.contextmenu),e.removeEventListener("pointerdown",this.handlers.pointerdown),e.removeEventListener("pointerup",this.handlers.pointerup),e.removeEventListener("pointercancel",this.handlers.pointercancel),e.removeEventListener("pointerleave",this.handlers.pointerleave)}on(e,t){this.events.on(e,t)}handleContextMenu(e){this.release()}handlePointerDown(e){if(0!==e.button||!this.config.allowGesture(e))return void this.release();const t=this.getStat(e);"tap"===this.getContinuation(this.last.tapup,t)?this.tapCount++:this.tapCount=1;const s=this.tapCount;this.clearHold(),this.holdTimeout=setTimeout(()=>{this.events.emit("gesture",{type:"hold",event:e,position:t.positionRel,tapCount:s})},this.config.holdMinDelay),this.emitTap("tapdown",e,t)}handlePointerUp(e){if(0!==e.button||!this.config.allowGesture(e))return;const t=this.getStat(e);this.clearHold();const s=this.getContinuation(this.last.tapdown,t);if("tap"===s)this.emitTap("tapup",e,t);else if(1===this.tapCount&&"swipe"===s){const s=this.last.tapdown,i=t,n=Math.atan2(s.positionPx.y-i.positionPx.y,i.positionPx.x-s.positionPx.x),r=Math.abs(n/Math.PI*180);let a;a=r<45?"east":r<135?n>0?"north":"south":"west",this.events.emit("gesture",{type:"swipe",event:e,begin:s.positionRel,end:i.positionRel,angle:n,direction:a}),this.reset()}else this.release()}handlePointerCancel(e){this.release()}handlePointerLeave(e){const{tapdown:t,tapup:s}=this.last;(null===t||null!==s&&t.date>s.date)&&this.release()}emitTap(e,t,s){this.events.emit("gesture",{type:e,event:t,position:s.positionRel,tapCount:this.tapCount}),this.last[e]=s}release(){const e=this.isActive;this.reset(),e&&this.events.emit("release")}reset(){this.tapCount=0,this.clearHold(),this.last={tapdown:null,tapup:null}}get isActive(){return 0!==this.tapCount||null!==this.last.tapdown||null!==this.last.tapup}getStat(e){const t=e.target.getBoundingClientRect(),s={x:e.clientX,y:e.clientY},i={x:e.screenX||s.x,y:e.screenY||s.y},n={x:(s.x-t.left)/t.width,y:(s.y-t.top)/t.height};return{date:new Date,positionClientPx:s,positionPx:i,positionRel:n}}getContinuation(e,t){if(null===e)return"tap";if(t.date.valueOf()-e.date.valueOf()>this.config.tapMaxDelay)return"cancel";const s=(t.positionPx.x-e.positionPx.x)**2+(t.positionPx.y-e.positionPx.y)**2;return s<=this.config.tapMaxDistance**2?"tap":s>=this.config.swipeMinDistance**2?"swipe":"cancel"}clearHold(){null!==this.holdTimeout&&(clearTimeout(this.holdTimeout),this.holdTimeout=null)}}class z{constructor(e,t,s,i){this.constants={minBottomControlsReadyState:2},this.env=e,this.eventMgr_=t,this.player=s,this.media=i,this.mediaProperties={poster:null,chapters:null,fps:null,variantGroups:null},this.lastReadyState=0,this.playerProperties={mode:"audio",locale:"",state:"poster",error:null,controlElements:[],actions:{},playerView:null},this.overflowMenuButtons=[],this.shakaBottomControls=null,this.shakaBottomControlElements=[],this.seekBar_=null,this.$container=r("div",{className:"dlf-media-player dlf-shaka"},[this.$videoBox=r("div",{className:"dlf-media-shaka-box"},[this.$video=i,this.$poster=r("img",{className:"dlf-media-poster dlf-visible",$error:()=>{this.hidePoster()}})]),this.$errorBox=r("div",{className:"dlf-media-shaka-box dlf-media-error"})]),this.ui=new(n().ui.Overlay)(this.player,this.$videoBox,this.media),this.controls=this.ui.getControls(),this.configureTimeout=null,this.isConfigured=!1,this.gestures_=new G({allowGesture:this.allowGesture.bind(this)}),this.handlers={onControlsErrorEvent:this.onControlsErrorEvent.bind(this),onPlay:this.onPlay.bind(this),onTimeUpdate:this.onTimeUpdate.bind(this),afterManualSeek:this.afterManualSeek.bind(this)},this.registerEventHandlers(),this.scheduleConfigure()}destroy(){this.controls.destroy(),this.gestures_.deregister(this.$videoBox)}registerEventHandlers(){this.controls.addEventListener("error",this.handlers.onControlsErrorEvent),this.controls.addEventListener("dlf-media-seek-bar",e=>{const t=e.detail;this.seekBar_=t.seekBar,this.autosetSeekMode()}),this.controls.addEventListener("dlf-media-manual-seek",this.handlers.afterManualSeek),this.controls.addEventListener("timeandseekrangeupdated",this.handlers.onTimeUpdate),this.media.addEventListener("play",this.handlers.onPlay),this.gestures_.register(this.$videoBox)}get domElement(){return this.$container}get seekBar(){return this.seekBar_}get gestures(){return this.gestures_}updateMediaProperties(e){Object.assign(this.mediaProperties,e),this.notifyMediaProperties(this.mediaProperties,e)}notifyMediaProperties(e=this.mediaProperties,t=e){void 0!==t.poster&&this.renderPoster();const s=new CustomEvent("dlf-media-properties",{detail:{updateProps:t,fullProps:e}});this.controls.dispatchEvent(s)}updatePlayerProperties(e){const t=void 0!==e.mode&&(!this.isConfigured||e.mode!==this.playerProperties.mode)||void 0!==e.controlElements&&(!this.isConfigured||e.controlElements!==this.playerProperties.controlElements);for(const[t,s]of Object.entries(e))void 0!==s&&(this.playerProperties[t]=s);void 0!==e.locale&&this.controls.getLocalization()?.changeLocale([e.locale]),void 0!==e.state&&this.renderPoster(),void 0!==e.error&&this.renderError(),t&&this.scheduleConfigure()}handleEscape(){return this.seekBar?.isThumbnailPreviewOpen()?(this.seekBar?.endSeek(),!0):!!this.controls.anySettingsMenusAreOpen()&&(this.controls.hideSettingsMenus(),!0)}afterManualSeek(){this.hidePoster()}alwaysPrependBottomControl(e){this.prependBottomControl(e),this.shakaBottomControlElements.push(e)}prependBottomControl(e){if("video"===this.playerProperties.mode)this.shakaBottomControls?.prepend(e);else{const t=this.$container.parentElement;null!==t&&null!==t.parentElement&&t.parentElement.insertBefore(e,t)}}addOverflowButton(...e){this.overflowMenuButtons.push(...e),this.scheduleConfigure()}scheduleConfigure(){null===this.configureTimeout&&(this.configureTimeout=setTimeout(()=>{this.configureTimeout=null,this.configure()}))}configure(){if(S.register(),this.$container.setAttribute("data-mode",this.playerProperties.mode),this.playerProperties.playerView?.setAttribute("data-mode",this.playerProperties.mode),this.ui.configure(this.getShakaConfiguration()),this.isConfigured=!0,this.autosetSeekMode(),this.$videoBox.dispatchEvent(new MouseEvent("mousemove")),this.shakaBottomControls=this.$videoBox.querySelector(".shaka-bottom-controls"),null!==this.shakaBottomControls)for(const e of this.shakaBottomControlElements)this.prependBottomControl(e);this.notifyMediaProperties()}autosetSeekMode(){const e="audio"===this.playerProperties.mode?"narrow":"wide";this.seekBar_?.thumbnailPreview?.setSeekMode(e)}getShakaConfiguration(){const e=this.playerProperties.mode,t=this.playerProperties.controlElements,s=getComputedStyle(this.$container);return{addSeekBar:!0,enableTooltips:!0,controlPanelElements:["play_pause",E.register(this.env),"spacer",...t.map(this.makeControlElement.bind(this)),"overflow_menu"],overflowMenuButtons:["language",A.register(this.env),x.register(this.env),"loop","quality","picture_in_picture","captions",...this.overflowMenuButtons],addBigPlayButton:"video"===e,fadeDelay:"audio"===e?1e8:void 0,volumeBarColors:{base:s.getPropertyValue("--volume-base-color")||"rgba(255, 255, 255, 0.54)",level:s.getPropertyValue("--volume-level-color")||"rgb(255, 255, 255)"},enableKeyboardPlaybackControls:!1,doubleClickForFullscreen:!1,singleClickForPlayAndPause:!1,seekOnTaps:!1}}makeControlElement(e){const t=this.playerProperties.actions,s=e.getAttribute("data-type");if(null===s){const s=e.getAttribute("data-action")??"";return y.register(this.env,{element:e,onClickAction:O({isAvailable:()=>t[s]?.isAvailable()??!1,execute:()=>{t[s]?.execute()}})})}return"fullscreen"===s?P.register(this.env,{onClickAction:t["fullscreen.toggle"]}):s}hideBigPlayButton(){const e=document.querySelector(".shaka-controls-container .shaka-play-button");e&&e.classList.add("dlf-hide-big-play-button")}hidePoster(){this.$poster.classList.remove("dlf-visible")}renderPoster(){const e=null!==this.mediaProperties.poster&&"poster"===this.playerProperties.state;e&&(this.$poster.src=this.mediaProperties.poster),g(this.$poster,"dlf-visible",e)}renderError(){null===this.playerProperties.error?g(this.$errorBox,"dlf-visible",!1):(g(this.$errorBox,"dlf-visible",!0),this.$errorBox.textContent=this.env.t(this.playerProperties.error))}allowGesture(e){const t=this.$videoBox.getBoundingClientRect(),s=this.shakaBottomControls?.getBoundingClientRect().height??0,i=t.bottom-s-20;return!(e.clientY>=i)&&e.target===this.$videoBox.querySelector(".shaka-play-button-container")}onControlsErrorEvent(e){if(e instanceof CustomEvent){const t=e.detail;console.error("Error from Shaka controls",t.code,t)}}onPlay(){this.hidePoster(),this.hideBigPlayButton()}onTimeUpdate(){const e=this.media.readyState;e!==this.lastReadyState&&this.updateBottomControlsVisibility(e)}updateBottomControlsVisibility(e){0===e?this.shakaBottomControls?.classList.remove("dlf-visible"):e>=this.constants.minBottomControlsReadyState&&this.shakaBottomControls?.classList.add("dlf-visible")}}class j{constructor(e,t){this.player=e,this.track=t}get bandwidth(){return this.track.bandwidth}async getThumb(e){const t=await this.player.getThumbnails(this.track.id,e);return null===t?null:{track:this,...t,imageTime:t.startTime+t.duration/2-1e-5,bandwidth:this.track.bandwidth}}}class H{constructor(e){if(this.player=e,this.manifest=e.getManifest(),this.groupKeys=[],this.groups=[],this.keyToGroup={},null!==this.manifest)for(const e of this.manifest.variants)this.addVariant(e);else console.warn("Manifest not available")}static splitRepresentationId(e){const t=(e??"").split("#");return{id:t[0]??null,group:t[1]??"Standard"}}addVariant(e){const t=e.video;if(t){const s=H.splitRepresentationId(t.originalId).group,i=this.getGroupOrCreate(s);i.variants.push(e);for(const e of t.roles)i.roles.add(e);t.primary&&(i.hasPrimary=!0)}}get numGroups(){return this.groupKeys.length}getGroupOrCreate(e){let t=this.keyToGroup[e];return t||(t=this.keyToGroup[e]={key:e,variants:[],roles:new Set,hasPrimary:!1},this.groupKeys.push(e),this.groups.push(t)),t}findActiveTrack(){return this.player.getVariantTracks().find(e=>e.active)}findThumbnailTracks(){const e=[],t=this.findActiveGroup()?.key;for(const s of this.player.getImageTracks())H.splitRepresentationId(s.originalImageId).group===t&&e.push(new j(this.player,s));return e}findActiveGroup(){const e=this.findActiveTrack();if(e){const t=H.splitRepresentationId(e.originalVideoId).group;return this.keyToGroup[t]}}selectGroup(e){if(this.manifest){if(this.manifest.variants!==e.variants){const t=this.findActiveTrack();this.manifest.variants=e.variants,this.player.selectAudioLanguage(t?.language??"und")}}else console.warn("Cannot select group: Manifest not available")}trySelectGroup(e){return!!e&&(this.selectGroup(e),!0)}selectGroupByKey(e){return this.trySelectGroup(this.keyToGroup[e])}selectGroupByIndex(e){return this.trySelectGroup(this.groups[e])}selectGroupByRole(e){return this.trySelectGroup(this.groups.find(t=>t.roles.has(e)))}selectGroupWithPrimary(){return this.trySelectGroup(this.groups.find(e=>e.hasPrimary))}*[Symbol.iterator](){for(const e in this.keyToGroup)yield this.keyToGroup[e]}}var W=function(e){if(this===window)return new W(e);this.obj=e||{},this.frameRate=this.obj.frameRate||24,this.video=document.getElementById(this.obj.id)||document.getElementsByTagName("video")[0]};W.prototype={get:function(){return Math.floor(this.video.currentTime.toFixed(5)*this.frameRate)},listen:function(e,t){var s=this;e?this.interval=setInterval(function(){if(!s.video.paused&&!s.video.ended){var t="SMPTE"===e?s.toSMPTE():"time"===e?s.toTime():s.get();return s.obj.callback&&s.obj.callback(t,e),t}},t||1e3/s.frameRate/2):console.log("VideoFrame: Error - The listen method requires the format parameter.")},stopListen:function(){clearInterval(this.interval)},fps:{film:24,NTSC:29.97,NTSC_Film:23.98,NTSC_HD:59.94,PAL:25,PAL_HD:50,web:30,high:60}},W.prototype.toTime=function(e){var t="number"!=typeof e?this.video.currentTime:e,s=this.frameRate,i=new Date,n="hh:mm:ss"+("number"==typeof e?":ff":"");function r(e){return e<10?"0"+e:e}return i.setHours(0),i.setMinutes(0),i.setSeconds(0),i.setMilliseconds(1e3*t),n.replace(/hh|mm|ss|ff/g,function(e){switch(e){case"hh":return r(i.getHours()<13?i.getHours():i.getHours()-12);case"mm":return r(i.getMinutes());case"ss":return r(i.getSeconds());case"ff":return r(Math.floor(t%1*s))}})},W.prototype.toSMPTE=function(e){if(!e)return this.toTime(this.video.currentTime);var t=Number(e),s=this.frameRate;function i(e){return e<10?"0"+e:e}var n=60*s,r=(t/(60*s*60)).toFixed(0),a=Number((t/n).toString().split(".")[0])%60,o=Number((t/s).toString().split(".")[0])%60;return i(r)+":"+i(a)+":"+i(o)+":"+i(t%s)},W.prototype.toSeconds=function(e){if(!e)return Math.floor(this.video.currentTime);var t=e.split(":");return 60*Number(t[0])*60+60*Number(t[1])+Number(t[2])},W.prototype.toMilliseconds=function(e){var t=Number(e?e.split(":")[3]:this.toSMPTE().split(":")[3]),s=1e3/this.frameRate*(isNaN(t)?0:t);return Math.floor(1e3*this.toSeconds(e)+s)},W.prototype.toFrames=function(e){var t=e?e.split(":"):this.toSMPTE().split(":"),s=this.frameRate,i=60*Number(t[0])*60*s,n=60*Number(t[1])*s,r=Number(t[2])*s,a=Number(t[3]);return Math.floor(i+n+r+a)},W.prototype.__seek=function(e,t){this.video.paused||this.video.pause();var s=Number(this.get());this.video.currentTime=("backward"===e?s-t:s+t)/this.frameRate+1e-5},W.prototype.seekForward=function(e,t){return e||(e=1),this.__seek("forward",Number(e)),!t||t()},W.prototype.seekBackward=function(e,t){return e||(e=1),this.__seek("backward",Number(e)),!t||t()},W.prototype.seekTo=function(e){var t,s,i=e||{},n=Object.keys(i)[0];if("SMPTE"==n||"time"==n)return s=i[n],t=this.toMilliseconds(s)/1e3+.001,void(this.video.currentTime=t);switch(n){case"frame":s=this.toSMPTE(i[n]),t=this.toMilliseconds(s)/1e3+.001;break;case"seconds":t=Number(i[n]);break;case"milliseconds":t=Number(i[n])/1e3+.001}isNaN(t)||(this.video.currentTime=t)};const K=W;class X extends HTMLElement{static hasInstalledPolyfills=!1;constructor(){super(),X.hasInstalledPolyfills||(n().polyfill.installAll(),X.hasInstalledPolyfills=!0),this.config=null,this.env=new L,this.eventMgr_=new N,this.constants=this.constantDefaults(),this.dlf={handlers:{onDomContentLoaded:this.onDomContentLoaded.bind(this),onPlayerErrorEvent:this.onPlayerErrorEvent.bind(this),onTrackChange:this.onTrackChange.bind(this),onTick:this.onTick.bind(this),onPlay:this.onPlay.bind(this)}},this.video=r("video",{id:this.env.mkid(),className:"dlf-media"}),this.videoPausedOn=null,this.currentSource=null,this.timeRange=null,this.player=new(n().Player),this.player.attach(this.video),this.fps=null,this.variantGroups=null,this.chapters_=new B([]),this.currentChapter=null,this.markers_=new F,this.frontend=new z(this.env,this.eventMgr_,this.player,this.video),this.playerView=null,this.autoplay_=!1,this.mode="auto",this.hasBeenConnected_=!1,this.__dlfRegisterEvents(),this.actions=this.getActions()}getEnv(){return this.env}getMarkers(){return this.markers_}connectedCallback(){if(this.hasBeenConnected_)return;this.hasBeenConnected_=!0;const e=this.getConfig();this.env.setLang(e.lang);const t=this.getAttribute("autoplay");this.autoplay_=null!==t&&"false"!==t,this.timeRange=this.getTimeRange(),null!==this.timeRange&&this.markers_.add({id:"dlf.segment_shared",startTime:this.timeRange.startTime,endTime:this.timeRange.endTime??void 0,labelText:this.env.t("share.shared_timecode"),editable:!1});const s=this.getAttribute("player-view");null!==s&&(this.playerView=document.getElementById(s)),this.configureFrontend(e),setTimeout(()=>{this.loadSources(),this.parseChapters()}),this.appendChild(this.frontend.domElement),this.frontend.domElement.className+=` ${this.className}`}destroy(){this.eventMgr_.removeAll(),this.player.destroy(),this.frontend.destroy(),this.remove()}configureFrontend(e){const t=Array.from(this.querySelectorAll("dlf-media-controls *")).filter(e=>e instanceof HTMLElement),s=this.getAttribute("mode");let i;if("auto"===s){const e=this.getAttribute("mode-fallback");D(e)&&(i=e),this.mode=s}else D(s)&&(this.mode=i=s);this.frontend.updatePlayerProperties({locale:e.lang.twoLetterIsoCode,mode:i,controlElements:t,actions:this.actions,playerView:this.playerView});const n=this.getAttribute("poster");null!==n&&this.frontend.updateMediaProperties({poster:n})}getConfig(){let e=this.config;if(null===e){const t=this.getAttribute("config");e=t?window[t]:{lang:{locale:"en_US.UTF8",twoLetterIsoCode:"en",phrases:{}}},this.config=e}return e}constantDefaults(){return{prevChapterTolerance:5,volumeStep:.05,seekStep:5,trickPlayFactor:4,forceLandscapeOnFullscreen:!0}}getActions(){return{"fullscreen.toggle":O({isAvailable:()=>Boolean(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled),execute:()=>{this.frontend.seekBar?.endSeek(),this.toggleFullScreen()}}),"playback.toggle":O(()=>{this.video.paused?this.video.play():this.video.pause()}),"playback.volume.mute.toggle":O(()=>{this.video.muted=!this.video.muted}),"playback.volume.inc":O(()=>{this.volume=this.volume+this.constants.volumeStep}),"playback.volume.dec":O(()=>{this.volume=this.volume-this.constants.volumeStep}),"playback.captions.toggle":O({isAvailable:()=>this.player.getTextTracks().length>0,execute:()=>{this.showCaptions=!this.showCaptions}}),"navigate.rewind":O(()=>{this.skipSeconds(-this.constants.seekStep)}),"navigate.seek":O(()=>{this.skipSeconds(+this.constants.seekStep)}),"navigate.continuous-rewind":O(()=>{this.ensureTrickPlay(-this.constants.trickPlayFactor)}),"navigate.continuous-seek":O(()=>{this.ensureTrickPlay(this.constants.trickPlayFactor)}),"navigate.chapter.prev":O(()=>{this.prevChapter()}),"navigate.chapter.next":O(()=>{this.nextChapter()}),"navigate.frame.prev":O({isAvailable:()=>null!==this.fps,execute:()=>{this.fps?.vifa.seekBackward(1),this.frontend.afterManualSeek()}}),"navigate.frame.next":O({isAvailable:()=>null!==this.fps,execute:()=>{this.fps?.vifa.seekForward(1),this.frontend.afterManualSeek()}}),"navigate.position.percental":O((e,t)=>{if(void 0!==e&&void 0!==t&&0<=t&&t<e.keys.length){const s=t/e.keys.length*this.video.duration;this.seekTo(s)}}),"navigate.thumbnails.snap":O({isAvailable:()=>null!==this.variantGroups&&this.variantGroups.findThumbnailTracks().length>0,execute:(e,t,s)=>{this.frontend.seekBar?.setThumbnailSnap("down"===s)}}),"sound_tools.mode.audio":O({execute:()=>{this.ui.updatePlayerProperties({mode:"audio"})}}),"sound_tools.mode.video":O({isAvailable:()=>!this.player.isAudioOnly(),execute:()=>{this.ui.updatePlayerProperties({mode:"video"})}}),"sound_tools.segments.add":O({execute:()=>{this.markers_.add({startTime:this.displayTime})}}),"sound_tools.segments.close":O({execute:()=>{const e=this.markers_.activeSegment,t=this.displayTime;null!==e&&e.startTime<t&&this.markers_.update({id:e.id,endTime:t})}})}}addActions(e){Object.assign(this.actions,e)}getTimeRange(){return this.parseTimeRange(this.getAttribute("start"),this.getAttribute("end"))}parseTimeRange(e,t){if(!e)return null;const s=parseFloat(e);if(!(s>=0))return null;let i=t?parseFloat(t):null;return null===i||i>=s||(i=null),{startTime:s,endTime:i}}__dlfRegisterEvents(){this.eventMgr_.record(()=>{window.addEventListener("DOMContentLoaded",this.dlf.handlers.onDomContentLoaded),this.player.addEventListener("error",this.dlf.handlers.onPlayerErrorEvent),this.player.addEventListener("adaptation",this.dlf.handlers.onTrackChange),this.player.addEventListener("variantchanged",this.dlf.handlers.onTrackChange),this.video.addEventListener("play",this.dlf.handlers.onPlay)}),this.tickInterval=setInterval(this.dlf.handlers.onTick,50),this.registerGestures()}registerGestures(){const e=this.frontend.gestures;null!==e&&(e.on("gesture",e=>{switch(e.type){case"tapup":"mouse"===e.event.pointerType?(e.tapCount<=2&&this.actions["playback.toggle"].execute(),2===e.tapCount&&this.actions["fullscreen.toggle"].execute()):e.tapCount>=2&&(e.position.x<1/3?this.actions["navigate.rewind"].execute():e.position.x>2/3?this.actions["navigate.seek"].execute():2!==e.tapCount||this.env.isInFullScreen()||this.actions["fullscreen.toggle"].execute());break;case"hold":1===e.tapCount?this.frontend.seekBar?.thumbnailPreview?.beginChange(e.event.clientX):e.tapCount>=2&&(e.position.x<1/3?this.actions["navigate.continuous-rewind"].execute():e.position.x>2/3&&this.actions["navigate.continuous-seek"].execute());break;case"swipe":"east"===e.direction?this.actions["navigate.rewind"].execute():"west"===e.direction&&this.actions["navigate.seek"].execute()}}),e.on("release",()=>{this.frontend.seekBar?.endSeek(),this.cancelTrickPlay()}))}get ui(){return this.frontend}supportsMimeType(e){switch(e){case"application/dash+xml":case"application/x-mpegurl":case"application/vnd.apple.mpegurl":return this.env.supportsMediaSource()||this.env.supportsVideoMime(e);default:return this.env.supportsVideoMime(e)}}loadSources(){const e=[];this.querySelectorAll("source").forEach(t=>{const s=t.getAttribute("src"),i=t.getAttribute("type");if(!s||!i)return void console.warn("Ignoring <source> that does not specify URL or MIME type");let n=null;const r=t.getAttribute("data-fps");if(null!==r){const e=parseFloat(r);e>0&&(n=e)}const a=t.getAttribute("data-fileid");e.push({url:s,mimeType:i,frameRate:n,fileId:a})}),this.loadOneOf(e)}async loadOneOf(e){if(0===e.length)return this.frontend.updatePlayerProperties({error:"error.no-media-source"}),!1;let t=!1;for(const s of e)if(this.supportsMimeType(s.mimeType))try{return await this.loadManifest(s),this.frontend.updatePlayerProperties({error:null,mode:"auto"===this.mode?this.player.isAudioOnly()?"audio":"video":void 0}),this.loaded(),!0}catch(e){console.error(e)}else t=!0;return this.frontend.updatePlayerProperties({error:t?"error.playback-not-supported":"error.load-failed"}),!1}async loadManifest(e){const t=this.timeRange?.startTime??null;await this.player.load(e.url,t,e.mimeType),this.currentSource=e,this.variantGroups=new H(this.player),this.variantGroups.selectGroupWithPrimary()||this.variantGroups.selectGroupByRole("main")||this.variantGroups.selectGroupByIndex(0),this.frontend.updateMediaProperties({variantGroups:this.variantGroups,chapters:this.chaptersInFile}),this.updateFrameRate()}onDomContentLoaded(){}onTick(){const e=this.chaptersInFile.timeToChapter(this.video.currentTime)??null;if(e!==this.currentChapter){const t=this.currentChapter;this.currentChapter=e;const s=new CustomEvent("chapterchange",{detail:{curChapter:e,prevChapter:t}});this.dispatchEvent(s)}}onTrackChange(){this.updateFrameRate()}updateFrameRate(){const e=this.variantGroups?.findActiveTrack()?.frameRate??this.currentSource?.frameRate??null;null===e?this.fps=null:null!==this.fps&&e===this.fps.rate||(this.fps={rate:e,vifa:new K({id:this.video.id,frameRate:e})}),this.frontend.updateMediaProperties({fps:this.fps})}onPlay(){this.videoPausedOn=null}async toggleFullScreen(){this.env.toggleFullScreen(this.playerView??this.ui.domElement,this.constants.forceLandscapeOnFullscreen)}parseChapters(){const e=[];this.querySelectorAll("dlf-chapter").forEach(t=>{const s=t.getAttribute("title"),i=Number(t.getAttribute("timecode"));if(!(s&&i>=0))return void console.warn("Ignoring invalid <dlf-chapter>");let n=[];const r=t.getAttribute("fileids");null!==r&&(n=r.split(","));let a=null;const o=t.getAttribute("pageNo");null!==o&&(a=parseInt(o,10)),e.push({title:s,timecode:i,fileIds:n,pageNo:a})}),this.setChapters(new B(e))}get chapters(){return this.chapters_}get chaptersInFile(){return this.chapters_.filter(e=>this.isChapterInFile(e))}isChapterInFile(e){return null===this.currentSource||null===this.currentSource.fileId||e.fileIds.includes(this.currentSource.fileId)}setChapters(e){this.chapters_=e,this.frontend.updateMediaProperties({chapters:this.chaptersInFile})}loaded(){this.autoplay_&&this.video.play()}get hasVideo(){return null!==this.currentSource}getCurrentChapter(){return this.timeToChapter(this.video.currentTime)}timeToChapter(e){return this.chaptersInFile.timeToChapter(e)}get media(){return this.video}get hasCurrentData(){return this.video.readyState>=2}get showCaptions(){return this.player.isTextTrackVisible()}set showCaptions(e){this.player.setTextTrackVisibility(e)}isAudioOnly(){return this.player.isAudioOnly()}get volume(){return this.video.volume}set volume(e){this.video.volume=a(e,[0,1])}get displayTime(){return this.frontend.seekBar?.getValue()??this.video.currentTime}pauseOn(e){null!==this.videoPausedOn||this.video.paused||(this.videoPausedOn=e,this.video.pause())}resumeOn(e){this.videoPausedOn===e&&this.video.play()}getFps(){return this.fps?.rate??null}seekTo(e){return"number"==typeof e?(this.seekToTime(e),!0):"number"==typeof e.timecode&&this.seekToChapter(e)}seekToTime(e){this.video.currentTime=e,this.frontend.afterManualSeek()}seekToChapter(e){return!!this.isChapterInFile(e)&&(this.seekToTime(e.timecode),!0)}skipSeconds(e){this.seekTo(this.video.currentTime+e)}prevChapter(){const e=this.constants.prevChapterTolerance,t=this.timeToChapter(this.video.currentTime-e);this.seekTo(t??0)}nextChapter(){const e=this.getCurrentChapter();if(e){const t=this.chaptersInFile.advance(e,1);t&&this.seekTo(t)}}ensureTrickPlay(e){this.player.getPlaybackRate()!==e&&this.player.trickPlay(e)}cancelTrickPlay(){try{return this.player.cancelTrickPlay(),!0}catch(e){return!1}}onPlayerErrorEvent(e){if(e instanceof CustomEvent){const t=e.detail;console.error("Error from Shaka player",t.code,t)}}}customElements.define("dlf-media",X);class Y extends HTMLElement{constructor(){super(),this.env=new L,this.player=null,this.hasAttached=!1}get forPlayer(){return this.getAttribute("forPlayer")}set forPlayer(e){null===e?this.removeAttribute("forPlayer"):this.setAttribute("forPlayer",e)}connectedCallback(){this.isConnected&&(this.hasAttached||(setTimeout(()=>{const e=this.forPlayer;if(null===e)return;const t=document.getElementById(e);t instanceof X&&(this.env=t.getEnv(),this.player=t,this.attachToPlayer(t))}),this.hasAttached=!0))}attachToPlayer(e){}}var Q=s(8228),Z=s(317);customElements.define("dlf-waveform",class extends Y{static get observedAttributes(){return["hidden"]}constructor(){super();const e=this.attachShadow({mode:"open"});this.$style=r("style",{},["\n .container {\n position: relative;\n display: block;\n height: 100px;\n }\n\n .wave-overview {\n position: absolute;\n bottom: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(255, 255, 255, 0.3);\n }\n "]),this.$container=r("div",{className:"container"},[this.$waveOverview=r("div",{className:"wave-overview"})]),e.append(this.$style,this.$container),this.nextUrl=null,this.peaks_=null,this.waveformdata=null,this.minSamplesPerPixel=0,this.maxSamplesPerPixel=Number.POSITIVE_INFINITY,this.samplesPerPixel=0,this.zoomview=null,this.handlers={onWheel:this.onWheel.bind(this),onResize:this.onResize.bind(this)},this.peaksHandlers={"points.dragend":e=>{null!==this.player&&void 0!==e.point.id&&this.player.getMarkers().update({id:e.point.id,startTime:e.point.time,labelText:e.point.labelText,color:e.point.color},!0)},"segments.dragend":e=>{null!==this.player&&void 0!==e.segment.id&&this.player.getMarkers().update({id:e.segment.id,startTime:e.segment.startTime,endTime:e.segment.endTime,labelText:e.segment.labelText,color:"string"==typeof e.segment.color?e.segment.color:void 0},!0)}},this.markersHandlers={remove:e=>{for(const t of e.detail.segments)null!==this.peaks_&&(void 0===t.endTime?this.peaks_.points.removeById(t.id):this.peaks_.segments.removeById(t.id))},remove_all:()=>{null!==this.peaks_&&(this.peaks_.points.removeAll(),this.peaks_.segments.removeAll())},add:e=>{this.peaksAddSegments(e.detail.segments)},update:e=>{const{segment:t,prevSegment:s}=e.detail;null!==this.peaks_&&(void 0===s.endTime&&void 0!==t.endTime?(this.peaks_.points.removeById(t.id),this.peaks_.segments.add({id:t.id,startTime:t.startTime,endTime:t.endTime,labelText:t.labelText,color:t.color,editable:t.editable})):void 0===t.endTime?this.peaks_.points.getPoint(t.id)?.update({time:t.startTime,editable:t.editable,labelText:t.labelText}):this.peaks_.segments.getSegment(t.id)?.update({startTime:t.startTime,endTime:t.endTime,editable:t.editable,labelText:t.labelText}))}},this.registerEventHandlers()}attributeChangedCallback(e,t,s){"hidden"===e&&(this.hidden||this.tryInitPeaks())}registerEventHandlers(){this.$waveOverview.addEventListener("wheel",this.handlers.onWheel),"ResizeObserver"in globalThis?new ResizeObserver(this.handlers.onResize).observe(this.$container):window.addEventListener("resize",this.handlers.onResize)}async attachToPlayer(e){const t=this.getAttribute("src"),s=this.getAttribute("type");t&&"application/vnd.kitodo.audiowaveform"===s&&(e.addActions({"sound_tools.waveform.toggle":O({execute:()=>{this.hidden=!this.hidden}})}),this.adaptPeaksMarkers(),e.ui instanceof z&&e.ui.alwaysPrependBottomControl(this),e.media.addEventListener("loadedmetadata",e=>{this.updateZoom(this.maxSamplesPerPixel)}),this.load(t))}async load(e){this.nextUrl=e;const t=await fetch(e),s=await t.arrayBuffer();e===this.nextUrl&&(this.waveformdata=Z.A.create(s),this.updateZoom(this.maxSamplesPerPixel),this.tryInitPeaks())}tryInitPeaks(){const e=this.waveformdata;if(null!==this.peaks_||this.hidden||null==this.player?.media||null===e)return;const t={logger:(...e)=>{console.log(...e)},mediaElement:this.player.media,zoomview:{container:this.$waveOverview},waveformData:{arraybuffer:e.toArrayBuffer()},waveformCache:!0};Q.A.init(t,(t,s)=>{s?(s.player.seek=e=>{this.player?.seekTo(e)},this.peaks_=s,this.zoomview=s.views.getView("zoomview"),this.zoomview?.setZoom({seconds:e.duration}),this.zoomview?.setWheelMode("scroll"),this.adaptPeaksMarkers()):console.log(t)})}adaptPeaksMarkers(){if(null!==this.peaks_&&null!==this.player){this.peaksAddSegments(this.player.getMarkers().getSegments());for(const[e,t]of Object.entries(this.peaksHandlers))this.peaks_.on(e,t);for(const[e,t]of Object.entries(this.markersHandlers))this.player.getMarkers().addEventListener(e,t)}}peaksAddSegments(e){if(null!==this.peaks_)for(const t of e)void 0===t.endTime?this.peaks_.points.add({id:t.id,time:t.startTime,labelText:t.labelText,color:t.color,editable:t.editable}):this.peaks_.segments.add({id:t.id,startTime:t.startTime,endTime:t.endTime,labelText:t.labelText,color:t.color,editable:t.editable})}onWheel(e){const t=1.5**(-e.deltaY/100);this.updateZoom(this.samplesPerPixel/t)}onResize(){this.zoomview?.fitToContainer(),this.updateZoom()}updateZoom(e=this.samplesPerPixel){if(null===this.waveformdata)return;const{sample_rate:t,seconds_per_pixel:s,duration:i}=this.waveformdata;this.minSamplesPerPixel=s*t,this.maxSamplesPerPixel=a(i*t/this.$waveOverview.offsetWidth,[this.minSamplesPerPixel,Number.POSITIVE_INFINITY]),this.samplesPerPixel=a(e,[this.minSamplesPerPixel,this.maxSamplesPerPixel]),null!==this.zoomview&&this.zoomview.setZoom({scale:this.samplesPerPixel})}}),window.DlfMediaPlayer=X;var J=s(7583);const ee=jQuery;var te=s.n(ee);class se extends(U()){constructor(e){super(),this.state=e,this.pendingStateUpdates=[],this.renderTimeout=null,this.renderPromise=Promise.resolve()}setState(e={}){const t="function"==typeof e?e:()=>e;this.pendingStateUpdates.push(t),this.renderTimeout||(this.renderPromise=new Promise(e=>{this.renderTimeout=setTimeout(()=>{const t=this.squashStateUpdates();this.render(t),this.state=t,this.renderTimeout=null,this.renderPromise=Promise.resolve(),this.emit("updated",t),e()})}))}update(){return this.renderPromise}squashStateUpdates(){const e=Object.assign({},this.state);for(const t of this.pendingStateUpdates)Object.assign(e,t(e));return this.pendingStateUpdates=[],e}render(e){}}class ie extends se{constructor(e,t){super({show:!1,...t}),this.parent=e,this.isAnimating=!1,this.$main=r("div",{className:"sxnd-modal"},[this.$headline=r("div",{className:"headline-container"},[this.$title=r("h3"),this.$close=r("span",{className:"modal-close material-icons-round",$click:this.close.bind(this)},["close"])]),this.$body=r("div",{className:"body-container"})]),this.parent.append(this.$main),this.jqMain=te()(this.$main),this.resize()}resize(){this.$body.style.maxHeight=`calc(${this.parent.clientHeight}px - 11rem)`}get isOpen(){return this.state.show}open(e=!0){this.isAnimating||this.setState({show:e})}close(){this.open(!1)}toggle(){this.open(!this.state.show)}render(e){const{show:t}=e;if(t!==this.state.show){this.isAnimating=!0;const e=t?"show":"hide";this.jqMain[e]({duration:"fast",complete:()=>{this.isAnimating=!1}})}}}function ne(e,t){return l(e,Object.fromEntries(Object.entries(t).map(([e,t])=>[e,t[0]??""])))}function re(e,t,s,i){const n=e.generateUrl(s),r={...t,host:[`${location.protocol}//${location.host}`],url:[n.toString()]};let a=0;"number"==typeof s?a=s:null!==s&&(a=s.startTime);const o=w(a,i);for(const[e,t]of Object.entries(o))r[e]=[t];return r}class ae{constructor(e){this.env=e}generateUrl(e){return"number"==typeof e?this.generateTimecodeUrl(e):this.generateTimerangeUrl(e)}generateTimerangeUrl(e){let t=[];null!==e&&(null!==e.endTime&&e.endTime>e.startTime&&t.unshift(e.endTime),(e.startTime>0||t.length>0)&&t.unshift(e.startTime));const s=this.env.getLocation();return t.length>0?s.searchParams.set("timecode",t.map(e=>e.toString()).join(",")):s.searchParams.delete("timecode"),s}generateTimecodeUrl(e){const t=null===e?null:{startTime:e,endTime:null};return this.generateTimerangeUrl(t)}}const oe=["current-time","marker","begin"];class le extends ie{constructor(e,t,s){super(e,{metadata:{},timing:{currentTime:0,markerRange:null},fps:0,startAtMode:"current-time",showQrCode:!1,showMastodonShare:!1}),this.lastRenderedUrl=null,this.handlers={handleClickShareButton:this.handleClickShareButton.bind(this),handleChangeStartAt:this.handleChangeStartAt.bind(this)},this.env=t,this.gen=new ae(this.env),this.$main.classList.add("bookmark-modal"),this.$title.innerText=this.env.t("modal.bookmark.title");const i=this.env.mkid(),n=(s.shareButtons??[]).map(e=>function(e,t,s){let i;switch(t.type){case"material":i=r("i",{className:"dlf-share-button material-icons-round"},[t.icon]);break;case"image":i=r("img",{className:"dlf-share-button dlf-share-button-image",src:t.src})}const n=r("a",{title:e.t(t.titleTranslationKey??"",{},()=>""),target:"_blank",rel:"noopener noreferrer",$click:s.onClick},[i]);return{hrefTemplate:t.hrefTemplate,setFullUrl:e=>{n.href=l(t.hrefTemplate,e)},element:n}}(this.env,e,{onClick:this.handlers.handleClickShareButton}));this.shareButtons=v(n),this.$startAtVariants={begin:this.makeStartAtVariant(i,"begin"),"current-time":this.makeStartAtVariant(i,"current-time"),marker:this.makeStartAtVariant(i,"marker")},this.$body.append(r("div",{},[this.shareButtons.length>0&&r("div",{className:"share-buttons"},this.shareButtons.map(e=>e.element)),this.$urlLine=r("div",{className:"url-line dlf-visible"},[this.$urlInput=r("input",{type:"url",readOnly:!0,value:location.href}),this.$copyLinkBtn=r("a",{href:"javascript:void(0)",target:"_blank",className:"copy-to-clipboard",title:this.env.t("modal.bookmark.copy-link"),$click:this.handleCopyToClipboard.bind(this)},[r("i",{className:"material-icons-round"},["content_copy"])])]),this.$mastodonShareDialog=r("div",{id:"mastodon-share",className:"mastodon-share-container"},[this.$headline=r("div",{className:"headline-container"},[this.$title=r("h4",{},[this.env.t("share.mastodon.title")]),this.$close=r("span",{className:"modal-close material-icons-round",$click:()=>{this.setState({showMastodonShare:!1})}},["close"])]),r("form",{method:"post",className:"mastodon-form",$submit:this.submitInstance.bind(this)},[this.$mastodonInstanceInput=r("input",{type:"text",name:"mastodon-instance",id:"instance",className:"mastodon-share-input",placeholder:this.env.t("share.mastodon.placeholder"),autocomplete:"url",required:!0,autocapitalize:"none",spellcheck:!1}),r("button",{type:"submit",id:"mastodon-share-button",className:"mastodon-share-button"},[this.env.t("share.mastodon.label")])])]),this.$startAt=r("div",{className:"start-at"},oe.map(e=>this.$startAtVariants[e].$container)),this.$qrCanvasContainer=r("div",{className:"url-qrcode"},[r("hr"),this.$qrCanvas=r("canvas")])]))}makeStartAtVariant(e,t){const s=this.env.mkid(),i=r("input",{type:"radio",name:e,value:t,id:s,$change:this.handlers.handleChangeStartAt}),n=r("label",{htmlFor:s},[this.translateStartAtLabel(t,{currentTime:0,markerRange:null},null)]);return{id:s,$radio:i,$label:n,$container:r("div",{className:`start-at-${t}`},[i,n])}}handleClickShareButton(e){const t=e.currentTarget;"dlf:qr_code"===t.href&&(e.preventDefault(),this.setState({showQrCode:!0})),"dlf:mastodon_share"===t.href&&(e.preventDefault(),this.setState({showMastodonShare:!0}))}async handleCopyToClipboard(e){e.preventDefault();const t=this.generateUrl(this.state);this.$urlInput.focus(),navigator.clipboard?navigator.clipboard.writeText(t):document.execCommand("copy")}handleChangeStartAt(e){e.target instanceof HTMLInputElement&&this.setState({startAtMode:e.target.value})}generateUrl(e){const t=this.getActiveTimeRange(e);return this.gen.generateTimerangeUrl(t).toString()}getActiveTimeRange(e){switch(this.getStartAtMode(e)){case"begin":return null;case"current-time":return{startTime:e.timing.currentTime,endTime:null};case"marker":return e.timing.markerRange}}open(e=!0){super.open(e),e||this.setState({showQrCode:!1,showMastodonShare:!1})}render(e){super.render(e);const{show:t,metadata:s,timing:i,fps:n,showQrCode:r,showMastodonShare:a}=e,o=this.getStartAtMode(e),l=this.getActiveTimeRange(e),h=re(this.gen,s,l,n),d=h.url?.[0]??"",c=d!==this.lastRenderedUrl;if(c){const e={};for(const[t,s]of Object.entries(h))e[t]=encodeURIComponent(s[0]??"");for(const t of this.shareButtons)t.setFullUrl(e);this.$urlInput.value=d,this.$copyLinkBtn.href=d,this.lastRenderedUrl=d}(c||r!==this.state.showQrCode)&&this.renderQrCode(r?d:null),a!==this.state.showMastodonShare&&this.renderMastodonShare(a),this.$startAtVariants[o].$radio.checked=!0;let u=0;for(const t of oe){this.$startAtVariants[t].$label.innerText=this.translateStartAtLabel(t,i,n);const s=this.isStartAtModeAllowed(t,e);g(this.$startAtVariants[t].$container,"shown",s),s&&u++}g(this.$startAtVariants.begin.$container,"shown",u>1),t&&t!==this.state.show&&this.$urlInput.select()}translateStartAtLabel(e,t,s){const i={currentTime:T(t.currentTime,!0,s),markerStart:"?",markerEnd:"_"};return null!==t.markerRange&&(i.markerStart=T(t.markerRange.startTime,!0,s),null!==t.markerRange.endTime&&(i.markerEnd=T(t.markerRange.endTime,!0,s))),this.env.t(`modal.bookmark.start-at-${e}`,i)}getStartAtMode(e){return this.isStartAtModeAllowed(e.startAtMode,e)?e.startAtMode:"begin"}isStartAtModeAllowed(e,t){switch(e){case"begin":return!0;case"current-time":return 0!==t.timing.currentTime;case"marker":return null!==t.timing.markerRange}}async renderQrCode(e){if(null!==e)try{await J.toCanvas(this.$qrCanvas,e),this.$qrCanvasContainer.classList.add("dlf-visible")}catch(e){alert(this.env.t("error.qrcode")),console.error(e)}else this.$qrCanvasContainer.classList.remove("dlf-visible")}renderMastodonShare(e){this.$urlLine.classList.toggle("dlf-visible",!e),this.$urlLine.classList.toggle("dlf-fade-in",!e),this.$urlLine.classList.toggle("dlf-fade-out",e),this.$mastodonShareDialog.classList.toggle("dlf-visible",e),this.$mastodonShareDialog.classList.toggle("dlf-fade-in",e),this.$mastodonShareDialog.classList.toggle("dlf-fade-out",!e)}openShareUrl(e,t,s){if(this.isValidUrl(e))if(null!==t)try{const i=new URL("/share",e),n=new URLSearchParams;n.set("text",s+"\n\n"),n.set("url",t),i.search=n.toString(),window.open(i.toString(),"_blank")}catch(e){return alert(this.env.t("error.mastodon.open_link")),void console.error(e)}else alert(this.env.t("error.mastodon.invalid_link"));else alert(this.env.t("error.mastodon.invalid_server"))}submitInstance(e){e.preventDefault();let t=this.$mastodonInstanceInput.value.trim();if(!t)return void alert(this.env.t("error.mastodon.enter_url"));t=t.replace(/[^a-zA-Z0-9-:.\/]/g,"");let s=t.replace(/^http:\/\//i,"https://");s.startsWith("https://")||(s=`https://${s}`);const i=document.title.trim();this.openShareUrl(s,this.lastRenderedUrl,i)}isValidUrl(e){try{return new URL(e),!0}catch(e){return!1}}}const he={None:0,Ctrl:1,Shift:2,Alt:4,Meta:8};function de(e,t,s){let i=s;return 1===t.length&&(i&=~he.Shift,"mac"===e.getKeyboardVariant()&&(i&=~he.Alt)),i}function ce(e,t,s){" "===t&&(t="Space");const i=s?".mod":"";return e.t(`key.${t}${i}`,{},()=>e.t(`key.${t}`,{},()=>e.t(`key.generic${i}`,{key:t.toUpperCase()},()=>e.t("key.generic",{key:t.toUpperCase()}))))}function ue(e,t){const s=function(e){const t=[];let s=null;for(const i of e)null===s?s={begin:i,end:i}:i.charCodeAt(0)===s.end.charCodeAt(0)+1?s.end=i:(t.push(s),s={begin:i,end:i});return null!==s&&t.push(s),t}(t.keys),i=[],n=[];void 0!==t.mod&&n.push(t.mod),"Shift"!==t.mod&&t.keys.every(e=>/^[A-Z]$/.test(e))&&n.push("Shift");const a=n.length>0||s.length>1,o=e.t("key.unto"+(a?".mod":""));for(const t of s){const s=r("kbd",{},[ce(e,t.begin,a)]);if(t.begin===t.end)i.push(s);else{const n=r("kbd",{},[ce(e,t.end,a)]);i.push(r("span",{className:"kb-range"},[s,o,n]))}}let l=[];if(n.length>0){const t=e.getKeyboardVariant();for(const s of n){const i=r("kbd",{},[e.t(`key.mod.${t}.${s}`)]);l.push(i," + ")}l.push(...f(i,"/"))}else l=f(i," / ");return t.repeat&&(l=f(e.t("key.repeat",{key:"###"}).split("###"),l)),r("span",{},l)}class pe extends ie{constructor(e,t,s){super(e,{}),this.env=t,this.config=s,this.tableSections=[],this.createBodyDom(),this.updateRowVisibility()}open(e=!0){e&&this.updateRowVisibility(),super.open(e)}createBodyDom(){const e=this.env;this.$main.classList.add("help-modal"),this.$title.innerText=e.t("modal.help.title");const t=r("table",{className:"keybindings-table"}),s=function(e,t){const s=e.getKeyboardVariant(),i={navigate:{},player:{},sound_tools:{},other:{}},n=t.slice();n.sort((e,t)=>e.order-t.order);for(const e of n){if(null!=e.keyboard&&e.keyboard!==s)continue;let t=i[e.kind];t||(t=i[e.kind]={});let n=t[e.action];n||(n=t[e.action]=[]),n.push(e)}return i}(e,this.config.keybindings);for(const[i,n]of Object.entries(s)){const s=[...Object.entries(n)];if(0===s.length)continue;const a={thead:r("thead",{},[r("th",{className:"kb-group",colSpan:2},[e.t(`action.kind.${i}`)])]),tbody:r("tbody",{}),rows:[]};for(const[e,t]of s){const s=r("tr",{},[r("td",{className:"key"},this.listKeybindings(t)),r("td",{className:"action"},[this.describeAction(e)])]);a.rows.push({action:e,tr:s}),a.tbody.append(s)}t.append(a.thead,a.tbody),this.tableSections.push(a)}this.$body.append(t)}listKeybindings(e){return f(e.map(e=>ue(this.env,e)),r("br"))}describeAction(e){return this.env.t(`action.${e}`,this.config.constants)}updateRowVisibility(){for(const e of this.tableSections){let t=!1;for(const s of e.rows){const e=this.config.actionIsAvailable(s.action);s.tr.setAttribute("aria-disabled",e?"false":"true");const i=e?"":this.env.t("action.unavailable");s.tr.setAttribute("title",i),s.tr.setAttribute("aria-label",i),t||=e}e.thead.setAttribute("aria-disabled",t?"false":"true"),e.tbody.setAttribute("aria-disabled",t?"false":"true")}}}var me=s(3318),fe=s.n(me);class ge{constructor(e){this.jpeg=e,this.exif=fe().load(e)}static fromBinaryString(e){return new ge(e)}toBinaryString(){const e=fe().dump(this.exif);return fe().insert(e,this.jpeg)}addMetadata(e){e.title&&(this.exif["0th"][fe().ImageIFD.ImageDescription]=e.title),e.comment&&(this.exif.Exif[fe().ExifIFD.UserComment]=e.comment)}getMetadata(){return{title:this.exif["0th"][fe().ImageIFD.ImageDescription]??"",comment:this.exif.Exif[fe().ExifIFD.UserComment]??""}}}const ve=String.fromCharCode(137,80,78,71,13,10,26,10);function be(e,t){var s=new Array(t);for(let i=t-1;i>=0;i--)s[i]=String.fromCharCode(255&e),e>>=8;return s.join("")}function ye(e){let t=0;for(let s=0;s<e.length;s++)t<<=8,t|=255&e.charCodeAt(s);return t}class ke{constructor(e,t){this.headerChunk=e,this.chunks=t}static createChunk(e){const t={};switch(e.type){case"raw":t.type=e.rawType,t.data=e.rawData;break;case"iTXt":t.type="iTXt",t.data=`${e.keyword.replace(/\0/g,"")}\0\0\0\0\0${e.text}`;break;case"IEND":t.type="IEND",t.data=""}return t.size=t.data.length,t.crc=function(e){for(var t=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117],s=-1,i=0;i<e.length;i++)s=s>>>8^t[255&(s^e.charCodeAt(i))];return(-1^s)>>>0}(t.type+t.data),t}addChunk(e){const t=ke.createChunk(e);if("iTXt"!==t.type)throw new Error(`Adding chunk type ${t.type} is not supported.`);this.chunks.unshift(t)}static fromBinaryString(e){if(!function(e){return e.substr(0,8)===ve}(e.substr(0,8)))return;let t;e=e.substr(8);for(var s=[];""!==e;){var i={},n=ye(e.substr(0,4));n<0&&(n=0);var r=e.substr(0,n+12);e=e.substr(n+12),i.size=n,i.type=r.substr(4,4),i.data=r.substr(8,n),i.crc=ye(r.substr(8+n,4)),"IHDR"===i.type?t=i:"IEND"!==i.type&&s.push(i)}return void 0===t?void 0:new ke(t,s)}toBinaryString(){var e=ve;const t=t=>{var s="";s+=be(t.size,4),s+=t.type,s+=t.data,s+=be(t.crc,4),e+=s};t(this.headerChunk);for(const e of this.chunks)t(e);return t(ke.createChunk({type:"IEND"})),e}addMetadata(e){for(const[t,s]of Object.entries(e)){if(!s)continue;const e={title:"Title",comment:"Comment"}[t];e&&this.addChunk({type:"iTXt",keyword:e,text:s})}}}const we=[{mimeType:"image/png",extension:"png",label:"PNG",parseBinaryString:e=>ke.fromBinaryString(e)},{mimeType:"image/jpeg",extension:"jpg",label:"JPEG",parseBinaryString:e=>ge.fromBinaryString(e)},{mimeType:"image/tiff",extension:"tiff",label:"TIFF",parseBinaryString:()=>{}}];function Te(e,t){const s=Object.assign({},t);for(const[i,n]of Object.entries(t)){const t=e[i]??n;switch(typeof n){case"boolean":s[i]=!0===t||Boolean(Number(t));break;case"number":s[i]=Number(t);break;case"string":s[i]=String(t)}}return s}class Ce extends ie{constructor(e,t,s){const i=we.filter(e=>t.supportsCanvasExport(e.mimeType));super(e,{metadata:null,showMetadata:!0,fps:null,timecode:null,supportedImageFormats:i,selectedImageFormat:i[0]??null}),this.env=t,this.gen=new ae(t),this.videoDomElement=null,this.config=s,this.constants=Te(s.constants,{screenshotFilenameTemplate:"Screenshot",screenshotCommentTemplate:""});const n=this.config.keybindings.find(e=>"modal.screenshot.snap"===e.action);this.$main.classList.add("screenshot-modal"),this.$title.innerText=t.t("modal.screenshot.title");const a=t.mkid(),o=t.mkid();this.$body.append(r("div",{className:"screenshot-config"},[r("h4",{},[t.t("modal.screenshot.configuration")]),r("section",{className:"metadata-config"},[r("h1",{},[t.t("modal.screenshot.metadata")]),r("div",{className:"metadata-overlay"},[r("input",{type:"checkbox",id:a,checked:this.state.showMetadata,$change:this.handleChangeShowMetadata.bind(this)}),r("label",{htmlFor:a},[t.t("modal.screenshot.metadata-overlay")])])]),r("section",{},[r("h1",{},[t.t("modal.screenshot.file-format")]),r("div",{},this.state.supportedImageFormats.map(e=>{const s=t.mkid();return r("span",{className:"file-format-option"},[r("input",{id:s,name:o,type:"radio",checked:e.mimeType===this.state.selectedImageFormat?.mimeType,$change:()=>{this.setState({selectedImageFormat:e})}}),r("label",{htmlFor:s},[` ${e.label}`])])}))]),r("a",{href:"#",className:"download-link",$click:this.handleDownloadImage.bind(this)},[r("i",{className:"material-icons-round inline-icon"},["download"]),t.t("modal.screenshot.download-image")]),n&&r("aside",{className:"snap-tip"},[r("i",{className:"material-icons-round inline-icon"},["info_outline"]),r("span",{},f(t.t("modal.screenshot.snap-tip",{keybinding:"{kb}"}).split("{kb}"),ue(t,n)))])]),this.$canvas=r("canvas"))}setVideo(e){return this.videoDomElement=e,this}setMetadata(e){return this.setState({metadata:e}),this}setFps(e){return this.setState({fps:e}),this}setTimecode(e){return this.setState({timecode:e}),this}handleChangeShowMetadata(e){e.target instanceof HTMLInputElement&&this.setState({showMetadata:e.target.checked})}async handleDownloadImage(e){e.preventDefault(),await this.downloadCurrentImage(this.state)}renderCurrentScreenshot({showMetadata:e,metadata:t,timecode:s,fps:i}){if(null===this.videoDomElement)return!1;const n={captions:[],minWidth:1e3};if(e){const e=re(this.gen,t??{},s,i);n.captions=this.getCaptions(e)}return function(e,t,s){const[i,n]=e instanceof HTMLCanvasElement?[e,e.getContext("2d")]:[e.canvas,e];if(null===n)return!1;const r=Math.max(1,Math.ceil((s.minWidth??0)/t.videoWidth));i.width=t.videoWidth*r,i.height=t.videoHeight*r,n.drawImage(t,0,0,i.width,i.height);const a=i.height/1080,o=10*a;n.font=`${Math.floor(25*a)}px Arial`,n.fillStyle="#FFFFFF",n.shadowBlur=5,n.shadowColor="black";for(const e of s.captions??[]){const t="left"===e.h?o:i.width-o,s="top"===e.v?o:i.height-o;n.textAlign=e.h,n.fillText(e.text,t,s)}}(this.$canvas,this.videoDomElement,n),!0}async downloadCurrentImage(e){const{metadata:t,timecode:s,fps:i,selectedImageFormat:n}=e;if(null===t||null===s||null===n)return console.error("one of [metadata, timecode, selectedImageFormat] is null"),!1;const r=re(this.gen,t,s,i);return p(await this.makeImageBlob(this.$canvas,n,r),this.getFilename(r,n)),!0}async makeImageBlob(e,t,s){const i=await function(e,t){return new Promise((s,i)=>{e.toBlob(e=>{e?s(e):i()},t,undefined)})}(e,t.mimeType),n=await(r=i,d(r,"readAsBinaryString"));var r;const a=t.parseBinaryString(n);if(a){a.addMetadata({title:s.title?.[0]??"",comment:ne(this.constants.screenshotCommentTemplate,s)});const e=function(e){const t=new Uint8Array(e.length);for(let s=0;s<e.length;s++)t[s]=e.charCodeAt(s);return t}(a.toBinaryString());return new Blob([e],{type:i.type})}return i}getFilename(e,t){const s=ne(this.constants.screenshotFilenameTemplate,e),i=t.extension;return`${function(e){const t=e.replace(/[^a-zA-Z0-9()]+/g,"_");return t.length>0?t:"_"}(s)}.${i}`}getCaptions(e){return this.config.screnshotCaptions.map(t=>({...t,text:ne(t.text,e)}))}async snap(){await this.update();const e=this.state;this.renderCurrentScreenshot(e)&&await this.downloadCurrentImage(e)||alert(this.env.t("modal.screenshot.error"))}render(e){super.render(e),e.show&&(!this.state.show||e.showMetadata!==this.state.showMetadata)&&this.renderCurrentScreenshot(e)}}const Se=JSON.parse('[{"keys":["Escape"],"action":"cancel","kind":"other","order":100},{"keys":["?"],"repeat":false,"action":"modal.help.toggle","kind":"other","order":99},{"keys":["F1"],"repeat":false,"action":"modal.help.toggle","kind":"other","order":99},{"keys":["b"],"scope":"player","action":"modal.bookmark.open","kind":"other","order":30},{"keys":["s"],"scope":"player","action":"modal.screenshot.open","kind":"other","order":31},{"keys":["S"],"scope":"player","action":"modal.screenshot.snap","kind":"other","order":32},{"keys":["f"],"repeat":false,"scope":"player","action":"fullscreen.toggle","kind":"player","order":20},{"keys":["t"],"repeat":false,"scope":"player","action":"theater.toggle","kind":"player","order":21},{"keys":[" "],"repeat":false,"scope":"player","action":"playback.toggle","kind":"player","order":0},{"keys":["m"],"repeat":false,"scope":"player","action":"playback.volume.mute.toggle","kind":"player","order":12},{"keys":["ArrowUp"],"scope":"player","action":"playback.volume.inc","kind":"player","order":10},{"keys":["ArrowDown"],"scope":"player","action":"playback.volume.dec","kind":"player","order":11},{"keys":["c"],"repeat":false,"scope":"player","action":"playback.captions.toggle","kind":"player","order":13},{"keys":["ArrowLeft"],"repeat":false,"scope":"player","action":"navigate.rewind","kind":"navigate","order":0},{"keys":["ArrowRight"],"repeat":false,"scope":"player","action":"navigate.seek","kind":"navigate","order":1},{"keys":["ArrowLeft"],"repeat":true,"scope":"player","action":"navigate.continuous-rewind","kind":"navigate","order":2},{"keys":["ArrowRight"],"repeat":true,"scope":"player","action":"navigate.continuous-seek","kind":"navigate","order":3},{"keyboard":"ibm","mod":"Ctrl","keys":["ArrowLeft"],"scope":"player","action":"navigate.chapter.prev","kind":"navigate","order":10},{"keyboard":"mac","mod":"Alt","keys":["ArrowLeft"],"scope":"player","action":"navigate.chapter.prev","kind":"navigate","order":10},{"keyboard":"ibm","mod":"Ctrl","keys":["ArrowRight"],"scope":"player","action":"navigate.chapter.next","kind":"navigate","order":11},{"keyboard":"mac","mod":"Alt","keys":["ArrowRight"],"scope":"player","action":"navigate.chapter.next","kind":"navigate","order":11},{"keys":["0","1","2","3","4","5","6","7","8","9"],"scope":"player","action":"navigate.position.percental","kind":"navigate","order":25},{"mod":"Shift","keys":["ArrowLeft"],"scope":"player","action":"navigate.frame.prev","kind":"navigate","order":20},{"mod":"Shift","keys":["ArrowRight"],"scope":"player","action":"navigate.frame.next","kind":"navigate","order":21},{"keys":[","],"scope":"player","action":"navigate.frame.prev","kind":"navigate","order":20},{"keys":["."],"scope":"player","action":"navigate.frame.next","kind":"navigate","order":21},{"keys":["Shift"],"scope":"player","action":"navigate.thumbnails.snap","kind":"navigate","order":30,"keydown":true,"keyup":true},{"keys":["F2"],"repeat":false,"action":"sound_tools.mode.audio","kind":"sound_tools","order":0},{"keys":["F4"],"repeat":false,"action":"sound_tools.mode.video","kind":"sound_tools","order":1},{"keys":["<"],"scope":"player","action":"sound_tools.segments.add","kind":"sound_tools","order":2},{"keys":[">"],"scope":"player","action":"sound_tools.segments.close","kind":"sound_tools","order":3},{"keys":["w"],"repeat":false,"scope":"player","action":"sound_tools.waveform.toggle","kind":"sound_tools","order":4}]');class Pe extends X{constructor(){super(),this.metadata={},this.keybindings=Se,this.handlers={onKeyDown:this.onKeyDown.bind(this),onKeyUp:this.onKeyUp.bind(this),onClickChapterLink:this.onClickChapterLink.bind(this),onChapterChanged:this.onChapterChanged.bind(this),onCloseModal:this.onCloseModal.bind(this)},this.chapterLinks=[],this.pageSelect=null,this.modals=null,this.appConstants={}}getKeybindings(){return this.keybindings}connectedCallback(){if(this.hasBeenConnected_)return;super.connectedCallback(),this.eventMgr_.record(()=>{this.addEventListener("chapterchange",this.handlers.onChapterChanged)});const e=this.getConfig(),t=Te(e.constants??{},this.constants);this.appConstants=t,null!==this.playerView&&(this.modals=function(e,t){const s=Object.values(t),i=document.createElement("div");i.className="sxnd-modal-cover",document.body.append(i);const n={toggleExclusive:e=>{e.isOpen?e.close():r.hasOpen()||e.open()},setFullscreen:e=>{(e??document.body).append(i)},hasOpen:()=>s.some(e=>e.isOpen),closeNext:()=>{for(const e of s)if(e.isOpen){e.close();break}},closeAll:()=>{for(const e of s)e.close()},update:async()=>{await Promise.all(s.map(e=>e.update()))},resize:()=>{for(const e of s)e.resize()}},r=Object.assign(new(U()),t,n);i.addEventListener("click",()=>{r.closeAll()}),e.record(()=>{window.addEventListener("resize",()=>{r.resize()}),document.addEventListener("fullscreenchange",()=>{r.setFullscreen(b())})});for(const e of s)e.on("updated",()=>{e.isOpen||r.emit("closed",e),r.hasOpen()?i.classList.add("shown"):i.classList.remove("shown")});return r}(this.eventMgr_,{help:new pe(this.playerView,this.env,{constants:{...t,forceLandscapeOnFullscreen:Number(this.constants.forceLandscapeOnFullscreen)},keybindings:this.keybindings,actionIsAvailable:e=>{const t=this.actions[e];return void 0!==t&&t.isAvailable()}}),bookmark:new le(this.playerView,this.env,{shareButtons:e.shareButtons??[]}),screenshot:new Ce(this.playerView,this.env,{keybindings:this.keybindings,screnshotCaptions:e.screenshotCaptions??[],constants:e.constants??{}})}),this.modals.on("closed",this.handlers.onCloseModal)),setTimeout(()=>{this.loadMetadata()})}loadMetadata(){this.querySelectorAll("dlf-meta").forEach(e=>{const t=e.getAttribute("key"),s=e.getAttribute("value");if(!t||!s)return;let i=this.metadata[t];void 0===i&&(i=this.metadata[t]=[]),i.push(s)})}getActions(){return{...{...super.getActions()},cancel:O(()=>{if(!this.modals?.hasOpen())return this.ui.handleEscape();this.modals.closeNext()}),"modal.help.open":O(()=>{this.openModal(this.modals?.help)}),"modal.help.toggle":O(()=>{null!==this.modals&&(this.ui.seekBar?.endSeek(),this.modals.toggleExclusive(this.modals.help))}),"modal.bookmark.open":O(()=>{this.showBookmarkUrl()}),"modal.screenshot.open":O({isAvailable:()=>!this.isAudioOnly(),execute:()=>{this.showScreenshot()}}),"modal.screenshot.snap":O({isAvailable:()=>!this.isAudioOnly(),execute:()=>{this.snapScreenshot()}}),"theater.toggle":O(()=>{this.ui.seekBar?.endSeek();const e=new CustomEvent("dlf-theater-mode",{detail:{action:"toggle",persist:!0}});window.dispatchEvent(e)}),"navigate.rewind":O(()=>{this.skipSeconds(-this.appConstants.seekStep)}),"navigate.seek":O(()=>{this.skipSeconds(+this.appConstants.seekStep)})}}getTimeRange(){const e=super.getTimeRange();if(null!==e)return e;const t=this.env.getLocation().searchParams.get("timecode");if(t){const[e,s]=t.split(",",2);return this.parseTimeRange(e,s)}return null}getChapterLink(e){const t=e.getAttribute("data-timecode");if(null!==t){const e=Number(t);if(Number.isFinite(e))return{timecode:e,fileIds:[],title:"",pageNo:null}}const s=e.hash.match(/#timecode=(\d+(?:\.\d+)?)(?:;fileIds=([\w,-]+))?/);if(null!==s){const e=Number(s[1]);if(Number.isFinite(e)){const t=s[2];return{timecode:e,fileIds:void 0===t?[]:t.split(","),title:"",pageNo:null}}}return null}onDomContentLoaded(){super.onDomContentLoaded(),document.querySelectorAll("a[data-timecode], .tx-dlf-tableofcontents a, .tx-dlf-toc a").forEach(e=>{const t=e,s=this.getChapterLink(t);if(null!==s){const t=e;t.dlfVideoLink=s,this.eventMgr_.record(()=>{t.addEventListener("click",this.handlers.onClickChapterLink)}),this.chapterLinks.push(t)}});const e=document.querySelector("li.pages form select");e instanceof HTMLSelectElement&&(this.pageSelect=e,this.pageSelect.onchange=t=>{const s=Number(e.value),i=this.chapters.find(e=>e.pageNo===s)??this.chapters.at(s-1);void 0!==i&&this.seekToChapter(i)||this.pageSelect?.form?.submit()})}loaded(){super.loaded(),this.modals?.resize()}configureFrontend(e){super.configureFrontend(e),this.eventMgr_.record(()=>{document.addEventListener("keydown",this.handlers.onKeyDown,{capture:!0}),document.addEventListener("keyup",this.handlers.onKeyUp,{capture:!0})})}getKeyboardScope(){if(this.modals?.hasOpen())return"modal";for(const e of Array.from(document.querySelectorAll("input:focus")))if(e instanceof HTMLElement&&null!==e.offsetParent)return"input";return"player"}onKeyDown(e){this.hasVideo&&this.handleKey(e,"down")}onKeyUp(e){this.hasVideo&&(e.stopImmediatePropagation(),this.handleKey(e,"up"),this.cancelTrickPlay())}handleKey(e,t){const s=this.getKeyboardScope(),i=function(e,t,s,i){const n=function(e){let t=he.None;return e.ctrlKey&&"Control"!==e.key&&(t|=he.Ctrl),e.metaKey&&"Meta"!==e.key&&(t|=he.Meta),e.shiftKey&&"Shift"!==e.key&&(t|=he.Shift),e.altKey&&"Alt"!==e.key&&(t|=he.Alt),t}(s),r=e.getKeyboardVariant();for(const a of t){const t=a.keys.findIndex(e=>e===s.key);if(-1!==t&&!(null!=a.repeat&&a.repeat!==s.repeat||null!=a.scope&&a.scope!==i||de(e,s.key,he[a.mod??"None"])!==de(e,s.key,n)||null!=a.keyboard&&a.keyboard!==r))return{keybinding:a,keyIndex:t}}}(this.env,this.keybindings,e,s);if(i){const{keybinding:s,keyIndex:n}=i;e.preventDefault();const r="down"===t&&(s.keydown??!0)||"up"===t&&(s.keyup??!1),a=this.actions[s.action];r&&void 0!==a&&a.isAvailable()&&!1!==a.execute(s,n,t)&&"Escape"===e.key&&e.stopImmediatePropagation()}}onClickChapterLink(e){const t=e.currentTarget;this.seekToChapter(t.dlfVideoLink)&&(e.preventDefault(),this.media.play())}onChapterChanged(e){const t=e.detail.curChapter;if(null!=this.pageSelect&&null!==t)if(null!==t.pageNo)this.pageSelect.value=t.pageNo.toString();else{const e=this.chapters.indexOf(t);void 0!==e&&(this.pageSelect.value=(e+1).toString())}for(const e of this.chapterLinks)null!==e.parentElement&&g(e.parentElement,"current",B.isEqual(e.dlfVideoLink,t))}onCloseModal(e){"$startAtVariants"in e&&g(e.$startAtVariants.begin.$container,"bookmark-markertable-hidden",!1),this.resumeOn(e)}showBookmarkUrl(e=null,t=!1){if(!this.hasCurrentData)return;const s=this.modals?.bookmark;void 0!==s&&(s.setState({metadata:this.metadata,timing:{currentTime:this.displayTime,markerRange:e??this.getMarkers().activeSegment?.toTimeRange()??null},fps:this.getFps()??0}),null!==e&&s.setState({startAtMode:"marker"}),!0===t&&g(s.$startAtVariants.begin.$container,"bookmark-markertable-hidden",!0),this.openModal(s,!0))}prepareScreenshot(){if(this.hasCurrentData)return this.modals?.screenshot.setVideo(this.video).setMetadata(this.metadata).setFps(this.getFps()).setTimecode(this.displayTime)}showScreenshot(){const e=this.prepareScreenshot();this.openModal(e,!0)}snapScreenshot(){const e=this.prepareScreenshot();e?.snap()}openModal(e,t=!1){null!=e&&(t&&this.pauseOn(e),this.ui.seekBar?.endSeek(),e.open())}}function xe({frequency:e,sampleRate:t}){let s=2*Math.PI*(e/t);return s=Math.tan(s/2),Ee({type:"iir",sampleRate:t,feedforward:[1,-1,0],feedback:[s+1,s-1,0]})}function _e({frequency:e,gain:t,S:s,sampleRate:i}){const n=2*Math.PI*(e/i),r=10**(t/40),a=$e(r,s),o=Math.cos(n),l=Math.sin(n)/2*(1/a),h=2*Math.sqrt(r)*l;return Ee({type:"iir",sampleRate:i,feedforward:[r*(r+1-(r-1)*o+h),2*r*(r-1-(r+1)*o),r*(r+1-(r-1)*o-h)],feedback:[r+1+(r-1)*o+h,-2*(r-1+(r+1)*o),r+1+(r-1)*o-h]})}function Me({frequency:e,gain:t,S:s,sampleRate:i}){const n=2*Math.PI*(e/i),r=10**(t/40),a=$e(r,s),o=Math.cos(n),l=Math.sin(n)/2*(1/a),h=2*Math.sqrt(r)*l;return Ee({type:"iir",sampleRate:i,feedforward:[r*(r+1+(r-1)*o+h),-2*r*(r-1+(r+1)*o),r*(r+1+(r-1)*o-h)],feedback:[r+1-(r-1)*o+h,2*(r-1-(r+1)*o),r+1-(r-1)*o-h]})}function $e(e,t){return 1/Math.sqrt((e+1/e)*(1/t-1)+2)}function Ee(e){let t=e.feedback[0];for(let s=0;s<3;s++)void 0!==t&&(e.feedback[s]/=t),void 0!==t&&(e.feedforward[s]/=t);return e}customElements.define("slub-media",Pe),customElements.define("dlf-marker-table",class extends Y{constructor(){super(),this.rows={},this.rowCount=0,this.$container=null,this.markersHandlers={remove:e=>{for(const t of e.detail.segments)this.removeRowById(t.id)},remove_all:()=>{this.clearTable()},add:e=>{this.syncSegments(e.detail.segments)},update:e=>{const{segment:t}=e.detail;this.syncSegment(t)},activate_segment:e=>{const{segment:t}=e.detail;for(const e of Object.values(this.rows))g(e.$tr,"active-segment",null!==t&&e.segment.id===t.id)}},this.handlers={onLabelEditKeydown:this.rowEvent(this.onLabelEditKeydown.bind(this)),onLabelEditInput:this.rowEvent(this.onLabelEditInput.bind(this)),onDeleteRow:this.rowEvent(this.onDeleteRow.bind(this)),onBookmarkRow:this.rowEvent(this.onBookmarkRow.bind(this)),onSeekToStartTime:this.rowEvent(this.onSeekToStartTime.bind(this)),onSeekToEndTime:this.rowEvent(this.onSeekToEndTime.bind(this)),onClear:this.onClear.bind(this),onDownloadCsv:this.onDownloadCsv.bind(this)}}attachToPlayer(e){this.$container=r("div",{className:"dlf-media-markers is-empty"},[r("h2",{},[this.env.t("control.sound_tools.marker_table.title")]),r("div",{className:"dlf-media-markers-empty-msg",innerHTML:this.getEmptyTableHTML()}),r("div",{className:"dlf-media-markers-list"},[this.$exportCsvButton=r("a",{href:"#",$click:this.handlers.onDownloadCsv},[this.env.t("control.sound_tools.marker_table.download_csv")]),", ",this.$exportCsvButton=r("a",{href:"#",$click:this.handlers.onClear},[this.env.t("control.sound_tools.marker_table.clear")]),r("table",{},[r("thead",{},[r("tr",{},[r("th",{},[this.env.t("control.sound_tools.marker_table.entry.name")]),r("th",{},[this.env.t("control.sound_tools.marker_table.entry.startTime")]),r("th",{},[this.env.t("control.sound_tools.marker_table.entry.endTime")]),r("th",{},[""])])]),this.$body=r("tbody",{},[])])])]);for(const[t,s]of Object.entries(this.markersHandlers))e.getMarkers().addEventListener(t,s);this.syncSegments(e.getMarkers().getSegments()),this.append(this.$container)}onLabelEditKeydown(e,t){"Enter"===t.key&&e.$labelEditBox.blur()}onLabelEditInput(e,t){null!==this.player&&this.player.getMarkers().update({id:e.segment.id,labelText:e.$labelEditBox.value})}onDeleteRow(e){null!==this.player&&this.player.getMarkers().removeById(e.segment.id)}onBookmarkRow(e){this.player instanceof Pe&&this.player.showBookmarkUrl(e.segment.toTimeRange(),!0)}onSeekToStartTime(e){null!==this.player&&(this.player.seekTo(e.segment.startTime),this.player.getMarkers().activateSegmentById(e.segment.id))}onSeekToEndTime(e){null!==this.player&&(this.player.seekTo(e.segment.endTime??e.segment.startTime),this.player.getMarkers().activateSegmentById(e.segment.id))}onClear(e){e.preventDefault(),null!==this.player&&confirm(this.env.t("control.sound_tools.marker_table.clear.confirm"))&&this.player.getMarkers().removeAll()}onDownloadCsv(e){e.preventDefault();const t=new ae(this.env),s=[["ID","Label","Start [s]","End [s]","URL"],...Object.values(this.rows).map(e=>[e.segment.id,e.segment.labelText,e.segment.startTime.toString(),e.segment.endTime?.toString()??"",t.generateTimerangeUrl(e.segment.toTimeRange()).toString()])].map(e=>e.map(e=>`"${e.replace(/"/g,'""')}"`).join(";")).join("\n");p(new Blob([s],{type:"text/csv"}),"markers.csv")}rowEvent(e){return t=>{const s=t.currentTarget;if(void 0===s.rowId)return;const i=this.rows[s.rowId];void 0!==i&&e(i,t)}}syncSegments(e){for(const t of e)this.syncSegment(t)}syncSegment(e){let t=!1,s=this.rows[e.id];void 0===s&&(s=this.rows[e.id]=this.createRow(e),t=!0,this.rowCount++);const i=Object.assign({},s.segment);Object.assign(s.segment,e),(t||0!==this.cmpSegment(e,i))&&this.insertRow(s),s.$labelEditBox.value=e.labelText,s.$labelEditBox.readOnly=!e.editable,s.$startTime.textContent=T(e.startTime,!0),s.$endTime.textContent=void 0===e.endTime?"":T(e.endTime,!0),this.update()}createRow(e){let t,s,i,n;const a=r("button",{title:this.env.t("control.sound_tools.marker_table.entry.delete"),$click:this.handlers.onDeleteRow},[r("span",{className:"material-icons-round inline-icon"},["delete"])]);a.rowId=e.id;const o=r("button",{title:this.env.t("control.sound_tools.marker_table.entry.bookmark"),$click:this.handlers.onBookmarkRow},[r("span",{className:"material-icons-round inline-icon"},["bookmark_border"])]);o.rowId=e.id;const l=r("input",{placeholder:e.id,value:e.labelText,readOnly:!e.editable,$keydown:this.handlers.onLabelEditKeydown,$input:this.handlers.onLabelEditInput});l.rowId=e.id;const h=[s=r("td",{className:"marker-id-col"},[l]),i=r("td",{className:"marker-start-col",title:this.env.t("control.sound_tools.marker_table.jump_to_start"),$click:this.handlers.onSeekToStartTime}),n=r("td",{className:"marker-end-col",title:this.env.t("control.sound_tools.marker_table.jump_to_end"),$click:this.handlers.onSeekToEndTime}),r("td",{className:"marker-buttons-col"},[o,a])];for(const t of h)t.rowId=e.id;return t=r("tr",{},h),{segment:Object.assign({},e),$tr:t,$id:s,$labelEditBox:l,$startTime:i,$endTime:n}}insertRow(e){if(void 0===this.$body)return;let t=!1;for(const s of Object.values(this.rows))if(e!==s&&this.cmpSegment(e.segment,s.segment)<0){this.$body.insertBefore(e.$tr,s.$tr),t=!0;break}t||this.$body.append(e.$tr)}removeRowById(e){if(void 0===e)return;const t=this.rows[e];void 0!==t&&this.removeRow(t)}clearTable(){void 0!==this.$body&&(this.$body.innerHTML=""),this.rows={},this.rowCount=0,this.update()}removeRow(e){e.$tr.remove(),delete this.rows[e.segment.id],this.rowCount--,this.update()}getEmptyTableHTML(){if(!(this.player instanceof Pe))return"";const e=this.player.getKeybindings(),t=e.find(e=>"sound_tools.segments.add"===e.action),s=e.find(e=>"sound_tools.segments.close"===e.action);return l(r("span",{innerText:this.env.t("control.sound_tools.marker_table.empty",{keybindingAdd:"{keybindingAdd}",keybindingClose:"{keybindingClose}"})}).innerHTML,{keybindingAdd:t?ue(this.env,t).innerHTML:"",keybindingClose:s?ue(this.env,s).innerHTML:""})}update(){null!==this.$container&&g(this.$container,"is-empty",0===this.rowCount)}cmpSegment(e,t){return o(e.startTime,t.startTime)||o(e.endTime??e.startTime,t.endTime??t.startTime)}});class Ae{constructor(e,t=null){this.initial_=e,this.value_=e,this.updateFn_=t}get initial(){return this.initial_}get value(){return this.value_}get editable(){return null!==this.updateFn_}initialize(e){this.initial_=e,this.value_=e}update(e){if(null!==this.updateFn_){const t=this.value_,s=e(t);this.value_=s,this.updateFn_(t,s,e=>{this.value_=e})}}}const Re=["deepBaseRolloff","baseBoostRolloff","baseBoost","trebleCut"];function Be(e){return 1/(2*Math.PI*e)}function qe(e){return 1/(2*Math.PI*e)}class Fe{constructor(e){this.audioContext_=e,this.processorNode=new AudioWorkletNode(e,"multi-iir-processor"),this.pp={deepBaseRolloff:this.makeParam("base",50),baseBoostRolloff:this.makeParam("mid",1e3,()=>[0,this.pp.baseBoost.frequency.value-.01]),baseBoost:this.makeParam("mid",2e3,()=>[this.pp.baseBoostRolloff.frequency.value+.01,Number.POSITIVE_INFINITY]),trebleCut:this.makeParam("treble",5e3)},this.parameters_=[this.pp.deepBaseRolloff,this.pp.baseBoostRolloff,this.pp.baseBoost,this.pp.trebleCut],this.gain_=1,this.keyedFilters_=this.createFilters(),this.updateFilters()}get inputNode(){return this.processorNode}get outputNode(){return this.processorNode}get nodes(){return Object.values(this.keyedFilters_).filter(e=>e.isActive).map(e=>e.node)}get parameters(){return this.parameters_}get gain(){return this.gain_}targetCurve(e){const t={name:"RIAA Target",points:[]},s=this.single(1e3);for(let i=0;i<e.length;i++){const n=e[i],r=this.single(n)-s,a=0;t.points.push({freq:n,gain:r,phase:a})}return t}resetTc(e){for(const t of Re){const s=e[t];if(null==s)this.pp[t].isActive=!1;else{const e=Be(s/1e6);this.pp[t].isActive=!0,this.pp[t].frequency.initialize(e)}}this.pp.baseBoost.isActive?this.pp.baseBoostRolloff.isActive||this.pp.baseBoostRolloff.frequency.initialize(10):this.pp.baseBoostRolloff.isActive=!1,this.keyedFilters_=this.createFilters(),this.updateFilters()}getTc(){const e={};for(const t of Re)e[t]=this.pp[t].isActive?1e6*qe(this.pp[t].frequency.value):null;return e}makeParam(e,t,s=()=>[Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY]){return{isActive:!1,frequency:new Ae(t,(t,i,n)=>{n(a(i,s())),this.keyedFilters_[e]=this.makeFilter(e),this.keyedFilters_[e].isActive=!0,this.updateFilters()}),gain:new Ae(0),getFrequencyResponse:t=>{const s=this.keyedFilters_[e]?.node??null;return null===s?{name:"Frequency Response",points:[]}:t.aggregate([s]).makeCurve(this.gain_)}}}updateFilters(){const e=this.single(1e3);this.gain_=10**(-e/20),this.processorNode.port.postMessage({type:"filters",gain:this.gain_,filters:this.keyedFilters_})}createFilters(){const e={base:this.makeFilter("base"),mid:this.makeFilter("mid"),treble:this.makeFilter("treble")};return e.base.isActive=this.pp.deepBaseRolloff.isActive,e.mid.isActive=this.pp.baseBoost.isActive,e.treble.isActive=this.pp.trebleCut.isActive,e}makeFilter(e){switch(e){case"base":return this.makeBaseFilter();case"mid":return this.makeMidFilter();case"treble":return this.makeTrebleFilter()}}makeBaseFilter(){return{isActive:!1,node:xe({frequency:this.pp.deepBaseRolloff.frequency.value,sampleRate:this.audioContext_.sampleRate})}}makeMidFilter(){const e=10*Math.log10(1+this.pp.baseBoost.frequency.value**2)-10*Math.log10(1+this.pp.baseBoostRolloff.frequency.value**2),t=e/2;return{isActive:!1,node:_e({frequency:Math.sqrt(this.pp.baseBoost.frequency.value**2-this.pp.baseBoostRolloff.frequency.value**2*10**(t/10))/Math.sqrt(10**(t/10)-1),gain:e,S:.5,sampleRate:this.audioContext_.sampleRate})}}makeTrebleFilter(){const e=this.single(2e4),t=e/2;return{isActive:!1,node:Me({frequency:Math.sqrt(10**(-t/10)-1)*this.pp.trebleCut.frequency.value,gain:e,S:.5,sampleRate:this.audioContext_.sampleRate})}}single(e){let t=0;return this.pp.deepBaseRolloff.isActive&&(t-=10*Math.log10(1+(this.pp.deepBaseRolloff.frequency.value/e)**2)),this.pp.baseBoost.isActive&&(t+=10*Math.log10(1+(this.pp.baseBoost.frequency.value/e)**2),t-=10*Math.log10(1+(this.pp.baseBoostRolloff.frequency.value/e)**2)),this.pp.trebleCut.isActive&&(t-=10*Math.log10(1+(e/this.pp.trebleCut.frequency.value)**2)),t}}function Ie(e){if("object"!=typeof e||null===e)return null;const{group:t,label:s,mode:i}=e;if("string"!=typeof t||"string"!=typeof s)return null;const n={group:t,label:s};if("string"==typeof e.key&&(n.key=e.key),"band-iso"===i){const t=Number(e.octaveStep);if(t>0)return{...n,mode:i,octaveStep:t}}else if("band"===i){if(Array.isArray(e.bands)){const t=[];for(const s of e.bands){if("object"!=typeof s||null===s)continue;const e=Number(s.frequency),i=Number(s.octaves),n=Number(s.gain);e>0&&i>0&&Number.isFinite(n)&&t.push({frequency:e,octaves:i,gain:n})}return{...n,mode:i,bands:t}}}else if("riaa"===i&&"object"==typeof e.params&&null!==e.params){const t={};let s=Number.POSITIVE_INFINITY;for(const i of Re){const n=Number(e.params[i]);n<s?(t[i]=n,s=n):t[i]=null}return{...n,mode:i,params:t}}return null}class Le{constructor(e){this.audioContext_=e,this.bands_=[],this.prevNode_=null,this.fallbackNode_=new GainNode(e)}static octavesToQ(e){return 1/(2**(e/2)-2**(-e/2))}static qToOctaves(e){return Math.asinh(1/e/2)/(Math.LN2/2)}get gain(){return 1}get nodes(){return this.bands_.map(e=>e.node)}get parameters(){return this.bands_.map(e=>e.param)}get inputNode(){return this.nodes[0]??this.fallbackNode_}get outputNode(){return this.nodes[this.nodes.length-1]??this.fallbackNode_}targetCurve(e){return null}getBands(){return this.bands_.map(e=>({frequency:e.options.frequency,octaves:Le.qToOctaves(e.options.Q),gain:e.options.gain}))}autofill(e){this.addBand(1e3,e,0);for(let t=1;;t++){let s=!1;for(const i of[-1,1]){const n=1e3*2**(i*t*e);20<=n&&n<=2e4&&(this.addBand(n,e,0),s=!0)}if(!s)break}}addBand(e,t,s){const i={type:"peaking",frequency:e,gain:s,Q:Le.octavesToQ(t)},n=new BiquadFilterNode(this.audioContext_,i);null!==this.prevNode_&&this.prevNode_.connect(n),this.prevNode_=n,this.bands_.push({node:n,param:{isActive:!0,frequency:new Ae(i.frequency),gain:new Ae(i.gain,(e,t)=>{n.gain.value=i.gain=t}),getFrequencyResponse:e=>e.aggregate([n]).makeCurve(this.gain)},options:i})}}class Ne{constructor(e){this.source_=e,this.audioContext_=e.context,this.fftSize_=8192,this.fftData_=new Float32Array(this.fftSize_),this.connection_=null,this.active_=!1,this.filterset_=new Le(this.audioContext_)}get audioContext(){return this.audioContext_}get active(){return this.active_}set active(e){e!==this.active_&&(this.active_=e,e?this.activate():this.deactivate())}get filterset(){return this.filterset_}get activeParams(){return this.filterset_.parameters.filter(e=>e.isActive)}getFrequencyResponse(e){return e.aggregate(this.filterset_.nodes).makeCurve(this.filterset.gain)}connect(e){const t=this.audioContext_.createAnalyser();t.smoothingTimeConstant=0,t.fftSize=this.fftSize_,this.connection_={destination:e,analyzer:t},this.source_.connect(t),t.connect(e)}setFilters(e){this.deactivate(),this.filterset_=e,this.active_&&this.activate()}loadPreset(e){let t;switch(e.mode){case"riaa":t=new Fe(this.audioContext),t.resetTc(e.params);break;case"band-iso":t=new Le(this.audioContext),t.autofill(e.octaveStep);break;case"band":t=new Le(this.audioContext);for(const s of e.bands)t.addBand(s.frequency,s.octaves,s.gain)}this.setFilters(t)}exportPreset(e){const t={group:"user",label:e};return this.filterset_ instanceof Le?{...t,mode:"band",bands:this.filterset_.getBands()}:this.filterset_ instanceof Fe?{...t,mode:"riaa",params:this.filterset_.getTc()}:null}fft(e){if(null===this.connection_)return null;this.connection_.analyzer.getFloatFrequencyData(this.fftData_);const t={name:"FFT",points:[]};for(let s=0;s<this.fftData_.length;s++){let i=this.fftData_[s];t.points.push({freq:this.audioContext.sampleRate/this.fftData_.length*s,gain:e+i,phase:0})}return t}deactivate(){null!==this.connection_&&(this.source_.disconnect(),this.source_.connect(this.connection_.analyzer))}activate(){if(null!==this.connection_){const{analyzer:e}=this.connection_;this.source_.disconnect(),this.source_.connect(this.filterset_.inputNode),this.filterset_.outputNode.connect(e)}}}class Oe{constructor(e){this.numPoints=e,this.frequencies_=new Float32Array(e),this.bufMagnitude_=new Float32Array(e),this.bufPhase_=new Float32Array(e),this.magnitudeResponse_=new Float32Array(e),this.phaseResponse_=new Float32Array(e)}setFrequency(e,t){this.frequencies_[e]=t}setFrequencies(e){this.frequencies_=e}aggregate(e){this.magnitudeResponse_.fill(1),this.phaseResponse_.fill(0);for(const t of e){if(t instanceof BiquadFilterNode)t.getFrequencyResponse(this.frequencies_,this.bufMagnitude_,this.bufPhase_);else for(let e=0;e<this.frequencies_.length;e++){const s=this.frequencies_[e],i=2*Math.PI*s/t.sampleRate,[n,r]=this.fft(t.feedforward,i),[a,o]=this.fft(t.feedback,i),l=n*a+r*o,h=r*a-n*o,d=Math.sqrt(l**2+h**2)/(a**2+o**2),c=Math.atan2(h,l);this.bufMagnitude_[e]=d,this.bufPhase_[e]=c}for(let e=0;e<this.numPoints;e++)void 0!==this.bufMagnitude_[e]&&(this.magnitudeResponse_[e]*=this.bufMagnitude_[e]),void 0!==this.bufPhase_[e]&&(this.phaseResponse_[e]+=this.bufPhase_[e])}return this}fft(e,t){let s=0,i=0;for(let n=0;n<e.length;n++){const r=e[n];s+=r*Math.cos(-n*t),i+=r*Math.sin(-n*t)}return[s,i]}makeCurve(e=1){const t={name:"Frequency Response",points:[]};for(let s=0;s<this.numPoints;s++){const i=this.magnitudeResponse_[s],n=this.magToDb(i*e),r=this.phaseResponse_[s];t.points.push({freq:this.frequencies_[s],gain:n,phase:r})}return t}magToDb(e){return 20*Math.log10(e)}}const De={convert:e=>e<=0?Number.NEGATIVE_INFINITY:Math.log(e),invert:Math.exp},Ve={convert:e=>e,invert:e=>e};class Ue{constructor(e=0,t=1,s=0,i=1,n=Ve){this.skew=n,this.inputMin_=e,this.inputMax_=t,this.outputMin_=s,this.inputMinConv_=this.skew.convert(e),this.convScale_=(i-s)/(this.skew.convert(this.inputMax_)-this.inputMinConv_)}get max(){return this.inputMax_}convert(e){return(this.skew.convert(e)-this.inputMinConv_)*this.convScale_+this.outputMin_}invert(e){return this.skew.invert((e-this.outputMin_)/this.convScale_+this.inputMinConv_)}}class Ge extends q{constructor(e,t){super(),this.env=e,this.eq_=t,this.handlers={onCanvasMouseMove:this.onCanvasMouseMove.bind(this),onCanvasMouseLeave:this.onCanvasMouseLeave.bind(this),onCanvasMouseDown:this.onCanvasMouseDown.bind(this),onCanvasMouseUp:this.onCanvasMouseUp.bind(this),onCanvasDoubleClick:this.onCanvasDoubleClick.bind(this),onCanvasWheel:this.onCanvasWheel.bind(this),onChangeActivate:this.onChangeActivate.bind(this),onSelectPreset:this.onSelectPreset.bind(this),onResetPreset:this.onResetPreset.bind(this),onSavePreset:this.onSavePreset.bind(this),onDeletePreset:this.onDeletePreset.bind(this),onResizeWindow:this.resize.bind(this)};const s={activateCheck:this.env.mkid(),presetSelect:this.env.mkid(),labelInput:this.env.mkid()};this.$container=r("div",{className:"dlf-equalizer-view"},[r("h2",{},[this.env.t("control.sound_tools.equalizer.title")]),r("section",{className:"eq-controls"},[r("div",{className:"eq-preset"},[r("label",{htmlFor:s.presetSelect},[this.env.t("control.sound_tools.equalizer.preset.label")]),this.$presetSelect=r("select",{id:s.presetSelect,$change:this.handlers.onSelectPreset},[]),r("button",{title:this.env.t("control.sound_tools.equalizer.preset.reset"),$click:this.handlers.onResetPreset},[r("span",{className:"material-icons-round inline-icon"},["settings_backup_restore"])]),r("button",{title:this.env.t("control.sound_tools.equalizer.preset.save"),$click:this.handlers.onSavePreset},[r("span",{className:"material-icons-round inline-icon"},["save_as"])]),this.$deletePresetBtn=r("button",{disabled:!0,title:this.env.t("control.sound_tools.equalizer.preset.delete"),$click:this.handlers.onDeletePreset},[r("span",{className:"material-icons-round inline-icon"},["delete"])])]),r("div",{className:"eq-activate"},[this.$activateCheck=r("input",{id:s.activateCheck,type:"checkbox",checked:this.eq_.active,$input:this.handlers.onChangeActivate}),r("label",{htmlFor:s.activateCheck},[this.env.t("control.sound_tools.equalizer.activate")])])]),this.$canvas=r("canvas",{width:1e3,height:400,$mousemove:this.handlers.onCanvasMouseMove,$mouseleave:this.handlers.onCanvasMouseLeave,$mousedown:this.handlers.onCanvasMouseDown,$dblclick:this.handlers.onCanvasDoubleClick,$mouseup:this.handlers.onCanvasMouseUp,$wheel:this.handlers.onCanvasWheel})]),this.$ctx=this.$canvas.getContext("2d"),this.eqBox=this.calcEqBox(),this.resizeAnimationFrame=null,this.renderAnimationFrame=null,this.hovered=null,this.NUM_POINTS=1e3,this.db=new Ue,this.phase=new Ue,this.freq=new Ue,this.frequencies=new Float32Array(this.NUM_POINTS),this.frequencyResponse=new Oe(this.NUM_POINTS),this.singleFrequencyResponse=new Oe(1),this.frequencyResponseCurve=this.frequencyResponse.makeCurve(),this.presets={selected:null,keyToPreset:{},domGroups:{}},this.addPresetOptgroup("user"),this.setHovered(null),this.initFrequencies(),window.addEventListener("resize",this.handlers.onResizeWindow)}get domElement(){return this.$container}resize(){null===this.resizeAnimationFrame&&(this.resizeAnimationFrame=requestAnimationFrame(()=>{this.resizeAnimationFrame=null;const e=a(this.$container.offsetWidth-100,[100,1e3]),t=a(.4*e,[200,400]);this.$canvas.width=e,this.$canvas.height=t,this.eqBox=this.calcEqBox(),this.initFrequencies()}))}calcEqBox(){return new DOMRect(40,0,this.$canvas.width-40,this.$canvas.height-20)}initFrequencies(){const e=this.eq_.audioContext.sampleRate/2;this.db=new Ue(-24,24,this.eqBox.bottom,this.eqBox.top,Ve),this.phase=new Ue(-2*Math.PI,2*Math.PI,this.eqBox.bottom,this.eqBox.top,Ve),this.freq=new Ue(10,e,this.eqBox.left,this.eqBox.right,De);const t=new Ue(10,e,0,this.NUM_POINTS-1,De);for(let e=0;e<this.NUM_POINTS;e++)this.frequencies[e]=t.invert(e);this.frequencyResponse.setFrequencies(this.frequencies),this.updateFrequencyResponse()}onChangeActivate(){this.eq_.active=this.$activateCheck.checked}onCanvasMouseMove(e){const t={freqX:e.offsetX,gainY:e.offsetY};if(null!==this.hovered&&this.hovered.grabbed){const e=this.db.invert(t.gainY+(this.hovered.grabbed.filter.gainY-this.hovered.grabbed.pointer.gainY));this.updateFilterGain(this.hovered.param,()=>e);const s=this.freq.invert(t.freqX+(this.hovered.grabbed.filter.freqX-this.hovered.grabbed.pointer.freqX));this.updateFilterFreq(this.hovered.param,()=>s)}else{const e=this.freq.invert(t.freqX);let s=null;for(const i of this.eq_.activeParams){const n={grabbed:null,pointer:t,dist:Math.abs(i.frequency.value-e),param:i};(null===s||n.dist<=s.dist)&&(s=n)}this.setHovered(s)}}onCanvasMouseLeave(){this.setHovered(null)}onCanvasMouseDown(e){if(null!==this.hovered){const t={freqX:e.offsetX,gainY:e.offsetY},s={gainY:this.db.convert(this.hovered.param.gain.value),freqX:this.freq.convert(this.hovered.param.frequency.value)};this.setHovered({...this.hovered,grabbed:{pointer:t,filter:s}})}}onCanvasMouseUp(){null!=this.hovered?.grabbed&&this.setHovered({...this.hovered,grabbed:null})}onCanvasDoubleClick(){const e=this.hovered?.param;null!=e&&(this.updateFilterGain(e,()=>e.gain.initial),this.updateFilterFreq(e,()=>e.frequency.initial))}onCanvasWheel(e){if(null!==this.hovered&&null===this.hovered.grabbed){e.preventDefault();const t=e.deltaY/4;let s=this.db.invert(this.eqBox.height/2-t);Math.abs(s)>1&&(s/=5),this.updateFilterGain(this.hovered.param,e=>e-s)}}setHovered(e){this.hovered=e,this.$canvas.style.cursor=e?.grabbed?"grab":"pointer",this.scheduleRenderGraph()}updateFilterGain(e,t){this.updateEqValue(e.gain,t,[-24,24])}updateFilterFreq(e,t){this.updateEqValue(e.frequency,t,[10,this.freq.max])}updateEqValue(e,t,s){e.editable&&(e.update(e=>a(t(e),s)),this.updateFrequencyResponse())}onSelectPreset(){this.selectPreset(this.$presetSelect.value)}onResetPreset(){this.selectPreset(this.$presetSelect.value,"original")}onSavePreset(){const e=prompt(this.env.t("control.sound_tools.equalizer.preset.save.name"));if(!e)return;const t=this.eq_.exportPreset(e);if(null===t)return;const s=this.addPreset(t);this.selectPreset(s),this.dispatchEvent(new CustomEvent("store_preset",{detail:{key:s,preset:t}}))}onDeletePreset(){const e=this.$presetSelect.value,t=this.presets.keyToPreset[e];void 0!==t&&"user"===t.original.group&&(this.presets.domGroups[t.original.group]?.querySelector(`option[value="${e}"]`)?.remove(),this.selectPreset(this.$presetSelect.value),this.dispatchEvent(new CustomEvent("delete_preset",{detail:{key:e}})))}addPreset(e){const t=e.key??this.env.uuidv4();this.presets.keyToPreset[t]={original:e,modified:e};let s=this.presets.domGroups[e.group];void 0===s&&(s=this.addPresetOptgroup(e.group));const i=r("option",{value:t},[e.label]);return s.append(i),t}selectPreset(e,t="modified"){if(null!==this.presets.selected){const e=this.eq_.exportPreset("");null!==e&&(this.presets.selected.modified=e)}const s=this.presets.keyToPreset[e];void 0!==s&&(this.presets.selected=s,this.eq_.loadPreset(s[t]),s.modified=s[t],this.$presetSelect.value=e,this.$deletePresetBtn.disabled="user"!==s.original.group,this.updateFrequencyResponse())}addPresetOptgroup(e){const t=r("optgroup",{label:this.env.t(`control.sound_tools.equalizer.preset.group.${e}`)},[]);return this.presets.domGroups[e]=t,this.$presetSelect.appendChild(t),t}fftSnapshot(e){this.fftCurve=this.eq_.fft(e),this.scheduleRenderGraph()}updateFrequencyResponse(){this.frequencyResponseCurve=this.eq_.getFrequencyResponse(this.frequencyResponse),this.scheduleRenderGraph()}scheduleRenderGraph(){null===this.renderAnimationFrame&&(this.renderAnimationFrame=requestAnimationFrame(()=>{this.renderGraph(),this.renderAnimationFrame=null}))}renderGraph(){if(null===this.$ctx)return;const e=this.eqBox;this.$ctx.clearRect(0,0,this.$canvas.width,this.$canvas.height);for(let t=-24;t<=24;t+=6){const s=this.db.convert(t);this.$ctx.strokeStyle="#ddd",this.$ctx.beginPath(),this.$ctx.moveTo(e.left,s),this.$ctx.lineTo(e.right,s),this.$ctx.stroke();let i=s+4;t>0?i=s+10:t<0&&(i=s),this.$ctx.font="12px Arial",this.$ctx.fillStyle="#aaa",this.$ctx.textAlign="right",this.$ctx.fillText(`${t} dB`,e.left-4,i,e.width)}for(const t of[10,100,1e3,1e4]){for(let e=1;e<10;e++){this.$ctx.strokeStyle=e<=1?"#aaa":"#ddd";const s=this.freq.convert(t*e);this.$ctx.beginPath(),this.$ctx.moveTo(s,this.eqBox.top),this.$ctx.lineTo(s,this.eqBox.bottom),this.$ctx.stroke()}this.$ctx.font="12px Arial",this.$ctx.textAlign="left",this.$ctx.fillStyle="#aaa";const s=this.freq.convert(t);this.$ctx.fillText(`${t} Hz`,s,e.bottom+12)}const t=this.eq_.filterset.targetCurve(this.frequencies);if(null!==t&&this.drawEqCurve(t),this.$ctx.strokeStyle="black",this.drawEqCurve(this.frequencyResponseCurve,"gain"),this.$ctx.setLineDash([5,15]),this.drawEqCurve(this.frequencyResponseCurve,"phase"),this.$ctx.setLineDash([]),null!==this.hovered){const e=this.hovered.param.getFrequencyResponse(this.frequencyResponse);this.$ctx.strokeStyle="transparent",this.$ctx.fillStyle="rgba(0, 0, 0, 0.1)",this.fillEqCurve(e)}if(null!==this.hovered){const t=this.freq.invert(this.hovered.pointer.freqX),s=t.toLocaleString(void 0,{maximumFractionDigits:0});this.singleFrequencyResponse.setFrequency(0,t);const i=this.eq_.getFrequencyResponse(this.singleFrequencyResponse).points[0];if(void 0!==i){const t=i.gain.toLocaleString(void 0,{maximumFractionDigits:1,signDisplay:"exceptZero"}),n=(i.phase/Math.PI*180).toLocaleString(void 0,{maximumFractionDigits:0});this.$ctx.font="12px Arial",this.$ctx.fillStyle="rgba(0, 0, 0, 0.4)",this.$ctx.textAlign="left",this.$ctx.fillText(`${s} Hz: ${t} dB, ${n}°`,e.left+2,e.top+12)}}for(const e of this.eq_.activeParams){const t=this.freq.convert(e.frequency.value),s=this.db.convert(e.gain.value);this.$ctx.fillStyle=e===this.hovered?.param?"red":"blue",this.$ctx.beginPath(),this.$ctx.arc(t,s,3,0,2*Math.PI),this.$ctx.fill()}this.fftCurve&&(this.$ctx.strokeStyle="green",this.drawEqCurve(this.fftCurve))}fillEqCurve(e,t="gain"){if(null===this.$ctx)return;const s=e.points[0],i=e.points[e.points.length-1];s&&i&&(e.points.splice(0,0,{freq:s.freq,gain:0,phase:0}),e.points.push({freq:i.freq,gain:0,phase:0})),this.drawEqCurve(e,t),this.$ctx.closePath(),this.$ctx.fill()}drawEqCurve(e,t="gain"){if(null===this.$ctx)return;this.$ctx.beginPath();let s=!0;for(const i of e.points){const e=this.freq.convert(i.freq),n="gain"===t?this.db.convert(i.gain):this.phase.convert(i.phase);s?(this.$ctx.moveTo(e,n),s=!1):this.$ctx.lineTo(e,n)}this.$ctx.stroke()}}function ze(){const e=2**-1022;function t(t){return Math.abs(t)<e?0:t}class s extends AudioWorkletProcessor{constructor(){super(),this.filters={},this.previousGain=1,this.gain=1,this.port.onmessage=this.onmessage.bind(this)}onmessage(e){const t=e.data;if(null!=t&&"filters"===t.type){this.gain=t.gain;for(const e of Object.values(this.filters))e.updated=!1;for(const[e,s]of Object.entries(t.filters)){if(3!==s.node.feedforward.length||3!==s.node.feedback.length){console.warn("MultiIirProcessor: Only IIR filters with three feedforward/feedback coefficients are supported. Skipping filter.");continue}if(1!==s.node.feedback[0]){const e=s.node.feedback[0];for(let t=0;t<3;t++)s.node.feedback[t]/=e,s.node.feedforward[t]/=e}const t=this.filters[e];void 0===t?this.filters[e]={updated:!0,isActive:s.isActive,channels:[],iir:s.node}:(s.isActive&&!t.isActive&&(t.channels=[]),t.updated=!0,t.isActive=s.isActive,t.iir=s.node)}for(const e of Object.values(this.filters))e.updated||(e.isActive=!1)}}process(e,s,i){const n=e[0],r=s[0];if(void 0===n||void 0===r)return console.warn("MultiIirProcessor: input or output not given"),!1;for(let e=0;e<n.length;e++){const s=n[e],i=r[e];for(let n=0;n<s.length;n++){const r=this.previousGain+(this.gain-this.previousGain)*n/s.length;let a=s[n]*r;for(const[s,i]of Object.entries(this.filters)){if(!i.isActive)continue;let s=i.channels[e];void 0===s&&(s=i.channels[e]={buf_0:0,buf_1:0,buf_2:0}),s.buf_0=t(a-(i.iir.feedback[1]??0)*s.buf_1-(i.iir.feedback[2]??0)*s.buf_2),a=i.iir.feedforward[0]*s.buf_0+i.iir.feedforward[1]*s.buf_1+i.iir.feedforward[2]*s.buf_2,s.buf_2=s.buf_1,s.buf_1=s.buf_0}i[n]=a}}return this.previousGain=this.gain,!0}}registerProcessor("multi-iir-processor",s)}customElements.define("dlf-equalizer",class extends Y{constructor(){super(),this.presets_=[],this.defaultPreset_=null,this.eqView_=null,this.handlers={onStorePreset:this.onStorePreset.bind(this)},this.context=new AudioContext,this.markAsResumed=e=>{},this.resumedPromise=new Promise(e=>{this.markAsResumed=e})}get view(){return this.eqView_}async attachToPlayer(e){"https:"!==window.location.protocol&&console.error("Warning: The equalizer will probably fail without HTTPS"),await this.resumeAudioContext();const t=new Blob([`\n ${ze.toString()}\n ${ze.name}();\n `],{type:"application/javascript; charset=utf-8"}),s=await function(e){return d(e,"readAsDataURL")}(t);await this.context.audioWorklet.addModule(s),e.media.crossOrigin="anonymous";const i=this.context.createMediaElementSource(e.media),n=new Ne(i);n.connect(this.context.destination),this.eqView_=new Ge(this.env,n),this.eqView_.addEventListener("store_preset",this.handlers.onStorePreset);for(const e of this.presets_)this.eqView_.addPreset(e);for(const[e,t]of Object.entries(this.getLocalPresets()))this.eqView_.addPreset(t);null!==this.defaultPreset_&&this.eqView_.selectPreset(this.defaultPreset_),this.innerHTML="",this.append(this.eqView_.domElement),this.eqView_.resize()}parsePresets(e){if(!Array.isArray(e))return;const t=v(e.map(Ie));if(this.presets_.push(...t),null!==this.eqView_)for(const e of t)this.eqView_.addPreset(e)}selectPreset(e){null===this.eqView_?this.defaultPreset_=e:(this.eqView_.selectPreset(e),this.defaultPreset_=null)}async resumeAudioContext(){"running"===this.context.state?this.markAsResumed():(this.append(r("div",{className:"dlf-equalizer-resume"},[this.env.t("control.sound_tools.equalizer.resume_context")])),this.context.resume().then(()=>{this.markAsResumed()})),window.addEventListener("pointerdown",async()=>{await this.context.resume(),this.markAsResumed()},{once:!0,capture:!0}),window.addEventListener("keydown",async()=>{await this.context.resume(),this.markAsResumed()},{once:!0,capture:!0}),await this.resumedPromise}onStorePreset(e){const{key:t,preset:s}=e.detail;localStorage[`dlf.eq.presets.${t}`]=JSON.stringify(s)}getLocalPresets(){const e={};for(let t=0;t<localStorage.length;t++){const s=localStorage.key(t);if(null!==s&&s.startsWith("dlf.eq.presets."))try{const t=Ie(JSON.parse(localStorage[s]));null!==t&&(e[s.substring(15)]=t)}catch(e){}}return e}}),window.SlubMediaPlayer=Pe}},s={};function i(e){var n=s[e];if(void 0!==n)return n.exports;var r=s[e]={exports:{}};return t[e](r,r.exports,i),r.exports}i.m=t,e=[],i.O=(t,s,n,r)=>{if(!s){var a=1/0;for(d=0;d<e.length;d++){s=e[d][0],n=e[d][1],r=e[d][2];for(var o=!0,l=0;l<s.length;l++)(!1&r||a>=r)&&Object.keys(i.O).every(e=>i.O[e](s[l]))?s.splice(l--,1):(o=!1,r<a&&(a=r));if(o){e.splice(d--,1);var h=n();void 0!==h&&(t=h)}}return t}r=r||0;for(var d=e.length;d>0&&e[d-1][2]>r;d--)e[d]=e[d-1];e[d]=[s,n,r]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var s in t)i.o(t,s)&&!i.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={322:0};i.O.j=t=>0===e[t];var t=(t,s)=>{var n,r,a=s[0],o=s[1],l=s[2],h=0;if(a.some(t=>0!==e[t])){for(n in o)i.o(o,n)&&(i.m[n]=o[n]);if(l)var d=l(i)}for(t&&t(s);h<a.length;h++)r=a[h],i.o(e,r)&&e[r]&&e[r][0](),e[r]=0;return i.O(d)},s=self.webpackChunkkitodo_presentation=self.webpackChunkkitodo_presentation||[];s.forEach(t.bind(null,0)),s.push=t.bind(null,s.push.bind(s))})();var n=i.O(void 0,[951],()=>i(6266));n=i.O(n)})();
//# sourceMappingURL=DlfMediaPlayer.js.map