ts-video-player 0.1.2 → 0.1.4
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 +1 -1
- package/dist/{chunk-d352kdh6.js → chunk-hfd9k46d.js} +9 -3
- package/dist/elements/index.js +1 -1
- package/dist/index.js +1 -1
- package/dist/providers/youtube.d.ts +4 -0
- package/package.json +1 -1
- package/src/player.ts +4 -0
- package/src/providers/vimeo.ts +2 -0
- package/src/providers/youtube.ts +20 -5
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",this.iframe.style.cssText="position:absolute;inset:0;width:100%;height:100%;border:0"}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.iframe.style.cssText="position:absolute;inset:0;width:100%;height:100%;border:0";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",e.style.cssText="position:relative;width:100%;height:100%",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
|
-
|
|
654
|
-
|
|
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,
|
|
@@ -665,6 +666,7 @@ class YouTubeProvider2 extends BaseProvider2 {
|
|
|
665
666
|
});
|
|
666
667
|
this.iframe = this.player.getIframe();
|
|
667
668
|
this.iframe.className = "ts-video-player__media";
|
|
669
|
+
this.iframe.style.cssText = "position:absolute;inset:0;width:100%;height:100%;border:0";
|
|
668
670
|
}
|
|
669
671
|
async loadYouTubeAPI() {
|
|
670
672
|
if (window.YT?.Player)
|
|
@@ -697,9 +699,11 @@ class YouTubeProvider2 extends BaseProvider2 {
|
|
|
697
699
|
}
|
|
698
700
|
this.player?.destroy();
|
|
699
701
|
this.player = null;
|
|
702
|
+
this.playerReady = false;
|
|
700
703
|
this.iframe = null;
|
|
701
704
|
}
|
|
702
705
|
onReady() {
|
|
706
|
+
this.playerReady = true;
|
|
703
707
|
this.timeUpdateInterval = setInterval(() => {
|
|
704
708
|
if (this.player && this.lastState === 1) {
|
|
705
709
|
this.events.emit("timeupdate", this.getCurrentTime());
|
|
@@ -772,7 +776,7 @@ class YouTubeProvider2 extends BaseProvider2 {
|
|
|
772
776
|
}
|
|
773
777
|
this.startTime = parsed.startTime;
|
|
774
778
|
this.endTime = parsed.endTime;
|
|
775
|
-
if (!this.player || !this._ready) {
|
|
779
|
+
if (!this.player || !this._ready || !this.playerReady) {
|
|
776
780
|
this.pendingVideoId = parsed.videoId;
|
|
777
781
|
return;
|
|
778
782
|
}
|
|
@@ -1025,6 +1029,7 @@ class VimeoProvider2 extends BaseProvider2 {
|
|
|
1025
1029
|
this.iframe = this.container_el.querySelector("iframe");
|
|
1026
1030
|
if (this.iframe) {
|
|
1027
1031
|
this.iframe.className = "ts-video-player__media";
|
|
1032
|
+
this.iframe.style.cssText = "position:absolute;inset:0;width:100%;height:100%;border:0";
|
|
1028
1033
|
}
|
|
1029
1034
|
this.attachVimeoEvents();
|
|
1030
1035
|
this.events.emit("loadedmetadata");
|
|
@@ -2061,6 +2066,7 @@ class Player2 {
|
|
|
2061
2066
|
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");
|
|
2062
2067
|
const mediaContainer = document.createElement("div");
|
|
2063
2068
|
mediaContainer.className = "ts-video-player__container";
|
|
2069
|
+
mediaContainer.style.cssText = "position:relative;width:100%;height:100%";
|
|
2064
2070
|
this._el.appendChild(mediaContainer);
|
|
2065
2071
|
if (this._options.announcements !== false) {
|
|
2066
2072
|
const liveRegion = document.createElement("div");
|
package/dist/elements/index.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -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
package/src/player.ts
CHANGED
|
@@ -108,6 +108,10 @@ export class Player implements IPlayer {
|
|
|
108
108
|
// Create inner structure
|
|
109
109
|
const mediaContainer = document.createElement('div')
|
|
110
110
|
mediaContainer.className = 'ts-video-player__container'
|
|
111
|
+
// Sized here, not only in a stylesheet: inside <video-player>'s shadow
|
|
112
|
+
// root no page stylesheet reaches it, and an embed's iframe sizes itself
|
|
113
|
+
// from this box.
|
|
114
|
+
mediaContainer.style.cssText = 'position:relative;width:100%;height:100%'
|
|
111
115
|
this._el.appendChild(mediaContainer)
|
|
112
116
|
|
|
113
117
|
// Create ARIA live region for screen reader announcements
|
package/src/providers/vimeo.ts
CHANGED
|
@@ -274,6 +274,8 @@ export class VimeoProvider extends BaseProvider {
|
|
|
274
274
|
this.iframe = this.container_el.querySelector('iframe')
|
|
275
275
|
if (this.iframe) {
|
|
276
276
|
this.iframe.className = 'ts-video-player__media'
|
|
277
|
+
// Filling the player, whatever size the provider's API gave the frame.
|
|
278
|
+
this.iframe.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;border:0'
|
|
277
279
|
}
|
|
278
280
|
|
|
279
281
|
// Setup event listeners
|
package/src/providers/youtube.ts
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
@@ -247,6 +254,8 @@ export class YouTubeProvider extends BaseProvider {
|
|
|
247
254
|
// Get iframe reference
|
|
248
255
|
this.iframe = this.player.getIframe()
|
|
249
256
|
this.iframe.className = 'ts-video-player__media'
|
|
257
|
+
// Filling the player, whatever size the provider's API gave the frame.
|
|
258
|
+
this.iframe.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;border:0'
|
|
250
259
|
}
|
|
251
260
|
|
|
252
261
|
private async loadYouTubeAPI(): Promise<void> {
|
|
@@ -287,12 +296,15 @@ export class YouTubeProvider extends BaseProvider {
|
|
|
287
296
|
|
|
288
297
|
this.player?.destroy()
|
|
289
298
|
this.player = null
|
|
299
|
+
this.playerReady = false
|
|
290
300
|
this.iframe = null
|
|
291
301
|
}
|
|
292
302
|
|
|
293
303
|
// === Event Handlers ===
|
|
294
304
|
|
|
295
305
|
private onReady(): void {
|
|
306
|
+
this.playerReady = true
|
|
307
|
+
|
|
296
308
|
// Start time update polling
|
|
297
309
|
this.timeUpdateInterval = setInterval(() => {
|
|
298
310
|
if (this.player && this.lastState === 1) {
|
|
@@ -383,7 +395,10 @@ export class YouTubeProvider extends BaseProvider {
|
|
|
383
395
|
this.startTime = parsed.startTime
|
|
384
396
|
this.endTime = parsed.endTime
|
|
385
397
|
|
|
386
|
-
|
|
398
|
+
// `_ready` means setup finished, which is before YouTube has attached
|
|
399
|
+
// cueVideoById and friends to the player: calling one then threw, and the
|
|
400
|
+
// source was reported as unplayable. onReady loads the pending video.
|
|
401
|
+
if (!this.player || !this._ready || !this.playerReady) {
|
|
387
402
|
this.pendingVideoId = parsed.videoId
|
|
388
403
|
return
|
|
389
404
|
}
|