boss-web-player-sdk 1.1.20 → 1.1.21

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.
@@ -43,7 +43,7 @@ Schedule: ${o.map(e=>Cc(e))} pos: ${this.timelinePos}`),c.length&&this.log(`Remo
43
43
  <h4 style="margin:0 0 10px 0;">Content Protection Alert</h4>
44
44
  <p style="font-size:13px; margin:0; opacity:0.8;">${t}</p>
45
45
  </div>
46
- `,Error(t)}this.videoElement=document.createElement(`video`),this.videoElement.className=`sdk-html5-video`,this.videoElement.style.width=`100%`,this.videoElement.style.height=`100%`,this.videoElement.style.display=`block`,this.videoElement.style.backgroundColor=`#000000`,this.videoElement.playsInline=!0,this.videoElement.controls=!1,this.videoElement.muted=!!this.options.muted,this.options.container.appendChild(this.videoElement),this.drm.setupWatermark(this.options.container),this.bindMediaEvents(),this.loadSource(this.options.src),this.setupBackgroundControls()}bindMediaEvents(){let e=this.videoElement;e.addEventListener(`play`,()=>{this.analytics.track(`play`,e,this.getAnalyticsPayload()),this.analytics.startHeartbeat(e,()=>this.getAnalyticsPayload(),this.options.watchProgressInterval),this.emit(`play`,null)}),e.addEventListener(`pause`,()=>{this.clearStallWatchdog(),this.analytics.track(`pause`,e,this.getAnalyticsPayload()),this.analytics.stopHeartbeat(),this.emit(`pause`,null)}),e.addEventListener(`progress`,()=>{this.progressTick++}),e.addEventListener(`timeupdate`,()=>{let t=e.currentTime;if(e.seeking||(this.lastPlaybackPos=t),this.chapters.updateTime(t),this.refreshAdBreakState(t),this.isAdBreak)this.subtitles.setCustomSubtitleText(``);else if(this.subtitles.updateTime(this.videoTimeToContentTime(t)),this.hlsActiveSubtitleKey!==null){let e=(this.hlsSubtitleCues.get(this.hlsActiveSubtitleKey)??[]).filter(e=>t>=e.startTime&&t<e.endTime);this.subtitles.setCustomSubtitleText(e.map(e=>e.text).join(`<br />`))}this.emit(`timeupdate`,t)}),e.addEventListener(`seeking`,()=>{let t=this.lastPlaybackPos,n=e.currentTime,r=this.pendingSeekAttribution&&Date.now()<this.pendingSeekAttribution.expiresAt?this.pendingSeekAttribution:null;this.pendingSeekAttribution=null,r?this.analytics.track(r.eventType,e,{...this.getAnalyticsPayload(),...r.extras}):this.analytics.track(`seek`,e,{...this.getAnalyticsPayload(),seekFrom:t,seekTo:n}),this.lastPlaybackPos=n,this.emit(`seeking`,e.currentTime)}),e.addEventListener(`waiting`,()=>{this.isBuffering=!0,this.armStallWatchdog(),this.analytics.setBuffering(!0,e,()=>this.getAnalyticsPayload()),this.emit(`buffering`,!0)}),e.addEventListener(`playing`,()=>{this.isBuffering=!1,this.clearStallWatchdog(),this.analytics.setBuffering(!1,e,()=>this.getAnalyticsPayload()),this.emit(`buffering`,!1)}),e.addEventListener(`volumechange`,()=>{this.analytics.track(`volume_change`,e,this.getAnalyticsPayload()),this.emit(`volumechange`,{volume:e.volume,muted:e.muted})}),e.addEventListener(`ratechange`,()=>{this.analytics.track(`speed_change`,e,this.getAnalyticsPayload()),this.emit(`ratechange`,e.playbackRate)}),e.addEventListener(`ended`,()=>{this.refreshAdBreakState(1/0),this.analytics.track(`ended`,e,this.getAnalyticsPayload()),this.analytics.track(`complete`,e,{...this.getAnalyticsPayload(),watchPercentage:100}),this.analytics.stopHeartbeat(),this.emit(`ended`,null)}),e.addEventListener(`enterpictureinpicture`,()=>{this.analytics.track(`pip_toggle`,e,{...this.getAnalyticsPayload(),errorMessage:`entered`}),this.emit(`pipchange`,!0)}),e.addEventListener(`leavepictureinpicture`,()=>{this.analytics.track(`pip_toggle`,e,{...this.getAnalyticsPayload(),errorMessage:`exited`}),this.emit(`pipchange`,!1)}),e.addEventListener(`error`,()=>{let t=e.error;this.analytics.track(`error`,e,{...this.getAnalyticsPayload(),errorMessage:t?`${t.code}: ${t.message}`:`Unknown HTML5 video playback error`,errorCode:t?.code,isRecoverable:!1}),this.fail(t instanceof Error?t:Error(t?`${t.code}: ${t.message}`:`Unknown HTML5 video playback error`))});let t=e.textTracks;if(t){let n=(e,t)=>{if(e.kind!==`subtitles`&&e.kind!==`captions`||this.subtitles.getTracks().some(e=>e.isNative&&e.nativeTrackIndex===t))return;let n=e.kind===`captions`;this.subtitles.addTrack({id:`native-${t}`,label:e.label||e.language||(n?`CC ${t+1}`:`Track ${t+1}`),lang:e.language||`und`,isDefault:!this.hlsInstance&&(e.default||e.mode===`showing`),isNative:!0,nativeTrackIndex:t})};e.addEventListener(`loadedmetadata`,()=>{this.analytics.track(`video_loaded`,e,this.getAnalyticsPayload()),this.refreshAdBreakState(e.currentTime);let r=0,i=this.hlsInstance?[`captions`]:[`subtitles`,`captions`];for(let e=0;e<t.length;e++){if(!i.includes(t[e].kind))continue;let a=this.subtitles.getTracks().length;n(t[e],e),this.subtitles.getTracks().length>a&&r++}r>0&&this.emit(`subtitlesloaded`,this.subtitles.getTracks())}),t.addEventListener(`addtrack`,e=>{let r=e.track;if(r)for(let e=0;e<t.length;e++){if(t[e]!==r)continue;let i=this.subtitles.getTracks().length;n(r,e),this.subtitles.getTracks().length>i&&this.emit(`subtitlesloaded`,this.subtitles.getTracks());break}})}this.subtitles.onTrackSwitch(e=>{if(this.analytics.track(`subtitle_change`,this.videoElement,{...this.getAnalyticsPayload(),subtitleEnabled:e!==null,subtitleLanguage:e?.lang??``}),e===null||!e.isHls&&!e.isNative){if(this.hlsInstance)this.hlsInstance.subtitleTrack=-1;else if(t){for(let e=0;e<t.length;e++)t[e].mode=`disabled`,t[e].oncuechange=null;this.subtitles.setCustomSubtitleText(``)}}else if(e.isHls)this.hlsInstance&&e.hlsTrackId!==void 0&&(this.hlsInstance.subtitleTrack=e.hlsTrackId);else if(e.isNative&&t&&e.nativeTrackIndex!==void 0&&t[e.nativeTrackIndex])for(let n=0;n<t.length;n++)if(t[n].oncuechange=null,n===e.nativeTrackIndex){t[n].mode=`hidden`;let e=t[n];e.oncuechange=()=>{if(this.isAdBreak){this.subtitles.setCustomSubtitleText(``);return}let t=e.activeCues;if(t&&t.length>0){let e=Array.from(t).map(e=>e.text).join(`<br />`);this.subtitles.setCustomSubtitleText(e)}else this.subtitles.setCustomSubtitleText(``)}}else t[n].mode=`disabled`})}rewriteToProxy(e){return this.options.urlTransformer?this.options.urlTransformer(e):e}async loadSource(t){this.armStallWatchdog(),this.adBreaksFromAvails=!1,this.extractKeyMomentsFromManifest(t),this.extractAdBreaksFromManifest(t),this.extractSubtitlesFromManifest(t);let n=this.rewriteToProxy(t),r=n.endsWith(`.m3u8`)||n.includes(`.m3u8`),i=n.endsWith(`.mpd`)||n.includes(`.mpd`);if(r)if($.isSupported()){let r=new $({enableWorker:!0,lowLatencyMode:!0,backBufferLength:90,maxMaxBufferLength:30,renderTextTracksNatively:!1,xhrSetup:(e,n)=>{let r=this.drm.getAuthToken();if(!r)try{let e=new URL(t),n=e.searchParams.get(`token`)||e.searchParams.get(`key`)||e.searchParams.get(`auth`)||e.searchParams.get(`authToken`);n&&(r=n)}catch{}let i=this.drm.getAuthHeader();try{let t=this.rewriteToProxy(n),a=new URL(t,window.location.origin);r&&(i?e.setRequestHeader(i,r):a.searchParams.set(`token`,r)),e.open(`GET`,a.toString(),!0)}catch(e){console.error(`[PlayerSDK Core] Error in xhrSetup URL parsing:`,e)}}});this.hlsInstance=r,r.loadSource(n),r.attachMedia(this.videoElement),r.on($.Events.LEVEL_LOADED,(e,t)=>{if(this.adBreaksFromAvails)return;let n=this.parseAdBreaksFromFragments(t.details.fragments);this.sameAdBreaks(n,this.adBreaks)||(this.adBreaks=n,this.analytics.setAdBreaks(n),this.emit(`adbreaksloaded`,n),this.refreshAdBreakState(this.videoElement.currentTime))}),r.on($.Events.SUBTITLE_TRACKS_UPDATED,()=>{if(r.subtitleTracks.length===0)return;let e=r.subtitleTracks.map((e,t)=>({id:`subtitle-hls-${t}`,label:e.name||e.lang||`Track ${t+1}`,lang:e.lang||`und`,isDefault:!!e.default,isHls:!0,hlsTrackId:t}));this.subtitles.setHlsTracks(e),this.emit(`subtitlesloaded`,this.subtitles.getTracks())}),r.on($.Events.SUBTITLE_TRACK_SWITCH,(e,t)=>{if(this.hlsActiveSubtitleKey=null,this.subtitles.setCustomSubtitleText(``),t.id!==-1){let e=r.subtitleTracks[t.id];this.hlsActiveSubtitleKey=e?.default?`default`:`subtitles${t.id}`}}),r.on($.Events.CUES_PARSED,(e,t)=>{let n=this.hlsSubtitleCues.get(t.track)??[],r=t.cues.filter(e=>!n.some(t=>t.startTime===e.startTime&&t.endTime===e.endTime));r.length>0&&this.hlsSubtitleCues.set(t.track,[...n,...r])}),r.on($.Events.FRAG_LOADED,()=>{this.networkErrorRetries=0,this.mediaErrorRecovered=!1,this.progressTick++}),r.on($.Events.MANIFEST_LOADED,()=>{this.progressTick++}),r.on($.Events.LEVEL_LOADED,()=>{this.progressTick++}),r.on($.Events.MANIFEST_PARSED,()=>{this.qualityLevels=r.levels.map((e,t)=>({id:t,height:e.height,width:e.width,bitrate:e.bitrate,label:e.height?`${e.height}p`:`Option ${t+1}`}));let e={id:-1,height:0,width:0,bitrate:0,label:`Auto`};this.qualityLevels.unshift(e),this.activeQuality=e,this.emit(`qualitylevels`,this.qualityLevels),r.levels.length>0&&!this.hasPlayableLevel(r.levels)&&this.emit(`unsupportedcodec`,null),this.options.autoplay&&this.play()}),r.on($.Events.AUDIO_TRACKS_UPDATED,()=>{r.audioTracks.length>1&&(this.audioTrackList=r.audioTracks.map((e,t)=>({id:t,label:e.name||e.lang||`Audio ${t+1}`,lang:e.lang||``})),this.emit(`audiotracksloaded`,this.audioTrackList))}),r.on($.Events.AUDIO_TRACK_SWITCHED,(e,t)=>{let n=this.audioTrackList.find(e=>e.id===t.id);this.analytics.track(`audio_track_change`,this.videoElement,{...this.getAnalyticsPayload(),audioTrack:n?.label??``}),this.emit(`audiotrackchange`,t.id)}),r.on($.Events.LEVEL_SWITCHED,(e,t)=>{let n=this.qualityLevels.find(e=>e.id===t.level);n&&(this.analytics.track(`quality_change`,this.videoElement,{...this.getAnalyticsPayload(),rendition:n.label,bitrate:n.bitrate,isAutoSwitch:r.autoLevelEnabled}),this.emit(`qualitychange`,n))}),r.on($.Events.ERROR,(t,n)=>{let i=n.response?.code;if(i&&e.TERMINAL_HTTP_STATUSES.includes(i)){this.analytics.track(`network_error`,this.videoElement,{...this.getAnalyticsPayload(),errorMessage:n.details,errorCode:i,isRecoverable:!1}),this.fail(Error(`Network error ${i}: ${n.details}`));return}n.fatal&&(n.type===$.ErrorTypes.NETWORK_ERROR?(this.analytics.track(`network_error`,this.videoElement,{...this.getAnalyticsPayload(),errorMessage:n.details,errorCode:i??0,isRecoverable:this.networkErrorRetries<e.MAX_NETWORK_RETRIES}),this.networkErrorRetries<e.MAX_NETWORK_RETRIES?(this.networkErrorRetries++,r.startLoad()):this.fail(Error(`Network error: ${n.details}`))):n.type===$.ErrorTypes.MEDIA_ERROR?this.mediaErrorRecovered?this.fail(Error(`Media error: ${n.details}`)):(this.mediaErrorRecovered=!0,r.recoverMediaError()):this.fail(Error(`Playback error: ${n.details}`)))})}else this.videoElement.canPlayType(`application/vnd.apple.mpegurl`)&&(this.videoElement.src=t,this.qualityLevels=[{id:0,height:720,width:1280,bitrate:2e6,label:`720p (Native)`}],this.activeQuality=this.qualityLevels[0],this.options.autoplay&&this.videoElement.play().catch(console.error));else if(i){let e=await Promise.resolve().then(()=>require("./dash.all.min-CkVT4O2X.cjs")).catch(()=>null);if(!e){console.error(`[SDK] dashjs not installed — install it to use DASH streams`);return}let n=e.MediaPlayer().create();this.dashInstance=n,n.initialize(this.videoElement,t,!!this.options.autoplay),n.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:!0,audio:!0}},buffer:{bufferTimeAtTopQuality:30}}}),this.qualityLevels=[{id:0,height:0,width:0,bitrate:0,label:`Auto (DASH)`}],this.activeQuality=this.qualityLevels[0],this.emit(`qualitylevels`,this.qualityLevels)}else this.videoElement.src=t,this.qualityLevels=[{id:0,height:1080,width:1920,bitrate:45e5,label:`1080p (Source)`}],this.activeQuality=this.qualityLevels[0],this.options.autoplay&&this.videoElement.play().catch(console.error)}setupBackgroundControls(){if(`mediaSession`in navigator){navigator.mediaSession.metadata=new MediaMetadata({title:`Video Player`,album:`Video Player`,artwork:[{src:`https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=512&q=80`,sizes:`512x512`,type:`image/jpeg`}]});try{navigator.mediaSession.setActionHandler(`play`,()=>this.play()),navigator.mediaSession.setActionHandler(`pause`,()=>this.pause()),navigator.mediaSession.setActionHandler(`seekbackward`,e=>{let t=e.seekOffset||10;this.attributeNextSeek(`fast_backward`,{skipSeconds:t}),this.seek(this.videoElement.currentTime-t)}),navigator.mediaSession.setActionHandler(`seekforward`,e=>{let t=e.seekOffset||10;this.attributeNextSeek(`fast_forward`,{skipSeconds:t}),this.seek(this.videoElement.currentTime+t)})}catch{console.warn(`[PlayerSDK Session] Action handler binding is unsupported by browser.`)}}}play(){this.videoElement.play().catch(e=>{console.warn(`[PlayerSDK Play] Autoplay blocked, wait for user interaction:`,e)})}pause(){this.videoElement.pause()}seek(e){let t=Math.max(0,Math.min(e,this.getDuration()));this.videoElement.currentTime=t}attributeNextSeek(e,t={}){this.pendingSeekAttribution={eventType:e,extras:t,expiresAt:Date.now()+1500}}setVolume(e){let t=Math.max(0,Math.min(e,1));this.videoElement.volume=t,this.videoElement.muted=t===0}setMute(e){this.videoElement.muted!==e&&this.analytics.track(`mute`,this.videoElement,{...this.getAnalyticsPayload(),isMuted:e}),this.videoElement.muted=e}setPlaybackRate(e){this.contentPlaybackRate=e,this.isAdBreak||(this.videoElement.playbackRate=e)}setQuality(e){let t=this.qualityLevels.find(t=>t.id===e);t&&(this.activeQuality=t,this.hlsInstance?this.hlsInstance.currentLevel=e:console.warn(`[PlayerSDK Core] Manual rendition switching is not supported by standard native players.`))}async togglePictureInPicture(){if(!document.pictureInPictureEnabled)return console.warn(`[PlayerSDK Core] Picture-in-Picture is disabled or unsupported.`),!1;try{return document.pictureInPictureElement?(await document.exitPictureInPicture(),!1):(await this.videoElement.requestPictureInPicture(),!0)}catch(e){return console.error(`[PlayerSDK Core] PiP toggle failed:`,e),!1}}toggleFullscreen(){let e=this.options.container;document.fullscreenElement?document.exitFullscreen():e.requestFullscreen().catch(e=>{console.error(`[PlayerSDK Fullscreen] Failed entering fullscreen:`,e)})}getVideoElement(){return this.videoElement}getCurrentTime(){return this.videoElement.currentTime}getDuration(){return this.videoElement.duration||0}getVolume(){return this.videoElement.volume}isMuted(){return this.videoElement.muted}getPlaybackRate(){return this.videoElement.playbackRate}getActiveQuality(){return this.activeQuality}getQualityLevels(){return this.qualityLevels}getBufferLength(){let e=this.videoElement.buffered,t=this.videoElement.currentTime;for(let n=0;n<e.length;n++)if(t>=e.start(n)&&t<=e.end(n))return e.end(n)-t;return 0}getBufferedRanges(){let e=this.videoElement.buffered,t=[];for(let n=0;n<e.length;n++)t.push({start:e.start(n),end:e.end(n)});return t}hasPlayableLevel(e){if(typeof MediaSource>`u`||!MediaSource.isTypeSupported)return!0;let t=(e,t)=>{if(!t)return!0;try{return MediaSource.isTypeSupported(`${e}; codecs="${t}"`)}catch{return!0}};return e.some(e=>t(`video/mp4`,e.videoCodec)&&t(`audio/mp4`,e.audioCodec))}getAnalyticsPayload(){return{rendition:this.activeQuality.label,bitrate:this.activeQuality.bitrate,volume:this.videoElement.volume,speed:this.videoElement.playbackRate}}on(e,t){this.eventListeners[e]||(this.eventListeners[e]=[]),this.eventListeners[e].push(t)}off(e,t){this.eventListeners[e]&&(this.eventListeners[e]=this.eventListeners[e].filter(e=>e!==t))}emit(e,...t){this.eventListeners[e]&&this.eventListeners[e].forEach(e=>e(...t))}async extractSubtitlesFromManifest(e){try{let t=await this.buildManifestUrl(e),n=await fetch(t,{headers:this.drm.getRequestHeaders()});if(!n.ok)return;let r=(await n.text()).split(`
46
+ `,Error(t)}this.videoElement=document.createElement(`video`),this.videoElement.className=`sdk-html5-video`,this.videoElement.style.width=`100%`,this.videoElement.style.height=`100%`,this.videoElement.style.display=`block`,this.videoElement.style.backgroundColor=`#000000`,this.videoElement.playsInline=!0,this.videoElement.controls=!1,this.videoElement.muted=!!this.options.muted,this.options.container.appendChild(this.videoElement),this.drm.setupWatermark(this.options.container),this.bindMediaEvents(),this.loadSource(this.options.src),this.setupBackgroundControls()}bindMediaEvents(){let e=this.videoElement;e.addEventListener(`play`,()=>{this.analytics.track(`play`,e,this.getAnalyticsPayload()),this.analytics.startHeartbeat(e,()=>this.getAnalyticsPayload(),this.options.watchProgressInterval),this.emit(`play`,null)}),e.addEventListener(`pause`,()=>{this.clearStallWatchdog(),this.analytics.track(`pause`,e,this.getAnalyticsPayload()),this.analytics.stopHeartbeat(),this.emit(`pause`,null)}),e.addEventListener(`progress`,()=>{this.progressTick++}),e.addEventListener(`timeupdate`,()=>{let t=e.currentTime;if(e.seeking||(this.lastPlaybackPos=t),this.chapters.updateTime(t),this.refreshAdBreakState(t),this.isAdBreak)this.subtitles.setCustomSubtitleText(``);else if(this.subtitles.updateTime(this.videoTimeToContentTime(t)),this.hlsActiveSubtitleKey!==null){let e=(this.hlsSubtitleCues.get(this.hlsActiveSubtitleKey)??[]).filter(e=>t>=e.startTime&&t<e.endTime);this.subtitles.setCustomSubtitleText(e.map(e=>e.text).join(`<br />`))}this.emit(`timeupdate`,t)}),e.addEventListener(`seeking`,()=>{let t=this.lastPlaybackPos,n=e.currentTime,r=this.pendingSeekAttribution&&Date.now()<this.pendingSeekAttribution.expiresAt?this.pendingSeekAttribution:null;this.pendingSeekAttribution=null,r?this.analytics.track(r.eventType,e,{...this.getAnalyticsPayload(),...r.extras}):this.analytics.track(`seek`,e,{...this.getAnalyticsPayload(),seekFrom:t,seekTo:n}),this.lastPlaybackPos=n,this.emit(`seeking`,e.currentTime)}),e.addEventListener(`waiting`,()=>{this.isBuffering=!0,this.armStallWatchdog(),this.analytics.setBuffering(!0,e,()=>this.getAnalyticsPayload()),this.emit(`buffering`,!0)}),e.addEventListener(`playing`,()=>{this.isBuffering=!1,this.clearStallWatchdog(),this.analytics.setBuffering(!1,e,()=>this.getAnalyticsPayload()),this.emit(`buffering`,!1)}),e.addEventListener(`volumechange`,()=>{this.analytics.track(`volume_change`,e,this.getAnalyticsPayload()),this.emit(`volumechange`,{volume:e.volume,muted:e.muted})}),e.addEventListener(`ratechange`,()=>{this.analytics.track(`speed_change`,e,this.getAnalyticsPayload()),this.emit(`ratechange`,e.playbackRate)}),e.addEventListener(`ended`,()=>{this.refreshAdBreakState(1/0),this.analytics.track(`ended`,e,this.getAnalyticsPayload()),this.analytics.track(`complete`,e,{...this.getAnalyticsPayload(),watchPercentage:100}),this.analytics.stopHeartbeat(),this.emit(`ended`,null)}),e.addEventListener(`enterpictureinpicture`,()=>{this.analytics.track(`pip_toggle`,e,{...this.getAnalyticsPayload(),errorMessage:`entered`}),this.emit(`pipchange`,!0)}),e.addEventListener(`leavepictureinpicture`,()=>{this.analytics.track(`pip_toggle`,e,{...this.getAnalyticsPayload(),errorMessage:`exited`}),this.emit(`pipchange`,!1)}),e.addEventListener(`error`,()=>{let t=e.error;this.analytics.track(`error`,e,{...this.getAnalyticsPayload(),errorMessage:t?`${t.code}: ${t.message}`:`Unknown HTML5 video playback error`,errorCode:t?.code,isRecoverable:!1}),this.fail(t instanceof Error?t:Error(t?`${t.code}: ${t.message}`:`Unknown HTML5 video playback error`))});let t=e.textTracks;if(t){let n=(e,t)=>{if(e.kind!==`subtitles`&&e.kind!==`captions`||this.subtitles.getTracks().some(e=>e.isNative&&e.nativeTrackIndex===t))return;let n=e.kind===`captions`;this.subtitles.addTrack({id:`native-${t}`,label:e.label||e.language||(n?`CC ${t+1}`:`Track ${t+1}`),lang:e.language||`und`,isDefault:!this.hlsInstance&&(e.default||e.mode===`showing`),isNative:!0,nativeTrackIndex:t})};e.addEventListener(`loadedmetadata`,()=>{this.analytics.track(`video_loaded`,e,this.getAnalyticsPayload()),this.refreshAdBreakState(e.currentTime);let r=0,i=this.hlsInstance?[`captions`]:[`subtitles`,`captions`];for(let e=0;e<t.length;e++){if(!i.includes(t[e].kind))continue;let a=this.subtitles.getTracks().length;n(t[e],e),this.subtitles.getTracks().length>a&&r++}r>0&&this.emit(`subtitlesloaded`,this.subtitles.getTracks())}),t.addEventListener(`addtrack`,e=>{let r=e.track;if(r)for(let e=0;e<t.length;e++){if(t[e]!==r)continue;let i=this.subtitles.getTracks().length;n(r,e),this.subtitles.getTracks().length>i&&this.emit(`subtitlesloaded`,this.subtitles.getTracks());break}})}this.subtitles.onTrackSwitch(e=>{if(this.analytics.track(`subtitle_change`,this.videoElement,{...this.getAnalyticsPayload(),subtitleEnabled:e!==null,subtitleLanguage:e?.lang??``}),e===null||!e.isHls&&!e.isNative){if(this.hlsInstance)this.hlsInstance.subtitleTrack=-1;else if(t){for(let e=0;e<t.length;e++)t[e].mode=`disabled`,t[e].oncuechange=null;this.subtitles.setCustomSubtitleText(``)}}else if(e.isHls)this.hlsInstance&&e.hlsTrackId!==void 0&&(this.hlsInstance.subtitleTrack=e.hlsTrackId);else if(e.isNative&&t&&e.nativeTrackIndex!==void 0&&t[e.nativeTrackIndex])for(let n=0;n<t.length;n++)if(t[n].oncuechange=null,n===e.nativeTrackIndex){t[n].mode=`hidden`;let e=t[n];e.oncuechange=()=>{if(this.isAdBreak){this.subtitles.setCustomSubtitleText(``);return}let t=e.activeCues;if(t&&t.length>0){let e=Array.from(t).map(e=>e.text).join(`<br />`);this.subtitles.setCustomSubtitleText(e)}else this.subtitles.setCustomSubtitleText(``)}}else t[n].mode=`disabled`})}rewriteToProxy(e){return this.options.urlTransformer?this.options.urlTransformer(e):e}async loadSource(t){this.armStallWatchdog(),this.adBreaksFromAvails=!1,this.extractKeyMomentsFromManifest(t),this.extractAdBreaksFromManifest(t),this.extractSubtitlesFromManifest(t);let n=this.rewriteToProxy(t),r=n.endsWith(`.m3u8`)||n.includes(`.m3u8`),i=n.endsWith(`.mpd`)||n.includes(`.mpd`);if(r)if($.isSupported()){let r=new $({enableWorker:!0,lowLatencyMode:!0,backBufferLength:90,maxMaxBufferLength:600,renderTextTracksNatively:!1,xhrSetup:(e,n)=>{let r=this.drm.getAuthToken();if(!r)try{let e=new URL(t),n=e.searchParams.get(`token`)||e.searchParams.get(`key`)||e.searchParams.get(`auth`)||e.searchParams.get(`authToken`);n&&(r=n)}catch{}let i=this.drm.getAuthHeader();try{let t=this.rewriteToProxy(n),a=new URL(t,window.location.origin);r&&(i?e.setRequestHeader(i,r):a.searchParams.set(`token`,r)),e.open(`GET`,a.toString(),!0)}catch(e){console.error(`[PlayerSDK Core] Error in xhrSetup URL parsing:`,e)}}});this.hlsInstance=r,r.loadSource(n),r.attachMedia(this.videoElement),r.on($.Events.LEVEL_LOADED,(e,t)=>{if(this.adBreaksFromAvails)return;let n=this.parseAdBreaksFromFragments(t.details.fragments);this.sameAdBreaks(n,this.adBreaks)||(this.adBreaks=n,this.analytics.setAdBreaks(n),this.emit(`adbreaksloaded`,n),this.refreshAdBreakState(this.videoElement.currentTime))}),r.on($.Events.SUBTITLE_TRACKS_UPDATED,()=>{if(r.subtitleTracks.length===0)return;let e=r.subtitleTracks.map((e,t)=>({id:`subtitle-hls-${t}`,label:e.name||e.lang||`Track ${t+1}`,lang:e.lang||`und`,isDefault:!!e.default,isHls:!0,hlsTrackId:t}));this.subtitles.setHlsTracks(e),this.emit(`subtitlesloaded`,this.subtitles.getTracks())}),r.on($.Events.SUBTITLE_TRACK_SWITCH,(e,t)=>{if(this.hlsActiveSubtitleKey=null,this.subtitles.setCustomSubtitleText(``),t.id!==-1){let e=r.subtitleTracks[t.id];this.hlsActiveSubtitleKey=e?.default?`default`:`subtitles${t.id}`}}),r.on($.Events.CUES_PARSED,(e,t)=>{let n=this.hlsSubtitleCues.get(t.track)??[],r=t.cues.filter(e=>!n.some(t=>t.startTime===e.startTime&&t.endTime===e.endTime));r.length>0&&this.hlsSubtitleCues.set(t.track,[...n,...r])}),r.on($.Events.FRAG_LOADED,()=>{this.networkErrorRetries=0,this.mediaErrorRecovered=!1,this.progressTick++}),r.on($.Events.MANIFEST_LOADED,()=>{this.progressTick++}),r.on($.Events.LEVEL_LOADED,()=>{this.progressTick++}),r.on($.Events.MANIFEST_PARSED,()=>{this.qualityLevels=r.levels.map((e,t)=>({id:t,height:e.height,width:e.width,bitrate:e.bitrate,label:e.height?`${e.height}p`:`Option ${t+1}`}));let e={id:-1,height:0,width:0,bitrate:0,label:`Auto`};this.qualityLevels.unshift(e),this.activeQuality=e,this.emit(`qualitylevels`,this.qualityLevels),r.levels.length>0&&!this.hasPlayableLevel(r.levels)&&this.emit(`unsupportedcodec`,null),this.options.autoplay&&this.play()}),r.on($.Events.AUDIO_TRACKS_UPDATED,()=>{r.audioTracks.length>1&&(this.audioTrackList=r.audioTracks.map((e,t)=>({id:t,label:e.name||e.lang||`Audio ${t+1}`,lang:e.lang||``})),this.emit(`audiotracksloaded`,this.audioTrackList))}),r.on($.Events.AUDIO_TRACK_SWITCHED,(e,t)=>{let n=this.audioTrackList.find(e=>e.id===t.id);this.analytics.track(`audio_track_change`,this.videoElement,{...this.getAnalyticsPayload(),audioTrack:n?.label??``}),this.emit(`audiotrackchange`,t.id)}),r.on($.Events.LEVEL_SWITCHED,(e,t)=>{let n=this.qualityLevels.find(e=>e.id===t.level);n&&(this.analytics.track(`quality_change`,this.videoElement,{...this.getAnalyticsPayload(),rendition:n.label,bitrate:n.bitrate,isAutoSwitch:r.autoLevelEnabled}),this.emit(`qualitychange`,n))}),r.on($.Events.ERROR,(t,n)=>{let i=n.response?.code;if(i&&e.TERMINAL_HTTP_STATUSES.includes(i)){this.analytics.track(`network_error`,this.videoElement,{...this.getAnalyticsPayload(),errorMessage:n.details,errorCode:i,isRecoverable:!1}),this.fail(Error(`Network error ${i}: ${n.details}`));return}n.fatal&&(n.type===$.ErrorTypes.NETWORK_ERROR?(this.analytics.track(`network_error`,this.videoElement,{...this.getAnalyticsPayload(),errorMessage:n.details,errorCode:i??0,isRecoverable:this.networkErrorRetries<e.MAX_NETWORK_RETRIES}),this.networkErrorRetries<e.MAX_NETWORK_RETRIES?(this.networkErrorRetries++,r.startLoad()):this.fail(Error(`Network error: ${n.details}`))):n.type===$.ErrorTypes.MEDIA_ERROR?this.mediaErrorRecovered?this.fail(Error(`Media error: ${n.details}`)):(this.mediaErrorRecovered=!0,r.recoverMediaError()):this.fail(Error(`Playback error: ${n.details}`)))})}else this.videoElement.canPlayType(`application/vnd.apple.mpegurl`)&&(this.videoElement.src=t,this.qualityLevels=[{id:0,height:720,width:1280,bitrate:2e6,label:`720p (Native)`}],this.activeQuality=this.qualityLevels[0],this.options.autoplay&&this.videoElement.play().catch(console.error));else if(i){let e=await Promise.resolve().then(()=>require("./dash.all.min-CkVT4O2X.cjs")).catch(()=>null);if(!e){console.error(`[SDK] dashjs not installed — install it to use DASH streams`);return}let n=e.MediaPlayer().create();this.dashInstance=n,n.initialize(this.videoElement,t,!!this.options.autoplay),n.updateSettings({streaming:{abr:{autoSwitchBitrate:{video:!0,audio:!0}},buffer:{bufferTimeAtTopQuality:30}}}),this.qualityLevels=[{id:0,height:0,width:0,bitrate:0,label:`Auto (DASH)`}],this.activeQuality=this.qualityLevels[0],this.emit(`qualitylevels`,this.qualityLevels)}else this.videoElement.src=t,this.qualityLevels=[{id:0,height:1080,width:1920,bitrate:45e5,label:`1080p (Source)`}],this.activeQuality=this.qualityLevels[0],this.options.autoplay&&this.videoElement.play().catch(console.error)}setupBackgroundControls(){if(`mediaSession`in navigator){navigator.mediaSession.metadata=new MediaMetadata({title:`Video Player`,album:`Video Player`,artwork:[{src:`https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=512&q=80`,sizes:`512x512`,type:`image/jpeg`}]});try{navigator.mediaSession.setActionHandler(`play`,()=>this.play()),navigator.mediaSession.setActionHandler(`pause`,()=>this.pause()),navigator.mediaSession.setActionHandler(`seekbackward`,e=>{let t=e.seekOffset||10;this.attributeNextSeek(`fast_backward`,{skipSeconds:t}),this.seek(this.videoElement.currentTime-t)}),navigator.mediaSession.setActionHandler(`seekforward`,e=>{let t=e.seekOffset||10;this.attributeNextSeek(`fast_forward`,{skipSeconds:t}),this.seek(this.videoElement.currentTime+t)})}catch{console.warn(`[PlayerSDK Session] Action handler binding is unsupported by browser.`)}}}play(){this.videoElement.play().catch(e=>{console.warn(`[PlayerSDK Play] Autoplay blocked, wait for user interaction:`,e)})}pause(){this.videoElement.pause()}seek(e){let t=Math.max(0,Math.min(e,this.getDuration()));this.videoElement.currentTime=t}attributeNextSeek(e,t={}){this.pendingSeekAttribution={eventType:e,extras:t,expiresAt:Date.now()+1500}}setVolume(e){let t=Math.max(0,Math.min(e,1));this.videoElement.volume=t,this.videoElement.muted=t===0}setMute(e){this.videoElement.muted!==e&&this.analytics.track(`mute`,this.videoElement,{...this.getAnalyticsPayload(),isMuted:e}),this.videoElement.muted=e}setPlaybackRate(e){this.contentPlaybackRate=e,this.isAdBreak||(this.videoElement.playbackRate=e)}setQuality(e){let t=this.qualityLevels.find(t=>t.id===e);t&&(this.activeQuality=t,this.hlsInstance?this.hlsInstance.currentLevel=e:console.warn(`[PlayerSDK Core] Manual rendition switching is not supported by standard native players.`))}async togglePictureInPicture(){if(!document.pictureInPictureEnabled)return console.warn(`[PlayerSDK Core] Picture-in-Picture is disabled or unsupported.`),!1;try{return document.pictureInPictureElement?(await document.exitPictureInPicture(),!1):(await this.videoElement.requestPictureInPicture(),!0)}catch(e){return console.error(`[PlayerSDK Core] PiP toggle failed:`,e),!1}}toggleFullscreen(){let e=this.options.container;document.fullscreenElement?document.exitFullscreen():e.requestFullscreen().catch(e=>{console.error(`[PlayerSDK Fullscreen] Failed entering fullscreen:`,e)})}getVideoElement(){return this.videoElement}getCurrentTime(){return this.videoElement.currentTime}getDuration(){return this.videoElement.duration||0}getVolume(){return this.videoElement.volume}isMuted(){return this.videoElement.muted}getPlaybackRate(){return this.videoElement.playbackRate}getActiveQuality(){return this.activeQuality}getQualityLevels(){return this.qualityLevels}getBufferLength(){let e=this.videoElement.buffered,t=this.videoElement.currentTime;for(let n=0;n<e.length;n++)if(t>=e.start(n)&&t<=e.end(n))return e.end(n)-t;return 0}getBufferedRanges(){let e=this.videoElement.buffered,t=[];for(let n=0;n<e.length;n++)t.push({start:e.start(n),end:e.end(n)});return t}hasPlayableLevel(e){if(typeof MediaSource>`u`||!MediaSource.isTypeSupported)return!0;let t=(e,t)=>{if(!t)return!0;try{return MediaSource.isTypeSupported(`${e}; codecs="${t}"`)}catch{return!0}};return e.some(e=>t(`video/mp4`,e.videoCodec)&&t(`audio/mp4`,e.audioCodec))}getAnalyticsPayload(){return{rendition:this.activeQuality.label,bitrate:this.activeQuality.bitrate,volume:this.videoElement.volume,speed:this.videoElement.playbackRate}}on(e,t){this.eventListeners[e]||(this.eventListeners[e]=[]),this.eventListeners[e].push(t)}off(e,t){this.eventListeners[e]&&(this.eventListeners[e]=this.eventListeners[e].filter(e=>e!==t))}emit(e,...t){this.eventListeners[e]&&this.eventListeners[e].forEach(e=>e(...t))}async extractSubtitlesFromManifest(e){try{let t=await this.buildManifestUrl(e),n=await fetch(t,{headers:this.drm.getRequestHeaders()});if(!n.ok)return;let r=(await n.text()).split(`
47
47
  `),i=this.drm.getAuthToken()||void 0;if(!i)try{let t=new URL(e);i=t.searchParams.get(`token`)||t.searchParams.get(`key`)||t.searchParams.get(`auth`)||t.searchParams.get(`authToken`)||void 0}catch{}let a=e.substring(0,e.lastIndexOf(`/`)+1),o=e.includes(`.m3u8`)&&$.isSupported(),s=[];for(let e of r){if(!e.startsWith(`#EXT-X-MEDIA:`)||!/[,:]TYPE=SUBTITLES\b/i.test(e))continue;let t=e.match(/NAME="([^"]+)"/),n=e.match(/LANGUAGE="([^"]+)"/),r=e.match(/URI="([^"]+)"/),c=/DEFAULT=YES/i.test(e);if(!r)continue;let l=r[1],u=s.length,d=t?t[1]:n?n[1]:`Track ${u+1}`,f=n?n[1]:`und`;if(/\.m3u8?(\?|$)/i.test(l)){o||s.push({id:`subtitle-${u}`,label:d,lang:f,isDefault:c,isHls:!0,hlsTrackId:u});continue}let p=l.startsWith(`http`)?l:a+l,m=this.rewriteToProxy(p);if(i)try{let e=new URL(m,window.location.origin);e.searchParams.set(`token`,i),m=e.toString()}catch{}s.push({id:`subtitle-${u}`,label:d,lang:f,isDefault:c,src:m})}s.length>0&&(this.subtitles.setHlsTracks(s),this.emit(`subtitlesloaded`,this.subtitles.getTracks()))}catch(e){console.error(`[PlayerSDK] Error extracting subtitles from manifest:`,e)}}async extractKeyMomentsFromManifest(e){try{let t=await this.buildManifestUrl(e),n=await fetch(t);if(!n.ok)return;let r=(await n.text()).split(`
48
- `),i=[];for(let e of r)if(e.startsWith(`#EXT-X-DATERANGE:`)){let t=e.match(/ID="([^"]+)"/),n=e.match(/START-DATE="([^"]+)"/),r=e.match(/X-TITLE="([^"]+)"/);t&&n&&r&&(i.some(e=>e.id===t[1])||i.push({id:t[1],startDate:n[1],title:r[1]}))}if(i.length>0){i.sort((e,t)=>e.startDate.localeCompare(t.startDate));let e=new Date(i[0].startDate).getTime(),t=i.map(t=>{let n=(new Date(t.startDate).getTime()-e)/1e3;return{title:t.title,startTime:n,endTime:0}});for(let e=0;e<t.length;e++)e<t.length-1?t[e].endTime=t[e+1].startTime:t[e].endTime=99999;this.keyMoments.setKeyMoments(t),this.emit(`keymomentsloaded`,t),this.emit(`chaptersloaded`,t)}}catch(e){console.error(`Error parsing manifest key moments:`,e)}}async extractAdBreaksFromManifest(e){try{let t=await this.buildManifestUrl(e),n=await fetch(t);if(!n.ok)return;let r=await n.text(),i=r.split(/\r?\n/).map(e=>e.trim());if(i.some(e=>e.startsWith(`#EXT-X-STREAM-INF`))){let t=this.findFirstVariantUri(i);if(t){let n=this.resolveUrl(e,t),i=await this.buildManifestUrl(n),a=await fetch(i,{headers:this.drm.getRequestHeaders()});a.ok&&(r=await a.text())}}if(this.adBreaksFromAvails)return;this.adBreaks=this.parseAdBreaksFromPlaylist(r),this.analytics.setAdBreaks(this.adBreaks),this.adBreaks.length>0&&this.emit(`adbreaksloaded`,this.adBreaks),this.refreshAdBreakState(this.videoElement.currentTime)}catch(e){console.error(`Error parsing manifest ad breaks:`,e)}}async buildManifestUrl(e){let t=this.drm.getAuthToken()||void 0;if(!t)try{let n=new URL(e);t=n.searchParams.get(`token`)||n.searchParams.get(`key`)||n.searchParams.get(`auth`)||n.searchParams.get(`authToken`)||void 0}catch{}let n=this.rewriteToProxy(e);try{let e=new URL(n,window.location.origin);return t&&e.searchParams.set(`token`,t),e.toString()}catch{return n}}findFirstVariantUri(e){for(let t=0;t<e.length;t++)if(e[t].startsWith(`#EXT-X-STREAM-INF`)){let n=e[t+1]?.trim();if(n&&!n.startsWith(`#`))return n}return null}resolveUrl(e,t){try{return new URL(t,e).toString()}catch{return t}}static AD_HOST_PATTERNS=[/segments\.mediatailor\./i,/(^|[.-])ads?([.-]|$)/i,/(^|[.-])ad(server|serving|tech|system)/i,/doubleclick\.net$/i];static AD_PATH_PATTERNS=[/\/v1\/segment\//i,/\/ads?\//i,/\/creatives?\//i];parseSegmentUrl(e){try{let t=new URL(e,window.location.origin);return{host:t.host,path:t.pathname}}catch{return{host:``,path:e}}}isKnownAdSegment(t){let{host:n,path:r}=this.parseSegmentUrl(t);return e.AD_HOST_PATTERNS.some(e=>e.test(n))||e.AD_PATH_PATTERNS.some(e=>e.test(r))}classifyAdGroups(e){let t=e.map(e=>this.isKnownAdSegment(e.url));if(t.some(Boolean))return t;let n=e.map(e=>this.parseSegmentUrl(e.url).host),r=n[0];return n.some(e=>e!==r)?n.map(e=>e!==r):e.map(e=>e.cc%2==1)}mergeAdjacentRanges(e){let t=[];for(let n of e){let e=t[t.length-1];e&&n.startTime-e.endTime<.5?e.endTime=Math.max(e.endTime,n.endTime):t.push({...n})}return t}parseAdBreaksFromFragments(e){if(e.length===0)return[];let t=[];for(let n of e){let e=n.cc??0,r=n.start??0,i=r+(n.duration??0),a=t[t.length-1];a&&a.cc===e?a.endTime=i:t.push({cc:e,startTime:r,endTime:i,url:n.url??n.relurl??``})}let n=this.classifyAdGroups(t);return this.mergeAdjacentRanges(t.filter((e,t)=>n[t]).map(e=>({startTime:e.startTime,endTime:e.endTime})))}parseAdBreaksFromPlaylist(e){let t=e.split(/\r?\n/).map(e=>e.trim()),n=[],r=[],i=0,a=null,o=null,s=null,c=0,l=e=>{let t=e.substring(e.indexOf(`:`)+1),n=t.match(/DURATION=([0-9.]+)/i)?.[1]??t,r=parseFloat(n);return Number.isFinite(r)?r:null};for(let e of t)if(e.startsWith(`#EXT-X-CUE-OUT`))a=i,o=l(e);else if(e.startsWith(`#EXT-X-CUE-IN`)){if(a!==null){let e=o===null?i:a+o;e>a&&n.push({startTime:a,endTime:e}),a=null,o=null}}else if(e===`#EXT-X-DISCONTINUITY`)c++;else if(e.startsWith(`#EXTINF:`)){let t=parseFloat(e.substring(8).split(`,`)[0]);Number.isFinite(t)&&(s=t)}else if(!e.startsWith(`#`)&&e.length>0){let t=i;s!==null&&(i+=s,s=null);let n=r[r.length-1];n&&n.cc===c?n.endTime=i:r.push({cc:c,startTime:t,endTime:i,url:e})}if(a!==null){let e=o===null?i:a+o;e>a&&n.push({startTime:a,endTime:e})}if(n.length>0)return this.mergeAdjacentRanges(n);if(r.length===0)return[];let u=this.classifyAdGroups(r);return this.mergeAdjacentRanges(r.filter((e,t)=>u[t]).map(e=>({startTime:e.startTime,endTime:e.endTime})))}sameAdBreaks(e,t){return e.length===t.length?e.every((e,n)=>Math.abs(e.startTime-t[n].startTime)<.01&&Math.abs(e.endTime-t[n].endTime)<.01):!1}isTimeInAdBreak(e){return this.adBreaks.some(t=>e>=t.startTime&&e<t.endTime)}refreshAdBreakState(e){let t=this.videoElement,n=this.isTimeInAdBreak(e);n!==this.isAdBreak&&(this.isAdBreak=n,this.analytics.setAdBreak(n,t),n?(this.contentPlaybackRate=t.playbackRate,t.playbackRate=1):t.playbackRate=this.contentPlaybackRate,this.emit(`adbreakchange`,n))}videoTimeToContentTime(e){let t=e;for(let n of this.adBreaks)e>=n.endTime?t-=n.endTime-n.startTime:e>=n.startTime&&(t-=e-n.startTime);return Math.max(0,t)}getAdBreaks(){return this.adBreaks}setAdBreaks(e){this.adBreaksFromAvails=e.length>0,this.adBreaks=e,this.analytics.setAdBreaks(e),this.emit(`adbreaksloaded`,e),this.refreshAdBreakState(this.videoElement.currentTime)}isInAdBreak(){return this.isAdBreak}getAudioTracks(){return this.audioTrackList}setAudioTrack(e){this.hlsInstance&&(this.hlsInstance.audioTrack=e)}armStallWatchdog(){if(this.hasFailed||this.stallTimer)return;let t=this.progressTick;this.stallTimer=setTimeout(()=>{if(this.stallTimer=null,this.hasFailed)return;let e=this.progressTick!==t,n=this.progressTick===0;if(!(!this.isBuffering&&!n)){if(e){this.armStallWatchdog();return}this.fail(Error(n?`Playback failed: stream could not be loaded`:`Playback stalled: no data received`))}},e.STALL_TIMEOUT_MS)}clearStallWatchdog(){this.stallTimer&&=(clearTimeout(this.stallTimer),null)}fail(e){this.hasFailed||(this.hasFailed=!0,this.clearStallWatchdog(),this.emit(`error`,e),this.destroy())}destroy(){this.clearStallWatchdog(),this.hlsSubtitleCues.clear(),this.hlsActiveSubtitleKey=null,this.analytics.stopHeartbeat(),this.drm.removeWatermark(),this.hlsInstance&&=(this.hlsInstance.destroy(),null),this.dashInstance&&=(this.dashInstance.reset(),null),this.videoElement&&(this.videoElement.pause(),this.videoElement.removeAttribute(`src`),this.videoElement.load(),this.videoElement.parentElement&&this.videoElement.parentElement.removeChild(this.videoElement)),this.eventListeners={}}};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return Au}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return Du}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return ju}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return wu}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return Nu}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return ku}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Mu}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return Ou}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Pu}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return $}});
49
- //# sourceMappingURL=src-DwNHEI3u.cjs.map
48
+ `),i=[];for(let e of r)if(e.startsWith(`#EXT-X-DATERANGE:`)){let t=e.match(/ID="([^"]+)"/),n=e.match(/START-DATE="([^"]+)"/),r=e.match(/X-TITLE="([^"]+)"/);t&&n&&r&&(i.some(e=>e.id===t[1])||i.push({id:t[1],startDate:n[1],title:r[1]}))}if(i.length>0){i.sort((e,t)=>e.startDate.localeCompare(t.startDate));let e=new Date(i[0].startDate).getTime(),t=i.map(t=>{let n=(new Date(t.startDate).getTime()-e)/1e3;return{title:t.title,startTime:n,endTime:0}});for(let e=0;e<t.length;e++)e<t.length-1?t[e].endTime=t[e+1].startTime:t[e].endTime=99999;this.keyMoments.setKeyMoments(t),this.emit(`keymomentsloaded`,t),this.emit(`chaptersloaded`,t)}}catch(e){console.error(`Error parsing manifest key moments:`,e)}}async extractAdBreaksFromManifest(e){try{let t=await this.buildManifestUrl(e),n=await fetch(t);if(!n.ok)return;let r=await n.text(),i=r.split(/\r?\n/).map(e=>e.trim());if(i.some(e=>e.startsWith(`#EXT-X-STREAM-INF`))){let t=this.findFirstVariantUri(i);if(t){let n=this.resolveUrl(e,t),i=await this.buildManifestUrl(n),a=await fetch(i,{headers:this.drm.getRequestHeaders()});a.ok&&(r=await a.text())}}if(this.adBreaksFromAvails)return;this.adBreaks=this.parseAdBreaksFromPlaylist(r),this.analytics.setAdBreaks(this.adBreaks),this.adBreaks.length>0&&this.emit(`adbreaksloaded`,this.adBreaks),this.refreshAdBreakState(this.videoElement.currentTime)}catch(e){console.error(`Error parsing manifest ad breaks:`,e)}}async buildManifestUrl(e){let t=this.drm.getAuthToken()||void 0;if(!t)try{let n=new URL(e);t=n.searchParams.get(`token`)||n.searchParams.get(`key`)||n.searchParams.get(`auth`)||n.searchParams.get(`authToken`)||void 0}catch{}let n=this.rewriteToProxy(e);try{let e=new URL(n,window.location.origin);return t&&e.searchParams.set(`token`,t),e.toString()}catch{return n}}findFirstVariantUri(e){for(let t=0;t<e.length;t++)if(e[t].startsWith(`#EXT-X-STREAM-INF`)){let n=e[t+1]?.trim();if(n&&!n.startsWith(`#`))return n}return null}resolveUrl(e,t){try{return new URL(t,e).toString()}catch{return t}}static AD_HOST_PATTERNS=[/segments\.mediatailor\./i,/(^|[.-])ads?([.-]|$)/i,/(^|[.-])ad(server|serving|tech|system)/i,/doubleclick\.net$/i];static AD_STITCHER_PATH_PATTERNS=[/\/v1\/segment\//i];static AD_PATH_HINT_PATTERNS=[/\/ads?\//i,/\/creatives?\//i];parseSegmentUrl(e){try{let t=new URL(e,window.location.origin);return{host:t.host,path:t.pathname}}catch{return{host:``,path:e}}}isKnownAdSegment(t){let{host:n,path:r}=this.parseSegmentUrl(t);return e.AD_HOST_PATTERNS.some(e=>e.test(n))||e.AD_STITCHER_PATH_PATTERNS.some(e=>e.test(r))}hasAdPathHint(t){let{path:n}=this.parseSegmentUrl(t);return e.AD_PATH_HINT_PATTERNS.some(e=>e.test(n))}classifyAdGroups(e){let t=e.map(e=>this.isKnownAdSegment(e.url));if(t.some(Boolean)&&!t.every(Boolean))return e.map((e,n)=>t[n]||this.hasAdPathHint(e.url));let n=e.map(e=>this.parseSegmentUrl(e.url).host),r=n[0];return n.some(e=>e!==r)?n.map(e=>e!==r):e.map(e=>e.cc%2==1)}mergeAdjacentRanges(e){let t=[];for(let n of e){let e=t[t.length-1];e&&n.startTime-e.endTime<.5?e.endTime=Math.max(e.endTime,n.endTime):t.push({...n})}return t}parseAdBreaksFromFragments(e){if(e.length===0)return[];let t=[];for(let n of e){let e=n.cc??0,r=n.start??0,i=r+(n.duration??0),a=t[t.length-1];a&&a.cc===e?a.endTime=i:t.push({cc:e,startTime:r,endTime:i,url:n.url??n.relurl??``})}let n=this.classifyAdGroups(t);return this.mergeAdjacentRanges(t.filter((e,t)=>n[t]).map(e=>({startTime:e.startTime,endTime:e.endTime})))}parseAdBreaksFromPlaylist(e){let t=e.split(/\r?\n/).map(e=>e.trim()),n=[],r=[],i=0,a=null,o=null,s=null,c=0,l=e=>{let t=e.substring(e.indexOf(`:`)+1),n=t.match(/DURATION=([0-9.]+)/i)?.[1]??t,r=parseFloat(n);return Number.isFinite(r)?r:null};for(let e of t)if(e.startsWith(`#EXT-X-CUE-OUT`))a=i,o=l(e);else if(e.startsWith(`#EXT-X-CUE-IN`)){if(a!==null){let e=o===null?i:a+o;e>a&&n.push({startTime:a,endTime:e}),a=null,o=null}}else if(e===`#EXT-X-DISCONTINUITY`)c++;else if(e.startsWith(`#EXTINF:`)){let t=parseFloat(e.substring(8).split(`,`)[0]);Number.isFinite(t)&&(s=t)}else if(!e.startsWith(`#`)&&e.length>0){let t=i;s!==null&&(i+=s,s=null);let n=r[r.length-1];n&&n.cc===c?n.endTime=i:r.push({cc:c,startTime:t,endTime:i,url:e})}if(a!==null){let e=o===null?i:a+o;e>a&&n.push({startTime:a,endTime:e})}if(n.length>0)return this.mergeAdjacentRanges(n);if(r.length===0)return[];let u=this.classifyAdGroups(r);return this.mergeAdjacentRanges(r.filter((e,t)=>u[t]).map(e=>({startTime:e.startTime,endTime:e.endTime})))}sameAdBreaks(e,t){return e.length===t.length?e.every((e,n)=>Math.abs(e.startTime-t[n].startTime)<.01&&Math.abs(e.endTime-t[n].endTime)<.01):!1}isTimeInAdBreak(e){return this.adBreaks.some(t=>e>=t.startTime&&e<t.endTime)}refreshAdBreakState(e){let t=this.videoElement,n=this.isTimeInAdBreak(e);n!==this.isAdBreak&&(this.isAdBreak=n,this.analytics.setAdBreak(n,t),n?(this.contentPlaybackRate=t.playbackRate,t.playbackRate=1):t.playbackRate=this.contentPlaybackRate,this.emit(`adbreakchange`,n))}videoTimeToContentTime(e){let t=e;for(let n of this.adBreaks)e>=n.endTime?t-=n.endTime-n.startTime:e>=n.startTime&&(t-=e-n.startTime);return Math.max(0,t)}getAdBreaks(){return this.adBreaks}setAdBreaks(e){this.adBreaksFromAvails=e.length>0,this.adBreaks=e,this.analytics.setAdBreaks(e),this.emit(`adbreaksloaded`,e),this.refreshAdBreakState(this.videoElement.currentTime)}isInAdBreak(){return this.isAdBreak}getAudioTracks(){return this.audioTrackList}setAudioTrack(e){this.hlsInstance&&(this.hlsInstance.audioTrack=e)}armStallWatchdog(){if(this.hasFailed||this.stallTimer)return;let t=this.progressTick;this.stallTimer=setTimeout(()=>{if(this.stallTimer=null,this.hasFailed)return;let e=this.progressTick!==t,n=this.progressTick===0;if(!(!this.isBuffering&&!n)){if(e){this.armStallWatchdog();return}this.fail(Error(n?`Playback failed: stream could not be loaded`:`Playback stalled: no data received`))}},e.STALL_TIMEOUT_MS)}clearStallWatchdog(){this.stallTimer&&=(clearTimeout(this.stallTimer),null)}fail(e){this.hasFailed||(this.hasFailed=!0,this.clearStallWatchdog(),this.emit(`error`,e),this.destroy())}destroy(){this.clearStallWatchdog(),this.hlsSubtitleCues.clear(),this.hlsActiveSubtitleKey=null,this.analytics.stopHeartbeat(),this.drm.removeWatermark(),this.hlsInstance&&=(this.hlsInstance.destroy(),null),this.dashInstance&&=(this.dashInstance.reset(),null),this.videoElement&&(this.videoElement.pause(),this.videoElement.removeAttribute(`src`),this.videoElement.load(),this.videoElement.parentElement&&this.videoElement.parentElement.removeChild(this.videoElement)),this.eventListeners={}}};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return Au}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return Du}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return ju}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return wu}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return Nu}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return ku}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Mu}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return Ou}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Pu}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return $}});
49
+ //# sourceMappingURL=src-BXp0h90r.cjs.map