From ec019ada797487c5327ca0bae4bf9a1858b0a9e6 Mon Sep 17 00:00:00 2001 From: afkcodes Date: Fri, 18 Aug 2023 18:22:14 +0530 Subject: [PATCH 1/3] probable fix for the notification seek --- src/audio.ts | 6 ++++-- src/mediasession/mediasessionHandler.ts | 22 +++++++++++++--------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/audio.ts b/src/audio.ts index 53458ad..8f46d0e 100644 --- a/src/audio.ts +++ b/src/audio.ts @@ -97,7 +97,7 @@ class AudioX { currentTrackPlayTime: 0, currentTrack: mediaTrack }); - updateMetaData(mediaTrack); + audioInstance.load(); } } @@ -126,7 +126,9 @@ class AudioX { this.addMedia(mediaTrack).then(() => { if (audioInstance.HAVE_ENOUGH_DATA === READY_STATE.HAVE_ENOUGH_DATA) { setTimeout(async () => { - await this.play(); + await this.play().then(() => { + updateMetaData(mediaTrack); + }); }, 950); } }); diff --git a/src/mediasession/mediasessionHandler.ts b/src/mediasession/mediasessionHandler.ts index 8791387..e032656 100644 --- a/src/mediasession/mediasessionHandler.ts +++ b/src/mediasession/mediasessionHandler.ts @@ -6,6 +6,7 @@ import { AudioState } from 'types'; export const updateMetaData = (data: any) => { if ('mediaSession' in navigator) { navigator.mediaSession.metadata = new MediaMetadata(metaDataCreator(data)); + updatePositionState(); } }; @@ -24,13 +25,16 @@ export const attachMediaSessionHandlers = () => { }; export const updatePositionState = () => { - ChangeNotifier.listen('AUDIO_X_STATE', (data: AudioState) => { - if (data?.duration && data?.playbackRate && data?.progress) { - navigator.mediaSession.setPositionState({ - duration: data.duration, - playbackRate: data.playbackRate, - position: data.progress - }); - } - }); + if ('setPositionState' in navigator.mediaSession) { + const audioState = ChangeNotifier.getLatestState( + 'AUDIO_X_STATE' + ) as AudioState; + const { currentTime, duration } = AudioX.getAudioInstance(); + + navigator.mediaSession.setPositionState({ + duration: duration, + playbackRate: audioState.playbackRate, + position: currentTime + }); + } }; From 46ad5d24ead0e56c993db14494f87b0f5c8f8fb2 Mon Sep 17 00:00:00 2001 From: Ashish Kumar Date: Sat, 20 Jan 2024 22:08:54 +0530 Subject: [PATCH 2/3] checking reset and update for workaround of position --- dist/index.js | 4 ++-- dist/index.js.map | 2 +- src/audio.ts | 6 +++++- src/events/baseEvents.ts | 8 ++++++++ src/mediasession/mediasessionHandler.ts | 17 +++++++++++++++-- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/dist/index.js b/dist/index.js index c72d8b2..9fb87ea 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,5 +1,5 @@ -var x=Object.defineProperty;var ee=(a,e,t)=>e in a?x(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var r=(a,e)=>x(a,"name",{value:e,configurable:!0});var c=(a,e,t)=>(ee(a,typeof e!="symbol"?e+"":e,t),t);var H=[{frequency:31,type:"lowshelf",gain:0},{frequency:63,type:"peaking",gain:0},{frequency:125,type:"peaking",gain:0},{frequency:250,type:"peaking",gain:0},{frequency:500,type:"peaking",gain:0},{frequency:1e3,type:"peaking",gain:0},{frequency:2e3,type:"peaking",gain:0},{frequency:4e3,type:"peaking",gain:0},{frequency:8e3,type:"peaking",gain:0},{frequency:16e3,type:"highshelf",gain:0}],C=[{id:"preset_default",name:"Default",gains:[0,0,0,0,0,0,0,0,0,0]},{id:"preset_live",name:"Live",gains:[-1,1,3,4,4,4,3,2,2,2]},{id:"preset_acoustic",name:"Acoustic",gains:[6,6,4,1,3,3,4,5,4,1.5]},{id:"preset_classical",name:"Classical",gains:[6,5,4,3,-1,-1,0,2,4,5]},{id:"preset_piano",name:"Piano",gains:[4,2,0,3.5,4,1.5,5,6,4,4.5]},{id:"preset_lounge",name:"Lounge",gains:[-3,-1.5,0,1,5.5,1,0,-1.5,2,.5]},{id:"preset_spoken_word",name:"Spoken Word",gains:[-2,0,0,1,5,6.5,7,6,3,0]},{id:"preset_jazz",name:"Jazz",gains:[5.5,4,1,2,-1.5,-1.5,0,1,4,5.5]},{id:"preset_pop",name:"Pop",gains:[.5,2.4,3.8,4.3,3,0,-.5,-.5,.5,.5]},{id:"preset_dance",name:"Dance",gains:[5,10,6.5,0,2,4.5,7.5,7,5.5,0]},{id:"preset_latin",name:"Latin",gains:[3.5,1.5,0,0,-1.5,-1.5,-1.5,0,4,6.5]},{id:"preset_rnb",name:"RnB",gains:[3.5,10.5,8.5,1,-3,-1.5,3,3.5,4,5]},{id:"preset_hiphop",name:"HipHop",gains:[7,6,1,4,-1,-.5,1,-.5,2,4]},{id:"preset_electronic",name:"Electronic",gains:[6,5.5,1,0,-2,2,1,1.5,5.5,6.5]},{id:"preset_techno",name:"Techno",gains:[3.8,2.4,0,-2.4,-1.9,0,3.8,4.8,4.8,4.3]},{id:"preset_deep",name:"Deep",gains:[6,5,1.5,.5,4,3,1.5,-2,-5,-6.5]},{id:"preset_club",name:"Club",gains:[0,0,3.8,2.4,2.4,2.4,1,0,0,0]},{id:"preset_rock",name:"Rock",gains:[7,5.5,4,1,-.5,0,.5,3,4.5,6.5]},{id:"preset_rock_soft",name:"Rock Soft",gains:[1.5,0,0,-.5,0,1,3.8,4.8,5.7,6.2]},{id:"preset_ska",name:"Ska",gains:[-.5,-1.5,-1,0,1,2,3.8,4.3,5.2,4.3]},{id:"preset_reggae",name:"Reggae",gains:[0,0,0,-2.4,0,2.5,2.5,0,0,0]},{id:"preset_country",name:"Country",gains:[3,2,1,0,-1,0,2,3,4,4]},{id:"preset_funk",name:"Funk",gains:[4,5,3,0,-1,0,2,4,5,5]},{id:"preset_blues",name:"Blues",gains:[2,1,0,-1,0,1,2,3,4,3]},{id:"preset_metal",name:"Metal",gains:[8,7,6,4,2,1,0,2,4,6]},{id:"preset_indie",name:"Indie",gains:[2,3,2,1,0,-1,-2,0,3,4]},{id:"preset_chill",name:"Chill",gains:[1,1,0,-1,-2,-1,1,2,3,2]},{id:"preset_world",name:"World",gains:[3,2,0,-2,-1,1,3,4,5,3]},{id:"preset_alternative",name:"Alternative",gains:[3,2,1,0,-1,-2,1,3,4,3]},{id:"preset_ambient",name:"Ambient",gains:[0,-1,-2,-3,-2,0,1,2,3,2]},{id:"preset_mellow",name:"Mellow",gains:[1,1,0,-1,-2,-1,1,2,3,1]},{id:"preset_grunge",name:"Grunge",gains:[5,4,3,2,1,0,0,2,4,5]},{id:"preset_soul",name:"Soul",gains:[3,3,2,1,0,-1,0,2,3,3]},{id:"preset_folk",name:"Folk",gains:[2,1,0,-1,-2,-1,1,2,3,2]},{id:"preset_trap",name:"Trap",gains:[7,6,3,1,-2,-1,1,3,6,7]},{id:"preset_dubstep",name:"Dubstep",gains:[6,5,4,3,2,1,1,3,5,6]}];var O=Object.freeze({REACT:"REACT",VANILLA:"VANILLA",DEVELOPMENT:"development"}),l=Object.freeze({BUFFERING:"buffering",PLAYING:"playing",PAUSED:"paused",READY:"ready",IDLE:"idle",ENDED:"ended",STALLED:"stalled",ERROR:"error",TRACK_CHANGE:"trackchanged",DURATION_CHANGE:"durationchanged"}),D=Object.freeze({MEDIA_ERR_ABORTED:"The user canceled the audio.",MEDIA_ERR_DECODE:"An error occurred while decoding the audio.",MEDIA_ERR_NETWORK:"A network error occurred while fetching the audio.",MEDIA_ERR_SRC_NOT_SUPPORTED:"The audio is missing or is in a format not supported by your browser.",DEFAULT:"An unknown error occurred."}),w={HLS:"https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js"};var d,te=(d=class{static validateEventName(e){if(!e||typeof e!="string")throw new Error("Invalid event name")}static notify(e,t,s="audiox_notifier_default"){this.validateEventName(e);let i=d.listeners[e];i&&t!==null&&(d.notifierState[e]={...d.notifierState[e]||{},...t},i.forEach(n=>{n(d.notifierState[e]);}));}static listen(e,t,s={}){if(this.validateEventName(e),typeof t!="function")throw new Error("Callback must be a function");return d.listeners[e]?d.listeners[e].add(t):(d.notifierState[e]=s,d.listeners[e]=new Set([t])),()=>{let i=d.listeners[e];i&&(i.delete(t),i.size===0&&delete d.listeners[e]);}}static multiListen(e,t,s={}){if(this.validateEventName(e),!Array.isArray(t)||t.length===0)throw new Error("Callbacks must be a non-empty array of functions");let i=t.map(n=>d.listen(e,n,s));return ()=>{i.forEach(n=>n());}}static getLatestState(e){return this.validateEventName(e),d.notifierState[e]}},r(d,"ChangeNotifier"),c(d,"listeners",{}),c(d,"notifierState",{}),d),A=te;var p=r(a=>a&&Array.isArray(a)&&a.length,"isValidArray"),v=r(a=>a instanceof Function&&typeof a=="function","isValidFunction");var G={},M=r(a=>{let e="";switch(a.error?.code){case MediaError.MEDIA_ERR_ABORTED:e+=D.MEDIA_ERR_ABORTED;break;case MediaError.MEDIA_ERR_NETWORK:e+=D.MEDIA_ERR_NETWORK;break;case MediaError.MEDIA_ERR_DECODE:e+=D.MEDIA_ERR_DECODE;break;case MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED:e+=D.MEDIA_ERR_SRC_NOT_SUPPORTED;break;default:e+=D.DEFAULT;break}return e},"getReadableErrorMessage"),B=r(a=>{let{title:e,album:t,artist:s,artwork:i}=a,n=i?i[0]?.src:"",g=["96x96","128x128","192x192","256x256","384x384","512x512"].map(I=>({src:n,sizes:I,type:"image/png"}));return {title:e,album:t,artist:s,artwork:g}},"metaDataCreator"),N=0,m=r((a,e)=>{let t=new Set;for(let n=0;nn+u,0);N=["ENDED","TRACK_CHANGE","PAUSE"].includes(e)?i:N,A.notify("AUDIO_STATE",{currentTrackPlayTime:i,previousTrackPlayTime:N});},"calculateActualPlayedLength"),q=r((a,e,t)=>new Promise((s,i)=>{if(window instanceof Window&&window.document)if(G[t])e(),s();else {G[t]=!0;let n=document.createElement("script");n.type="text/javascript",n.src=a,n.async=!0,n.onload=()=>{e(),s();},document.head.appendChild(n);}else i(`Window not ready unable to initialize ${t}`);}),"loadScript"),V=r(()=>{let a=new _,e=a.getQueue(),t=!1,s=r(i=>{i.playbackState==="ended"&&!t&&(t=!0,e&&p(e)&&a.playNext()),i.playbackState!=="ended"&&(t=!1);},"audioStateListener");A.listen("AUDIO_STATE",s);},"handleQueuePlayback"),K=r(a=>{let e=[...a];for(let t=e.length-1;t>0;t--){let s=Math.floor(Math.random()*t);[e[t],e[s]]=[e[s],e[t]];}return e},"shuffle");var T,b=(T=class{constructor(){c(this,"audioCtx");c(this,"audioCtxStatus");c(this,"eqFilterBands");if(T._instance)return T._instance;if(this.audioCtx===void 0&&typeof AudioContext<"u")if(typeof AudioContext<"u")this.audioCtx=new AudioContext,this.audioCtxStatus="ACTIVE",this.init();else if(typeof window.webkitAudioContext<"u")this.audioCtx=new window.webkitAudioContext,this.audioCtxStatus="ACTIVE",this.init();else throw new Error("Web Audio API is not supported in this browser.");else this.audioCtxStatus="FAILED";if(this.audioCtxStatus==="ACTIVE"&&this.audioCtx.state==="suspended"){var e=r(()=>{this.audioCtx.resume(),setTimeout(()=>{this.audioCtx.state==="running"&&document.body.removeEventListener("click",e,!1);},0);},"resume");document.body.addEventListener("click",e,!1);}T._instance=this;}init(){try{let e=_.getAudioInstance(),t=this.audioCtx.createMediaElementSource(e),s=H.map(n=>{let u=this.audioCtx.createBiquadFilter();return u.type=n.type,u.frequency.value=n.frequency,u.gain.value=n.gain,u.Q.value=1,u}),i=this.audioCtx.createGain();i.gain.value=1,t.connect(s[0]);for(let n=0;ns.id===e);if(!(!this.eqFilterBands||this.eqFilterBands.length!==t?.gains.length))for(let s=0;s{t.gain.value=e[s];});}},r(T,"Equalizer"),c(T,"_instance"),T);var Y={ERROR:(a,e)=>{let t=e.type,s=e.details,i=e.fatal;A.notify("AUDIO_STATE",{playbackState:l.ERROR,error:{type:t,isFatal:i,detail:s}},`audiox_baseEvents_state_${a.type}`);},FRAG_CHANGED:()=>{}};var U=Object.freeze({ABORT:"abort",TIME_UPDATE:"timeupdate",CAN_PLAY:"canplay",CAN_PLAY_THROUGH:"canplaythrough",DURATION_CHANGE:"durationchange",ENDED:"ended",EMPTIED:"emptied",PLAYING:"playing",WAITING:"waiting",SEEKING:"seeking",SEEKED:"seeked",LOADED_META_DATA:"loadedmetadata",LOADED_DATA:"loadeddata",PLAY:"play",PAUSE:"pause",RATE_CHANGE:"ratechange",VOLUME_CHANGE:"volumechange",SUSPEND:"suspend",STALLED:"stalled",PROGRESS:"progress",LOAD_START:"loadstart",ERROR:"error",TRACK_CHANGE:"trackchange"}),X={MEDIA_ATTACHING:"hlsMediaAttaching",MEDIA_ATTACHED:"hlsMediaAttached",MEDIA_DETACHING:"hlsMediaDetaching",MEDIA_DETACHED:"hlsMediaDetached",BUFFER_RESET:"hlsBufferReset",BUFFER_CODECS:"hlsBufferCodecs",BUFFER_CREATED:"hlsBufferCreated",BUFFER_APPENDING:"hlsBufferAppending",BUFFER_APPENDED:"hlsBufferAppended",BUFFER_EOS:"hlsBufferEos",BUFFER_FLUSHING:"hlsBufferFlushing",BUFFER_FLUSHED:"hlsBufferFlushed",MANIFEST_LOADING:"hlsManifestLoading",MANIFEST_LOADED:"hlsManifestLoaded",MANIFEST_PARSED:"hlsManifestParsed",LEVEL_SWITCHING:"hlsLevelSwitching",LEVEL_SWITCHED:"hlsLevelSwitched",LEVEL_LOADING:"hlsLevelLoading",LEVEL_LOADED:"hlsLevelLoaded",LEVEL_UPDATED:"hlsLevelUpdated",LEVEL_PTS_UPDATED:"hlsLevelPtsUpdated",LEVELS_UPDATED:"hlsLevelsUpdated",AUDIO_TRACKS_UPDATED:"hlsAudioTracksUpdated",AUDIO_TRACK_SWITCHING:"hlsAudioTrackSwitching",AUDIO_TRACK_SWITCHED:"hlsAudioTrackSwitched",AUDIO_TRACK_LOADING:"hlsAudioTrackLoading",AUDIO_TRACK_LOADED:"hlsAudioTrackLoaded",SUBTITLE_TRACKS_UPDATED:"hlsSubtitleTracksUpdated",SUBTITLE_TRACKS_CLEARED:"hlsSubtitleTracksCleared",SUBTITLE_TRACK_SWITCH:"hlsSubtitleTrackSwitch",SUBTITLE_TRACK_LOADING:"hlsSubtitleTrackLoading",SUBTITLE_TRACK_LOADED:"hlsSubtitleTrackLoaded",SUBTITLE_FRAG_PROCESSED:"hlsSubtitleFragProcessed",CUES_PARSED:"hlsCuesParsed",NON_NATIVE_TEXT_TRACKS_FOUND:"hlsNonNativeTextTracksFound",INIT_PTS_FOUND:"hlsInitPtsFound",FRAG_LOADING:"hlsFragLoading",FRAG_LOAD_EMERGENCY_ABORTED:"hlsFragLoadEmergencyAborted",FRAG_LOADED:"hlsFragLoaded",FRAG_DECRYPTED:"hlsFragDecrypted",FRAG_PARSING_INIT_SEGMENT:"hlsFragParsingInitSegment",FRAG_PARSING_USERDATA:"hlsFragParsingUserdata",FRAG_PARSING_METADATA:"hlsFragParsingMetadata",FRAG_PARSED:"hlsFragParsed",FRAG_BUFFERED:"hlsFragBuffered",FRAG_CHANGED:"hlsFragChanged",FPS_DROP:"hlsFpsDrop",FPS_DROP_LEVEL_CAPPING:"hlsFpsDropLevelCapping",ERROR:"hlsError",DESTROYING:"hlsDestroying",KEY_LOADING:"hlsKeyLoading",KEY_LOADED:"hlsKeyLoaded",LIVE_BACK_BUFFER_REACHED:"hlsLiveBackBufferReached",BACK_BUFFER_REACHED:"hlsBackBufferReached"};var P=r((a,e=!1)=>{let t=_.getAudioInstance();p(Object.keys(a))&&Object.keys(a).forEach(s=>{let i=s;t?.addEventListener(U[i],n=>{if(s&&a[i]){let u=a[i];typeof u=="function"&&u(n,t,e);}});});},"attachEventListeners");var z=r((a,e=!1)=>{let s=new y().getHlsInstance();p(Object.keys(a))&&Object.keys(a).forEach(i=>{let n=i;s.on(X[n],(u,g)=>{if(n&&a[n]){let S=a[n];typeof S=="function"&&S(u,g,s,e);}});});},"attachHlsEventsListeners");var R,f,ae=(f=class{constructor(){c(this,"HlsClass");if(f._instance)return f._instance;f._instance=this;}async load(){return await q(w.HLS,()=>{},"hls").then(()=>{this.HlsClass=window.Hls,window.Hls=void 0;}).catch(e=>{}),this.HlsClass}async init(e={},t){let s=await this.load();s.isSupported()&&(R=new s(e),z(Y,t));}addHlsMedia(e){let t=this.HlsClass,s=_.getAudioInstance();R.loadSource(e.source),R.attachMedia(s),R.on(t.Events.MEDIA_ATTACHED,function(){});}getHlsInstance(){return R}},r(f,"HlsAdapter"),c(f,"_instance"),f),y=ae;var Q=Object.freeze({1:"MEDIA_ERR_ABORTED",3:"MEDIA_ERR_DECODE",2:"MEDIA_ERR_NETWORK",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"});var E=A,j={LOAD_START:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.BUFFERING,duration:e?.duration,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_state_${a.type}`);},DURATION_CHANGE:(a,e)=>{let t=E.getLatestState("AUDIO_X_STATE");E.notify("AUDIO_STATE",{playbackState:t.playbackState==="playing"?l.PLAYING:l.DURATION_CHANGE,duration:e?.duration,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_state_${a.type}`);},LOADED_META_DATA:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.BUFFERING,duration:e?.duration,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_state_${a.type}`);},LOADED_DATA:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.BUFFERING,duration:e?.duration,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_state_${a.type}`);},CAN_PLAY:a=>{E.notify("AUDIO_STATE",{playbackState:l.READY,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`);},CAN_PLAY_THROUGH:a=>{let e=E.getLatestState("AUDIO_X_STATE");E.notify("AUDIO_STATE",{playbackState:e.playbackState==="playing"?l.PLAYING:l.READY,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`);},PLAY:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.PLAYING,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`);},PLAYING:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.PLAYING,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`);},PAUSE:(a,e,t)=>{E.notify("AUDIO_STATE",{playbackState:l.PAUSED,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`),t&&m(e,"PAUSE");},ENDED:(a,e,t)=>{E.notify("AUDIO_STATE",{playbackState:l.ENDED,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`),t&&m(e,"ENDED");},ERROR:(a,e)=>{let t=e.error?.code,s=M(e);E.notify("AUDIO_STATE",{playbackState:l.ERROR,error:{code:t,message:Q[t],readable:s}},`audiox_baseEvents_state_${a.type}`);},TIME_UPDATE:(a,e)=>{let t=E.getLatestState("AUDIO_X_STATE");E.notify("AUDIO_STATE",{playbackState:e.paused?t?.playbackState:l.PLAYING,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`);},WAITING:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.BUFFERING,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`);},VOLUME_CHANGE:a=>{E.notify("AUDIO_STATE",{},"audiox_baseEvents_state");}};var $=r(a=>{"mediaSession"in navigator&&(navigator.mediaSession.metadata=new MediaMetadata(B(a)));},"updateMetaData"),W=r(()=>{"mediaSession"in navigator&&(navigator.mediaSession.setActionHandler("play",()=>{_.getAudioInstance().play();}),navigator.mediaSession.setActionHandler("pause",()=>{_.getAudioInstance().pause();}));},"attachMediaSessionHandlers");var k={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},F={playbackState:l.IDLE,duration:0,bufferedDuration:0,progress:0,volume:50,playbackRate:1,error:{code:null,message:"",readable:""},currentTrack:{},currentTrackPlayTime:0,previousTrackPlayTime:0};A.listen("AUDIO_STATE",a=>{A.notify("AUDIO_X_STATE",{...F,...a});},F);var o,L=A,h,_=(h=class{constructor(){c(this,"_audio");c(this,"isPlayLogEnabled");c(this,"_queue");c(this,"_currentQueueIndex",0);c(this,"_fetchFn");c(this,"eqStatus","IDEAL");c(this,"isEqEnabled",!1);c(this,"eqInstance");if(h._instance)return h._instance;if(process.env.NODE_ENV!==O?.DEVELOPMENT&&o)throw new Error("Cannot create multiple audio instance");h._instance=this,this._audio=new Audio,o=this._audio;}async init(e){let{preloadStrategy:t="auto",autoPlay:s=!1,useDefaultEventListeners:i=!0,customEventListeners:n=null,showNotificationActions:u=!1,enablePlayLog:g=!1,enableHls:S=!1,enableEQ:I=!1,crossOrigin:J="anonymous",hlsConfig:Z={}}=e;this._audio?.setAttribute("id","audio_x_instance"),this._audio.preload=t,this._audio.autoplay=s,this._audio.crossOrigin=J,this.isPlayLogEnabled=g,n!==null?P(n,!1):P(j,g),u&&W(),I&&(this.isEqEnabled=I),S&&new y().init(Z,g);}async addMedia(e){if(!e)return;let t=e.source.includes(".m3u8")?"HLS":"DEFAULT";if(this.isPlayLogEnabled&&m(o,"TRACK_CHANGE"),t==="HLS"){let s=new y,i=s.getHlsInstance();i?(i.detachMedia(),s.addHlsMedia(e)):await this.reset();}else o.src=e.source;L.notify("AUDIO_STATE",{playbackState:l.TRACK_CHANGE,currentTrackPlayTime:0,currentTrack:e}),$(e),o.load();}attachEq(){if(this.isEqEnabled&&this.eqStatus==="IDEAL")try{let e=new b;this.eqStatus=e.status(),this.eqInstance=e;}catch{}}async play(){let e=o.src!=="";o?.paused&&o.HAVE_ENOUGH_DATA===k.HAVE_ENOUGH_DATA&&e&&await o.play().then(()=>{}).catch(()=>{});}async addMediaAndPlay(e,t){let s=e||(this._queue.length>0?this._queue[0]:void 0);t&&v(t)&&s&&(this._fetchFn=t,await t(s)),this._queue&&p(this._queue)&&(this._currentQueueIndex=this._queue.findIndex(i=>i.id===s?.id));try{s&&this.addMedia(s).then(()=>{o.HAVE_ENOUGH_DATA===k.HAVE_ENOUGH_DATA&&setTimeout(async()=>{this.attachEq(),await this.play();},950);});}catch{}}pause(){o&&!o?.paused&&o?.pause();}stop(){o&&!o.paused&&(o?.pause(),o.currentTime=0);}async reset(){o&&(this.stop(),o.src="",o.srcObject=null);}setVolume(e){let t=e/100;o&&(o.volume=t,L.notify("AUDIO_STATE",{volume:e}));}setPlaybackRate(e){o&&(o.playbackRate=e,L.notify("AUDIO_STATE",{playbackRate:e}));}mute(){o&&!o.muted&&(o.muted=!0);}seek(e){o&&(o.currentTime=e);}async destroy(){o&&(await this.reset(),o.removeAttribute("src"),o.load());}subscribe(e,t,s={}){return L.listen(e,t,s)}addEventListener(e,t){o.addEventListener(e,t);}getPresets(){return b.getPresets()}setPreset(e){this.eqInstance.setPreset(e);}setCustomEQ(e){this.eqInstance.setCustomEQ(e);}addQueue(e,t){let s=p(e)?e.slice():[];switch(t){case"DEFAULT":this._queue=s;break;case"REVERSE":this._queue=s.reverse();break;case"SHUFFLE":this._queue=K(s);break;default:this._queue=s;break}V();}playNext(){if(this._queue.length>this._currentQueueIndex+1){this._currentQueueIndex++;let e=this._queue[this._currentQueueIndex];this.addMediaAndPlay(e,this._fetchFn);}}playPrevious(){if(this._currentQueueIndex>0){this._currentQueueIndex--;let e=this._queue[this._currentQueueIndex];this.addMediaAndPlay(e,this._fetchFn);}}clearQueue(){this._queue&&p(this._queue)&&(this._queue=[]);}removeFromQueue(e){if(this._queue&&p(this._queue)){let t=this._queue.filter(s=>s.id==e.id);this._queue=t;}}getQueue(){if(this._queue&&this._queue.length)return this._queue}get id(){return o?.getAttribute("id")}static getAudioInstance(){return o}},r(h,"AudioX"),c(h,"_instance"),h); +var H=Object.defineProperty;var se=(a,e,t)=>e in a?H(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var r=(a,e)=>H(a,"name",{value:e,configurable:!0});var d=(a,e,t)=>(se(a,typeof e!="symbol"?e+"":e,t),t);var v=[{frequency:31,type:"lowshelf",gain:0},{frequency:63,type:"peaking",gain:0},{frequency:125,type:"peaking",gain:0},{frequency:250,type:"peaking",gain:0},{frequency:500,type:"peaking",gain:0},{frequency:1e3,type:"peaking",gain:0},{frequency:2e3,type:"peaking",gain:0},{frequency:4e3,type:"peaking",gain:0},{frequency:8e3,type:"peaking",gain:0},{frequency:16e3,type:"highshelf",gain:0}],N=[{id:"preset_default",name:"Default",gains:[0,0,0,0,0,0,0,0,0,0]},{id:"preset_live",name:"Live",gains:[-1,1,3,4,4,4,3,2,2,2]},{id:"preset_acoustic",name:"Acoustic",gains:[6,6,4,1,3,3,4,5,4,1.5]},{id:"preset_classical",name:"Classical",gains:[6,5,4,3,-1,-1,0,2,4,5]},{id:"preset_piano",name:"Piano",gains:[4,2,0,3.5,4,1.5,5,6,4,4.5]},{id:"preset_lounge",name:"Lounge",gains:[-3,-1.5,0,1,5.5,1,0,-1.5,2,.5]},{id:"preset_spoken_word",name:"Spoken Word",gains:[-2,0,0,1,5,6.5,7,6,3,0]},{id:"preset_jazz",name:"Jazz",gains:[5.5,4,1,2,-1.5,-1.5,0,1,4,5.5]},{id:"preset_pop",name:"Pop",gains:[.5,2.4,3.8,4.3,3,0,-.5,-.5,.5,.5]},{id:"preset_dance",name:"Dance",gains:[5,10,6.5,0,2,4.5,7.5,7,5.5,0]},{id:"preset_latin",name:"Latin",gains:[3.5,1.5,0,0,-1.5,-1.5,-1.5,0,4,6.5]},{id:"preset_rnb",name:"RnB",gains:[3.5,10.5,8.5,1,-3,-1.5,3,3.5,4,5]},{id:"preset_hiphop",name:"HipHop",gains:[7,6,1,4,-1,-.5,1,-.5,2,4]},{id:"preset_electronic",name:"Electronic",gains:[6,5.5,1,0,-2,2,1,1.5,5.5,6.5]},{id:"preset_techno",name:"Techno",gains:[3.8,2.4,0,-2.4,-1.9,0,3.8,4.8,4.8,4.3]},{id:"preset_deep",name:"Deep",gains:[6,5,1.5,.5,4,3,1.5,-2,-5,-6.5]},{id:"preset_club",name:"Club",gains:[0,0,3.8,2.4,2.4,2.4,1,0,0,0]},{id:"preset_rock",name:"Rock",gains:[7,5.5,4,1,-.5,0,.5,3,4.5,6.5]},{id:"preset_rock_soft",name:"Rock Soft",gains:[1.5,0,0,-.5,0,1,3.8,4.8,5.7,6.2]},{id:"preset_ska",name:"Ska",gains:[-.5,-1.5,-1,0,1,2,3.8,4.3,5.2,4.3]},{id:"preset_reggae",name:"Reggae",gains:[0,0,0,-2.4,0,2.5,2.5,0,0,0]},{id:"preset_country",name:"Country",gains:[3,2,1,0,-1,0,2,3,4,4]},{id:"preset_funk",name:"Funk",gains:[4,5,3,0,-1,0,2,4,5,5]},{id:"preset_blues",name:"Blues",gains:[2,1,0,-1,0,1,2,3,4,3]},{id:"preset_metal",name:"Metal",gains:[8,7,6,4,2,1,0,2,4,6]},{id:"preset_indie",name:"Indie",gains:[2,3,2,1,0,-1,-2,0,3,4]},{id:"preset_chill",name:"Chill",gains:[1,1,0,-1,-2,-1,1,2,3,2]},{id:"preset_world",name:"World",gains:[3,2,0,-2,-1,1,3,4,5,3]},{id:"preset_alternative",name:"Alternative",gains:[3,2,1,0,-1,-2,1,3,4,3]},{id:"preset_ambient",name:"Ambient",gains:[0,-1,-2,-3,-2,0,1,2,3,2]},{id:"preset_mellow",name:"Mellow",gains:[1,1,0,-1,-2,-1,1,2,3,1]},{id:"preset_grunge",name:"Grunge",gains:[5,4,3,2,1,0,0,2,4,5]},{id:"preset_soul",name:"Soul",gains:[3,3,2,1,0,-1,0,2,3,3]},{id:"preset_folk",name:"Folk",gains:[2,1,0,-1,-2,-1,1,2,3,2]},{id:"preset_trap",name:"Trap",gains:[7,6,3,1,-2,-1,1,3,6,7]},{id:"preset_dubstep",name:"Dubstep",gains:[6,5,4,3,2,1,1,3,5,6]}];var b=Object.freeze({REACT:"REACT",VANILLA:"VANILLA",DEVELOPMENT:"development"}),l=Object.freeze({BUFFERING:"buffering",PLAYING:"playing",PAUSED:"paused",READY:"ready",IDLE:"idle",ENDED:"ended",STALLED:"stalled",ERROR:"error",TRACK_CHANGE:"trackchanged",DURATION_CHANGE:"durationchanged"}),D=Object.freeze({MEDIA_ERR_ABORTED:"The user canceled the audio.",MEDIA_ERR_DECODE:"An error occurred while decoding the audio.",MEDIA_ERR_NETWORK:"A network error occurred while fetching the audio.",MEDIA_ERR_SRC_NOT_SUPPORTED:"The audio is missing or is in a format not supported by your browser.",DEFAULT:"An unknown error occurred."}),G={HLS:"https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js"};var c,ie=(c=class{static validateEventName(e){if(!e||typeof e!="string")throw new Error("Invalid event name")}static notify(e,t,s="audiox_notifier_default"){this.validateEventName(e);let i=c.listeners[e];i&&t!==null&&(c.notifierState[e]={...c.notifierState[e]||{},...t},i.forEach(n=>{n(c.notifierState[e]);}));}static listen(e,t,s={}){if(this.validateEventName(e),typeof t!="function")throw new Error("Callback must be a function");return c.listeners[e]?c.listeners[e].add(t):(c.notifierState[e]=s,c.listeners[e]=new Set([t])),()=>{let i=c.listeners[e];i&&(i.delete(t),i.size===0&&delete c.listeners[e]);}}static multiListen(e,t,s={}){if(this.validateEventName(e),!Array.isArray(t)||t.length===0)throw new Error("Callbacks must be a non-empty array of functions");let i=t.map(n=>c.listen(e,n,s));return ()=>{i.forEach(n=>n());}}static getLatestState(e){return this.validateEventName(e),c.notifierState[e]}},r(c,"ChangeNotifier"),d(c,"listeners",{}),d(c,"notifierState",{}),c),A=ie;var p=r(a=>a&&Array.isArray(a)&&a.length,"isValidArray"),B=r(a=>a instanceof Function&&typeof a=="function","isValidFunction");var q=typeof window!==void 0&&window instanceof Window,M={},V=r(a=>{let e="";switch(a.error?.code){case MediaError.MEDIA_ERR_ABORTED:e+=D.MEDIA_ERR_ABORTED;break;case MediaError.MEDIA_ERR_NETWORK:e+=D.MEDIA_ERR_NETWORK;break;case MediaError.MEDIA_ERR_DECODE:e+=D.MEDIA_ERR_DECODE;break;case MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED:e+=D.MEDIA_ERR_SRC_NOT_SUPPORTED;break;default:e+=D.DEFAULT;break}return e},"getReadableErrorMessage"),K=r(a=>{let{title:e,album:t,artist:s,artwork:i}=a,n=i?i[0]?.src:"",S=["96x96","128x128","192x192","256x256","384x384","512x512"].map(C=>({src:n,sizes:C,type:"image/png"}));return {title:e,album:t,artist:s,artwork:S}},"metaDataCreator"),U=0,m=r((a,e)=>{let t=new Set;for(let n=0;nn+u,0);U=["ENDED","TRACK_CHANGE","PAUSE"].includes(e)?i:U,A.notify("AUDIO_STATE",{currentTrackPlayTime:i,previousTrackPlayTime:U});},"calculateActualPlayedLength"),Y=r((a,e,t)=>new Promise((s,i)=>{if(window instanceof Window&&window.document)if(M[t])e(),s();else {M[t]=!0;let n=document.createElement("script");n.type="text/javascript",n.src=a,n.async=!0,n.onload=()=>{e(),s();},document.head.appendChild(n);}else i(`Window not ready unable to initialize ${t}`);}),"loadScript"),X=r(()=>{let a=new _,e=a.getQueue(),t=!1,s=r(i=>{i.playbackState==="ended"&&!t&&(t=!0,e&&p(e)&&a.playNext()),i.playbackState!=="ended"&&(t=!1);},"audioStateListener");A.listen("AUDIO_STATE",s);},"handleQueuePlayback"),z=r(a=>{let e=[...a];for(let t=e.length-1;t>0;t--){let s=Math.floor(Math.random()*t);[e[t],e[s]]=[e[s],e[t]];}return e},"shuffle");var T,P=(T=class{constructor(){d(this,"audioCtx");d(this,"audioCtxStatus");d(this,"eqFilterBands");if(T._instance)return T._instance;if(this.audioCtx===void 0&&typeof AudioContext<"u")if(typeof AudioContext<"u")this.audioCtx=new AudioContext,this.audioCtxStatus="ACTIVE",this.init();else if(typeof window.webkitAudioContext<"u")this.audioCtx=new window.webkitAudioContext,this.audioCtxStatus="ACTIVE",this.init();else throw new Error("Web Audio API is not supported in this browser.");else this.audioCtxStatus="FAILED";if(this.audioCtxStatus==="ACTIVE"&&this.audioCtx.state==="suspended"){var e=r(()=>{this.audioCtx.resume(),setTimeout(()=>{this.audioCtx.state==="running"&&document.body.removeEventListener("click",e,!1);},0);},"resume");document.body.addEventListener("click",e,!1);}T._instance=this;}init(){try{let e=_.getAudioInstance(),t=this.audioCtx.createMediaElementSource(e),s=v.map(n=>{let u=this.audioCtx.createBiquadFilter();return u.type=n.type,u.frequency.value=n.frequency,u.gain.value=n.gain,u.Q.value=1,u}),i=this.audioCtx.createGain();i.gain.value=1,t.connect(s[0]);for(let n=0;ns.id===e);if(!(!this.eqFilterBands||this.eqFilterBands.length!==t?.gains.length))for(let s=0;s{t.gain.value=e[s];});}},r(T,"Equalizer"),d(T,"_instance"),T);var Q={ERROR:(a,e)=>{let t=e.type,s=e.details,i=e.fatal;A.notify("AUDIO_STATE",{playbackState:l.ERROR,error:{type:t,isFatal:i,detail:s}},`audiox_baseEvents_state_${a.type}`);},FRAG_CHANGED:()=>{}};var F=Object.freeze({ABORT:"abort",TIME_UPDATE:"timeupdate",CAN_PLAY:"canplay",CAN_PLAY_THROUGH:"canplaythrough",DURATION_CHANGE:"durationchange",ENDED:"ended",EMPTIED:"emptied",PLAYING:"playing",WAITING:"waiting",SEEKING:"seeking",SEEKED:"seeked",LOADED_META_DATA:"loadedmetadata",LOADED_DATA:"loadeddata",PLAY:"play",PAUSE:"pause",RATE_CHANGE:"ratechange",VOLUME_CHANGE:"volumechange",SUSPEND:"suspend",STALLED:"stalled",PROGRESS:"progress",LOAD_START:"loadstart",ERROR:"error",TRACK_CHANGE:"trackchange"}),j={MEDIA_ATTACHING:"hlsMediaAttaching",MEDIA_ATTACHED:"hlsMediaAttached",MEDIA_DETACHING:"hlsMediaDetaching",MEDIA_DETACHED:"hlsMediaDetached",BUFFER_RESET:"hlsBufferReset",BUFFER_CODECS:"hlsBufferCodecs",BUFFER_CREATED:"hlsBufferCreated",BUFFER_APPENDING:"hlsBufferAppending",BUFFER_APPENDED:"hlsBufferAppended",BUFFER_EOS:"hlsBufferEos",BUFFER_FLUSHING:"hlsBufferFlushing",BUFFER_FLUSHED:"hlsBufferFlushed",MANIFEST_LOADING:"hlsManifestLoading",MANIFEST_LOADED:"hlsManifestLoaded",MANIFEST_PARSED:"hlsManifestParsed",LEVEL_SWITCHING:"hlsLevelSwitching",LEVEL_SWITCHED:"hlsLevelSwitched",LEVEL_LOADING:"hlsLevelLoading",LEVEL_LOADED:"hlsLevelLoaded",LEVEL_UPDATED:"hlsLevelUpdated",LEVEL_PTS_UPDATED:"hlsLevelPtsUpdated",LEVELS_UPDATED:"hlsLevelsUpdated",AUDIO_TRACKS_UPDATED:"hlsAudioTracksUpdated",AUDIO_TRACK_SWITCHING:"hlsAudioTrackSwitching",AUDIO_TRACK_SWITCHED:"hlsAudioTrackSwitched",AUDIO_TRACK_LOADING:"hlsAudioTrackLoading",AUDIO_TRACK_LOADED:"hlsAudioTrackLoaded",SUBTITLE_TRACKS_UPDATED:"hlsSubtitleTracksUpdated",SUBTITLE_TRACKS_CLEARED:"hlsSubtitleTracksCleared",SUBTITLE_TRACK_SWITCH:"hlsSubtitleTrackSwitch",SUBTITLE_TRACK_LOADING:"hlsSubtitleTrackLoading",SUBTITLE_TRACK_LOADED:"hlsSubtitleTrackLoaded",SUBTITLE_FRAG_PROCESSED:"hlsSubtitleFragProcessed",CUES_PARSED:"hlsCuesParsed",NON_NATIVE_TEXT_TRACKS_FOUND:"hlsNonNativeTextTracksFound",INIT_PTS_FOUND:"hlsInitPtsFound",FRAG_LOADING:"hlsFragLoading",FRAG_LOAD_EMERGENCY_ABORTED:"hlsFragLoadEmergencyAborted",FRAG_LOADED:"hlsFragLoaded",FRAG_DECRYPTED:"hlsFragDecrypted",FRAG_PARSING_INIT_SEGMENT:"hlsFragParsingInitSegment",FRAG_PARSING_USERDATA:"hlsFragParsingUserdata",FRAG_PARSING_METADATA:"hlsFragParsingMetadata",FRAG_PARSED:"hlsFragParsed",FRAG_BUFFERED:"hlsFragBuffered",FRAG_CHANGED:"hlsFragChanged",FPS_DROP:"hlsFpsDrop",FPS_DROP_LEVEL_CAPPING:"hlsFpsDropLevelCapping",ERROR:"hlsError",DESTROYING:"hlsDestroying",KEY_LOADING:"hlsKeyLoading",KEY_LOADED:"hlsKeyLoaded",LIVE_BACK_BUFFER_REACHED:"hlsLiveBackBufferReached",BACK_BUFFER_REACHED:"hlsBackBufferReached"};var k=r((a,e=!1)=>{let t=_.getAudioInstance();p(Object.keys(a))&&Object.keys(a).forEach(s=>{let i=s;t?.addEventListener(F[i],n=>{if(s&&a[i]){let u=a[i];typeof u=="function"&&u(n,t,e);}});});},"attachEventListeners");var W=r((a,e=!1)=>{let s=new y().getHlsInstance();p(Object.keys(a))&&Object.keys(a).forEach(i=>{let n=i;s.on(j[n],(u,S)=>{if(n&&a[n]){let g=a[n];typeof g=="function"&&g(u,S,s,e);}});});},"attachHlsEventsListeners");var R,f,ne=(f=class{constructor(){d(this,"HlsClass");if(f._instance)return f._instance;f._instance=this;}async load(){return await Y(G.HLS,()=>{},"hls").then(()=>{this.HlsClass=window.Hls,window.Hls=void 0;}).catch(e=>{}),this.HlsClass}async init(e={},t){let s=await this.load();s.isSupported()&&(R=new s(e),W(Q,t));}addHlsMedia(e){let t=this.HlsClass,s=_.getAudioInstance();R.loadSource(e.source),R.attachMedia(s),R.on(t.Events.MEDIA_ATTACHED,function(){});}getHlsInstance(){return R}},r(f,"HlsAdapter"),d(f,"_instance"),f),y=ne;var $=r(a=>{"mediaSession"in navigator&&(navigator.mediaSession.metadata=new MediaMetadata(K(a)));},"updateMetaData"),J=r(()=>{"mediaSession"in navigator&&(navigator.mediaSession.setActionHandler("play",()=>{_.getAudioInstance().play();}),navigator.mediaSession.setActionHandler("pause",()=>{_.getAudioInstance().pause();}));},"attachMediaSessionHandlers"),I=r(()=>{if("setPositionState"in navigator.mediaSession){let a=A.getLatestState("AUDIO_X_STATE"),{currentTime:e,duration:t}=_.getAudioInstance();navigator.mediaSession.setPositionState({duration:t,playbackRate:a.playbackRate,position:e});}},"updatePositionState"),L=r(()=>{if(q&&"setPositionState"in navigator.mediaSession){_.getAudioInstance();navigator.mediaSession.setPositionState({position:0,duration:0,playbackRate:1});}},"resetPositionState");var Z=Object.freeze({1:"MEDIA_ERR_ABORTED",3:"MEDIA_ERR_DECODE",2:"MEDIA_ERR_NETWORK",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"});var E=A,ee={LOAD_START:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.BUFFERING,duration:e?.duration,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_state_${a.type}`),L();},DURATION_CHANGE:(a,e)=>{let t=E.getLatestState("AUDIO_X_STATE");E.notify("AUDIO_STATE",{playbackState:t.playbackState==="playing"?l.PLAYING:l.DURATION_CHANGE,duration:e?.duration,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_state_${a.type}`);},LOADED_META_DATA:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.BUFFERING,duration:e?.duration,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_state_${a.type}`),I();},LOADED_DATA:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.BUFFERING,duration:e?.duration,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_state_${a.type}`);},CAN_PLAY:a=>{E.notify("AUDIO_STATE",{playbackState:l.READY,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`);},CAN_PLAY_THROUGH:a=>{let e=E.getLatestState("AUDIO_X_STATE");E.notify("AUDIO_STATE",{playbackState:e.playbackState==="playing"?l.PLAYING:l.READY,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`);},PLAY:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.PLAYING,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`);},PLAYING:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.PLAYING,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`);},PAUSE:(a,e,t)=>{E.notify("AUDIO_STATE",{playbackState:l.PAUSED,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`),t&&m(e,"PAUSE");},ENDED:(a,e,t)=>{E.notify("AUDIO_STATE",{playbackState:l.ENDED,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`),t&&m(e,"ENDED");},ERROR:(a,e)=>{let t=e.error?.code,s=V(e);E.notify("AUDIO_STATE",{playbackState:l.ERROR,error:{code:t,message:Z[t],readable:s}},`audiox_baseEvents_state_${a.type}`);},TIME_UPDATE:(a,e)=>{let t=E.getLatestState("AUDIO_X_STATE");E.notify("AUDIO_STATE",{playbackState:e.paused?t?.playbackState:l.PLAYING,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`),L(),I();},WAITING:(a,e)=>{E.notify("AUDIO_STATE",{playbackState:l.BUFFERING,progress:e?.currentTime,error:{code:null,message:"",readable:""}},`audiox_baseEvents_state_${a.type}`);},VOLUME_CHANGE:a=>{E.notify("AUDIO_STATE",{},"audiox_baseEvents_state");}};var w={HAVE_NOTHING:0,HAVE_METADATA:1,HAVE_CURRENT_DATA:2,HAVE_FUTURE_DATA:3,HAVE_ENOUGH_DATA:4},x={playbackState:l.IDLE,duration:0,bufferedDuration:0,progress:0,volume:50,playbackRate:1,error:{code:null,message:"",readable:""},currentTrack:{},currentTrackPlayTime:0,previousTrackPlayTime:0};A.listen("AUDIO_STATE",a=>{A.notify("AUDIO_X_STATE",{...x,...a});},x);var o,O=A,h,_=(h=class{constructor(){d(this,"_audio");d(this,"isPlayLogEnabled");d(this,"_queue");d(this,"_currentQueueIndex",0);d(this,"_fetchFn");d(this,"eqStatus","IDEAL");d(this,"isEqEnabled",!1);d(this,"eqInstance");if(h._instance)return h._instance;if(process.env.NODE_ENV!==b?.DEVELOPMENT&&o)throw new Error("Cannot create multiple audio instance");h._instance=this,this._audio=new Audio,o=this._audio;}async init(e){let{preloadStrategy:t="auto",autoPlay:s=!1,useDefaultEventListeners:i=!0,customEventListeners:n=null,showNotificationActions:u=!1,enablePlayLog:S=!1,enableHls:g=!1,enableEQ:C=!1,crossOrigin:te="anonymous",hlsConfig:ae={}}=e;this._audio?.setAttribute("id","audio_x_instance"),this._audio.preload=t,this._audio.autoplay=s,this._audio.crossOrigin=te,this.isPlayLogEnabled=S,n!==null?k(n,!1):k(ee,S),u&&J(),C&&(this.isEqEnabled=C),g&&new y().init(ae,S);}async addMedia(e){if(!e)return;let t=e.source.includes(".m3u8")?"HLS":"DEFAULT";if(this.isPlayLogEnabled&&m(o,"TRACK_CHANGE"),t==="HLS"){let s=new y,i=s.getHlsInstance();i?(i.detachMedia(),s.addHlsMedia(e)):await this.reset();}else o.src=e.source;O.notify("AUDIO_STATE",{playbackState:l.TRACK_CHANGE,currentTrackPlayTime:0,currentTrack:e}),$(e),L(),o.load();}attachEq(){if(this.isEqEnabled&&this.eqStatus==="IDEAL")try{let e=new P;this.eqStatus=e.status(),this.eqInstance=e;}catch{}}async play(){let e=o.src!=="";o?.paused&&o.HAVE_ENOUGH_DATA===w.HAVE_ENOUGH_DATA&&e&&await o.play().then(()=>{I();}).catch(()=>{});}async addMediaAndPlay(e,t){let s=e||(this._queue.length>0?this._queue[0]:void 0);t&&B(t)&&s&&(this._fetchFn=t,await t(s)),this._queue&&p(this._queue)&&(this._currentQueueIndex=this._queue.findIndex(i=>i.id===s?.id));try{s&&this.addMedia(s).then(()=>{o.HAVE_ENOUGH_DATA===w.HAVE_ENOUGH_DATA&&setTimeout(async()=>{this.attachEq(),await this.play();},950);});}catch{}}pause(){o&&!o?.paused&&o?.pause();}stop(){o&&!o.paused&&(o?.pause(),o.currentTime=0);}async reset(){o&&(this.stop(),o.src="",o.srcObject=null);}setVolume(e){let t=e/100;o&&(o.volume=t,O.notify("AUDIO_STATE",{volume:e}));}setPlaybackRate(e){o&&(o.playbackRate=e,O.notify("AUDIO_STATE",{playbackRate:e}));}mute(){o&&!o.muted&&(o.muted=!0);}seek(e){o&&(o.currentTime=e);}async destroy(){o&&(await this.reset(),o.removeAttribute("src"),o.load());}subscribe(e,t,s={}){return O.listen(e,t,s)}addEventListener(e,t){o.addEventListener(e,t);}getPresets(){return P.getPresets()}setPreset(e){this.eqInstance.setPreset(e);}setCustomEQ(e){this.eqInstance.setCustomEQ(e);}addQueue(e,t){let s=p(e)?e.slice():[];switch(t){case"DEFAULT":this._queue=s;break;case"REVERSE":this._queue=s.reverse();break;case"SHUFFLE":this._queue=z(s);break;default:this._queue=s;break}X();}playNext(){if(this._queue.length>this._currentQueueIndex+1){this._currentQueueIndex++;let e=this._queue[this._currentQueueIndex];this.addMediaAndPlay(e,this._fetchFn);}}playPrevious(){if(this._currentQueueIndex>0){this._currentQueueIndex--;let e=this._queue[this._currentQueueIndex];this.addMediaAndPlay(e,this._fetchFn);}}clearQueue(){this._queue&&p(this._queue)&&(this._queue=[]);}removeFromQueue(e){if(this._queue&&p(this._queue)){let t=this._queue.filter(s=>s.id==e.id);this._queue=t;}}getQueue(){if(this._queue&&this._queue.length)return this._queue}get id(){return o?.getAttribute("id")}static getAudioInstance(){return o}},r(h,"AudioX"),d(h,"_instance"),h); -export { U as AUDIO_EVENTS, F as AUDIO_STATE, O as AUDIO_X_CONSTANTS, _ as AudioX }; +export { F as AUDIO_EVENTS, x as AUDIO_STATE, b as AUDIO_X_CONSTANTS, _ as AudioX }; //# sourceMappingURL=out.js.map //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 33c8219..40ba69b 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/constants/equalizer.ts","../src/constants/common.ts","../src/helpers/notifier.ts","../src/helpers/common.ts","../src/adapters/equalizer.ts","../src/events/hlsEvents.ts","../src/events/audioEvents.ts","../src/events/listeners.ts","../src/adapters/hls.ts","../src/events/errorEvents.ts","../src/events/baseEvents.ts","../src/mediasession/mediasessionHandler.ts","../src/states/audioState.ts","../src/audio.ts"],"names":["bands","frequency","type","gain","presets","id","name","gains","AUDIO_X_CONSTANTS","Object","freeze","REACT","VANILLA","DEVELOPMENT","PLAYBACK_STATE","BUFFERING","PLAYING","PAUSED","READY","IDLE","ENDED","STALLED","ERROR","TRACK_CHANGE","DURATION_CHANGE","ERROR_MSG_MAP","MEDIA_ERR_ABORTED","MEDIA_ERR_DECODE","MEDIA_ERR_NETWORK","MEDIA_ERR_SRC_NOT_SUPPORTED","DEFAULT","URLS","HLS","_a","ChangeNotifier","validateEventName","eventName","Error","notify","data","caller","listenerCbs","listeners","notifierState","forEach","cb","listen","callback","state","add","Set","eventListeners","delete","size","multiListen","callbacks","Array","isArray","length","unsubscribeFunctions","map","unsubscribe","getLatestState","__publicField","notifier_default","isValidArray","__name","arr","isValidFunction","fn","Function","isValidWindow","window","undefined","Window","loadedScripts","getReadableErrorMessage","audioInstance","message","error","code","MediaError","metaDataCreator","mediaTrack","title","album","artist","artwork","artworkUrl","src","artworkMap","el","sizes","previousTrackPlayTime","calculateActualPlayedLength","event","lengthSet","i","played","startX","start","width","end","currentTrackPlayTime","reduce","acc","val","includes","loadScript","url","onLoad","Promise","resolve","reject","document","script","createElement","async","onload","head","appendChild","handleQueuePlayback","audio","AudioX","queue","getQueue","hasEnded","audioStateListener","playbackState","playNext","shuffle","array","shuffledArray","j","Math","floor","random","Equalizer","constructor","audioCtx","audioCtxStatus","eqFilterBands","_instance","AudioContext","init","webkitAudioContext","resume","setTimeout","body","removeEventListener","addEventListener","getAudioInstance","audioSource","createMediaElementSource","equalizerBands","band","filter","createBiquadFilter","value","Q","gainNode","createGain","connect","destination","setPreset","preset","find","getPresets","status","setCustomEQ","index","HLS_EVENTS_CALLBACK_MAP","e","detail","details","isFatal","fatal","FRAG_CHANGED","AUDIO_EVENTS","ABORT","TIME_UPDATE","CAN_PLAY","CAN_PLAY_THROUGH","EMPTIED","WAITING","SEEKING","SEEKED","LOADED_META_DATA","LOADED_DATA","PLAY","PAUSE","RATE_CHANGE","VOLUME_CHANGE","SUSPEND","PROGRESS","LOAD_START","HLS_EVENTS","MEDIA_ATTACHING","MEDIA_ATTACHED","MEDIA_DETACHING","MEDIA_DETACHED","BUFFER_RESET","BUFFER_CODECS","BUFFER_CREATED","BUFFER_APPENDING","BUFFER_APPENDED","BUFFER_EOS","BUFFER_FLUSHING","BUFFER_FLUSHED","MANIFEST_LOADING","MANIFEST_LOADED","MANIFEST_PARSED","LEVEL_SWITCHING","LEVEL_SWITCHED","LEVEL_LOADING","LEVEL_LOADED","LEVEL_UPDATED","LEVEL_PTS_UPDATED","LEVELS_UPDATED","AUDIO_TRACKS_UPDATED","AUDIO_TRACK_SWITCHING","AUDIO_TRACK_SWITCHED","AUDIO_TRACK_LOADING","AUDIO_TRACK_LOADED","SUBTITLE_TRACKS_UPDATED","SUBTITLE_TRACKS_CLEARED","SUBTITLE_TRACK_SWITCH","SUBTITLE_TRACK_LOADING","SUBTITLE_TRACK_LOADED","SUBTITLE_FRAG_PROCESSED","CUES_PARSED","NON_NATIVE_TEXT_TRACKS_FOUND","INIT_PTS_FOUND","FRAG_LOADING","FRAG_LOAD_EMERGENCY_ABORTED","FRAG_LOADED","FRAG_DECRYPTED","FRAG_PARSING_INIT_SEGMENT","FRAG_PARSING_USERDATA","FRAG_PARSING_METADATA","FRAG_PARSED","FRAG_BUFFERED","FPS_DROP","FPS_DROP_LEVEL_CAPPING","DESTROYING","KEY_LOADING","KEY_LOADED","LIVE_BACK_BUFFER_REACHED","BACK_BUFFER_REACHED","CUSTOM_AUDIO_EVENTS","AUDIO_X_STATE","attachEventListeners","eventListenersCallbackMap","playLogEnabled","keys","evt","listenerCallback","attachHlsEventsListeners","hlsEventlistenerCallbackMap","hlsInstance","HlsAdapter","getHlsInstance","on","HlsClass","load","then","Hls","catch","msg","config","enablePlayLog","isSupported","addHlsMedia","loadSource","source","attachMedia","Events","hls_default","ERROR_EVENTS","notifier","BASE_EVENT_CALLBACK_MAP","duration","readable","audioState","progress","currentTime","errorCode","paused","updateMetaData","navigator","mediaSession","metadata","MediaMetadata","attachMediaSessionHandlers","setActionHandler","play","pause","READY_STATE","HAVE_NOTHING","HAVE_METADATA","HAVE_CURRENT_DATA","HAVE_FUTURE_DATA","HAVE_ENOUGH_DATA","AUDIO_STATE","bufferedDuration","volume","playbackRate","currentTrack","_audio","isPlayLogEnabled","_queue","_currentQueueIndex","_fetchFn","eqStatus","isEqEnabled","eqInstance","process","env","NODE_ENV","Audio","initProps","preloadStrategy","autoPlay","useDefaultEventListeners","customEventListeners","showNotificationActions","enableHls","enableEQ","crossOrigin","hlsConfig","setAttribute","preload","autoplay","addMedia","mediaType","hls","detachMedia","reset","attachEq","eq","isSourceAvailable","addMediaAndPlay","fetchFn","findIndex","track","stop","srcObject","setVolume","actualVolume","setPlaybackRate","mute","muted","seek","time","destroy","removeAttribute","subscribe","addQueue","playbackType","playerQueue","slice","reverse","nextTrack","playPrevious","previousTrack","clearQueue","removeFromQueue","getAttribute"],"mappings":"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","sourcesContent":["import { Band, Preset } from 'types/equalizer.types';\n\nconst bands: Band[] = [\n { frequency: 31, type: 'lowshelf', gain: 0 }, // Band 0: 31 Hz - Low Shelf Filter\n { frequency: 63, type: 'peaking', gain: 0 }, // Band 1: 63 Hz - Peaking Filter\n { frequency: 125, type: 'peaking', gain: 0 }, // Band 2: 125 Hz - Peaking Filter\n { frequency: 250, type: 'peaking', gain: 0 }, // Band 3: 250 Hz - Peaking Filter\n { frequency: 500, type: 'peaking', gain: 0 }, // Band 4: 500 Hz - Peaking Filter\n { frequency: 1000, type: 'peaking', gain: 0 }, // Band 5: 1 kHz - Peaking Filter\n { frequency: 2000, type: 'peaking', gain: 0 }, // Band 6: 2 kHz - Peaking Filter\n { frequency: 4000, type: 'peaking', gain: 0 }, // Band 7: 4 kHz - Peaking Filter\n { frequency: 8000, type: 'peaking', gain: 0 }, // Band 8: 8 kHz - Peaking Filter\n { frequency: 16000, type: 'highshelf', gain: 0 } // Band 9: 16 kHz - High Shelf Filter\n];\n\nconst presets: Preset[] = [\n {\n id: 'preset_default',\n name: 'Default',\n gains: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n },\n {\n id: 'preset_live',\n name: 'Live',\n gains: [-1.0, 1.0, 3.0, 4.0, 4.0, 4.0, 3.0, 2.0, 2.0, 2.0]\n },\n {\n id: 'preset_acoustic',\n name: 'Acoustic',\n gains: [6.0, 6.0, 4.0, 1.0, 3.0, 3.0, 4.0, 5.0, 4.0, 1.5]\n },\n {\n id: 'preset_classical',\n name: 'Classical',\n gains: [6.0, 5.0, 4.0, 3.0, -1.0, -1.0, 0.0, 2.0, 4.0, 5.0]\n },\n {\n id: 'preset_piano',\n name: 'Piano',\n gains: [4.0, 2.0, 0.0, 3.5, 4.0, 1.5, 5.0, 6.0, 4.0, 4.5]\n },\n {\n id: 'preset_lounge',\n name: 'Lounge',\n gains: [-3.0, -1.5, 0.0, 1.0, 5.5, 1.0, 0.0, -1.5, 2.0, 0.5]\n },\n {\n id: 'preset_spoken_word',\n name: 'Spoken Word',\n gains: [-2.0, 0.0, 0.0, 1.0, 5.0, 6.5, 7.0, 6.0, 3.0, 0.0]\n },\n {\n id: 'preset_jazz',\n name: 'Jazz',\n gains: [5.5, 4.0, 1.0, 2.0, -1.5, -1.5, 0.0, 1.0, 4.0, 5.5]\n },\n {\n id: 'preset_pop',\n name: 'Pop',\n gains: [0.5, 2.4, 3.8, 4.3, 3.0, 0.0, -0.5, -0.5, 0.5, 0.5]\n },\n {\n id: 'preset_dance',\n name: 'Dance',\n gains: [5.0, 10.0, 6.5, 0.0, 2.0, 4.5, 7.5, 7.0, 5.5, 0.0]\n },\n {\n id: 'preset_latin',\n name: 'Latin',\n gains: [3.5, 1.5, 0.0, 0.0, -1.5, -1.5, -1.5, 0.0, 4.0, 6.5]\n },\n {\n id: 'preset_rnb',\n name: 'RnB',\n gains: [3.5, 10.5, 8.5, 1.0, -3.0, -1.5, 3.0, 3.5, 4.0, 5.0]\n },\n {\n id: 'preset_hiphop',\n name: 'HipHop',\n gains: [7.0, 6.0, 1.0, 4.0, -1.0, -0.5, 1.0, -0.5, 2.0, 4.0]\n },\n {\n id: 'preset_electronic',\n name: 'Electronic',\n gains: [6.0, 5.5, 1.0, 0.0, -2.0, 2.0, 1.0, 1.5, 5.5, 6.5]\n },\n {\n id: 'preset_techno',\n name: 'Techno',\n gains: [3.8, 2.4, 0.0, -2.4, -1.9, 0.0, 3.8, 4.8, 4.8, 4.3]\n },\n {\n id: 'preset_deep',\n name: 'Deep',\n gains: [6.0, 5.0, 1.5, 0.5, 4.0, 3.0, 1.5, -2.0, -5.0, -6.5]\n },\n {\n id: 'preset_club',\n name: 'Club',\n gains: [0.0, 0.0, 3.8, 2.4, 2.4, 2.4, 1.0, 0.0, 0.0, 0.0]\n },\n {\n id: 'preset_rock',\n name: 'Rock',\n gains: [7.0, 5.5, 4.0, 1.0, -0.5, 0.0, 0.5, 3.0, 4.5, 6.5]\n },\n {\n id: 'preset_rock_soft',\n name: 'Rock Soft',\n gains: [1.5, 0.0, 0.0, -0.5, 0.0, 1.0, 3.8, 4.8, 5.7, 6.2]\n },\n {\n id: 'preset_ska',\n name: 'Ska',\n gains: [-0.5, -1.5, -1.0, 0.0, 1.0, 2.0, 3.8, 4.3, 5.2, 4.3]\n },\n {\n id: 'preset_reggae',\n name: 'Reggae',\n gains: [0.0, 0.0, 0.0, -2.4, 0.0, 2.5, 2.5, 0.0, 0.0, 0.0]\n },\n {\n id: 'preset_country',\n name: 'Country',\n gains: [3.0, 2.0, 1.0, 0.0, -1.0, 0.0, 2.0, 3.0, 4.0, 4.0]\n },\n {\n id: 'preset_funk',\n name: 'Funk',\n gains: [4.0, 5.0, 3.0, 0.0, -1.0, 0.0, 2.0, 4.0, 5.0, 5.0]\n },\n {\n id: 'preset_blues',\n name: 'Blues',\n gains: [2.0, 1.0, 0.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 3.0]\n },\n {\n id: 'preset_metal',\n name: 'Metal',\n gains: [8.0, 7.0, 6.0, 4.0, 2.0, 1.0, 0.0, 2.0, 4.0, 6.0]\n },\n {\n id: 'preset_indie',\n name: 'Indie',\n gains: [2.0, 3.0, 2.0, 1.0, 0.0, -1.0, -2.0, 0.0, 3.0, 4.0]\n },\n {\n id: 'preset_chill',\n name: 'Chill',\n gains: [1.0, 1.0, 0.0, -1.0, -2.0, -1.0, 1.0, 2.0, 3.0, 2.0]\n },\n {\n id: 'preset_world',\n name: 'World',\n gains: [3.0, 2.0, 0.0, -2.0, -1.0, 1.0, 3.0, 4.0, 5.0, 3.0]\n },\n {\n id: 'preset_alternative',\n name: 'Alternative',\n gains: [3.0, 2.0, 1.0, 0.0, -1.0, -2.0, 1.0, 3.0, 4.0, 3.0]\n },\n {\n id: 'preset_ambient',\n name: 'Ambient',\n gains: [0.0, -1.0, -2.0, -3.0, -2.0, 0.0, 1.0, 2.0, 3.0, 2.0]\n },\n {\n id: 'preset_mellow',\n name: 'Mellow',\n gains: [1.0, 1.0, 0.0, -1.0, -2.0, -1.0, 1.0, 2.0, 3.0, 1.0]\n },\n {\n id: 'preset_grunge',\n name: 'Grunge',\n gains: [5.0, 4.0, 3.0, 2.0, 1.0, 0.0, 0.0, 2.0, 4.0, 5.0]\n },\n {\n id: 'preset_soul',\n name: 'Soul',\n gains: [3.0, 3.0, 2.0, 1.0, 0.0, -1.0, 0.0, 2.0, 3.0, 3.0]\n },\n {\n id: 'preset_folk',\n name: 'Folk',\n gains: [2.0, 1.0, 0.0, -1.0, -2.0, -1.0, 1.0, 2.0, 3.0, 2.0]\n },\n {\n id: 'preset_trap',\n name: 'Trap',\n gains: [7.0, 6.0, 3.0, 1.0, -2.0, -1.0, 1.0, 3.0, 6.0, 7.0]\n },\n {\n id: 'preset_dubstep',\n name: 'Dubstep',\n gains: [6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 1.0, 3.0, 5.0, 6.0]\n }\n];\n\nexport { bands, presets };\n","import { InitMode } from 'types';\nimport { ErrorMessageMap } from 'types/errorEvents.types';\n\nconst AUDIO_X_CONSTANTS = Object.freeze({\n REACT: 'REACT' as InitMode,\n VANILLA: 'VANILLA' as InitMode,\n DEVELOPMENT: 'development'\n});\n\nconst PLAYBACK_STATE = Object.freeze({\n BUFFERING: 'buffering',\n PLAYING: 'playing',\n PAUSED: 'paused',\n READY: 'ready',\n IDLE: 'idle',\n ENDED: 'ended',\n STALLED: 'stalled',\n ERROR: 'error',\n TRACK_CHANGE: 'trackchanged',\n DURATION_CHANGE: 'durationchanged'\n});\n\nconst ERROR_MSG_MAP: ErrorMessageMap = Object.freeze({\n MEDIA_ERR_ABORTED: 'The user canceled the audio.',\n MEDIA_ERR_DECODE: 'An error occurred while decoding the audio.',\n MEDIA_ERR_NETWORK: 'A network error occurred while fetching the audio.',\n MEDIA_ERR_SRC_NOT_SUPPORTED:\n 'The audio is missing or is in a format not supported by your browser.',\n DEFAULT: 'An unknown error occurred.'\n});\n\nconst URLS = {\n HLS: 'https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js'\n};\n\nexport { AUDIO_X_CONSTANTS, ERROR_MSG_MAP, PLAYBACK_STATE, URLS };\n","type ListenerCallback = (data: T) => void;\n\nclass ChangeNotifier {\n private static listeners: Record>> = {};\n private static notifierState: Record = {};\n\n private static validateEventName(eventName: string): void {\n if (!eventName || typeof eventName !== 'string') {\n throw new Error('Invalid event name');\n }\n }\n\n static notify(\n eventName: string,\n data: T,\n caller: string = 'audiox_notifier_default'\n ): void {\n this.validateEventName(eventName);\n\n const listenerCbs = ChangeNotifier.listeners[eventName];\n\n if (!listenerCbs) return;\n\n if (data !== null) {\n console.log(`NOTIFYING TO EVENT : ${eventName} - CALLER : ${caller}`);\n\n ChangeNotifier.notifierState[eventName] = {\n ...(ChangeNotifier.notifierState[eventName] || {}),\n ...data\n };\n\n listenerCbs.forEach((cb: ListenerCallback) => {\n cb(ChangeNotifier.notifierState[eventName]);\n });\n }\n }\n\n static listen(\n eventName: string,\n callback: ListenerCallback,\n state = {}\n ): () => void {\n this.validateEventName(eventName);\n\n if (typeof callback !== 'function') {\n throw new Error('Callback must be a function');\n }\n\n if (!ChangeNotifier.listeners[eventName]) {\n ChangeNotifier.notifierState[eventName] = state;\n ChangeNotifier.listeners[eventName] = new Set([callback]);\n } else {\n ChangeNotifier.listeners[eventName].add(callback);\n }\n\n return (): void => {\n const eventListeners = ChangeNotifier.listeners[eventName];\n\n if (!eventListeners) {\n console.log(`EVENT NOT FOUND : ${eventName}`);\n return;\n }\n\n console.log(`REMOVING EVENT LISTENER FOR EVENT : ${eventName}`);\n\n eventListeners.delete(callback);\n\n if (eventListeners.size === 0) {\n delete ChangeNotifier.listeners[eventName];\n }\n };\n }\n\n static multiListen(\n eventName: string,\n callbacks: ListenerCallback[],\n state = {}\n ): () => void {\n this.validateEventName(eventName);\n\n if (!Array.isArray(callbacks) || callbacks.length === 0) {\n throw new Error('Callbacks must be a non-empty array of functions');\n }\n\n const unsubscribeFunctions = callbacks.map((callback) =>\n ChangeNotifier.listen(eventName, callback, state)\n );\n\n return (): void => {\n unsubscribeFunctions.forEach((unsubscribe) => unsubscribe());\n };\n }\n\n // Retrieve the latest state data for a specific event\n static getLatestState(eventName: string): T | undefined {\n this.validateEventName(eventName);\n\n return ChangeNotifier.notifierState[eventName];\n }\n}\n\nexport default ChangeNotifier;\n","import { AudioX } from 'audio';\nimport { ERROR_MSG_MAP } from 'constants/common';\nimport { AudioEvents, AudioState, MediaTrack } from 'types';\nimport ChangeNotifier from './notifier';\n\nconst isValidArray = (arr: any[]) => arr && Array.isArray(arr) && arr.length;\nconst isValidFunction = (fn: any) =>\n fn instanceof Function && typeof fn === 'function';\n\nconst isValidObject = (obj: any) =>\n typeof obj === 'object' &&\n obj !== null &&\n obj instanceof Object &&\n Object.keys(obj).length;\n\nconst isValidWindow = typeof window !== undefined && window instanceof Window;\nconst loadedScripts: any = {};\n\nconst getReadableErrorMessage = (audioInstance: HTMLAudioElement) => {\n let message = '';\n const err = audioInstance.error;\n\n switch (err?.code) {\n case MediaError.MEDIA_ERR_ABORTED:\n message += ERROR_MSG_MAP['MEDIA_ERR_ABORTED'];\n break;\n case MediaError.MEDIA_ERR_NETWORK:\n message += ERROR_MSG_MAP['MEDIA_ERR_NETWORK'];\n break;\n case MediaError.MEDIA_ERR_DECODE:\n message += ERROR_MSG_MAP['MEDIA_ERR_DECODE'];\n break;\n case MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED:\n message += ERROR_MSG_MAP['MEDIA_ERR_SRC_NOT_SUPPORTED'];\n break;\n default:\n message += ERROR_MSG_MAP['DEFAULT'];\n break;\n }\n\n return message;\n};\n\nconst metaDataCreator = (mediaTrack: MediaTrack) => {\n const { title, album, artist, artwork } = mediaTrack;\n const artworkUrl = artwork ? artwork[0]?.src : '';\n const sizes = [\n '96x96',\n '128x128',\n '192x192',\n '256x256',\n '384x384',\n '512x512'\n ];\n const artworkMap = sizes.map((el) => {\n return { src: artworkUrl, sizes: el, type: 'image/png' };\n });\n const metaData = {\n title,\n album,\n artist,\n artwork: artworkMap\n };\n return metaData;\n};\n\nlet previousTrackPlayTime = 0;\nexport const calculateActualPlayedLength = (\n audioInstance: HTMLAudioElement,\n event?: keyof AudioEvents\n) => {\n const lengthSet = new Set();\n for (let i = 0; i < audioInstance.played.length; i++) {\n const startX = audioInstance.played.start(i);\n const endX = audioInstance.played.end(i);\n const width = endX - startX;\n lengthSet.add(width);\n }\n const lengthArr = [...lengthSet] as number[];\n const currentTrackPlayTime = lengthArr.reduce((acc, val) => acc + val, 0);\n\n previousTrackPlayTime = ['ENDED', 'TRACK_CHANGE', 'PAUSE'].includes(\n event as keyof AudioEvents\n )\n ? currentTrackPlayTime\n : previousTrackPlayTime;\n ChangeNotifier.notify('AUDIO_STATE', {\n currentTrackPlayTime,\n previousTrackPlayTime\n });\n};\n\nconst loadScript = (\n url: string,\n onLoad: () => void,\n name: string\n): Promise => {\n return new Promise((resolve, reject) => {\n if (window instanceof Window && window.document) {\n if (!loadedScripts[name]) {\n loadedScripts[name] = true;\n const script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = url;\n script.async = true;\n script.onload = () => {\n onLoad();\n resolve();\n };\n document.head.appendChild(script);\n } else {\n onLoad();\n resolve();\n }\n } else {\n reject(`Window not ready unable to initialize ${name}`);\n }\n });\n};\n\nconst handleQueuePlayback = () => {\n const audio = new AudioX();\n const queue = audio.getQueue();\n let hasEnded = false;\n\n const audioStateListener = (state: AudioState) => {\n if (state.playbackState === 'ended' && !hasEnded) {\n hasEnded = true;\n if (queue && isValidArray(queue)) {\n audio.playNext();\n }\n }\n if (state.playbackState !== 'ended') {\n hasEnded = false;\n }\n };\n\n ChangeNotifier.listen('AUDIO_STATE', audioStateListener);\n};\n\nconst shuffle = (array: T[]): T[] => {\n const shuffledArray = [...array];\n\n for (let i = shuffledArray.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * i);\n\n [shuffledArray[i], shuffledArray[j]] = [shuffledArray[j], shuffledArray[i]];\n }\n\n return shuffledArray;\n};\n\nexport {\n getReadableErrorMessage,\n handleQueuePlayback,\n isValidArray,\n isValidFunction,\n isValidObject,\n isValidWindow,\n loadScript,\n metaDataCreator,\n shuffle\n};\n","import { AudioX } from 'audio';\nimport { bands, presets } from 'constants/equalizer';\nimport { isValidArray } from 'helpers/common';\n\nimport { EqualizerStatus, Preset } from 'types/equalizer.types';\n\nclass Equalizer {\n private static _instance: Equalizer;\n private audioCtx: AudioContext;\n private audioCtxStatus: EqualizerStatus;\n private eqFilterBands: BiquadFilterNode[];\n\n constructor() {\n if (Equalizer._instance) {\n console.warn(\n 'Instantiation failed: cannot create multiple instance of Equalizer returning existing instance'\n );\n return Equalizer._instance;\n }\n\n if (this.audioCtx === undefined && typeof AudioContext !== 'undefined') {\n if (typeof AudioContext !== 'undefined') {\n this.audioCtx = new AudioContext();\n this.audioCtxStatus = 'ACTIVE';\n this.init();\n } else if (typeof (window as any).webkitAudioContext !== 'undefined') {\n this.audioCtx = new (window as any).webkitAudioContext();\n this.audioCtxStatus = 'ACTIVE';\n this.init();\n } else {\n throw new Error('Web Audio API is not supported in this browser.');\n }\n } else {\n console.log('Equalizer not initialized, AudioContext failed');\n this.audioCtxStatus = 'FAILED';\n }\n\n // context state at this time is `undefined` in iOS8 Safari\n if (\n this.audioCtxStatus === 'ACTIVE' &&\n this.audioCtx.state === 'suspended'\n ) {\n var resume = () => {\n this.audioCtx.resume();\n setTimeout(() => {\n if (this.audioCtx.state === 'running') {\n document.body.removeEventListener('click', resume, false);\n }\n }, 0);\n };\n\n document.body.addEventListener('click', resume, false);\n }\n\n Equalizer._instance = this;\n }\n\n init() {\n try {\n const audioInstance = AudioX.getAudioInstance();\n const audioSource = this.audioCtx.createMediaElementSource(audioInstance);\n\n const equalizerBands = bands.map((band) => {\n const filter = this.audioCtx.createBiquadFilter();\n filter.type = band.type;\n filter.frequency.value = band.frequency;\n filter.gain.value = band.gain;\n filter.Q.value = 1;\n return filter;\n });\n\n const gainNode = this.audioCtx.createGain();\n gainNode.gain.value = 1; //Normalize sound output\n\n audioSource.connect(equalizerBands[0]);\n\n for (let i = 0; i < equalizerBands.length - 1; i++) {\n equalizerBands[i].connect(equalizerBands[i + 1]);\n }\n\n equalizerBands[equalizerBands.length - 1].connect(gainNode);\n gainNode.connect(this.audioCtx.destination);\n\n this.audioCtxStatus = 'ACTIVE';\n this.eqFilterBands = equalizerBands;\n } catch (error) {\n this.audioCtxStatus = 'FAILED';\n }\n }\n\n setPreset(id: keyof Preset) {\n const preset = presets.find((el) => el.id === id);\n console.log({ preset });\n if (\n !this.eqFilterBands ||\n this.eqFilterBands.length !== preset?.gains.length\n ) {\n console.error('Invalid data provided.');\n return;\n }\n for (let i = 0; i < this.eqFilterBands.length; i++) {\n this.eqFilterBands[i].gain.value = preset?.gains[i];\n }\n }\n\n static getPresets() {\n return presets;\n }\n\n status() {\n if (this.audioCtx.state === 'suspended') {\n this.audioCtx.resume();\n }\n return this.audioCtxStatus;\n }\n\n setCustomEQ(gains: number[]) {\n if (isValidArray(gains)) {\n this.eqFilterBands.forEach((band: BiquadFilterNode, index: number) => {\n band.gain.value = gains[index];\n });\n }\n }\n}\n\nexport { Equalizer };\n","import { PLAYBACK_STATE } from 'constants/common';\nimport ChangeNotifier from 'helpers/notifier';\nimport { HlsEventsCallbackMap } from 'types/audioEvents.types';\n\nexport const HLS_EVENTS_CALLBACK_MAP: HlsEventsCallbackMap = {\n ERROR: (e: Event, data: any) => {\n const type = data.type;\n const detail = data.details;\n const isFatal = data.fatal;\n console.log('STATUS', e.type);\n\n ChangeNotifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.ERROR,\n error: {\n type,\n isFatal,\n detail\n }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n FRAG_CHANGED: () => {\n console.log('FRAG_CHANGED');\n }\n};\n","import { AudioEvents } from 'types';\n\nexport const AUDIO_EVENTS: AudioEvents = Object.freeze({\n ABORT: 'abort',\n TIME_UPDATE: 'timeupdate',\n CAN_PLAY: 'canplay',\n CAN_PLAY_THROUGH: 'canplaythrough',\n DURATION_CHANGE: 'durationchange',\n ENDED: 'ended',\n EMPTIED: 'emptied',\n PLAYING: 'playing',\n WAITING: 'waiting',\n SEEKING: 'seeking',\n SEEKED: 'seeked',\n LOADED_META_DATA: 'loadedmetadata',\n LOADED_DATA: 'loadeddata',\n PLAY: 'play',\n PAUSE: 'pause',\n RATE_CHANGE: 'ratechange',\n VOLUME_CHANGE: 'volumechange',\n SUSPEND: 'suspend',\n STALLED: 'stalled',\n PROGRESS: 'progress',\n LOAD_START: 'loadstart',\n ERROR: 'error',\n TRACK_CHANGE: 'trackchange' // this is a custom event added to support track change\n});\n\nexport const HLS_EVENTS = {\n MEDIA_ATTACHING: 'hlsMediaAttaching',\n MEDIA_ATTACHED: 'hlsMediaAttached',\n MEDIA_DETACHING: 'hlsMediaDetaching',\n MEDIA_DETACHED: 'hlsMediaDetached',\n BUFFER_RESET: 'hlsBufferReset',\n BUFFER_CODECS: 'hlsBufferCodecs',\n BUFFER_CREATED: 'hlsBufferCreated',\n BUFFER_APPENDING: 'hlsBufferAppending',\n BUFFER_APPENDED: 'hlsBufferAppended',\n BUFFER_EOS: 'hlsBufferEos',\n BUFFER_FLUSHING: 'hlsBufferFlushing',\n BUFFER_FLUSHED: 'hlsBufferFlushed',\n MANIFEST_LOADING: 'hlsManifestLoading',\n MANIFEST_LOADED: 'hlsManifestLoaded',\n MANIFEST_PARSED: 'hlsManifestParsed',\n LEVEL_SWITCHING: 'hlsLevelSwitching',\n LEVEL_SWITCHED: 'hlsLevelSwitched',\n LEVEL_LOADING: 'hlsLevelLoading',\n LEVEL_LOADED: 'hlsLevelLoaded',\n LEVEL_UPDATED: 'hlsLevelUpdated',\n LEVEL_PTS_UPDATED: 'hlsLevelPtsUpdated',\n LEVELS_UPDATED: 'hlsLevelsUpdated',\n AUDIO_TRACKS_UPDATED: 'hlsAudioTracksUpdated',\n AUDIO_TRACK_SWITCHING: 'hlsAudioTrackSwitching',\n AUDIO_TRACK_SWITCHED: 'hlsAudioTrackSwitched',\n AUDIO_TRACK_LOADING: 'hlsAudioTrackLoading',\n AUDIO_TRACK_LOADED: 'hlsAudioTrackLoaded',\n SUBTITLE_TRACKS_UPDATED: 'hlsSubtitleTracksUpdated',\n SUBTITLE_TRACKS_CLEARED: 'hlsSubtitleTracksCleared',\n SUBTITLE_TRACK_SWITCH: 'hlsSubtitleTrackSwitch',\n SUBTITLE_TRACK_LOADING: 'hlsSubtitleTrackLoading',\n SUBTITLE_TRACK_LOADED: 'hlsSubtitleTrackLoaded',\n SUBTITLE_FRAG_PROCESSED: 'hlsSubtitleFragProcessed',\n CUES_PARSED: 'hlsCuesParsed',\n NON_NATIVE_TEXT_TRACKS_FOUND: 'hlsNonNativeTextTracksFound',\n INIT_PTS_FOUND: 'hlsInitPtsFound',\n FRAG_LOADING: 'hlsFragLoading',\n FRAG_LOAD_EMERGENCY_ABORTED: 'hlsFragLoadEmergencyAborted',\n FRAG_LOADED: 'hlsFragLoaded',\n FRAG_DECRYPTED: 'hlsFragDecrypted',\n FRAG_PARSING_INIT_SEGMENT: 'hlsFragParsingInitSegment',\n FRAG_PARSING_USERDATA: 'hlsFragParsingUserdata',\n FRAG_PARSING_METADATA: 'hlsFragParsingMetadata',\n FRAG_PARSED: 'hlsFragParsed',\n FRAG_BUFFERED: 'hlsFragBuffered',\n FRAG_CHANGED: 'hlsFragChanged',\n FPS_DROP: 'hlsFpsDrop',\n FPS_DROP_LEVEL_CAPPING: 'hlsFpsDropLevelCapping',\n ERROR: 'hlsError',\n DESTROYING: 'hlsDestroying',\n KEY_LOADING: 'hlsKeyLoading',\n KEY_LOADED: 'hlsKeyLoaded',\n LIVE_BACK_BUFFER_REACHED: 'hlsLiveBackBufferReached',\n BACK_BUFFER_REACHED: 'hlsBackBufferReached'\n};\n\nexport const CUSTOM_AUDIO_EVENTS = Object.freeze({\n AUDIO_X_STATE: 'AUDIO_X_STATE'\n});\n","import HlsAdapter from 'adapters/hls';\nimport { AudioX } from 'audio';\nimport { isValidArray } from 'helpers/common';\nimport ChangeNotifier from 'helpers/notifier';\nimport {\n AudioEvents,\n EventListenerCallbackMap,\n EventListenersList,\n HlsEvents,\n HlsEventsCallbackMap\n} from 'types/audioEvents.types';\nimport { HlsListeners } from '../types/hls.js.js';\nimport { AUDIO_EVENTS, HLS_EVENTS } from './audioEvents';\n\n/**\n * this attaches event listeners, for audio also sends a flag to calculate playLog\n * loops through the event listeners map and attaches it to the audio element\n */\nconst attachEventListeners = (\n eventListenersCallbackMap: EventListenerCallbackMap,\n playLogEnabled: boolean = false\n) => {\n const audioInstance = AudioX.getAudioInstance();\n isValidArray(Object.keys(eventListenersCallbackMap)) &&\n Object.keys(eventListenersCallbackMap).forEach((evt) => {\n let event = evt as keyof AudioEvents;\n audioInstance?.addEventListener(AUDIO_EVENTS[event], (e: Event) => {\n if (evt && eventListenersCallbackMap[event]) {\n const listenerCallback = eventListenersCallbackMap[event];\n if (typeof listenerCallback === 'function') {\n listenerCallback(e, audioInstance, playLogEnabled);\n }\n }\n });\n });\n};\n\nconst attachCustomEventListeners = (\n eventListenersList: EventListenersList,\n enablePlayLog: boolean = false\n) => {\n const audioInstance = AudioX.getAudioInstance();\n if (isValidArray(eventListenersList)) {\n eventListenersList.forEach((evt) => {\n let event = evt as keyof AudioEvents;\n if (Object.keys(AUDIO_EVENTS).includes(event)) {\n audioInstance?.addEventListener(AUDIO_EVENTS[event], (e: Event) => {\n ChangeNotifier.notify(AUDIO_EVENTS[event], {\n e,\n audioInstance,\n enablePlayLog\n });\n });\n }\n });\n }\n};\n\nconst attachHlsEventsListeners = (\n hlsEventlistenerCallbackMap: HlsEventsCallbackMap,\n playLogEnabled: boolean = false\n) => {\n const hls = new HlsAdapter();\n const hlsInstance = hls.getHlsInstance();\n isValidArray(Object.keys(hlsEventlistenerCallbackMap)) &&\n Object.keys(hlsEventlistenerCallbackMap).forEach((evt) => {\n let event = evt as keyof HlsEvents;\n hlsInstance.on(\n HLS_EVENTS[event] as keyof HlsListeners,\n (e: any, data: any) => {\n if (event && hlsEventlistenerCallbackMap[event]) {\n const listenerCallback = hlsEventlistenerCallbackMap[event];\n if (typeof listenerCallback === 'function') {\n listenerCallback(e, data, hlsInstance, playLogEnabled);\n }\n }\n }\n );\n });\n};\n\nexport {\n attachCustomEventListeners,\n attachEventListeners,\n attachHlsEventsListeners\n};\n","declare global {\n interface Window {\n Hls: any;\n }\n}\n\nimport { AudioX } from 'audio';\nimport { URLS } from 'constants/common';\nimport { HLS_EVENTS_CALLBACK_MAP } from 'events/hlsEvents';\nimport { attachHlsEventsListeners } from 'events/listeners';\nimport { loadScript } from 'helpers/common';\nimport { MediaTrack } from 'types';\nimport type Hls from 'types/hls.js.js';\nimport type { HlsConfig } from 'types/hls.js.js';\n\nlet hlsInstance: Hls;\n\nclass HlsAdapter {\n private static _instance: HlsAdapter;\n private HlsClass: typeof Hls;\n\n constructor() {\n if (HlsAdapter._instance) {\n console.warn(\n 'Instantiation failed: cannot create multiple instance of HLS returning existing instance'\n );\n return HlsAdapter._instance;\n }\n HlsAdapter._instance = this;\n }\n\n async load() {\n await loadScript(\n URLS.HLS,\n () => {\n console.log('HLS Loaded');\n },\n 'hls'\n )\n .then(() => {\n this.HlsClass = window.Hls;\n window.Hls = undefined;\n })\n .catch((msg: string) => {\n console.log(msg);\n });\n\n return this.HlsClass;\n }\n\n async init(config: HlsConfig | {} = {}, enablePlayLog: boolean) {\n const Hls = await this.load();\n if (Hls.isSupported()) {\n hlsInstance = new Hls(config);\n attachHlsEventsListeners(HLS_EVENTS_CALLBACK_MAP, enablePlayLog);\n }\n }\n\n addHlsMedia(mediaTrack: MediaTrack) {\n const Hls = this.HlsClass;\n const audioInstance = AudioX.getAudioInstance();\n hlsInstance.loadSource(mediaTrack.source);\n hlsInstance.attachMedia(audioInstance);\n hlsInstance.on(Hls.Events.MEDIA_ATTACHED, function () {\n console.log('hls media attached');\n });\n }\n\n getHlsInstance() {\n return hlsInstance;\n }\n}\n\nexport default HlsAdapter;\n","import { ErrorEvents } from 'types/errorEvents.types';\n\nexport const ERROR_EVENTS: ErrorEvents = Object.freeze({\n 1: 'MEDIA_ERR_ABORTED',\n 3: 'MEDIA_ERR_DECODE',\n 2: 'MEDIA_ERR_NETWORK',\n 4: 'MEDIA_ERR_SRC_NOT_SUPPORTED',\n});\n","import { PLAYBACK_STATE } from 'constants/common';\nimport {\n calculateActualPlayedLength,\n getReadableErrorMessage\n} from 'helpers/common';\nimport ChangeNotifier from 'helpers/notifier';\nimport { AudioState, EventListenerCallbackMap } from 'types';\nimport { ERROR_EVENTS } from './errorEvents';\n\nconst notifier = ChangeNotifier;\n\nconst BASE_EVENT_CALLBACK_MAP: EventListenerCallbackMap = {\n LOAD_START: (e, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.BUFFERING,\n duration: audioInstance?.duration,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_state_${e.type}`\n );\n },\n\n DURATION_CHANGE: (e, audioInstance: HTMLAudioElement) => {\n const audioState = notifier.getLatestState('AUDIO_X_STATE') as AudioState;\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState:\n audioState.playbackState === 'playing'\n ? PLAYBACK_STATE.PLAYING // fix for live streams where duration change is fired even when audio is playing\n : PLAYBACK_STATE.DURATION_CHANGE,\n duration: audioInstance?.duration,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_state_${e.type}`\n );\n },\n\n LOADED_META_DATA: (e: Event, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.BUFFERING,\n duration: audioInstance?.duration,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_state_${e.type}`\n );\n },\n\n LOADED_DATA: (e, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.BUFFERING,\n duration: audioInstance?.duration,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_state_${e.type}`\n );\n },\n\n CAN_PLAY: (e: Event) => {\n console.log('STATUS', e.type);\n\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.READY,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n CAN_PLAY_THROUGH: (e: Event) => {\n const audioState = notifier.getLatestState('AUDIO_X_STATE') as AudioState;\n console.log('STATUS', e.type);\n\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState:\n audioState.playbackState === 'playing'\n ? PLAYBACK_STATE.PLAYING // fix for live streams as canplaythrough event is can be behave weirdly as there is no known end to the media\n : PLAYBACK_STATE.READY,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n PLAY: (e: Event, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.PLAYING,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n PLAYING: (e, audioInstance) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.PLAYING,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n PAUSE: (e: Event, audioInstance: HTMLAudioElement, playLogEnabled) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.PAUSED,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n if (playLogEnabled) {\n calculateActualPlayedLength(audioInstance, 'PAUSE');\n }\n },\n\n ENDED: (e: Event, audioInstance: HTMLAudioElement, playLogEnabled) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.ENDED,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n if (playLogEnabled) {\n calculateActualPlayedLength(audioInstance, 'ENDED');\n }\n },\n\n ERROR: (e: Event, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n const errorCode = audioInstance.error?.code as keyof typeof ERROR_EVENTS;\n const message = getReadableErrorMessage(audioInstance);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.ERROR,\n error: {\n code: errorCode,\n message: ERROR_EVENTS[errorCode],\n readable: message\n }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n TIME_UPDATE: (e: Event, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n const audioState = notifier.getLatestState('AUDIO_X_STATE') as AudioState;\n\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: audioInstance.paused\n ? audioState?.playbackState\n : PLAYBACK_STATE.PLAYING,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n WAITING: (e: Event, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.BUFFERING,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n VOLUME_CHANGE: (e: Event) => {\n console.log('STATUS', e.type);\n notifier.notify('AUDIO_STATE', {}, `audiox_baseEvents_state`);\n }\n};\n\nexport { BASE_EVENT_CALLBACK_MAP };\n","import { AudioX } from 'audio';\nimport { metaDataCreator } from 'helpers/common';\nimport ChangeNotifier from 'helpers/notifier';\nimport { AudioState } from 'types';\n\nexport const updateMetaData = (data: any) => {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.metadata = new MediaMetadata(metaDataCreator(data));\n }\n};\n\nexport const attachMediaSessionHandlers = () => {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.setActionHandler('play', () => {\n const audioInstance = AudioX.getAudioInstance();\n\n audioInstance.play();\n });\n navigator.mediaSession.setActionHandler('pause', () => {\n const audioInstance = AudioX.getAudioInstance();\n audioInstance.pause();\n });\n }\n};\n\nexport const updatePositionState = () => {\n ChangeNotifier.listen('AUDIO_X_STATE', (data: AudioState) => {\n if (data?.duration && data?.playbackRate && data?.progress) {\n navigator.mediaSession.setPositionState({\n duration: data.duration,\n playbackRate: data.playbackRate,\n position: data.progress\n });\n }\n });\n};\n","import { PLAYBACK_STATE } from 'constants/common';\nimport ChangeNotifier from 'helpers/notifier';\nimport { ReadyState } from 'types';\nimport { AudioState, MediaTrack } from 'types/audio.types';\n\nexport const READY_STATE: ReadyState = {\n HAVE_NOTHING: 0,\n HAVE_METADATA: 1,\n HAVE_CURRENT_DATA: 2,\n HAVE_FUTURE_DATA: 3,\n HAVE_ENOUGH_DATA: 4\n};\n\nexport const AUDIO_STATE: AudioState = {\n playbackState: PLAYBACK_STATE.IDLE,\n duration: 0,\n bufferedDuration: 0,\n progress: 0,\n volume: 50,\n playbackRate: 1,\n error: {\n code: null,\n message: '',\n readable: ''\n },\n currentTrack: {} as MediaTrack,\n currentTrackPlayTime: 0,\n previousTrackPlayTime: 0\n};\n\n/* Listen to state changes and update global audio state that is being exposed to outer world\n Do not subscribe to this event, this may cause unexpected behavior instead attach your own custom\n event listener, if you wish to have granular control on audio state. See: attachCustomEventListener \n*/\nChangeNotifier.listen(\n 'AUDIO_STATE',\n (data: AudioState) => {\n ChangeNotifier.notify('AUDIO_X_STATE', { ...AUDIO_STATE, ...data });\n },\n AUDIO_STATE\n);\n","import { Equalizer } from 'adapters/equalizer';\nimport HlsAdapter from 'adapters/hls';\nimport { AUDIO_X_CONSTANTS, PLAYBACK_STATE } from 'constants/common';\nimport { BASE_EVENT_CALLBACK_MAP } from 'events/baseEvents';\nimport { attachEventListeners } from 'events/listeners';\nimport {\n calculateActualPlayedLength,\n handleQueuePlayback,\n isValidArray,\n isValidFunction,\n shuffle\n} from 'helpers/common';\nimport ChangeNotifier from 'helpers/notifier';\n\nimport {\n attachMediaSessionHandlers,\n updateMetaData\n} from 'mediasession/mediasessionHandler';\nimport { READY_STATE } from 'states/audioState';\nimport {\n AudioInit,\n MediaTrack,\n PlaybackRate,\n QueuePlaybackType\n} from 'types/audio.types';\nimport { EqualizerStatus, Preset } from 'types/equalizer.types';\n\nlet audioInstance: HTMLAudioElement;\nconst notifier = ChangeNotifier;\n\nclass AudioX {\n private _audio: HTMLAudioElement;\n private isPlayLogEnabled: Boolean;\n private static _instance: AudioX;\n private _queue: MediaTrack[];\n private _currentQueueIndex: number = 0;\n private _fetchFn: (mediaTrack: MediaTrack) => Promise;\n private eqStatus: EqualizerStatus = 'IDEAL';\n private isEqEnabled: boolean = false;\n private eqInstance: Equalizer;\n\n constructor() {\n if (AudioX._instance) {\n console.warn(\n 'Instantiation failed: cannot create multiple instance of AudioX returning existing instance'\n );\n return AudioX._instance;\n }\n if (\n process.env.NODE_ENV !== AUDIO_X_CONSTANTS?.DEVELOPMENT &&\n audioInstance\n ) {\n throw new Error('Cannot create multiple audio instance');\n }\n\n AudioX._instance = this;\n this._audio = new Audio();\n audioInstance = this._audio;\n }\n\n /**\n *\n * @param initProps initial config to initialize AudioX\n * @param initProps.mediaTrack mediaTrack Object containing metadata and source of the media\n * @param initProps.mediaTrack.title title of the Audio\n * @param initProps.mediaTrack.source URI of the Audio\n * @param initProps.mediaTrack.artwork artwork of the Audio\n * @param initProps.mediaTrack.duration duration of the audio\n * @param initProps.mediaTrack.genre genre of the audio\n * @param initProps.mediaTrack.album album of the audio\n * @param initProps.mediaTrack.comment comment for the audio\n * @param initProps.mediaTrack.year release year of the audio\n * @param initProps.mediaTrack.artist artist of the audio\n * @param mode mode of operation for AudioX\n * @param autoplay flag for autoplay\n * @param preloadStrategy strategy for preloading audio\n * @param playbackRate default playbackRate of the audio\n * @param attachAudioEventListeners flag for registering audio events\n * @param attachMediaSessionHandlers flag for registering mediaSession handlers\n */\n\n async init(initProps: AudioInit) {\n const {\n preloadStrategy = 'auto',\n autoPlay = false,\n useDefaultEventListeners = true,\n customEventListeners = null,\n showNotificationActions = false,\n enablePlayLog = false,\n enableHls = false,\n enableEQ = false,\n crossOrigin = 'anonymous',\n hlsConfig = {}\n } = initProps;\n\n this._audio?.setAttribute('id', 'audio_x_instance');\n this._audio.preload = preloadStrategy;\n this._audio.autoplay = autoPlay;\n this._audio.crossOrigin = crossOrigin;\n this.isPlayLogEnabled = enablePlayLog;\n\n if (customEventListeners !== null) {\n if (useDefaultEventListeners) {\n console.warn(\n `useDefaultEventListeners is set to true at init, are you trying to use the default event listeners?\n set customEventListeners to null to use default event listeners`\n );\n }\n attachEventListeners(customEventListeners, false);\n } else {\n attachEventListeners(BASE_EVENT_CALLBACK_MAP, enablePlayLog);\n }\n\n if (showNotificationActions) {\n attachMediaSessionHandlers();\n }\n\n if (enableEQ) {\n this.isEqEnabled = enableEQ;\n }\n\n if (enableHls) {\n const hls = new HlsAdapter();\n hls.init(hlsConfig, enablePlayLog);\n }\n }\n\n async addMedia(mediaTrack: MediaTrack) {\n if (!mediaTrack) {\n return;\n }\n\n const mediaType = mediaTrack.source.includes('.m3u8') ? 'HLS' : 'DEFAULT';\n\n if (this.isPlayLogEnabled) {\n calculateActualPlayedLength(audioInstance, 'TRACK_CHANGE');\n }\n\n if (mediaType === 'HLS') {\n const hls = new HlsAdapter();\n const hlsInstance = hls.getHlsInstance();\n if (hlsInstance) {\n hlsInstance.detachMedia();\n hls.addHlsMedia(mediaTrack);\n } else {\n console.warn(\n 'The source provided seems to be a HLS stream but, hls playback is not enabled. Please have a look at init method of AudioX'\n );\n await this.reset();\n }\n } else {\n audioInstance.src = mediaTrack.source;\n }\n\n notifier.notify('AUDIO_STATE', {\n playbackState: PLAYBACK_STATE.TRACK_CHANGE,\n currentTrackPlayTime: 0,\n currentTrack: mediaTrack\n });\n\n updateMetaData(mediaTrack);\n audioInstance.load();\n }\n\n attachEq() {\n if (this.isEqEnabled && this.eqStatus === 'IDEAL') {\n try {\n const eq = new Equalizer();\n this.eqStatus = eq.status();\n this.eqInstance = eq;\n } catch (e) {\n console.log('failed to enable equalizer');\n }\n }\n }\n\n async play() {\n const isSourceAvailable = audioInstance.src !== '';\n if (\n audioInstance?.paused &&\n audioInstance.HAVE_ENOUGH_DATA === READY_STATE.HAVE_ENOUGH_DATA &&\n isSourceAvailable\n ) {\n await audioInstance\n .play()\n .then(() => {\n console.log('PLAYING');\n })\n .catch(() => {\n console.warn('cancelling current audio playback, track changed');\n });\n }\n }\n\n /**\n *\n * @param mediaTrack MediaTrack to be added and played\n *\n * Note: Use this method when you want to add media and do playback or want continuous playback\n * You can also call addMedia and Play Separately to achieve playback.\n */\n\n async addMediaAndPlay(\n mediaTrack?: MediaTrack | null,\n fetchFn?: (mediaTrack: MediaTrack) => Promise\n // this should be passed when there something needs to be done before the audio starts playing\n ) {\n const currentTrack =\n mediaTrack || (this._queue.length > 0 ? this._queue[0] : undefined);\n if (fetchFn && isValidFunction(fetchFn) && currentTrack) {\n this._fetchFn = fetchFn;\n await fetchFn(currentTrack as MediaTrack);\n }\n if (this._queue && isValidArray(this._queue)) {\n this._currentQueueIndex = this._queue.findIndex(\n (track) => track.id === currentTrack?.id\n );\n }\n try {\n if (currentTrack) {\n this.addMedia(currentTrack).then(() => {\n if (audioInstance.HAVE_ENOUGH_DATA === READY_STATE.HAVE_ENOUGH_DATA) {\n setTimeout(async () => {\n this.attachEq();\n await this.play();\n }, 950);\n }\n });\n } else {\n console.error('Playback Failed, No MediaTrack Provided');\n }\n } catch (error) {\n console.error('Playback Failed');\n }\n }\n\n pause() {\n if (audioInstance && !audioInstance?.paused) {\n audioInstance?.pause();\n }\n }\n\n stop() {\n if (audioInstance && !audioInstance.paused) {\n audioInstance?.pause();\n audioInstance.currentTime = 0;\n }\n }\n\n /**\n * @method reset : This stops the playback and resets all the state of the audio\n */\n async reset() {\n if (audioInstance) {\n this.stop();\n audioInstance.src = '';\n audioInstance.srcObject = null;\n }\n }\n\n /**\n * @param volume : numeric value between 1-100 to be used.\n */\n setVolume(volume: number) {\n const actualVolume = volume / 100;\n if (audioInstance) {\n audioInstance.volume = actualVolume;\n notifier.notify('AUDIO_STATE', {\n volume: volume\n });\n }\n }\n /**\n * @param playbackRate : a number denoting speed at which the playback should happen,\n */\n setPlaybackRate(playbackRate: PlaybackRate) {\n if (audioInstance) {\n audioInstance.playbackRate = playbackRate;\n notifier.notify('AUDIO_STATE', {\n playbackRate\n });\n }\n }\n\n mute() {\n if (audioInstance && !audioInstance.muted) {\n audioInstance.muted = true;\n }\n }\n\n seek(time: number) {\n if (audioInstance) {\n audioInstance.currentTime = time;\n }\n }\n\n async destroy() {\n if (audioInstance) {\n await this.reset();\n audioInstance.removeAttribute('src');\n audioInstance.load();\n }\n }\n\n subscribe(eventName: string, callback: (data: any) => void, state: any = {}) {\n const unsubscribe = notifier.listen(eventName, callback, state);\n return unsubscribe;\n }\n\n addEventListener(\n event: keyof HTMLMediaElementEventMap,\n callback: (data: any) => void\n ) {\n audioInstance.addEventListener(event, callback);\n }\n\n getPresets() {\n return Equalizer.getPresets();\n }\n\n setPreset(id: keyof Preset) {\n this.eqInstance.setPreset(id);\n }\n\n setCustomEQ(gains: number[]) {\n this.eqInstance.setCustomEQ(gains);\n }\n\n addQueue(queue: MediaTrack[], playbackType: QueuePlaybackType) {\n const playerQueue = isValidArray(queue) ? queue.slice() : [];\n switch (playbackType) {\n case 'DEFAULT':\n this._queue = playerQueue;\n break;\n case 'REVERSE':\n this._queue = playerQueue.reverse();\n break;\n case 'SHUFFLE':\n this._queue = shuffle(playerQueue);\n break;\n default:\n this._queue = playerQueue;\n break;\n }\n handleQueuePlayback();\n }\n\n playNext() {\n if (this._queue.length > this._currentQueueIndex + 1) {\n this._currentQueueIndex++;\n const nextTrack = this._queue[this._currentQueueIndex];\n this.addMediaAndPlay(nextTrack, this._fetchFn);\n } else {\n console.warn('Queue ended');\n }\n }\n\n playPrevious() {\n if (this._currentQueueIndex > 0) {\n this._currentQueueIndex--;\n const previousTrack = this._queue[this._currentQueueIndex];\n this.addMediaAndPlay(previousTrack, this._fetchFn);\n } else {\n console.log('At the beginning of the queue');\n }\n }\n\n clearQueue() {\n if (this._queue && isValidArray(this._queue)) {\n this._queue = [];\n }\n }\n\n removeFromQueue(mediaTrack: MediaTrack) {\n if (this._queue && isValidArray(this._queue)) {\n const queue = this._queue.filter(\n (track: MediaTrack) => track.id == mediaTrack.id\n );\n this._queue = queue;\n }\n }\n\n getQueue() {\n if (this._queue && this._queue.length) {\n return this._queue;\n }\n }\n\n get id() {\n return audioInstance?.getAttribute('id');\n }\n\n static getAudioInstance() {\n return audioInstance;\n }\n}\n\nexport { AudioX };\n"]} \ No newline at end of file +{"version":3,"sources":["../src/constants/equalizer.ts","../src/constants/common.ts","../src/helpers/notifier.ts","../src/helpers/common.ts","../src/adapters/equalizer.ts","../src/events/hlsEvents.ts","../src/events/audioEvents.ts","../src/events/listeners.ts","../src/adapters/hls.ts","../src/mediasession/mediasessionHandler.ts","../src/events/errorEvents.ts","../src/events/baseEvents.ts","../src/states/audioState.ts","../src/audio.ts"],"names":["bands","frequency","type","gain","presets","id","name","gains","AUDIO_X_CONSTANTS","Object","freeze","REACT","VANILLA","DEVELOPMENT","PLAYBACK_STATE","BUFFERING","PLAYING","PAUSED","READY","IDLE","ENDED","STALLED","ERROR","TRACK_CHANGE","DURATION_CHANGE","ERROR_MSG_MAP","MEDIA_ERR_ABORTED","MEDIA_ERR_DECODE","MEDIA_ERR_NETWORK","MEDIA_ERR_SRC_NOT_SUPPORTED","DEFAULT","URLS","HLS","_a","ChangeNotifier","validateEventName","eventName","Error","notify","data","caller","listenerCbs","listeners","notifierState","forEach","cb","listen","callback","state","add","Set","eventListeners","delete","size","multiListen","callbacks","Array","isArray","length","unsubscribeFunctions","map","unsubscribe","getLatestState","__publicField","notifier_default","isValidArray","__name","arr","isValidFunction","fn","Function","isValidWindow","window","undefined","Window","loadedScripts","getReadableErrorMessage","audioInstance","message","error","code","MediaError","metaDataCreator","mediaTrack","title","album","artist","artwork","artworkUrl","src","artworkMap","el","sizes","previousTrackPlayTime","calculateActualPlayedLength","event","lengthSet","i","played","startX","start","width","end","currentTrackPlayTime","reduce","acc","val","includes","loadScript","url","onLoad","Promise","resolve","reject","document","script","createElement","async","onload","head","appendChild","handleQueuePlayback","audio","AudioX","queue","getQueue","hasEnded","audioStateListener","playbackState","playNext","shuffle","array","shuffledArray","j","Math","floor","random","Equalizer","constructor","audioCtx","audioCtxStatus","eqFilterBands","_instance","AudioContext","init","webkitAudioContext","resume","setTimeout","body","removeEventListener","addEventListener","getAudioInstance","audioSource","createMediaElementSource","equalizerBands","band","filter","createBiquadFilter","value","Q","gainNode","createGain","connect","destination","setPreset","preset","find","getPresets","status","setCustomEQ","index","HLS_EVENTS_CALLBACK_MAP","e","detail","details","isFatal","fatal","FRAG_CHANGED","AUDIO_EVENTS","ABORT","TIME_UPDATE","CAN_PLAY","CAN_PLAY_THROUGH","EMPTIED","WAITING","SEEKING","SEEKED","LOADED_META_DATA","LOADED_DATA","PLAY","PAUSE","RATE_CHANGE","VOLUME_CHANGE","SUSPEND","PROGRESS","LOAD_START","HLS_EVENTS","MEDIA_ATTACHING","MEDIA_ATTACHED","MEDIA_DETACHING","MEDIA_DETACHED","BUFFER_RESET","BUFFER_CODECS","BUFFER_CREATED","BUFFER_APPENDING","BUFFER_APPENDED","BUFFER_EOS","BUFFER_FLUSHING","BUFFER_FLUSHED","MANIFEST_LOADING","MANIFEST_LOADED","MANIFEST_PARSED","LEVEL_SWITCHING","LEVEL_SWITCHED","LEVEL_LOADING","LEVEL_LOADED","LEVEL_UPDATED","LEVEL_PTS_UPDATED","LEVELS_UPDATED","AUDIO_TRACKS_UPDATED","AUDIO_TRACK_SWITCHING","AUDIO_TRACK_SWITCHED","AUDIO_TRACK_LOADING","AUDIO_TRACK_LOADED","SUBTITLE_TRACKS_UPDATED","SUBTITLE_TRACKS_CLEARED","SUBTITLE_TRACK_SWITCH","SUBTITLE_TRACK_LOADING","SUBTITLE_TRACK_LOADED","SUBTITLE_FRAG_PROCESSED","CUES_PARSED","NON_NATIVE_TEXT_TRACKS_FOUND","INIT_PTS_FOUND","FRAG_LOADING","FRAG_LOAD_EMERGENCY_ABORTED","FRAG_LOADED","FRAG_DECRYPTED","FRAG_PARSING_INIT_SEGMENT","FRAG_PARSING_USERDATA","FRAG_PARSING_METADATA","FRAG_PARSED","FRAG_BUFFERED","FPS_DROP","FPS_DROP_LEVEL_CAPPING","DESTROYING","KEY_LOADING","KEY_LOADED","LIVE_BACK_BUFFER_REACHED","BACK_BUFFER_REACHED","CUSTOM_AUDIO_EVENTS","AUDIO_X_STATE","attachEventListeners","eventListenersCallbackMap","playLogEnabled","keys","evt","listenerCallback","attachHlsEventsListeners","hlsEventlistenerCallbackMap","hlsInstance","HlsAdapter","getHlsInstance","on","HlsClass","load","then","Hls","catch","msg","config","enablePlayLog","isSupported","addHlsMedia","loadSource","source","attachMedia","Events","hls_default","updateMetaData","navigator","mediaSession","metadata","MediaMetadata","attachMediaSessionHandlers","setActionHandler","play","pause","updatePositionState","audioState","currentTime","duration","setPositionState","playbackRate","position","resetPositionState","ERROR_EVENTS","notifier","BASE_EVENT_CALLBACK_MAP","readable","progress","errorCode","paused","READY_STATE","HAVE_NOTHING","HAVE_METADATA","HAVE_CURRENT_DATA","HAVE_FUTURE_DATA","HAVE_ENOUGH_DATA","AUDIO_STATE","bufferedDuration","volume","currentTrack","_audio","isPlayLogEnabled","_queue","_currentQueueIndex","_fetchFn","eqStatus","isEqEnabled","eqInstance","process","env","NODE_ENV","Audio","initProps","preloadStrategy","autoPlay","useDefaultEventListeners","customEventListeners","showNotificationActions","enableHls","enableEQ","crossOrigin","hlsConfig","setAttribute","preload","autoplay","addMedia","mediaType","hls","detachMedia","reset","attachEq","eq","isSourceAvailable","addMediaAndPlay","fetchFn","findIndex","track","stop","srcObject","setVolume","actualVolume","setPlaybackRate","mute","muted","seek","time","destroy","removeAttribute","subscribe","addQueue","playbackType","playerQueue","slice","reverse","nextTrack","playPrevious","previousTrack","clearQueue","removeFromQueue","getAttribute"],"mappings":"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","sourcesContent":["import { Band, Preset } from 'types/equalizer.types';\n\nconst bands: Band[] = [\n { frequency: 31, type: 'lowshelf', gain: 0 }, // Band 0: 31 Hz - Low Shelf Filter\n { frequency: 63, type: 'peaking', gain: 0 }, // Band 1: 63 Hz - Peaking Filter\n { frequency: 125, type: 'peaking', gain: 0 }, // Band 2: 125 Hz - Peaking Filter\n { frequency: 250, type: 'peaking', gain: 0 }, // Band 3: 250 Hz - Peaking Filter\n { frequency: 500, type: 'peaking', gain: 0 }, // Band 4: 500 Hz - Peaking Filter\n { frequency: 1000, type: 'peaking', gain: 0 }, // Band 5: 1 kHz - Peaking Filter\n { frequency: 2000, type: 'peaking', gain: 0 }, // Band 6: 2 kHz - Peaking Filter\n { frequency: 4000, type: 'peaking', gain: 0 }, // Band 7: 4 kHz - Peaking Filter\n { frequency: 8000, type: 'peaking', gain: 0 }, // Band 8: 8 kHz - Peaking Filter\n { frequency: 16000, type: 'highshelf', gain: 0 } // Band 9: 16 kHz - High Shelf Filter\n];\n\nconst presets: Preset[] = [\n {\n id: 'preset_default',\n name: 'Default',\n gains: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n },\n {\n id: 'preset_live',\n name: 'Live',\n gains: [-1.0, 1.0, 3.0, 4.0, 4.0, 4.0, 3.0, 2.0, 2.0, 2.0]\n },\n {\n id: 'preset_acoustic',\n name: 'Acoustic',\n gains: [6.0, 6.0, 4.0, 1.0, 3.0, 3.0, 4.0, 5.0, 4.0, 1.5]\n },\n {\n id: 'preset_classical',\n name: 'Classical',\n gains: [6.0, 5.0, 4.0, 3.0, -1.0, -1.0, 0.0, 2.0, 4.0, 5.0]\n },\n {\n id: 'preset_piano',\n name: 'Piano',\n gains: [4.0, 2.0, 0.0, 3.5, 4.0, 1.5, 5.0, 6.0, 4.0, 4.5]\n },\n {\n id: 'preset_lounge',\n name: 'Lounge',\n gains: [-3.0, -1.5, 0.0, 1.0, 5.5, 1.0, 0.0, -1.5, 2.0, 0.5]\n },\n {\n id: 'preset_spoken_word',\n name: 'Spoken Word',\n gains: [-2.0, 0.0, 0.0, 1.0, 5.0, 6.5, 7.0, 6.0, 3.0, 0.0]\n },\n {\n id: 'preset_jazz',\n name: 'Jazz',\n gains: [5.5, 4.0, 1.0, 2.0, -1.5, -1.5, 0.0, 1.0, 4.0, 5.5]\n },\n {\n id: 'preset_pop',\n name: 'Pop',\n gains: [0.5, 2.4, 3.8, 4.3, 3.0, 0.0, -0.5, -0.5, 0.5, 0.5]\n },\n {\n id: 'preset_dance',\n name: 'Dance',\n gains: [5.0, 10.0, 6.5, 0.0, 2.0, 4.5, 7.5, 7.0, 5.5, 0.0]\n },\n {\n id: 'preset_latin',\n name: 'Latin',\n gains: [3.5, 1.5, 0.0, 0.0, -1.5, -1.5, -1.5, 0.0, 4.0, 6.5]\n },\n {\n id: 'preset_rnb',\n name: 'RnB',\n gains: [3.5, 10.5, 8.5, 1.0, -3.0, -1.5, 3.0, 3.5, 4.0, 5.0]\n },\n {\n id: 'preset_hiphop',\n name: 'HipHop',\n gains: [7.0, 6.0, 1.0, 4.0, -1.0, -0.5, 1.0, -0.5, 2.0, 4.0]\n },\n {\n id: 'preset_electronic',\n name: 'Electronic',\n gains: [6.0, 5.5, 1.0, 0.0, -2.0, 2.0, 1.0, 1.5, 5.5, 6.5]\n },\n {\n id: 'preset_techno',\n name: 'Techno',\n gains: [3.8, 2.4, 0.0, -2.4, -1.9, 0.0, 3.8, 4.8, 4.8, 4.3]\n },\n {\n id: 'preset_deep',\n name: 'Deep',\n gains: [6.0, 5.0, 1.5, 0.5, 4.0, 3.0, 1.5, -2.0, -5.0, -6.5]\n },\n {\n id: 'preset_club',\n name: 'Club',\n gains: [0.0, 0.0, 3.8, 2.4, 2.4, 2.4, 1.0, 0.0, 0.0, 0.0]\n },\n {\n id: 'preset_rock',\n name: 'Rock',\n gains: [7.0, 5.5, 4.0, 1.0, -0.5, 0.0, 0.5, 3.0, 4.5, 6.5]\n },\n {\n id: 'preset_rock_soft',\n name: 'Rock Soft',\n gains: [1.5, 0.0, 0.0, -0.5, 0.0, 1.0, 3.8, 4.8, 5.7, 6.2]\n },\n {\n id: 'preset_ska',\n name: 'Ska',\n gains: [-0.5, -1.5, -1.0, 0.0, 1.0, 2.0, 3.8, 4.3, 5.2, 4.3]\n },\n {\n id: 'preset_reggae',\n name: 'Reggae',\n gains: [0.0, 0.0, 0.0, -2.4, 0.0, 2.5, 2.5, 0.0, 0.0, 0.0]\n },\n {\n id: 'preset_country',\n name: 'Country',\n gains: [3.0, 2.0, 1.0, 0.0, -1.0, 0.0, 2.0, 3.0, 4.0, 4.0]\n },\n {\n id: 'preset_funk',\n name: 'Funk',\n gains: [4.0, 5.0, 3.0, 0.0, -1.0, 0.0, 2.0, 4.0, 5.0, 5.0]\n },\n {\n id: 'preset_blues',\n name: 'Blues',\n gains: [2.0, 1.0, 0.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 3.0]\n },\n {\n id: 'preset_metal',\n name: 'Metal',\n gains: [8.0, 7.0, 6.0, 4.0, 2.0, 1.0, 0.0, 2.0, 4.0, 6.0]\n },\n {\n id: 'preset_indie',\n name: 'Indie',\n gains: [2.0, 3.0, 2.0, 1.0, 0.0, -1.0, -2.0, 0.0, 3.0, 4.0]\n },\n {\n id: 'preset_chill',\n name: 'Chill',\n gains: [1.0, 1.0, 0.0, -1.0, -2.0, -1.0, 1.0, 2.0, 3.0, 2.0]\n },\n {\n id: 'preset_world',\n name: 'World',\n gains: [3.0, 2.0, 0.0, -2.0, -1.0, 1.0, 3.0, 4.0, 5.0, 3.0]\n },\n {\n id: 'preset_alternative',\n name: 'Alternative',\n gains: [3.0, 2.0, 1.0, 0.0, -1.0, -2.0, 1.0, 3.0, 4.0, 3.0]\n },\n {\n id: 'preset_ambient',\n name: 'Ambient',\n gains: [0.0, -1.0, -2.0, -3.0, -2.0, 0.0, 1.0, 2.0, 3.0, 2.0]\n },\n {\n id: 'preset_mellow',\n name: 'Mellow',\n gains: [1.0, 1.0, 0.0, -1.0, -2.0, -1.0, 1.0, 2.0, 3.0, 1.0]\n },\n {\n id: 'preset_grunge',\n name: 'Grunge',\n gains: [5.0, 4.0, 3.0, 2.0, 1.0, 0.0, 0.0, 2.0, 4.0, 5.0]\n },\n {\n id: 'preset_soul',\n name: 'Soul',\n gains: [3.0, 3.0, 2.0, 1.0, 0.0, -1.0, 0.0, 2.0, 3.0, 3.0]\n },\n {\n id: 'preset_folk',\n name: 'Folk',\n gains: [2.0, 1.0, 0.0, -1.0, -2.0, -1.0, 1.0, 2.0, 3.0, 2.0]\n },\n {\n id: 'preset_trap',\n name: 'Trap',\n gains: [7.0, 6.0, 3.0, 1.0, -2.0, -1.0, 1.0, 3.0, 6.0, 7.0]\n },\n {\n id: 'preset_dubstep',\n name: 'Dubstep',\n gains: [6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 1.0, 3.0, 5.0, 6.0]\n }\n];\n\nexport { bands, presets };\n","import { InitMode } from 'types';\nimport { ErrorMessageMap } from 'types/errorEvents.types';\n\nconst AUDIO_X_CONSTANTS = Object.freeze({\n REACT: 'REACT' as InitMode,\n VANILLA: 'VANILLA' as InitMode,\n DEVELOPMENT: 'development'\n});\n\nconst PLAYBACK_STATE = Object.freeze({\n BUFFERING: 'buffering',\n PLAYING: 'playing',\n PAUSED: 'paused',\n READY: 'ready',\n IDLE: 'idle',\n ENDED: 'ended',\n STALLED: 'stalled',\n ERROR: 'error',\n TRACK_CHANGE: 'trackchanged',\n DURATION_CHANGE: 'durationchanged'\n});\n\nconst ERROR_MSG_MAP: ErrorMessageMap = Object.freeze({\n MEDIA_ERR_ABORTED: 'The user canceled the audio.',\n MEDIA_ERR_DECODE: 'An error occurred while decoding the audio.',\n MEDIA_ERR_NETWORK: 'A network error occurred while fetching the audio.',\n MEDIA_ERR_SRC_NOT_SUPPORTED:\n 'The audio is missing or is in a format not supported by your browser.',\n DEFAULT: 'An unknown error occurred.'\n});\n\nconst URLS = {\n HLS: 'https://cdn.jsdelivr.net/npm/hls.js/dist/hls.min.js'\n};\n\nexport { AUDIO_X_CONSTANTS, ERROR_MSG_MAP, PLAYBACK_STATE, URLS };\n","type ListenerCallback = (data: T) => void;\n\nclass ChangeNotifier {\n private static listeners: Record>> = {};\n private static notifierState: Record = {};\n\n private static validateEventName(eventName: string): void {\n if (!eventName || typeof eventName !== 'string') {\n throw new Error('Invalid event name');\n }\n }\n\n static notify(\n eventName: string,\n data: T,\n caller: string = 'audiox_notifier_default'\n ): void {\n this.validateEventName(eventName);\n\n const listenerCbs = ChangeNotifier.listeners[eventName];\n\n if (!listenerCbs) return;\n\n if (data !== null) {\n console.log(`NOTIFYING TO EVENT : ${eventName} - CALLER : ${caller}`);\n\n ChangeNotifier.notifierState[eventName] = {\n ...(ChangeNotifier.notifierState[eventName] || {}),\n ...data\n };\n\n listenerCbs.forEach((cb: ListenerCallback) => {\n cb(ChangeNotifier.notifierState[eventName]);\n });\n }\n }\n\n static listen(\n eventName: string,\n callback: ListenerCallback,\n state = {}\n ): () => void {\n this.validateEventName(eventName);\n\n if (typeof callback !== 'function') {\n throw new Error('Callback must be a function');\n }\n\n if (!ChangeNotifier.listeners[eventName]) {\n ChangeNotifier.notifierState[eventName] = state;\n ChangeNotifier.listeners[eventName] = new Set([callback]);\n } else {\n ChangeNotifier.listeners[eventName].add(callback);\n }\n\n return (): void => {\n const eventListeners = ChangeNotifier.listeners[eventName];\n\n if (!eventListeners) {\n console.log(`EVENT NOT FOUND : ${eventName}`);\n return;\n }\n\n console.log(`REMOVING EVENT LISTENER FOR EVENT : ${eventName}`);\n\n eventListeners.delete(callback);\n\n if (eventListeners.size === 0) {\n delete ChangeNotifier.listeners[eventName];\n }\n };\n }\n\n static multiListen(\n eventName: string,\n callbacks: ListenerCallback[],\n state = {}\n ): () => void {\n this.validateEventName(eventName);\n\n if (!Array.isArray(callbacks) || callbacks.length === 0) {\n throw new Error('Callbacks must be a non-empty array of functions');\n }\n\n const unsubscribeFunctions = callbacks.map((callback) =>\n ChangeNotifier.listen(eventName, callback, state)\n );\n\n return (): void => {\n unsubscribeFunctions.forEach((unsubscribe) => unsubscribe());\n };\n }\n\n // Retrieve the latest state data for a specific event\n static getLatestState(eventName: string): T | undefined {\n this.validateEventName(eventName);\n\n return ChangeNotifier.notifierState[eventName];\n }\n}\n\nexport default ChangeNotifier;\n","import { AudioX } from 'audio';\nimport { ERROR_MSG_MAP } from 'constants/common';\nimport { AudioEvents, AudioState, MediaTrack } from 'types';\nimport ChangeNotifier from './notifier';\n\nconst isValidArray = (arr: any[]) => arr && Array.isArray(arr) && arr.length;\nconst isValidFunction = (fn: any) =>\n fn instanceof Function && typeof fn === 'function';\n\nconst isValidObject = (obj: any) =>\n typeof obj === 'object' &&\n obj !== null &&\n obj instanceof Object &&\n Object.keys(obj).length;\n\nconst isValidWindow = typeof window !== undefined && window instanceof Window;\nconst loadedScripts: any = {};\n\nconst getReadableErrorMessage = (audioInstance: HTMLAudioElement) => {\n let message = '';\n const err = audioInstance.error;\n\n switch (err?.code) {\n case MediaError.MEDIA_ERR_ABORTED:\n message += ERROR_MSG_MAP['MEDIA_ERR_ABORTED'];\n break;\n case MediaError.MEDIA_ERR_NETWORK:\n message += ERROR_MSG_MAP['MEDIA_ERR_NETWORK'];\n break;\n case MediaError.MEDIA_ERR_DECODE:\n message += ERROR_MSG_MAP['MEDIA_ERR_DECODE'];\n break;\n case MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED:\n message += ERROR_MSG_MAP['MEDIA_ERR_SRC_NOT_SUPPORTED'];\n break;\n default:\n message += ERROR_MSG_MAP['DEFAULT'];\n break;\n }\n\n return message;\n};\n\nconst metaDataCreator = (mediaTrack: MediaTrack) => {\n const { title, album, artist, artwork } = mediaTrack;\n const artworkUrl = artwork ? artwork[0]?.src : '';\n const sizes = [\n '96x96',\n '128x128',\n '192x192',\n '256x256',\n '384x384',\n '512x512'\n ];\n const artworkMap = sizes.map((el) => {\n return { src: artworkUrl, sizes: el, type: 'image/png' };\n });\n const metaData = {\n title,\n album,\n artist,\n artwork: artworkMap\n };\n return metaData;\n};\n\nlet previousTrackPlayTime = 0;\nexport const calculateActualPlayedLength = (\n audioInstance: HTMLAudioElement,\n event?: keyof AudioEvents\n) => {\n const lengthSet = new Set();\n for (let i = 0; i < audioInstance.played.length; i++) {\n const startX = audioInstance.played.start(i);\n const endX = audioInstance.played.end(i);\n const width = endX - startX;\n lengthSet.add(width);\n }\n const lengthArr = [...lengthSet] as number[];\n const currentTrackPlayTime = lengthArr.reduce((acc, val) => acc + val, 0);\n\n previousTrackPlayTime = ['ENDED', 'TRACK_CHANGE', 'PAUSE'].includes(\n event as keyof AudioEvents\n )\n ? currentTrackPlayTime\n : previousTrackPlayTime;\n ChangeNotifier.notify('AUDIO_STATE', {\n currentTrackPlayTime,\n previousTrackPlayTime\n });\n};\n\nconst loadScript = (\n url: string,\n onLoad: () => void,\n name: string\n): Promise => {\n return new Promise((resolve, reject) => {\n if (window instanceof Window && window.document) {\n if (!loadedScripts[name]) {\n loadedScripts[name] = true;\n const script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = url;\n script.async = true;\n script.onload = () => {\n onLoad();\n resolve();\n };\n document.head.appendChild(script);\n } else {\n onLoad();\n resolve();\n }\n } else {\n reject(`Window not ready unable to initialize ${name}`);\n }\n });\n};\n\nconst handleQueuePlayback = () => {\n const audio = new AudioX();\n const queue = audio.getQueue();\n let hasEnded = false;\n\n const audioStateListener = (state: AudioState) => {\n if (state.playbackState === 'ended' && !hasEnded) {\n hasEnded = true;\n if (queue && isValidArray(queue)) {\n audio.playNext();\n }\n }\n if (state.playbackState !== 'ended') {\n hasEnded = false;\n }\n };\n\n ChangeNotifier.listen('AUDIO_STATE', audioStateListener);\n};\n\nconst shuffle = (array: T[]): T[] => {\n const shuffledArray = [...array];\n\n for (let i = shuffledArray.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * i);\n\n [shuffledArray[i], shuffledArray[j]] = [shuffledArray[j], shuffledArray[i]];\n }\n\n return shuffledArray;\n};\n\nexport {\n getReadableErrorMessage,\n handleQueuePlayback,\n isValidArray,\n isValidFunction,\n isValidObject,\n isValidWindow,\n loadScript,\n metaDataCreator,\n shuffle\n};\n","import { AudioX } from 'audio';\nimport { bands, presets } from 'constants/equalizer';\nimport { isValidArray } from 'helpers/common';\n\nimport { EqualizerStatus, Preset } from 'types/equalizer.types';\n\nclass Equalizer {\n private static _instance: Equalizer;\n private audioCtx: AudioContext;\n private audioCtxStatus: EqualizerStatus;\n private eqFilterBands: BiquadFilterNode[];\n\n constructor() {\n if (Equalizer._instance) {\n console.warn(\n 'Instantiation failed: cannot create multiple instance of Equalizer returning existing instance'\n );\n return Equalizer._instance;\n }\n\n if (this.audioCtx === undefined && typeof AudioContext !== 'undefined') {\n if (typeof AudioContext !== 'undefined') {\n this.audioCtx = new AudioContext();\n this.audioCtxStatus = 'ACTIVE';\n this.init();\n } else if (typeof (window as any).webkitAudioContext !== 'undefined') {\n this.audioCtx = new (window as any).webkitAudioContext();\n this.audioCtxStatus = 'ACTIVE';\n this.init();\n } else {\n throw new Error('Web Audio API is not supported in this browser.');\n }\n } else {\n console.log('Equalizer not initialized, AudioContext failed');\n this.audioCtxStatus = 'FAILED';\n }\n\n // context state at this time is `undefined` in iOS8 Safari\n if (\n this.audioCtxStatus === 'ACTIVE' &&\n this.audioCtx.state === 'suspended'\n ) {\n var resume = () => {\n this.audioCtx.resume();\n setTimeout(() => {\n if (this.audioCtx.state === 'running') {\n document.body.removeEventListener('click', resume, false);\n }\n }, 0);\n };\n\n document.body.addEventListener('click', resume, false);\n }\n\n Equalizer._instance = this;\n }\n\n init() {\n try {\n const audioInstance = AudioX.getAudioInstance();\n const audioSource = this.audioCtx.createMediaElementSource(audioInstance);\n\n const equalizerBands = bands.map((band) => {\n const filter = this.audioCtx.createBiquadFilter();\n filter.type = band.type;\n filter.frequency.value = band.frequency;\n filter.gain.value = band.gain;\n filter.Q.value = 1;\n return filter;\n });\n\n const gainNode = this.audioCtx.createGain();\n gainNode.gain.value = 1; //Normalize sound output\n\n audioSource.connect(equalizerBands[0]);\n\n for (let i = 0; i < equalizerBands.length - 1; i++) {\n equalizerBands[i].connect(equalizerBands[i + 1]);\n }\n\n equalizerBands[equalizerBands.length - 1].connect(gainNode);\n gainNode.connect(this.audioCtx.destination);\n\n this.audioCtxStatus = 'ACTIVE';\n this.eqFilterBands = equalizerBands;\n } catch (error) {\n this.audioCtxStatus = 'FAILED';\n }\n }\n\n setPreset(id: keyof Preset) {\n const preset = presets.find((el) => el.id === id);\n console.log({ preset });\n if (\n !this.eqFilterBands ||\n this.eqFilterBands.length !== preset?.gains.length\n ) {\n console.error('Invalid data provided.');\n return;\n }\n for (let i = 0; i < this.eqFilterBands.length; i++) {\n this.eqFilterBands[i].gain.value = preset?.gains[i];\n }\n }\n\n static getPresets() {\n return presets;\n }\n\n status() {\n if (this.audioCtx.state === 'suspended') {\n this.audioCtx.resume();\n }\n return this.audioCtxStatus;\n }\n\n setCustomEQ(gains: number[]) {\n if (isValidArray(gains)) {\n this.eqFilterBands.forEach((band: BiquadFilterNode, index: number) => {\n band.gain.value = gains[index];\n });\n }\n }\n}\n\nexport { Equalizer };\n","import { PLAYBACK_STATE } from 'constants/common';\nimport ChangeNotifier from 'helpers/notifier';\nimport { HlsEventsCallbackMap } from 'types/audioEvents.types';\n\nexport const HLS_EVENTS_CALLBACK_MAP: HlsEventsCallbackMap = {\n ERROR: (e: Event, data: any) => {\n const type = data.type;\n const detail = data.details;\n const isFatal = data.fatal;\n console.log('STATUS', e.type);\n\n ChangeNotifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.ERROR,\n error: {\n type,\n isFatal,\n detail\n }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n FRAG_CHANGED: () => {\n console.log('FRAG_CHANGED');\n }\n};\n","import { AudioEvents } from 'types';\n\nexport const AUDIO_EVENTS: AudioEvents = Object.freeze({\n ABORT: 'abort',\n TIME_UPDATE: 'timeupdate',\n CAN_PLAY: 'canplay',\n CAN_PLAY_THROUGH: 'canplaythrough',\n DURATION_CHANGE: 'durationchange',\n ENDED: 'ended',\n EMPTIED: 'emptied',\n PLAYING: 'playing',\n WAITING: 'waiting',\n SEEKING: 'seeking',\n SEEKED: 'seeked',\n LOADED_META_DATA: 'loadedmetadata',\n LOADED_DATA: 'loadeddata',\n PLAY: 'play',\n PAUSE: 'pause',\n RATE_CHANGE: 'ratechange',\n VOLUME_CHANGE: 'volumechange',\n SUSPEND: 'suspend',\n STALLED: 'stalled',\n PROGRESS: 'progress',\n LOAD_START: 'loadstart',\n ERROR: 'error',\n TRACK_CHANGE: 'trackchange' // this is a custom event added to support track change\n});\n\nexport const HLS_EVENTS = {\n MEDIA_ATTACHING: 'hlsMediaAttaching',\n MEDIA_ATTACHED: 'hlsMediaAttached',\n MEDIA_DETACHING: 'hlsMediaDetaching',\n MEDIA_DETACHED: 'hlsMediaDetached',\n BUFFER_RESET: 'hlsBufferReset',\n BUFFER_CODECS: 'hlsBufferCodecs',\n BUFFER_CREATED: 'hlsBufferCreated',\n BUFFER_APPENDING: 'hlsBufferAppending',\n BUFFER_APPENDED: 'hlsBufferAppended',\n BUFFER_EOS: 'hlsBufferEos',\n BUFFER_FLUSHING: 'hlsBufferFlushing',\n BUFFER_FLUSHED: 'hlsBufferFlushed',\n MANIFEST_LOADING: 'hlsManifestLoading',\n MANIFEST_LOADED: 'hlsManifestLoaded',\n MANIFEST_PARSED: 'hlsManifestParsed',\n LEVEL_SWITCHING: 'hlsLevelSwitching',\n LEVEL_SWITCHED: 'hlsLevelSwitched',\n LEVEL_LOADING: 'hlsLevelLoading',\n LEVEL_LOADED: 'hlsLevelLoaded',\n LEVEL_UPDATED: 'hlsLevelUpdated',\n LEVEL_PTS_UPDATED: 'hlsLevelPtsUpdated',\n LEVELS_UPDATED: 'hlsLevelsUpdated',\n AUDIO_TRACKS_UPDATED: 'hlsAudioTracksUpdated',\n AUDIO_TRACK_SWITCHING: 'hlsAudioTrackSwitching',\n AUDIO_TRACK_SWITCHED: 'hlsAudioTrackSwitched',\n AUDIO_TRACK_LOADING: 'hlsAudioTrackLoading',\n AUDIO_TRACK_LOADED: 'hlsAudioTrackLoaded',\n SUBTITLE_TRACKS_UPDATED: 'hlsSubtitleTracksUpdated',\n SUBTITLE_TRACKS_CLEARED: 'hlsSubtitleTracksCleared',\n SUBTITLE_TRACK_SWITCH: 'hlsSubtitleTrackSwitch',\n SUBTITLE_TRACK_LOADING: 'hlsSubtitleTrackLoading',\n SUBTITLE_TRACK_LOADED: 'hlsSubtitleTrackLoaded',\n SUBTITLE_FRAG_PROCESSED: 'hlsSubtitleFragProcessed',\n CUES_PARSED: 'hlsCuesParsed',\n NON_NATIVE_TEXT_TRACKS_FOUND: 'hlsNonNativeTextTracksFound',\n INIT_PTS_FOUND: 'hlsInitPtsFound',\n FRAG_LOADING: 'hlsFragLoading',\n FRAG_LOAD_EMERGENCY_ABORTED: 'hlsFragLoadEmergencyAborted',\n FRAG_LOADED: 'hlsFragLoaded',\n FRAG_DECRYPTED: 'hlsFragDecrypted',\n FRAG_PARSING_INIT_SEGMENT: 'hlsFragParsingInitSegment',\n FRAG_PARSING_USERDATA: 'hlsFragParsingUserdata',\n FRAG_PARSING_METADATA: 'hlsFragParsingMetadata',\n FRAG_PARSED: 'hlsFragParsed',\n FRAG_BUFFERED: 'hlsFragBuffered',\n FRAG_CHANGED: 'hlsFragChanged',\n FPS_DROP: 'hlsFpsDrop',\n FPS_DROP_LEVEL_CAPPING: 'hlsFpsDropLevelCapping',\n ERROR: 'hlsError',\n DESTROYING: 'hlsDestroying',\n KEY_LOADING: 'hlsKeyLoading',\n KEY_LOADED: 'hlsKeyLoaded',\n LIVE_BACK_BUFFER_REACHED: 'hlsLiveBackBufferReached',\n BACK_BUFFER_REACHED: 'hlsBackBufferReached'\n};\n\nexport const CUSTOM_AUDIO_EVENTS = Object.freeze({\n AUDIO_X_STATE: 'AUDIO_X_STATE'\n});\n","import HlsAdapter from 'adapters/hls';\nimport { AudioX } from 'audio';\nimport { isValidArray } from 'helpers/common';\nimport ChangeNotifier from 'helpers/notifier';\nimport {\n AudioEvents,\n EventListenerCallbackMap,\n EventListenersList,\n HlsEvents,\n HlsEventsCallbackMap\n} from 'types/audioEvents.types';\nimport { HlsListeners } from '../types/hls.js.js';\nimport { AUDIO_EVENTS, HLS_EVENTS } from './audioEvents';\n\n/**\n * this attaches event listeners, for audio also sends a flag to calculate playLog\n * loops through the event listeners map and attaches it to the audio element\n */\nconst attachEventListeners = (\n eventListenersCallbackMap: EventListenerCallbackMap,\n playLogEnabled: boolean = false\n) => {\n const audioInstance = AudioX.getAudioInstance();\n isValidArray(Object.keys(eventListenersCallbackMap)) &&\n Object.keys(eventListenersCallbackMap).forEach((evt) => {\n let event = evt as keyof AudioEvents;\n audioInstance?.addEventListener(AUDIO_EVENTS[event], (e: Event) => {\n if (evt && eventListenersCallbackMap[event]) {\n const listenerCallback = eventListenersCallbackMap[event];\n if (typeof listenerCallback === 'function') {\n listenerCallback(e, audioInstance, playLogEnabled);\n }\n }\n });\n });\n};\n\nconst attachCustomEventListeners = (\n eventListenersList: EventListenersList,\n enablePlayLog: boolean = false\n) => {\n const audioInstance = AudioX.getAudioInstance();\n if (isValidArray(eventListenersList)) {\n eventListenersList.forEach((evt) => {\n let event = evt as keyof AudioEvents;\n if (Object.keys(AUDIO_EVENTS).includes(event)) {\n audioInstance?.addEventListener(AUDIO_EVENTS[event], (e: Event) => {\n ChangeNotifier.notify(AUDIO_EVENTS[event], {\n e,\n audioInstance,\n enablePlayLog\n });\n });\n }\n });\n }\n};\n\nconst attachHlsEventsListeners = (\n hlsEventlistenerCallbackMap: HlsEventsCallbackMap,\n playLogEnabled: boolean = false\n) => {\n const hls = new HlsAdapter();\n const hlsInstance = hls.getHlsInstance();\n isValidArray(Object.keys(hlsEventlistenerCallbackMap)) &&\n Object.keys(hlsEventlistenerCallbackMap).forEach((evt) => {\n let event = evt as keyof HlsEvents;\n hlsInstance.on(\n HLS_EVENTS[event] as keyof HlsListeners,\n (e: any, data: any) => {\n if (event && hlsEventlistenerCallbackMap[event]) {\n const listenerCallback = hlsEventlistenerCallbackMap[event];\n if (typeof listenerCallback === 'function') {\n listenerCallback(e, data, hlsInstance, playLogEnabled);\n }\n }\n }\n );\n });\n};\n\nexport {\n attachCustomEventListeners,\n attachEventListeners,\n attachHlsEventsListeners\n};\n","declare global {\n interface Window {\n Hls: any;\n }\n}\n\nimport { AudioX } from 'audio';\nimport { URLS } from 'constants/common';\nimport { HLS_EVENTS_CALLBACK_MAP } from 'events/hlsEvents';\nimport { attachHlsEventsListeners } from 'events/listeners';\nimport { loadScript } from 'helpers/common';\nimport { MediaTrack } from 'types';\nimport type Hls from 'types/hls.js.js';\nimport type { HlsConfig } from 'types/hls.js.js';\n\nlet hlsInstance: Hls;\n\nclass HlsAdapter {\n private static _instance: HlsAdapter;\n private HlsClass: typeof Hls;\n\n constructor() {\n if (HlsAdapter._instance) {\n console.warn(\n 'Instantiation failed: cannot create multiple instance of HLS returning existing instance'\n );\n return HlsAdapter._instance;\n }\n HlsAdapter._instance = this;\n }\n\n async load() {\n await loadScript(\n URLS.HLS,\n () => {\n console.log('HLS Loaded');\n },\n 'hls'\n )\n .then(() => {\n this.HlsClass = window.Hls;\n window.Hls = undefined;\n })\n .catch((msg: string) => {\n console.log(msg);\n });\n\n return this.HlsClass;\n }\n\n async init(config: HlsConfig | {} = {}, enablePlayLog: boolean) {\n const Hls = await this.load();\n if (Hls.isSupported()) {\n hlsInstance = new Hls(config);\n attachHlsEventsListeners(HLS_EVENTS_CALLBACK_MAP, enablePlayLog);\n }\n }\n\n addHlsMedia(mediaTrack: MediaTrack) {\n const Hls = this.HlsClass;\n const audioInstance = AudioX.getAudioInstance();\n hlsInstance.loadSource(mediaTrack.source);\n hlsInstance.attachMedia(audioInstance);\n hlsInstance.on(Hls.Events.MEDIA_ATTACHED, function () {\n console.log('hls media attached');\n });\n }\n\n getHlsInstance() {\n return hlsInstance;\n }\n}\n\nexport default HlsAdapter;\n","import { AudioX } from 'audio';\nimport { isValidWindow, metaDataCreator } from 'helpers/common';\nimport ChangeNotifier from 'helpers/notifier';\nimport { AudioState } from 'types';\n\nexport const updateMetaData = (data: any) => {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.metadata = new MediaMetadata(metaDataCreator(data));\n }\n};\n\nexport const attachMediaSessionHandlers = () => {\n if ('mediaSession' in navigator) {\n navigator.mediaSession.setActionHandler('play', () => {\n const audioInstance = AudioX.getAudioInstance();\n\n audioInstance.play();\n });\n navigator.mediaSession.setActionHandler('pause', () => {\n const audioInstance = AudioX.getAudioInstance();\n audioInstance.pause();\n });\n }\n};\n\nexport const updatePositionState = () => {\n if ('setPositionState' in navigator.mediaSession) {\n const audioState = ChangeNotifier.getLatestState(\n 'AUDIO_X_STATE'\n ) as AudioState;\n const { currentTime, duration } = AudioX.getAudioInstance();\n\n navigator.mediaSession.setPositionState({\n duration: duration,\n playbackRate: audioState.playbackRate,\n position: currentTime\n });\n }\n};\n\nexport const resetPositionState = () => {\n if (isValidWindow && 'setPositionState' in navigator.mediaSession) {\n // Reset position state when media is reset.\n const { duration } = AudioX.getAudioInstance();\n console.log('reseting position state');\n console.log({ duration });\n navigator.mediaSession.setPositionState({\n position: 0.0,\n duration: 0.0,\n playbackRate: 1\n });\n }\n};\n","import { ErrorEvents } from 'types/errorEvents.types';\n\nexport const ERROR_EVENTS: ErrorEvents = Object.freeze({\n 1: 'MEDIA_ERR_ABORTED',\n 3: 'MEDIA_ERR_DECODE',\n 2: 'MEDIA_ERR_NETWORK',\n 4: 'MEDIA_ERR_SRC_NOT_SUPPORTED',\n});\n","import { PLAYBACK_STATE } from 'constants/common';\nimport {\n calculateActualPlayedLength,\n getReadableErrorMessage\n} from 'helpers/common';\nimport ChangeNotifier from 'helpers/notifier';\nimport {\n resetPositionState,\n updatePositionState\n} from 'mediasession/mediasessionHandler';\nimport { AudioState, EventListenerCallbackMap } from 'types';\nimport { ERROR_EVENTS } from './errorEvents';\n\nconst notifier = ChangeNotifier;\n\nconst BASE_EVENT_CALLBACK_MAP: EventListenerCallbackMap = {\n LOAD_START: (e, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.BUFFERING,\n duration: audioInstance?.duration,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_state_${e.type}`\n );\n resetPositionState();\n },\n\n DURATION_CHANGE: (e, audioInstance: HTMLAudioElement) => {\n const audioState = notifier.getLatestState('AUDIO_X_STATE') as AudioState;\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState:\n audioState.playbackState === 'playing'\n ? PLAYBACK_STATE.PLAYING // fix for live streams where duration change is fired even when audio is playing\n : PLAYBACK_STATE.DURATION_CHANGE,\n duration: audioInstance?.duration,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_state_${e.type}`\n );\n },\n\n LOADED_META_DATA: (e: Event, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.BUFFERING,\n duration: audioInstance?.duration,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_state_${e.type}`\n );\n updatePositionState();\n },\n\n LOADED_DATA: (e, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.BUFFERING,\n duration: audioInstance?.duration,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_state_${e.type}`\n );\n },\n\n CAN_PLAY: (e: Event) => {\n console.log('STATUS', e.type);\n\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.READY,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n CAN_PLAY_THROUGH: (e: Event) => {\n const audioState = notifier.getLatestState('AUDIO_X_STATE') as AudioState;\n console.log('STATUS', e.type);\n\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState:\n audioState.playbackState === 'playing'\n ? PLAYBACK_STATE.PLAYING // fix for live streams as canplaythrough event is can be behave weirdly as there is no known end to the media\n : PLAYBACK_STATE.READY,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n PLAY: (e: Event, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.PLAYING,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n PLAYING: (e, audioInstance) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.PLAYING,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n PAUSE: (e: Event, audioInstance: HTMLAudioElement, playLogEnabled) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.PAUSED,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n if (playLogEnabled) {\n calculateActualPlayedLength(audioInstance, 'PAUSE');\n }\n },\n\n ENDED: (e: Event, audioInstance: HTMLAudioElement, playLogEnabled) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.ENDED,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n if (playLogEnabled) {\n calculateActualPlayedLength(audioInstance, 'ENDED');\n }\n },\n\n ERROR: (e: Event, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n const errorCode = audioInstance.error?.code as keyof typeof ERROR_EVENTS;\n const message = getReadableErrorMessage(audioInstance);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.ERROR,\n error: {\n code: errorCode,\n message: ERROR_EVENTS[errorCode],\n readable: message\n }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n TIME_UPDATE: (e: Event, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n const audioState = notifier.getLatestState('AUDIO_X_STATE') as AudioState;\n\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: audioInstance.paused\n ? audioState?.playbackState\n : PLAYBACK_STATE.PLAYING,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n resetPositionState();\n updatePositionState();\n },\n\n WAITING: (e: Event, audioInstance: HTMLAudioElement) => {\n console.log('STATUS', e.type);\n notifier.notify(\n 'AUDIO_STATE',\n {\n playbackState: PLAYBACK_STATE.BUFFERING,\n progress: audioInstance?.currentTime,\n error: { code: null, message: '', readable: '' }\n },\n `audiox_baseEvents_state_${e.type}`\n );\n },\n\n VOLUME_CHANGE: (e: Event) => {\n console.log('STATUS', e.type);\n notifier.notify('AUDIO_STATE', {}, `audiox_baseEvents_state`);\n }\n};\n\nexport { BASE_EVENT_CALLBACK_MAP };\n","import { PLAYBACK_STATE } from 'constants/common';\nimport ChangeNotifier from 'helpers/notifier';\nimport { ReadyState } from 'types';\nimport { AudioState, MediaTrack } from 'types/audio.types';\n\nexport const READY_STATE: ReadyState = {\n HAVE_NOTHING: 0,\n HAVE_METADATA: 1,\n HAVE_CURRENT_DATA: 2,\n HAVE_FUTURE_DATA: 3,\n HAVE_ENOUGH_DATA: 4\n};\n\nexport const AUDIO_STATE: AudioState = {\n playbackState: PLAYBACK_STATE.IDLE,\n duration: 0,\n bufferedDuration: 0,\n progress: 0,\n volume: 50,\n playbackRate: 1,\n error: {\n code: null,\n message: '',\n readable: ''\n },\n currentTrack: {} as MediaTrack,\n currentTrackPlayTime: 0,\n previousTrackPlayTime: 0\n};\n\n/* Listen to state changes and update global audio state that is being exposed to outer world\n Do not subscribe to this event, this may cause unexpected behavior instead attach your own custom\n event listener, if you wish to have granular control on audio state. See: attachCustomEventListener \n*/\nChangeNotifier.listen(\n 'AUDIO_STATE',\n (data: AudioState) => {\n ChangeNotifier.notify('AUDIO_X_STATE', { ...AUDIO_STATE, ...data });\n },\n AUDIO_STATE\n);\n","import { Equalizer } from 'adapters/equalizer';\nimport HlsAdapter from 'adapters/hls';\nimport { AUDIO_X_CONSTANTS, PLAYBACK_STATE } from 'constants/common';\nimport { BASE_EVENT_CALLBACK_MAP } from 'events/baseEvents';\nimport { attachEventListeners } from 'events/listeners';\nimport {\n calculateActualPlayedLength,\n handleQueuePlayback,\n isValidArray,\n isValidFunction,\n shuffle\n} from 'helpers/common';\nimport ChangeNotifier from 'helpers/notifier';\n\nimport {\n attachMediaSessionHandlers,\n resetPositionState,\n updateMetaData,\n updatePositionState\n} from 'mediasession/mediasessionHandler';\nimport { READY_STATE } from 'states/audioState';\nimport {\n AudioInit,\n MediaTrack,\n PlaybackRate,\n QueuePlaybackType\n} from 'types/audio.types';\nimport { EqualizerStatus, Preset } from 'types/equalizer.types';\n\nlet audioInstance: HTMLAudioElement;\nconst notifier = ChangeNotifier;\n\nclass AudioX {\n private _audio: HTMLAudioElement;\n private isPlayLogEnabled: Boolean;\n private static _instance: AudioX;\n private _queue: MediaTrack[];\n private _currentQueueIndex: number = 0;\n private _fetchFn: (mediaTrack: MediaTrack) => Promise;\n private eqStatus: EqualizerStatus = 'IDEAL';\n private isEqEnabled: boolean = false;\n private eqInstance: Equalizer;\n\n constructor() {\n if (AudioX._instance) {\n console.warn(\n 'Instantiation failed: cannot create multiple instance of AudioX returning existing instance'\n );\n return AudioX._instance;\n }\n if (\n process.env.NODE_ENV !== AUDIO_X_CONSTANTS?.DEVELOPMENT &&\n audioInstance\n ) {\n throw new Error('Cannot create multiple audio instance');\n }\n\n AudioX._instance = this;\n this._audio = new Audio();\n audioInstance = this._audio;\n }\n\n /**\n *\n * @param initProps initial config to initialize AudioX\n * @param initProps.mediaTrack mediaTrack Object containing metadata and source of the media\n * @param initProps.mediaTrack.title title of the Audio\n * @param initProps.mediaTrack.source URI of the Audio\n * @param initProps.mediaTrack.artwork artwork of the Audio\n * @param initProps.mediaTrack.duration duration of the audio\n * @param initProps.mediaTrack.genre genre of the audio\n * @param initProps.mediaTrack.album album of the audio\n * @param initProps.mediaTrack.comment comment for the audio\n * @param initProps.mediaTrack.year release year of the audio\n * @param initProps.mediaTrack.artist artist of the audio\n * @param mode mode of operation for AudioX\n * @param autoplay flag for autoplay\n * @param preloadStrategy strategy for preloading audio\n * @param playbackRate default playbackRate of the audio\n * @param attachAudioEventListeners flag for registering audio events\n * @param attachMediaSessionHandlers flag for registering mediaSession handlers\n */\n\n async init(initProps: AudioInit) {\n const {\n preloadStrategy = 'auto',\n autoPlay = false,\n useDefaultEventListeners = true,\n customEventListeners = null,\n showNotificationActions = false,\n enablePlayLog = false,\n enableHls = false,\n enableEQ = false,\n crossOrigin = 'anonymous',\n hlsConfig = {}\n } = initProps;\n\n this._audio?.setAttribute('id', 'audio_x_instance');\n this._audio.preload = preloadStrategy;\n this._audio.autoplay = autoPlay;\n this._audio.crossOrigin = crossOrigin;\n this.isPlayLogEnabled = enablePlayLog;\n\n if (customEventListeners !== null) {\n if (useDefaultEventListeners) {\n console.warn(\n `useDefaultEventListeners is set to true at init, are you trying to use the default event listeners?\n set customEventListeners to null to use default event listeners`\n );\n }\n attachEventListeners(customEventListeners, false);\n } else {\n attachEventListeners(BASE_EVENT_CALLBACK_MAP, enablePlayLog);\n }\n\n if (showNotificationActions) {\n attachMediaSessionHandlers();\n }\n\n if (enableEQ) {\n this.isEqEnabled = enableEQ;\n }\n\n if (enableHls) {\n const hls = new HlsAdapter();\n hls.init(hlsConfig, enablePlayLog);\n }\n }\n\n async addMedia(mediaTrack: MediaTrack) {\n if (!mediaTrack) {\n return;\n }\n\n const mediaType = mediaTrack.source.includes('.m3u8') ? 'HLS' : 'DEFAULT';\n\n if (this.isPlayLogEnabled) {\n calculateActualPlayedLength(audioInstance, 'TRACK_CHANGE');\n }\n\n if (mediaType === 'HLS') {\n const hls = new HlsAdapter();\n const hlsInstance = hls.getHlsInstance();\n if (hlsInstance) {\n hlsInstance.detachMedia();\n hls.addHlsMedia(mediaTrack);\n } else {\n console.warn(\n 'The source provided seems to be a HLS stream but, hls playback is not enabled. Please have a look at init method of AudioX'\n );\n await this.reset();\n }\n } else {\n audioInstance.src = mediaTrack.source;\n }\n\n notifier.notify('AUDIO_STATE', {\n playbackState: PLAYBACK_STATE.TRACK_CHANGE,\n currentTrackPlayTime: 0,\n currentTrack: mediaTrack\n });\n\n updateMetaData(mediaTrack);\n resetPositionState();\n audioInstance.load();\n }\n\n attachEq() {\n if (this.isEqEnabled && this.eqStatus === 'IDEAL') {\n try {\n const eq = new Equalizer();\n this.eqStatus = eq.status();\n this.eqInstance = eq;\n } catch (e) {\n console.log('failed to enable equalizer');\n }\n }\n }\n\n async play() {\n const isSourceAvailable = audioInstance.src !== '';\n if (\n audioInstance?.paused &&\n audioInstance.HAVE_ENOUGH_DATA === READY_STATE.HAVE_ENOUGH_DATA &&\n isSourceAvailable\n ) {\n await audioInstance\n .play()\n .then(() => {\n console.log('PLAYING');\n updatePositionState();\n })\n .catch(() => {\n console.warn('cancelling current audio playback, track changed');\n });\n }\n }\n\n /**\n *\n * @param mediaTrack MediaTrack to be added and played\n *\n * Note: Use this method when you want to add media and do playback or want continuous playback\n * You can also call addMedia and Play Separately to achieve playback.\n */\n\n async addMediaAndPlay(\n mediaTrack?: MediaTrack | null,\n fetchFn?: (mediaTrack: MediaTrack) => Promise\n // this should be passed when there something needs to be done before the audio starts playing\n ) {\n const currentTrack =\n mediaTrack || (this._queue.length > 0 ? this._queue[0] : undefined);\n if (fetchFn && isValidFunction(fetchFn) && currentTrack) {\n this._fetchFn = fetchFn;\n await fetchFn(currentTrack as MediaTrack);\n }\n if (this._queue && isValidArray(this._queue)) {\n this._currentQueueIndex = this._queue.findIndex(\n (track) => track.id === currentTrack?.id\n );\n }\n try {\n if (currentTrack) {\n this.addMedia(currentTrack).then(() => {\n if (audioInstance.HAVE_ENOUGH_DATA === READY_STATE.HAVE_ENOUGH_DATA) {\n setTimeout(async () => {\n this.attachEq();\n await this.play();\n }, 950);\n }\n });\n } else {\n console.error('Playback Failed, No MediaTrack Provided');\n }\n } catch (error) {\n console.error('Playback Failed');\n }\n }\n\n pause() {\n if (audioInstance && !audioInstance?.paused) {\n audioInstance?.pause();\n }\n }\n\n stop() {\n if (audioInstance && !audioInstance.paused) {\n audioInstance?.pause();\n audioInstance.currentTime = 0;\n }\n }\n\n /**\n * @method reset : This stops the playback and resets all the state of the audio\n */\n async reset() {\n if (audioInstance) {\n this.stop();\n audioInstance.src = '';\n audioInstance.srcObject = null;\n }\n }\n\n /**\n * @param volume : numeric value between 1-100 to be used.\n */\n setVolume(volume: number) {\n const actualVolume = volume / 100;\n if (audioInstance) {\n audioInstance.volume = actualVolume;\n notifier.notify('AUDIO_STATE', {\n volume: volume\n });\n }\n }\n /**\n * @param playbackRate : a number denoting speed at which the playback should happen,\n */\n setPlaybackRate(playbackRate: PlaybackRate) {\n if (audioInstance) {\n audioInstance.playbackRate = playbackRate;\n notifier.notify('AUDIO_STATE', {\n playbackRate\n });\n }\n }\n\n mute() {\n if (audioInstance && !audioInstance.muted) {\n audioInstance.muted = true;\n }\n }\n\n seek(time: number) {\n if (audioInstance) {\n audioInstance.currentTime = time;\n }\n }\n\n async destroy() {\n if (audioInstance) {\n await this.reset();\n audioInstance.removeAttribute('src');\n audioInstance.load();\n }\n }\n\n subscribe(eventName: string, callback: (data: any) => void, state: any = {}) {\n const unsubscribe = notifier.listen(eventName, callback, state);\n return unsubscribe;\n }\n\n addEventListener(\n event: keyof HTMLMediaElementEventMap,\n callback: (data: any) => void\n ) {\n audioInstance.addEventListener(event, callback);\n }\n\n getPresets() {\n return Equalizer.getPresets();\n }\n\n setPreset(id: keyof Preset) {\n this.eqInstance.setPreset(id);\n }\n\n setCustomEQ(gains: number[]) {\n this.eqInstance.setCustomEQ(gains);\n }\n\n addQueue(queue: MediaTrack[], playbackType: QueuePlaybackType) {\n const playerQueue = isValidArray(queue) ? queue.slice() : [];\n switch (playbackType) {\n case 'DEFAULT':\n this._queue = playerQueue;\n break;\n case 'REVERSE':\n this._queue = playerQueue.reverse();\n break;\n case 'SHUFFLE':\n this._queue = shuffle(playerQueue);\n break;\n default:\n this._queue = playerQueue;\n break;\n }\n handleQueuePlayback();\n }\n\n playNext() {\n if (this._queue.length > this._currentQueueIndex + 1) {\n this._currentQueueIndex++;\n const nextTrack = this._queue[this._currentQueueIndex];\n this.addMediaAndPlay(nextTrack, this._fetchFn);\n } else {\n console.warn('Queue ended');\n }\n }\n\n playPrevious() {\n if (this._currentQueueIndex > 0) {\n this._currentQueueIndex--;\n const previousTrack = this._queue[this._currentQueueIndex];\n this.addMediaAndPlay(previousTrack, this._fetchFn);\n } else {\n console.log('At the beginning of the queue');\n }\n }\n\n clearQueue() {\n if (this._queue && isValidArray(this._queue)) {\n this._queue = [];\n }\n }\n\n removeFromQueue(mediaTrack: MediaTrack) {\n if (this._queue && isValidArray(this._queue)) {\n const queue = this._queue.filter(\n (track: MediaTrack) => track.id == mediaTrack.id\n );\n this._queue = queue;\n }\n }\n\n getQueue() {\n if (this._queue && this._queue.length) {\n return this._queue;\n }\n }\n\n get id() {\n return audioInstance?.getAttribute('id');\n }\n\n static getAudioInstance() {\n return audioInstance;\n }\n}\n\nexport { AudioX };\n"]} \ No newline at end of file diff --git a/src/audio.ts b/src/audio.ts index 344121a..82ef0ac 100644 --- a/src/audio.ts +++ b/src/audio.ts @@ -14,7 +14,9 @@ import ChangeNotifier from 'helpers/notifier'; import { attachMediaSessionHandlers, - updateMetaData + resetPositionState, + updateMetaData, + updatePositionState } from 'mediasession/mediasessionHandler'; import { READY_STATE } from 'states/audioState'; import { @@ -159,6 +161,7 @@ class AudioX { }); updateMetaData(mediaTrack); + resetPositionState(); audioInstance.load(); } @@ -185,6 +188,7 @@ class AudioX { .play() .then(() => { console.log('PLAYING'); + updatePositionState(); }) .catch(() => { console.warn('cancelling current audio playback, track changed'); diff --git a/src/events/baseEvents.ts b/src/events/baseEvents.ts index 2a2dcd5..8ddcc72 100644 --- a/src/events/baseEvents.ts +++ b/src/events/baseEvents.ts @@ -4,6 +4,10 @@ import { getReadableErrorMessage } from 'helpers/common'; import ChangeNotifier from 'helpers/notifier'; +import { + resetPositionState, + updatePositionState +} from 'mediasession/mediasessionHandler'; import { AudioState, EventListenerCallbackMap } from 'types'; import { ERROR_EVENTS } from './errorEvents'; @@ -21,6 +25,7 @@ const BASE_EVENT_CALLBACK_MAP: EventListenerCallbackMap = { }, `audiox_baseEvents_state_state_${e.type}` ); + resetPositionState(); }, DURATION_CHANGE: (e, audioInstance: HTMLAudioElement) => { @@ -51,6 +56,7 @@ const BASE_EVENT_CALLBACK_MAP: EventListenerCallbackMap = { }, `audiox_baseEvents_state_state_${e.type}` ); + updatePositionState(); }, LOADED_DATA: (e, audioInstance: HTMLAudioElement) => { @@ -187,6 +193,8 @@ const BASE_EVENT_CALLBACK_MAP: EventListenerCallbackMap = { }, `audiox_baseEvents_state_${e.type}` ); + resetPositionState(); + updatePositionState(); }, WAITING: (e: Event, audioInstance: HTMLAudioElement) => { diff --git a/src/mediasession/mediasessionHandler.ts b/src/mediasession/mediasessionHandler.ts index e032656..e931ea8 100644 --- a/src/mediasession/mediasessionHandler.ts +++ b/src/mediasession/mediasessionHandler.ts @@ -1,12 +1,11 @@ import { AudioX } from 'audio'; -import { metaDataCreator } from 'helpers/common'; +import { isValidWindow, metaDataCreator } from 'helpers/common'; import ChangeNotifier from 'helpers/notifier'; import { AudioState } from 'types'; export const updateMetaData = (data: any) => { if ('mediaSession' in navigator) { navigator.mediaSession.metadata = new MediaMetadata(metaDataCreator(data)); - updatePositionState(); } }; @@ -38,3 +37,17 @@ export const updatePositionState = () => { }); } }; + +export const resetPositionState = () => { + if (isValidWindow && 'setPositionState' in navigator.mediaSession) { + // Reset position state when media is reset. + const { duration } = AudioX.getAudioInstance(); + console.log('reseting position state'); + console.log({ duration }); + navigator.mediaSession.setPositionState({ + position: 0.0, + duration: 0.0, + playbackRate: 1 + }); + } +}; From 71c227ea05829a9c59b196fff915d3568a5e7365 Mon Sep 17 00:00:00 2001 From: Ashish Kumar Date: Sat, 20 Jan 2024 22:08:59 +0530 Subject: [PATCH 3/3] 1.0.6-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2228d6b..0138c7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "audio_x", - "version": "1.0.5", + "version": "1.0.6-0", "description": "The audio player for the gen-x", "main": "./dist/index.js", "types": "./dist/index.d.ts",