mirror of
https://github.com/JamesonHuang/OpenWrt_Luci_Lua.git
synced 2024-11-27 15:30:11 +00:00
165 lines
5.1 KiB
Lua
165 lines
5.1 KiB
Lua
module ("xiaoqiang.util.XQMitvUtil", package.seeall)
|
|
|
|
local JSON = require("luci.json")
|
|
local LuciProtocol = require("luci.http.protocol")
|
|
local urlencode = LuciProtocol.urlencode
|
|
local XQLog = require("xiaoqiang.XQLog")
|
|
|
|
function DoExec(cmd)
|
|
local LuciUtil = require("luci.util")
|
|
XQLog.log(7,cmd)
|
|
local s = LuciUtil.exec(cmd)
|
|
-- XQLog.log(7,s)
|
|
return s
|
|
end
|
|
|
|
--[[
|
|
local JSON = require("json")
|
|
function urlencode(str)
|
|
if (str) then
|
|
str = string.gsub (str, "\n", "\r\n")
|
|
str = string.gsub (str, "([^%w %-%_%.%~])",
|
|
function (c) return string.format ("%%%02X", string.byte(c)) end)
|
|
str = string.gsub (str, " ", "+")
|
|
end
|
|
return str
|
|
end
|
|
|
|
function DoExec(cmd)
|
|
-- print(cmd)
|
|
local f = assert(io.popen(cmd, 'r'))
|
|
local s = assert(f:read('*a'))
|
|
f:close()
|
|
return s
|
|
end
|
|
]]
|
|
|
|
|
|
--
|
|
-- mitv control api wrapper
|
|
-- zhangyanlu@xiaomi.com
|
|
--
|
|
|
|
local Errorm1 = "{ \"code\" : -1 , \"msg\" : \"api not exists\" }";
|
|
local Error3 = "{ \"code\" : 3 , \"msg\" : \"parameter format error\" }";
|
|
local Error4 = "{ \"code\" : 4 , \"msg\" : \"mitv api result error\" }";
|
|
|
|
function request(payload)
|
|
-- payload example : { "mac|ip" : "", "command" : "keyevent", "keycode" : "left" }
|
|
if payload == nil then
|
|
return Error3
|
|
end
|
|
|
|
local params = JSON.decode(payload)
|
|
if params == nil then
|
|
return Error3
|
|
end
|
|
local ip = params.ip
|
|
if ip == nil then
|
|
if params.mac == nil then
|
|
return Error3
|
|
end
|
|
-- get ip from mac
|
|
local DeviceUtil = require("xiaoqiang.util.XQDeviceUtil")
|
|
local devices = DeviceUtil.getDHCPDict()
|
|
local item = devices[params.mac]
|
|
if item == nil then
|
|
return Error3
|
|
end
|
|
ip = item.ip
|
|
end
|
|
if not string.match(ip,"^%d+%.%d+%.%d+%.%d+$") then
|
|
return Error3
|
|
end
|
|
|
|
if params.command == "isalive" then
|
|
return isalive(ip)
|
|
elseif params.command == "keyevent" then
|
|
return control(ip,params.keycode)
|
|
elseif params.command == "video_playurl" then
|
|
return playVideoByUrl(ip,params.url)
|
|
elseif params.command == "video_playmediaid" then
|
|
return playVideoByMediaid(ip,params.mediaid,params.ci)
|
|
elseif params.command == "music_playurl" then
|
|
return playMusicByUrl(ip,params.url)
|
|
elseif params.command == "photo_playurl" then
|
|
return playPhotoByUrl(ip,params.url)
|
|
else
|
|
return Errorm1
|
|
end
|
|
|
|
end
|
|
|
|
-- mitv api returns status=0 , miwifi apis uses code=0
|
|
function castMitvResult(str)
|
|
if str == nil or str == "" then
|
|
return Error4
|
|
end
|
|
local res = JSON.decode(str)
|
|
res.code = res.status
|
|
return JSON.encode(res)
|
|
end
|
|
|
|
-- test if mitv is alive
|
|
-- use small timeout
|
|
function isalive(ip)
|
|
local cmd = "curl -s -k --connect-timeout 1 \"http://%s:6095/request?action=isalive\""
|
|
local result = DoExec(string.format(cmd,ip))
|
|
|
|
return castMitvResult(result)
|
|
end
|
|
|
|
-- control mitv
|
|
-- keycode enter, back, up, down, left, right, menu, home, voluemup, volumedown, power
|
|
-- aware of bash injection
|
|
function control(ip,keycode)
|
|
if not string.match(keycode,"^%a+$") then
|
|
return Error3
|
|
end
|
|
local cmd = "curl -s -k \"http://%s:6095/controller?action=keyevent&keycode=%s\""
|
|
local result = DoExec(string.format(cmd,ip,keycode))
|
|
return castMitvResult(result)
|
|
end
|
|
|
|
function playVideoByUrl(ip,url)
|
|
local cmd = "curl -s -k \"http://%s:6095/video?action=play&url=%s&clientname=miwifi\""
|
|
local result = DoExec(string.format(cmd,ip,urlencode(url)))
|
|
return castMitvResult(result)
|
|
end
|
|
|
|
function playVideoByMediaid(ip,mediaid,ci)
|
|
if not string.match(mediaid,"^%d+$") or not string.match(ci,"^%d+$") then
|
|
return Error3
|
|
end
|
|
local cmd = "curl -s -k \"http://%s:6095/video?action=play&mediaid=%s&ci=%s&prefersource=1&clientname=miwifi\""
|
|
local result = DoExec(string.format(cmd,ip,mediaid,ci))
|
|
return castMitvResult(result)
|
|
end
|
|
|
|
function playMusicByUrl(ip,url)
|
|
local cmd = "curl -s -k \"http://%s:6095/music?action=play&url=%s&clientname=miwifi\""
|
|
local result = DoExec(string.format(cmd,ip,urlencode(url)))
|
|
return castMitvResult(result)
|
|
end
|
|
|
|
|
|
function playPhotoByUrl(ip,url)
|
|
local cmd = "curl -s -k \"http://%s:6095/photo?action=play&url=%s&clientname=miwifi\""
|
|
local result = DoExec(string.format(cmd,ip,urlencode(url)))
|
|
return castMitvResult(result)
|
|
end
|
|
|
|
|
|
-- print(request())
|
|
-- print(request(""))
|
|
-- print(request("{ \"ip\" : \"192.168.32.109\" , \"command\" : \"isalive\"}"))
|
|
-- print(request("{ \"ip\" : \"192.168.32.109\" , \"command\" : \"keyevent\" , \"keycode\" : \"& sudo ls\"}"))
|
|
-- print(request("{ \"ip\" : \"192.168.32.109\" , \"command\" : \"keyevent\" , \"keycode\" : \"right\"}"))
|
|
|
|
-- print(request("{ \"ip\" : \"192.168.32.109\" , \"command\" : \"keyevent\" , \"keycode\" : \"back\"}"))
|
|
-- print(request("{ \"ip\" : \"192.168.32.109\" , \"command\" : \"video_playurl\" , \"url\" : \"http://wifi.io/video.mp4\"}"))
|
|
|
|
-- print(request("{ \"ip\" : \"192.168.32.109\" , \"command\" : \"video_playmediaid\" , \"mediaid\" : \"87931\" , \"ci\" : \"1\" }"))
|
|
|
|
-- print(request("{ \"ip\" : \"192.168.32.109\" , \"command\" : \"music_playurl\" , \"url\" : \"http://yinyueshiting.baidu.com/data2/music/108215801/14385500158400128.mp3?xcode=191fb7d6bc00415844edb509f9a331dfa888a58d2b9e82c6\"}"))
|
|
-- print(request("{ \"ip\" : \"192.168.32.109\" , \"command\" : \"photo_playurl\" , \"url\" : \"http://img03.mifile.cn/webfile/images/hd/2014040802/www/ac_12.jpg\"}")) |