commit b48e8757bd4cc03efb29beab5a9fea4a09785479
parent 5712a026ba7dd09b76465b0d024d19b63b9cb003
Author: Brian C. Lane <bcl@ibrianlane.com>
Date: Fri, 24 Nov 2017 13:52:37 -0800
Use roPosterScreen instead of roGridScreen
I have too many movies, it takes minutes to load the app because all of
the grid needs to be populated. This switched to a Poster style with the
categories listed at the top. The metadata is loaded the first time one
is selected, and cached for subsequent requests.
Diffstat:
1 file changed, 116 insertions(+), 106 deletions(-)
diff --git a/HMS/source/appMediaServer.brs b/HMS/source/appMediaServer.brs
@@ -10,11 +10,11 @@ Function mediaServer( url As String, has_keystore As Boolean ) As Object
print "url: ";url
print "has_keystore: "; has_keystore
- port=CreateObject("roMessagePort")
- grid = CreateObject("roGridScreen")
- grid.SetMessagePort(port)
- grid.SetDisplayMode("scale-to-fit")
- grid.SetGridStyle("flat-movie")
+ port = CreateObject("roMessagePort")
+ screen = CreateObject("roPosterScreen")
+ screen.SetMessagePort(port)
+ screen.SetListStyle("arced-portrtait")
+ screen.setListDisplayMode("scale-to-fit")
' Build list of Category Names from the top level directories
listing = getDirectoryListing(url)
@@ -26,123 +26,71 @@ Function mediaServer( url As String, has_keystore As Boolean ) As Object
Sort(categories, function(k)
return LCase(k[0])
end function)
+ titles = catTitles(categories)
+ screen.SetListNames(titles)
+ max_titles = titles.Count()
- ' Setup Grid with categories
- titles = CreateObject("roArray", categories.Count()+1, false)
- titles.Push("Search")
- for i = 0 to categories.Count()-1
- print "Category: :";categories[i][0]
- titles.Push(getLastElement(categories[i][0]))
- end for
- grid.SetupLists(titles.Count())
- grid.SetListNames(titles)
+ screen.SetFocusToFilterBanner(true)
+ last_title = getFocusedItem(url, has_keystore, "filter_pos", max_titles)
+ screen.SetFocusedList(last_title)
+ showTimeBreadcrumb(screen, true)
+ screen.Show()
- ' Hold all the movie objects
- screen = CreateObject("roArray", categories.Count()+1, false)
+ cache = CreateObject("roAssociativeArray")
- ' Add as utility row
- search = getUtilRow(url)
- grid.SetContentList(0, search)
- screen.Push(search)
-
- ' run the grid
- showTimeBreadcrumb(grid, true)
- grid.Show()
-
- loadingDialog = ShowPleaseWait("Loading Movies...", "")
- total = 0
- ' Setup each category's list
- for i = 0 to categories.Count()-1
- cat_url = url + "/" + categories[i][0]
- listing = getDirectoryListing(cat_url)
- listing_hash = CreateObject("roAssociativeArray")
- for each f in listing
- listing_hash.AddReplace(f, "")
- end for
-
- ' What kind of directory is this?
- dirType = directoryType(listing_hash)
- if dirType = 1 then
- displayList = displayFiles(listing, { jpg : true })
- else if dirType = 2 then
- displayList = displayFiles(listing, { mp3 : true })
- else if dirType = 3 then
- displayList = displayFiles(listing, { mp4 : true, m4v : true, mov : true, wmv : true } )
- else if dirType = 4 then
- displayList = displayFiles(listing, { mp4 : true, m4v : true, mov : true, wmv : true } )
- end if
-
- total = total + displayList.Count()
- loadingDialog.SetTitle("Loading Movie #"+Stri(total))
- if dirType <> 0 then
- Sort(displayList, function(k)
- return LCase(k[0])
- end function)
- list = CreateObject("roArray", displayList.Count(), false)
- for j = 0 to displayList.Count()-1
- list.Push(MovieObject(displayList[j], cat_url, listing_hash))
- end for
- grid.SetContentList(1+i, list)
- screen.Push(list)
- if has_keystore = true then
- ' Get the last selected video on this row
- last_pos = getKeyValue(url, getLastElement(categories[i][0]))
- if last_pos <> "" and last_pos.toint() < list.Count() then
- grid.SetFocusedListitem(1+i, last_pos.toint())
- else
- grid.SetFocusedListitem(1+i, 0)
- end if
- else
- grid.SetFocusedListitem(1+i, 0)
- end if
- if displayList.Count() = 0 then
- grid.SetListVisible(1+i, false)
- end if
- else
- grid.SetContentList(1+i, [])
- screen.Push([])
- grid.SetListVisible(1+i, false)
- end if
- end for
- loadingDialog.Close()
- grid.SetFocusedListitem(0, 1)
+ ' Load the selected title
+ metadata = getCategoryMetadata(url, categories[last_title][0])
+ cache.AddReplace(tostr(last_title), metadata)
+ screen.SetContentList(metadata)
+ screen.SetFocusedListItem(getFocusedItem(url, has_keystore, titles[last_title], metadata.Count()))
while true
msg = wait(30000, port)
- if type(msg) = "roGridScreenEvent" then
+ if type(msg) = "roPosterScreenEvent" then
if msg.isScreenClosed() then
return -1
- elseif msg.isListItemSelected()
- if msg.GetIndex() = 0 and msg.GetData() = 0 then
+ elseif msg.isListSelected()
+ if msg.GetIndex() = max_titles then
checkServerUrl(true)
- else if msg.GetIndex() = 0 and msg.GetData() = 1 then
- ' search returns a roArray of MovieObjects
- results = searchScreen(screen)
-
- ' Make a new search row
- searchRow = getUtilRow(url)
- searchRow.Append(results)
- ' Remove the old one and add the new one, selecting first result
- screen.Shift()
- screen.Unshift(searchRow)
- grid.SetContentList(0, searchRow)
- grid.SetFocusedListitem(0, 2)
else
+ last_title = msg.GetIndex()
+ print "selected "; titles[last_title]
+
+ ' Save this as the last selected filter position
if has_keystore = true then
- setKeyValue(url, getLastElement(categories[msg.GetIndex()-1][0]), tostr(msg.GetData()))
+ setKeyValue(url, "filter_pos", tostr(msg.GetIndex()))
+ end if
+ screen.SetContentList([])
+
+ ' Is this cached? If not, clear it and look it up
+ if not cache.DoesExist(tostr(last_title)) then
+ metadata = getCategoryMetadata(url, categories[last_title][0])
+ cache.AddReplace(tostr(last_title), metadata)
+ else
+ metadata = cache.Lookup(tostr(last_title))
end if
- result = playMovie(screen[msg.GetIndex()][msg.GetData()], url, has_keystore)
- if result = true and msg.GetData() < screen[msg.GetIndex()].Count() then
- ' Advance to the next video and save it
- grid.SetFocusedListitem(msg.GetIndex(), msg.GetData()+1)
- if has_keystore = true then
- setKeyValue(url, getLastElement(categories[msg.GetIndex()-1][0]), tostr(msg.GetData()+1))
+ screen.SetContentList(metadata)
+ screen.SetFocusedListItem(getFocusedItem(url, has_keystore, titles[last_title], metadata.Count()))
+ end if
+ elseif msg.isListItemSelected()
+ if has_keystore = true then
+ setKeyValue(url, titles[last_title], tostr(msg.GetIndex()))
+ end if
+ movies = screen.GetContentList()
+ print movies[msg.GetIndex()]
+ result = playMovie(movies[msg.GetIndex()], url, has_keystore)
+ if result = true and msg.GetIndex() < movies.Count() then
+ ' Advance to the next video and save it
+ grid.SetFocusedListitem(msg.GetIndex()+1)
+ if has_keystore = true then
+ if msg.GetIndex < movies.Count() then
+ setKeyValue(url, titles[last_title], tostr(msg.GetIndex()+1))
end if
end if
end if
- endif
+ end if
else if msg = invalid then
- showTimeBreadcrumb(grid, true)
+ showTimeBreadcrumb(screen, true)
endif
end while
End Function
@@ -379,3 +327,65 @@ Function getDescription(url As String)
return ""
End Function
+'******************************************************
+' Return a roArray of just the category names
+'******************************************************
+Function catTitles(categories As Object) As Object
+ titles = CreateObject("roArray", categories.Count()+1, false)
+ for i = 0 to categories.Count()-1
+ titles.Push(getLastElement(categories[i][0]))
+ end for
+ titles.Push("Setup")
+ return titles
+End Function
+
+'*******************************************************************
+' Return a roArray of roAssociativeArrays for the selected category
+'*******************************************************************
+Function getCategoryMetadata(url As String, category As String) As Object
+ cat_url = url + "/" + category
+ listing = getDirectoryListing(cat_url)
+ listing_hash = CreateObject("roAssociativeArray")
+ for each f in listing
+ listing_hash.AddReplace(f, "")
+ end for
+
+ ' What kind of directory is this?
+ dirType = directoryType(listing_hash)
+ if dirType = 1 then
+ displayList = displayFiles(listing, { jpg : true })
+ else if dirType = 2 then
+ displayList = displayFiles(listing, { mp3 : true })
+ else if dirType = 3 then
+ displayList = displayFiles(listing, { mp4 : true, m4v : true, mov : true, wmv : true } )
+ else if dirType = 4 then
+ displayList = displayFiles(listing, { mp4 : true, m4v : true, mov : true, wmv : true } )
+ end if
+
+ if dirType <> 0 then
+ Sort(displayList, function(k)
+ return LCase(k[0])
+ end function)
+ list = CreateObject("roArray", displayList.Count(), false)
+ for j = 0 to displayList.Count()-1
+ list.Push(MovieObject(displayList[j], cat_url, listing_hash))
+ end for
+ end if
+ return list
+End Function
+
+'******************************************************
+' Get the last focused item for a category
+' or return 0 if there is no keystore or an error
+'******************************************************
+Function getFocusedItem(url As String, has_keystore As Boolean, category As String, max_items As Integer) As Integer
+ if has_keystore = true then
+ focus_pos = getKeyValue(url, category)
+ if focus_pos <> "" and focus_pos.toint() < max_items then
+ print "category ";category;" focus is ";focus_pos.toint()
+ return focus_pos.toint()
+ end if
+ end if
+ print "category ";category;" focus is 0"
+ return 0
+End Function