UNPKG

node_aimp

Version:

use aimp remote use module web remote aimp

180 lines 7.68 kB
const axios = require("axios"); class aimp{ i=0; j=0; port = 0; default = [ "Play", "Pause", "Stop", "PlayPrevious", "PlayNext", "ShufflePlaybackMode", "RepeatPlaybackMode", "GetPlayerControlPanelState", "VolumeLevel", "Mute", "RadioCaptureMode", "Status", "EnqueueTrack", "RemoveTrackFromPlayQueue", "GetPlaylists", "CreatePlaylist", "GetPlaylistEntries", "GetEntryPositionInDataTable", "GetPlaylistEntriesCount", "GetFormattedEntryTitle", "GetPlaylistEntryInfo", "SetTrackRating", "GetCover", "DownloadTrack", "SubscribeOnAIMPStateUpdateEvent", "PluginCapabilities", "AddURLToPlaylist" ] constructor(url,time=10000){ this.port = url.port?url.port:3333; let awaitAimp = setInterval(()=>{ if(!this.active){ axios.get(this.getURL()).then(_=>{ this.i = 0; this.active = true; clearInterval(awaitAimp); }).catch(e=>{ if(this.i>=time){ this.i=0; clearInterval(awaitAimp); } }) } this.i++; }) } call(method,params={},f,awaitTime=10000){ try{ return new Promise((res,rej)=>{ let i = 0; let time = setInterval(() => { if(this.active){ clearInterval(time); axios.post(this.getURL(),{method:method,params:params}) .then(e=>e.data?e.data:e) .then(e=>e).catch(e=>({error:e,run:rej({error:"disconected"})})) .then(e=>f?(f(e.result?e.result:e.error?e.error:{error:"disconected"},this.method,this.j)):e) .then(e=>res({response:e,method:this.method,id:this.j})).then(e=>this.j++); } if(i>=awaitTime){ clearInterval(time); let errorFormat = { error:"exeded time await", time:i } f?f(errorFormat,rej):rej(errorFormat); } i++; }); }) }catch(err){ console.log(err,"check") } } setMethod(array=this.default){ if(typeof array === "object"){ if(array.length){ let result = {}; array.map(e=>{ switch(e){ case "PlayPrevious": result["Back"] = (params,f)=>f?this.call(e,params,f):this.call(e,params) break; case "PlayNext": result["Next"] = (params,f)=>f?this.call(e,params,f):this.call(e,params) break; case "ShufflePlaybackMode": result["RandomSong"] = (params,f)=>f?this.call(e,params,f):this.call(e,params) break; case "RepeatPlaybackMode": result["RepeatMode"] = (params,f)=>f?this.call(e,params,f):this.call(e,params) break; case "GetPlayerControlPanelState": result["GetControl"] = (params,f)=>f?this.call(e,params,f):this.call(e,params) break; case "VolumeLevel": result["Vol"] = (params,f)=>f?this.call(e,params,f):this.call(e,params) break; case "Status": result[e] = (params,f)=>f?this.call(e,params,f):this.call(e,params) result["trackPosicion"] = (params,f)=>f?this.call(e,params.hasOwnProperty("position")?{ status_id: 31,value: params.position }:{},f):this.call(e,params.hasOwnProperty("position")?{ status_id: 31,value: params.position }:{}) break; case "RemoveTrackFromPlayQueue": result["RemoveTrack"] = (params,f)=>f?this.call(e,params,f):this.call(e,params) break; case "GetFormattedEntryTitle": result["GetFormatSong"] = (params,f)=>f?this.call(e,params,f):this.call(e,params) break; case "GetPlaylistEntryInfo": result["getSongInfo"] = (params,f)=>f?this.call(e,params,f):this.call(e,params) break; case "SubscribeOnAIMPStateUpdateEvent": result["getEvent"] = (params,f)=>f?this.call(e,params,f):this.call(e,params) break; case "PluginCapabilities": result[e] = (params,f)=>f?this.call(e,params,f):this.call(e,params) break; default: result[e] = (params,f)=>f?this.call(e,params,f):this.call(e,params); } }) this.method = result; return result }else{ throw "require object list" } }else{ throw "require object" } } getURL(){return "http://localhost:"+this.port+"/RPC_JSON";} on(event,eventAction){ try{ event = event==="control"?"control_panel_state_change": (event=="playback"?"play_state_change": (event=="playlist"?"playlists_content_change": (event=="track"?'current_track_change':false))); return new Promise((res,rej)=>{ if(event){ let {method} = this; if(method){ let { getEvent } = method, {OK,complete} = eventAction; if(getEvent){ let loop = async (event,eventAction)=>await getEvent({event}) .then(a=>{ let r = OK?OK:eventAction?eventAction:(a)=>console.log(a,"default response"); return complete?{complete,f:r(a)}:{f:r(a)}; }).then(({complete,f})=>complete?complete(f):f) .catch(e=>{ let {error} = eventAction, r = error?error:rej; throw r(e); }) .then(_=>loop(event,eventAction)) res(loop(event,eventAction)); }else{ rej({ error:"not exist getEvent" }); } } } }) }catch(err){ let {error} = eventAction; console.log(error,err,"in on") } } } module.exports = aimp;