jf-roku/source/api/baserequest.brs

187 lines
4.5 KiB
Plaintext
Raw Normal View History

' Functions for making requests to the API
2019-04-21 00:34:33 +00:00
function buildParams(params={} as Object) as string
2019-04-29 19:10:02 +00:00
' Take an object of parameters and construct the URL query
req = createObject("roUrlTransfer") ' Just so we can use it for escape
2019-04-21 00:34:33 +00:00
param_array = []
for each field in params.items()
if type(field.value) = "String" or type(field.value) = "roString"
item = field.key + "=" + req.escape(field.value.trim())
'item = field.key + "=" + field.value.trim()
else if type(field.value) = "roInteger"
item = field.key + "=" + stri(field.value).trim()
'item = field.key + "=" + str(field.value).trim()
else if type(field.value) = "roFloat"
item = field.key + "=" + stri(int(field.value)).trim()
else if type(field.value) = "roArray"
' TODO handle array params
else if type(field.value) = "roBoolean"
if field.value
item = field.key + "=true"
else
item = field.key + "=false"
end if
else if field.value = invalid
item = field.key + "=null"
else if field <> invalid
print "Unhandled param type: " + type(field.value)
item = field.key + "=" + req.escape(field.value)
'item = field.key + "=" + field.value
end if
param_array.push(item)
end for
return param_array.join("&")
end function
function buildURL(path as String, params={} as Object) as string
2019-04-29 19:10:02 +00:00
full_url = get_base_url() + "/" + path
2019-03-05 04:59:31 +00:00
if params.count() > 0
2019-04-21 00:34:33 +00:00
full_url = full_url + "?" + buildParams(params)
2019-03-05 04:59:31 +00:00
end if
return full_url
end function
function APIRequest(url as String, params={} as Object)
req = createObject("roUrlTransfer")
if server_is_https() then
req.setCertificatesFile("common:/certs/ca-bundle.crt")
end if
full_url = buildURL(url, params)
2019-03-05 04:59:31 +00:00
req.setUrl(full_url)
req = authorize_request(req)
return req
end function
2019-03-13 01:43:06 +00:00
function getJson(req)
2019-03-05 04:59:31 +00:00
'req.retainBodyOnError(True)
'print req.GetToString()
2019-04-20 17:40:06 +00:00
data = req.GetToString()
if data = invalid or data = ""
return invalid
end if
2019-03-05 04:59:31 +00:00
json = ParseJson(req.GetToString())
return json
end function
2019-03-13 01:43:06 +00:00
function postVoid(req, data="" as string)
status = req.PostFromString(data)
if status = 200
return true
else
return false
end if
end function
function postJson(req, data="" as string)
req.setMessagePort(CreateObject("roMessagePort"))
req.AsyncPostFromString(data)
resp = wait(5000, req.GetMessagePort())
if type(resp) <> "roUrlEvent"
return invalid
end if
if resp.getString() = ""
return invalid
end if
json = ParseJson(resp.GetString())
return json
end function
function get_base_url()
base = get_setting("server")
port = get_setting("port")
2020-02-19 07:15:00 +00:00
if base.right(1) <> "/"
base = base + "/"
2019-04-20 03:09:48 +00:00
end if
2020-02-19 07:15:00 +00:00
2019-04-20 03:09:48 +00:00
if base.left(4) <> "http"
if server_is_https()
protocol = "https://"
else
protocol = "http://"
end if
base = protocol + base
end if
if port <> "" and port <> invalid then
base = base + ":" + port
end if
2019-04-20 03:09:48 +00:00
return base
end function
function server_is_https() as Boolean
2019-03-05 04:59:31 +00:00
server = get_setting("server")
2019-04-20 03:09:48 +00:00
port = get_setting("port")
2019-03-05 04:59:31 +00:00
i = server.Instr(":")
2019-03-05 04:59:31 +00:00
' No protocol found
if i = 0 then
return False
2019-03-05 04:59:31 +00:00
end if
protocol = Left(server, i)
if protocol = "https" then
return True
end if
2019-04-20 03:09:48 +00:00
if port = "443" or port = "8920"
return True
end if
2019-03-05 04:59:31 +00:00
return False
end function
function authorize_request(request)
2019-04-21 00:44:04 +00:00
devinfo = CreateObject("roDeviceInfo")
appinfo = CreateObject("roAppInfo")
2019-04-21 00:44:04 +00:00
2019-03-05 04:59:31 +00:00
auth = "MediaBrowser"
2019-04-21 00:44:04 +00:00
client = "Jellyfin Roku"
auth = auth + " Client=" + Chr(34) + client + Chr(34)
device = devinfo.getModelDisplayName()
friendly = devinfo.getFriendlyName()
' remove special characters
regex = CreateObject("roRegex", "[^a-zA-Z0-9\ \-\_]", "")
friendly = regex.ReplaceAll(friendly, "")
2019-04-21 00:44:04 +00:00
auth = auth + ", Device=" + Chr(34) + device + " (" + friendly + ")" + Chr(34)
device_id = devinfo.getChannelClientID()
if get_setting("active_user") = invalid or get_setting("active_user") = ""
device_id = devinfo.GetRandomUUID()
end if
2019-04-21 00:44:04 +00:00
auth = auth + ", DeviceId=" + Chr(34) + device_id + Chr(34)
version = appinfo.GetVersion()
2019-04-21 00:44:04 +00:00
auth = auth + ", Version=" + Chr(34) + version + Chr(34)
2019-03-05 04:59:31 +00:00
user = get_setting("active_user")
if user <> invalid and user <> "" then
auth = auth + ", UserId=" + Chr(34) + user + Chr(34)
end if
token = get_user_setting("token")
2019-04-20 17:40:06 +00:00
if token <> invalid and token <> ""
2019-03-05 04:59:31 +00:00
auth = auth + ", Token=" + Chr(34) + token + Chr(34)
end if
request.AddHeader("X-Emby-Authorization", auth)
return request
end function