Break the API calls out into their own files for clarity

This commit is contained in:
Nick Bisby 2019-03-18 21:59:23 -05:00
parent 18ccd45998
commit fae99fa9f5
No known key found for this signature in database
GPG Key ID: F6E0C4E6D0B5EB36
8 changed files with 155 additions and 136 deletions

View File

@ -424,6 +424,9 @@ sub showVideoPlayer(video_id)
while true
msg = wait(0, port)
if type(msg) = "roSGScreenEvent" and msg.isScreenClosed() then
' Sometimes video is already gone by this point
' TODO - add an event listener higher up that watches for closing
' so we can handle end of video a bit better
if video = invalid then return
progress = int( video.position / video.duration * 100)

View File

@ -26,6 +26,8 @@ function buildURL(path as String, params={} as Object) as string
'item = field.key + "=" + str(field.value).trim()
else if type(field.value) = "roFloat" then
item = field.key + "=" + req.escape(str(field.value).trim())
else if type(field.value) = "roArray" then
' TODO handle array params
else if field <> invalid
item = field.key + "=" + req.escape(field.value)
'item = field.key + "=" + field.value
@ -114,27 +116,6 @@ function server_is_https() as Boolean
return False
end function
function get_token(user as String, password as String)
bytes = createObject("roByteArray")
bytes.FromAsciiString(password)
digest = createObject("roEVPDigest")
digest.setup("sha1")
hashed_pass = digest.process(bytes)
url = "Users/AuthenticateByName?format=json"
req = APIRequest(url)
json = postJson(req, "Username=" + user + "&Password=" + hashed_pass)
if json = invalid then return invalid
set_setting("active_user", json.User.id)
set_user_setting("id", json.User.id) ' redundant, but could come in handy
set_user_setting("token", json.AccessToken)
return json
end function
function authorize_request(request)
auth = "MediaBrowser"
auth = auth + " Client=" + Chr(34) + "Jellyfin Roku" + Chr(34)
@ -155,98 +136,3 @@ function authorize_request(request)
request.AddHeader("X-Emby-Authorization", auth)
return request
end function
function AboutMe()
url = Substitute("Users/{0}", get_setting("active_user"))
resp = APIRequest(url)
return getJson(resp)
end function
function ImageURL(id, version="Primary", params={})
if params.count() = 0
params = {"maxHeight": "384", "maxWidth": "196", "quality": "90"}
end if
url = Substitute("Items/{0}/Images/{1}", id, version)
' ?maxHeight=384&maxWidth=256&tag=<tag>&quality=90"
return buildURL(url, params)
end function
' ServerBrowsing
' List Available Libraries for the current logged in user
' Params: None
' Returns { Items, TotalRecordCount }
function LibraryList()
url = Substitute("Users/{0}/Views/", get_setting("active_user"))
resp = APIRequest(url)
return getJson(resp)
end function
' Search for a string
' Params: Search Query
' Returns: { SearchHints, TotalRecordCount }
function SearchMedia(query as String)
resp = APIRequest("Search/Hints", {"searchTerm": query})
data = getJson(resp)
for each item in data.SearchHints
if item.type = "Movie"
item.posterURL = ImageURL(item.id)
else if item.type = "Person"
item.posterURL = ImageURL(item.id)
else if item.type = "Episode"
item.posterURL = ImageURL(item.id)
end if
end for
return data
end function
' List items from within a Library
' Params: Library ID, Limit, Offset, SortBy, SortOrder, IncludeItemTypes, Fields, EnableImageTypes
' Returns { Items, TotalRecordCount }
function ItemList(library_id=invalid as String, params={})
if params["limit"] = invalid
params["limit"] = 30
end if
if params["page"] = invalid
params["page"] = 1
end if
params["parentid"] = library_id
url = Substitute("Users/{0}/Items/", get_setting("active_user"))
resp = APIRequest(url, params)
data = getJson(resp)
for each item in data.Items
item.posterURL = ImageURL(item.id)
end for
return data
end function
function ItemMetaData(id as String)
url = Substitute("Users/{0}/Items/{1}", get_setting("active_user"), id)
resp = APIRequest(url)
data = getJson(resp)
data.posterURL = ImageURL(data.id)
return data
end function
function TVSeasons(id as String)
url = Substitute("Shows/{0}/Seasons", id)
resp = APIRequest(url, {"UserId": get_setting("active_user")})
data = getJson(resp)
for each item in data.Items
item.posterURL = ImageURL(item.id)
end for
return data
end function
function TVNext(id as String)
url = Substitute("Shows/NextUp", id)
resp = APIRequest(url, {"UserId": get_setting("active_user"), "SeriesId": id})
data = getJson(resp)
for each item in data.Items
item.posterURL = ImageURL(item.id)
end for
return data
end function

8
source/api/images.brs Normal file
View File

@ -0,0 +1,8 @@
function ImageURL(id, version="Primary", params={})
if params.count() = 0
params = {"maxHeight": "384", "maxWidth": "196", "quality": "90"}
end if
url = Substitute("Items/{0}/Images/{1}", id, version)
' ?maxHeight=384&maxWidth=256&tag=<tag>&quality=90"
return buildURL(url, params)
end function

73
source/api/itemdata.brs Normal file
View File

@ -0,0 +1,73 @@
' List of available libraries
function LibraryList()
url = Substitute("Users/{0}/Views/", get_setting("active_user"))
resp = APIRequest(url)
return getJson(resp)
end function
' Search across all libraries
function SearchMedia(query as String)
resp = APIRequest("Search/Hints", {"searchTerm": query})
data = getJson(resp)
for each item in data.SearchHints
if item.type = "Movie"
item.posterURL = ImageURL(item.id)
else if item.type = "Person"
item.posterURL = ImageURL(item.id)
else if item.type = "Episode"
item.posterURL = ImageURL(item.id)
end if
end for
return data
end function
' List items from within a library
function ItemList(library_id=invalid as String, params={})
if params["limit"] = invalid
params["limit"] = 30
end if
if params["page"] = invalid
params["page"] = 1
end if
params["parentid"] = library_id
url = Substitute("Users/{0}/Items/", get_setting("active_user"))
resp = APIRequest(url, params)
data = getJson(resp)
for each item in data.Items
item.posterURL = ImageURL(item.id)
end for
return data
end function
' MetaData about an item
function ItemMetaData(id as String)
url = Substitute("Users/{0}/Items/{1}", get_setting("active_user"), id)
resp = APIRequest(url)
data = getJson(resp)
data.posterURL = ImageURL(data.id)
return data
end function
' Seasons for a TV Show
function TVSeasons(id as String)
url = Substitute("Shows/{0}/Seasons", id)
resp = APIRequest(url, {"UserId": get_setting("active_user")})
data = getJson(resp)
for each item in data.Items
item.posterURL = ImageURL(item.id)
end for
return data
end function
' The next up episode for a TV show
function TVNext(id as String)
url = Substitute("Shows/NextUp", id)
resp = APIRequest(url, {"UserId": get_setting("active_user"), "SeriesId": id})
data = getJson(resp)
for each item in data.Items
item.posterURL = ImageURL(item.id)
end for
return data
end function

43
source/api/sessions.brs Normal file
View File

@ -0,0 +1,43 @@
function ItemSessionUpdate(id as String, params={})
url = "Sessions/Playing/Progress"
resp = APIRequest(url, make_params(id, params))
return postJson(resp)
end function
function ItemSessionStart(id as String, params={})
url = "Sessions/Playing"
resp = APIRequest(url, make_params(id, params))
return postJson(resp)
end function
function ItemSessionStop(id as String, params={})
url = "Sessions/Playing/Stopped"
resp = APIRequest(url, make_params(id, params))
return postJson(resp)
end function
function make_params(id as string, params={})
new_params = {
"VolumeLevel":100,
"IsMuted":"false",
"IsPaused":"false",
"RepeatMode":"RepeatNone",
"MaxStreamingBitrate":140000000,
"PositionTicks":0,
"PlaybackStartTimeTicks":0,
"AudioStreamIndex":1,
"BufferedRanges":"[]",
"PlayMethod":"DirectStream",
"PlaySessionId":"",
"PlaylistItemId":"playlistItem0",
"MediaSourceId":id,
"CanSeek":"true",
"ItemId": id,
"NowPlayingQueue":"[]"
}
for each p in params.items()
new_params[p.key] = p.value
end for
print new_params
return new_params
end function

26
source/api/userauth.brs Normal file
View File

@ -0,0 +1,26 @@
function get_token(user as String, password as String)
bytes = createObject("roByteArray")
bytes.FromAsciiString(password)
digest = createObject("roEVPDigest")
digest.setup("sha1")
hashed_pass = digest.process(bytes)
url = "Users/AuthenticateByName?format=json"
req = APIRequest(url)
json = postJson(req, "Username=" + user + "&Password=" + hashed_pass)
if json = invalid then return invalid
set_setting("active_user", json.User.id)
set_user_setting("id", json.User.id) ' redundant, but could come in handy
set_user_setting("token", json.AccessToken)
return json
end function
function AboutMe()
url = Substitute("Users/{0}", get_setting("active_user"))
resp = APIRequest(url)
return getJson(resp)
end function

View File

@ -1,20 +0,0 @@
function ItemSessionUpdate(id as String, params={})
url = "Sessions/Playing/Progress"
params.ItemId = id
resp = APIRequest(url, params)
return postJson(resp)
end function
function ItemSessionStart(id as String, params={})
url = "Sessions/Playing"
params.ItemId = id
resp = APIRequest(url, params)
return postJson(resp)
end function
function ItemSessionStop(id as String, params={})
url = "Sessions/Playing/Stopped"
params.ItemId = id
resp = APIRequest(url, params)
return postJson(resp)
end function