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
|
--
-- rhnop
--
-- Copyright (C) 2011-2016 Christian Pointner <equinox@helsinki.at>
--
-- This file is part of rhnop.
--
-- rhnop is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- any later version.
--
-- rhnop is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with rhnop. If not, see <http://www.gnu.org/licenses/>.
--
local last_cart = nil
posix = require "posix"
mq = require "mq"
package.path = package.path .. ";" .. rhnoplibdir .. "/?.lua"
playlog = require "playlog"
rddb = require "rddb"
conf = require "conf"
local cnf = {}
function init(conffile)
cnf = conf.load(conffile)
if cnf.music_carts_lo == nil then
cnf.music_carts_lo = 400000
end
if cnf.music_carts_hi == nil then
cnf.music_carts_hi = 499999
end
cnf.music_carts_lo = tonumber(cnf.music_carts_lo)
cnf.music_carts_hi = tonumber(cnf.music_carts_hi)
end
function handle_now(timestamp, nowcart, nowlen)
local results, err = rddb:getCartInfo(nowcart);
if results == nil then
io.stderr:write("ERROR: can't fetch cart info: " .. err .. "\n")
return nil
else
-- print(timestamp .. " Info: '" .. results.TITLE .. "' von '" .. results.ARTIST .. "' aus '" .. results.ALBUM .. "'")
local ret, err = playlog:insertNowMusic(timestamp, nowcart, nowlen, results.TITLE, results.ARTIST, results.ALBUM)
if ret == nil then
io.stderr:write("ERROR: can't insert music info: " .. err .. "\n")
else
pipe.signal(timestamp)
end
end
return true
end
function handle_message(msg, q)
local timestamp, nowcart, nowlen, nextcart, nextlen = string.match(msg, "^(%d+) (%d+) (%d+) (%d+) (%d+)$");
if not timestamp or not nowcart or not nowlen or not nextcart or not nextlen then
io.stderr:write("WARN: ignoring malformed message\n")
else
nowcart = tonumber(nowcart)
nowlen = tonumber(nowlen)
if last_cart ~= nowcart and nowcart >= cnf.music_carts_lo and nowcart <= cnf.music_carts_hi and nowlen > 0 then
last_cart = nowcart
local ret = handle_now(timestamp, nowcart, nowlen)
if ret == nil then
io.stderr:write("INFO: trying to push last message back onto the queue - before exiting\n")
local result, err = mq.send(q, timestamp .. " " .. nowcart .. " " .. nowlen .. " " .. nextcart .. " " .. nextlen, 0)
if result == nil then
io.stderr:write("ERROR: sending message failed: " .. err .. "\n")
end
return nil
end
end
end
return true
end
function main_loop()
init(rhnopescdir .. "/nopfetchd.conf")
posix.umask("rwxrwxr-x")
local q, err = mq.create(cnf.queue_name, "rw", "rw-rw----")
if q == nil then
q, err = mq.open(cnf.queue_name, "wo")
if q == nil then
io.stderr:write("ERROR: creation of message queue failed: " .. err .. "\n")
os.exit(1)
end
end
local ret, err = playlog:init(cnf)
if ret == nil then
io.stderr:write("ERROR: creation of playlog failed: " .. err .. "\n")
os.exit(1)
end
last_cart = assert(playlog:getLastCart())
print("PLAYLOG: connected to " .. cnf.playlog_db .. "@" .. cnf.playlog_host .. " with user '" .. cnf.playlog_user .. "'")
local ret, err = rddb:init(cnf)
if ret == nil then
io.stderr:write("ERROR: opening rivendell db failed: " .. err .. "\n")
playlog:close()
os.exit(1)
end
print("RDDB: connected to " .. cnf.rddb_db .. "@" .. cnf.rddb_host .. " with user '" .. cnf.rddb_user .. "'")
while true do
local msg, prio = mq.receive(q)
if msg == nil then
io.stderr:write("ERROR mq.receive(): " .. prio .. "\n")
rddb:close()
playlog:close()
os.exit(2)
end
local ret = handle_message(msg, q)
if ret == nil then
os.exit(1)
end
end
end
|