node_aimp
Version:
use aimp remote use module web remote aimp
180 lines • 7.68 kB
JavaScript
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;