mirror of
https://github.com/DigitalDevices/octonet.git
synced 2023-10-10 13:36:52 +02:00
227 lines
6.7 KiB
Lua
Executable File
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");
|