Переделка интерфейса с использованием SVG-иконок, добавлен счетчик времени и кнопки...
[mpd-lua.git] / mpd.lua
diff --git a/mpd.lua b/mpd.lua
index 0200a8a37cfa92c3e6ccb314a7410048734d77fe..b5e180d5adf38465a3e284af0f766d1a310a12f2 100755 (executable)
--- 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