Files
aiolauncher_scripts/main/kodi-remote-widget.lua
2021-08-31 19:43:38 +03:00

98 lines
2.8 KiB
Lua

-- name = "Kodi Remote"
-- description = "Kodi multimedia center remote control widget"
-- type = "widget"
-- author = "Evgeny Zobnin (zobnin@gmail.com)"
-- arguments_help = "Enter the Kodi IP address and port in the following format: 192.168.0.102:8080"
-- version = "1.1"
local colors = require "md_colors"
local json = require "json"
-- constants
local media_type = "application/json"
local get_players_cmd = [[ { "id": 1, "jsonrpc": "2.0", "method": "Player.GetActivePlayers" } ]]
local play_cmd = [[ {"jsonrpc": "2.0", "method": "Player.PlayPause", "params": { "playerid": XXX }, "id": 1} ]]
local stop_cmd = [[ {"jsonrpc": "2.0", "method": "Player.Stop", "params": { "playerid": XXX }, "id": 1} ]]
local prev_cmd = [[ {"jsonrpc": "2.0", "method": "Player.GoTo", "params": {"playerid": XXX,"to":"previous"}, "id":1} ]]
local next_cmd = [[ {"jsonrpc": "2.0", "method": "Player.GoTo", "params": {"playerid": XXX,"to":"next"}, "id":1} ]]
local forward_cmd = [[ {"jsonrpc": "2.0", "method": "Player.Seek", "params": { "playerid": XXX, "value": { "seconds": 300 } }, "id": 1} ]]
local backward_cmd = [[ {"jsonrpc": "2.0", "method": "Player.Seek", "params": { "playerid": XXX, "value": { "seconds": -300 } }, "id": 1} ]]
local buttons = { "fa:fast-backward", "-5m", "fa:play", "fa:stop", "+5m", "fa:fast-forward", "Open Kore" }
local buttons_cmds = { prev_cmd, backward_cmd, play_cmd, stop_cmd, forward_cmd, next_cmd }
-- global vars
local url = nil
local curr_idx = nil
function on_resume()
if next(settings:get()) == nil then
ui:show_text("Tap to enter Kodi address")
return
end
init_url_from_args()
ui:set_folding_flag(true)
ui:show_buttons(buttons)
end
function on_click(idx)
if next(settings:get()) == nil then
aio:show_args_dialog()
return
end
if (idx == 7) then
apps:launch("org.xbmc.kore")
return
end
curr_idx = idx
http:post(url, get_players_cmd, media_type, "players")
end
function on_network_result_players(result)
local parsed = json.decode(result)
if parsed.error ~= nil then
show_error(parsed)
return
end
-- not playing anything
if next(parsed.result) == nil then
return
end
local player_id = parsed.result[1].playerid
local cmd = buttons_cmds[curr_idx]:replace("XXX", player_id)
http:post(url, cmd, media_type, "cmd")
curr_idx = nil
end
function on_network_result_cmd(result)
local parsed = json.decode(result)
if parsed.error ~= nil then
show_error(parsed)
end
end
-- utils
function init_url_from_args()
local ip_port = settings:get()[1]:split(":")
url = "http://"..ip_port[1]..":"..ip_port[2].."/jsonrpc"
end
function show_error(parsed)
ui:show_toast("Error "..parsed.error.code..": "..parsed.error.message)
end