-
Notifications
You must be signed in to change notification settings - Fork 5
/
mpd.lua
157 lines (139 loc) · 3.96 KB
/
mpd.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
-- Small interface to MusicPD
--
-- Author: Steve Jothen <sjothen at gmail dot com>
--
-- Requires netcat
--
-- Change your path/settings according to your setup
--
-- defbindings("WScreen", {
-- kpress("KP_6", "MusicPD.next()"), -- next song
-- kpress("KP_4", "MusicPD.previous()"), -- previous song
-- kpress("KP_2", "MusicPD.volume_down()"), -- volume down settings.volume_delta units
-- kpress("KP_8", "MusicPD.volume_up()"), -- volume up ....
-- kpress("KP_5", "MusicPD.toggle_play()") -- toggle play/pause/stop
-- })
local netcat = "/bin/netcat"
local settings = {
hostname = "localhost",
password = nil,
port = 6600,
volume_delta = 10
}
MusicPD = {}
function MusicPD.file_exists()
if io.open(netcat, "r") then -- check to see if file exists
return true
else
return false
end
end
-- creates the appropriate string to call with io.popen
--
function MusicPD.create_command(command)
local arguments = nil
if settings.password then
arguments = string.format(
"echo -n \"password %s\n%s\nclose\n\" | %s %s %d",
settings.password, command, netcat, settings.hostname, settings.port)
else
arguments = string.format(
"echo -n \"%s\nclose\n\" | %s %s %d",
command, netcat, settings.hostname, settings.port)
end
return arguments
end
-- calls the command and returns table of key, value pairs
--
function MusicPD.call_command(command)
local arg_cmd = MusicPD.create_command(command)
local values = {}
if MusicPD.file_exists() then
local handle = io.popen(arg_cmd, "r")
local line = handle:read("*l")
while line do
local _, _, key, value = string.find(line, "(.+):%s(.+)")
if key then
values[string.lower(key)] = value
end
line = handle:read("*l")
end
handle:close()
end
return values
end
function MusicPD.next()
MusicPD.call_command("next")
end
function MusicPD.previous()
MusicPD.call_command("previous")
end
function MusicPD.pause()
MusicPD.call_command("pause")
end
function MusicPD.stop()
MusicPD.call_command("stop")
end
function MusicPD.volume_up()
local stats = MusicPD.call_command("status")
local cur_volume = tonumber(stats.volume)
local new_volume
if cur_volume == 100 then
return nil
elseif cur_volume + settings.volume_delta > 100 then
new_volume = string.format("setvol %d", 100)
else
new_volume = string.format("setvol %d", settings.volume_delta + cur_volume)
end
MusicPD.call_command(new_volume)
end
function MusicPD.volume_down()
local stats = MusicPD.call_command("status")
local cur_volume = tonumber(stats.volume)
local new_volume
if cur_volume == 0 then
return nil
elseif cur_volume - settings.volume_delta < 0 then
new_volume = string.format("setvol %d", 0)
else
new_volume = string.format("setvol %d", cur_volume - settings.volume_delta)
end
MusicPD.call_command(new_volume)
end
function MusicPD.toggle_random()
local stats = MusicPD.call_command("status")
local random = tonumber(stats.random)
if random == 0 then
MusicPD.call_command("random 1")
elseif random == 1 then
MusicPD.call_command("random 0")
end
end
function MusicPD.toggle_repeat()
local stats = MusicPD.call_command("status")
local rpt = tonumber(stats["repeat"])
if rpt == 0 then
MusicPD.call_command("repeat 1")
else
MusicPD.call_command("repeat 0")
end
end
function MusicPD.toggle_play()
local stats = MusicPD.call_command("status")
if stats.state == "play" then
MusicPD.call_command("pause")
elseif stats.state == "pause" then
MusicPD.call_command("pause")
elseif stats.state == "stop" then
MusicPD.call_command("play")
end
end
defbindings("WScreen", {
kpress("KP_6", "MusicPD.next()"),
kpress("KP_4", "MusicPD.previous()"),
kpress("KP_2", "MusicPD.volume_down()"),
kpress("KP_8", "MusicPD.volume_up()"),
kpress("KP_5", "MusicPD.toggle_play()"),
kpress("KP_7", "MusicPD.toggle_repeat()"),
kpress("KP_9", "MusicPD.toggle_random()")
})