108 lines
3.5 KiB
Lua
108 lines
3.5 KiB
Lua
-- Info-Beamer script with streaming channel support
|
|
gl.setup(NATIVE_WIDTH, NATIVE_HEIGHT)
|
|
|
|
local json = require "json"
|
|
local font = resource.load_font "roboto.ttf"
|
|
|
|
local server_url = CONFIG.server_url or "http://192.168.1.22"
|
|
local player_id = CONFIG.player_id or "default_player"
|
|
local refresh_interval = CONFIG.refresh_interval or 30
|
|
local default_duration = CONFIG.default_duration or 10
|
|
|
|
local playlist = {}
|
|
local current_item = 1
|
|
local item_start_time = 0
|
|
local last_update = 0
|
|
local channel_info = {}
|
|
|
|
function update_playlist()
|
|
-- Fetch channel content from server
|
|
local url = server_url .. "/api/player/" .. player_id .. "/content"
|
|
util.post_and_wait(url, "", function(response)
|
|
if response.success then
|
|
local data = json.decode(response.content)
|
|
if data and data.content then
|
|
playlist = data.content
|
|
print("Updated channel content: " .. #playlist .. " items")
|
|
|
|
-- Load assets
|
|
for i, item in ipairs(playlist) do
|
|
if item.type == "image" then
|
|
item.resource = resource.load_image(server_url .. "/uploads/" .. item.filename)
|
|
elseif item.type == "video" then
|
|
item.resource = resource.load_video(server_url .. "/uploads/" .. item.filename)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
-- Also fetch channel information
|
|
local channel_url = server_url .. "/api/player/" .. player_id .. "/channel"
|
|
util.post_and_wait(channel_url, "", function(response)
|
|
if response.success then
|
|
channel_info = json.decode(response.content) or {}
|
|
end
|
|
end)
|
|
|
|
last_update = sys.now()
|
|
end
|
|
|
|
function node.render()
|
|
-- Update playlist periodically
|
|
if sys.now() - last_update > refresh_interval then
|
|
update_playlist()
|
|
end
|
|
|
|
-- If no playlist items, show waiting message
|
|
if #playlist == 0 then
|
|
font:write(100, 100, "Waiting for channel content...", 50, 1, 1, 1, 1)
|
|
font:write(100, 200, "Server: " .. server_url, 30, 0.7, 0.7, 0.7, 1)
|
|
font:write(100, 250, "Player ID: " .. player_id, 30, 0.7, 0.7, 0.7, 1)
|
|
return
|
|
end
|
|
|
|
local item = playlist[current_item]
|
|
if not item then
|
|
current_item = 1
|
|
item = playlist[current_item]
|
|
if not item then return end
|
|
end
|
|
|
|
local duration = item.duration or default_duration
|
|
|
|
-- Check if it's time to move to next item
|
|
if sys.now() - item_start_time > duration then
|
|
current_item = current_item + 1
|
|
if current_item > #playlist then
|
|
current_item = 1
|
|
end
|
|
item_start_time = sys.now()
|
|
item = playlist[current_item]
|
|
end
|
|
|
|
-- Display current item
|
|
if item and item.resource then
|
|
if item.type == "image" then
|
|
item.resource:draw(0, 0, WIDTH, HEIGHT)
|
|
elseif item.type == "video" then
|
|
item.resource:draw(0, 0, WIDTH, HEIGHT)
|
|
end
|
|
|
|
-- Show channel info overlay (optional)
|
|
if channel_info.name then
|
|
font:write(10, HEIGHT - 60, "Channel: " .. channel_info.name, 20, 1, 1, 1, 0.8)
|
|
if channel_info.description then
|
|
font:write(10, HEIGHT - 30, channel_info.description, 20, 1, 1, 1, 0.8)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Show current time
|
|
local current_time = os.date("%H:%M")
|
|
font:write(WIDTH - 100, 20, current_time, 24, 1, 1, 1, 0.9)
|
|
end
|
|
|
|
-- Initial load
|
|
update_playlist()
|