octonet/octoserve/var/channels/doepgscan.lua

227 lines
6.7 KiB
Lua
Executable File

#!/usr/bin/lua
--
local newdecoder = require("lunajson.decoder")
local newencoder = require("lunajson.encoder")
local function GetIPAddr()
local myip = nil
local ifconfig = io.popen("ifconfig eth0")
if ifconfig then
local eth0 = ifconfig:read("*a")
ifconfig:close()
myip = string.match(eth0,"inet addr%:(%d+%.%d+%.%d+%.%d+)")
end
return myip
end
local function LoadChannelList(infile)
local cl = nil
local f = nil
if infile then
f = io.open(infile,"r")
else
f = io.open("/config/ChannelList.json","r")
end
if f then
local t = f:read("*a")
f:close()
local decode = newdecoder()
cl = decode(t)
end
return cl
end
local function Report(count,Title)
local f = io.open("/tmp/doscan.lock/doscan.tmp","w+")
if f then
f:write(count..":"..Title)
f:close()
os.execute("mv /tmp/doscan.lock/doscan.tmp /tmp/doscan.lock/doscan.msg")
end
end
local infile = nil
local outfile = "/config/epg.gz"
local ipAddr = nil
local a
for _,a in ipairs(arg) do
local par,val = a:match("(%a+)=(.+)")
if par == "in" then
infile = val
elseif par == "out" then
outfile = val
elseif par == "ip" then
ipAddr = val
end
end
if not ipAddr then
ipAddr = GetIPAddr()
end
local cl = LoadChannelList(infile)
local Max = 999999
local Count = 0
local ChannelCount = 0
local EventCount = 0
local ReportInterval = 1000
Report(ChannelCount,"*")
local tl = {}
local Options = ""
if not cl then
Report(0,"Channellist not Found, channelscan required")
elseif not cl.GroupList then
Report(0,"Invalid channellist")
else
local Group
for _,Group in ipairs(cl.GroupList) do
for _,Channel in ipairs(Group.ChannelList) do
if Channel.ID and not Channel.NoEPG then
local Params = ""
local p,v
for p,v in Channel.Request:gmatch("(%a+)=([%w%.]+)") do
if p == "src" then
Params = Params .. " --src="..v
elseif p == "freq" then
Params = Params .. " --freq="..v
elseif p == "pol" then
Params = Params .. " --pol="..v
elseif p == "msys" then
Params = Params .. " --msys="..v
elseif p == "sr" then
Params = Params .. " --sr="..v
elseif p == "bw" then
Params = Params .. " --bw="..v
elseif p == "plp" then
Params = Params .. " --plp="..v
elseif p == "mtype" then
Params = Params .. " --mtype="..v
end
end
local Key,Sid = Channel.ID:match("^([A-Z0-9]+):%d+:%d+:(%d+)")
if Key and Sid then
local t = tl[Params]
if t then
t.Sids = t.Sids..","..Sid
else
tl[Params] = { Key=Key, Sids=Sid }
ChannelCount = ChannelCount + 1
end
end
end
end
end
cl = nil
os.execute("rm "..outfile)
local gzip = io.popen('gzip >'..outfile..".tmp","w")
if gzip then
gzip:write('{"EventList":[');
local newline = "\n "
local Params
local Key, t
local encode = newencoder()
for Params,t in pairs(tl) do
Report(Count,"of "..ChannelCount.." transponders, "..EventCount.." events")
Key = t.Key
print("--------------------------------------------------------------")
local cmd = 'octoscan --eit_sid '..t.Sids..' '..Options..Params..' '..ipAddr
print(cmd)
local octoscan = io.popen(cmd,"r")
if octoscan then
tmp_count = ReportInterval
while true do
local line = octoscan:read("*l")
if not line then
break
end
local eid = nil
local name = nil
local text = nil
local time = nil
local duration = nil
local language = nil
if line == "EVENT" then
while true do
line = octoscan:read("*l")
if not line then
break
end
if line == "END" then
if eid then
local event = { ID = Key..":"..eid }
if name then
event.Name = name
end
if text then
event.Text = text
end
if time then
event.Time = time
end
if duration then
event.Duration = duration
end
-- if language then
-- event.Language = language
-- end
local e = encode(event)
gzip:write(newline..e)
newline = ",\n "
EventCount = EventCount + 1
tmp_count = tmp_count - 1
if tmp_count == 0 then
Report(Count,"of "..ChannelCount.." transponders, "..EventCount.." events")
tmp_count = ReportInterval
end
end
break
end
local par,val = line:match("^ (%a+):(.*)")
if par == "ID" then
eid = val
elseif par == "NAME" then
name = val
elseif par == "TEXT" then
text = val
elseif par == "TIME" then
time = val
elseif par == "DUR" then
duration = val
-- elseif par == "LANG" then
-- language = val
end
end
end
end
octoscan:close()
end
Count = Count + 1
end
gzip:write("\n]}")
gzip:close()
else
Report(0,"Internal error")
end
--~ if outfile == "/config/ChannelList.json" then
--~ os.execute("mv /config/ChannelList.json /config/ChannelList.bak")
--~ end
Report(ChannelCount,"EPG done "..EventCount.." events")
end
os.execute("mv "..outfile..".tmp "..outfile)
os.execute("mv /tmp/doscan.lock/doscan.msg /tmp/doscan.msg")
os.execute("rm -rf /tmp/doscan.lock");