summaryrefslogtreecommitdiff
path: root/catalogue.lua
diff options
context:
space:
mode:
Diffstat (limited to 'catalogue.lua')
-rw-r--r--catalogue.lua119
1 files changed, 119 insertions, 0 deletions
diff --git a/catalogue.lua b/catalogue.lua
new file mode 100644
index 0000000..eecd73b
--- /dev/null
+++ b/catalogue.lua
@@ -0,0 +1,119 @@
+-- Copyright 2025 David Vazgenovich Shakaryan
+
+local util = require('util')
+
+local catalogue = {}
+local mt = {}
+mt.__index = mt
+
+function catalogue.new()
+ o = setmetatable({data = {}}, mt)
+
+ o:add({
+ type = 'group',
+ id = 'root',
+ })
+ o:add({
+ type = 'group',
+ id = 'favourites',
+ parent_id = 'root',
+ name = 'Favourites',
+ lazy = true, -- prevent infinite recursion on search
+ })
+
+ return o
+end
+
+function mt:get(id)
+ return self.data[id]
+end
+
+function mt:add(entry)
+ self.data[entry.id] = entry
+
+ if entry.type == 'group' then
+ entry.children = {}
+ end
+
+ if not entry.parent_id then
+ return
+ end
+
+ -- dump any entries referencing nonexistent categories into a single
+ -- catchall category
+ if not self.data[entry.parent_id] then
+ entry.parent_id = entry.section .. ':category:catchall'
+ if not self.data[entry.parent_id] then
+ self:add({
+ section = entry.section,
+ type = 'group',
+ group_type = 'category',
+ id = entry.parent_id,
+ parent_id = entry.section .. ':category:0',
+ -- non-ascii symbol to sort near end
+ name = '🞷CATCHALL🞷',
+ })
+ end
+ end
+
+ local parent_children = self.data[entry.parent_id].children
+ parent_children[#parent_children+1] = entry
+end
+
+function mt:load_xc_section(section)
+ self:add({
+ section = section.id,
+ type = 'group',
+ group_type = 'category',
+ id = section.id .. ':category:0',
+ parent_id = 'root',
+ name = section.name,
+ })
+
+ -- currently, this will not correctly handle subcategories which come
+ -- before their parent category
+ for _, v in ipairs(section.categories) do
+ self:add({
+ section = section.id,
+ type = 'group',
+ group_type = 'category',
+ id = section.id .. ':category:' .. v.category_id,
+ parent_id = section.id .. ':category:' .. v.parent_id,
+ name = util.strip(v.category_name),
+ })
+ end
+
+ for _, v in ipairs(section.elements) do
+ local vv = {
+ section = section.id,
+ parent_id = section.id .. ':category:' .. v.category_id,
+ name = util.strip(v.name),
+ }
+
+ if section.type == 'series' then
+ vv.type = 'group'
+ vv.group_type = 'series'
+ vv.id = section.id .. ':series:' .. v.series_id
+ vv.series_id = v.series_id
+ vv.image = v.cover
+ vv.lazy = true -- avoid API calls on search
+ else
+ vv.type = 'stream'
+ vv.id = section.id .. ':stream:' .. v.stream_id
+ vv.stream_type = v.stream_type
+ vv.stream_id = v.stream_id
+ vv.image = v.stream_icon
+ vv.epg_channel_id = v.epg_channel_id
+ end
+
+ self:add(vv)
+ end
+end
+
+function mt:load_xc_data(sections)
+ for _, v in ipairs(sections) do
+ self:load_xc_section(v)
+ end
+end
+
+return catalogue