1
0
mirror of https://github.com/DigitalDevices/octonet.git synced 2023-10-10 13:36:52 +02:00
octonet/octoserve/var/www/channellist.lua
mvoelkel e65fb9aaab Channelscan
Added features to TransponderList.json
   Allow to define sort order for channels
   Allow overwrite channel title,group,pids
   Define custom groups (i.e. favourites)

Removed client side sorting from browsertv.html
Reworked creating ChannelList.json from legacy database to allow
serveside sorting.
2016-01-24 12:58:42 +01:00

184 lines
4.7 KiB
Lua

#!/usr/bin/lua
local host = os.getenv("HTTP_HOST")
local proto = os.getenv("SERVER_PROTOCOL")
local query = os.getenv("QUERY_STRING")
local method = os.getenv("REQUEST_METHOD")
local clength = os.getenv("CONTENT_LENGTH")
local ctype = os.getenv("CONTENT_TYPE")
function http_print(s)
if s then
io.stdout:write(tostring(s).."\r\n")
else
io.stdout:write("\r\n")
end
end
if #arg> 0 then
method="GET"
query="select=m3u"
proto = "HTTP/1.0"
end
function SendError(err,desc)
http_print(proto.." "..err)
http_print("Content-Type: text/html")
http_print()
local file = io.open("e404.html")
if file then
local tmp = file:read("*a")
tmp = string.gsub(tmp,"404 Not Found",err .. " " .. desc)
http_print(tmp)
file:close()
end
end
function CreateM3U(host)
local m3u = {}
table.insert(m3u,"#EXTM3U".."\n")
local file = io.open("/config/ChannelList.json")
if file then
local json = file:read("*a")
file:close()
local newdecoder = require("lunajson.decoder")
local decode = newdecoder()
local channellist = decode(json)
for _,group in ipairs(channellist.GroupList) do
for _,channel in ipairs(group.ChannelList) do
table.insert(m3u,"#EXTINF:0,"..group.Title.." - "..channel.Title.."\n")
table.insert(m3u,"rtsp://"..host..":554/"..channel.Request.."\n")
end
end
else
local SourceList = LoadSourceList()
for _,f in pairs(SourceList) do
if f.system == "dvbs" or f.system == "dvbs2" then
for _,c in ipairs(f.ChannelList) do
table.insert(m3u,"#EXTINF:0,"..f.title.." - "..c.title.."\n")
table.insert(m3u,"rtsp://"..host..":554/?src="..f.src.."&"..c.request.."\n")
end
else
for _,c in ipairs(f.ChannelList) do
table.insert(m3u,"#EXTINF:0,"..f.title.." - "..c.title.."\n")
table.insert(m3u,"rtsp://"..host..":554/?"..c.request.."\n")
end
end
end
end
return table.concat(m3u)
end
local function CompareTitle(a,b)
return a.Title < b.Title
end
function Legacy2JSON()
local newencoder = require("lunajson.encoder")
local SourceList = LoadSourceList()
local ChannelList = {}
ChannelList.GroupList = {}
local Group
local Channel
local f,c
for _,f in pairs(SourceList) do
Group = { Title=f.title, ChannelList = { } }
table.insert(ChannelList.GroupList,Group)
if f.system == "dvbs" or f.system == "dvbs2" then
src = 'src='..f.src..'&'
end
for _,c in ipairs(f.ChannelList) do
local tracks = {}
local track
for track in c.tracks:gmatch("%d+") do
table.insert(tracks,tonumber(track))
end
tracks[0] = #tracks
Channel = { Title=c.title,
Request = '?'..src..c.request,
Tracks=tracks }
table.insert(Group.ChannelList,Channel)
end
end
for _,Group in ipairs(ChannelList.GroupList) do
table.sort(Group.ChannelList,CompareTitle)
Group.ChannelList[0] = #Group.ChannelList
end
table.sort(ChannelList.GroupList,CompareTitle)
ChannelList.GroupList[0] = #ChannelList.GroupList
local encode = newencoder()
local data = encode(ChannelList)
return data
end
function CreateJSON(host)
local data = nil
local file = io.open("/config/ChannelList.json")
if file then
data = file:read("*a")
file:close()
else
data = Legacy2JSON()
end
return data
end
function LoadSourceList()
local db = require("DataBase")
local SourceList = {}
for _,f in ipairs(db.SourceList) do
f.ChannelList = {}
SourceList[f.refid] = f
end
for _,c in ipairs(db.ChannelList) do
local f = SourceList[c.refid]
if f then
table.insert(f.ChannelList,c)
end
end
return SourceList
end
if method == "GET" then
local filename = nil
local contenttype = nil
local data = nil
if string.match(query,"select=m3u") then
filename = "channellist.m3u"
contenttype = "text/m3u; charset=utf-8"
data = CreateM3U(host)
elseif string.match(query,"select=json") then
filename = "ChannelList.json"
contenttype = "application/json; charset=utf-8"
data = CreateJSON(host)
end
if data then
http_print(proto.." 200" )
http_print("Pragma: no-cache")
http_print("Cache-Control: no-cache")
http_print("Content-Type: "..contenttype)
if filename then
http_print('Content-Disposition: filename="'..filename..'"')
end
http_print(string.format("Content-Length: %d",#data))
http_print()
http_print(data)
else
SendError("404","not found")
end
else
SendError("500","What")
end