ts-video-player 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cdn.min.js CHANGED
@@ -1,4 +1,4 @@
1
- function De(){return{src:null,sources:[],currentSourceIndex:0,mediaType:"unknown",streamType:"unknown",providerType:"unknown",loadingState:"idle",preload:"metadata",canPlay:!1,canPlayThrough:!1,error:null,playbackState:"idle",paused:!0,playing:!1,started:!1,ended:!1,seeking:!1,waiting:!1,currentTime:0,duration:0,playbackRate:1,loop:!1,autoplay:!1,playsinline:!0,muted:!1,volume:1,buffered:[],bufferedAmount:0,seekable:[],videoWidth:0,videoHeight:0,aspectRatio:1.7777777777777777,qualities:[],autoQuality:!0,audioTracks:[],textTracks:[],fullscreen:!1,pictureInPicture:!1,canFullscreen:!1,canPictureInPicture:!1,volumeAvailability:"unavailable",fullscreenAvailability:"unavailable",pipAvailability:"unavailable",controlsVisible:!0,userActive:!0,pointerOver:!1,title:"",poster:""}}class A{state;listeners=new Map;_pendingKeys=null;_flushScheduled=!1;constructor(e){this.state={...De(),...e}}getState(){return this.state}get(e){return this.state[e]}set(e,t){if(this.state[e]===t)return;this.state={...this.state,[e]:t},this.scheduleNotify(e)}batch(e){for(let[t,i]of Object.entries(e))if(this.state[t]!==i)this.state[t]=i,this.scheduleNotify(t)}subscribe(e,t){if(typeof e==="function"){if(!this.listeners.has("*"))this.listeners.set("*",new Set);return this.listeners.get("*").add(e),()=>this.listeners.get("*")?.delete(e)}let i=e;if(!t)return()=>{};if(!this.listeners.has(i))this.listeners.set(i,new Set);return this.listeners.get(i).add(t),()=>this.listeners.get(i)?.delete(t)}reset(){this.state=De(),this._pendingKeys=null,this._flushScheduled=!1,this.notifyAll()}flush(){if(this._pendingKeys){let e=this._pendingKeys;this._pendingKeys=null,this._flushScheduled=!1;for(let t of e)this.notifyKey(t);this.notifyAll()}}scheduleNotify(e){if(!this._pendingKeys)this._pendingKeys=new Set;if(this._pendingKeys.add(e),!this._flushScheduled)this._flushScheduled=!0,queueMicrotask(()=>this.flush())}notifyKey(e){this.listeners.get(e)?.forEach((t)=>t(this.state,e))}notifyAll(){this.listeners.get("*")?.forEach((e)=>e(this.state))}}function $e(e){if(e.duration===0||e.buffered.length===0)return 0;let t=0;for(let i of e.buffered)t+=i.end-i.start;return Math.min(t/e.duration,1)}var Fe="ts-video-player";function Oe(e=localStorage){try{let t=e.getItem(Fe);if(t)return JSON.parse(t)}catch{}return{}}function Lt(e,t=localStorage){try{let i=Oe(t);t.setItem(Fe,JSON.stringify({...i,...e}))}catch{}}function qe(e,t=["volume","muted","playbackRate"],i=localStorage){let n=Oe(i);if(n.volume!==void 0)e.set("volume",n.volume);if(n.muted!==void 0)e.set("muted",n.muted);if(n.playbackRate!==void 0)e.set("playbackRate",n.playbackRate);let s=t.map((r)=>e.subscribe(r,(o)=>{let a=o[r];Lt({[r]:a},i)}));return()=>s.forEach((r)=>r())}class x{listeners=new Map;onceListeners=new Map;on(e,t){if(!this.listeners.has(e))this.listeners.set(e,new Set);return this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){if(!this.onceListeners.has(e))this.onceListeners.set(e,new Set);return this.onceListeners.get(e).add(t),()=>this.onceListeners.get(e)?.delete(t)}off(e,t){this.listeners.get(e)?.delete(t),this.onceListeners.get(e)?.delete(t)}emit(e,...t){this.listeners.get(e)?.forEach((n)=>{try{n(...t)}catch(s){console.error(`[ts-video-player] Error in event handler for "${String(e)}":`,s)}});let i=this.onceListeners.get(e);if(i)i.forEach((n)=>{try{n(...t)}catch(s){console.error(`[ts-video-player] Error in once handler for "${String(e)}":`,s)}}),i.clear()}removeAllListeners(e){if(e)this.listeners.delete(e),this.onceListeners.delete(e);else this.listeners.clear(),this.onceListeners.clear()}listenerCount(e){return(this.listeners.get(e)?.size||0)+(this.onceListeners.get(e)?.size||0)}}class M{media;emitter;listeners=[];constructor(e,t){this.media=e,this.emitter=t,this.attachListeners()}attachListeners(){let e=(t,i)=>{this.media.addEventListener(t,i),this.listeners.push(()=>this.media.removeEventListener(t,i))};e("loadstart",()=>this.emitter.emit("loadstart")),e("loadedmetadata",()=>this.emitter.emit("loadedmetadata")),e("loadeddata",()=>this.emitter.emit("loadeddata")),e("canplay",()=>this.emitter.emit("canplay")),e("canplaythrough",()=>this.emitter.emit("canplaythrough")),e("play",()=>this.emitter.emit("play")),e("pause",()=>this.emitter.emit("pause")),e("playing",()=>this.emitter.emit("playing")),e("waiting",()=>this.emitter.emit("waiting")),e("ended",()=>this.emitter.emit("ended")),e("seeking",()=>this.emitter.emit("seeking")),e("seeked",()=>this.emitter.emit("seeked")),e("timeupdate",()=>this.emitter.emit("timeupdate",this.media.currentTime)),e("durationchange",()=>this.emitter.emit("durationchange",this.media.duration)),e("volumechange",()=>this.emitter.emit("volumechange",this.media.volume,this.media.muted)),e("ratechange",()=>this.emitter.emit("ratechange",this.media.playbackRate)),e("progress",()=>{let t=this.getTimeRanges(this.media.buffered);this.emitter.emit("progress",t)}),e("error",()=>{let t=this.normalizeError(this.media.error);this.emitter.emit("error",t)})}getTimeRanges(e){let t=[];for(let i=0;i<e.length;i++)t.push({start:e.start(i),end:e.end(i)});return t}normalizeError(e){if(!e)return{code:0,message:"Unknown error"};let t={1:"The fetching of the media resource was aborted by the user agent.",2:"A network error occurred while fetching the media resource.",3:"An error occurred while decoding the media resource.",4:"The media resource is not supported."};return{code:e.code,message:t[e.code]||e.message||"Unknown error"}}destroy(){this.listeners.forEach((e)=>e()),this.listeners=[]}}function q(e){let t=["fullscreenchange","webkitfullscreenchange","mozfullscreenchange","MSFullscreenChange"],i=()=>{let n=!!(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement);e(n)};return t.forEach((n)=>document.addEventListener(n,i)),()=>{t.forEach((n)=>document.removeEventListener(n,i))}}function N(e,t){let i=()=>t(!0),n=()=>t(!1);return e.addEventListener("enterpictureinpicture",i),e.addEventListener("leavepictureinpicture",n),()=>{e.removeEventListener("enterpictureinpicture",i),e.removeEventListener("leavepictureinpicture",n)}}var _t={" ":"togglePlay",k:"togglePlay",m:"toggleMute",f:"toggleFullscreen",i:"togglePiP",c:"toggleCaptions",ArrowLeft:"seekBackward",ArrowRight:"seekForward",j:"seekBackward",l:"seekForward",ArrowUp:"volumeUp",ArrowDown:"volumeDown",">":"speedUp","<":"speedDown",Home:"seekStart",End:"seekEnd","0":"seek0","1":"seek10","2":"seek20","3":"seek30","4":"seek40","5":"seek50","6":"seek60","7":"seek70","8":"seek80","9":"seek90"};function Ne(e,t={}){let{seekStep:i=5,volumeStep:n=0.1,speedStep:s=0.25}=t;return(r)=>{if(r.target instanceof HTMLInputElement||r.target instanceof HTMLTextAreaElement||r.target instanceof HTMLSelectElement||r.target?.isContentEditable)return;let o=r.key,a=_t[o];if(!a)return;switch(r.preventDefault(),a){case"togglePlay":e.togglePlay();break;case"toggleMute":e.toggleMute();break;case"toggleFullscreen":e.toggleFullscreen();break;case"togglePiP":e.togglePiP();break;case"toggleCaptions":e.toggleCaptions();break;case"seekBackward":e.seekBackward();break;case"seekForward":e.seekForward();break;case"volumeUp":e.volumeUp();break;case"volumeDown":e.volumeDown();break;case"speedUp":e.speedUp();break;case"speedDown":e.speedDown();break;case"seekStart":e.seekStart();break;case"seekEnd":e.seekEnd();break;default:if(a.startsWith("seek")){let l=parseInt(a.replace("seek",""),10);if(!isNaN(l))e.seekPercent(l)}}}}function ze(e,t={}){let{timeout:i=3000,onActive:n,onInactive:s}=t,r=null,o=!0,a=()=>{if(!o)o=!0,n?.();d()},l=()=>{if(o)o=!1,s?.()},d=()=>{if(r)clearTimeout(r);r=setTimeout(l,i)},c=["mousemove","mouseenter","mouseleave","mousedown","keydown","touchstart","touchmove"];return c.forEach((u)=>e.addEventListener(u,a)),d(),()=>{if(r)clearTimeout(r);c.forEach((u)=>e.removeEventListener(u,a))}}function Ue(){return typeof navigator<"u"&&"mediaSession"in navigator}function Qe(e,t,i){if(!Ue())return()=>{};let n=navigator.mediaSession;if(i)Ct(i);let s=[["play",()=>t.play()],["pause",()=>t.pause()],["stop",()=>t.stop()],["seekbackward",(d)=>{let c=d.seekOffset||-10;t.seekBy(c)}],["seekforward",(d)=>{let c=d.seekOffset||10;t.seekBy(c)}],["seekto",(d)=>{let c=d.seekTime;if(c!==void 0)t.seekTo(c)}]];for(let[d,c]of s)try{n.setActionHandler(d,c)}catch{}let r=e.subscribe("paused",(d)=>{n.playbackState=d.paused?"paused":"playing"}),o=null,a=()=>{let d=e.getState();if(!isFinite(d.duration)||d.duration<=0)return;try{n.setPositionState({duration:d.duration,playbackRate:d.playbackRate,position:Math.min(d.currentTime,d.duration)})}catch{}},l=e.subscribe("playing",(d)=>{if(d.playing){if(a(),!o)o=setInterval(a,1000)}else{if(o)clearInterval(o),o=null;a()}});return()=>{if(o)clearInterval(o);r(),l();for(let[d]of s)try{n.setActionHandler(d,null)}catch{}}}function Ct(e){if(!Ue())return;navigator.mediaSession.metadata=new MediaMetadata({title:e.title||"",artist:e.artist||"",album:e.album||"",artwork:e.artwork||[]})}function Ke(){return typeof screen<"u"&&"orientation"in screen&&typeof screen.orientation.lock==="function"}function We(e){if(!Ke())return;let t={landscape:"landscape",portrait:"portrait",any:"any"};screen.orientation.lock(t[e]).catch(()=>{})}function je(){if(!Ke())return;try{screen.orientation.unlock()}catch{}}function Rt(){if(typeof navigator>"u")return!1;let e=navigator.userAgent;if(/iPad|iPhone|iPod/.test(e)&&!window.MSStream)return!0;if(navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1)return!0;return!1}function Ht(){if(typeof navigator>"u")return!1;return/^(?:(?!chrome|android).)*safari/i.test(navigator.userAgent)}function Ye(){if(typeof window>"u")return!1;return navigator.standalone===!0||window.matchMedia("(display-mode: standalone)").matches}function Xe(e){if(Rt())return"unsupported";if(!e)return"unavailable";return"available"}async function Ge(e){let t=e.volume;try{let i=t===1?0.5:1;e.volume=i,await new Promise((s)=>setTimeout(s,0));let n=e.volume!==t;return e.volume=t,n?"available":"unsupported"}catch{try{e.volume=t}catch{}return"unsupported"}}function Je(e,t){let i=typeof document<"u"?document:null;if(!i)return"unsupported";if(i.fullscreenEnabled||i.webkitFullscreenEnabled)return"available";if(i.mozFullScreenEnabled||i.msFullscreenEnabled)return"available";if(t){let n=t;if(n.webkitSupportsFullscreen===!0)return"available";if(typeof n.webkitEnterFullscreen==="function")return"available"}if(!e&&!t)return"unavailable";return"unsupported"}async function Ze(e,t){let i=t;if(e){let n=e;if(typeof n.requestFullscreen==="function")return n.requestFullscreen();if(typeof n.webkitRequestFullscreen==="function")return n.webkitRequestFullscreen();if(typeof n.webkitRequestFullScreen==="function")return n.webkitRequestFullScreen()}if(i&&typeof i.webkitEnterFullscreen==="function"){i.webkitEnterFullscreen();return}if(t&&typeof t.requestFullscreen==="function")return t.requestFullscreen()}async function et(e){let t=document,i=e;if(typeof t.exitFullscreen==="function")return t.exitFullscreen();if(typeof t.webkitExitFullscreen==="function")return t.webkitExitFullscreen();if(typeof t.webkitCancelFullScreen==="function")return t.webkitCancelFullScreen();if(i&&typeof i.webkitExitFullscreen==="function")i.webkitExitFullscreen()}function tt(e){if(!e)return"unavailable";if("requestPictureInPicture"in e){if(typeof document<"u"&&document.pictureInPictureEnabled===!1)return"unavailable";if(Ht()&&Ye())return"unavailable";return"available"}let t=e;if(typeof t.webkitSetPresentationMode==="function"){if(Ye())return"unavailable";if(typeof t.webkitSupportsPresentationMode==="function")return t.webkitSupportsPresentationMode("picture-in-picture")?"available":"unsupported";return"available"}return"unsupported"}async function it(e){let t=e;if(typeof t.requestPictureInPicture==="function"){await t.requestPictureInPicture();return}if(typeof t.webkitSetPresentationMode==="function")t.webkitSetPresentationMode("picture-in-picture")}async function nt(e){if(document.pictureInPictureElement&&typeof document.exitPictureInPicture==="function"){await document.exitPictureInPicture();return}if(e){let t=e;if(t.webkitPresentationMode==="picture-in-picture"&&typeof t.webkitSetPresentationMode==="function")t.webkitSetPresentationMode("inline")}}class b{container=null;options={};events=new x;_ready=!1;get mediaElement(){return null}get ready(){return this._ready}async setup(e,t){this.container=e,this.options=t,await this.initialize(),this._ready=!0,this.events.emit("ready")}destroy(){this._ready=!1,this.cleanup(),this.events.removeAllListeners()}stop(){this.pause(),this.seekTo(0)}getQualities(){return[]}setQuality(e){}getTextTracks(){return[]}setTextTrackMode(e,t){}getAudioTracks(){return[]}setAudioTrack(e){}getFeatureAvailability(e){let t=this.mediaElement,i=t instanceof HTMLMediaElement?t:null,n=t instanceof HTMLVideoElement?t:null;switch(e){case"volume":return t&&!(t instanceof HTMLMediaElement)?"available":Xe(i);case"fullscreen":return Je(this.container,n);case"pip":return t&&!(t instanceof HTMLMediaElement)?"unsupported":tt(n);default:return"unsupported"}}async enterFullscreen(){await Ze(this.container,this.mediaElement)}async exitFullscreen(){await et(this.mediaElement)}getFullscreenElement(){return this.container}async enterPiP(){let e=this.mediaElement;if(!e)return;await it(e)}async exitPiP(){await nt(this.mediaElement)}on(e,t){this.events.on(e,t)}off(e,t){this.events.off(e,t)}emitError(e,t,i){let n={code:e,message:t,details:i};this.events.emit("error",n)}}function ve(e){if(typeof e==="string"){let t=ge(e);if(t==="mp4"||t==="webm"||t==="ogg"||t==="ogv"||t==="mov"||t==="mp3"||t==="wav"||t==="flac"||t==="m4a"||t==="aac"||t==="oga"||t==="opus")return!0;return!1}if(typeof e==="object"&&"type"in e){let t=e.type?.toLowerCase()||"";return t.startsWith("video/")||t.startsWith("audio/")||t==="application/ogg"}return!1}function ge(e){let t=e.split(/[?#]/,1)[0];return t.slice(t.lastIndexOf(".")+1).toLowerCase()}function z(e){let t=ge(e);return{mp4:"video/mp4",webm:"video/webm",ogg:"video/ogg",ogv:"video/ogg",mov:"video/quicktime",mp3:"audio/mpeg",wav:"audio/wav",flac:"audio/flac",m4a:"audio/mp4",aac:"audio/aac",oga:"audio/ogg",opus:"audio/ogg; codecs=opus"}[t||""]||"video/mp4"}class L extends b{name="html5";type="video";media=null;eventsNormalizer=null;cleanupFullscreen=null;cleanupPiP=null;isAudio=!1;get mediaElement(){return this.media}async initialize(){if(!this.container)throw Error("Container element is required");if(this.isAudio=this.options.mediaType==="audio",this.media=document.createElement(this.isAudio?"audio":"video"),this.media.className="ts-video-player__media",this.options.autoplay)this.media.autoplay=!0;if(this.options.loop)this.media.loop=!0;if(this.options.muted)this.media.muted=!0;if(this.options.playsinline&&!this.isAudio)this.media.playsInline=!0;if(this.options.preload)this.media.preload=this.options.preload;if(this.options.crossorigin)this.media.crossOrigin=this.options.crossorigin;if(this.options.controlsList?.length)this.media.setAttribute("controlslist",this.options.controlsList.join(" "));if(!this.isAudio&&this.options.disablePictureInPicture)this.media.disablePictureInPicture=!0;if(this.options.poster&&!this.isAudio)this.media.poster=this.options.poster;if(this.options.volume!==void 0)this.media.volume=this.options.volume;this.container.appendChild(this.media);for(let e of this.options.tracks??[])this.addTextTrack(e);if(this.eventsNormalizer=new M(this.media,this.events),this.cleanupFullscreen=q((e)=>{this.events.emit("fullscreenchange",e)}),!this.isAudio&&this.media instanceof HTMLVideoElement)this.cleanupPiP=N(this.media,(e)=>{this.events.emit("pipchange",e)});if(!this.isAudio)this.media.addEventListener("loadedmetadata",()=>{let e=this.media,t=this.getFeatureAvailability("fullscreen"),i=this.getFeatureAvailability("pip"),n=this.getFeatureAvailability("volume");this.events.emit("statechange",{videoWidth:e.videoWidth,videoHeight:e.videoHeight,aspectRatio:(e.videoHeight>0?e.videoWidth/e.videoHeight:0)||1.7777777777777777,canFullscreen:t==="available",canPictureInPicture:i==="available",fullscreenAvailability:t,pipAvailability:i,volumeAvailability:n}),this.events.emit("availabilitychange","fullscreen",t),this.events.emit("availabilitychange","pip",i),this.events.emit("availabilitychange","volume",n)});if(this.media.addEventListener("loadeddata",()=>{if(!this.media)return;Ge(this.media).then((e)=>{this.events.emit("statechange",{volumeAvailability:e}),this.events.emit("availabilitychange","volume",e)}).catch(()=>{})}),!this.isAudio&&this.media instanceof HTMLVideoElement)this.media.addEventListener("webkitpresentationmodechanged",()=>{let e=this.media;if(e?.webkitPresentationMode){let t=e.webkitPresentationMode==="picture-in-picture";this.events.emit("pipchange",t)}})}cleanup(){if(this.eventsNormalizer?.destroy(),this.cleanupFullscreen?.(),this.cleanupPiP?.(),this.media)this.media.pause(),this.media.removeAttribute("src"),this.media.load(),this.media.remove(),this.media=null}canPlay(e){return ve(e)}async load(e){if(!this.media)return;this.media.innerHTML="",this.media.removeAttribute("src");let t=Array.isArray(e)?e:[e];for(let i of t)if(typeof i==="string"){let n=document.createElement("source");n.src=i,n.type=z(i),this.media.appendChild(n)}else if("src"in i&&typeof i.src==="string"){let n=i,s=document.createElement("source");s.src=n.src,s.type=n.type||z(n.src),this.media.appendChild(s)}this.media.load()}async play(){if(!this.media)return;try{await this.media.play()}catch(e){if(e.name==="NotAllowedError")this.emitError(1,"Playback was blocked. User interaction required.",e);else throw e}}pause(){this.media?.pause()}seekTo(e){if(this.media)this.media.currentTime=Math.max(0,Math.min(e,this.getDuration()))}getCurrentTime(){return this.media?.currentTime||0}getDuration(){return this.media?.duration||0}setVolume(e){if(this.media)this.media.volume=Math.max(0,Math.min(1,e))}getVolume(){return this.media?.volume||1}setMuted(e){if(this.media)this.media.muted=e}getMuted(){return this.media?.muted||!1}setPlaybackRate(e){if(this.media)this.media.playbackRate=Math.max(0.25,Math.min(4,e))}getPlaybackRate(){return this.media?.playbackRate||1}getTextTracks(){if(!this.media)return[];let e=[],t=this.media.textTracks;for(let i=0;i<t.length;i++){let n=t[i];e.push({id:String(i),kind:n.kind,label:n.label||`Track ${i+1}`,language:n.language||"",mode:n.mode,cues:this.getTrackCues(n)})}return e}getTrackCues(e){if(!e.cues)return[];let t=[];for(let i=0;i<e.cues.length;i++){let n=e.cues[i];t.push({id:n.id||String(i),startTime:n.startTime,endTime:n.endTime,text:n.text})}return t}setTextTrackMode(e,t){if(!this.media)return;let i=parseInt(e,10),n=this.media.textTracks[i];if(n)n.mode=t,this.events.emit("texttrackchange",t==="showing"?this.getTextTracks()[i]:null)}getAudioTracks(){if(!this.media||this.isAudio)return[];let e=this.media;if(!("audioTracks"in e))return[];let t=e.audioTracks,i=[];for(let n=0;n<t.length;n++){let s=t[n];i.push({id:s.id||String(n),label:s.label||`Track ${n+1}`,language:s.language||"",kind:s.kind||"",selected:s.enabled})}return i}setAudioTrack(e){if(!this.media||this.isAudio)return;let t=this.media;if(!("audioTracks"in t))return;let i=t.audioTracks;for(let n=0;n<i.length;n++){let s=i[n].id===e||String(n)===e;i[n].enabled=s}this.events.emit("audiotrackchange",this.getAudioTracks().find((n)=>n.selected)||null)}addTextTrack(e){if(!this.media)return;let t=document.createElement("track");if(e.src)t.src=e.src;if(t.kind=e.kind||"subtitles",t.label=e.label||"",t.srclang=e.language||"",e.default)t.default=!0;this.media.appendChild(t)}}var fe={name:"html5",type:"video",canPlay(e){return ve(e)},mediaType(e){if(typeof e==="string"){let t=ge(e);if(["mp3","wav","flac","m4a","aac","oga","opus"].includes(t))return"audio";return"video"}if(typeof e==="object"&&"type"in e){if((e.type?.toLowerCase()||"").startsWith("audio/"))return"audio"}return"video"},async load(e,t){let i=new L;return await i.setup(e,t),i}};var It=[/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})/,/youtube\.com\/v\/([a-zA-Z0-9_-]{11})/,/youtube\.com\/shorts\/([a-zA-Z0-9_-]{11})/];function U(e){for(let t of It){let i=e.match(t);if(i)return i[1]}return null}function ye(e){if(typeof e==="string")return U(e)!==null;if(typeof e==="object"&&"type"in e)return e.type==="youtube";return!1}function Vt(e){if(typeof e==="string"){let t=U(e);if(!t)return null;let i=new URL(e,"https://youtube.com"),n=i.searchParams.get("t")||i.searchParams.get("start"),s=i.searchParams.get("end");return{videoId:t,startTime:n?st(n):void 0,endTime:s?st(s):void 0}}if(typeof e==="object"&&"type"in e&&e.type==="youtube"){let t=e;return{videoId:t.videoId||U(t.src)||"",startTime:t.startTime,endTime:t.endTime}}return null}function st(e){if(/^\d+$/.test(e))return parseInt(e,10);let t=e.match(/(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?/);if(t){let n=parseInt(t[1]||"0",10),s=parseInt(t[2]||"0",10),r=parseInt(t[3]||"0",10);return n*3600+s*60+r}let i=e.split(":").map((n)=>parseInt(n,10));if(i.length===2)return i[0]*60+i[1];if(i.length===3)return i[0]*3600+i[1]*60+i[2];return 0}class _ extends b{name="youtube";type="youtube";player=null;iframe=null;pendingVideoId=null;startTime;endTime;timeUpdateInterval=null;lastState=-1;get mediaElement(){return this.iframe}async initialize(){if(!this.container)throw Error("Container element is required");await this.loadYouTubeAPI();let e=document.createElement("div");e.id=`ts-video-player-yt-${Date.now()}`,e.className="ts-video-player__youtube",this.container.appendChild(e);let t={autoplay:this.options.autoplay?1:0,controls:0,disablekb:1,enablejsapi:1,iv_load_policy:3,modestbranding:1,playsinline:this.options.playsinline?1:0,rel:0,origin:window.location.origin};if(this.options.youtubeParams)Object.assign(t,this.options.youtubeParams);t.host="https://www.youtube-nocookie.com",this.player=new window.YT.Player(e.id,{width:"100%",height:"100%",playerVars:t,events:{onReady:()=>this.onReady(),onStateChange:(i)=>this.onStateChange(i),onError:(i)=>this.onError(i),onPlaybackQualityChange:()=>this.onQualityChange(),onPlaybackRateChange:()=>this.onRateChange()}}),this.iframe=this.player.getIframe(),this.iframe.className="ts-video-player__media"}async loadYouTubeAPI(){if(window.YT?.Player)return;return new Promise((e)=>{if(document.querySelector('script[src*="youtube.com/iframe_api"]')){let i=()=>{if(window.YT?.Player)e();else setTimeout(i,100)};i();return}let t=document.createElement("script");t.src="https://www.youtube.com/iframe_api",t.async=!0,window.onYouTubeIframeAPIReady=()=>{e()},document.head.appendChild(t)})}cleanup(){if(this.timeUpdateInterval)clearInterval(this.timeUpdateInterval),this.timeUpdateInterval=null;this.player?.destroy(),this.player=null,this.iframe=null}onReady(){if(this.timeUpdateInterval=setInterval(()=>{if(this.player&&this.lastState===1)this.events.emit("timeupdate",this.getCurrentTime())},250),this.events.emit("loadedmetadata"),this.events.emit("canplay"),this.pendingVideoId)this.loadVideo(this.pendingVideoId,this.startTime,this.endTime),this.pendingVideoId=null}onStateChange(e){let t=e.data;this.lastState=t;let i=window.YT.PlayerState;switch(t){case i.UNSTARTED:this.events.emit("loadstart");break;case i.PLAYING:this.events.emit("play"),this.events.emit("playing"),this.events.emit("statechange",{paused:!1,playing:!0,waiting:!1});break;case i.PAUSED:this.events.emit("pause"),this.events.emit("statechange",{paused:!0,playing:!1});break;case i.BUFFERING:this.events.emit("waiting"),this.events.emit("statechange",{waiting:!0});break;case i.ENDED:this.events.emit("ended"),this.events.emit("statechange",{ended:!0,playing:!1});break;case i.CUED:this.events.emit("loadeddata"),this.events.emit("durationchange",this.getDuration());break}}onError(e){let t={2:"Invalid video ID",5:"HTML5 player error",100:"Video not found or removed",101:"Video cannot be embedded",150:"Video cannot be embedded"};this.emitError(e.data,t[e.data]||"Unknown YouTube error")}onQualityChange(){let e=this.player?.getPlaybackQuality()||"auto",t=this.getQualities();this.events.emit("qualitychange",t.find((i)=>i.id===e)||null)}onRateChange(){this.events.emit("ratechange",this.getPlaybackRate())}canPlay(e){return ye(e)}async load(e){let t=Vt(e);if(!t){this.emitError(2,"Invalid YouTube source");return}if(this.startTime=t.startTime,this.endTime=t.endTime,!this.player||!this._ready){this.pendingVideoId=t.videoId;return}this.loadVideo(t.videoId,t.startTime,t.endTime)}loadVideo(e,t,i){if(!this.player)return;if(this.options.autoplay)this.player.loadVideoById({videoId:e,startSeconds:t,endSeconds:i});else this.player.cueVideoById({videoId:e,startSeconds:t,endSeconds:i})}async play(){this.player?.playVideo()}pause(){this.player?.pauseVideo()}stop(){this.player?.stopVideo()}seekTo(e){this.player?.seekTo(e,!0),this.events.emit("seeking"),setTimeout(()=>this.events.emit("seeked"),100)}getCurrentTime(){return this.player?.getCurrentTime()||0}getDuration(){return this.player?.getDuration()||0}setVolume(e){this.player?.setVolume(Math.round(e*100)),this.events.emit("volumechange",e,this.getMuted())}getVolume(){return(this.player?.getVolume()||100)/100}setMuted(e){if(e)this.player?.mute();else this.player?.unMute();this.events.emit("volumechange",this.getVolume(),e)}getMuted(){return this.player?.isMuted()||!1}setPlaybackRate(e){this.player?.setPlaybackRate(e)}getPlaybackRate(){return this.player?.getPlaybackRate()||1}getQualities(){let e=this.player?.getAvailableQualityLevels()||[],t={highres:2160,hd2160:2160,hd1440:1440,hd1080:1080,hd720:720,large:480,medium:360,small:240,tiny:144},i=this.player?.getPlaybackQuality();return e.map((n)=>({id:n,width:Math.round((t[n]||480)*1.7777777777777777),height:t[n]||480,bitrate:0,selected:n===i}))}setQuality(e){if(e==="auto")this.player?.setPlaybackQuality("default");else this.player?.setPlaybackQuality(e.id)}}var be={name:"youtube",type:"youtube",canPlay(e){return ye(e)},mediaType(){return"video"},preconnect(){return["https://www.youtube-nocookie.com","https://www.youtube.com","https://i.ytimg.com","https://s.ytimg.com"]},async load(e,t){let i=new _;return await i.setup(e,t),i}};var Bt=[/vimeo\.com\/(\d+)/,/vimeo\.com\/video\/(\d+)/,/player\.vimeo\.com\/video\/(\d+)/,/vimeo\.com\/channels\/[\w]+\/(\d+)/,/vimeo\.com\/groups\/[\w]+\/videos\/(\d+)/];function Q(e){for(let t of Bt){let i=e.match(t);if(i)return i[1]}return null}function at(e){let t=e.match(/vimeo\.com\/\d+\/([a-f0-9]+)/);return t?t[1]:null}function ke(e){if(typeof e==="string")return Q(e)!==null;if(typeof e==="object"&&"type"in e)return e.type==="vimeo";return!1}function Dt(e){if(typeof e==="string"){let t=Q(e);if(!t)return null;return{videoId:t,hash:at(e)||void 0}}if(typeof e==="object"&&"type"in e&&e.type==="vimeo"){let t=e;return{videoId:t.videoId||Q(t.src)||"",hash:t.hash}}return null}var rt="https://player.vimeo.com/api/player.js";class Te extends b{name="vimeo";type="vimeo";container_el=null;player=null;iframe=null;timeUpdateInterval=null;_qualities=[];_duration=0;get mediaElement(){return this.iframe}async initialize(){if(!this.container)throw Error("Container element is required");await this.loadVimeoSDK(),this.container_el=document.createElement("div"),this.container_el.className="ts-video-player__vimeo",this.container.appendChild(this.container_el)}async loadVimeoSDK(){if(window.Vimeo)return;return new Promise((e,t)=>{if(document.querySelector(`script[src="${rt}"]`)){let n=()=>{if(window.Vimeo)e();else setTimeout(n,100)};n();return}let i=document.createElement("script");i.src=rt,i.async=!0,i.onload=()=>e(),i.onerror=()=>t(Error("Failed to load Vimeo SDK")),document.head.appendChild(i)})}cleanup(){if(this.timeUpdateInterval)clearInterval(this.timeUpdateInterval),this.timeUpdateInterval=null;this.player?.destroy(),this.player=null,this.iframe=null,this.container_el?.remove(),this.container_el=null}canPlay(e){return ke(e)}async load(e){let t=Dt(e);if(!t||!this.container_el){this.emitError(2,"Invalid Vimeo source");return}if(this.player)await this.player.destroy(),this.player=null;let i={id:parseInt(t.videoId,10),autopause:!1,autoplay:this.options.autoplay||!1,controls:!1,loop:this.options.loop||!1,muted:this.options.muted||!1,playsinline:this.options.playsinline!==!1,responsive:!0,dnt:!0};if(this.options.vimeoParams)Object.assign(i,this.options.vimeoParams);if(this.player=new window.Vimeo.Player(this.container_el,i),await this.player.ready(),this.iframe=this.container_el.querySelector("iframe"),this.iframe)this.iframe.className="ts-video-player__media";this.attachVimeoEvents(),this.events.emit("loadedmetadata"),this.events.emit("canplay"),this._duration=await this.player.getDuration(),this.events.emit("durationchange",this._duration),await this.updateQualities();let[n,s]=await Promise.all([this.player.getVideoWidth(),this.player.getVideoHeight()]);this.events.emit("statechange",{videoWidth:n,videoHeight:s,aspectRatio:n/s||1.7777777777777777,canFullscreen:!0,canPictureInPicture:!1})}attachVimeoEvents(){if(!this.player)return;this.player.on("play",()=>{this.events.emit("play"),this.events.emit("playing"),this.events.emit("statechange",{paused:!1,playing:!0})}),this.player.on("pause",()=>{this.events.emit("pause"),this.events.emit("statechange",{paused:!0,playing:!1})}),this.player.on("ended",()=>{this.events.emit("ended"),this.events.emit("statechange",{ended:!0,playing:!1})}),this.player.on("timeupdate",(e)=>{this.events.emit("timeupdate",e.seconds)}),this.player.on("seeking",()=>{this.events.emit("seeking")}),this.player.on("seeked",()=>{this.events.emit("seeked")}),this.player.on("bufferstart",()=>{this.events.emit("waiting"),this.events.emit("statechange",{waiting:!0})}),this.player.on("bufferend",()=>{this.events.emit("statechange",{waiting:!1})}),this.player.on("progress",(e)=>{let t=[{start:0,end:e.percent*this._duration}];this.events.emit("progress",t)}),this.player.on("volumechange",async()=>{let[e,t]=await Promise.all([this.player.getVolume(),this.player.getMuted()]);this.events.emit("volumechange",e,t)}),this.player.on("playbackratechange",(e)=>{this.events.emit("ratechange",e.playbackRate)}),this.player.on("qualitychange",async()=>{await this.updateQualities();let e=this._qualities.find((t)=>t.selected);this.events.emit("qualitychange",e||null)}),this.player.on("error",(e)=>{this.emitError(5,e.message,e)})}async updateQualities(){if(!this.player)return;try{let e=await this.player.getQualities();this._qualities=e.map((t)=>{let i=t.label.match(/(\d+)p/),n=i?parseInt(i[1],10):0;return{id:t.id,width:Math.round(n*1.7777777777777777),height:n,bitrate:0,selected:t.active}}),this.events.emit("statechange",{qualities:this._qualities})}catch{}}async play(){try{await this.player?.play()}catch(e){if(e.name==="NotAllowedError")this.emitError(1,"Playback was blocked. User interaction required.",e);else throw e}}pause(){this.player?.pause()}stop(){this.pause(),this.seekTo(0)}seekTo(e){this.player?.setCurrentTime(e)}getCurrentTime(){return 0}getDuration(){return this._duration}setVolume(e){this.player?.setVolume(Math.max(0,Math.min(1,e)))}getVolume(){return 1}setMuted(e){this.player?.setMuted(e)}getMuted(){return!1}setPlaybackRate(e){this.player?.setPlaybackRate(e)}getPlaybackRate(){return 1}getQualities(){return this._qualities}setQuality(e){if(!this.player)return;if(e==="auto")this.player.setQuality("auto");else this.player.setQuality(e.id)}async enableTextTrack(e){await this.player?.enableTextTrack(e)}async disableTextTrack(){await this.player?.disableTextTrack()}async getChapters(){if(!this.player)return[];try{return await this.player.getChapters()}catch{return[]}}}var we={name:"vimeo",type:"vimeo",canPlay(e){return ke(e)},mediaType(){return"video"},preconnect(){return["https://player.vimeo.com","https://i.vimeocdn.com","https://f.vimeocdn.com"]},async load(e,t){let i=new Te;return await i.setup(e,t),i}};function Se(e){if(typeof e==="string"){let t=e.toLowerCase();return t.endsWith(".m3u8")||t.includes("application/x-mpegurl")||t.includes("application/vnd.apple.mpegurl")}if(typeof e==="object"&&"type"in e){let t=e.type?.toLowerCase()||"";return t==="application/x-mpegurl"||t==="application/vnd.apple.mpegurl"}return!1}function ot(){return document.createElement("video").canPlayType("application/vnd.apple.mpegurl")!==""}var $t="https://cdn.jsdelivr.net/npm/hls.js@latest/dist/hls.min.js";class C extends b{name="hls";type="hls";video=null;hls=null;eventsNormalizer=null;cleanupFullscreen=null;cleanupPiP=null;useNativeHLS=!1;_qualities=[];_audioTracks=[];_textTracks=[];currentQualityIndex=-1;get mediaElement(){return this.video}get canLiveSync(){return!this.useNativeHLS&&this.hls!==null}get hlsConfig(){return this.hls?.config||{}}async initialize(){if(!this.container)throw Error("Container element is required");if(this.video=document.createElement("video"),this.video.className="ts-video-player__media",this.options.autoplay)this.video.autoplay=!0;if(this.options.loop)this.video.loop=!0;if(this.options.muted)this.video.muted=!0;if(this.options.playsinline)this.video.playsInline=!0;if(this.options.preload)this.video.preload=this.options.preload;if(this.options.crossorigin)this.video.crossOrigin=this.options.crossorigin;if(this.options.poster)this.video.poster=this.options.poster;if(this.options.volume!==void 0)this.video.volume=this.options.volume;if(this.container.appendChild(this.video),this.eventsNormalizer=new M(this.video,this.events),this.cleanupFullscreen=q((e)=>{this.events.emit("fullscreenchange",e)}),this.cleanupPiP=N(this.video,(e)=>{this.events.emit("pipchange",e)}),this.useNativeHLS=ot(),!this.useNativeHLS)await this.loadHLSLibrary();this.video.addEventListener("loadedmetadata",()=>{let e=this.getFeatureAvailability("fullscreen"),t=this.getFeatureAvailability("pip"),i=this.getFeatureAvailability("volume");this.events.emit("statechange",{videoWidth:this.video.videoWidth,videoHeight:this.video.videoHeight,aspectRatio:(this.video.videoHeight>0?this.video.videoWidth/this.video.videoHeight:0)||1.7777777777777777,canFullscreen:e==="available",canPictureInPicture:t==="available",fullscreenAvailability:e,pipAvailability:t,volumeAvailability:i}),this.events.emit("availabilitychange","fullscreen",e),this.events.emit("availabilitychange","pip",t),this.events.emit("availabilitychange","volume",i)})}async loadHLSLibrary(){if(window.Hls)return;return new Promise((e,t)=>{let i=document.createElement("script");i.src=this.options.hlsCdnUrl||$t,i.async=!0,i.onload=()=>e(),i.onerror=()=>t(Error("Failed to load HLS.js")),document.head.appendChild(i)})}cleanup(){if(this.eventsNormalizer?.destroy(),this.cleanupFullscreen?.(),this.cleanupPiP?.(),this.hls)this.hls.destroy(),this.hls=null;if(this.video)this.video.pause(),this.video.removeAttribute("src"),this.video.load(),this.video.remove(),this.video=null;this._qualities=[],this._audioTracks=[],this._textTracks=[]}canPlay(e){return Se(e)}async load(e){if(!this.video)return;let t=typeof e==="string"?e:e.src;if(this.useNativeHLS){this.video.src=t,this.video.load();return}if(!window.Hls)await this.loadHLSLibrary();if(!window.Hls?.isSupported()){this.emitError(4,"HLS is not supported in this browser");return}if(this.hls)this.hls.destroy();let i={enableWorker:!0,lowLatencyMode:!1,...this.options.hlsConfig};this.hls=new window.Hls(i),this.attachHLSEvents(),this.hls.attachMedia(this.video),this.hls.loadSource(t)}attachHLSEvents(){if(!this.hls||!window.Hls)return;let e=window.Hls;this.hls.on(e.Events.MANIFEST_PARSED,(t,i)=>{if(this.updateQualities(i.levels),this.options.autoplay)this.video?.play().catch(()=>{})}),this.hls.on(e.Events.LEVEL_SWITCHED,(t,i)=>{this.currentQualityIndex=i.level,this.updateQualitySelection(),this.events.emit("qualitychange",this._qualities[i.level]||null)}),this.hls.on(e.Events.AUDIO_TRACK_LOADED,()=>{this.updateAudioTracks()}),this.hls.on(e.Events.AUDIO_TRACK_SWITCHED,()=>{this.updateAudioTracks();let t=this._audioTracks.find((i)=>i.selected);this.events.emit("audiotrackchange",t||null)}),this.hls.on(e.Events.SUBTITLE_TRACK_LOADED,()=>{this.updateTextTracks()}),this.hls.on(e.Events.ERROR,(t,i)=>{if(i.fatal)switch(i.type){case e.ErrorTypes.NETWORK_ERROR:this.hls?.startLoad();break;case e.ErrorTypes.MEDIA_ERROR:this.hls?.recoverMediaError();break;default:this.emitError(5,`HLS fatal error: ${i.details}`,i),this.hls?.destroy();break}})}updateQualities(e){this._qualities=e.map((t,i)=>({id:String(i),width:t.width,height:t.height,bitrate:t.bitrate,codec:t.codecSet||t.videoCodec||void 0,selected:i===this.currentQualityIndex})),this.events.emit("statechange",{qualities:this._qualities})}updateQualitySelection(){this._qualities=this._qualities.map((e,t)=>({...e,selected:t===this.currentQualityIndex}))}updateAudioTracks(){if(!this.hls)return;this._audioTracks=this.hls.audioTracks.map((e,t)=>({id:String(e.id),label:e.name||`Track ${t+1}`,language:e.lang||"",kind:e.default?"main":"alternative",selected:t===this.hls.audioTrack})),this.events.emit("statechange",{audioTracks:this._audioTracks})}updateTextTracks(){if(!this.hls)return;this._textTracks=this.hls.subtitleTracks.map((e,t)=>({id:String(e.id),kind:"subtitles",label:e.name||`Subtitle ${t+1}`,language:e.lang||"",mode:t===this.hls.subtitleTrack?"showing":"disabled",cues:[]})),this.events.emit("statechange",{textTracks:this._textTracks})}async play(){if(!this.video)return;try{await this.video.play()}catch(e){if(e.name==="NotAllowedError")this.emitError(1,"Playback was blocked. User interaction required.",e);else throw e}}pause(){this.video?.pause()}seekTo(e){if(this.video)this.video.currentTime=Math.max(0,Math.min(e,this.getDuration()))}getCurrentTime(){return this.video?.currentTime||0}getDuration(){return this.video?.duration||0}syncToLive(){if(this.hls?.liveSyncPosition!=null)this.seekTo(this.hls.liveSyncPosition)}setVolume(e){if(this.video)this.video.volume=Math.max(0,Math.min(1,e))}getVolume(){return this.video?.volume||1}setMuted(e){if(this.video)this.video.muted=e}getMuted(){return this.video?.muted||!1}setPlaybackRate(e){if(this.video)this.video.playbackRate=Math.max(0.25,Math.min(4,e))}getPlaybackRate(){return this.video?.playbackRate||1}getQualities(){return this._qualities}setQuality(e){if(!this.hls)return;if(e==="auto")this.hls.currentLevel=-1,this.currentQualityIndex=-1,this.events.emit("statechange",{autoQuality:!0});else{let t=parseInt(e.id,10);if(!isNaN(t)&&t>=0&&t<this._qualities.length)this.hls.currentLevel=t,this.currentQualityIndex=t,this.events.emit("statechange",{autoQuality:!1})}}getAudioTracks(){return this._audioTracks}setAudioTrack(e){if(!this.hls)return;let t=parseInt(e,10);if(!isNaN(t)&&t>=0&&t<this.hls.audioTracks.length)this.hls.audioTrack=t}getTextTracks(){return this._textTracks}setTextTrackMode(e,t){if(!this.hls)return;if(t==="showing"){let n=parseInt(e,10);if(!isNaN(n))this.hls.subtitleTrack=n}else this.hls.subtitleTrack=-1;this.updateTextTracks();let i=this._textTracks.find((n)=>n.mode==="showing");this.events.emit("texttrackchange",i||null)}}var xe={name:"hls",type:"hls",canPlay(e){return Se(e)},mediaType(){return"video"},preconnect(){return["https://cdn.jsdelivr.net"]},async load(e,t){let i=new C;return await i.setup(e,t),i}};var T=null,K=null,Ft="https://cdn.dashjs.org/latest/dash.all.min.js";async function Ot(e){if(T)return T;if(K)return K;return K=new Promise((t,i)=>{if(typeof window<"u"&&window.dashjs){T=window.dashjs,t(T);return}let n=document.createElement("script");n.src=e||Ft,n.async=!0,n.onload=()=>{T=window.dashjs,t(T)},n.onerror=()=>{i(Error("Failed to load dash.js"))},document.head.appendChild(n)}),K}function W(e){if(typeof e==="object"&&"type"in e&&e.type==="dash")return!0;if(typeof e==="string")return e.includes(".mpd")||e.includes("manifest(format=mpd");return!1}class R extends b{name="dash";type="dash";dash=null;video=null;source=null;config={};_volume=1;_muted=!1;_playbackRate=1;get mediaElement(){return this.video}async initialize(){if(this.video=document.createElement("video"),this.video.style.width="100%",this.video.style.height="100%",this.video.style.display="block",await Ot(this.options.dashCdnUrl),this.dash=T.MediaPlayer().create(),this.options.dashConfig)this.config.dashConfig=this.options.dashConfig;if(this.config.dashConfig)Object.entries(this.config.dashConfig).forEach(([e,t])=>{this.dash.updateSettings({[e]:t})});if(this.config.lowLatency)this.dash.updateSettings({streaming:{lowLatencyEnabled:!0,liveDelay:3,liveCatchUpMinDrift:0.05,liveCatchUpPlaybackRate:0.5}});if(this.attachDashEvents(),this.container)this.container.appendChild(this.video);this.attachVideoEvents()}attachVideoEvents(){if(!this.video)return;this.video.addEventListener("play",()=>this.events.emit("play")),this.video.addEventListener("pause",()=>this.events.emit("pause")),this.video.addEventListener("ended",()=>this.events.emit("ended")),this.video.addEventListener("timeupdate",()=>this.events.emit("timeupdate",this.getCurrentTime())),this.video.addEventListener("durationchange",()=>this.events.emit("durationchange",this.getDuration())),this.video.addEventListener("volumechange",()=>{this.events.emit("volumechange",this.getVolume(),this.getMuted())}),this.video.addEventListener("waiting",()=>this.events.emit("waiting")),this.video.addEventListener("playing",()=>this.events.emit("playing")),this.video.addEventListener("seeking",()=>this.events.emit("seeking")),this.video.addEventListener("seeked",()=>this.events.emit("seeked")),this.video.addEventListener("progress",()=>{let e=[];for(let t=0;t<this.video.buffered.length;t++)e.push({start:this.video.buffered.start(t),end:this.video.buffered.end(t)});this.events.emit("progress",e)}),this.video.addEventListener("loadedmetadata",()=>{this.events.emit("loadedmetadata");let e=this.getFeatureAvailability("fullscreen"),t=this.getFeatureAvailability("pip"),i=this.getFeatureAvailability("volume");this.events.emit("statechange",{videoWidth:this.video.videoWidth,videoHeight:this.video.videoHeight,aspectRatio:(this.video.videoHeight>0?this.video.videoWidth/this.video.videoHeight:0)||1.7777777777777777,canFullscreen:e==="available",canPictureInPicture:t==="available",fullscreenAvailability:e,pipAvailability:t,volumeAvailability:i}),this.events.emit("availabilitychange","fullscreen",e),this.events.emit("availabilitychange","pip",t),this.events.emit("availabilitychange","volume",i)}),this.video.addEventListener("loadeddata",()=>this.events.emit("loadeddata")),this.video.addEventListener("canplay",()=>this.events.emit("canplay")),this.video.addEventListener("canplaythrough",()=>this.events.emit("canplaythrough")),this.video.addEventListener("ratechange",()=>this.events.emit("ratechange",this.getPlaybackRate()))}attachDashEvents(){if(!T)return;let e=T.MediaPlayer;this.dash.on(e.events.QUALITY_CHANGE_RENDERED,()=>{this.events.emit("qualitychange",this.getQualities().find((t)=>t.selected)||null)}),this.dash.on(e.events.MANIFEST_LOADED,()=>{}),this.dash.on(e.events.ERROR,(t)=>{this.emitError(t.error?.code||0,t.error?.message||"DASH playback error",t.error)})}configureDRM(e){let t={};if(e.widevine)t["com.widevine.alpha"]={serverURL:e.widevine.url,httpRequestHeaders:e.widevine.headers};if(e.playready)t["com.microsoft.playready"]={serverURL:e.playready.url,httpRequestHeaders:e.playready.headers};if(e.fairplay)t["com.apple.fps.1_0"]={serverURL:e.fairplay.url,serverCertificateURL:e.fairplay.certificateUrl,httpRequestHeaders:e.fairplay.headers};this.dash.setProtectionData(t)}async load(e){if(!this.video||!this.dash)return;if(typeof e==="string")this.source={src:e,type:"dash"};else if(W(e))this.source=e;else{this.emitError(4,"Invalid DASH source");return}if(this.source.drm)this.configureDRM(this.source.drm);this.dash.initialize(this.video,this.source.src,!1)}canPlay(e){return W(e)}cleanup(){if(this.dash)this.dash.reset(),this.dash=null;if(this.video)this.video.remove(),this.video=null;this.source=null}async play(){if(!this.video)return;try{await this.video.play()}catch(e){if(e.name==="NotAllowedError")this.emitError(1,"Playback was blocked. User interaction required.",e);else throw e}}pause(){if(this.video)this.video.pause()}seekTo(e){if(this.video)this.video.currentTime=e}getCurrentTime(){return this.video?.currentTime||0}getDuration(){return this.video?.duration||0}setVolume(e){if(this._volume=Math.max(0,Math.min(1,e)),this.video)this.video.volume=this._volume}getVolume(){return this.video?.volume??this._volume}setMuted(e){if(this._muted=e,this.video)this.video.muted=e}getMuted(){return this.video?.muted??this._muted}setPlaybackRate(e){if(this._playbackRate=e,this.video)this.video.playbackRate=e}getPlaybackRate(){return this.video?.playbackRate??this._playbackRate}get isLive(){return this.dash?.isDynamic()??!1}get liveLatency(){return this.dash?.getCurrentLiveLatency()??0}get canLiveSync(){return this.isLive}syncToLive(){if(this.dash&&this.isLive)this.dash.seekToOriginalLive()}getQualities(){if(!this.dash)return[];let e=this.dash.getBitrateInfoListFor("video");if(!e)return[];let t=this.dash.getQualityFor("video");return e.map((i,n)=>({id:`${n}`,label:`${i.height}p`,width:i.width,height:i.height,bitrate:i.bitrate,selected:n===t}))}setQuality(e){if(!this.dash)return;if(e==="auto")this.dash.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:!0}}}});else{let t=Number.parseInt(e.id,10);if(!Number.isNaN(t))this.dash.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:!1}}}}),this.dash.setQualityFor("video",t)}}get isAutoQuality(){if(!this.dash)return!0;return this.dash.getSettings()?.streaming?.abr?.autoSwitchBitrate?.video??!0}getAudioTracks(){if(!this.dash)return[];let e=this.dash.getTracksFor("audio");if(!e)return[];let t=this.dash.getCurrentTrackFor("audio");return e.map((i,n)=>({id:i.id||`${n}`,label:i.labels?.[0]?.text||i.lang||`Track ${n+1}`,language:i.lang||"",kind:"main",selected:i===t}))}setAudioTrack(e){if(!this.dash)return;let i=this.dash.getTracksFor("audio").find((n,s)=>(n.id||`${s}`)===e);if(i)this.dash.setCurrentTrack(i)}getTextTracks(){if(!this.dash)return[];let e=this.dash.getTracksFor("text");if(!e)return[];let t=this.dash.getCurrentTrackFor("text");return e.map((i,n)=>({id:i.id||`${n}`,label:i.labels?.[0]?.text||i.lang||`Subtitle ${n+1}`,language:i.lang||"",kind:i.kind||"subtitles",mode:i===t?"showing":"disabled",cues:[]}))}setTextTrackMode(e,t){if(!this.dash)return;if(t==="disabled"){this.dash.enableText(!1);return}let n=this.dash.getTracksFor("text").find((s,r)=>(s.id||`${r}`)===e);if(n)this.dash.setCurrentTrack(n),this.dash.enableText(t==="showing")}}var Ee={name:"dash",type:"dash",canPlay(e){return W(e)},mediaType(){return"video"},async load(e,t){let i=new R;return await i.setup(e,t),i},preconnect(){return["https://cdn.dashjs.org"]}};var j=[xe,Ee,be,we,fe];function lt(e){if(!e||typeof e!=="object"||typeof e.src!=="string")return null;return"type"in e&&e.type?null:e.src}var qt={youtube:()=>"youtube",vimeo:()=>"vimeo",hls:()=>"application/x-mpegurl",dash:()=>"dash",video:(e)=>z(e)};function Nt(e,t){let i=lt(e),n=i&&qt[t.type];return i&&n?{...e,type:n(i)}:e}function zt(e,t=j){for(let n of t)if(n.canPlay(e))return n;let i=lt(e);if(i){for(let n of t)if(n.canPlay(i))return n}return null}function dt(e,t=j){let i=[];return e.forEach((n,s)=>{let r=zt(n,t);if(r)i.push({src:Nt(n,r),index:s,loader:r})}),i}class E{_el;_options;_store;_events=new x;_provider=null;_loaders;_cleanupFns=[];_destroyed=!1;_sourceLoadId=0;_announcer=null;constructor(e,t={}){if(typeof e==="string"){let i=document.querySelector(e);if(!i)throw Error(`Container element not found: ${e}`);this._el=i}else this._el=e;if(this._options={...Ut,...t},this._loaders=j,this._store=new A,this.setupElement(),this.setupState(),this.setupKeyboard(),this.setupActivity(),this.setupStorage(),this.setupMediaSession(),this.setupEvents(),this._options.src)this.setSrc(this._options.src);this._events.emit("init")}get el(){return this._el}get state(){return this._store.getState()}get provider(){return this._provider}get ready(){return this._provider?.ready||!1}setupElement(){this._el.classList.add("ts-video-player"),this._el.setAttribute("tabindex","0"),this._el.setAttribute("role","region"),this._el.setAttribute("aria-roledescription","video player"),this._el.setAttribute("aria-label",this._options.title||"Video player"),this._el.setAttribute("aria-keyshortcuts","Space K M F I C ArrowLeft ArrowRight J L ArrowUp ArrowDown Home End 0 1 2 3 4 5 6 7 8 9");let e=document.createElement("div");if(e.className="ts-video-player__container",this._el.appendChild(e),this._options.announcements!==!1){let i=document.createElement("div");i.className="ts-video-player__announcer",i.setAttribute("role","status"),i.setAttribute("aria-live","polite"),i.setAttribute("aria-atomic","true"),i.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",this._el.appendChild(i),this._announcer=i}let t=this._el;t.__videoPlayer=this}setupState(){this._store.batch({volume:this._options.volume??1,muted:this._options.muted??!1,loop:this._options.loop??!1,autoplay:this._options.autoplay??!1,playsinline:this._options.playsinline??!0,playbackRate:this._options.playbackRate??1,poster:this._options.poster||"",title:this._options.title||"",preload:this._options.preload||"metadata"});let e=this._store.subscribe((t)=>{this.updateAttributes(t)});this._cleanupFns.push(e)}setupKeyboard(){if(this._options.keyboard===!1)return;let e={togglePlay:()=>this.togglePlay(),toggleMute:()=>this.toggleMute(),toggleFullscreen:()=>this.toggleFullscreen(),togglePiP:()=>this.togglePiP(),toggleCaptions:()=>this.toggleCaptions(),seekBackward:()=>this.seekBy(-5),seekForward:()=>this.seekBy(5),volumeUp:()=>this.setVolume(Math.min(1,this.state.volume+0.1)),volumeDown:()=>this.setVolume(Math.max(0,this.state.volume-0.1)),speedUp:()=>this.setPlaybackRate(Math.min(4,this.state.playbackRate+0.25)),speedDown:()=>this.setPlaybackRate(Math.max(0.25,this.state.playbackRate-0.25)),seekStart:()=>this.seekTo(0),seekEnd:()=>this.seekTo(this.state.duration),seekPercent:(s)=>this.seekTo(s/100*this.state.duration)},t=typeof this._options.keyboard==="object"?this._options.keyboard:{},i=Ne(e,{seekStep:t.seekStep,volumeStep:t.volumeStep}),n=t.global?document:this._el;n.addEventListener("keydown",i),this._cleanupFns.push(()=>n.removeEventListener("keydown",i))}setupActivity(){let e=ze(this._el,{timeout:this._options.controlsTimeout||3000,onActive:()=>{this._store.batch({userActive:!0,controlsVisible:!0}),this._events.emit("useractivitychange",!0),this._events.emit("controlschange",!0)},onInactive:()=>{if(this.state.playing)this._store.batch({userActive:!1,controlsVisible:!1}),this._events.emit("useractivitychange",!1),this._events.emit("controlschange",!1)}});this._cleanupFns.push(e);let t=()=>this._store.set("pointerOver",!0),i=()=>this._store.set("pointerOver",!1);this._el.addEventListener("mouseenter",t),this._el.addEventListener("mouseleave",i),this._cleanupFns.push(()=>this._el.removeEventListener("mouseenter",t),()=>this._el.removeEventListener("mouseleave",i))}setupStorage(){if(!this._options.storage)return;let e=typeof this._options.storage==="object"?this._options.storage:{},t=e.type==="session"?sessionStorage:localStorage,i=qe(this._store,e.persist||["volume","muted","playbackRate"],t);this._cleanupFns.push(i)}setupMediaSession(){if(this._options.mediaSession===!1)return;let e=typeof this._options.mediaSession==="object"?this._options.mediaSession:this._options.title?{title:this._options.title}:void 0,t=Qe(this._store,{play:()=>this.play(),pause:()=>this.pause(),seekTo:(i)=>this.seekTo(i),seekBy:(i)=>this.seekBy(i),stop:()=>this.stop()},e);this._cleanupFns.push(t)}setupEvents(){if(this._options.on){for(let[e,t]of Object.entries(this._options.on))if(t)this.on(e,t)}}updateAttributes(e){let t=this._el;t.dataset.paused=String(e.paused),t.dataset.playing=String(e.playing),t.dataset.started=String(e.started),t.dataset.ended=String(e.ended),t.dataset.seeking=String(e.seeking),t.dataset.waiting=String(e.waiting),t.dataset.loop=String(e.loop),t.dataset.autoplay=String(e.autoplay),t.dataset.loading=String(e.waiting||e.loadingState==="loading"),t.dataset.canPlay=String(e.canPlay),t.dataset.loadingState=e.loadingState,t.setAttribute("aria-busy",String(e.waiting||e.loadingState==="loading")),t.dataset.muted=String(e.muted),t.dataset.volumeLevel=e.muted||e.volume===0?"silent":e.volume<0.5?"low":"high",t.dataset.fullscreen=String(e.fullscreen),t.dataset.pip=String(e.pictureInPicture),t.dataset.controlsVisible=String(e.controlsVisible),t.dataset.userActive=String(e.userActive),t.dataset.mediaType=e.mediaType,t.dataset.streamType=e.streamType;let i=e.textTracks.some((n)=>n.mode==="showing");t.dataset.captions=String(i),t.dataset.error=String(!!e.error)}announce(e){if(!this._announcer)return;this._announcer.textContent="",requestAnimationFrame(()=>{if(this._announcer)this._announcer.textContent=e})}destroy(){if(this._destroyed)return;this._destroyed=!0,this._sourceLoadId++,this._events.emit("destroy"),this._cleanupFns.forEach((e)=>e()),this._cleanupFns=[],this._provider?.destroy(),this._provider=null,this._events.removeAllListeners(),this._store.reset(),this._el.classList.remove("ts-video-player"),this._el.innerHTML="",delete this._el.__videoPlayer}async setSrc(e){if(this._destroyed)return;let t=++this._sourceLoadId,i=Array.isArray(e)?e:[e];if(i.length===0)return;this._store.batch({sources:i,src:i[0],loadingState:"loading",error:null}),this._events.emit("sourceschange",i);let n=dt(i,this._loaders);if(n.length===0){this._store.batch({loadingState:"error",error:{code:4,message:"No compatible provider found for source"}});return}let s;for(let r of n){if(this._destroyed||t!==this._sourceLoadId)return;let{loader:o}=r;if(this._provider&&this._provider.type!==o.type)this._provider.destroy(),this._provider=null,this._events.emit("providerchange",null);if(!this._provider){let a=this._el.querySelector(".ts-video-player__container");try{if(this._provider=await o.load(a,{...this._options,mediaType:o.mediaType(r.src)}),this._destroyed||t!==this._sourceLoadId){this._provider.destroy(),this._provider=null;return}this._events.emit("providerchange",this._provider),this.attachProviderEvents(this._provider)}catch(l){s=l,this._provider=null;continue}}try{let a=o.type==="video"?n.filter((l)=>l.loader.type===o.type).map((l)=>l.src):[r.src];if(await this._provider.load(a.length>1?a:r.src),this._destroyed||t!==this._sourceLoadId)return;this._store.batch({src:r.src,currentSourceIndex:r.index,mediaType:o.mediaType(r.src),providerType:o.type});return}catch(a){if(s=a,this._provider)this._provider.destroy(),this._provider=null;this._events.emit("providerchange",null)}}if(this._destroyed||t!==this._sourceLoadId)return;this._store.batch({loadingState:"error",error:{code:4,message:"Failed to load all compatible sources",details:s}})}getSrc(){return this.state.src}attachProviderEvents(e){e.on("loadstart",()=>{this._store.set("loadingState","loading"),this._events.emit("loadstart")}),e.on("loadedmetadata",()=>{this._events.emit("loadedmetadata")}),e.on("loadeddata",()=>{this._events.emit("loadeddata")}),e.on("canplay",()=>{this._store.batch({canPlay:!0,loadingState:"loaded"}),this._events.emit("canplay")}),e.on("canplaythrough",()=>{this._store.set("canPlayThrough",!0),this._events.emit("canplaythrough")}),e.on("play",()=>{this._store.batch({paused:!1,ended:!1}),this._events.emit("play"),this.announce("Playing")}),e.on("pause",()=>{this._store.set("paused",!0),this._events.emit("pause"),this.announce("Paused")}),e.on("playing",()=>{this._store.batch({playing:!0,started:!0,waiting:!1,playbackState:"playing"}),this._events.emit("playing")}),e.on("waiting",()=>{this._store.batch({waiting:!0,playbackState:"buffering"}),this._events.emit("waiting")}),e.on("seeking",()=>{this._store.set("seeking",!0),this._events.emit("seeking")}),e.on("seeked",()=>{this._store.set("seeking",!1),this._events.emit("seeked")}),e.on("timeupdate",(t)=>{this._store.set("currentTime",t),this._events.emit("timeupdate",t)}),e.on("durationchange",(t)=>{this._store.set("duration",t),this._events.emit("durationchange",t)}),e.on("volumechange",(t,i)=>{if(this._store.batch({volume:t,muted:i}),this._events.emit("volumechange",t,i),i)this.announce("Muted");else this.announce(`Volume ${Math.round(t*100)}%`)}),e.on("ratechange",(t)=>{this._store.set("playbackRate",t),this._events.emit("ratechange",t)}),e.on("progress",(t)=>{this._store.batch({buffered:t,bufferedAmount:$e({...this.state,buffered:t})}),this._events.emit("progress",t)}),e.on("ended",()=>{if(this._store.batch({ended:!0,playing:!1,playbackState:"ended"}),this._events.emit("ended"),this.announce("Playback ended"),this.state.loop)this.seekTo(0),this.play()}),e.on("error",(t)=>{this._store.batch({loadingState:"error",error:t}),this._events.emit("error",t),this.announce(`Error: ${t.message}`)}),e.on("statechange",(t)=>{this._store.batch(t),this._events.emit("statechange",t)}),e.on("qualitychange",(t)=>{this._store.set("qualities",e.getQualities()),this._events.emit("qualitychange",t)}),e.on("fullscreenchange",(t)=>{this._store.set("fullscreen",t),this._events.emit("fullscreenchange",t),this.announce(t?"Entered fullscreen":"Exited fullscreen")}),e.on("pipchange",(t)=>{this._store.set("pictureInPicture",t),this._events.emit("pipchange",t)}),e.on("availabilitychange",(t,i)=>{if(t==="volume")this._store.set("volumeAvailability",i);else if(t==="fullscreen")this._store.set("fullscreenAvailability",i);else if(t==="pip")this._store.set("pipAvailability",i);this._events.emit("availabilitychange",t,i)})}async play(){if(!this._provider)return;await this._provider.play()}pause(){this._provider?.pause()}togglePlay(){if(this.state.paused)this.play().catch(()=>{});else this.pause()}stop(){this._provider?.stop(),this._store.batch({playing:!1,paused:!0,currentTime:0,playbackState:"idle"})}seekTo(e){this._provider?.seekTo(e)}seekBy(e){let t=Math.max(0,Math.min(this.state.currentTime+e,this.state.duration));this.seekTo(t)}setVolume(e){if(this.state.volumeAvailability==="unsupported")return;let t=Math.max(0,Math.min(1,e));this._provider?.setVolume(t),this._store.set("volume",t)}setMuted(e){this._provider?.setMuted(e),this._store.set("muted",e)}toggleMute(){this.setMuted(!this.state.muted)}setPlaybackRate(e){let t=Math.max(0.25,Math.min(4,e));this._provider?.setPlaybackRate(t),this._store.set("playbackRate",t)}async enterFullscreen(){if(this.state.fullscreenAvailability==="unsupported")return;if(this.state.pictureInPicture)await this.exitPiP();if(await this._provider?.enterFullscreen(),this._options.fullscreenOrientationLock!==!1)We("landscape")}async exitFullscreen(){if(await this._provider?.exitFullscreen(),this._options.fullscreenOrientationLock!==!1)je()}async toggleFullscreen(){if(this.state.fullscreen)await this.exitFullscreen();else await this.enterFullscreen()}async enterPiP(){if(this.state.pipAvailability==="unsupported")return;if(this.state.fullscreen)await this.exitFullscreen();await this._provider?.enterPiP()}async exitPiP(){await this._provider?.exitPiP()}async togglePiP(){if(this.state.pictureInPicture)await this.exitPiP();else await this.enterPiP()}setQuality(e){if(this._provider?.setQuality(e),e==="auto")this._store.set("autoQuality",!0);else this._store.set("autoQuality",!1)}setTextTrack(e,t){this._provider?.setTextTrackMode(e,t),this._store.set("textTracks",this._provider?.getTextTracks()||[])}setAudioTrack(e){this._provider?.setAudioTrack(e),this._store.set("audioTracks",this._provider?.getAudioTracks()||[])}toggleCaptions(){let e=this.state.textTracks,t=e.find((i)=>i.mode==="showing");if(t)this.setTextTrack(t.id,"disabled");else{let i=e.find((n)=>n.kind==="subtitles"||n.kind==="captions");if(i)this.setTextTrack(i.id,"showing")}}on(e,t){this._events.on(e,t)}off(e,t){this._events.off(e,t)}once(e,t){this._events.once(e,t)}subscribe(e,t){return this._store.subscribe(e,t)}}var Ut={autoplay:!1,loop:!1,muted:!1,volume:1,playbackRate:1,playsinline:!0,preload:"metadata",controls:!0,keyboard:!0,controlsTimeout:3000,storage:!0};function ct(e,t){return new E(e,t)}var Qt={colors:{primary:"#00a8ff",secondary:"#6c5ce7",background:"rgba(0, 0, 0, 0.85)",text:"#ffffff",textOnPrimary:"#ffffff",border:"rgba(255, 255, 255, 0.1)",focus:"#00a8ff",error:"#ff4757",success:"#2ed573",warning:"#ffa502"},typography:{fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',fontSize:"14px",fontSizeSmall:"12px",fontSizeLarge:"16px",fontWeight:"400",fontWeightBold:"600",lineHeight:"1.5"},spacing:{xs:"4px",sm:"8px",md:"12px",lg:"16px",xl:"24px"},borderRadius:{sm:"4px",md:"8px",lg:"12px",full:"9999px"},shadows:{sm:"0 1px 2px rgba(0, 0, 0, 0.2)",md:"0 4px 6px rgba(0, 0, 0, 0.3)",lg:"0 10px 15px rgba(0, 0, 0, 0.4)"},transitions:{fast:"100ms",normal:"200ms",slow:"300ms",easing:"cubic-bezier(0.4, 0, 0.2, 1)"},slider:{trackHeight:"4px",thumbSize:"14px",trackBg:"rgba(255, 255, 255, 0.2)",trackFillBg:"var(--tsvp-color-primary)",bufferedBg:"rgba(255, 255, 255, 0.4)",thumbBg:"#ffffff",thumbBorder:"none"},controls:{height:"48px",background:"linear-gradient(transparent, rgba(0, 0, 0, 0.7))",padding:"0 12px",buttonSize:"40px",iconSize:"24px",tooltipBg:"rgba(0, 0, 0, 0.9)",tooltipText:"#ffffff"},menu:{background:"rgba(20, 20, 20, 0.95)",borderRadius:"8px",shadow:"0 4px 20px rgba(0, 0, 0, 0.5)",itemHeight:"40px",itemHoverBg:"rgba(255, 255, 255, 0.1)",itemActiveBg:"rgba(0, 168, 255, 0.2)"},captions:{fontFamily:"inherit",fontSize:"1.5em",textColor:"#ffffff",background:"rgba(0, 0, 0, 0.75)",textShadow:"0 1px 2px rgba(0, 0, 0, 0.5)",borderRadius:"4px",padding:"4px 8px"},thumbnails:{width:"160px",height:"90px",borderRadius:"4px",border:"2px solid rgba(255, 255, 255, 0.2)",shadow:"0 4px 12px rgba(0, 0, 0, 0.4)"},live:{indicatorColor:"#ff0000",indicatorSize:"8px",badgeBg:"#ff0000",badgeText:"#ffffff"}},Kt={colors:{primary:"#00a8ff",background:"rgba(0, 0, 0, 0.9)",text:"#ffffff"}},Wt={colors:{primary:"#0070f3",background:"rgba(255, 255, 255, 0.95)",text:"#1a1a1a",textOnPrimary:"#ffffff",border:"rgba(0, 0, 0, 0.1)"},controls:{background:"linear-gradient(transparent, rgba(255, 255, 255, 0.9))",tooltipBg:"rgba(0, 0, 0, 0.8)"},menu:{background:"rgba(255, 255, 255, 0.98)",shadow:"0 4px 20px rgba(0, 0, 0, 0.15)",itemHoverBg:"rgba(0, 0, 0, 0.05)",itemActiveBg:"rgba(0, 112, 243, 0.1)"},captions:{background:"rgba(255, 255, 255, 0.9)",textColor:"#1a1a1a"}},jt={colors:{primary:"#ffffff",background:"transparent"},controls:{height:"40px",background:"transparent"},slider:{trackHeight:"2px",thumbSize:"10px"}},Yt={colors:{primary:"#e50914",background:"rgba(0, 0, 0, 0.85)"},slider:{trackFillBg:"#e50914"},live:{indicatorColor:"#e50914",badgeBg:"#e50914"}},Xt={colors:{primary:"#ff0000",background:"rgba(0, 0, 0, 0.85)"},slider:{trackHeight:"3px",thumbSize:"13px",trackFillBg:"#ff0000"},controls:{height:"48px"},live:{indicatorColor:"#ff0000",badgeBg:"#ff0000"}},Gt={colors:{primary:"#00adef",background:"rgba(0, 0, 0, 0.85)"},slider:{trackFillBg:"#00adef"}},Pe={dark:Kt,light:Wt,minimal:jt,netflix:Yt,youtube:Xt,vimeo:Gt};function Jt(e,t){let i={...e};for(let n of Object.keys(t)){let s=e[n],r=t[n];if(r&&typeof r==="object")i[n]={...s||{},...r};else if(r!==void 0)i[n]=r}return i}function Zt(e,t="tsvp"){let i=Jt(Qt,e),n=[];if(i.colors)n.push(`--${t}-color-primary: ${i.colors.primary};`),n.push(`--${t}-color-secondary: ${i.colors.secondary};`),n.push(`--${t}-color-background: ${i.colors.background};`),n.push(`--${t}-color-text: ${i.colors.text};`),n.push(`--${t}-color-text-on-primary: ${i.colors.textOnPrimary};`),n.push(`--${t}-color-border: ${i.colors.border};`),n.push(`--${t}-color-focus: ${i.colors.focus};`),n.push(`--${t}-color-error: ${i.colors.error};`),n.push(`--${t}-color-success: ${i.colors.success};`),n.push(`--${t}-color-warning: ${i.colors.warning};`);if(i.typography)n.push(`--${t}-font-family: ${i.typography.fontFamily};`),n.push(`--${t}-font-size: ${i.typography.fontSize};`),n.push(`--${t}-font-size-sm: ${i.typography.fontSizeSmall};`),n.push(`--${t}-font-size-lg: ${i.typography.fontSizeLarge};`),n.push(`--${t}-font-weight: ${i.typography.fontWeight};`),n.push(`--${t}-font-weight-bold: ${i.typography.fontWeightBold};`),n.push(`--${t}-line-height: ${i.typography.lineHeight};`);if(i.spacing)n.push(`--${t}-spacing-xs: ${i.spacing.xs};`),n.push(`--${t}-spacing-sm: ${i.spacing.sm};`),n.push(`--${t}-spacing-md: ${i.spacing.md};`),n.push(`--${t}-spacing-lg: ${i.spacing.lg};`),n.push(`--${t}-spacing-xl: ${i.spacing.xl};`);if(i.borderRadius)n.push(`--${t}-radius-sm: ${i.borderRadius.sm};`),n.push(`--${t}-radius-md: ${i.borderRadius.md};`),n.push(`--${t}-radius-lg: ${i.borderRadius.lg};`),n.push(`--${t}-radius-full: ${i.borderRadius.full};`);if(i.shadows)n.push(`--${t}-shadow-sm: ${i.shadows.sm};`),n.push(`--${t}-shadow-md: ${i.shadows.md};`),n.push(`--${t}-shadow-lg: ${i.shadows.lg};`);if(i.transitions)n.push(`--${t}-transition-fast: ${i.transitions.fast};`),n.push(`--${t}-transition-normal: ${i.transitions.normal};`),n.push(`--${t}-transition-slow: ${i.transitions.slow};`),n.push(`--${t}-transition-easing: ${i.transitions.easing};`);if(i.slider)n.push(`--${t}-slider-track-height: ${i.slider.trackHeight};`),n.push(`--${t}-slider-thumb-size: ${i.slider.thumbSize};`),n.push(`--${t}-slider-track-bg: ${i.slider.trackBg};`),n.push(`--${t}-slider-track-fill-bg: ${i.slider.trackFillBg};`),n.push(`--${t}-slider-buffered-bg: ${i.slider.bufferedBg};`),n.push(`--${t}-slider-thumb-bg: ${i.slider.thumbBg};`),n.push(`--${t}-slider-thumb-border: ${i.slider.thumbBorder};`);if(i.controls)n.push(`--${t}-controls-height: ${i.controls.height};`),n.push(`--${t}-controls-bg: ${i.controls.background};`),n.push(`--${t}-controls-padding: ${i.controls.padding};`),n.push(`--${t}-controls-button-size: ${i.controls.buttonSize};`),n.push(`--${t}-controls-icon-size: ${i.controls.iconSize};`),n.push(`--${t}-controls-tooltip-bg: ${i.controls.tooltipBg};`),n.push(`--${t}-controls-tooltip-text: ${i.controls.tooltipText};`);if(i.menu)n.push(`--${t}-menu-bg: ${i.menu.background};`),n.push(`--${t}-menu-radius: ${i.menu.borderRadius};`),n.push(`--${t}-menu-shadow: ${i.menu.shadow};`),n.push(`--${t}-menu-item-height: ${i.menu.itemHeight};`),n.push(`--${t}-menu-item-hover-bg: ${i.menu.itemHoverBg};`),n.push(`--${t}-menu-item-active-bg: ${i.menu.itemActiveBg};`);if(i.captions)n.push(`--${t}-captions-font-family: ${i.captions.fontFamily};`),n.push(`--${t}-captions-font-size: ${i.captions.fontSize};`),n.push(`--${t}-captions-text-color: ${i.captions.textColor};`),n.push(`--${t}-captions-bg: ${i.captions.background};`),n.push(`--${t}-captions-text-shadow: ${i.captions.textShadow};`),n.push(`--${t}-captions-radius: ${i.captions.borderRadius};`),n.push(`--${t}-captions-padding: ${i.captions.padding};`);if(i.thumbnails)n.push(`--${t}-thumbnail-width: ${i.thumbnails.width};`),n.push(`--${t}-thumbnail-height: ${i.thumbnails.height};`),n.push(`--${t}-thumbnail-radius: ${i.thumbnails.borderRadius};`),n.push(`--${t}-thumbnail-border: ${i.thumbnails.border};`),n.push(`--${t}-thumbnail-shadow: ${i.thumbnails.shadow};`);if(i.live)n.push(`--${t}-live-indicator-color: ${i.live.indicatorColor};`),n.push(`--${t}-live-indicator-size: ${i.live.indicatorSize};`),n.push(`--${t}-live-badge-bg: ${i.live.badgeBg};`),n.push(`--${t}-live-badge-text: ${i.live.badgeText};`);return n.join(`
1
+ function De(){return{src:null,sources:[],currentSourceIndex:0,mediaType:"unknown",streamType:"unknown",providerType:"unknown",loadingState:"idle",preload:"metadata",canPlay:!1,canPlayThrough:!1,error:null,playbackState:"idle",paused:!0,playing:!1,started:!1,ended:!1,seeking:!1,waiting:!1,currentTime:0,duration:0,playbackRate:1,loop:!1,autoplay:!1,playsinline:!0,muted:!1,volume:1,buffered:[],bufferedAmount:0,seekable:[],videoWidth:0,videoHeight:0,aspectRatio:1.7777777777777777,qualities:[],autoQuality:!0,audioTracks:[],textTracks:[],fullscreen:!1,pictureInPicture:!1,canFullscreen:!1,canPictureInPicture:!1,volumeAvailability:"unavailable",fullscreenAvailability:"unavailable",pipAvailability:"unavailable",controlsVisible:!0,userActive:!0,pointerOver:!1,title:"",poster:""}}class A{state;listeners=new Map;_pendingKeys=null;_flushScheduled=!1;constructor(e){this.state={...De(),...e}}getState(){return this.state}get(e){return this.state[e]}set(e,t){if(this.state[e]===t)return;this.state={...this.state,[e]:t},this.scheduleNotify(e)}batch(e){for(let[t,i]of Object.entries(e))if(this.state[t]!==i)this.state[t]=i,this.scheduleNotify(t)}subscribe(e,t){if(typeof e==="function"){if(!this.listeners.has("*"))this.listeners.set("*",new Set);return this.listeners.get("*").add(e),()=>this.listeners.get("*")?.delete(e)}let i=e;if(!t)return()=>{};if(!this.listeners.has(i))this.listeners.set(i,new Set);return this.listeners.get(i).add(t),()=>this.listeners.get(i)?.delete(t)}reset(){this.state=De(),this._pendingKeys=null,this._flushScheduled=!1,this.notifyAll()}flush(){if(this._pendingKeys){let e=this._pendingKeys;this._pendingKeys=null,this._flushScheduled=!1;for(let t of e)this.notifyKey(t);this.notifyAll()}}scheduleNotify(e){if(!this._pendingKeys)this._pendingKeys=new Set;if(this._pendingKeys.add(e),!this._flushScheduled)this._flushScheduled=!0,queueMicrotask(()=>this.flush())}notifyKey(e){this.listeners.get(e)?.forEach((t)=>t(this.state,e))}notifyAll(){this.listeners.get("*")?.forEach((e)=>e(this.state))}}function $e(e){if(e.duration===0||e.buffered.length===0)return 0;let t=0;for(let i of e.buffered)t+=i.end-i.start;return Math.min(t/e.duration,1)}var Fe="ts-video-player";function Oe(e=localStorage){try{let t=e.getItem(Fe);if(t)return JSON.parse(t)}catch{}return{}}function Lt(e,t=localStorage){try{let i=Oe(t);t.setItem(Fe,JSON.stringify({...i,...e}))}catch{}}function qe(e,t=["volume","muted","playbackRate"],i=localStorage){let n=Oe(i);if(n.volume!==void 0)e.set("volume",n.volume);if(n.muted!==void 0)e.set("muted",n.muted);if(n.playbackRate!==void 0)e.set("playbackRate",n.playbackRate);let s=t.map((r)=>e.subscribe(r,(o)=>{let a=o[r];Lt({[r]:a},i)}));return()=>s.forEach((r)=>r())}class x{listeners=new Map;onceListeners=new Map;on(e,t){if(!this.listeners.has(e))this.listeners.set(e,new Set);return this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){if(!this.onceListeners.has(e))this.onceListeners.set(e,new Set);return this.onceListeners.get(e).add(t),()=>this.onceListeners.get(e)?.delete(t)}off(e,t){this.listeners.get(e)?.delete(t),this.onceListeners.get(e)?.delete(t)}emit(e,...t){this.listeners.get(e)?.forEach((n)=>{try{n(...t)}catch(s){console.error(`[ts-video-player] Error in event handler for "${String(e)}":`,s)}});let i=this.onceListeners.get(e);if(i)i.forEach((n)=>{try{n(...t)}catch(s){console.error(`[ts-video-player] Error in once handler for "${String(e)}":`,s)}}),i.clear()}removeAllListeners(e){if(e)this.listeners.delete(e),this.onceListeners.delete(e);else this.listeners.clear(),this.onceListeners.clear()}listenerCount(e){return(this.listeners.get(e)?.size||0)+(this.onceListeners.get(e)?.size||0)}}class M{media;emitter;listeners=[];constructor(e,t){this.media=e,this.emitter=t,this.attachListeners()}attachListeners(){let e=(t,i)=>{this.media.addEventListener(t,i),this.listeners.push(()=>this.media.removeEventListener(t,i))};e("loadstart",()=>this.emitter.emit("loadstart")),e("loadedmetadata",()=>this.emitter.emit("loadedmetadata")),e("loadeddata",()=>this.emitter.emit("loadeddata")),e("canplay",()=>this.emitter.emit("canplay")),e("canplaythrough",()=>this.emitter.emit("canplaythrough")),e("play",()=>this.emitter.emit("play")),e("pause",()=>this.emitter.emit("pause")),e("playing",()=>this.emitter.emit("playing")),e("waiting",()=>this.emitter.emit("waiting")),e("ended",()=>this.emitter.emit("ended")),e("seeking",()=>this.emitter.emit("seeking")),e("seeked",()=>this.emitter.emit("seeked")),e("timeupdate",()=>this.emitter.emit("timeupdate",this.media.currentTime)),e("durationchange",()=>this.emitter.emit("durationchange",this.media.duration)),e("volumechange",()=>this.emitter.emit("volumechange",this.media.volume,this.media.muted)),e("ratechange",()=>this.emitter.emit("ratechange",this.media.playbackRate)),e("progress",()=>{let t=this.getTimeRanges(this.media.buffered);this.emitter.emit("progress",t)}),e("error",()=>{let t=this.normalizeError(this.media.error);this.emitter.emit("error",t)})}getTimeRanges(e){let t=[];for(let i=0;i<e.length;i++)t.push({start:e.start(i),end:e.end(i)});return t}normalizeError(e){if(!e)return{code:0,message:"Unknown error"};let t={1:"The fetching of the media resource was aborted by the user agent.",2:"A network error occurred while fetching the media resource.",3:"An error occurred while decoding the media resource.",4:"The media resource is not supported."};return{code:e.code,message:t[e.code]||e.message||"Unknown error"}}destroy(){this.listeners.forEach((e)=>e()),this.listeners=[]}}function q(e){let t=["fullscreenchange","webkitfullscreenchange","mozfullscreenchange","MSFullscreenChange"],i=()=>{let n=!!(document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement);e(n)};return t.forEach((n)=>document.addEventListener(n,i)),()=>{t.forEach((n)=>document.removeEventListener(n,i))}}function N(e,t){let i=()=>t(!0),n=()=>t(!1);return e.addEventListener("enterpictureinpicture",i),e.addEventListener("leavepictureinpicture",n),()=>{e.removeEventListener("enterpictureinpicture",i),e.removeEventListener("leavepictureinpicture",n)}}var _t={" ":"togglePlay",k:"togglePlay",m:"toggleMute",f:"toggleFullscreen",i:"togglePiP",c:"toggleCaptions",ArrowLeft:"seekBackward",ArrowRight:"seekForward",j:"seekBackward",l:"seekForward",ArrowUp:"volumeUp",ArrowDown:"volumeDown",">":"speedUp","<":"speedDown",Home:"seekStart",End:"seekEnd","0":"seek0","1":"seek10","2":"seek20","3":"seek30","4":"seek40","5":"seek50","6":"seek60","7":"seek70","8":"seek80","9":"seek90"};function Ne(e,t={}){let{seekStep:i=5,volumeStep:n=0.1,speedStep:s=0.25}=t;return(r)=>{if(r.target instanceof HTMLInputElement||r.target instanceof HTMLTextAreaElement||r.target instanceof HTMLSelectElement||r.target?.isContentEditable)return;let o=r.key,a=_t[o];if(!a)return;switch(r.preventDefault(),a){case"togglePlay":e.togglePlay();break;case"toggleMute":e.toggleMute();break;case"toggleFullscreen":e.toggleFullscreen();break;case"togglePiP":e.togglePiP();break;case"toggleCaptions":e.toggleCaptions();break;case"seekBackward":e.seekBackward();break;case"seekForward":e.seekForward();break;case"volumeUp":e.volumeUp();break;case"volumeDown":e.volumeDown();break;case"speedUp":e.speedUp();break;case"speedDown":e.speedDown();break;case"seekStart":e.seekStart();break;case"seekEnd":e.seekEnd();break;default:if(a.startsWith("seek")){let l=parseInt(a.replace("seek",""),10);if(!isNaN(l))e.seekPercent(l)}}}}function ze(e,t={}){let{timeout:i=3000,onActive:n,onInactive:s}=t,r=null,o=!0,a=()=>{if(!o)o=!0,n?.();d()},l=()=>{if(o)o=!1,s?.()},d=()=>{if(r)clearTimeout(r);r=setTimeout(l,i)},c=["mousemove","mouseenter","mouseleave","mousedown","keydown","touchstart","touchmove"];return c.forEach((u)=>e.addEventListener(u,a)),d(),()=>{if(r)clearTimeout(r);c.forEach((u)=>e.removeEventListener(u,a))}}function Ue(){return typeof navigator<"u"&&"mediaSession"in navigator}function Qe(e,t,i){if(!Ue())return()=>{};let n=navigator.mediaSession;if(i)Ct(i);let s=[["play",()=>t.play()],["pause",()=>t.pause()],["stop",()=>t.stop()],["seekbackward",(d)=>{let c=d.seekOffset||-10;t.seekBy(c)}],["seekforward",(d)=>{let c=d.seekOffset||10;t.seekBy(c)}],["seekto",(d)=>{let c=d.seekTime;if(c!==void 0)t.seekTo(c)}]];for(let[d,c]of s)try{n.setActionHandler(d,c)}catch{}let r=e.subscribe("paused",(d)=>{n.playbackState=d.paused?"paused":"playing"}),o=null,a=()=>{let d=e.getState();if(!isFinite(d.duration)||d.duration<=0)return;try{n.setPositionState({duration:d.duration,playbackRate:d.playbackRate,position:Math.min(d.currentTime,d.duration)})}catch{}},l=e.subscribe("playing",(d)=>{if(d.playing){if(a(),!o)o=setInterval(a,1000)}else{if(o)clearInterval(o),o=null;a()}});return()=>{if(o)clearInterval(o);r(),l();for(let[d]of s)try{n.setActionHandler(d,null)}catch{}}}function Ct(e){if(!Ue())return;navigator.mediaSession.metadata=new MediaMetadata({title:e.title||"",artist:e.artist||"",album:e.album||"",artwork:e.artwork||[]})}function Ke(){return typeof screen<"u"&&"orientation"in screen&&typeof screen.orientation.lock==="function"}function We(e){if(!Ke())return;let t={landscape:"landscape",portrait:"portrait",any:"any"};screen.orientation.lock(t[e]).catch(()=>{})}function je(){if(!Ke())return;try{screen.orientation.unlock()}catch{}}function Rt(){if(typeof navigator>"u")return!1;let e=navigator.userAgent;if(/iPad|iPhone|iPod/.test(e)&&!window.MSStream)return!0;if(navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1)return!0;return!1}function Ht(){if(typeof navigator>"u")return!1;return/^(?:(?!chrome|android).)*safari/i.test(navigator.userAgent)}function Ye(){if(typeof window>"u")return!1;return navigator.standalone===!0||window.matchMedia("(display-mode: standalone)").matches}function Xe(e){if(Rt())return"unsupported";if(!e)return"unavailable";return"available"}async function Ge(e){let t=e.volume;try{let i=t===1?0.5:1;e.volume=i,await new Promise((s)=>setTimeout(s,0));let n=e.volume!==t;return e.volume=t,n?"available":"unsupported"}catch{try{e.volume=t}catch{}return"unsupported"}}function Je(e,t){let i=typeof document<"u"?document:null;if(!i)return"unsupported";if(i.fullscreenEnabled||i.webkitFullscreenEnabled)return"available";if(i.mozFullScreenEnabled||i.msFullscreenEnabled)return"available";if(t){let n=t;if(n.webkitSupportsFullscreen===!0)return"available";if(typeof n.webkitEnterFullscreen==="function")return"available"}if(!e&&!t)return"unavailable";return"unsupported"}async function Ze(e,t){let i=t;if(e){let n=e;if(typeof n.requestFullscreen==="function")return n.requestFullscreen();if(typeof n.webkitRequestFullscreen==="function")return n.webkitRequestFullscreen();if(typeof n.webkitRequestFullScreen==="function")return n.webkitRequestFullScreen()}if(i&&typeof i.webkitEnterFullscreen==="function"){i.webkitEnterFullscreen();return}if(t&&typeof t.requestFullscreen==="function")return t.requestFullscreen()}async function et(e){let t=document,i=e;if(typeof t.exitFullscreen==="function")return t.exitFullscreen();if(typeof t.webkitExitFullscreen==="function")return t.webkitExitFullscreen();if(typeof t.webkitCancelFullScreen==="function")return t.webkitCancelFullScreen();if(i&&typeof i.webkitExitFullscreen==="function")i.webkitExitFullscreen()}function tt(e){if(!e)return"unavailable";if("requestPictureInPicture"in e){if(typeof document<"u"&&document.pictureInPictureEnabled===!1)return"unavailable";if(Ht()&&Ye())return"unavailable";return"available"}let t=e;if(typeof t.webkitSetPresentationMode==="function"){if(Ye())return"unavailable";if(typeof t.webkitSupportsPresentationMode==="function")return t.webkitSupportsPresentationMode("picture-in-picture")?"available":"unsupported";return"available"}return"unsupported"}async function it(e){let t=e;if(typeof t.requestPictureInPicture==="function"){await t.requestPictureInPicture();return}if(typeof t.webkitSetPresentationMode==="function")t.webkitSetPresentationMode("picture-in-picture")}async function nt(e){if(document.pictureInPictureElement&&typeof document.exitPictureInPicture==="function"){await document.exitPictureInPicture();return}if(e){let t=e;if(t.webkitPresentationMode==="picture-in-picture"&&typeof t.webkitSetPresentationMode==="function")t.webkitSetPresentationMode("inline")}}class b{container=null;options={};events=new x;_ready=!1;get mediaElement(){return null}get ready(){return this._ready}async setup(e,t){this.container=e,this.options=t,await this.initialize(),this._ready=!0,this.events.emit("ready")}destroy(){this._ready=!1,this.cleanup(),this.events.removeAllListeners()}stop(){this.pause(),this.seekTo(0)}getQualities(){return[]}setQuality(e){}getTextTracks(){return[]}setTextTrackMode(e,t){}getAudioTracks(){return[]}setAudioTrack(e){}getFeatureAvailability(e){let t=this.mediaElement,i=t instanceof HTMLMediaElement?t:null,n=t instanceof HTMLVideoElement?t:null;switch(e){case"volume":return t&&!(t instanceof HTMLMediaElement)?"available":Xe(i);case"fullscreen":return Je(this.container,n);case"pip":return t&&!(t instanceof HTMLMediaElement)?"unsupported":tt(n);default:return"unsupported"}}async enterFullscreen(){await Ze(this.container,this.mediaElement)}async exitFullscreen(){await et(this.mediaElement)}getFullscreenElement(){return this.container}async enterPiP(){let e=this.mediaElement;if(!e)return;await it(e)}async exitPiP(){await nt(this.mediaElement)}on(e,t){this.events.on(e,t)}off(e,t){this.events.off(e,t)}emitError(e,t,i){let n={code:e,message:t,details:i};this.events.emit("error",n)}}function ve(e){if(typeof e==="string"){let t=ge(e);if(t==="mp4"||t==="webm"||t==="ogg"||t==="ogv"||t==="mov"||t==="mp3"||t==="wav"||t==="flac"||t==="m4a"||t==="aac"||t==="oga"||t==="opus")return!0;return!1}if(typeof e==="object"&&"type"in e){let t=e.type?.toLowerCase()||"";return t.startsWith("video/")||t.startsWith("audio/")||t==="application/ogg"}return!1}function ge(e){let t=e.split(/[?#]/,1)[0];return t.slice(t.lastIndexOf(".")+1).toLowerCase()}function z(e){let t=ge(e);return{mp4:"video/mp4",webm:"video/webm",ogg:"video/ogg",ogv:"video/ogg",mov:"video/quicktime",mp3:"audio/mpeg",wav:"audio/wav",flac:"audio/flac",m4a:"audio/mp4",aac:"audio/aac",oga:"audio/ogg",opus:"audio/ogg; codecs=opus"}[t||""]||"video/mp4"}class L extends b{name="html5";type="video";media=null;eventsNormalizer=null;cleanupFullscreen=null;cleanupPiP=null;isAudio=!1;get mediaElement(){return this.media}async initialize(){if(!this.container)throw Error("Container element is required");if(this.isAudio=this.options.mediaType==="audio",this.media=document.createElement(this.isAudio?"audio":"video"),this.media.className="ts-video-player__media",this.options.autoplay)this.media.autoplay=!0;if(this.options.loop)this.media.loop=!0;if(this.options.muted)this.media.muted=!0;if(this.options.playsinline&&!this.isAudio)this.media.playsInline=!0;if(this.options.preload)this.media.preload=this.options.preload;if(this.options.crossorigin)this.media.crossOrigin=this.options.crossorigin;if(this.options.controlsList?.length)this.media.setAttribute("controlslist",this.options.controlsList.join(" "));if(!this.isAudio&&this.options.disablePictureInPicture)this.media.disablePictureInPicture=!0;if(this.options.poster&&!this.isAudio)this.media.poster=this.options.poster;if(this.options.volume!==void 0)this.media.volume=this.options.volume;this.container.appendChild(this.media);for(let e of this.options.tracks??[])this.addTextTrack(e);if(this.eventsNormalizer=new M(this.media,this.events),this.cleanupFullscreen=q((e)=>{this.events.emit("fullscreenchange",e)}),!this.isAudio&&this.media instanceof HTMLVideoElement)this.cleanupPiP=N(this.media,(e)=>{this.events.emit("pipchange",e)});if(!this.isAudio)this.media.addEventListener("loadedmetadata",()=>{let e=this.media,t=this.getFeatureAvailability("fullscreen"),i=this.getFeatureAvailability("pip"),n=this.getFeatureAvailability("volume");this.events.emit("statechange",{videoWidth:e.videoWidth,videoHeight:e.videoHeight,aspectRatio:(e.videoHeight>0?e.videoWidth/e.videoHeight:0)||1.7777777777777777,canFullscreen:t==="available",canPictureInPicture:i==="available",fullscreenAvailability:t,pipAvailability:i,volumeAvailability:n}),this.events.emit("availabilitychange","fullscreen",t),this.events.emit("availabilitychange","pip",i),this.events.emit("availabilitychange","volume",n)});if(this.media.addEventListener("loadeddata",()=>{if(!this.media)return;Ge(this.media).then((e)=>{this.events.emit("statechange",{volumeAvailability:e}),this.events.emit("availabilitychange","volume",e)}).catch(()=>{})}),!this.isAudio&&this.media instanceof HTMLVideoElement)this.media.addEventListener("webkitpresentationmodechanged",()=>{let e=this.media;if(e?.webkitPresentationMode){let t=e.webkitPresentationMode==="picture-in-picture";this.events.emit("pipchange",t)}})}cleanup(){if(this.eventsNormalizer?.destroy(),this.cleanupFullscreen?.(),this.cleanupPiP?.(),this.media)this.media.pause(),this.media.removeAttribute("src"),this.media.load(),this.media.remove(),this.media=null}canPlay(e){return ve(e)}async load(e){if(!this.media)return;this.media.innerHTML="",this.media.removeAttribute("src");let t=Array.isArray(e)?e:[e];for(let i of t)if(typeof i==="string"){let n=document.createElement("source");n.src=i,n.type=z(i),this.media.appendChild(n)}else if("src"in i&&typeof i.src==="string"){let n=i,s=document.createElement("source");s.src=n.src,s.type=n.type||z(n.src),this.media.appendChild(s)}this.media.load()}async play(){if(!this.media)return;try{await this.media.play()}catch(e){if(e.name==="NotAllowedError")this.emitError(1,"Playback was blocked. User interaction required.",e);else throw e}}pause(){this.media?.pause()}seekTo(e){if(this.media)this.media.currentTime=Math.max(0,Math.min(e,this.getDuration()))}getCurrentTime(){return this.media?.currentTime||0}getDuration(){return this.media?.duration||0}setVolume(e){if(this.media)this.media.volume=Math.max(0,Math.min(1,e))}getVolume(){return this.media?.volume||1}setMuted(e){if(this.media)this.media.muted=e}getMuted(){return this.media?.muted||!1}setPlaybackRate(e){if(this.media)this.media.playbackRate=Math.max(0.25,Math.min(4,e))}getPlaybackRate(){return this.media?.playbackRate||1}getTextTracks(){if(!this.media)return[];let e=[],t=this.media.textTracks;for(let i=0;i<t.length;i++){let n=t[i];e.push({id:String(i),kind:n.kind,label:n.label||`Track ${i+1}`,language:n.language||"",mode:n.mode,cues:this.getTrackCues(n)})}return e}getTrackCues(e){if(!e.cues)return[];let t=[];for(let i=0;i<e.cues.length;i++){let n=e.cues[i];t.push({id:n.id||String(i),startTime:n.startTime,endTime:n.endTime,text:n.text})}return t}setTextTrackMode(e,t){if(!this.media)return;let i=parseInt(e,10),n=this.media.textTracks[i];if(n)n.mode=t,this.events.emit("texttrackchange",t==="showing"?this.getTextTracks()[i]:null)}getAudioTracks(){if(!this.media||this.isAudio)return[];let e=this.media;if(!("audioTracks"in e))return[];let t=e.audioTracks,i=[];for(let n=0;n<t.length;n++){let s=t[n];i.push({id:s.id||String(n),label:s.label||`Track ${n+1}`,language:s.language||"",kind:s.kind||"",selected:s.enabled})}return i}setAudioTrack(e){if(!this.media||this.isAudio)return;let t=this.media;if(!("audioTracks"in t))return;let i=t.audioTracks;for(let n=0;n<i.length;n++){let s=i[n].id===e||String(n)===e;i[n].enabled=s}this.events.emit("audiotrackchange",this.getAudioTracks().find((n)=>n.selected)||null)}addTextTrack(e){if(!this.media)return;let t=document.createElement("track");if(e.src)t.src=e.src;if(t.kind=e.kind||"subtitles",t.label=e.label||"",t.srclang=e.language||"",e.default)t.default=!0;this.media.appendChild(t)}}var fe={name:"html5",type:"video",canPlay(e){return ve(e)},mediaType(e){if(typeof e==="string"){let t=ge(e);if(["mp3","wav","flac","m4a","aac","oga","opus"].includes(t))return"audio";return"video"}if(typeof e==="object"&&"type"in e){if((e.type?.toLowerCase()||"").startsWith("audio/"))return"audio"}return"video"},async load(e,t){let i=new L;return await i.setup(e,t),i}};var It=[/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})/,/youtube\.com\/v\/([a-zA-Z0-9_-]{11})/,/youtube\.com\/shorts\/([a-zA-Z0-9_-]{11})/];function U(e){for(let t of It){let i=e.match(t);if(i)return i[1]}return null}function ye(e){if(typeof e==="string")return U(e)!==null;if(typeof e==="object"&&"type"in e)return e.type==="youtube";return!1}function Vt(e){if(typeof e==="string"){let t=U(e);if(!t)return null;let i=new URL(e,"https://youtube.com"),n=i.searchParams.get("t")||i.searchParams.get("start"),s=i.searchParams.get("end");return{videoId:t,startTime:n?st(n):void 0,endTime:s?st(s):void 0}}if(typeof e==="object"&&"type"in e&&e.type==="youtube"){let t=e;return{videoId:t.videoId||U(t.src)||"",startTime:t.startTime,endTime:t.endTime}}return null}function st(e){if(/^\d+$/.test(e))return parseInt(e,10);let t=e.match(/(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?/);if(t){let n=parseInt(t[1]||"0",10),s=parseInt(t[2]||"0",10),r=parseInt(t[3]||"0",10);return n*3600+s*60+r}let i=e.split(":").map((n)=>parseInt(n,10));if(i.length===2)return i[0]*60+i[1];if(i.length===3)return i[0]*3600+i[1]*60+i[2];return 0}class _ extends b{name="youtube";type="youtube";player=null;iframe=null;pendingVideoId=null;playerReady=!1;startTime;endTime;timeUpdateInterval=null;lastState=-1;get mediaElement(){return this.iframe}async initialize(){if(!this.container)throw Error("Container element is required");await this.loadYouTubeAPI();let e=document.createElement("div");e.id=`ts-video-player-yt-${Date.now()}`,e.className="ts-video-player__youtube",this.container.appendChild(e);let t={autoplay:this.options.autoplay?1:0,controls:0,disablekb:1,enablejsapi:1,iv_load_policy:3,modestbranding:1,playsinline:this.options.playsinline?1:0,rel:0,origin:window.location.origin};if(this.options.youtubeParams)Object.assign(t,this.options.youtubeParams);this.player=new window.YT.Player(e,{host:"https://www.youtube-nocookie.com",width:"100%",height:"100%",playerVars:t,events:{onReady:()=>this.onReady(),onStateChange:(i)=>this.onStateChange(i),onError:(i)=>this.onError(i),onPlaybackQualityChange:()=>this.onQualityChange(),onPlaybackRateChange:()=>this.onRateChange()}}),this.iframe=this.player.getIframe(),this.iframe.className="ts-video-player__media"}async loadYouTubeAPI(){if(window.YT?.Player)return;return new Promise((e)=>{if(document.querySelector('script[src*="youtube.com/iframe_api"]')){let i=()=>{if(window.YT?.Player)e();else setTimeout(i,100)};i();return}let t=document.createElement("script");t.src="https://www.youtube.com/iframe_api",t.async=!0,window.onYouTubeIframeAPIReady=()=>{e()},document.head.appendChild(t)})}cleanup(){if(this.timeUpdateInterval)clearInterval(this.timeUpdateInterval),this.timeUpdateInterval=null;this.player?.destroy(),this.player=null,this.playerReady=!1,this.iframe=null}onReady(){if(this.playerReady=!0,this.timeUpdateInterval=setInterval(()=>{if(this.player&&this.lastState===1)this.events.emit("timeupdate",this.getCurrentTime())},250),this.events.emit("loadedmetadata"),this.events.emit("canplay"),this.pendingVideoId)this.loadVideo(this.pendingVideoId,this.startTime,this.endTime),this.pendingVideoId=null}onStateChange(e){let t=e.data;this.lastState=t;let i=window.YT.PlayerState;switch(t){case i.UNSTARTED:this.events.emit("loadstart");break;case i.PLAYING:this.events.emit("play"),this.events.emit("playing"),this.events.emit("statechange",{paused:!1,playing:!0,waiting:!1});break;case i.PAUSED:this.events.emit("pause"),this.events.emit("statechange",{paused:!0,playing:!1});break;case i.BUFFERING:this.events.emit("waiting"),this.events.emit("statechange",{waiting:!0});break;case i.ENDED:this.events.emit("ended"),this.events.emit("statechange",{ended:!0,playing:!1});break;case i.CUED:this.events.emit("loadeddata"),this.events.emit("durationchange",this.getDuration());break}}onError(e){let t={2:"Invalid video ID",5:"HTML5 player error",100:"Video not found or removed",101:"Video cannot be embedded",150:"Video cannot be embedded"};this.emitError(e.data,t[e.data]||"Unknown YouTube error")}onQualityChange(){let e=this.player?.getPlaybackQuality()||"auto",t=this.getQualities();this.events.emit("qualitychange",t.find((i)=>i.id===e)||null)}onRateChange(){this.events.emit("ratechange",this.getPlaybackRate())}canPlay(e){return ye(e)}async load(e){let t=Vt(e);if(!t){this.emitError(2,"Invalid YouTube source");return}if(this.startTime=t.startTime,this.endTime=t.endTime,!this.player||!this._ready||!this.playerReady){this.pendingVideoId=t.videoId;return}this.loadVideo(t.videoId,t.startTime,t.endTime)}loadVideo(e,t,i){if(!this.player)return;if(this.options.autoplay)this.player.loadVideoById({videoId:e,startSeconds:t,endSeconds:i});else this.player.cueVideoById({videoId:e,startSeconds:t,endSeconds:i})}async play(){this.player?.playVideo()}pause(){this.player?.pauseVideo()}stop(){this.player?.stopVideo()}seekTo(e){this.player?.seekTo(e,!0),this.events.emit("seeking"),setTimeout(()=>this.events.emit("seeked"),100)}getCurrentTime(){return this.player?.getCurrentTime()||0}getDuration(){return this.player?.getDuration()||0}setVolume(e){this.player?.setVolume(Math.round(e*100)),this.events.emit("volumechange",e,this.getMuted())}getVolume(){return(this.player?.getVolume()||100)/100}setMuted(e){if(e)this.player?.mute();else this.player?.unMute();this.events.emit("volumechange",this.getVolume(),e)}getMuted(){return this.player?.isMuted()||!1}setPlaybackRate(e){this.player?.setPlaybackRate(e)}getPlaybackRate(){return this.player?.getPlaybackRate()||1}getQualities(){let e=this.player?.getAvailableQualityLevels()||[],t={highres:2160,hd2160:2160,hd1440:1440,hd1080:1080,hd720:720,large:480,medium:360,small:240,tiny:144},i=this.player?.getPlaybackQuality();return e.map((n)=>({id:n,width:Math.round((t[n]||480)*1.7777777777777777),height:t[n]||480,bitrate:0,selected:n===i}))}setQuality(e){if(e==="auto")this.player?.setPlaybackQuality("default");else this.player?.setPlaybackQuality(e.id)}}var be={name:"youtube",type:"youtube",canPlay(e){return ye(e)},mediaType(){return"video"},preconnect(){return["https://www.youtube-nocookie.com","https://www.youtube.com","https://i.ytimg.com","https://s.ytimg.com"]},async load(e,t){let i=new _;return await i.setup(e,t),i}};var Bt=[/vimeo\.com\/(\d+)/,/vimeo\.com\/video\/(\d+)/,/player\.vimeo\.com\/video\/(\d+)/,/vimeo\.com\/channels\/[\w]+\/(\d+)/,/vimeo\.com\/groups\/[\w]+\/videos\/(\d+)/];function Q(e){for(let t of Bt){let i=e.match(t);if(i)return i[1]}return null}function at(e){let t=e.match(/vimeo\.com\/\d+\/([a-f0-9]+)/);return t?t[1]:null}function ke(e){if(typeof e==="string")return Q(e)!==null;if(typeof e==="object"&&"type"in e)return e.type==="vimeo";return!1}function Dt(e){if(typeof e==="string"){let t=Q(e);if(!t)return null;return{videoId:t,hash:at(e)||void 0}}if(typeof e==="object"&&"type"in e&&e.type==="vimeo"){let t=e;return{videoId:t.videoId||Q(t.src)||"",hash:t.hash}}return null}var rt="https://player.vimeo.com/api/player.js";class Te extends b{name="vimeo";type="vimeo";container_el=null;player=null;iframe=null;timeUpdateInterval=null;_qualities=[];_duration=0;get mediaElement(){return this.iframe}async initialize(){if(!this.container)throw Error("Container element is required");await this.loadVimeoSDK(),this.container_el=document.createElement("div"),this.container_el.className="ts-video-player__vimeo",this.container.appendChild(this.container_el)}async loadVimeoSDK(){if(window.Vimeo)return;return new Promise((e,t)=>{if(document.querySelector(`script[src="${rt}"]`)){let n=()=>{if(window.Vimeo)e();else setTimeout(n,100)};n();return}let i=document.createElement("script");i.src=rt,i.async=!0,i.onload=()=>e(),i.onerror=()=>t(Error("Failed to load Vimeo SDK")),document.head.appendChild(i)})}cleanup(){if(this.timeUpdateInterval)clearInterval(this.timeUpdateInterval),this.timeUpdateInterval=null;this.player?.destroy(),this.player=null,this.iframe=null,this.container_el?.remove(),this.container_el=null}canPlay(e){return ke(e)}async load(e){let t=Dt(e);if(!t||!this.container_el){this.emitError(2,"Invalid Vimeo source");return}if(this.player)await this.player.destroy(),this.player=null;let i={id:parseInt(t.videoId,10),autopause:!1,autoplay:this.options.autoplay||!1,controls:!1,loop:this.options.loop||!1,muted:this.options.muted||!1,playsinline:this.options.playsinline!==!1,responsive:!0,dnt:!0};if(this.options.vimeoParams)Object.assign(i,this.options.vimeoParams);if(this.player=new window.Vimeo.Player(this.container_el,i),await this.player.ready(),this.iframe=this.container_el.querySelector("iframe"),this.iframe)this.iframe.className="ts-video-player__media";this.attachVimeoEvents(),this.events.emit("loadedmetadata"),this.events.emit("canplay"),this._duration=await this.player.getDuration(),this.events.emit("durationchange",this._duration),await this.updateQualities();let[n,s]=await Promise.all([this.player.getVideoWidth(),this.player.getVideoHeight()]);this.events.emit("statechange",{videoWidth:n,videoHeight:s,aspectRatio:n/s||1.7777777777777777,canFullscreen:!0,canPictureInPicture:!1})}attachVimeoEvents(){if(!this.player)return;this.player.on("play",()=>{this.events.emit("play"),this.events.emit("playing"),this.events.emit("statechange",{paused:!1,playing:!0})}),this.player.on("pause",()=>{this.events.emit("pause"),this.events.emit("statechange",{paused:!0,playing:!1})}),this.player.on("ended",()=>{this.events.emit("ended"),this.events.emit("statechange",{ended:!0,playing:!1})}),this.player.on("timeupdate",(e)=>{this.events.emit("timeupdate",e.seconds)}),this.player.on("seeking",()=>{this.events.emit("seeking")}),this.player.on("seeked",()=>{this.events.emit("seeked")}),this.player.on("bufferstart",()=>{this.events.emit("waiting"),this.events.emit("statechange",{waiting:!0})}),this.player.on("bufferend",()=>{this.events.emit("statechange",{waiting:!1})}),this.player.on("progress",(e)=>{let t=[{start:0,end:e.percent*this._duration}];this.events.emit("progress",t)}),this.player.on("volumechange",async()=>{let[e,t]=await Promise.all([this.player.getVolume(),this.player.getMuted()]);this.events.emit("volumechange",e,t)}),this.player.on("playbackratechange",(e)=>{this.events.emit("ratechange",e.playbackRate)}),this.player.on("qualitychange",async()=>{await this.updateQualities();let e=this._qualities.find((t)=>t.selected);this.events.emit("qualitychange",e||null)}),this.player.on("error",(e)=>{this.emitError(5,e.message,e)})}async updateQualities(){if(!this.player)return;try{let e=await this.player.getQualities();this._qualities=e.map((t)=>{let i=t.label.match(/(\d+)p/),n=i?parseInt(i[1],10):0;return{id:t.id,width:Math.round(n*1.7777777777777777),height:n,bitrate:0,selected:t.active}}),this.events.emit("statechange",{qualities:this._qualities})}catch{}}async play(){try{await this.player?.play()}catch(e){if(e.name==="NotAllowedError")this.emitError(1,"Playback was blocked. User interaction required.",e);else throw e}}pause(){this.player?.pause()}stop(){this.pause(),this.seekTo(0)}seekTo(e){this.player?.setCurrentTime(e)}getCurrentTime(){return 0}getDuration(){return this._duration}setVolume(e){this.player?.setVolume(Math.max(0,Math.min(1,e)))}getVolume(){return 1}setMuted(e){this.player?.setMuted(e)}getMuted(){return!1}setPlaybackRate(e){this.player?.setPlaybackRate(e)}getPlaybackRate(){return 1}getQualities(){return this._qualities}setQuality(e){if(!this.player)return;if(e==="auto")this.player.setQuality("auto");else this.player.setQuality(e.id)}async enableTextTrack(e){await this.player?.enableTextTrack(e)}async disableTextTrack(){await this.player?.disableTextTrack()}async getChapters(){if(!this.player)return[];try{return await this.player.getChapters()}catch{return[]}}}var we={name:"vimeo",type:"vimeo",canPlay(e){return ke(e)},mediaType(){return"video"},preconnect(){return["https://player.vimeo.com","https://i.vimeocdn.com","https://f.vimeocdn.com"]},async load(e,t){let i=new Te;return await i.setup(e,t),i}};function Se(e){if(typeof e==="string"){let t=e.toLowerCase();return t.endsWith(".m3u8")||t.includes("application/x-mpegurl")||t.includes("application/vnd.apple.mpegurl")}if(typeof e==="object"&&"type"in e){let t=e.type?.toLowerCase()||"";return t==="application/x-mpegurl"||t==="application/vnd.apple.mpegurl"}return!1}function ot(){return document.createElement("video").canPlayType("application/vnd.apple.mpegurl")!==""}var $t="https://cdn.jsdelivr.net/npm/hls.js@latest/dist/hls.min.js";class C extends b{name="hls";type="hls";video=null;hls=null;eventsNormalizer=null;cleanupFullscreen=null;cleanupPiP=null;useNativeHLS=!1;_qualities=[];_audioTracks=[];_textTracks=[];currentQualityIndex=-1;get mediaElement(){return this.video}get canLiveSync(){return!this.useNativeHLS&&this.hls!==null}get hlsConfig(){return this.hls?.config||{}}async initialize(){if(!this.container)throw Error("Container element is required");if(this.video=document.createElement("video"),this.video.className="ts-video-player__media",this.options.autoplay)this.video.autoplay=!0;if(this.options.loop)this.video.loop=!0;if(this.options.muted)this.video.muted=!0;if(this.options.playsinline)this.video.playsInline=!0;if(this.options.preload)this.video.preload=this.options.preload;if(this.options.crossorigin)this.video.crossOrigin=this.options.crossorigin;if(this.options.poster)this.video.poster=this.options.poster;if(this.options.volume!==void 0)this.video.volume=this.options.volume;if(this.container.appendChild(this.video),this.eventsNormalizer=new M(this.video,this.events),this.cleanupFullscreen=q((e)=>{this.events.emit("fullscreenchange",e)}),this.cleanupPiP=N(this.video,(e)=>{this.events.emit("pipchange",e)}),this.useNativeHLS=ot(),!this.useNativeHLS)await this.loadHLSLibrary();this.video.addEventListener("loadedmetadata",()=>{let e=this.getFeatureAvailability("fullscreen"),t=this.getFeatureAvailability("pip"),i=this.getFeatureAvailability("volume");this.events.emit("statechange",{videoWidth:this.video.videoWidth,videoHeight:this.video.videoHeight,aspectRatio:(this.video.videoHeight>0?this.video.videoWidth/this.video.videoHeight:0)||1.7777777777777777,canFullscreen:e==="available",canPictureInPicture:t==="available",fullscreenAvailability:e,pipAvailability:t,volumeAvailability:i}),this.events.emit("availabilitychange","fullscreen",e),this.events.emit("availabilitychange","pip",t),this.events.emit("availabilitychange","volume",i)})}async loadHLSLibrary(){if(window.Hls)return;return new Promise((e,t)=>{let i=document.createElement("script");i.src=this.options.hlsCdnUrl||$t,i.async=!0,i.onload=()=>e(),i.onerror=()=>t(Error("Failed to load HLS.js")),document.head.appendChild(i)})}cleanup(){if(this.eventsNormalizer?.destroy(),this.cleanupFullscreen?.(),this.cleanupPiP?.(),this.hls)this.hls.destroy(),this.hls=null;if(this.video)this.video.pause(),this.video.removeAttribute("src"),this.video.load(),this.video.remove(),this.video=null;this._qualities=[],this._audioTracks=[],this._textTracks=[]}canPlay(e){return Se(e)}async load(e){if(!this.video)return;let t=typeof e==="string"?e:e.src;if(this.useNativeHLS){this.video.src=t,this.video.load();return}if(!window.Hls)await this.loadHLSLibrary();if(!window.Hls?.isSupported()){this.emitError(4,"HLS is not supported in this browser");return}if(this.hls)this.hls.destroy();let i={enableWorker:!0,lowLatencyMode:!1,...this.options.hlsConfig};this.hls=new window.Hls(i),this.attachHLSEvents(),this.hls.attachMedia(this.video),this.hls.loadSource(t)}attachHLSEvents(){if(!this.hls||!window.Hls)return;let e=window.Hls;this.hls.on(e.Events.MANIFEST_PARSED,(t,i)=>{if(this.updateQualities(i.levels),this.options.autoplay)this.video?.play().catch(()=>{})}),this.hls.on(e.Events.LEVEL_SWITCHED,(t,i)=>{this.currentQualityIndex=i.level,this.updateQualitySelection(),this.events.emit("qualitychange",this._qualities[i.level]||null)}),this.hls.on(e.Events.AUDIO_TRACK_LOADED,()=>{this.updateAudioTracks()}),this.hls.on(e.Events.AUDIO_TRACK_SWITCHED,()=>{this.updateAudioTracks();let t=this._audioTracks.find((i)=>i.selected);this.events.emit("audiotrackchange",t||null)}),this.hls.on(e.Events.SUBTITLE_TRACK_LOADED,()=>{this.updateTextTracks()}),this.hls.on(e.Events.ERROR,(t,i)=>{if(i.fatal)switch(i.type){case e.ErrorTypes.NETWORK_ERROR:this.hls?.startLoad();break;case e.ErrorTypes.MEDIA_ERROR:this.hls?.recoverMediaError();break;default:this.emitError(5,`HLS fatal error: ${i.details}`,i),this.hls?.destroy();break}})}updateQualities(e){this._qualities=e.map((t,i)=>({id:String(i),width:t.width,height:t.height,bitrate:t.bitrate,codec:t.codecSet||t.videoCodec||void 0,selected:i===this.currentQualityIndex})),this.events.emit("statechange",{qualities:this._qualities})}updateQualitySelection(){this._qualities=this._qualities.map((e,t)=>({...e,selected:t===this.currentQualityIndex}))}updateAudioTracks(){if(!this.hls)return;this._audioTracks=this.hls.audioTracks.map((e,t)=>({id:String(e.id),label:e.name||`Track ${t+1}`,language:e.lang||"",kind:e.default?"main":"alternative",selected:t===this.hls.audioTrack})),this.events.emit("statechange",{audioTracks:this._audioTracks})}updateTextTracks(){if(!this.hls)return;this._textTracks=this.hls.subtitleTracks.map((e,t)=>({id:String(e.id),kind:"subtitles",label:e.name||`Subtitle ${t+1}`,language:e.lang||"",mode:t===this.hls.subtitleTrack?"showing":"disabled",cues:[]})),this.events.emit("statechange",{textTracks:this._textTracks})}async play(){if(!this.video)return;try{await this.video.play()}catch(e){if(e.name==="NotAllowedError")this.emitError(1,"Playback was blocked. User interaction required.",e);else throw e}}pause(){this.video?.pause()}seekTo(e){if(this.video)this.video.currentTime=Math.max(0,Math.min(e,this.getDuration()))}getCurrentTime(){return this.video?.currentTime||0}getDuration(){return this.video?.duration||0}syncToLive(){if(this.hls?.liveSyncPosition!=null)this.seekTo(this.hls.liveSyncPosition)}setVolume(e){if(this.video)this.video.volume=Math.max(0,Math.min(1,e))}getVolume(){return this.video?.volume||1}setMuted(e){if(this.video)this.video.muted=e}getMuted(){return this.video?.muted||!1}setPlaybackRate(e){if(this.video)this.video.playbackRate=Math.max(0.25,Math.min(4,e))}getPlaybackRate(){return this.video?.playbackRate||1}getQualities(){return this._qualities}setQuality(e){if(!this.hls)return;if(e==="auto")this.hls.currentLevel=-1,this.currentQualityIndex=-1,this.events.emit("statechange",{autoQuality:!0});else{let t=parseInt(e.id,10);if(!isNaN(t)&&t>=0&&t<this._qualities.length)this.hls.currentLevel=t,this.currentQualityIndex=t,this.events.emit("statechange",{autoQuality:!1})}}getAudioTracks(){return this._audioTracks}setAudioTrack(e){if(!this.hls)return;let t=parseInt(e,10);if(!isNaN(t)&&t>=0&&t<this.hls.audioTracks.length)this.hls.audioTrack=t}getTextTracks(){return this._textTracks}setTextTrackMode(e,t){if(!this.hls)return;if(t==="showing"){let n=parseInt(e,10);if(!isNaN(n))this.hls.subtitleTrack=n}else this.hls.subtitleTrack=-1;this.updateTextTracks();let i=this._textTracks.find((n)=>n.mode==="showing");this.events.emit("texttrackchange",i||null)}}var xe={name:"hls",type:"hls",canPlay(e){return Se(e)},mediaType(){return"video"},preconnect(){return["https://cdn.jsdelivr.net"]},async load(e,t){let i=new C;return await i.setup(e,t),i}};var T=null,K=null,Ft="https://cdn.dashjs.org/latest/dash.all.min.js";async function Ot(e){if(T)return T;if(K)return K;return K=new Promise((t,i)=>{if(typeof window<"u"&&window.dashjs){T=window.dashjs,t(T);return}let n=document.createElement("script");n.src=e||Ft,n.async=!0,n.onload=()=>{T=window.dashjs,t(T)},n.onerror=()=>{i(Error("Failed to load dash.js"))},document.head.appendChild(n)}),K}function W(e){if(typeof e==="object"&&"type"in e&&e.type==="dash")return!0;if(typeof e==="string")return e.includes(".mpd")||e.includes("manifest(format=mpd");return!1}class R extends b{name="dash";type="dash";dash=null;video=null;source=null;config={};_volume=1;_muted=!1;_playbackRate=1;get mediaElement(){return this.video}async initialize(){if(this.video=document.createElement("video"),this.video.style.width="100%",this.video.style.height="100%",this.video.style.display="block",await Ot(this.options.dashCdnUrl),this.dash=T.MediaPlayer().create(),this.options.dashConfig)this.config.dashConfig=this.options.dashConfig;if(this.config.dashConfig)Object.entries(this.config.dashConfig).forEach(([e,t])=>{this.dash.updateSettings({[e]:t})});if(this.config.lowLatency)this.dash.updateSettings({streaming:{lowLatencyEnabled:!0,liveDelay:3,liveCatchUpMinDrift:0.05,liveCatchUpPlaybackRate:0.5}});if(this.attachDashEvents(),this.container)this.container.appendChild(this.video);this.attachVideoEvents()}attachVideoEvents(){if(!this.video)return;this.video.addEventListener("play",()=>this.events.emit("play")),this.video.addEventListener("pause",()=>this.events.emit("pause")),this.video.addEventListener("ended",()=>this.events.emit("ended")),this.video.addEventListener("timeupdate",()=>this.events.emit("timeupdate",this.getCurrentTime())),this.video.addEventListener("durationchange",()=>this.events.emit("durationchange",this.getDuration())),this.video.addEventListener("volumechange",()=>{this.events.emit("volumechange",this.getVolume(),this.getMuted())}),this.video.addEventListener("waiting",()=>this.events.emit("waiting")),this.video.addEventListener("playing",()=>this.events.emit("playing")),this.video.addEventListener("seeking",()=>this.events.emit("seeking")),this.video.addEventListener("seeked",()=>this.events.emit("seeked")),this.video.addEventListener("progress",()=>{let e=[];for(let t=0;t<this.video.buffered.length;t++)e.push({start:this.video.buffered.start(t),end:this.video.buffered.end(t)});this.events.emit("progress",e)}),this.video.addEventListener("loadedmetadata",()=>{this.events.emit("loadedmetadata");let e=this.getFeatureAvailability("fullscreen"),t=this.getFeatureAvailability("pip"),i=this.getFeatureAvailability("volume");this.events.emit("statechange",{videoWidth:this.video.videoWidth,videoHeight:this.video.videoHeight,aspectRatio:(this.video.videoHeight>0?this.video.videoWidth/this.video.videoHeight:0)||1.7777777777777777,canFullscreen:e==="available",canPictureInPicture:t==="available",fullscreenAvailability:e,pipAvailability:t,volumeAvailability:i}),this.events.emit("availabilitychange","fullscreen",e),this.events.emit("availabilitychange","pip",t),this.events.emit("availabilitychange","volume",i)}),this.video.addEventListener("loadeddata",()=>this.events.emit("loadeddata")),this.video.addEventListener("canplay",()=>this.events.emit("canplay")),this.video.addEventListener("canplaythrough",()=>this.events.emit("canplaythrough")),this.video.addEventListener("ratechange",()=>this.events.emit("ratechange",this.getPlaybackRate()))}attachDashEvents(){if(!T)return;let e=T.MediaPlayer;this.dash.on(e.events.QUALITY_CHANGE_RENDERED,()=>{this.events.emit("qualitychange",this.getQualities().find((t)=>t.selected)||null)}),this.dash.on(e.events.MANIFEST_LOADED,()=>{}),this.dash.on(e.events.ERROR,(t)=>{this.emitError(t.error?.code||0,t.error?.message||"DASH playback error",t.error)})}configureDRM(e){let t={};if(e.widevine)t["com.widevine.alpha"]={serverURL:e.widevine.url,httpRequestHeaders:e.widevine.headers};if(e.playready)t["com.microsoft.playready"]={serverURL:e.playready.url,httpRequestHeaders:e.playready.headers};if(e.fairplay)t["com.apple.fps.1_0"]={serverURL:e.fairplay.url,serverCertificateURL:e.fairplay.certificateUrl,httpRequestHeaders:e.fairplay.headers};this.dash.setProtectionData(t)}async load(e){if(!this.video||!this.dash)return;if(typeof e==="string")this.source={src:e,type:"dash"};else if(W(e))this.source=e;else{this.emitError(4,"Invalid DASH source");return}if(this.source.drm)this.configureDRM(this.source.drm);this.dash.initialize(this.video,this.source.src,!1)}canPlay(e){return W(e)}cleanup(){if(this.dash)this.dash.reset(),this.dash=null;if(this.video)this.video.remove(),this.video=null;this.source=null}async play(){if(!this.video)return;try{await this.video.play()}catch(e){if(e.name==="NotAllowedError")this.emitError(1,"Playback was blocked. User interaction required.",e);else throw e}}pause(){if(this.video)this.video.pause()}seekTo(e){if(this.video)this.video.currentTime=e}getCurrentTime(){return this.video?.currentTime||0}getDuration(){return this.video?.duration||0}setVolume(e){if(this._volume=Math.max(0,Math.min(1,e)),this.video)this.video.volume=this._volume}getVolume(){return this.video?.volume??this._volume}setMuted(e){if(this._muted=e,this.video)this.video.muted=e}getMuted(){return this.video?.muted??this._muted}setPlaybackRate(e){if(this._playbackRate=e,this.video)this.video.playbackRate=e}getPlaybackRate(){return this.video?.playbackRate??this._playbackRate}get isLive(){return this.dash?.isDynamic()??!1}get liveLatency(){return this.dash?.getCurrentLiveLatency()??0}get canLiveSync(){return this.isLive}syncToLive(){if(this.dash&&this.isLive)this.dash.seekToOriginalLive()}getQualities(){if(!this.dash)return[];let e=this.dash.getBitrateInfoListFor("video");if(!e)return[];let t=this.dash.getQualityFor("video");return e.map((i,n)=>({id:`${n}`,label:`${i.height}p`,width:i.width,height:i.height,bitrate:i.bitrate,selected:n===t}))}setQuality(e){if(!this.dash)return;if(e==="auto")this.dash.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:!0}}}});else{let t=Number.parseInt(e.id,10);if(!Number.isNaN(t))this.dash.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:!1}}}}),this.dash.setQualityFor("video",t)}}get isAutoQuality(){if(!this.dash)return!0;return this.dash.getSettings()?.streaming?.abr?.autoSwitchBitrate?.video??!0}getAudioTracks(){if(!this.dash)return[];let e=this.dash.getTracksFor("audio");if(!e)return[];let t=this.dash.getCurrentTrackFor("audio");return e.map((i,n)=>({id:i.id||`${n}`,label:i.labels?.[0]?.text||i.lang||`Track ${n+1}`,language:i.lang||"",kind:"main",selected:i===t}))}setAudioTrack(e){if(!this.dash)return;let i=this.dash.getTracksFor("audio").find((n,s)=>(n.id||`${s}`)===e);if(i)this.dash.setCurrentTrack(i)}getTextTracks(){if(!this.dash)return[];let e=this.dash.getTracksFor("text");if(!e)return[];let t=this.dash.getCurrentTrackFor("text");return e.map((i,n)=>({id:i.id||`${n}`,label:i.labels?.[0]?.text||i.lang||`Subtitle ${n+1}`,language:i.lang||"",kind:i.kind||"subtitles",mode:i===t?"showing":"disabled",cues:[]}))}setTextTrackMode(e,t){if(!this.dash)return;if(t==="disabled"){this.dash.enableText(!1);return}let n=this.dash.getTracksFor("text").find((s,r)=>(s.id||`${r}`)===e);if(n)this.dash.setCurrentTrack(n),this.dash.enableText(t==="showing")}}var Ee={name:"dash",type:"dash",canPlay(e){return W(e)},mediaType(){return"video"},async load(e,t){let i=new R;return await i.setup(e,t),i},preconnect(){return["https://cdn.dashjs.org"]}};var j=[xe,Ee,be,we,fe];function lt(e){if(!e||typeof e!=="object"||typeof e.src!=="string")return null;return"type"in e&&e.type?null:e.src}var qt={youtube:()=>"youtube",vimeo:()=>"vimeo",hls:()=>"application/x-mpegurl",dash:()=>"dash",video:(e)=>z(e)};function Nt(e,t){let i=lt(e),n=i&&qt[t.type];return i&&n?{...e,type:n(i)}:e}function zt(e,t=j){for(let n of t)if(n.canPlay(e))return n;let i=lt(e);if(i){for(let n of t)if(n.canPlay(i))return n}return null}function dt(e,t=j){let i=[];return e.forEach((n,s)=>{let r=zt(n,t);if(r)i.push({src:Nt(n,r),index:s,loader:r})}),i}class E{_el;_options;_store;_events=new x;_provider=null;_loaders;_cleanupFns=[];_destroyed=!1;_sourceLoadId=0;_announcer=null;constructor(e,t={}){if(typeof e==="string"){let i=document.querySelector(e);if(!i)throw Error(`Container element not found: ${e}`);this._el=i}else this._el=e;if(this._options={...Ut,...t},this._loaders=j,this._store=new A,this.setupElement(),this.setupState(),this.setupKeyboard(),this.setupActivity(),this.setupStorage(),this.setupMediaSession(),this.setupEvents(),this._options.src)this.setSrc(this._options.src);this._events.emit("init")}get el(){return this._el}get state(){return this._store.getState()}get provider(){return this._provider}get ready(){return this._provider?.ready||!1}setupElement(){this._el.classList.add("ts-video-player"),this._el.setAttribute("tabindex","0"),this._el.setAttribute("role","region"),this._el.setAttribute("aria-roledescription","video player"),this._el.setAttribute("aria-label",this._options.title||"Video player"),this._el.setAttribute("aria-keyshortcuts","Space K M F I C ArrowLeft ArrowRight J L ArrowUp ArrowDown Home End 0 1 2 3 4 5 6 7 8 9");let e=document.createElement("div");if(e.className="ts-video-player__container",this._el.appendChild(e),this._options.announcements!==!1){let i=document.createElement("div");i.className="ts-video-player__announcer",i.setAttribute("role","status"),i.setAttribute("aria-live","polite"),i.setAttribute("aria-atomic","true"),i.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",this._el.appendChild(i),this._announcer=i}let t=this._el;t.__videoPlayer=this}setupState(){this._store.batch({volume:this._options.volume??1,muted:this._options.muted??!1,loop:this._options.loop??!1,autoplay:this._options.autoplay??!1,playsinline:this._options.playsinline??!0,playbackRate:this._options.playbackRate??1,poster:this._options.poster||"",title:this._options.title||"",preload:this._options.preload||"metadata"});let e=this._store.subscribe((t)=>{this.updateAttributes(t)});this._cleanupFns.push(e)}setupKeyboard(){if(this._options.keyboard===!1)return;let e={togglePlay:()=>this.togglePlay(),toggleMute:()=>this.toggleMute(),toggleFullscreen:()=>this.toggleFullscreen(),togglePiP:()=>this.togglePiP(),toggleCaptions:()=>this.toggleCaptions(),seekBackward:()=>this.seekBy(-5),seekForward:()=>this.seekBy(5),volumeUp:()=>this.setVolume(Math.min(1,this.state.volume+0.1)),volumeDown:()=>this.setVolume(Math.max(0,this.state.volume-0.1)),speedUp:()=>this.setPlaybackRate(Math.min(4,this.state.playbackRate+0.25)),speedDown:()=>this.setPlaybackRate(Math.max(0.25,this.state.playbackRate-0.25)),seekStart:()=>this.seekTo(0),seekEnd:()=>this.seekTo(this.state.duration),seekPercent:(s)=>this.seekTo(s/100*this.state.duration)},t=typeof this._options.keyboard==="object"?this._options.keyboard:{},i=Ne(e,{seekStep:t.seekStep,volumeStep:t.volumeStep}),n=t.global?document:this._el;n.addEventListener("keydown",i),this._cleanupFns.push(()=>n.removeEventListener("keydown",i))}setupActivity(){let e=ze(this._el,{timeout:this._options.controlsTimeout||3000,onActive:()=>{this._store.batch({userActive:!0,controlsVisible:!0}),this._events.emit("useractivitychange",!0),this._events.emit("controlschange",!0)},onInactive:()=>{if(this.state.playing)this._store.batch({userActive:!1,controlsVisible:!1}),this._events.emit("useractivitychange",!1),this._events.emit("controlschange",!1)}});this._cleanupFns.push(e);let t=()=>this._store.set("pointerOver",!0),i=()=>this._store.set("pointerOver",!1);this._el.addEventListener("mouseenter",t),this._el.addEventListener("mouseleave",i),this._cleanupFns.push(()=>this._el.removeEventListener("mouseenter",t),()=>this._el.removeEventListener("mouseleave",i))}setupStorage(){if(!this._options.storage)return;let e=typeof this._options.storage==="object"?this._options.storage:{},t=e.type==="session"?sessionStorage:localStorage,i=qe(this._store,e.persist||["volume","muted","playbackRate"],t);this._cleanupFns.push(i)}setupMediaSession(){if(this._options.mediaSession===!1)return;let e=typeof this._options.mediaSession==="object"?this._options.mediaSession:this._options.title?{title:this._options.title}:void 0,t=Qe(this._store,{play:()=>this.play(),pause:()=>this.pause(),seekTo:(i)=>this.seekTo(i),seekBy:(i)=>this.seekBy(i),stop:()=>this.stop()},e);this._cleanupFns.push(t)}setupEvents(){if(this._options.on){for(let[e,t]of Object.entries(this._options.on))if(t)this.on(e,t)}}updateAttributes(e){let t=this._el;t.dataset.paused=String(e.paused),t.dataset.playing=String(e.playing),t.dataset.started=String(e.started),t.dataset.ended=String(e.ended),t.dataset.seeking=String(e.seeking),t.dataset.waiting=String(e.waiting),t.dataset.loop=String(e.loop),t.dataset.autoplay=String(e.autoplay),t.dataset.loading=String(e.waiting||e.loadingState==="loading"),t.dataset.canPlay=String(e.canPlay),t.dataset.loadingState=e.loadingState,t.setAttribute("aria-busy",String(e.waiting||e.loadingState==="loading")),t.dataset.muted=String(e.muted),t.dataset.volumeLevel=e.muted||e.volume===0?"silent":e.volume<0.5?"low":"high",t.dataset.fullscreen=String(e.fullscreen),t.dataset.pip=String(e.pictureInPicture),t.dataset.controlsVisible=String(e.controlsVisible),t.dataset.userActive=String(e.userActive),t.dataset.mediaType=e.mediaType,t.dataset.streamType=e.streamType;let i=e.textTracks.some((n)=>n.mode==="showing");t.dataset.captions=String(i),t.dataset.error=String(!!e.error)}announce(e){if(!this._announcer)return;this._announcer.textContent="",requestAnimationFrame(()=>{if(this._announcer)this._announcer.textContent=e})}destroy(){if(this._destroyed)return;this._destroyed=!0,this._sourceLoadId++,this._events.emit("destroy"),this._cleanupFns.forEach((e)=>e()),this._cleanupFns=[],this._provider?.destroy(),this._provider=null,this._events.removeAllListeners(),this._store.reset(),this._el.classList.remove("ts-video-player"),this._el.innerHTML="",delete this._el.__videoPlayer}async setSrc(e){if(this._destroyed)return;let t=++this._sourceLoadId,i=Array.isArray(e)?e:[e];if(i.length===0)return;this._store.batch({sources:i,src:i[0],loadingState:"loading",error:null}),this._events.emit("sourceschange",i);let n=dt(i,this._loaders);if(n.length===0){this._store.batch({loadingState:"error",error:{code:4,message:"No compatible provider found for source"}});return}let s;for(let r of n){if(this._destroyed||t!==this._sourceLoadId)return;let{loader:o}=r;if(this._provider&&this._provider.type!==o.type)this._provider.destroy(),this._provider=null,this._events.emit("providerchange",null);if(!this._provider){let a=this._el.querySelector(".ts-video-player__container");try{if(this._provider=await o.load(a,{...this._options,mediaType:o.mediaType(r.src)}),this._destroyed||t!==this._sourceLoadId){this._provider.destroy(),this._provider=null;return}this._events.emit("providerchange",this._provider),this.attachProviderEvents(this._provider)}catch(l){s=l,this._provider=null;continue}}try{let a=o.type==="video"?n.filter((l)=>l.loader.type===o.type).map((l)=>l.src):[r.src];if(await this._provider.load(a.length>1?a:r.src),this._destroyed||t!==this._sourceLoadId)return;this._store.batch({src:r.src,currentSourceIndex:r.index,mediaType:o.mediaType(r.src),providerType:o.type});return}catch(a){if(s=a,this._provider)this._provider.destroy(),this._provider=null;this._events.emit("providerchange",null)}}if(this._destroyed||t!==this._sourceLoadId)return;this._store.batch({loadingState:"error",error:{code:4,message:"Failed to load all compatible sources",details:s}})}getSrc(){return this.state.src}attachProviderEvents(e){e.on("loadstart",()=>{this._store.set("loadingState","loading"),this._events.emit("loadstart")}),e.on("loadedmetadata",()=>{this._events.emit("loadedmetadata")}),e.on("loadeddata",()=>{this._events.emit("loadeddata")}),e.on("canplay",()=>{this._store.batch({canPlay:!0,loadingState:"loaded"}),this._events.emit("canplay")}),e.on("canplaythrough",()=>{this._store.set("canPlayThrough",!0),this._events.emit("canplaythrough")}),e.on("play",()=>{this._store.batch({paused:!1,ended:!1}),this._events.emit("play"),this.announce("Playing")}),e.on("pause",()=>{this._store.set("paused",!0),this._events.emit("pause"),this.announce("Paused")}),e.on("playing",()=>{this._store.batch({playing:!0,started:!0,waiting:!1,playbackState:"playing"}),this._events.emit("playing")}),e.on("waiting",()=>{this._store.batch({waiting:!0,playbackState:"buffering"}),this._events.emit("waiting")}),e.on("seeking",()=>{this._store.set("seeking",!0),this._events.emit("seeking")}),e.on("seeked",()=>{this._store.set("seeking",!1),this._events.emit("seeked")}),e.on("timeupdate",(t)=>{this._store.set("currentTime",t),this._events.emit("timeupdate",t)}),e.on("durationchange",(t)=>{this._store.set("duration",t),this._events.emit("durationchange",t)}),e.on("volumechange",(t,i)=>{if(this._store.batch({volume:t,muted:i}),this._events.emit("volumechange",t,i),i)this.announce("Muted");else this.announce(`Volume ${Math.round(t*100)}%`)}),e.on("ratechange",(t)=>{this._store.set("playbackRate",t),this._events.emit("ratechange",t)}),e.on("progress",(t)=>{this._store.batch({buffered:t,bufferedAmount:$e({...this.state,buffered:t})}),this._events.emit("progress",t)}),e.on("ended",()=>{if(this._store.batch({ended:!0,playing:!1,playbackState:"ended"}),this._events.emit("ended"),this.announce("Playback ended"),this.state.loop)this.seekTo(0),this.play()}),e.on("error",(t)=>{this._store.batch({loadingState:"error",error:t}),this._events.emit("error",t),this.announce(`Error: ${t.message}`)}),e.on("statechange",(t)=>{this._store.batch(t),this._events.emit("statechange",t)}),e.on("qualitychange",(t)=>{this._store.set("qualities",e.getQualities()),this._events.emit("qualitychange",t)}),e.on("fullscreenchange",(t)=>{this._store.set("fullscreen",t),this._events.emit("fullscreenchange",t),this.announce(t?"Entered fullscreen":"Exited fullscreen")}),e.on("pipchange",(t)=>{this._store.set("pictureInPicture",t),this._events.emit("pipchange",t)}),e.on("availabilitychange",(t,i)=>{if(t==="volume")this._store.set("volumeAvailability",i);else if(t==="fullscreen")this._store.set("fullscreenAvailability",i);else if(t==="pip")this._store.set("pipAvailability",i);this._events.emit("availabilitychange",t,i)})}async play(){if(!this._provider)return;await this._provider.play()}pause(){this._provider?.pause()}togglePlay(){if(this.state.paused)this.play().catch(()=>{});else this.pause()}stop(){this._provider?.stop(),this._store.batch({playing:!1,paused:!0,currentTime:0,playbackState:"idle"})}seekTo(e){this._provider?.seekTo(e)}seekBy(e){let t=Math.max(0,Math.min(this.state.currentTime+e,this.state.duration));this.seekTo(t)}setVolume(e){if(this.state.volumeAvailability==="unsupported")return;let t=Math.max(0,Math.min(1,e));this._provider?.setVolume(t),this._store.set("volume",t)}setMuted(e){this._provider?.setMuted(e),this._store.set("muted",e)}toggleMute(){this.setMuted(!this.state.muted)}setPlaybackRate(e){let t=Math.max(0.25,Math.min(4,e));this._provider?.setPlaybackRate(t),this._store.set("playbackRate",t)}async enterFullscreen(){if(this.state.fullscreenAvailability==="unsupported")return;if(this.state.pictureInPicture)await this.exitPiP();if(await this._provider?.enterFullscreen(),this._options.fullscreenOrientationLock!==!1)We("landscape")}async exitFullscreen(){if(await this._provider?.exitFullscreen(),this._options.fullscreenOrientationLock!==!1)je()}async toggleFullscreen(){if(this.state.fullscreen)await this.exitFullscreen();else await this.enterFullscreen()}async enterPiP(){if(this.state.pipAvailability==="unsupported")return;if(this.state.fullscreen)await this.exitFullscreen();await this._provider?.enterPiP()}async exitPiP(){await this._provider?.exitPiP()}async togglePiP(){if(this.state.pictureInPicture)await this.exitPiP();else await this.enterPiP()}setQuality(e){if(this._provider?.setQuality(e),e==="auto")this._store.set("autoQuality",!0);else this._store.set("autoQuality",!1)}setTextTrack(e,t){this._provider?.setTextTrackMode(e,t),this._store.set("textTracks",this._provider?.getTextTracks()||[])}setAudioTrack(e){this._provider?.setAudioTrack(e),this._store.set("audioTracks",this._provider?.getAudioTracks()||[])}toggleCaptions(){let e=this.state.textTracks,t=e.find((i)=>i.mode==="showing");if(t)this.setTextTrack(t.id,"disabled");else{let i=e.find((n)=>n.kind==="subtitles"||n.kind==="captions");if(i)this.setTextTrack(i.id,"showing")}}on(e,t){this._events.on(e,t)}off(e,t){this._events.off(e,t)}once(e,t){this._events.once(e,t)}subscribe(e,t){return this._store.subscribe(e,t)}}var Ut={autoplay:!1,loop:!1,muted:!1,volume:1,playbackRate:1,playsinline:!0,preload:"metadata",controls:!0,keyboard:!0,controlsTimeout:3000,storage:!0};function ct(e,t){return new E(e,t)}var Qt={colors:{primary:"#00a8ff",secondary:"#6c5ce7",background:"rgba(0, 0, 0, 0.85)",text:"#ffffff",textOnPrimary:"#ffffff",border:"rgba(255, 255, 255, 0.1)",focus:"#00a8ff",error:"#ff4757",success:"#2ed573",warning:"#ffa502"},typography:{fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',fontSize:"14px",fontSizeSmall:"12px",fontSizeLarge:"16px",fontWeight:"400",fontWeightBold:"600",lineHeight:"1.5"},spacing:{xs:"4px",sm:"8px",md:"12px",lg:"16px",xl:"24px"},borderRadius:{sm:"4px",md:"8px",lg:"12px",full:"9999px"},shadows:{sm:"0 1px 2px rgba(0, 0, 0, 0.2)",md:"0 4px 6px rgba(0, 0, 0, 0.3)",lg:"0 10px 15px rgba(0, 0, 0, 0.4)"},transitions:{fast:"100ms",normal:"200ms",slow:"300ms",easing:"cubic-bezier(0.4, 0, 0.2, 1)"},slider:{trackHeight:"4px",thumbSize:"14px",trackBg:"rgba(255, 255, 255, 0.2)",trackFillBg:"var(--tsvp-color-primary)",bufferedBg:"rgba(255, 255, 255, 0.4)",thumbBg:"#ffffff",thumbBorder:"none"},controls:{height:"48px",background:"linear-gradient(transparent, rgba(0, 0, 0, 0.7))",padding:"0 12px",buttonSize:"40px",iconSize:"24px",tooltipBg:"rgba(0, 0, 0, 0.9)",tooltipText:"#ffffff"},menu:{background:"rgba(20, 20, 20, 0.95)",borderRadius:"8px",shadow:"0 4px 20px rgba(0, 0, 0, 0.5)",itemHeight:"40px",itemHoverBg:"rgba(255, 255, 255, 0.1)",itemActiveBg:"rgba(0, 168, 255, 0.2)"},captions:{fontFamily:"inherit",fontSize:"1.5em",textColor:"#ffffff",background:"rgba(0, 0, 0, 0.75)",textShadow:"0 1px 2px rgba(0, 0, 0, 0.5)",borderRadius:"4px",padding:"4px 8px"},thumbnails:{width:"160px",height:"90px",borderRadius:"4px",border:"2px solid rgba(255, 255, 255, 0.2)",shadow:"0 4px 12px rgba(0, 0, 0, 0.4)"},live:{indicatorColor:"#ff0000",indicatorSize:"8px",badgeBg:"#ff0000",badgeText:"#ffffff"}},Kt={colors:{primary:"#00a8ff",background:"rgba(0, 0, 0, 0.9)",text:"#ffffff"}},Wt={colors:{primary:"#0070f3",background:"rgba(255, 255, 255, 0.95)",text:"#1a1a1a",textOnPrimary:"#ffffff",border:"rgba(0, 0, 0, 0.1)"},controls:{background:"linear-gradient(transparent, rgba(255, 255, 255, 0.9))",tooltipBg:"rgba(0, 0, 0, 0.8)"},menu:{background:"rgba(255, 255, 255, 0.98)",shadow:"0 4px 20px rgba(0, 0, 0, 0.15)",itemHoverBg:"rgba(0, 0, 0, 0.05)",itemActiveBg:"rgba(0, 112, 243, 0.1)"},captions:{background:"rgba(255, 255, 255, 0.9)",textColor:"#1a1a1a"}},jt={colors:{primary:"#ffffff",background:"transparent"},controls:{height:"40px",background:"transparent"},slider:{trackHeight:"2px",thumbSize:"10px"}},Yt={colors:{primary:"#e50914",background:"rgba(0, 0, 0, 0.85)"},slider:{trackFillBg:"#e50914"},live:{indicatorColor:"#e50914",badgeBg:"#e50914"}},Xt={colors:{primary:"#ff0000",background:"rgba(0, 0, 0, 0.85)"},slider:{trackHeight:"3px",thumbSize:"13px",trackFillBg:"#ff0000"},controls:{height:"48px"},live:{indicatorColor:"#ff0000",badgeBg:"#ff0000"}},Gt={colors:{primary:"#00adef",background:"rgba(0, 0, 0, 0.85)"},slider:{trackFillBg:"#00adef"}},Pe={dark:Kt,light:Wt,minimal:jt,netflix:Yt,youtube:Xt,vimeo:Gt};function Jt(e,t){let i={...e};for(let n of Object.keys(t)){let s=e[n],r=t[n];if(r&&typeof r==="object")i[n]={...s||{},...r};else if(r!==void 0)i[n]=r}return i}function Zt(e,t="tsvp"){let i=Jt(Qt,e),n=[];if(i.colors)n.push(`--${t}-color-primary: ${i.colors.primary};`),n.push(`--${t}-color-secondary: ${i.colors.secondary};`),n.push(`--${t}-color-background: ${i.colors.background};`),n.push(`--${t}-color-text: ${i.colors.text};`),n.push(`--${t}-color-text-on-primary: ${i.colors.textOnPrimary};`),n.push(`--${t}-color-border: ${i.colors.border};`),n.push(`--${t}-color-focus: ${i.colors.focus};`),n.push(`--${t}-color-error: ${i.colors.error};`),n.push(`--${t}-color-success: ${i.colors.success};`),n.push(`--${t}-color-warning: ${i.colors.warning};`);if(i.typography)n.push(`--${t}-font-family: ${i.typography.fontFamily};`),n.push(`--${t}-font-size: ${i.typography.fontSize};`),n.push(`--${t}-font-size-sm: ${i.typography.fontSizeSmall};`),n.push(`--${t}-font-size-lg: ${i.typography.fontSizeLarge};`),n.push(`--${t}-font-weight: ${i.typography.fontWeight};`),n.push(`--${t}-font-weight-bold: ${i.typography.fontWeightBold};`),n.push(`--${t}-line-height: ${i.typography.lineHeight};`);if(i.spacing)n.push(`--${t}-spacing-xs: ${i.spacing.xs};`),n.push(`--${t}-spacing-sm: ${i.spacing.sm};`),n.push(`--${t}-spacing-md: ${i.spacing.md};`),n.push(`--${t}-spacing-lg: ${i.spacing.lg};`),n.push(`--${t}-spacing-xl: ${i.spacing.xl};`);if(i.borderRadius)n.push(`--${t}-radius-sm: ${i.borderRadius.sm};`),n.push(`--${t}-radius-md: ${i.borderRadius.md};`),n.push(`--${t}-radius-lg: ${i.borderRadius.lg};`),n.push(`--${t}-radius-full: ${i.borderRadius.full};`);if(i.shadows)n.push(`--${t}-shadow-sm: ${i.shadows.sm};`),n.push(`--${t}-shadow-md: ${i.shadows.md};`),n.push(`--${t}-shadow-lg: ${i.shadows.lg};`);if(i.transitions)n.push(`--${t}-transition-fast: ${i.transitions.fast};`),n.push(`--${t}-transition-normal: ${i.transitions.normal};`),n.push(`--${t}-transition-slow: ${i.transitions.slow};`),n.push(`--${t}-transition-easing: ${i.transitions.easing};`);if(i.slider)n.push(`--${t}-slider-track-height: ${i.slider.trackHeight};`),n.push(`--${t}-slider-thumb-size: ${i.slider.thumbSize};`),n.push(`--${t}-slider-track-bg: ${i.slider.trackBg};`),n.push(`--${t}-slider-track-fill-bg: ${i.slider.trackFillBg};`),n.push(`--${t}-slider-buffered-bg: ${i.slider.bufferedBg};`),n.push(`--${t}-slider-thumb-bg: ${i.slider.thumbBg};`),n.push(`--${t}-slider-thumb-border: ${i.slider.thumbBorder};`);if(i.controls)n.push(`--${t}-controls-height: ${i.controls.height};`),n.push(`--${t}-controls-bg: ${i.controls.background};`),n.push(`--${t}-controls-padding: ${i.controls.padding};`),n.push(`--${t}-controls-button-size: ${i.controls.buttonSize};`),n.push(`--${t}-controls-icon-size: ${i.controls.iconSize};`),n.push(`--${t}-controls-tooltip-bg: ${i.controls.tooltipBg};`),n.push(`--${t}-controls-tooltip-text: ${i.controls.tooltipText};`);if(i.menu)n.push(`--${t}-menu-bg: ${i.menu.background};`),n.push(`--${t}-menu-radius: ${i.menu.borderRadius};`),n.push(`--${t}-menu-shadow: ${i.menu.shadow};`),n.push(`--${t}-menu-item-height: ${i.menu.itemHeight};`),n.push(`--${t}-menu-item-hover-bg: ${i.menu.itemHoverBg};`),n.push(`--${t}-menu-item-active-bg: ${i.menu.itemActiveBg};`);if(i.captions)n.push(`--${t}-captions-font-family: ${i.captions.fontFamily};`),n.push(`--${t}-captions-font-size: ${i.captions.fontSize};`),n.push(`--${t}-captions-text-color: ${i.captions.textColor};`),n.push(`--${t}-captions-bg: ${i.captions.background};`),n.push(`--${t}-captions-text-shadow: ${i.captions.textShadow};`),n.push(`--${t}-captions-radius: ${i.captions.borderRadius};`),n.push(`--${t}-captions-padding: ${i.captions.padding};`);if(i.thumbnails)n.push(`--${t}-thumbnail-width: ${i.thumbnails.width};`),n.push(`--${t}-thumbnail-height: ${i.thumbnails.height};`),n.push(`--${t}-thumbnail-radius: ${i.thumbnails.borderRadius};`),n.push(`--${t}-thumbnail-border: ${i.thumbnails.border};`),n.push(`--${t}-thumbnail-shadow: ${i.thumbnails.shadow};`);if(i.live)n.push(`--${t}-live-indicator-color: ${i.live.indicatorColor};`),n.push(`--${t}-live-indicator-size: ${i.live.indicatorSize};`),n.push(`--${t}-live-badge-bg: ${i.live.badgeBg};`),n.push(`--${t}-live-badge-text: ${i.live.badgeText};`);return n.join(`
2
2
  `)}function ut(e,t){let i=typeof t==="string"?Pe[t]:t;e.querySelectorAll("style[data-tsvp-theme]").forEach((s)=>s.remove());let n=Zt(i);e.style.cssText+=n.split(`
3
3
  `).map((s)=>s.trim().replace(";","")).join("; ")}var ei={play:"Play",pause:"Pause",replay:"Replay",mute:"Mute",unmute:"Unmute",volume:"Volume",seekBackward:"Seek backward {seconds} seconds",seekForward:"Seek forward {seconds} seconds",seekTo:"Seek to {time}",duration:"Duration",currentTime:"Current time",played:"Played",buffered:"Buffered",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",enterPiP:"Enter picture-in-picture",exitPiP:"Exit picture-in-picture",enableCaptions:"Enable captions",disableCaptions:"Disable captions",captions:"Captions",captionsOff:"Off",settings:"Settings",quality:"Quality",auto:"Auto",speed:"Speed",normal:"Normal",loop:"Loop",loopEnabled:"Loop enabled",loopDisabled:"Loop disabled",audioBoost:"Audio boost",audioTrack:"Audio track",live:"LIVE",liveEdge:"At live edge",seekToLive:"Seek to live edge",behindLive:"{seconds}s behind",networkError:"A network error occurred",mediaError:"The media could not be loaded",unknownError:"An unknown error occurred",loading:"Loading",buffering:"Buffering",chapters:"Chapters",airPlay:"AirPlay",googleCast:"Cast",casting:"Casting to {device}",download:"Download",share:"Share",close:"Close",menu:"Menu",back:"Back"},ti={play:"Reproducir",pause:"Pausar",replay:"Repetir",mute:"Silenciar",unmute:"Activar sonido",volume:"Volumen",seekBackward:"Retroceder {seconds} segundos",seekForward:"Avanzar {seconds} segundos",seekTo:"Ir a {time}",duration:"Duración",currentTime:"Tiempo actual",played:"Reproducido",buffered:"Almacenado",enterFullscreen:"Pantalla completa",exitFullscreen:"Salir de pantalla completa",enterPiP:"Imagen en imagen",exitPiP:"Salir de imagen en imagen",enableCaptions:"Activar subtítulos",disableCaptions:"Desactivar subtítulos",captions:"Subtítulos",captionsOff:"Desactivados",settings:"Ajustes",quality:"Calidad",auto:"Automático",speed:"Velocidad",normal:"Normal",loop:"Bucle",loopEnabled:"Bucle activado",loopDisabled:"Bucle desactivado",audioBoost:"Aumento de audio",audioTrack:"Pista de audio",live:"EN VIVO",liveEdge:"En vivo",seekToLive:"Ir al directo",behindLive:"{seconds}s de retraso",networkError:"Error de red",mediaError:"No se pudo cargar el medio",unknownError:"Error desconocido",loading:"Cargando",buffering:"Almacenando",chapters:"Capítulos",airPlay:"AirPlay",googleCast:"Enviar",casting:"Enviando a {device}",download:"Descargar",share:"Compartir",close:"Cerrar",menu:"Menú",back:"Volver"},ii={play:"Lecture",pause:"Pause",replay:"Relire",mute:"Muet",unmute:"Son activé",volume:"Volume",seekBackward:"Reculer de {seconds} secondes",seekForward:"Avancer de {seconds} secondes",seekTo:"Aller à {time}",duration:"Durée",currentTime:"Temps actuel",played:"Joué",buffered:"Mis en mémoire tampon",enterFullscreen:"Plein écran",exitFullscreen:"Quitter le plein écran",enterPiP:"Image dans l'image",exitPiP:"Quitter l'image dans l'image",enableCaptions:"Activer les sous-titres",disableCaptions:"Désactiver les sous-titres",captions:"Sous-titres",captionsOff:"Désactivés",settings:"Paramètres",quality:"Qualité",auto:"Auto",speed:"Vitesse",normal:"Normal",loop:"Boucle",loopEnabled:"Boucle activée",loopDisabled:"Boucle désactivée",audioBoost:"Amplification audio",audioTrack:"Piste audio",live:"EN DIRECT",liveEdge:"En direct",seekToLive:"Aller au direct",behindLive:"{seconds}s de retard",networkError:"Erreur réseau",mediaError:"Le média n'a pas pu être chargé",unknownError:"Erreur inconnue",loading:"Chargement",buffering:"Mise en mémoire tampon",chapters:"Chapitres",airPlay:"AirPlay",googleCast:"Caster",casting:"Diffusion sur {device}",download:"Télécharger",share:"Partager",close:"Fermer",menu:"Menu",back:"Retour"},ni={play:"Abspielen",pause:"Pause",replay:"Wiederholen",mute:"Stumm",unmute:"Ton an",volume:"Lautstärke",seekBackward:"{seconds} Sekunden zurück",seekForward:"{seconds} Sekunden vor",seekTo:"Zu {time} springen",duration:"Dauer",currentTime:"Aktuelle Zeit",played:"Abgespielt",buffered:"Gepuffert",enterFullscreen:"Vollbild",exitFullscreen:"Vollbild beenden",enterPiP:"Bild-in-Bild",exitPiP:"Bild-in-Bild beenden",enableCaptions:"Untertitel aktivieren",disableCaptions:"Untertitel deaktivieren",captions:"Untertitel",captionsOff:"Aus",settings:"Einstellungen",quality:"Qualität",auto:"Auto",speed:"Geschwindigkeit",normal:"Normal",loop:"Schleife",loopEnabled:"Schleife aktiviert",loopDisabled:"Schleife deaktiviert",audioBoost:"Audio-Verstärkung",audioTrack:"Audiospur",live:"LIVE",liveEdge:"Am Live-Punkt",seekToLive:"Zum Live-Punkt",behindLive:"{seconds}s hinter Live",networkError:"Netzwerkfehler",mediaError:"Medium konnte nicht geladen werden",unknownError:"Unbekannter Fehler",loading:"Wird geladen",buffering:"Puffern",chapters:"Kapitel",airPlay:"AirPlay",googleCast:"Streamen",casting:"Streame zu {device}",download:"Herunterladen",share:"Teilen",close:"Schließen",menu:"Menü",back:"Zurück"},si={play:"再生",pause:"一時停止",replay:"リプレイ",mute:"ミュート",unmute:"ミュート解除",volume:"音量",seekBackward:"{seconds}秒戻る",seekForward:"{seconds}秒進む",seekTo:"{time}にシーク",duration:"長さ",currentTime:"現在の時間",played:"再生済み",buffered:"バッファ済み",enterFullscreen:"フルスクリーン",exitFullscreen:"フルスクリーン終了",enterPiP:"ピクチャーインピクチャー",exitPiP:"ピクチャーインピクチャー終了",enableCaptions:"字幕を有効化",disableCaptions:"字幕を無効化",captions:"字幕",captionsOff:"オフ",settings:"設定",quality:"画質",auto:"自動",speed:"再生速度",normal:"通常",loop:"ループ",loopEnabled:"ループ有効",loopDisabled:"ループ無効",audioBoost:"オーディオブースト",audioTrack:"オーディオトラック",live:"ライブ",liveEdge:"ライブ中",seekToLive:"ライブに移動",behindLive:"{seconds}秒遅れ",networkError:"ネットワークエラー",mediaError:"メディアを読み込めません",unknownError:"不明なエラー",loading:"読み込み中",buffering:"バッファリング",chapters:"チャプター",airPlay:"AirPlay",googleCast:"キャスト",casting:"{device}にキャスト中",download:"ダウンロード",share:"共有",close:"閉じる",menu:"メニュー",back:"戻る"},ri={play:"播放",pause:"暂停",replay:"重播",mute:"静音",unmute:"取消静音",volume:"音量",seekBackward:"后退{seconds}秒",seekForward:"前进{seconds}秒",seekTo:"跳转到{time}",duration:"时长",currentTime:"当前时间",played:"已播放",buffered:"已缓冲",enterFullscreen:"全屏",exitFullscreen:"退出全屏",enterPiP:"画中画",exitPiP:"退出画中画",enableCaptions:"开启字幕",disableCaptions:"关闭字幕",captions:"字幕",captionsOff:"关闭",settings:"设置",quality:"画质",auto:"自动",speed:"播放速度",normal:"正常",loop:"循环",loopEnabled:"循环已开启",loopDisabled:"循环已关闭",audioBoost:"音频增强",audioTrack:"音轨",live:"直播",liveEdge:"直播中",seekToLive:"跳转到直播",behindLive:"落后{seconds}秒",networkError:"网络错误",mediaError:"无法加载媒体",unknownError:"未知错误",loading:"加载中",buffering:"缓冲中",chapters:"章节",airPlay:"AirPlay",googleCast:"投射",casting:"正在投射到{device}",download:"下载",share:"分享",close:"关闭",menu:"菜单",back:"返回"},ai={en:ei,es:ti,fr:ii,de:ni,ja:si,zh:ri};class Y{language;fallbackLanguage;translations;interpolationPattern;constructor(e={}){if(this.language=e.language||this.detectLanguage()||"en",this.fallbackLanguage=e.fallbackLanguage||"en",this.translations={...ai},e.translations){for(let[t,i]of Object.entries(e.translations))if(i)this.translations[t]={...this.translations[t],...i}}this.interpolationPattern=e.interpolationPattern||/\{(\w+)\}/g}detectLanguage(){if(typeof navigator>"u")return null;let e=navigator.language||navigator.userLanguage;if(!e)return null;if(this.translations[e])return e;let t=e.split("-")[0];if(this.translations[t])return t;return null}getLanguage(){return this.language}setLanguage(e){this.language=e}t(e,t){let i=this.translations[this.language]?.[e];if(!i)i=this.translations[this.fallbackLanguage]?.[e];if(!i)return e;if(t)i=i.replace(this.interpolationPattern,(n,s)=>{let r=t[s];return r!==void 0?String(r):n});return i}addTranslations(e,t){this.translations[e]={...this.translations[e],...t}}getTranslations(e){return this.translations[e]}getAvailableLanguages(){return Object.keys(this.translations)}hasLanguage(e){return e in this.translations}}var Ae=null;function oi(e){return new Y(e)}function li(e){if(!Ae)Ae=oi(e);return Ae}function pt(e,t){return li().t(e,t)}var di={name:"default",description:"Full-featured default layout with all controls",styles:`
4
4
  .tsvp-layout-default {
@@ -620,6 +620,7 @@ class YouTubeProvider2 extends BaseProvider2 {
620
620
  player = null;
621
621
  iframe = null;
622
622
  pendingVideoId = null;
623
+ playerReady = false;
623
624
  startTime;
624
625
  endTime;
625
626
  timeUpdateInterval = null;
@@ -650,8 +651,8 @@ class YouTubeProvider2 extends BaseProvider2 {
650
651
  if (this.options.youtubeParams) {
651
652
  Object.assign(playerVars, this.options.youtubeParams);
652
653
  }
653
- playerVars.host = "https://www.youtube-nocookie.com";
654
- this.player = new window.YT.Player(playerDiv.id, {
654
+ this.player = new window.YT.Player(playerDiv, {
655
+ host: "https://www.youtube-nocookie.com",
655
656
  width: "100%",
656
657
  height: "100%",
657
658
  playerVars,
@@ -697,9 +698,11 @@ class YouTubeProvider2 extends BaseProvider2 {
697
698
  }
698
699
  this.player?.destroy();
699
700
  this.player = null;
701
+ this.playerReady = false;
700
702
  this.iframe = null;
701
703
  }
702
704
  onReady() {
705
+ this.playerReady = true;
703
706
  this.timeUpdateInterval = setInterval(() => {
704
707
  if (this.player && this.lastState === 1) {
705
708
  this.events.emit("timeupdate", this.getCurrentTime());
@@ -772,7 +775,7 @@ class YouTubeProvider2 extends BaseProvider2 {
772
775
  }
773
776
  this.startTime = parsed.startTime;
774
777
  this.endTime = parsed.endTime;
775
- if (!this.player || !this._ready) {
778
+ if (!this.player || !this._ready || !this.playerReady) {
776
779
  this.pendingVideoId = parsed.videoId;
777
780
  return;
778
781
  }
@@ -23,7 +23,7 @@ import {
23
23
  MediaErrorDisplay2,
24
24
  MediaRemotePlaybackButton2,
25
25
  registerElements2
26
- } from "../chunk-d352kdh6.js";
26
+ } from "../chunk-yfrrczn9.js";
27
27
  export {
28
28
  MediaAirplayButton2 as MediaAirplayButton,
29
29
  MediaErrorDisplay2 as MediaErrorDisplay,
package/dist/index.js CHANGED
@@ -51,7 +51,7 @@ import {
51
51
  applyPosition2,
52
52
  MediaSettingsMenu2,
53
53
  registerElements2
54
- } from "./chunk-d352kdh6.js";
54
+ } from "./chunk-yfrrczn9.js";
55
55
  import {
56
56
  playback2,
57
57
  volume2,
@@ -56,6 +56,8 @@ declare global {
56
56
  YT?: {
57
57
  Player: new (elementId: string | HTMLElement, options: {
58
58
  videoId?: string;
59
+ /** Where the iframe is served from, e.g. https://www.youtube-nocookie.com. */
60
+ host?: string;
59
61
  width?: number | string;
60
62
  height?: number | string;
61
63
  playerVars?: Record<string, string | number>;
@@ -88,6 +90,8 @@ export declare class YouTubeProvider extends BaseProvider {
88
90
  private player;
89
91
  private iframe;
90
92
  private pendingVideoId;
93
+ /** YouTube's own ready event: the player's methods exist only after it. */
94
+ private playerReady;
91
95
  private startTime?;
92
96
  private endTime?;
93
97
  private timeUpdateInterval;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-video-player",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "A modern, framework-agnostic video player with deep stx integration",
5
5
  "author": "Chris Breuer <chris@stacksjs.org>",
6
6
  "license": "MIT",
@@ -145,6 +145,8 @@ declare global {
145
145
  elementId: string | HTMLElement,
146
146
  options: {
147
147
  videoId?: string
148
+ /** Where the iframe is served from, e.g. https://www.youtube-nocookie.com. */
149
+ host?: string
148
150
  width?: number | string
149
151
  height?: number | string
150
152
  playerVars?: Record<string, string | number>
@@ -184,6 +186,8 @@ export class YouTubeProvider extends BaseProvider {
184
186
  private player: YTPlayer | null = null
185
187
  private iframe: HTMLIFrameElement | null = null
186
188
  private pendingVideoId: string | null = null
189
+ /** YouTube's own ready event: the player's methods exist only after it. */
190
+ private playerReady = false
187
191
  private startTime?: number
188
192
  private endTime?: number
189
193
  private timeUpdateInterval: ReturnType<typeof setInterval> | null = null
@@ -227,11 +231,14 @@ export class YouTubeProvider extends BaseProvider {
227
231
  Object.assign(playerVars, this.options.youtubeParams)
228
232
  }
229
233
 
230
- // Use privacy-enhanced mode
231
- playerVars.host = 'https://www.youtube-nocookie.com'
232
234
 
233
- // Create player
234
- this.player = new window.YT!.Player(playerDiv.id, {
235
+ // Create player. The element, not its id: the API looks an id up with
236
+ // document.getElementById, which cannot see into the shadow root the
237
+ // <video-player> element renders into, so an id found nothing there.
238
+ this.player = new window.YT!.Player(playerDiv, {
239
+ // Privacy-enhanced mode. A top-level option: set among playerVars, the
240
+ // API ignored it and embedded from youtube.com.
241
+ host: 'https://www.youtube-nocookie.com',
235
242
  width: '100%',
236
243
  height: '100%',
237
244
  playerVars,
@@ -287,12 +294,15 @@ export class YouTubeProvider extends BaseProvider {
287
294
 
288
295
  this.player?.destroy()
289
296
  this.player = null
297
+ this.playerReady = false
290
298
  this.iframe = null
291
299
  }
292
300
 
293
301
  // === Event Handlers ===
294
302
 
295
303
  private onReady(): void {
304
+ this.playerReady = true
305
+
296
306
  // Start time update polling
297
307
  this.timeUpdateInterval = setInterval(() => {
298
308
  if (this.player && this.lastState === 1) {
@@ -383,7 +393,10 @@ export class YouTubeProvider extends BaseProvider {
383
393
  this.startTime = parsed.startTime
384
394
  this.endTime = parsed.endTime
385
395
 
386
- if (!this.player || !this._ready) {
396
+ // `_ready` means setup finished, which is before YouTube has attached
397
+ // cueVideoById and friends to the player: calling one then threw, and the
398
+ // source was reported as unplayable. onReady loads the pending video.
399
+ if (!this.player || !this._ready || !this.playerReady) {
387
400
  this.pendingVideoId = parsed.videoId
388
401
  return
389
402
  }