HomeScreen.brs · 30169 B · ext
.brs · seen 147× in SWHvia unique-primary
swh:1:cnt:d10fd92c181274ff5dd48e1133924d54602c3e1b;origin=https://github.com/MediaBrowser/Emby.Roku;anchor=swh:1:rev:bef3b50a90044ce97231e6a995ea06ab493a4416;path=/source/HomeScreen.brs
Show source
'**********************************************************
'** createHomeScreen
'**********************************************************
Function createHomeScreen(viewController as Object) as Object
names = []
keys = []
views = getUserViews()
for each view in views
names.push(view.Title)
key = view.CollectionType + "|" + view.Id + "|" + firstOf(view.HDPosterUrl, "")
keys.push(key)
end for
names.push("Options")
keys.push("options")
loader = CreateObject("roAssociativeArray")
loader.getUrl = getHomeScreenRowUrl
loader.parsePagedResult = parseHomeScreenResult
loader.getLocalData = getHomeScreenLocalData
screen = createPaginatedGridScreen(viewController, names, keys, loader, "two-row-flat-landscape-custom", 8, 75)
screen.baseHandleMessage = screen.HandleMessage
screen.HandleMessage = handleHomeScreenMessage
screen.OnTimerExpired = homeScreenOnTimerExpired
screen.SuperActivate = screen.Activate
screen.Activate = homeScreenActivate
screen.refreshBreadcrumb = homeRefreshBreadcrumb
screen.clockTimer = createTimer()
screen.clockTimer.Name = "clock"
screen.clockTimer.SetDuration(20000, true) ' A little lag is fine here
viewController.AddTimer(screen.clockTimer, screen)
ConnectionManager().sendWolToAllServers(m)
screen.SetDescriptionVisible(false)
return screen
End Function
Function getUserViews() as Object
views = []
if getGlobalVar("user") = invalid then return views
url = GetServerBaseUrl() + "/Users/" + getGlobalVar("user").Id + "/Views?fields=PrimaryImageAspectRatio"
request = HttpRequest(url)
request.ContentType("json")
request.AddAuthorization()
response = request.GetToStringWithTimeout(10)
if response <> invalid
result = parseItemsResponse(response, 0, "two-row-flat-landscape-custom")
for each i in result.Items
viewType = firstOf(i.CollectionType, "")
' Filter out unsupported views
if viewType = "movies" or viewType = "music" or viewType = "tvshows" or viewType = "livetv" or viewType = "channels" or viewType = "folders" or viewType = "playlists" or viewType = "boxsets" then
views.push(i)
' Treat all other types as folders for now
else
viewType = "folders"
views.push(i)
end if
' Normalize this
i.CollectionType = viewType
end for
end if
return views
End Function
Function getHomeScreenLocalData(row as Integer, id as String, startItem as Integer, count as Integer) as Object
viewController = GetViewController()
parts = id.tokenize("|")
id = parts[0]
parentId = firstOf(parts[1], "")
viewTileImageUrl = parts[2]
if id = "options" then
return GetOptionButtons(viewController)
else if id = "movies"
movieToggle = (firstOf(RegUserRead("movieToggle"), "2")).ToInt()
' Jump list
if movieToggle = 3 then
return GetMovieButtons(viewController, movieToggle, parentId, viewTileImageUrl)
end if
else if id = "tvshows"
tvToggle = (firstOf(RegUserRead("tvToggle"), "1")).ToInt()
' Jump list
if tvToggle = 3 then
return GetTVButtons(viewController, tvToggle, parentId, viewTileImageUrl)
end if
end If
return invalid
End Function
Function getHomeScreenRowUrl(row as Integer, id as String) as String
parts = id.tokenize("|")
id = parts[0]
parentId = firstOf(parts[1], "")
url = GetServerBaseUrl()
query = {}
if id = "folders"
url = url + "/Users/" + HttpEncode(getGlobalVar("user").Id) + "/Items?sortby=sortname"
query.AddReplace("Fields", "PrimaryImageAspectRatio")
else if id = "playlists" or id = "boxsets"
url = url + "/Users/" + HttpEncode(getGlobalVar("user").Id) + "/Items?sortby=sortname"
else if id = "channels"
url = url + "/Channels?userid=" + HttpEncode(getGlobalVar("user").Id)
else if id = "movies"
movieToggle = (firstOf(RegUserRead("movieToggle"), "1")).ToInt()
' Next Up
if movieToggle = 1 then
url = url + "/Movies/Recommendations?userId=" + HttpEncode(getGlobalVar("user").Id)
query = {
ItemLimit: "20"
CategoryLimit: "1"
fields: "PrimaryImageAspectRatio",
ImageTypeLimit: "1"
}
' Latest
else if movieToggle = 2 then
url = url + "/Users/" + HttpEncode(getGlobalVar("user").Id) + "/Items?IncludeItemTypes=Movie"
query = {
recursive: "true"
ExcludeLocationTypes: "Virtual"
fields: "PrimaryImageAspectRatio"
sortby: "DateCreated"
sortorder: "Descending"
filters: "IsUnplayed",
ImageTypeLimit: "1"
}
' Resume
else if movieToggle = 4 then
url = url + "/Users/" + HttpEncode(getGlobalVar("user").Id) + "/Items?includeitemtypes=Movie"
query = {
recursive: "true"
fields: "PrimaryImageAspectRatio"
sortby: "DatePlayed"
sortorder: "Descending"
filters: "IsResumable",
ImageTypeLimit: "1"
}
' Favorites
else if movieToggle = 5 then
url = url + "/Users/" + HttpEncode(getGlobalVar("user").Id) + "/Items?includeitemtypes=Movie"
query = {
recursive: "true"
fields: "PrimaryImageAspectRatio"
sortby: "SortName"
sortorder: "Ascending"
filters: "IsFavorite",
ImageTypeLimit: "1"
}
' Genres
else if movieToggle = 6 then
url = url + "/Genres?Recursive=true"
query = {
userid: getGlobalVar("user").Id
includeitemtypes: "Movie"
fields: "PrimaryImageAspectRatio"
sortby: "SortName"
sortorder: "Ascending"
}
end if
else if id = "tvshows"
tvToggle = (firstOf(RegUserRead("tvToggle"), "1")).ToInt()
' Next Up
if tvToggle = 1 then
url = url + "/Shows/NextUp?userId=" + HttpEncode(getGlobalVar("user").Id)
query = {
fields: "PrimaryImageAspectRatio,Overview",
ImageTypeLimit: "1"
}
' Latest
else if tvToggle = 2 then
url = url + "/Users/" + HttpEncode(getGlobalVar("user").Id) + "/Items?IncludeItemTypes=Episode"
query = {
recursive: "true"
ExcludeLocationTypes: "Virtual"
fields: "PrimaryImageAspectRatio"
sortby: "DateCreated"
sortorder: "Descending"
filters: "IsUnplayed",
ImageTypeLimit: "1"
}
' Resume
else if tvToggle = 4 then
url = url + "/Users/" + HttpEncode(getGlobalVar("user").Id) + "/Items?includeitemtypes=Episode"
query = {
recursive: "true"
fields: "PrimaryImageAspectRatio"
sortby: "DatePlayed"
sortorder: "Descending"
filters: "IsResumable",
ImageTypeLimit: "1"
}
' Favorites
else if tvToggle = 5 then
url = url + "/Users/" + HttpEncode(getGlobalVar("user").Id) + "/Items?includeitemtypes=Series"
query = {
recursive: "true"
fields: "PrimaryImageAspectRatio"
sortby: "SortName"
sortorder: "Ascending"
filters: "IsFavorite",
ImageTypeLimit: "1"
}
' Genres
else if tvToggle = 6 then
url = url + "/Genres?Recursive=true"
query = {
userid: getGlobalVar("user").Id
includeitemtypes: "Series"
fields: "PrimaryImageAspectRatio"
sortby: "SortName"
sortorder: "Ascending",
ImageTypeLimit: "1"
}
end if
else if id = "livetv"
liveTvToggle = (firstOf(RegUserRead("liveTvToggle"), "1")).ToInt()
' Suggested
if liveTvToggle = 1 then
url = url + "/LiveTv/Programs/Recommended?userId=" + HttpEncode(getGlobalVar("user").Id)
query = {
IsAiring: "true"
}
' Favorites
else if liveTvToggle = 2 then
url = url + "/LiveTv/Channels?userId=" + HttpEncode(getGlobalVar("user").Id)
query = {
IsFavorite: "true"
}
' Resume
else if liveTvToggle = 3 then
url = url + "/LiveTv/Recordings?userId=" + HttpEncode(getGlobalVar("user").Id)
query = {
IsInProgress: "false"
}
end if
else if id = "music"
musicToggle = (firstOf(RegUserRead("musicToggle"), "1")).ToInt()
' Latest
if musicToggle = 1 then
url = url + "/Users/" + HttpEncode(getGlobalVar("user").Id) + "/Items?includeitemtypes=MusicAlbum"
query = {
recursive: "true"
fields: "PrimaryImageAspectRatio"
sortby: "DateCreated"
sortorder: "Descending",
ImageTypeLimit: "1"
}
else
' Not going to use the output, just checking to see if the user has music in their library
url = url + "/Users/" + HttpEncode(getGlobalVar("user").Id) + "/Items?includeitemtypes=Audio"
query = {
recursive: "true"
fields: "PrimaryImageAspectRatio"
sortby: "DateCreated"
sortorder: "Descending",
ImageTypeLimit: "1"
}
end if
end If
if id <> "channels" and id <> "livetv" and parentId <> "" then
query.AddReplace("ParentId", parentId)
end if
for each key in query
url = url + "&" + key +"=" + HttpEncode(query[key])
end for
return url
End Function
Function parseHomeScreenResult(row as Integer, id as string, startIndex as Integer, json as String) as Object
viewController = GetViewController()
maxListSize = 60
parts = id.tokenize("|")
id = parts[0]
parentId = firstOf(parts[1], "")
viewTileImageUrl = parts[2]
if id = "folders" then
return parseItemsResponse(json, 0, "two-row-flat-landscape-custom")
else if id = "playlists" then
return parseItemsResponse(json, 1, "two-row-flat-landscape-custom")
else if id = "boxsets" then
return parseItemsResponse(json, 1, "two-row-flat-landscape-custom")
else if id = "channels" then
return parseItemsResponse(json, 1, "two-row-flat-landscape-custom")
else if id = "movies" then
movieToggle = (firstOf(RegUserRead("movieToggle"), "1")).ToInt()
if movieToggle = 1 then
response = parseSuggestedMoviesResponse(json)
else if movieToggle = 6 then
response = parseItemsResponse(json, 1, "mixed-aspect-ratio-portrait", "moviegenre")
else
response = parseItemsResponse(json, 1, "two-row-flat-landscape-custom")
end if
buttons = GetBaseMovieButtons(viewController, movieToggle, parentId, viewTileImageUrl, response)
buttonCount = buttons.Count()
minTotalRecordCount = buttonCount + response.Items.Count()
' Only insert buttons if startIndex = 0
if startIndex = 0 then
buttons.Append(response.Items)
response.Items = buttons
end if
if response.TotalCount > maxListSize then response.TotalCount = maxListSize
if response.TotalCount < minTotalRecordCount then response.TotalCount = minTotalRecordCount
return response
else if id = "tvshows" then
tvToggle = (firstOf(RegUserRead("tvToggle"), "1")).ToInt()
if tvToggle = 5 then
response = parseItemsResponse(json, 1, "two-row-flat-landscape-custom")
else if tvToggle = 6 then
response = parseItemsResponse(json, 1, "mixed-aspect-ratio-portrait", "tvgenre")
else
response = parseItemsResponse(json, 0, "two-row-flat-landscape-custom")
end if
buttons = GetBaseTVButtons(viewController, tvToggle, parentId, viewTileImageUrl)
buttonCount = buttons.Count()
minTotalRecordCount = buttonCount + response.Items.Count()
' Only insert buttons if startIndex = 0
if startIndex = 0 then
buttons.Append(response.Items)
response.Items = buttons
end if
if response.TotalCount > maxListSize then response.TotalCount = maxListSize
if response.TotalCount < minTotalRecordCount then response.TotalCount = minTotalRecordCount
return response
else if id = "livetv" then
liveTvToggle = (firstOf(RegUserRead("liveTvToggle"), "1")).ToInt()
if liveTvToggle = 1 then
response = parseLiveTvProgramsResponse(json)
else if liveTvToggle = 2 then
response = parseLiveTvChannelsResult(json)
else
response = parseLiveTvRecordingsResponse(json)
end if
buttons = GetBaseLiveTVButtons(viewController, liveTvToggle)
buttonCount = buttons.Count()
minTotalRecordCount = buttonCount + response.Items.Count()
' Only insert buttons if startIndex = 0
if startIndex = 0 then
buttons.Append(response.Items)
response.Items = buttons
end if
if response.TotalCount > maxListSize then response.TotalCount = maxListSize
if response.TotalCount < minTotalRecordCount then response.TotalCount = minTotalRecordCount
return response
else if id = "music" then
response = parseItemsResponse(json, 0, "mixed-aspect-ratio-square")
if response.TotalCount = 0 then
Return {
Items: []
TotalCount: 0
}
end if
musicToggle = (firstOf(RegUserRead("musicToggle"), "1")).ToInt()
if musicToggle <> 1 then
return GetMusicButtons(viewController, musicToggle, parentId, viewTileImageUrl)
end if
buttons = GetBaseMusicButtons(viewController, musicToggle, parentId, viewTileImageUrl)
buttonCount = buttons.Count()
minTotalRecordCount = buttonCount + response.Items.Count()
' Only insert buttons if startIndex = 0
if startIndex = 0 then
buttons.Append(response.Items)
response.Items = buttons
end if
if response.TotalCount > maxListSize then response.TotalCount = maxListSize
if response.TotalCount < minTotalRecordCount then response.TotalCount = minTotalRecordCount
return response
end if
return parseItemsResponse(json, 0, "two-row-flat-landscape-custom")
End Function
Function handleHomeScreenMessage(msg) as Boolean
handled = false
viewController = m.ViewController
if type(msg) = "roGridScreenEvent" Then
if msg.isListItemSelected() Then
rowIndex = msg.GetIndex()
context = m.contentArray[rowIndex]
index = msg.GetData()
item = context[index]
if item = invalid then
Else If item.ContentType = "MovieToggle" Then
handled = true
GetNextMovieToggle()
m.loader.RefreshRow(rowIndex)
Else If item.ContentType = "MovieRefreshSuggested" Then
handled = true
m.loader.RefreshRow(rowIndex)
Else If item.ContentType = "TVToggle" Then
handled = true
GetNextTVToggle()
m.loader.RefreshRow(rowIndex)
Else If item.ContentType = "LiveTVToggle" Then
handled = true
GetNextLiveTVToggle()
m.loader.RefreshRow(rowIndex)
Else If item.ContentType = "MusicToggle" Then
handled = true
GetNextMusicToggle()
m.loader.RefreshRow(rowIndex)
End If
End If
End If
return handled or m.baseHandleMessage(msg)
End Function
'**********************************************************
'** GetNextMovieToggle
'**********************************************************
Function GetNextMovieToggle()
movieToggle = (firstOf(RegUserRead("movieToggle"), "2")).ToInt()
movieToggle = movieToggle + 1
if movieToggle = 7 then
movieToggle = 1
end if
RegUserWrite("movieToggle", movieToggle)
End Function
'**********************************************************
'** Get GetMovieButtons
'**********************************************************
Function GetBaseMovieButtons(viewController as Object, movieToggle as Integer, parentId as String, allTileImageUrl = invalid, movieResponse = invalid) As Object
if firstOf(allTileImageUrl, "") = "" then
allTileImageUrl = viewController.getThemeImageUrl("hd-movies.jpg")
end if
buttons = [
{
Title: "Movie Library"
ContentType: "MovieLibrary"
ShortDescriptionLine1: "Library"
HDPosterUrl: allTileImageUrl
SDPosterUrl: allTileImageUrl,
Id: parentId
}
]
switchButton = [
{
ContentType: "MovieToggle"
}
]
if movieToggle = 1 then
switchButton[0].HDPosterUrl = viewController.getThemeImageUrl("hd-toggle-1.jpg")
switchButton[0].SDPosterUrl = viewController.getThemeImageUrl("hd-toggle-1.jpg")
buttons.Append( switchButton )
suggestedButton = [
{
ContentType: "MovieRefreshSuggested"
…(truncated)…