summaryrefslogtreecommitdiff
path: root/src/qlistener.lua
blob: 3f0430c889d4c2a478c47e2dddc397f0e8f4f040 (plain)
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-2015 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