X-Git-Url: https://git.rvb.name/mpd-lua.git/blobdiff_plain/7e7b0d2b9ec3b3c62370de418cf9b0a4a667b1fb..b12b118f634647454e110084173fefbb659419cc:/mpd.lua diff --git a/mpd.lua b/mpd.lua index 0200a8a..b5e180d 100755 --- a/mpd.lua +++ b/mpd.lua @@ -1,5 +1,9 @@ #!/usr/bin/lua +require "uci" +require("socket") +json=require("json") + function url_decode(str) if not str then return nil end str = string.gsub (str, "+", " ") @@ -65,9 +69,6 @@ function process_directory(directory) return res end -require "uci" -require("socket") - function mpd_new(settings) local client = {} if settings == nil then settings = {} end @@ -82,7 +83,6 @@ function mpd_new(settings) return client end - function mpd_send(mpd,action,raw) local command = string.format("%s\n", action) @@ -160,13 +160,15 @@ function mpd_send(mpd,action,raw) return values end - -json=require("json") - x = uci.cursor() + settings = {} settings['host'] = x.get("mpd","server","host") or "localhost" settings['port'] = x.get("mpd","server","port") or 6600 +settings['timeout'] = x.get("mpd","server","timeout") or 1 + +volstep = x.get("mpd","control","volume_step") or 3 + password = x.get("mpd","server","password") if password then settings["password"] = password @@ -177,62 +179,168 @@ m = mpd_new(settings) command = url_decode(os.getenv('QUERY_STRING')) if not command or command=="" then - command="status" + command="idle" end -if command=="play" or command=="pause" or command=="stop" or command=="previous" or command=="next" then +if command=="play" or command=="pause" or command=="stop" then + res=mpd_send(m,command) + +elseif command=="previous" or command=="next" then + + res=mpd_send(m,"play") + res=mpd_send(m,command) + +elseif command=="idle" then + + m.timeout=30 + res=mpd_send(m,command) + elseif command=="vold" then + status=mpd_send(m,"status") volume=tonumber(status["volume"]) - res=mpd_send(m,"setvol "..(volume-3)) + res=mpd_send(m,"setvol "..(volume-volstep)) + elseif command=="volu" then + status=mpd_send(m,"status") volume=tonumber(status["volume"]) - res=mpd_send(m,"setvol "..(volume+3)) + res=mpd_send(m,"setvol "..(volume+volstep)) + +elseif string.starts(command,"fastfwd") then + + cmd=split(command,"|") + skip=tonumber(cmd[2]) + if not skip then + skip=15 + end + + status=mpd_send(m,"status") + rec_time=status["time"] + song=status["song"] + + if song then + + if rec_time then + rec_time=split(rec_time,":") + cur_time=tonumber(rec_time[1]) + + track_time=tonumber(rec_time[2]) + cur_time=cur_time+skip + if cur_time>track_time then + cur_time=track_time + end + + mpd_send(m,"seek "..song.." "..cur_time) + + else + + mpd_send(m,"play") + + end + + end + + res={} + +elseif string.starts(command,"rewind") then + + cmd=split(command,"|") + skip=tonumber(cmd[2]) + if not skip then + skip=15 + end + + status=mpd_send(m,"status") + rec_time=status["time"] + song=status["song"] + + if song then + + if rec_time then + rec_time=split(rec_time,":") + cur_time=tonumber(rec_time[1]) + + track_time=tonumber(rec_time[2]) + cur_time=cur_time-skip + if cur_time<0 then + cur_time=0 + end + + mpd_send(m,"seek "..song.." "..cur_time) + + else + + mpd_send(m,"play") + mpd_send(m,"previous") + + end + + end + + res={} + elseif command=="status" then + res=mpd_send(m,"status") song=res["song"] playlist=mpd_send(m,"playlist",1) pl=process_playlist(playlist) + if song then res['current_playing']=pl[song]['name'] else - res['current_playing']="No songs selected" + res['song']="--" + res['current_playing']="---" end + elseif command=="playlist" then + playlist=mpd_send(m,"playlist",1) res=process_playlist(playlist) + elseif command=="repeat" then + status=mpd_send(m,"status") rep=1-status["repeat"] res=mpd_send(m,"repeat "..rep) + elseif string.starts(command,"cpl") then + cmd=split(command,"|") id=cmd[3] command=cmd[2] + if command=="playitem" then command="play "..id res=mpd_send(m,command) end + if command=="clear" then res=mpd_send(m,"clear") end + if command=="remove" then command="delete "..id res=mpd_send(m,command) end + if command=="moveup" then command="swap "..id.." "..(id-1) res=mpd_send(m,command) end + if command=="movedown" then command="swap "..id.." "..(id+1) res=mpd_send(m,command) end + elseif string.starts(command,"lists") then + cmd=split(command,"|") command=cmd[2] + if command=="load" then if not cmd[3] then lists=mpd_send(m,"listplaylists",1) @@ -241,12 +349,15 @@ elseif string.starts(command,"lists") then res=mpd_send(m,"load "..cmd[3],1) end end + if command=="save" and cmd[3] then res=mpd_send(m,"save "..cmd[3],1) end + if command=="delete" and cmd[3] then res=mpd_send(m,"rm "..cmd[3],1) end + if command=="edit" then if cmd[3] then dir=mpd_send(m,"lsinfo \""..cmd[3].."\"",1) @@ -255,12 +366,14 @@ elseif string.starts(command,"lists") then end res=process_directory(dir) end + if command=="add" then res={} if cmd[3] then res=mpd_send(m,"add \""..cmd[3].."\"") end end + end if not res then