diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index dc528342c..65dfad4ac 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -27,3 +27,8 @@ jobs: uses: stefanzweifel/git-auto-commit-action@8756aa072ef5b4a080af5dc8fef36c5d586e521d # v5 with: commit_message: Update API docs + # use jellyfin-bot to commit the changes instead of the default github-actions[bot] + commit_user_name: jellyfin-bot + commit_user_email: team@jellyfin.org + # use jellyfin-bot to author the changes instead of the default author of the merge commit + commit_author: jellyfin-bot diff --git a/.github/workflows/deploy-api-docs.yml b/.github/workflows/deploy-api-docs.yml index 0bde92df1..3d9952801 100644 --- a/.github/workflows/deploy-api-docs.yml +++ b/.github/workflows/deploy-api-docs.yml @@ -2,9 +2,9 @@ name: deploy-api-docs on: - # Runs on pushes targeting the default branch push: branches: ["unstable"] + paths: ["docs/**"] # only run if the docs are updated # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -36,7 +36,7 @@ jobs: uses: actions/upload-pages-artifact@a753861a5debcf57bf8b404356158c8e1e33150c # v2 with: # Only upload the api docs folder - path: "docs/api/*" + path: "docs/api" - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@9dbe3824824f8a1377b8e298bafde1a50ede43e5 # v2 diff --git a/.vscode/settings.json b/.vscode/settings.json index 577621e3b..a005ef427 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,5 +16,6 @@ "**/.git": true, "**/node_modules": true, "docs/api/**": true - } + }, + "brightscriptcomment.addExtraAtStartAndEnd": false } diff --git a/components/GetPlaybackInfoTask.brs b/components/GetPlaybackInfoTask.brs index 0cd6374dd..147028747 100644 --- a/components/GetPlaybackInfoTask.brs +++ b/components/GetPlaybackInfoTask.brs @@ -35,7 +35,7 @@ end function ' Returns an array of playback info to be displayed during playback. ' In the future, with a custom playback info view, we can return an associated array. sub getPlaybackInfoTask() - sessions = api.sessions.Get() + sessions = api.sessions.Get({ "deviceId": m.global.device.serverDeviceName }) m.playbackInfo = ItemPostPlaybackInfo(m.top.videoID) diff --git a/components/ItemGrid/ItemGrid.brs b/components/ItemGrid/ItemGrid.brs index 0cd567b54..e740c7aac 100644 --- a/components/ItemGrid/ItemGrid.brs +++ b/components/ItemGrid/ItemGrid.brs @@ -134,7 +134,15 @@ sub loadInitialItems() m.view = m.global.session.user.settings["display." + m.top.parentItem.Id + ".landing"] end if - if m.sortField = invalid then m.sortField = "SortName" + if m.sortField = invalid + ' Set the default order for boxsets to the Release Date - API calls it PremiereDate + if LCase(m.top.parentItem.json.Type) = "boxset" + m.sortField = "PremiereDate" + else + m.sortField = "SortName" + end if + end if + if m.filter = invalid then m.filter = "All" if sortAscendingStr = invalid or sortAscendingStr = true @@ -717,6 +725,7 @@ sub showTVGuide() m.tvGuide.filter = m.filter m.tvGuide.searchTerm = m.voiceBox.text m.top.appendChild(m.tvGuide) + m.scheduleGrid = m.top.findNode("scheduleGrid") m.tvGuide.lastFocus.setFocus(true) end sub @@ -734,6 +743,18 @@ sub onChannelFocused(msg) m.channelFocused = node.focusedChannel end sub +'Returns Focused Item +function getItemFocused() + if m.itemGrid.isinFocusChain() and isValid(m.itemGrid.itemFocused) + return m.itemGrid.content.getChild(m.itemGrid.itemFocused) + else if m.genreList.isinFocusChain() and isValid(m.genreList.rowItemFocused) + return m.genreList.content.getChild(m.genreList.rowItemFocused[0]).getChild(m.genreList.rowItemFocused[1]) + else if m.scheduleGrid.isinFocusChain() and isValid(m.scheduleGrid.itemFocused) + return m.scheduleGrid.content.getChild(m.scheduleGrid.itemFocused) + end if + return invalid +end function + function onKeyEvent(key as string, press as boolean) as boolean if not press then return false @@ -780,11 +801,11 @@ function onKeyEvent(key as string, press as boolean) as boolean m.loadItemsTask.control = "stop" return true end if - else if key = "play" or key = "OK" + else if key = "play" markupGrid = m.top.findNode("itemGrid") - itemToPlay = markupGrid.content.getChild(markupGrid.itemFocused) + itemToPlay = getItemFocused() - if itemToPlay <> invalid and (itemToPlay.type = "Movie" or itemToPlay.type = "Episode") + if itemToPlay <> invalid m.top.quickPlayNode = itemToPlay return true else if itemToPlay <> invalid and itemToPlay.type = "Photo" diff --git a/components/ItemGrid/MovieLibraryView.brs b/components/ItemGrid/MovieLibraryView.brs index 97c17439c..817573c62 100644 --- a/components/ItemGrid/MovieLibraryView.brs +++ b/components/ItemGrid/MovieLibraryView.brs @@ -144,6 +144,7 @@ sub loadInitialItems() if not isValid(m.filter) then m.filter = "All" if not isValid(m.filterOptions) then m.filterOptions = "{}" if not isValid(m.view) then m.view = "Movies" + if not isValid(m.sortAscending) then m.sortAscending = true m.filterOptions = ParseJson(m.filterOptions) @@ -707,7 +708,12 @@ end sub ' 'Returns Focused Item function getItemFocused() - return m.itemGrid.content.getChild(m.itemGrid.itemFocused) + if m.itemGrid.isinFocusChain() and isValid(m.itemGrid.itemFocused) + return m.itemGrid.content.getChild(m.itemGrid.itemFocused) + else if m.genreList.isinFocusChain() and isValid(m.genreList.rowItemFocused) + return m.genreList.content.getChild(m.genreList.rowItemFocused[0]).getChild(m.genreList.rowItemFocused[1]) + end if + return invalid end function ' @@ -869,11 +875,10 @@ function onKeyEvent(key as string, press as boolean) as boolean m.loadItemsTask.control = "stop" return true end if - else if key = "play" or key = "OK" - + else if key = "play" itemToPlay = getItemFocused() - if itemToPlay <> invalid and (itemToPlay.type = "Movie" or itemToPlay.type = "Episode") + if itemToPlay <> invalid m.top.quickPlayNode = itemToPlay return true end if diff --git a/components/ItemGrid/MusicLibraryView.brs b/components/ItemGrid/MusicLibraryView.brs index 6b06fb233..1573a016e 100644 --- a/components/ItemGrid/MusicLibraryView.brs +++ b/components/ItemGrid/MusicLibraryView.brs @@ -131,6 +131,7 @@ sub loadInitialItems() if not isValid(m.sortField) then m.sortField = "SortName" if not isValid(m.filter) then m.filter = "All" if not isValid(m.view) then m.view = "ArtistsPresentation" + if not isValid(m.sortAscending) then m.sortAscending = true m.top.showItemTitles = m.global.session.user.settings["itemgrid.gridTitles"] @@ -572,7 +573,12 @@ end sub ' 'Returns Focused Item function getItemFocused() - return m.itemGrid.content.getChild(m.itemGrid.itemFocused) + if m.itemGrid.isinFocusChain() and isValid(m.itemGrid.itemFocused) + return m.itemGrid.content.getChild(m.itemGrid.itemFocused) + else if m.genreList.isinFocusChain() and isValid(m.genreList.itemFocused) + return m.genreList.content.getChild(m.genreList.itemFocused) + end if + return invalid end function ' @@ -750,7 +756,6 @@ function onKeyEvent(key as string, press as boolean) as boolean alpha.setFocus(true) return true end if - else if key = "right" and m.Alpha.isinFocusChain() m.top.alphaActive = false m.Alpha.setFocus(false) @@ -760,14 +765,12 @@ function onKeyEvent(key as string, press as boolean) as boolean m.genreList.setFocus(m.genreList.opacity = 1) return true - else if key = "replay" and m.itemGrid.isinFocusChain() if m.resetGrid = true m.itemGrid.animateToItem = 0 else m.itemGrid.jumpToItem = 0 end if - else if key = "replay" and m.genreList.isinFocusChain() if m.resetGrid = true m.genreList.animateToItem = 0 @@ -775,6 +778,12 @@ function onKeyEvent(key as string, press as boolean) as boolean m.genreList.jumpToItem = 0 end if return true + else if key = "play" + itemToPlay = getItemFocused() + if itemToPlay <> invalid + m.top.quickPlayNode = itemToPlay + return true + end if end if if key = "replay" diff --git a/components/data/HomeData.brs b/components/data/HomeData.brs index 4266cc709..bba8aeca9 100644 --- a/components/data/HomeData.brs +++ b/components/data/HomeData.brs @@ -31,7 +31,7 @@ sub setData() m.top.iconUrl = "pkg:/images/media_type_icons/folder_white.png" end if - else if datum.type = "Episode" + else if datum.type = "Episode" or datum.type = "MusicVideo" m.top.isWatched = datum.UserData.Played imgParams = {} @@ -72,32 +72,7 @@ sub setData() m.top.widePosterUrl = ImageURL(datum.Id, "Backdrop", imgParams) end if - else if datum.type = "Movie" - m.top.isWatched = datum.UserData.Played - - imgParams = {} - imgParams.Append({ "maxHeight": 261 }) - imgParams.Append({ "maxWidth": 175 }) - - if datum.ImageTags.Primary <> invalid - param = { "Tag": datum.ImageTags.Primary } - imgParams.Append(param) - end if - - m.top.posterURL = ImageURL(datum.id, "Primary", imgParams) - - ' For wide image, use backdrop - imgParams["maxWidth"] = 464 - - if datum.ImageTags <> invalid and datum.imageTags.Thumb <> invalid - imgParams["Tag"] = datum.imageTags.Thumb - m.top.thumbnailUrl = ImageURL(datum.Id, "Thumb", imgParams) - else if datum.BackdropImageTags[0] <> invalid - imgParams["Tag"] = datum.BackdropImageTags[0] - m.top.thumbnailUrl = ImageURL(datum.id, "Backdrop", imgParams) - end if - - else if datum.type = "Video" + else if datum.type = "Movie" or datum.type = "Video" m.top.isWatched = datum.UserData.Played imgParams = {} @@ -126,12 +101,10 @@ sub setData() m.top.thumbnailURL = ImageURL(datum.id, "Primary", params) m.top.widePosterUrl = m.top.thumbnailURL m.top.posterUrl = m.top.thumbnailURL - else if datum.type = "TvChannel" or datum.type = "Channel" params = { "Tag": datum.ImageTags.Primary, "maxHeight": 261, "maxWidth": 464 } m.top.thumbnailURL = ImageURL(datum.id, "Primary", params) m.top.widePosterUrl = m.top.thumbnailURL m.top.iconUrl = "pkg:/images/media_type_icons/live_tv_white.png" end if - end sub diff --git a/components/extras/ExtrasRowList.brs b/components/extras/ExtrasRowList.brs index 230622cdd..c008795aa 100644 --- a/components/extras/ExtrasRowList.brs +++ b/components/extras/ExtrasRowList.brs @@ -3,6 +3,7 @@ sub init() updateSize() m.top.rowFocusAnimationStyle = "fixedFocus" m.top.observeField("rowItemSelected", "onRowItemSelected") + m.top.observeField("rowItemFocused", "onRowItemFocused") ' Set up all Tasks m.LoadPeopleTask = CreateObject("roSGNode", "LoadItemsTask") @@ -207,3 +208,7 @@ end sub sub onRowItemSelected() m.top.selectedItem = m.top.content.getChild(m.top.rowItemSelected[0]).getChild(m.top.rowItemSelected[1]) end sub + +sub onRowItemFocused() + m.top.focusedItem = m.top.content.getChild(m.top.rowItemFocused[0]).getChild(m.top.rowItemFocused[1]) +end sub diff --git a/components/extras/ExtrasRowList.xml b/components/extras/ExtrasRowList.xml index 8245dd2d8..55f96a421 100644 --- a/components/extras/ExtrasRowList.xml +++ b/components/extras/ExtrasRowList.xml @@ -4,6 +4,7 @@ + diff --git a/components/home/HomeItem.brs b/components/home/HomeItem.brs index 8fb835290..29c2f1342 100644 --- a/components/home/HomeItem.brs +++ b/components/home/HomeItem.brs @@ -30,6 +30,7 @@ end sub sub itemContentChanged() itemData = m.top.itemContent if itemData = invalid then return + itemData.Title = itemData.name ' Temporarily required while we move from "HomeItem" to "JFContentItem" m.itemPoster.width = itemData.imageWidth @@ -135,7 +136,7 @@ sub itemContentChanged() return end if - if itemData.type = "Movie" + if itemData.type = "Movie" or itemData.type = "MusicVideo" m.itemText.text = itemData.name if itemData.PlayedPercentage > 0 diff --git a/components/home/HomeRows.brs b/components/home/HomeRows.brs index 68a4a9ecd..609c42b89 100644 --- a/components/home/HomeRows.brs +++ b/components/home/HomeRows.brs @@ -522,21 +522,20 @@ sub itemSelected() end sub function onKeyEvent(key as string, press as boolean) as boolean - handled = false if press if key = "play" + print "play was pressed from homerow" itemToPlay = m.top.content.getChild(m.top.rowItemFocused[0]).getChild(m.top.rowItemFocused[1]) - if isValid(itemToPlay) and (itemToPlay.type = "Movie" or itemToPlay.type = "Episode") + if isValid(itemToPlay) m.top.quickPlayNode = itemToPlay end if - handled = true - end if - - if key = "replay" + return true + else if key = "replay" m.top.jumpToRowItem = [m.top.rowItemFocused[0], 0] + return true end if end if - return handled + return false end function function filterNodeArray(nodeArray as object, nodeKey as string, excludeArray as object) as object diff --git a/components/home/HomeRows.xml b/components/home/HomeRows.xml index 5c0dcfc03..77d91aeb6 100644 --- a/components/home/HomeRows.xml +++ b/components/home/HomeRows.xml @@ -2,7 +2,7 @@ - + diff --git a/components/home/LoadItemsTask.brs b/components/home/LoadItemsTask.brs index 79bb2d387..1ea788439 100644 --- a/components/home/LoadItemsTask.brs +++ b/components/home/LoadItemsTask.brs @@ -137,7 +137,8 @@ sub loadItems() if isValid(data) and isValid(data.Items) for each item in data.Items ' Skip Books for now as we don't support it (issue #558) - if item.Type <> "Book" + ' also skip songs since there is limited space + if not (item.Type = "Book" or item.Type = "Audio") tmp = CreateObject("roSGNode", "HomeData") params = {} diff --git a/components/manager/QueueManager.brs b/components/manager/QueueManager.brs index ca9f30fa2..4a5b14b9e 100644 --- a/components/manager/QueueManager.brs +++ b/components/manager/QueueManager.brs @@ -11,6 +11,7 @@ sub init() m.queue = [] m.originalQueue = [] m.queueTypes = [] + m.isPlaying = false ' Preroll videos only play if user has cinema mode setting enabled m.isPrerollActive = m.global.session.user.settings["playback.cinemamode"] m.position = 0 @@ -19,6 +20,7 @@ end sub ' Clear all content from play queue sub clear() + m.isPlaying = false m.queue = [] m.queueTypes = [] m.isPrerollActive = m.global.session.user.settings["playback.cinemamode"] @@ -111,6 +113,7 @@ end function ' Play items in queue sub playQueue() + m.isPlaying = true nextItem = getCurrentItem() if not isValid(nextItem) then return @@ -122,11 +125,21 @@ sub playQueue() return end if + if nextItemMediaType = "musicvideo" + CreateVideoPlayerView() + return + end if + if nextItemMediaType = "video" CreateVideoPlayerView() return end if + if nextItemMediaType = "movie" + CreateVideoPlayerView() + return + end if + if nextItemMediaType = "episode" CreateVideoPlayerView() return @@ -196,21 +209,25 @@ end function sub shuffleQueueItems() ' By calling getQueue 2 different ways, Roku avoids needing to do a deep copy m.originalQueue = m.global.queueManager.callFunc("getQueue") - songIDArray = getQueue() - - ' Move the currently playing song to the front of the queue - temp = top() - songIDArray[0] = getCurrentItem() - songIDArray[getPosition()] = temp - - for i = 1 to songIDArray.count() - 1 - j = Rnd(songIDArray.count() - 1) - temp = songIDArray[i] - songIDArray[i] = songIDArray[j] - songIDArray[j] = temp - end for + itemIDArray = getQueue() + temp = invalid + + if m.isPlaying + ' Save the currently playing item + temp = getCurrentItem() + ' remove currently playing item from itemIDArray + itemIDArray.Delete(m.position) + end if + + ' shuffle all items + itemIDArray = shuffleArray(itemIDArray) + + if m.isPlaying + ' Put currently playing item in front of itemIDArray + itemIDArray.Unshift(temp) + end if - set(songIDArray) + set(itemIDArray) end sub ' Return the fitst item in the play queue diff --git a/components/movies/MovieDetails.brs b/components/movies/MovieDetails.brs index 913ccd796..123a4a939 100644 --- a/components/movies/MovieDetails.brs +++ b/components/movies/MovieDetails.brs @@ -385,6 +385,12 @@ function onKeyEvent(key as string, press as boolean) as boolean audioOptionsClosed() return true end if + else if key = "play" and m.extrasGrid.hasFocus() + print "Play was pressed from the movie details extras slider" + if m.extrasGrid.focusedItem <> invalid + m.top.quickPlayNode = m.extrasGrid.focusedItem + return true + end if end if return false end function diff --git a/components/movies/MovieDetails.xml b/components/movies/MovieDetails.xml index cb850da0f..01222f140 100644 --- a/components/movies/MovieDetails.xml +++ b/components/movies/MovieDetails.xml @@ -50,5 +50,6 @@ + \ No newline at end of file diff --git a/components/music/ArtistView.brs b/components/music/ArtistView.brs index 38336ecf2..4d9365690 100644 --- a/components/music/ArtistView.brs +++ b/components/music/ArtistView.brs @@ -313,5 +313,21 @@ function onKeyEvent(key as string, press as boolean) as boolean end if end if + if key = "play" + print "play button pressed from ArtistView" + itemToPlay = invalid + + if isValid(m.albums) and m.albums.isInFocusChain() + itemToPlay = m.albums.MusicArtistAlbumData.items[m.albums.itemFocused] + else if isValid(m.appearsOn) and m.appearsOn.isInFocusChain() + itemToPlay = m.appearsOn.MusicArtistAlbumData.items[m.appearsOn.itemFocused] + end if + + if isValid(itemToPlay) + m.top.quickPlayNode = itemToPlay + return true + end if + end if + return false end function diff --git a/components/music/ArtistView.xml b/components/music/ArtistView.xml index c8b9be042..64f3d8ebc 100644 --- a/components/music/ArtistView.xml +++ b/components/music/ArtistView.xml @@ -54,5 +54,6 @@ + \ No newline at end of file diff --git a/components/tvshows/TVEpisodes.xml b/components/tvshows/TVEpisodes.xml index c87d404d9..ec2dd9520 100644 --- a/components/tvshows/TVEpisodes.xml +++ b/components/tvshows/TVEpisodes.xml @@ -12,7 +12,7 @@ - + diff --git a/components/tvshows/TVShowDetails.brs b/components/tvshows/TVShowDetails.brs index e5e1ead44..a8006df43 100644 --- a/components/tvshows/TVShowDetails.brs +++ b/components/tvshows/TVShowDetails.brs @@ -11,6 +11,7 @@ sub init() m.getShuffleEpisodesTask = createObject("roSGNode", "getShuffleEpisodesTask") m.Shuffle = m.top.findNode("Shuffle") m.extrasSlider.visible = true + m.seasons = m.top.findNode("seasons") end sub sub itemContentChanged() @@ -223,6 +224,20 @@ function onKeyEvent(key as string, press as boolean) as boolean else if key = "up" and m.Shuffle.hasFocus() overview.setFocus(true) return true + else if key = "play" and m.seasons.hasFocus() + print "play was pressed from the seasons row" + if isValid(m.seasons.TVSeasonData) and isValid(m.seasons.TVSeasonData.Items) + itemFocused = m.seasons.rowItemFocused + m.top.quickPlayNode = m.seasons.TVSeasonData.Items[itemFocused[1]] + return true + end if + else if key = "play" and m.extrasSlider.isInFocusChain() + print "play was pressed from the extras grid" + extrasGrid = m.top.findNode("extrasGrid") + if extrasGrid.focusedItem <> invalid + m.top.quickPlayNode = extrasGrid.focusedItem + return true + end if end if return false diff --git a/components/tvshows/TVShowDetails.xml b/components/tvshows/TVShowDetails.xml index 4c42dfd52..197ee81cf 100644 --- a/components/tvshows/TVShowDetails.xml +++ b/components/tvshows/TVShowDetails.xml @@ -32,5 +32,6 @@ + \ No newline at end of file diff --git a/docs/api/components_ButtonGroupHoriz.brs.html b/docs/api/components_ButtonGroupHoriz.brs.html index dc0010154..afab3016f 100644 --- a/docs/api/components_ButtonGroupHoriz.brs.html +++ b/docs/api/components_ButtonGroupHoriz.brs.html @@ -33,7 +33,7 @@ @@ -138,7 +138,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_Buttons_JFButtons.brs.html b/docs/api/components_Buttons_JFButtons.brs.html index a58a47da6..b9c9dc4ad 100644 --- a/docs/api/components_Buttons_JFButtons.brs.html +++ b/docs/api/components_Buttons_JFButtons.brs.html @@ -33,7 +33,7 @@ @@ -235,7 +235,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_Buttons_TextSizeTask.brs.html b/docs/api/components_Buttons_TextSizeTask.brs.html index fd1e06e5c..c48b33c61 100644 --- a/docs/api/components_Buttons_TextSizeTask.brs.html +++ b/docs/api/components_Buttons_TextSizeTask.brs.html @@ -33,7 +33,7 @@ @@ -134,7 +134,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_GetNextEpisodeTask.brs.html b/docs/api/components_GetNextEpisodeTask.brs.html index d2c340fda..3e110676f 100644 --- a/docs/api/components_GetNextEpisodeTask.brs.html +++ b/docs/api/components_GetNextEpisodeTask.brs.html @@ -33,7 +33,7 @@ @@ -129,7 +129,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_GetPlaybackInfoTask.brs.html b/docs/api/components_GetPlaybackInfoTask.brs.html index 3667fcef5..0cce47dea 100644 --- a/docs/api/components_GetPlaybackInfoTask.brs.html +++ b/docs/api/components_GetPlaybackInfoTask.brs.html @@ -33,7 +33,7 @@ @@ -107,7 +107,7 @@

Source: components/GetPlaybackInfoTask.brs

' Returns an array of playback info to be displayed during playback. ' In the future, with a custom playback info view, we can return an associated array. sub getPlaybackInfoTask() - sessions = api.sessions.Get() + sessions = api.sessions.Get({ "deviceId": m.global.device.serverDeviceName }) m.playbackInfo = ItemPostPlaybackInfo(m.top.videoID) @@ -283,7 +283,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_GetShuffleEpisodesTask.brs.html b/docs/api/components_GetShuffleEpisodesTask.brs.html index 20e3f5efd..87b00d039 100644 --- a/docs/api/components_GetShuffleEpisodesTask.brs.html +++ b/docs/api/components_GetShuffleEpisodesTask.brs.html @@ -33,7 +33,7 @@ @@ -129,7 +129,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_IconButton.brs.html b/docs/api/components_IconButton.brs.html index cfc6e9c91..b9dff3908 100644 --- a/docs/api/components_IconButton.brs.html +++ b/docs/api/components_IconButton.brs.html @@ -33,7 +33,7 @@ @@ -194,7 +194,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ItemGrid_Alpha.brs.html b/docs/api/components_ItemGrid_Alpha.brs.html index 62045a207..2fad4bb65 100644 --- a/docs/api/components_ItemGrid_Alpha.brs.html +++ b/docs/api/components_ItemGrid_Alpha.brs.html @@ -33,7 +33,7 @@ @@ -156,7 +156,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ItemGrid_FavoriteItemsTask.brs.html b/docs/api/components_ItemGrid_FavoriteItemsTask.brs.html index 87c55474e..3c148712b 100644 --- a/docs/api/components_ItemGrid_FavoriteItemsTask.brs.html +++ b/docs/api/components_ItemGrid_FavoriteItemsTask.brs.html @@ -33,7 +33,7 @@ @@ -132,7 +132,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ItemGrid_GridItem.brs.html b/docs/api/components_ItemGrid_GridItem.brs.html index c844f1be5..58cc00eb8 100644 --- a/docs/api/components_ItemGrid_GridItem.brs.html +++ b/docs/api/components_ItemGrid_GridItem.brs.html @@ -33,7 +33,7 @@ @@ -284,7 +284,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ItemGrid_GridItemSmall.brs.html b/docs/api/components_ItemGrid_GridItemSmall.brs.html index 6f69faa8c..d3cd57833 100644 --- a/docs/api/components_ItemGrid_GridItemSmall.brs.html +++ b/docs/api/components_ItemGrid_GridItemSmall.brs.html @@ -33,7 +33,7 @@ @@ -184,7 +184,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ItemGrid_ItemGrid.brs.html b/docs/api/components_ItemGrid_ItemGrid.brs.html index 4ed758d3d..3626e2a16 100644 --- a/docs/api/components_ItemGrid_ItemGrid.brs.html +++ b/docs/api/components_ItemGrid_ItemGrid.brs.html @@ -33,7 +33,7 @@ @@ -206,7 +206,15 @@

Source: components/ItemGrid/ItemGrid.brs

m.view = m.global.session.user.settings["display." + m.top.parentItem.Id + ".landing"] end if - if m.sortField = invalid then m.sortField = "SortName" + if m.sortField = invalid + ' Set the default order for boxsets to the Release Date - API calls it PremiereDate + if LCase(m.top.parentItem.json.Type) = "boxset" + m.sortField = "PremiereDate" + else + m.sortField = "SortName" + end if + end if + if m.filter = invalid then m.filter = "All" if sortAscendingStr = invalid or sortAscendingStr = true @@ -789,6 +797,7 @@

Source: components/ItemGrid/ItemGrid.brs

m.tvGuide.filter = m.filter m.tvGuide.searchTerm = m.voiceBox.text m.top.appendChild(m.tvGuide) + m.scheduleGrid = m.top.findNode("scheduleGrid") m.tvGuide.lastFocus.setFocus(true) end sub @@ -806,6 +815,18 @@

Source: components/ItemGrid/ItemGrid.brs

m.channelFocused = node.focusedChannel end sub +'Returns Focused Item +function getItemFocused() + if m.itemGrid.isinFocusChain() and isValid(m.itemGrid.itemFocused) + return m.itemGrid.content.getChild(m.itemGrid.itemFocused) + else if m.genreList.isinFocusChain() and isValid(m.genreList.rowItemFocused) + return m.genreList.content.getChild(m.genreList.rowItemFocused[0]).getChild(m.genreList.rowItemFocused[1]) + else if m.scheduleGrid.isinFocusChain() and isValid(m.scheduleGrid.itemFocused) + return m.scheduleGrid.content.getChild(m.scheduleGrid.itemFocused) + end if + return invalid +end function + function onKeyEvent(key as string, press as boolean) as boolean if not press then return false @@ -852,11 +873,11 @@

Source: components/ItemGrid/ItemGrid.brs

m.loadItemsTask.control = "stop" return true end if - else if key = "play" or key = "OK" + else if key = "play" markupGrid = m.top.findNode("itemGrid") - itemToPlay = markupGrid.content.getChild(markupGrid.itemFocused) + itemToPlay = getItemFocused() - if itemToPlay <> invalid and (itemToPlay.type = "Movie" or itemToPlay.type = "Episode") + if itemToPlay <> invalid m.top.quickPlayNode = itemToPlay return true else if itemToPlay <> invalid and itemToPlay.type = "Photo" @@ -988,7 +1009,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ItemGrid_ItemGridOptions.brs.html b/docs/api/components_ItemGrid_ItemGridOptions.brs.html index 9f1627ad5..27b484ffa 100644 --- a/docs/api/components_ItemGrid_ItemGridOptions.brs.html +++ b/docs/api/components_ItemGrid_ItemGridOptions.brs.html @@ -33,7 +33,7 @@ @@ -501,7 +501,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ItemGrid_LoadItemsTask2.brs.html b/docs/api/components_ItemGrid_LoadItemsTask2.brs.html index 7f4e075ee..9f4287609 100644 --- a/docs/api/components_ItemGrid_LoadItemsTask2.brs.html +++ b/docs/api/components_ItemGrid_LoadItemsTask2.brs.html @@ -33,7 +33,7 @@ @@ -378,7 +378,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ItemGrid_LoadVideoContentTask.brs.html b/docs/api/components_ItemGrid_LoadVideoContentTask.brs.html index b673230db..3397834b0 100644 --- a/docs/api/components_ItemGrid_LoadVideoContentTask.brs.html +++ b/docs/api/components_ItemGrid_LoadVideoContentTask.brs.html @@ -33,7 +33,7 @@ @@ -1024,7 +1024,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ItemGrid_MovieLibraryView.brs.html b/docs/api/components_ItemGrid_MovieLibraryView.brs.html index 272f2d4f0..c79bf612e 100644 --- a/docs/api/components_ItemGrid_MovieLibraryView.brs.html +++ b/docs/api/components_ItemGrid_MovieLibraryView.brs.html @@ -33,7 +33,7 @@ @@ -216,6 +216,7 @@

Source: components/ItemGrid/MovieLibraryView.brs

if not isValid(m.filter) then m.filter = "All" if not isValid(m.filterOptions) then m.filterOptions = "{}" if not isValid(m.view) then m.view = "Movies" + if not isValid(m.sortAscending) then m.sortAscending = true m.filterOptions = ParseJson(m.filterOptions) @@ -779,7 +780,12 @@

Source: components/ItemGrid/MovieLibraryView.brs

' 'Returns Focused Item function getItemFocused() - return m.itemGrid.content.getChild(m.itemGrid.itemFocused) + if m.itemGrid.isinFocusChain() and isValid(m.itemGrid.itemFocused) + return m.itemGrid.content.getChild(m.itemGrid.itemFocused) + else if m.genreList.isinFocusChain() and isValid(m.genreList.rowItemFocused) + return m.genreList.content.getChild(m.genreList.rowItemFocused[0]).getChild(m.genreList.rowItemFocused[1]) + end if + return invalid end function ' @@ -941,11 +947,10 @@

Source: components/ItemGrid/MovieLibraryView.brs

m.loadItemsTask.control = "stop" return true end if - else if key = "play" or key = "OK" - + else if key = "play" itemToPlay = getItemFocused() - if itemToPlay <> invalid and (itemToPlay.type = "Movie" or itemToPlay.type = "Episode") + if itemToPlay <> invalid m.top.quickPlayNode = itemToPlay return true end if @@ -1050,7 +1055,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ItemGrid_MusicArtistGridItem.brs.html b/docs/api/components_ItemGrid_MusicArtistGridItem.brs.html index 0b136e51c..187d2aedf 100644 --- a/docs/api/components_ItemGrid_MusicArtistGridItem.brs.html +++ b/docs/api/components_ItemGrid_MusicArtistGridItem.brs.html @@ -33,7 +33,7 @@ @@ -196,7 +196,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ItemGrid_MusicLibraryView.brs.html b/docs/api/components_ItemGrid_MusicLibraryView.brs.html index 7dca107a5..212fc113f 100644 --- a/docs/api/components_ItemGrid_MusicLibraryView.brs.html +++ b/docs/api/components_ItemGrid_MusicLibraryView.brs.html @@ -33,7 +33,7 @@ @@ -203,6 +203,7 @@

Source: components/ItemGrid/MusicLibraryView.brs

if not isValid(m.sortField) then m.sortField = "SortName" if not isValid(m.filter) then m.filter = "All" if not isValid(m.view) then m.view = "ArtistsPresentation" + if not isValid(m.sortAscending) then m.sortAscending = true m.top.showItemTitles = m.global.session.user.settings["itemgrid.gridTitles"] @@ -644,7 +645,12 @@

Source: components/ItemGrid/MusicLibraryView.brs

' 'Returns Focused Item function getItemFocused() - return m.itemGrid.content.getChild(m.itemGrid.itemFocused) + if m.itemGrid.isinFocusChain() and isValid(m.itemGrid.itemFocused) + return m.itemGrid.content.getChild(m.itemGrid.itemFocused) + else if m.genreList.isinFocusChain() and isValid(m.genreList.itemFocused) + return m.genreList.content.getChild(m.genreList.itemFocused) + end if + return invalid end function ' @@ -822,7 +828,6 @@

Source: components/ItemGrid/MusicLibraryView.brs

alpha.setFocus(true) return true end if - else if key = "right" and m.Alpha.isinFocusChain() m.top.alphaActive = false m.Alpha.setFocus(false) @@ -832,14 +837,12 @@

Source: components/ItemGrid/MusicLibraryView.brs

m.genreList.setFocus(m.genreList.opacity = 1) return true - else if key = "replay" and m.itemGrid.isinFocusChain() if m.resetGrid = true m.itemGrid.animateToItem = 0 else m.itemGrid.jumpToItem = 0 end if - else if key = "replay" and m.genreList.isinFocusChain() if m.resetGrid = true m.genreList.animateToItem = 0 @@ -847,6 +850,12 @@

Source: components/ItemGrid/MusicLibraryView.brs

m.genreList.jumpToItem = 0 end if return true + else if key = "play" + itemToPlay = getItemFocused() + if itemToPlay <> invalid + m.top.quickPlayNode = itemToPlay + return true + end if end if if key = "replay" @@ -908,7 +917,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_JFButton.brs.html b/docs/api/components_JFButton.brs.html index 233b244ed..8da69e319 100644 --- a/docs/api/components_JFButton.brs.html +++ b/docs/api/components_JFButton.brs.html @@ -33,7 +33,7 @@ @@ -137,7 +137,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_JFGroup.brs.html b/docs/api/components_JFGroup.brs.html index 66309c283..37d3aa3b9 100644 --- a/docs/api/components_JFGroup.brs.html +++ b/docs/api/components_JFGroup.brs.html @@ -33,7 +33,7 @@ @@ -121,7 +121,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_JFMessageDialog.brs.html b/docs/api/components_JFMessageDialog.brs.html index f915002a8..f3e1bec42 100644 --- a/docs/api/components_JFMessageDialog.brs.html +++ b/docs/api/components_JFMessageDialog.brs.html @@ -33,7 +33,7 @@ @@ -186,7 +186,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_JFOverhang.brs.html b/docs/api/components_JFOverhang.brs.html index 83a233e35..aa0d01106 100644 --- a/docs/api/components_JFOverhang.brs.html +++ b/docs/api/components_JFOverhang.brs.html @@ -33,7 +33,7 @@ @@ -260,7 +260,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_JFScene.brs.html b/docs/api/components_JFScene.brs.html index 096d9d503..deaee6575 100644 --- a/docs/api/components_JFScene.brs.html +++ b/docs/api/components_JFScene.brs.html @@ -33,7 +33,7 @@ @@ -139,7 +139,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_JFScreen.brs.html b/docs/api/components_JFScreen.brs.html index 57939d8d1..2d85e5a3a 100644 --- a/docs/api/components_JFScreen.brs.html +++ b/docs/api/components_JFScreen.brs.html @@ -33,7 +33,7 @@ @@ -137,7 +137,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_JFVideo.brs.html b/docs/api/components_JFVideo.brs.html index 6fe04bb7c..dfc664ccd 100644 --- a/docs/api/components_JFVideo.brs.html +++ b/docs/api/components_JFVideo.brs.html @@ -33,7 +33,7 @@ @@ -410,7 +410,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_ListPoster.brs.html b/docs/api/components_ListPoster.brs.html index 2113b5392..c4edbb45d 100644 --- a/docs/api/components_ListPoster.brs.html +++ b/docs/api/components_ListPoster.brs.html @@ -33,7 +33,7 @@ @@ -229,7 +229,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_OverviewDialog.bs.html b/docs/api/components_OverviewDialog.bs.html index b5f4d6ef1..26e436ed2 100644 --- a/docs/api/components_OverviewDialog.bs.html +++ b/docs/api/components_OverviewDialog.bs.html @@ -33,7 +33,7 @@ @@ -130,7 +130,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_PersonDetails.brs.html b/docs/api/components_PersonDetails.brs.html index baa569856..286b26f8f 100644 --- a/docs/api/components_PersonDetails.brs.html +++ b/docs/api/components_PersonDetails.brs.html @@ -33,7 +33,7 @@ @@ -287,7 +287,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_PlaybackDialog.brs.html b/docs/api/components_PlaybackDialog.brs.html index b259b6f00..61602f0aa 100644 --- a/docs/api/components_PlaybackDialog.brs.html +++ b/docs/api/components_PlaybackDialog.brs.html @@ -33,7 +33,7 @@ @@ -122,7 +122,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_PlayedCheckmark.brs.html b/docs/api/components_PlayedCheckmark.brs.html index 3f9cef9d4..e2a3ca809 100644 --- a/docs/api/components_PlayedCheckmark.brs.html +++ b/docs/api/components_PlayedCheckmark.brs.html @@ -33,7 +33,7 @@ @@ -117,7 +117,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_PlaystateTask.brs.html b/docs/api/components_PlaystateTask.brs.html index e81018c5c..9b7c803f3 100644 --- a/docs/api/components_PlaystateTask.brs.html +++ b/docs/api/components_PlaystateTask.brs.html @@ -33,7 +33,7 @@ @@ -167,7 +167,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_RadioDialog.brs.html b/docs/api/components_RadioDialog.brs.html index ea95cbc68..ca1b770c2 100644 --- a/docs/api/components_RadioDialog.brs.html +++ b/docs/api/components_RadioDialog.brs.html @@ -33,7 +33,7 @@ @@ -251,7 +251,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_SearchBox.brs.html b/docs/api/components_SearchBox.brs.html index 98e2d1e73..391b6d51e 100644 --- a/docs/api/components_SearchBox.brs.html +++ b/docs/api/components_SearchBox.brs.html @@ -33,7 +33,7 @@ @@ -146,7 +146,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_Spinner.brs.html b/docs/api/components_Spinner.brs.html index d63cb831c..46dd5f111 100644 --- a/docs/api/components_Spinner.brs.html +++ b/docs/api/components_Spinner.brs.html @@ -33,7 +33,7 @@ @@ -119,7 +119,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_StandardDialog.brs.html b/docs/api/components_StandardDialog.brs.html index ce80d2b05..e95a724c4 100644 --- a/docs/api/components_StandardDialog.brs.html +++ b/docs/api/components_StandardDialog.brs.html @@ -33,7 +33,7 @@ @@ -149,7 +149,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_WhatsNewDialog.brs.html b/docs/api/components_WhatsNewDialog.brs.html index cc1de8540..e0df66054 100644 --- a/docs/api/components_WhatsNewDialog.brs.html +++ b/docs/api/components_WhatsNewDialog.brs.html @@ -33,7 +33,7 @@ @@ -159,7 +159,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_captionTask.brs.html b/docs/api/components_captionTask.brs.html index f5ca36154..5a1f4527d 100644 --- a/docs/api/components_captionTask.brs.html +++ b/docs/api/components_captionTask.brs.html @@ -33,7 +33,7 @@ @@ -263,7 +263,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_config_ConfigData.brs.html b/docs/api/components_config_ConfigData.brs.html index cbded0ef8..6affa2ba5 100644 --- a/docs/api/components_config_ConfigData.brs.html +++ b/docs/api/components_config_ConfigData.brs.html @@ -33,7 +33,7 @@ @@ -115,7 +115,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_config_ConfigItem.brs.html b/docs/api/components_config_ConfigItem.brs.html index 03aab584c..c954eddd0 100644 --- a/docs/api/components_config_ConfigItem.brs.html +++ b/docs/api/components_config_ConfigItem.brs.html @@ -33,7 +33,7 @@ @@ -150,7 +150,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_config_ConfigList.brs.html b/docs/api/components_config_ConfigList.brs.html index f1e1213fb..b7a342412 100644 --- a/docs/api/components_config_ConfigList.brs.html +++ b/docs/api/components_config_ConfigList.brs.html @@ -33,7 +33,7 @@ @@ -189,7 +189,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_config_JFServer.brs.html b/docs/api/components_config_JFServer.brs.html index 980ba132c..2b0bb980a 100644 --- a/docs/api/components_config_JFServer.brs.html +++ b/docs/api/components_config_JFServer.brs.html @@ -33,7 +33,7 @@ @@ -147,7 +147,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_config_LoginScene.brs.html b/docs/api/components_config_LoginScene.brs.html index 9c727c00c..0b5fcbce0 100644 --- a/docs/api/components_config_LoginScene.brs.html +++ b/docs/api/components_config_LoginScene.brs.html @@ -33,7 +33,7 @@ @@ -159,7 +159,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_config_ServerDiscoveryTask.brs.html b/docs/api/components_config_ServerDiscoveryTask.brs.html index 225e6d1a8..853e999f1 100644 --- a/docs/api/components_config_ServerDiscoveryTask.brs.html +++ b/docs/api/components_config_ServerDiscoveryTask.brs.html @@ -33,7 +33,7 @@ @@ -284,7 +284,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_config_SetServerScreen.brs.html b/docs/api/components_config_SetServerScreen.brs.html index 8ac9930bc..5e7206c25 100644 --- a/docs/api/components_config_SetServerScreen.brs.html +++ b/docs/api/components_config_SetServerScreen.brs.html @@ -33,7 +33,7 @@ @@ -272,7 +272,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_AlbumData.brs.html b/docs/api/components_data_AlbumData.brs.html index 6241ed548..35f02b80a 100644 --- a/docs/api/components_data_AlbumData.brs.html +++ b/docs/api/components_data_AlbumData.brs.html @@ -33,7 +33,7 @@ @@ -120,7 +120,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_ChannelData.brs.html b/docs/api/components_data_ChannelData.brs.html index 55a4234f1..6240f6583 100644 --- a/docs/api/components_data_ChannelData.brs.html +++ b/docs/api/components_data_ChannelData.brs.html @@ -33,7 +33,7 @@ @@ -137,7 +137,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_CollectionData.brs.html b/docs/api/components_data_CollectionData.brs.html index 22dc0d46f..5d2f67aea 100644 --- a/docs/api/components_data_CollectionData.brs.html +++ b/docs/api/components_data_CollectionData.brs.html @@ -33,7 +33,7 @@ @@ -153,7 +153,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_FolderData.brs.html b/docs/api/components_data_FolderData.brs.html index 1fdef6fbf..c307f4927 100644 --- a/docs/api/components_data_FolderData.brs.html +++ b/docs/api/components_data_FolderData.brs.html @@ -33,7 +33,7 @@ @@ -146,7 +146,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_GetFiltersTask.brs.html b/docs/api/components_data_GetFiltersTask.brs.html index d243bcca5..0bde28bdd 100644 --- a/docs/api/components_data_GetFiltersTask.brs.html +++ b/docs/api/components_data_GetFiltersTask.brs.html @@ -33,7 +33,7 @@ @@ -124,7 +124,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_HomeData.brs.html b/docs/api/components_data_HomeData.brs.html index 918e1420f..21eec6b20 100644 --- a/docs/api/components_data_HomeData.brs.html +++ b/docs/api/components_data_HomeData.brs.html @@ -33,7 +33,7 @@ @@ -103,7 +103,7 @@

Source: components/data/HomeData.brs

m.top.iconUrl = "pkg:/images/media_type_icons/folder_white.png" end if - else if datum.type = "Episode" + else if datum.type = "Episode" or datum.type = "MusicVideo" m.top.isWatched = datum.UserData.Played imgParams = {} @@ -144,32 +144,7 @@

Source: components/data/HomeData.brs

m.top.widePosterUrl = ImageURL(datum.Id, "Backdrop", imgParams) end if - else if datum.type = "Movie" - m.top.isWatched = datum.UserData.Played - - imgParams = {} - imgParams.Append({ "maxHeight": 261 }) - imgParams.Append({ "maxWidth": 175 }) - - if datum.ImageTags.Primary <> invalid - param = { "Tag": datum.ImageTags.Primary } - imgParams.Append(param) - end if - - m.top.posterURL = ImageURL(datum.id, "Primary", imgParams) - - ' For wide image, use backdrop - imgParams["maxWidth"] = 464 - - if datum.ImageTags <> invalid and datum.imageTags.Thumb <> invalid - imgParams["Tag"] = datum.imageTags.Thumb - m.top.thumbnailUrl = ImageURL(datum.Id, "Thumb", imgParams) - else if datum.BackdropImageTags[0] <> invalid - imgParams["Tag"] = datum.BackdropImageTags[0] - m.top.thumbnailUrl = ImageURL(datum.id, "Backdrop", imgParams) - end if - - else if datum.type = "Video" + else if datum.type = "Movie" or datum.type = "Video" m.top.isWatched = datum.UserData.Played imgParams = {} @@ -198,14 +173,12 @@

Source: components/data/HomeData.brs

m.top.thumbnailURL = ImageURL(datum.id, "Primary", params) m.top.widePosterUrl = m.top.thumbnailURL m.top.posterUrl = m.top.thumbnailURL - else if datum.type = "TvChannel" or datum.type = "Channel" params = { "Tag": datum.ImageTags.Primary, "maxHeight": 261, "maxWidth": 464 } m.top.thumbnailURL = ImageURL(datum.id, "Primary", params) m.top.widePosterUrl = m.top.thumbnailURL m.top.iconUrl = "pkg:/images/media_type_icons/live_tv_white.png" end if - end sub @@ -250,7 +223,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_ImageData.brs.html b/docs/api/components_data_ImageData.brs.html index ed510d4ca..488b966f8 100644 --- a/docs/api/components_data_ImageData.brs.html +++ b/docs/api/components_data_ImageData.brs.html @@ -33,7 +33,7 @@ @@ -120,7 +120,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_MovieData.brs.html b/docs/api/components_data_MovieData.brs.html index b92bbcc73..586b43942 100644 --- a/docs/api/components_data_MovieData.brs.html +++ b/docs/api/components_data_MovieData.brs.html @@ -33,7 +33,7 @@ @@ -193,7 +193,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_MusicAlbumData.brs.html b/docs/api/components_data_MusicAlbumData.brs.html index b4b7f2480..c841a11d9 100644 --- a/docs/api/components_data_MusicAlbumData.brs.html +++ b/docs/api/components_data_MusicAlbumData.brs.html @@ -33,7 +33,7 @@ @@ -128,7 +128,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_MusicAlbumSongListData.brs.html b/docs/api/components_data_MusicAlbumSongListData.brs.html index 49dfe1c46..81195c433 100644 --- a/docs/api/components_data_MusicAlbumSongListData.brs.html +++ b/docs/api/components_data_MusicAlbumSongListData.brs.html @@ -33,7 +33,7 @@ @@ -149,7 +149,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_MusicArtistData.brs.html b/docs/api/components_data_MusicArtistData.brs.html index ee9d186dd..875acf37e 100644 --- a/docs/api/components_data_MusicArtistData.brs.html +++ b/docs/api/components_data_MusicArtistData.brs.html @@ -33,7 +33,7 @@ @@ -152,7 +152,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_MusicSongData.brs.html b/docs/api/components_data_MusicSongData.brs.html index 99122b01f..a288621fd 100644 --- a/docs/api/components_data_MusicSongData.brs.html +++ b/docs/api/components_data_MusicSongData.brs.html @@ -33,7 +33,7 @@ @@ -130,7 +130,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_OptionsButton.brs.html b/docs/api/components_data_OptionsButton.brs.html index dca6dc6b1..ec4052a91 100644 --- a/docs/api/components_data_OptionsButton.brs.html +++ b/docs/api/components_data_OptionsButton.brs.html @@ -33,7 +33,7 @@ @@ -120,7 +120,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_OptionsData.brs.html b/docs/api/components_data_OptionsData.brs.html index 695494e77..90819efec 100644 --- a/docs/api/components_data_OptionsData.brs.html +++ b/docs/api/components_data_OptionsData.brs.html @@ -33,7 +33,7 @@ @@ -153,7 +153,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_PersonData.brs.html b/docs/api/components_data_PersonData.brs.html index 8e9fd9843..435f5875c 100644 --- a/docs/api/components_data_PersonData.brs.html +++ b/docs/api/components_data_PersonData.brs.html @@ -33,7 +33,7 @@ @@ -149,7 +149,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_PhotoData.brs.html b/docs/api/components_data_PhotoData.brs.html index b8e7ebf09..aadf8a92f 100644 --- a/docs/api/components_data_PhotoData.brs.html +++ b/docs/api/components_data_PhotoData.brs.html @@ -33,7 +33,7 @@ @@ -151,7 +151,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_PlaylistData.brs.html b/docs/api/components_data_PlaylistData.brs.html index 971a0cc5e..781910350 100644 --- a/docs/api/components_data_PlaylistData.brs.html +++ b/docs/api/components_data_PlaylistData.brs.html @@ -33,7 +33,7 @@ @@ -128,7 +128,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_PublicUserData.brs.html b/docs/api/components_data_PublicUserData.brs.html index d80cbb492..15484cf57 100644 --- a/docs/api/components_data_PublicUserData.brs.html +++ b/docs/api/components_data_PublicUserData.brs.html @@ -33,7 +33,7 @@ @@ -115,7 +115,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_SceneManager.brs.html b/docs/api/components_data_SceneManager.brs.html index a0c4946f5..88cc28367 100644 --- a/docs/api/components_data_SceneManager.brs.html +++ b/docs/api/components_data_SceneManager.brs.html @@ -33,7 +33,7 @@ @@ -470,7 +470,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_ScheduleProgramData.brs.html b/docs/api/components_data_ScheduleProgramData.brs.html index 7d1ce47ec..5a707ef3b 100644 --- a/docs/api/components_data_ScheduleProgramData.brs.html +++ b/docs/api/components_data_ScheduleProgramData.brs.html @@ -33,7 +33,7 @@ @@ -160,7 +160,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_SearchData.brs.html b/docs/api/components_data_SearchData.brs.html index 787ccca96..a3b7b3a09 100644 --- a/docs/api/components_data_SearchData.brs.html +++ b/docs/api/components_data_SearchData.brs.html @@ -33,7 +33,7 @@ @@ -128,7 +128,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_SeriesData.brs.html b/docs/api/components_data_SeriesData.brs.html index 8cbb25da8..2ad8eef4e 100644 --- a/docs/api/components_data_SeriesData.brs.html +++ b/docs/api/components_data_SeriesData.brs.html @@ -33,7 +33,7 @@ @@ -166,7 +166,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_TVEpisode.brs.html b/docs/api/components_data_TVEpisode.brs.html index 81db48abb..c57c19408 100644 --- a/docs/api/components_data_TVEpisode.brs.html +++ b/docs/api/components_data_TVEpisode.brs.html @@ -33,7 +33,7 @@ @@ -138,7 +138,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_TVEpisodeData.brs.html b/docs/api/components_data_TVEpisodeData.brs.html index 1d7234198..d1b15e56d 100644 --- a/docs/api/components_data_TVEpisodeData.brs.html +++ b/docs/api/components_data_TVEpisodeData.brs.html @@ -33,7 +33,7 @@ @@ -131,7 +131,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_TVSeasonData.brs.html b/docs/api/components_data_TVSeasonData.brs.html index cd661535a..1ad4401f5 100644 --- a/docs/api/components_data_TVSeasonData.brs.html +++ b/docs/api/components_data_TVSeasonData.brs.html @@ -33,7 +33,7 @@ @@ -131,7 +131,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_UserData.brs.html b/docs/api/components_data_UserData.brs.html index cba5f75ef..058e0a18c 100644 --- a/docs/api/components_data_UserData.brs.html +++ b/docs/api/components_data_UserData.brs.html @@ -33,7 +33,7 @@ @@ -177,7 +177,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_data_VideoData.brs.html b/docs/api/components_data_VideoData.brs.html index 10db6e103..d32f36471 100644 --- a/docs/api/components_data_VideoData.brs.html +++ b/docs/api/components_data_VideoData.brs.html @@ -33,7 +33,7 @@ @@ -138,7 +138,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_extras_ExtrasItem.brs.html b/docs/api/components_extras_ExtrasItem.brs.html index 1d056dc76..b0178b944 100644 --- a/docs/api/components_extras_ExtrasItem.brs.html +++ b/docs/api/components_extras_ExtrasItem.brs.html @@ -33,7 +33,7 @@ @@ -150,7 +150,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_extras_ExtrasRowList.brs.html b/docs/api/components_extras_ExtrasRowList.brs.html index 9297e184b..3ace05ca4 100644 --- a/docs/api/components_extras_ExtrasRowList.brs.html +++ b/docs/api/components_extras_ExtrasRowList.brs.html @@ -33,7 +33,7 @@ @@ -75,6 +75,7 @@

Source: components/extras/ExtrasRowList.brs

updateSize() m.top.rowFocusAnimationStyle = "fixedFocus" m.top.observeField("rowItemSelected", "onRowItemSelected") + m.top.observeField("rowItemFocused", "onRowItemFocused") ' Set up all Tasks m.LoadPeopleTask = CreateObject("roSGNode", "LoadItemsTask") @@ -279,6 +280,10 @@

Source: components/extras/ExtrasRowList.brs

sub onRowItemSelected() m.top.selectedItem = m.top.content.getChild(m.top.rowItemSelected[0]).getChild(m.top.rowItemSelected[1]) end sub + +sub onRowItemFocused() + m.top.focusedItem = m.top.content.getChild(m.top.rowItemFocused[0]).getChild(m.top.rowItemFocused[1]) +end sub @@ -322,7 +327,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_home_Home.brs.html b/docs/api/components_home_Home.brs.html index 843669b39..15fac03ef 100644 --- a/docs/api/components_home_Home.brs.html +++ b/docs/api/components_home_Home.brs.html @@ -33,7 +33,7 @@ @@ -133,7 +133,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_home_HomeItem.brs.html b/docs/api/components_home_HomeItem.brs.html index 884ddb085..b2bd283cf 100644 --- a/docs/api/components_home_HomeItem.brs.html +++ b/docs/api/components_home_HomeItem.brs.html @@ -33,7 +33,7 @@ @@ -102,6 +102,7 @@

Source: components/home/HomeItem.brs

sub itemContentChanged() itemData = m.top.itemContent if itemData = invalid then return + itemData.Title = itemData.name ' Temporarily required while we move from "HomeItem" to "JFContentItem" m.itemPoster.width = itemData.imageWidth @@ -207,7 +208,7 @@

Source: components/home/HomeItem.brs

return end if - if itemData.type = "Movie" + if itemData.type = "Movie" or itemData.type = "MusicVideo" m.itemText.text = itemData.name if itemData.PlayedPercentage > 0 @@ -409,7 +410,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_home_HomeRows.brs.html b/docs/api/components_home_HomeRows.brs.html index 3d40229c4..fa9e7bc0f 100644 --- a/docs/api/components_home_HomeRows.brs.html +++ b/docs/api/components_home_HomeRows.brs.html @@ -33,7 +33,7 @@ @@ -594,21 +594,20 @@

Source: components/home/HomeRows.brs

end sub function onKeyEvent(key as string, press as boolean) as boolean - handled = false if press if key = "play" + print "play was pressed from homerow" itemToPlay = m.top.content.getChild(m.top.rowItemFocused[0]).getChild(m.top.rowItemFocused[1]) - if isValid(itemToPlay) and (itemToPlay.type = "Movie" or itemToPlay.type = "Episode") + if isValid(itemToPlay) m.top.quickPlayNode = itemToPlay end if - handled = true - end if - - if key = "replay" + return true + else if key = "replay" m.top.jumpToRowItem = [m.top.rowItemFocused[0], 0] + return true end if end if - return handled + return false end function function filterNodeArray(nodeArray as object, nodeKey as string, excludeArray as object) as object @@ -671,7 +670,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_home_LoadItemsTask.brs.html b/docs/api/components_home_LoadItemsTask.brs.html index ab7cbc4d1..812dd1ef7 100644 --- a/docs/api/components_home_LoadItemsTask.brs.html +++ b/docs/api/components_home_LoadItemsTask.brs.html @@ -33,7 +33,7 @@ @@ -209,7 +209,8 @@

Source: components/home/LoadItemsTask.brs

if isValid(data) and isValid(data.Items) for each item in data.Items ' Skip Books for now as we don't support it (issue #558) - if item.Type <> "Book" + ' also skip songs since there is limited space + if not (item.Type = "Book" or item.Type = "Audio") tmp = CreateObject("roSGNode", "HomeData") params = {} @@ -380,7 +381,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_liveTv_LoadChannelsTask.brs.html b/docs/api/components_liveTv_LoadChannelsTask.brs.html index d886bbb4b..e259e1529 100644 --- a/docs/api/components_liveTv_LoadChannelsTask.brs.html +++ b/docs/api/components_liveTv_LoadChannelsTask.brs.html @@ -33,7 +33,7 @@ @@ -185,7 +185,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_liveTv_LoadProgramDetailsTask.brs.html b/docs/api/components_liveTv_LoadProgramDetailsTask.brs.html index 3aab0c0f1..960442d00 100644 --- a/docs/api/components_liveTv_LoadProgramDetailsTask.brs.html +++ b/docs/api/components_liveTv_LoadProgramDetailsTask.brs.html @@ -33,7 +33,7 @@ @@ -157,7 +157,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_liveTv_LoadSheduleTask.brs.html b/docs/api/components_liveTv_LoadSheduleTask.brs.html index 6d198bc45..0dd67a290 100644 --- a/docs/api/components_liveTv_LoadSheduleTask.brs.html +++ b/docs/api/components_liveTv_LoadSheduleTask.brs.html @@ -33,7 +33,7 @@ @@ -163,7 +163,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_liveTv_ProgramDetails.brs.html b/docs/api/components_liveTv_ProgramDetails.brs.html index a542950d7..9faf60150 100644 --- a/docs/api/components_liveTv_ProgramDetails.brs.html +++ b/docs/api/components_liveTv_ProgramDetails.brs.html @@ -33,7 +33,7 @@ @@ -487,7 +487,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_liveTv_RecordProgramTask.brs.html b/docs/api/components_liveTv_RecordProgramTask.brs.html index 3bd34d650..63eb96317 100644 --- a/docs/api/components_liveTv_RecordProgramTask.brs.html +++ b/docs/api/components_liveTv_RecordProgramTask.brs.html @@ -33,7 +33,7 @@ @@ -173,7 +173,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_liveTv_schedule.brs.html b/docs/api/components_liveTv_schedule.brs.html index ae7d2c1ca..d5ab81747 100644 --- a/docs/api/components_liveTv_schedule.brs.html +++ b/docs/api/components_liveTv_schedule.brs.html @@ -33,7 +33,7 @@ @@ -418,7 +418,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_login_UserItem.brs.html b/docs/api/components_login_UserItem.brs.html index e812dcf6c..5868e2b09 100644 --- a/docs/api/components_login_UserItem.brs.html +++ b/docs/api/components_login_UserItem.brs.html @@ -33,7 +33,7 @@ @@ -130,7 +130,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_login_UserRow.brs.html b/docs/api/components_login_UserRow.brs.html index ff2df4848..34e0b823a 100644 --- a/docs/api/components_login_UserRow.brs.html +++ b/docs/api/components_login_UserRow.brs.html @@ -33,7 +33,7 @@ @@ -166,7 +166,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_login_UserSelect.brs.html b/docs/api/components_login_UserSelect.brs.html index 6f9be12ad..92ce73206 100644 --- a/docs/api/components_login_UserSelect.brs.html +++ b/docs/api/components_login_UserSelect.brs.html @@ -33,7 +33,7 @@ @@ -154,7 +154,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_manager_QueueManager.brs.html b/docs/api/components_manager_QueueManager.brs.html index 4e4879e0e..ca62ab8bb 100644 --- a/docs/api/components_manager_QueueManager.brs.html +++ b/docs/api/components_manager_QueueManager.brs.html @@ -33,7 +33,7 @@ @@ -83,6 +83,7 @@

Source: components/manager/QueueManager.brs

m.queue = [] m.originalQueue = [] m.queueTypes = [] + m.isPlaying = false ' Preroll videos only play if user has cinema mode setting enabled m.isPrerollActive = m.global.session.user.settings["playback.cinemamode"] m.position = 0 @@ -91,6 +92,7 @@

Source: components/manager/QueueManager.brs

' Clear all content from play queue sub clear() + m.isPlaying = false m.queue = [] m.queueTypes = [] m.isPrerollActive = m.global.session.user.settings["playback.cinemamode"] @@ -183,6 +185,7 @@

Source: components/manager/QueueManager.brs

' Play items in queue sub playQueue() + m.isPlaying = true nextItem = getCurrentItem() if not isValid(nextItem) then return @@ -194,11 +197,21 @@

Source: components/manager/QueueManager.brs

return end if + if nextItemMediaType = "musicvideo" + CreateVideoPlayerView() + return + end if + if nextItemMediaType = "video" CreateVideoPlayerView() return end if + if nextItemMediaType = "movie" + CreateVideoPlayerView() + return + end if + if nextItemMediaType = "episode" CreateVideoPlayerView() return @@ -268,21 +281,25 @@

Source: components/manager/QueueManager.brs

sub shuffleQueueItems() ' By calling getQueue 2 different ways, Roku avoids needing to do a deep copy m.originalQueue = m.global.queueManager.callFunc("getQueue") - songIDArray = getQueue() - - ' Move the currently playing song to the front of the queue - temp = top() - songIDArray[0] = getCurrentItem() - songIDArray[getPosition()] = temp - - for i = 1 to songIDArray.count() - 1 - j = Rnd(songIDArray.count() - 1) - temp = songIDArray[i] - songIDArray[i] = songIDArray[j] - songIDArray[j] = temp - end for + itemIDArray = getQueue() + temp = invalid + + if m.isPlaying + ' Save the currently playing item + temp = getCurrentItem() + ' remove currently playing item from itemIDArray + itemIDArray.Delete(m.position) + end if + + ' shuffle all items + itemIDArray = shuffleArray(itemIDArray) + + if m.isPlaying + ' Put currently playing item in front of itemIDArray + itemIDArray.Unshift(temp) + end if - set(songIDArray) + set(itemIDArray) end sub ' Return the fitst item in the play queue @@ -356,7 +373,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_manager_ViewCreator.brs.html b/docs/api/components_manager_ViewCreator.brs.html index 12d8fe629..6b13c2624 100644 --- a/docs/api/components_manager_ViewCreator.brs.html +++ b/docs/api/components_manager_ViewCreator.brs.html @@ -33,7 +33,7 @@ @@ -301,7 +301,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_mediaPlayers_AudioPlayer.brs.html b/docs/api/components_mediaPlayers_AudioPlayer.brs.html index 0abc71dfc..11c2a4f2c 100644 --- a/docs/api/components_mediaPlayers_AudioPlayer.brs.html +++ b/docs/api/components_mediaPlayers_AudioPlayer.brs.html @@ -33,7 +33,7 @@ @@ -156,7 +156,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_movies_AudioTrackListItem.brs.html b/docs/api/components_movies_AudioTrackListItem.brs.html index 0500d1ddb..2a7f39cb5 100644 --- a/docs/api/components_movies_AudioTrackListItem.brs.html +++ b/docs/api/components_movies_AudioTrackListItem.brs.html @@ -33,7 +33,7 @@ @@ -146,7 +146,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_movies_MovieDetails.brs.html b/docs/api/components_movies_MovieDetails.brs.html index a93d5776e..e4447370c 100644 --- a/docs/api/components_movies_MovieDetails.brs.html +++ b/docs/api/components_movies_MovieDetails.brs.html @@ -33,7 +33,7 @@ @@ -457,6 +457,12 @@

Source: components/movies/MovieDetails.brs

audioOptionsClosed() return true end if + else if key = "play" and m.extrasGrid.hasFocus() + print "Play was pressed from the movie details extras slider" + if m.extrasGrid.focusedItem <> invalid + m.top.quickPlayNode = m.extrasGrid.focusedItem + return true + end if end if return false end function @@ -503,7 +509,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_movies_MovieOptions.brs.html b/docs/api/components_movies_MovieOptions.brs.html index 0080bb6d4..2fcba6f57 100644 --- a/docs/api/components_movies_MovieOptions.brs.html +++ b/docs/api/components_movies_MovieOptions.brs.html @@ -33,7 +33,7 @@ @@ -268,7 +268,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_movies_VideoTrackListItem.brs.html b/docs/api/components_movies_VideoTrackListItem.brs.html index 333dbad3d..c3c843331 100644 --- a/docs/api/components_movies_VideoTrackListItem.brs.html +++ b/docs/api/components_movies_VideoTrackListItem.brs.html @@ -33,7 +33,7 @@ @@ -146,7 +146,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_music_AlbumGrid.brs.html b/docs/api/components_music_AlbumGrid.brs.html index 677903f5a..6598464b6 100644 --- a/docs/api/components_music_AlbumGrid.brs.html +++ b/docs/api/components_music_AlbumGrid.brs.html @@ -33,7 +33,7 @@ @@ -182,7 +182,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_music_AlbumTrackList.brs.html b/docs/api/components_music_AlbumTrackList.brs.html index 4ad14b0cf..e2bf83554 100644 --- a/docs/api/components_music_AlbumTrackList.brs.html +++ b/docs/api/components_music_AlbumTrackList.brs.html @@ -33,7 +33,7 @@ @@ -138,7 +138,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_music_AlbumView.brs.html b/docs/api/components_music_AlbumView.brs.html index ae75747a8..9e28da652 100644 --- a/docs/api/components_music_AlbumView.brs.html +++ b/docs/api/components_music_AlbumView.brs.html @@ -33,7 +33,7 @@ @@ -290,7 +290,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_music_ArtistView.brs.html b/docs/api/components_music_ArtistView.brs.html index fb9ff991d..9ee82a649 100644 --- a/docs/api/components_music_ArtistView.brs.html +++ b/docs/api/components_music_ArtistView.brs.html @@ -33,7 +33,7 @@ @@ -385,6 +385,22 @@

Source: components/music/ArtistView.brs

end if end if + if key = "play" + print "play button pressed from ArtistView" + itemToPlay = invalid + + if isValid(m.albums) and m.albums.isInFocusChain() + itemToPlay = m.albums.MusicArtistAlbumData.items[m.albums.itemFocused] + else if isValid(m.appearsOn) and m.appearsOn.isInFocusChain() + itemToPlay = m.appearsOn.MusicArtistAlbumData.items[m.appearsOn.itemFocused] + end if + + if isValid(itemToPlay) + m.top.quickPlayNode = itemToPlay + return true + end if + end if + return false end function @@ -430,7 +446,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_music_AudioPlayerView.brs.html b/docs/api/components_music_AudioPlayerView.brs.html index ce0100057..b174dd0a3 100644 --- a/docs/api/components_music_AudioPlayerView.brs.html +++ b/docs/api/components_music_AudioPlayerView.brs.html @@ -33,7 +33,7 @@ @@ -711,7 +711,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_music_LoadScreenSaverTimeoutTask.brs.html b/docs/api/components_music_LoadScreenSaverTimeoutTask.brs.html index cbe633c6e..80f6a85be 100644 --- a/docs/api/components_music_LoadScreenSaverTimeoutTask.brs.html +++ b/docs/api/components_music_LoadScreenSaverTimeoutTask.brs.html @@ -33,7 +33,7 @@ @@ -121,7 +121,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_music_PlaylistView.brs.html b/docs/api/components_music_PlaylistView.brs.html index 1a4fafa29..22da18a81 100644 --- a/docs/api/components_music_PlaylistView.brs.html +++ b/docs/api/components_music_PlaylistView.brs.html @@ -33,7 +33,7 @@ @@ -281,7 +281,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_music_SongItem.brs.html b/docs/api/components_music_SongItem.brs.html index 607277d56..cac9ef6f5 100644 --- a/docs/api/components_music_SongItem.brs.html +++ b/docs/api/components_music_SongItem.brs.html @@ -33,7 +33,7 @@ @@ -144,7 +144,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_options_OptionNode.brs.html b/docs/api/components_options_OptionNode.brs.html index 264799b14..90696c369 100644 --- a/docs/api/components_options_OptionNode.brs.html +++ b/docs/api/components_options_OptionNode.brs.html @@ -33,7 +33,7 @@ @@ -115,7 +115,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_options_OptionsSlider.brs.html b/docs/api/components_options_OptionsSlider.brs.html index 7b1648890..eaa313adc 100644 --- a/docs/api/components_options_OptionsSlider.brs.html +++ b/docs/api/components_options_OptionsSlider.brs.html @@ -33,7 +33,7 @@ @@ -154,7 +154,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_photos_LoadPhotoTask.brs.html b/docs/api/components_photos_LoadPhotoTask.brs.html index cc2150a7a..4c4ff1207 100644 --- a/docs/api/components_photos_LoadPhotoTask.brs.html +++ b/docs/api/components_photos_LoadPhotoTask.brs.html @@ -33,7 +33,7 @@ @@ -133,7 +133,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_photos_PhotoDetails.brs.html b/docs/api/components_photos_PhotoDetails.brs.html index d82c11759..3ac9bcf4f 100644 --- a/docs/api/components_photos_PhotoDetails.brs.html +++ b/docs/api/components_photos_PhotoDetails.brs.html @@ -33,7 +33,7 @@ @@ -239,7 +239,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_quickConnect_QuickConnect.brs.html b/docs/api/components_quickConnect_QuickConnect.brs.html index 183ec26e1..34b630718 100644 --- a/docs/api/components_quickConnect_QuickConnect.brs.html +++ b/docs/api/components_quickConnect_QuickConnect.brs.html @@ -33,7 +33,7 @@ @@ -130,7 +130,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_quickConnect_QuickConnectDialog.brs.html b/docs/api/components_quickConnect_QuickConnectDialog.brs.html index cae74f1ad..b238adf6b 100644 --- a/docs/api/components_quickConnect_QuickConnectDialog.brs.html +++ b/docs/api/components_quickConnect_QuickConnectDialog.brs.html @@ -33,7 +33,7 @@ @@ -184,7 +184,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_search_SearchResults.brs.html b/docs/api/components_search_SearchResults.brs.html index 86e20d44b..ab0d6845e 100644 --- a/docs/api/components_search_SearchResults.brs.html +++ b/docs/api/components_search_SearchResults.brs.html @@ -33,7 +33,7 @@ @@ -179,7 +179,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_search_SearchRow.brs.html b/docs/api/components_search_SearchRow.brs.html index a99c23022..61d978d2b 100644 --- a/docs/api/components_search_SearchRow.brs.html +++ b/docs/api/components_search_SearchRow.brs.html @@ -33,7 +33,7 @@ @@ -208,7 +208,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_search_SearchTask.brs.html b/docs/api/components_search_SearchTask.brs.html index 81de57d6d..7b7fa88e5 100644 --- a/docs/api/components_search_SearchTask.brs.html +++ b/docs/api/components_search_SearchTask.brs.html @@ -33,7 +33,7 @@ @@ -128,7 +128,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_section_section.brs.html b/docs/api/components_section_section.brs.html index e18634494..931aae651 100644 --- a/docs/api/components_section_section.brs.html +++ b/docs/api/components_section_section.brs.html @@ -33,7 +33,7 @@ @@ -210,7 +210,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_section_sectionScroller.brs.html b/docs/api/components_section_sectionScroller.brs.html index 2b35c4167..78c7b3494 100644 --- a/docs/api/components_section_sectionScroller.brs.html +++ b/docs/api/components_section_sectionScroller.brs.html @@ -33,7 +33,7 @@ @@ -173,7 +173,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_settings_settings.brs.html b/docs/api/components_settings_settings.brs.html index cf08b27d0..d2d7516d0 100644 --- a/docs/api/components_settings_settings.brs.html +++ b/docs/api/components_settings_settings.brs.html @@ -33,7 +33,7 @@ @@ -342,7 +342,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_tvshows_TVEpisodeRow.brs.html b/docs/api/components_tvshows_TVEpisodeRow.brs.html index bf85ab1ed..ee708022c 100644 --- a/docs/api/components_tvshows_TVEpisodeRow.brs.html +++ b/docs/api/components_tvshows_TVEpisodeRow.brs.html @@ -33,7 +33,7 @@ @@ -175,7 +175,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_tvshows_TVEpisodeRowWithOptions.brs.html b/docs/api/components_tvshows_TVEpisodeRowWithOptions.brs.html index e8f2bdaf1..d62626ed2 100644 --- a/docs/api/components_tvshows_TVEpisodeRowWithOptions.brs.html +++ b/docs/api/components_tvshows_TVEpisodeRowWithOptions.brs.html @@ -33,7 +33,7 @@ @@ -236,7 +236,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_tvshows_TVEpisodes.brs.html b/docs/api/components_tvshows_TVEpisodes.brs.html index 65cef3d9a..e61dd2ec6 100644 --- a/docs/api/components_tvshows_TVEpisodes.brs.html +++ b/docs/api/components_tvshows_TVEpisodes.brs.html @@ -33,7 +33,7 @@ @@ -231,7 +231,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_tvshows_TVListDetails.brs.html b/docs/api/components_tvshows_TVListDetails.brs.html index 92a7b0a0b..254a5769f 100644 --- a/docs/api/components_tvshows_TVListDetails.brs.html +++ b/docs/api/components_tvshows_TVListDetails.brs.html @@ -33,7 +33,7 @@ @@ -304,7 +304,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_tvshows_TVListOptions.brs.html b/docs/api/components_tvshows_TVListOptions.brs.html index ea7404ef6..03f3f0b6e 100644 --- a/docs/api/components_tvshows_TVListOptions.brs.html +++ b/docs/api/components_tvshows_TVListOptions.brs.html @@ -33,7 +33,7 @@ @@ -267,7 +267,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_tvshows_TVSeasonRow.brs.html b/docs/api/components_tvshows_TVSeasonRow.brs.html index 8d4cc1388..b0904477c 100644 --- a/docs/api/components_tvshows_TVSeasonRow.brs.html +++ b/docs/api/components_tvshows_TVSeasonRow.brs.html @@ -33,7 +33,7 @@ @@ -161,7 +161,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_tvshows_TVShowDescription.brs.html b/docs/api/components_tvshows_TVShowDescription.brs.html index 431c85c60..75519e2c7 100644 --- a/docs/api/components_tvshows_TVShowDescription.brs.html +++ b/docs/api/components_tvshows_TVShowDescription.brs.html @@ -33,7 +33,7 @@ @@ -245,7 +245,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_tvshows_TVShowDetails.brs.html b/docs/api/components_tvshows_TVShowDetails.brs.html index 1705eab11..608c238a5 100644 --- a/docs/api/components_tvshows_TVShowDetails.brs.html +++ b/docs/api/components_tvshows_TVShowDetails.brs.html @@ -33,7 +33,7 @@ @@ -83,6 +83,7 @@

Source: components/tvshows/TVShowDetails.brs

m.getShuffleEpisodesTask = createObject("roSGNode", "getShuffleEpisodesTask") m.Shuffle = m.top.findNode("Shuffle") m.extrasSlider.visible = true + m.seasons = m.top.findNode("seasons") end sub sub itemContentChanged() @@ -295,6 +296,20 @@

Source: components/tvshows/TVShowDetails.brs

else if key = "up" and m.Shuffle.hasFocus() overview.setFocus(true) return true + else if key = "play" and m.seasons.hasFocus() + print "play was pressed from the seasons row" + if isValid(m.seasons.TVSeasonData) and isValid(m.seasons.TVSeasonData.Items) + itemFocused = m.seasons.rowItemFocused + m.top.quickPlayNode = m.seasons.TVSeasonData.Items[itemFocused[1]] + return true + end if + else if key = "play" and m.extrasSlider.isInFocusChain() + print "play was pressed from the extras grid" + extrasGrid = m.top.findNode("extrasGrid") + if extrasGrid.focusedItem <> invalid + m.top.quickPlayNode = extrasGrid.focusedItem + return true + end if end if return false @@ -342,7 +357,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/components_video_VideoPlayerView.brs.html b/docs/api/components_video_VideoPlayerView.brs.html index 40de00f99..d83151e11 100644 --- a/docs/api/components_video_VideoPlayerView.brs.html +++ b/docs/api/components_video_VideoPlayerView.brs.html @@ -33,7 +33,7 @@ @@ -517,7 +517,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/index.html b/docs/api/index.html index 48af3d83c..86451ad57 100644 --- a/docs/api/index.html +++ b/docs/api/index.html @@ -33,7 +33,7 @@ @@ -149,7 +149,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-AlbumData.html b/docs/api/module-AlbumData.html index c5c98589e..ff1039c34 100644 --- a/docs/api/module-AlbumData.html +++ b/docs/api/module-AlbumData.html @@ -33,7 +33,7 @@ @@ -303,7 +303,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-AlbumGrid.html b/docs/api/module-AlbumGrid.html index c2387c4a7..242e666f5 100644 --- a/docs/api/module-AlbumGrid.html +++ b/docs/api/module-AlbumGrid.html @@ -33,7 +33,7 @@ @@ -585,7 +585,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-AlbumTrackList.html b/docs/api/module-AlbumTrackList.html index f28625d26..c1ba50503 100644 --- a/docs/api/module-AlbumTrackList.html +++ b/docs/api/module-AlbumTrackList.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-AlbumView.html b/docs/api/module-AlbumView.html index 119befe50..15a62f98f 100644 --- a/docs/api/module-AlbumView.html +++ b/docs/api/module-AlbumView.html @@ -33,7 +33,7 @@ @@ -1691,7 +1691,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-Alpha.html b/docs/api/module-Alpha.html index b51c1572b..61e876ce2 100644 --- a/docs/api/module-Alpha.html +++ b/docs/api/module-Alpha.html @@ -33,7 +33,7 @@ @@ -481,7 +481,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ArtistView.html b/docs/api/module-ArtistView.html index 910edec63..01d9370c6 100644 --- a/docs/api/module-ArtistView.html +++ b/docs/api/module-ArtistView.html @@ -33,7 +33,7 @@ @@ -2939,7 +2939,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-AudioPlayer.html b/docs/api/module-AudioPlayer.html index c8f80e97c..5a43959b6 100644 --- a/docs/api/module-AudioPlayer.html +++ b/docs/api/module-AudioPlayer.html @@ -33,7 +33,7 @@ @@ -569,7 +569,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-AudioPlayerView.html b/docs/api/module-AudioPlayerView.html index 8f5376f38..8e0045096 100644 --- a/docs/api/module-AudioPlayerView.html +++ b/docs/api/module-AudioPlayerView.html @@ -33,7 +33,7 @@ @@ -4519,7 +4519,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-AudioTrackListItem.html b/docs/api/module-AudioTrackListItem.html index 485d291fe..908072b32 100644 --- a/docs/api/module-AudioTrackListItem.html +++ b/docs/api/module-AudioTrackListItem.html @@ -33,7 +33,7 @@ @@ -515,7 +515,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ButtonGroupHoriz.html b/docs/api/module-ButtonGroupHoriz.html index 49ad403a0..32eb7dce1 100644 --- a/docs/api/module-ButtonGroupHoriz.html +++ b/docs/api/module-ButtonGroupHoriz.html @@ -33,7 +33,7 @@ @@ -481,7 +481,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ChannelData.html b/docs/api/module-ChannelData.html index 59e1590ff..c430e39c1 100644 --- a/docs/api/module-ChannelData.html +++ b/docs/api/module-ChannelData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-CollectionData.html b/docs/api/module-CollectionData.html index 0a02750a1..1581d0da0 100644 --- a/docs/api/module-CollectionData.html +++ b/docs/api/module-CollectionData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ConfigData.html b/docs/api/module-ConfigData.html index 798f2bdce..6680717db 100644 --- a/docs/api/module-ConfigData.html +++ b/docs/api/module-ConfigData.html @@ -33,7 +33,7 @@ @@ -303,7 +303,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ConfigItem.html b/docs/api/module-ConfigItem.html index ae5cdf556..975015216 100644 --- a/docs/api/module-ConfigItem.html +++ b/docs/api/module-ConfigItem.html @@ -33,7 +33,7 @@ @@ -511,7 +511,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ConfigList.html b/docs/api/module-ConfigList.html index 11c222627..ff290a1e3 100644 --- a/docs/api/module-ConfigList.html +++ b/docs/api/module-ConfigList.html @@ -33,7 +33,7 @@ @@ -873,7 +873,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ExtrasItem.html b/docs/api/module-ExtrasItem.html index 3a370936b..8db6cccf3 100644 --- a/docs/api/module-ExtrasItem.html +++ b/docs/api/module-ExtrasItem.html @@ -33,7 +33,7 @@ @@ -511,7 +511,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ExtrasRowList.html b/docs/api/module-ExtrasRowList.html index 9413e50d5..2da3ee730 100644 --- a/docs/api/module-ExtrasRowList.html +++ b/docs/api/module-ExtrasRowList.html @@ -33,7 +33,7 @@ @@ -1351,6 +1351,110 @@

<static> < +
Returns:
+ + + + +
+
+ Type +
+
+ +void + + + +
+
+ + + + + + + + + +
+
+

<static> onRowItemFocused()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + +
Returns:
@@ -1947,7 +2051,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-FavoriteItemsTask.html b/docs/api/module-FavoriteItemsTask.html index 1cfb04a29..13d9715d4 100644 --- a/docs/api/module-FavoriteItemsTask.html +++ b/docs/api/module-FavoriteItemsTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-FolderData.html b/docs/api/module-FolderData.html index 83cf0531b..387261898 100644 --- a/docs/api/module-FolderData.html +++ b/docs/api/module-FolderData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-GetFiltersTask.html b/docs/api/module-GetFiltersTask.html index 253dbffab..eb962e2d8 100644 --- a/docs/api/module-GetFiltersTask.html +++ b/docs/api/module-GetFiltersTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-GetNextEpisodeTask.html b/docs/api/module-GetNextEpisodeTask.html index af309b5ee..782aa904f 100644 --- a/docs/api/module-GetNextEpisodeTask.html +++ b/docs/api/module-GetNextEpisodeTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-GetPlaybackInfoTask.html b/docs/api/module-GetPlaybackInfoTask.html index 13d4f166f..ddea5ed2b 100644 --- a/docs/api/module-GetPlaybackInfoTask.html +++ b/docs/api/module-GetPlaybackInfoTask.html @@ -33,7 +33,7 @@ @@ -1114,7 +1114,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-GetShuffleEpisodesTask.html b/docs/api/module-GetShuffleEpisodesTask.html index 750809f46..417895a57 100644 --- a/docs/api/module-GetShuffleEpisodesTask.html +++ b/docs/api/module-GetShuffleEpisodesTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-GridItem.html b/docs/api/module-GridItem.html index 4de2fee40..808194b9a 100644 --- a/docs/api/module-GridItem.html +++ b/docs/api/module-GridItem.html @@ -33,7 +33,7 @@ @@ -731,7 +731,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-GridItemSmall.html b/docs/api/module-GridItemSmall.html index 14017959b..c197a5141 100644 --- a/docs/api/module-GridItemSmall.html +++ b/docs/api/module-GridItemSmall.html @@ -33,7 +33,7 @@ @@ -619,7 +619,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-Home.html b/docs/api/module-Home.html index 9fdcbeeb9..c92e7a22e 100644 --- a/docs/api/module-Home.html +++ b/docs/api/module-Home.html @@ -33,7 +33,7 @@ @@ -511,7 +511,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-HomeData.html b/docs/api/module-HomeData.html index 39a368b4b..5201834b4 100644 --- a/docs/api/module-HomeData.html +++ b/docs/api/module-HomeData.html @@ -33,7 +33,7 @@ @@ -303,7 +303,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-HomeItem.html b/docs/api/module-HomeItem.html index 14c46ae1c..5b839edf3 100644 --- a/docs/api/module-HomeItem.html +++ b/docs/api/module-HomeItem.html @@ -33,7 +33,7 @@ @@ -781,7 +781,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-HomeRows.html b/docs/api/module-HomeRows.html index 4d2d9adcb..d254254b0 100644 --- a/docs/api/module-HomeRows.html +++ b/docs/api/module-HomeRows.html @@ -33,7 +33,7 @@ @@ -3592,7 +3592,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-IconButton.html b/docs/api/module-IconButton.html index bc20c3895..7c3c03bfe 100644 --- a/docs/api/module-IconButton.html +++ b/docs/api/module-IconButton.html @@ -33,7 +33,7 @@ @@ -1313,7 +1313,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-Image.html b/docs/api/module-Image.html index fe69f6030..e7640507c 100644 --- a/docs/api/module-Image.html +++ b/docs/api/module-Image.html @@ -33,7 +33,7 @@ @@ -1083,7 +1083,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ImageData.html b/docs/api/module-ImageData.html index f8c4b6cc5..a9d2ab015 100644 --- a/docs/api/module-ImageData.html +++ b/docs/api/module-ImageData.html @@ -33,7 +33,7 @@ @@ -303,7 +303,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ItemGrid.html b/docs/api/module-ItemGrid.html index 7f3ef40bf..869909bee 100644 --- a/docs/api/module-ItemGrid.html +++ b/docs/api/module-ItemGrid.html @@ -33,7 +33,7 @@ @@ -677,6 +677,114 @@
Returns:
+
+ + + +
+
+

<static> getItemFocused()

+ + +
+
+ + +
+

Returns Focused Item

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +dynamic + + + +
+
+ + + + +
@@ -2154,7 +2262,7 @@
Parameters:
@@ -3788,7 +3896,7 @@

<static>
  • components/ItemGrid/ItemGrid.brs, - line 215 + line 222
  • @@ -3889,7 +3997,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ItemGridOptions.html b/docs/api/module-ItemGridOptions.html index 592577b13..ea369f6ac 100644 --- a/docs/api/module-ItemGridOptions.html +++ b/docs/api/module-ItemGridOptions.html @@ -33,7 +33,7 @@ @@ -1525,7 +1525,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-Items.html b/docs/api/module-Items.html index 6a9d13f3b..72ca042f0 100644 --- a/docs/api/module-Items.html +++ b/docs/api/module-Items.html @@ -33,7 +33,7 @@ @@ -572,7 +572,7 @@
    Parameters:
    @@ -726,7 +726,7 @@
    Parameters:
    @@ -880,7 +880,7 @@
    Parameters:
    @@ -1038,7 +1038,7 @@
    Parameters:
    @@ -1196,7 +1196,7 @@
    Parameters:
    @@ -1354,7 +1354,7 @@
    Parameters:
    @@ -1407,7 +1407,7 @@
    Returns:

    -

    <static> GetSongsByArtist(id)

    +

    <static> GetSongsByArtist(id [, params])

    @@ -1438,8 +1438,12 @@
    Parameters:
    Type + Argument + + Default + Description @@ -1464,7 +1468,59 @@
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + params + + + + +object + + + + + + + + + + <optional>
    + + + + + + + + + + + + {} + + @@ -1512,7 +1568,7 @@
    Parameters:
    @@ -2526,7 +2582,7 @@
    Parameters:
    @@ -2684,7 +2740,7 @@
    Parameters:
    @@ -2838,7 +2894,7 @@
    Parameters:
    @@ -3021,7 +3077,7 @@
    Parameters:
    @@ -3180,7 +3236,7 @@
    Parameters:
    @@ -3338,7 +3394,7 @@
    Parameters:
    @@ -3650,7 +3706,7 @@
    Parameters:
    @@ -3751,7 +3807,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-JFButton.html b/docs/api/module-JFButton.html index 6e981a70f..07adea2b9 100644 --- a/docs/api/module-JFButton.html +++ b/docs/api/module-JFButton.html @@ -33,7 +33,7 @@ @@ -411,7 +411,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-JFButtons.html b/docs/api/module-JFButtons.html index 8452dce1f..c62a0a5fb 100644 --- a/docs/api/module-JFButtons.html +++ b/docs/api/module-JFButtons.html @@ -33,7 +33,7 @@ @@ -1227,7 +1227,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-JFGroup.html b/docs/api/module-JFGroup.html index acdc1a7df..a59626c7c 100644 --- a/docs/api/module-JFGroup.html +++ b/docs/api/module-JFGroup.html @@ -33,7 +33,7 @@ @@ -481,7 +481,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-JFMessageDialog.html b/docs/api/module-JFMessageDialog.html index 44e08a94b..5ad95b620 100644 --- a/docs/api/module-JFMessageDialog.html +++ b/docs/api/module-JFMessageDialog.html @@ -33,7 +33,7 @@ @@ -793,7 +793,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-JFOverhang.html b/docs/api/module-JFOverhang.html index 8b4ae203c..ccde67cdd 100644 --- a/docs/api/module-JFOverhang.html +++ b/docs/api/module-JFOverhang.html @@ -33,7 +33,7 @@ @@ -1239,7 +1239,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-JFScene.html b/docs/api/module-JFScene.html index 1f84e7822..aa5f7b14c 100644 --- a/docs/api/module-JFScene.html +++ b/docs/api/module-JFScene.html @@ -33,7 +33,7 @@ @@ -481,7 +481,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-JFScreen.html b/docs/api/module-JFScreen.html index d90316203..30864b3b1 100644 --- a/docs/api/module-JFScreen.html +++ b/docs/api/module-JFScreen.html @@ -33,7 +33,7 @@ @@ -523,7 +523,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-JFServer.html b/docs/api/module-JFServer.html index f079656f2..3be8d6257 100644 --- a/docs/api/module-JFServer.html +++ b/docs/api/module-JFServer.html @@ -33,7 +33,7 @@ @@ -715,7 +715,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-JFVideo.html b/docs/api/module-JFVideo.html index 6bc93c783..65f68af5b 100644 --- a/docs/api/module-JFVideo.html +++ b/docs/api/module-JFVideo.html @@ -33,7 +33,7 @@ @@ -2143,7 +2143,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ListPoster.html b/docs/api/module-ListPoster.html index 724607a4c..e458ecc01 100644 --- a/docs/api/module-ListPoster.html +++ b/docs/api/module-ListPoster.html @@ -33,7 +33,7 @@ @@ -619,7 +619,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-LoadChannelsTask.html b/docs/api/module-LoadChannelsTask.html index fd53fd74f..2661149d1 100644 --- a/docs/api/module-LoadChannelsTask.html +++ b/docs/api/module-LoadChannelsTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-LoadItemsTask.html b/docs/api/module-LoadItemsTask.html index 6d8a826a6..12f6e88cf 100644 --- a/docs/api/module-LoadItemsTask.html +++ b/docs/api/module-LoadItemsTask.html @@ -33,7 +33,7 @@ @@ -609,7 +609,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-LoadItemsTask2.html b/docs/api/module-LoadItemsTask2.html index c36414503..936d6f2df 100644 --- a/docs/api/module-LoadItemsTask2.html +++ b/docs/api/module-LoadItemsTask2.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-LoadPhotoTask.html b/docs/api/module-LoadPhotoTask.html index 3bc4dc4f9..da8a8276c 100644 --- a/docs/api/module-LoadPhotoTask.html +++ b/docs/api/module-LoadPhotoTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-LoadProgramDetailsTask.html b/docs/api/module-LoadProgramDetailsTask.html index 0ed872367..f2efe1e4a 100644 --- a/docs/api/module-LoadProgramDetailsTask.html +++ b/docs/api/module-LoadProgramDetailsTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-LoadScreenSaverTimeoutTask.html b/docs/api/module-LoadScreenSaverTimeoutTask.html index 9df9c3383..c4a9519a4 100644 --- a/docs/api/module-LoadScreenSaverTimeoutTask.html +++ b/docs/api/module-LoadScreenSaverTimeoutTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-LoadSheduleTask.html b/docs/api/module-LoadSheduleTask.html index f5f6b3d08..11b2fa9d9 100644 --- a/docs/api/module-LoadSheduleTask.html +++ b/docs/api/module-LoadSheduleTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-LoadVideoContentTask.html b/docs/api/module-LoadVideoContentTask.html index 785642b9e..bdfb98abd 100644 --- a/docs/api/module-LoadVideoContentTask.html +++ b/docs/api/module-LoadVideoContentTask.html @@ -33,7 +33,7 @@ @@ -2537,7 +2537,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-LoginScene.html b/docs/api/module-LoginScene.html index 3b8e1764b..6d1a5c210 100644 --- a/docs/api/module-LoginScene.html +++ b/docs/api/module-LoginScene.html @@ -33,7 +33,7 @@ @@ -481,7 +481,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-Main.html b/docs/api/module-Main.html index 784de4f7a..cd0568b5e 100644 --- a/docs/api/module-Main.html +++ b/docs/api/module-Main.html @@ -33,7 +33,7 @@ @@ -353,7 +353,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-MovieData.html b/docs/api/module-MovieData.html index 61536c309..32e17eb46 100644 --- a/docs/api/module-MovieData.html +++ b/docs/api/module-MovieData.html @@ -33,7 +33,7 @@ @@ -511,7 +511,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-MovieDetails.html b/docs/api/module-MovieDetails.html index c3ad0a5ba..1fbac1aa2 100644 --- a/docs/api/module-MovieDetails.html +++ b/docs/api/module-MovieDetails.html @@ -33,7 +33,7 @@ @@ -2219,7 +2219,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-MovieLibraryView.html b/docs/api/module-MovieLibraryView.html index 6514c4858..aa5a3104e 100644 --- a/docs/api/module-MovieLibraryView.html +++ b/docs/api/module-MovieLibraryView.html @@ -33,7 +33,7 @@ @@ -4483,7 +4483,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-MovieOptions.html b/docs/api/module-MovieOptions.html index 60de765d8..7ebf088a4 100644 --- a/docs/api/module-MovieOptions.html +++ b/docs/api/module-MovieOptions.html @@ -33,7 +33,7 @@ @@ -693,7 +693,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-MusicAlbumData.html b/docs/api/module-MusicAlbumData.html index 682278230..c7e2656fd 100644 --- a/docs/api/module-MusicAlbumData.html +++ b/docs/api/module-MusicAlbumData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-MusicAlbumSongListData.html b/docs/api/module-MusicAlbumSongListData.html index 0cc936420..4f669c651 100644 --- a/docs/api/module-MusicAlbumSongListData.html +++ b/docs/api/module-MusicAlbumSongListData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-MusicArtistData.html b/docs/api/module-MusicArtistData.html index 414a06ade..becd8aa29 100644 --- a/docs/api/module-MusicArtistData.html +++ b/docs/api/module-MusicArtistData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-MusicArtistGridItem.html b/docs/api/module-MusicArtistGridItem.html index 6fea3fd2c..f5043a30b 100644 --- a/docs/api/module-MusicArtistGridItem.html +++ b/docs/api/module-MusicArtistGridItem.html @@ -33,7 +33,7 @@ @@ -623,7 +623,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-MusicLibraryView.html b/docs/api/module-MusicLibraryView.html index 16add94b7..0c9eaa695 100644 --- a/docs/api/module-MusicLibraryView.html +++ b/docs/api/module-MusicLibraryView.html @@ -33,7 +33,7 @@ @@ -4075,7 +4075,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-MusicSongData.html b/docs/api/module-MusicSongData.html index 140889562..454726bdf 100644 --- a/docs/api/module-MusicSongData.html +++ b/docs/api/module-MusicSongData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-OptionNode.html b/docs/api/module-OptionNode.html index b733c9057..6bf4b3b12 100644 --- a/docs/api/module-OptionNode.html +++ b/docs/api/module-OptionNode.html @@ -33,7 +33,7 @@ @@ -303,7 +303,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-OptionsButton.html b/docs/api/module-OptionsButton.html index 367e4fd0d..2207fe208 100644 --- a/docs/api/module-OptionsButton.html +++ b/docs/api/module-OptionsButton.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-OptionsData.html b/docs/api/module-OptionsData.html index 1b83607ed..f0870eda2 100644 --- a/docs/api/module-OptionsData.html +++ b/docs/api/module-OptionsData.html @@ -33,7 +33,7 @@ @@ -511,7 +511,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-OptionsSlider.html b/docs/api/module-OptionsSlider.html index 89282475e..f7db9d1fc 100644 --- a/docs/api/module-OptionsSlider.html +++ b/docs/api/module-OptionsSlider.html @@ -33,7 +33,7 @@ @@ -585,7 +585,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-OverviewDialog.html b/docs/api/module-OverviewDialog.html index 3d2b20004..58218c62e 100644 --- a/docs/api/module-OverviewDialog.html +++ b/docs/api/module-OverviewDialog.html @@ -33,7 +33,7 @@ @@ -585,7 +585,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-PersonData.html b/docs/api/module-PersonData.html index c727f17f5..cccbe9b8c 100644 --- a/docs/api/module-PersonData.html +++ b/docs/api/module-PersonData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-PersonDetails.html b/docs/api/module-PersonDetails.html index c738e0cd0..810658f42 100644 --- a/docs/api/module-PersonDetails.html +++ b/docs/api/module-PersonDetails.html @@ -33,7 +33,7 @@ @@ -1259,7 +1259,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-PhotoData.html b/docs/api/module-PhotoData.html index c0fa64d2f..3cce6dd6a 100644 --- a/docs/api/module-PhotoData.html +++ b/docs/api/module-PhotoData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-PhotoDetails.html b/docs/api/module-PhotoDetails.html index 2bc6bf66c..f4cab694e 100644 --- a/docs/api/module-PhotoDetails.html +++ b/docs/api/module-PhotoDetails.html @@ -33,7 +33,7 @@ @@ -1051,7 +1051,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-PlaybackDialog.html b/docs/api/module-PlaybackDialog.html index 9d90a523b..cedfae67c 100644 --- a/docs/api/module-PlaybackDialog.html +++ b/docs/api/module-PlaybackDialog.html @@ -33,7 +33,7 @@ @@ -377,7 +377,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-PlayedCheckmark.html b/docs/api/module-PlayedCheckmark.html index ccc216575..c47213879 100644 --- a/docs/api/module-PlayedCheckmark.html +++ b/docs/api/module-PlayedCheckmark.html @@ -33,7 +33,7 @@ @@ -303,7 +303,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-PlaylistData.html b/docs/api/module-PlaylistData.html index 9cda827aa..11f751ba5 100644 --- a/docs/api/module-PlaylistData.html +++ b/docs/api/module-PlaylistData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-PlaylistView.html b/docs/api/module-PlaylistView.html index 45a8914ab..ce9c52bd2 100644 --- a/docs/api/module-PlaylistView.html +++ b/docs/api/module-PlaylistView.html @@ -33,7 +33,7 @@ @@ -1691,7 +1691,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-PlaystateTask.html b/docs/api/module-PlaystateTask.html index 2133b0016..77da08cce 100644 --- a/docs/api/module-PlaystateTask.html +++ b/docs/api/module-PlaystateTask.html @@ -33,7 +33,7 @@ @@ -581,7 +581,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ProgramDetails.html b/docs/api/module-ProgramDetails.html index d3bb6bbd7..d0fb73f16 100644 --- a/docs/api/module-ProgramDetails.html +++ b/docs/api/module-ProgramDetails.html @@ -33,7 +33,7 @@ @@ -1539,7 +1539,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-PublicUserData.html b/docs/api/module-PublicUserData.html index cbba768c0..4e4a90d8b 100644 --- a/docs/api/module-PublicUserData.html +++ b/docs/api/module-PublicUserData.html @@ -33,7 +33,7 @@ @@ -303,7 +303,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-QueueManager.html b/docs/api/module-QueueManager.html index 22f7b68ef..6237b2f06 100644 --- a/docs/api/module-QueueManager.html +++ b/docs/api/module-QueueManager.html @@ -33,7 +33,7 @@ @@ -4097,7 +4097,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-QuickConnect.html b/docs/api/module-QuickConnect.html index 810a59a58..0d3b753ba 100644 --- a/docs/api/module-QuickConnect.html +++ b/docs/api/module-QuickConnect.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-QuickConnectDialog.html b/docs/api/module-QuickConnectDialog.html index 11db5dd3a..837ab0cc2 100644 --- a/docs/api/module-QuickConnectDialog.html +++ b/docs/api/module-QuickConnectDialog.html @@ -33,7 +33,7 @@ @@ -897,7 +897,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-RadioDialog.html b/docs/api/module-RadioDialog.html index f7b30a38a..34b8c4fc5 100644 --- a/docs/api/module-RadioDialog.html +++ b/docs/api/module-RadioDialog.html @@ -33,7 +33,7 @@ @@ -1125,7 +1125,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-RecordProgramTask.html b/docs/api/module-RecordProgramTask.html index ad14f2f6e..2d8dce792 100644 --- a/docs/api/module-RecordProgramTask.html +++ b/docs/api/module-RecordProgramTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-SceneManager.html b/docs/api/module-SceneManager.html index 95e1cda0f..fd3ad4f4e 100644 --- a/docs/api/module-SceneManager.html +++ b/docs/api/module-SceneManager.html @@ -33,7 +33,7 @@ @@ -3369,7 +3369,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ScheduleProgramData.html b/docs/api/module-ScheduleProgramData.html index d23a8e361..53405f7c9 100644 --- a/docs/api/module-ScheduleProgramData.html +++ b/docs/api/module-ScheduleProgramData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-SearchBox.html b/docs/api/module-SearchBox.html index c121feff9..ebe7b94a1 100644 --- a/docs/api/module-SearchBox.html +++ b/docs/api/module-SearchBox.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-SearchData.html b/docs/api/module-SearchData.html index eea2e6862..407ccf582 100644 --- a/docs/api/module-SearchData.html +++ b/docs/api/module-SearchData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-SearchResults.html b/docs/api/module-SearchResults.html index 53ad6a947..2b6b7e777 100644 --- a/docs/api/module-SearchResults.html +++ b/docs/api/module-SearchResults.html @@ -33,7 +33,7 @@ @@ -689,7 +689,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-SearchRow.html b/docs/api/module-SearchRow.html index 55f4dee9c..202aa2086 100644 --- a/docs/api/module-SearchRow.html +++ b/docs/api/module-SearchRow.html @@ -33,7 +33,7 @@ @@ -713,7 +713,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-SearchTask.html b/docs/api/module-SearchTask.html index 39367897d..9b2ab962a 100644 --- a/docs/api/module-SearchTask.html +++ b/docs/api/module-SearchTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-SeriesData.html b/docs/api/module-SeriesData.html index 2a9dada90..c0fa6aab1 100644 --- a/docs/api/module-SeriesData.html +++ b/docs/api/module-SeriesData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ServerDiscoveryTask.html b/docs/api/module-ServerDiscoveryTask.html index 0cf5c114f..f6a47ec7a 100644 --- a/docs/api/module-ServerDiscoveryTask.html +++ b/docs/api/module-ServerDiscoveryTask.html @@ -33,7 +33,7 @@ @@ -1081,7 +1081,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-SetServerScreen.html b/docs/api/module-SetServerScreen.html index a3c8d17da..bcbd6e67f 100644 --- a/docs/api/module-SetServerScreen.html +++ b/docs/api/module-SetServerScreen.html @@ -33,7 +33,7 @@ @@ -1051,7 +1051,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ShowScenes.html b/docs/api/module-ShowScenes.html index 3a857197b..8352f0cce 100644 --- a/docs/api/module-ShowScenes.html +++ b/docs/api/module-ShowScenes.html @@ -33,7 +33,7 @@ @@ -3685,7 +3685,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-SongItem.html b/docs/api/module-SongItem.html index 398a2fcad..0eeef79f6 100644 --- a/docs/api/module-SongItem.html +++ b/docs/api/module-SongItem.html @@ -33,7 +33,7 @@ @@ -511,7 +511,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-Spinner.html b/docs/api/module-Spinner.html index fd793aba4..15d8eb46d 100644 --- a/docs/api/module-Spinner.html +++ b/docs/api/module-Spinner.html @@ -33,7 +33,7 @@ @@ -303,7 +303,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-StandardDialog.html b/docs/api/module-StandardDialog.html index 4d3deff79..e99400418 100644 --- a/docs/api/module-StandardDialog.html +++ b/docs/api/module-StandardDialog.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-Subtitles.html b/docs/api/module-Subtitles.html index aa459c004..e655245cc 100644 --- a/docs/api/module-Subtitles.html +++ b/docs/api/module-Subtitles.html @@ -33,7 +33,7 @@ @@ -2163,7 +2163,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TVEpisode.html b/docs/api/module-TVEpisode.html index 0887ff898..dc4992218 100644 --- a/docs/api/module-TVEpisode.html +++ b/docs/api/module-TVEpisode.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TVEpisodeData.html b/docs/api/module-TVEpisodeData.html index 286be94d1..e70019847 100644 --- a/docs/api/module-TVEpisodeData.html +++ b/docs/api/module-TVEpisodeData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TVEpisodeRow.html b/docs/api/module-TVEpisodeRow.html index 47ff659bb..c552d7ccd 100644 --- a/docs/api/module-TVEpisodeRow.html +++ b/docs/api/module-TVEpisodeRow.html @@ -33,7 +33,7 @@ @@ -793,7 +793,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TVEpisodeRowWithOptions.html b/docs/api/module-TVEpisodeRowWithOptions.html index a2e395b5e..c48c85d7a 100644 --- a/docs/api/module-TVEpisodeRowWithOptions.html +++ b/docs/api/module-TVEpisodeRowWithOptions.html @@ -33,7 +33,7 @@ @@ -1213,7 +1213,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TVEpisodes.html b/docs/api/module-TVEpisodes.html index 3cbf17166..d16418805 100644 --- a/docs/api/module-TVEpisodes.html +++ b/docs/api/module-TVEpisodes.html @@ -33,7 +33,7 @@ @@ -801,7 +801,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TVListDetails.html b/docs/api/module-TVListDetails.html index da016ca13..b0cea8c2c 100644 --- a/docs/api/module-TVListDetails.html +++ b/docs/api/module-TVListDetails.html @@ -33,7 +33,7 @@ @@ -1217,7 +1217,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TVListOptions.html b/docs/api/module-TVListOptions.html index 290b1b04d..a9d1f8c2b 100644 --- a/docs/api/module-TVListOptions.html +++ b/docs/api/module-TVListOptions.html @@ -33,7 +33,7 @@ @@ -693,7 +693,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TVSeasonData.html b/docs/api/module-TVSeasonData.html index 57de63dbb..312db5f41 100644 --- a/docs/api/module-TVSeasonData.html +++ b/docs/api/module-TVSeasonData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TVSeasonRow.html b/docs/api/module-TVSeasonRow.html index 2006b3afd..78df12e73 100644 --- a/docs/api/module-TVSeasonRow.html +++ b/docs/api/module-TVSeasonRow.html @@ -33,7 +33,7 @@ @@ -511,7 +511,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TVShowDescription.html b/docs/api/module-TVShowDescription.html index 2300de21f..242c64f51 100644 --- a/docs/api/module-TVShowDescription.html +++ b/docs/api/module-TVShowDescription.html @@ -33,7 +33,7 @@ @@ -1051,7 +1051,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TVShowDetails.html b/docs/api/module-TVShowDetails.html index e7385092f..4106e14fa 100644 --- a/docs/api/module-TVShowDetails.html +++ b/docs/api/module-TVShowDetails.html @@ -33,7 +33,7 @@ @@ -1333,7 +1333,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-TextSizeTask.html b/docs/api/module-TextSizeTask.html index 754756106..f7c8f5bcb 100644 --- a/docs/api/module-TextSizeTask.html +++ b/docs/api/module-TextSizeTask.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-UserData.html b/docs/api/module-UserData.html index 2205f6ac3..b73cc3410 100644 --- a/docs/api/module-UserData.html +++ b/docs/api/module-UserData.html @@ -33,7 +33,7 @@ @@ -1409,7 +1409,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-UserItem.html b/docs/api/module-UserItem.html index e4c12c01b..5558426ec 100644 --- a/docs/api/module-UserItem.html +++ b/docs/api/module-UserItem.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-UserLibrary.html b/docs/api/module-UserLibrary.html index b1037764d..5a48fd19a 100644 --- a/docs/api/module-UserLibrary.html +++ b/docs/api/module-UserLibrary.html @@ -33,7 +33,7 @@ @@ -815,7 +815,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-UserRow.html b/docs/api/module-UserRow.html index bda53f65d..5ac8d0f40 100644 --- a/docs/api/module-UserRow.html +++ b/docs/api/module-UserRow.html @@ -33,7 +33,7 @@ @@ -793,7 +793,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-UserSelect.html b/docs/api/module-UserSelect.html index b7b0917ba..354780ff6 100644 --- a/docs/api/module-UserSelect.html +++ b/docs/api/module-UserSelect.html @@ -33,7 +33,7 @@ @@ -689,7 +689,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-VideoData.html b/docs/api/module-VideoData.html index 050b1de6b..5d0e8dc74 100644 --- a/docs/api/module-VideoData.html +++ b/docs/api/module-VideoData.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-VideoPlayer.html b/docs/api/module-VideoPlayer.html index ff6106fb5..5d57152bc 100644 --- a/docs/api/module-VideoPlayer.html +++ b/docs/api/module-VideoPlayer.html @@ -33,7 +33,7 @@ @@ -2870,7 +2870,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-VideoPlayerView.html b/docs/api/module-VideoPlayerView.html index a5fd51c98..7a2e9ed11 100644 --- a/docs/api/module-VideoPlayerView.html +++ b/docs/api/module-VideoPlayerView.html @@ -33,7 +33,7 @@ @@ -2833,7 +2833,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-VideoTrackListItem.html b/docs/api/module-VideoTrackListItem.html index c901d7d27..49d10958a 100644 --- a/docs/api/module-VideoTrackListItem.html +++ b/docs/api/module-VideoTrackListItem.html @@ -33,7 +33,7 @@ @@ -515,7 +515,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-ViewCreator.html b/docs/api/module-ViewCreator.html index d2622f2fd..947fe817b 100644 --- a/docs/api/module-ViewCreator.html +++ b/docs/api/module-ViewCreator.html @@ -33,7 +33,7 @@ @@ -1220,7 +1220,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-WhatsNewDialog.html b/docs/api/module-WhatsNewDialog.html index a02348a66..ab5081b20 100644 --- a/docs/api/module-WhatsNewDialog.html +++ b/docs/api/module-WhatsNewDialog.html @@ -33,7 +33,7 @@ @@ -407,7 +407,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-baserequest.html b/docs/api/module-baserequest.html index d7f26cbad..22acab0e0 100644 --- a/docs/api/module-baserequest.html +++ b/docs/api/module-baserequest.html @@ -33,7 +33,7 @@ @@ -2617,7 +2617,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-captionTask.html b/docs/api/module-captionTask.html index 5e1073673..0d209e89f 100644 --- a/docs/api/module-captionTask.html +++ b/docs/api/module-captionTask.html @@ -33,7 +33,7 @@ @@ -1539,7 +1539,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-config.html b/docs/api/module-config.html index a35e637b4..f99b5e4a0 100644 --- a/docs/api/module-config.html +++ b/docs/api/module-config.html @@ -33,7 +33,7 @@ @@ -546,7 +546,7 @@
    Parameters:
    @@ -593,6 +593,223 @@
    Returns:
    + + + + +
    +
    +

    <static> getRegistrySections()

    + + +
    +
    + + +
    +

    Return an array of all the registry section keys

    +
    + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +object + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> getSavedUsers()

    + + +
    +
    + + +
    +

    Returns an array of saved users from the registry
    +that belong to the active server

    +
    + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +object + + + +
    +
    + + + + +
    @@ -760,7 +977,7 @@
    Parameters:
    @@ -918,7 +1135,7 @@
    Parameters:
    @@ -1766,7 +1983,7 @@
    Parameters:
    @@ -1944,7 +2161,7 @@
    Parameters:
    @@ -2098,7 +2315,7 @@
    Parameters:
    @@ -2252,7 +2469,7 @@
    Parameters:
    @@ -2353,7 +2570,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-deviceCapabilities.html b/docs/api/module-deviceCapabilities.html index dadcbf7c2..2d372f902 100644 --- a/docs/api/module-deviceCapabilities.html +++ b/docs/api/module-deviceCapabilities.html @@ -33,7 +33,7 @@ @@ -1405,7 +1405,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-globals.html b/docs/api/module-globals.html index ebfc84db3..16a618fde 100644 --- a/docs/api/module-globals.html +++ b/docs/api/module-globals.html @@ -33,7 +33,7 @@ @@ -523,7 +523,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-migrations.html b/docs/api/module-migrations.html new file mode 100644 index 000000000..a7fa615f6 --- /dev/null +++ b/docs/api/module-migrations.html @@ -0,0 +1,555 @@ + + + + + + + jellyfin-roku api docs Module: migrations + + + + + + + + + + + + + +
    +
    + + +
    + +
    + + +

    Module: migrations

    +
    + +
    + +
    + + +
    +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + +
    + + + + + + + + + + + + + + +

    Methods

    + +
    + +
    +
    +

    <static> runGlobalMigrations()

    + + +
    +
    + + +
    +

    Run all necessary registry mirations on the "global" Jellyfin registry section

    +
    + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> runRegistryUserMigrations(version)

    + + +
    +
    + + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    version + + +string + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + +
    + + + + + +
    + +
    + + + + +
    +
    + +
    + + +
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/api/module-misc.html b/docs/api/module-misc.html index a444a93a3..62eea4021 100644 --- a/docs/api/module-misc.html +++ b/docs/api/module-misc.html @@ -33,7 +33,7 @@ @@ -4294,6 +4294,165 @@
    Returns:
    + + + + +
    +
    +

    <static> shuffleArray(array)

    + + +
    +
    + + +
    +

    Takes an array of data, shuffles the order, then returns the array
    +uses the Fisher-Yates shuffling algorithm

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    array + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +object + + + +
    +
    + + + + +
    @@ -5310,7 +5469,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-quickplay.html b/docs/api/module-quickplay.html new file mode 100644 index 000000000..110c2bf3a --- /dev/null +++ b/docs/api/module-quickplay.html @@ -0,0 +1,3051 @@ + + + + + + + jellyfin-roku api docs Module: quickplay + + + + + + + + + + + + + +
    +
    + + +
    + +
    + + +

    Module: quickplay

    +
    + +
    + +
    + + +
    +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + +
    + + + + + + + + + + + + + + +

    Methods

    + +
    + +
    +
    +

    <static> album(itemNode)

    + + +
    +
    + + +
    +

    A music album.
    +Play the entire album starting with track 1.

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> artist(itemNode)

    + + +
    +
    + + +
    +

    A music artist.
    +Shuffle play all songs by artist.

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> audio(itemNode)

    + + +
    +
    + + +
    +

    A single audio file.

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> boxset(itemNode)

    + + +
    +
    + + +
    +

    A boxset.
    +Play all items inside.

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> collectionFolder(itemNode)

    + + +
    +
    + + +
    +

    Quick Play A CollectionFolder.
    +Shuffle play the items inside
    +with some differences based on collectionType.

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> folder(itemNode)

    + + +
    +
    + + +
    +

    Quick Play A folder.
    +Shuffle play all items found

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> multipleSeries(itemNodes)

    + + +
    +
    + + +
    +

    More than one TV Show Series.
    +Shuffle play all watched episodes

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNodes + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> musicVideo(itemNode)

    + + +
    +
    + + +
    +

    A single music video file.

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> person(itemNode)

    + + +
    +
    + + +
    +

    Quick Play A Person.
    +Shuffle play all videos found

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> playlist(itemNode)

    + + +
    +
    + + +
    +

    Quick Play A Playlist.
    +Play the first unwatched episode.
    +If none, play the whole season starting with episode 1.

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> program(itemNode)

    + + +
    +
    + + +
    +

    Quick Play A Live Program

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> pushToQueue(queueArray [, shufflePlay])

    + + +
    +
    + + +
    +

    Takes an array of items and adds to global queue.
    +Also shuffles the playlist if asked

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeArgumentDefaultDescription
    queueArray + + +object + + + + + + + + + + + + +
    shufflePlay + + +boolean + + + + + + + <optional>
    + + + + + +
    + + false + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> season(itemNode)

    + + +
    +
    + + +
    +

    A TV Show Season.
    +Play the first unwatched episode.
    +If none, play the whole season starting with episode 1.

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> series(itemNode)

    + + +
    +
    + + +
    +

    A TV Show Series.
    +Play the first unwatched episode.
    +If none, shuffle play the whole series.

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> tvChannel(itemNode)

    + + +
    +
    + + +
    +

    Quick Play A TVChannel

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> userView(itemNode)

    + + +
    +
    + + +
    +

    Quick Play A UserView.
    +Play logic depends on "collectionType".

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + + + +
    +
    +

    <static> video(itemNode)

    + + +
    +
    + + +
    +

    A single video file.

    +
    + + + + + + + + +
    Parameters:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    itemNode + + +object + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Source:
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + +
    Returns:
    + + + + +
    +
    + Type +
    +
    + +void + + + +
    +
    + + + + + +
    + +
    + + + + + +
    + +
    + + + + +
    +
    + +
    + + +
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/api/module-schedule.html b/docs/api/module-schedule.html index 0cb968756..a17c95402 100644 --- a/docs/api/module-schedule.html +++ b/docs/api/module-schedule.html @@ -33,7 +33,7 @@ @@ -1919,7 +1919,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-section.html b/docs/api/module-section.html index 91cb9cda6..669e248c6 100644 --- a/docs/api/module-section.html +++ b/docs/api/module-section.html @@ -33,7 +33,7 @@ @@ -1343,7 +1343,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-sectionScroller.html b/docs/api/module-sectionScroller.html index 96f130d4b..d217204b8 100644 --- a/docs/api/module-sectionScroller.html +++ b/docs/api/module-sectionScroller.html @@ -33,7 +33,7 @@ @@ -511,7 +511,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-settings.html b/docs/api/module-settings.html index 9e2362059..f006999f9 100644 --- a/docs/api/module-settings.html +++ b/docs/api/module-settings.html @@ -33,7 +33,7 @@ @@ -1259,7 +1259,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/module-userauth.html b/docs/api/module-userauth.html index 251c4ff58..7c619c83b 100644 --- a/docs/api/module-userauth.html +++ b/docs/api/module-userauth.html @@ -33,7 +33,7 @@ @@ -1553,7 +1553,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/modules.list.html b/docs/api/modules.list.html index ca161e32b..2248233cc 100644 --- a/docs/api/modules.list.html +++ b/docs/api/modules.list.html @@ -33,7 +33,7 @@ @@ -190,7 +190,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/quicksearch.html b/docs/api/quicksearch.html index d934d7c1a..1316de3ce 100644 --- a/docs/api/quicksearch.html +++ b/docs/api/quicksearch.html @@ -7,7 +7,7 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/api/source_utils_Subtitles.brs.html b/docs/api/source_utils_Subtitles.brs.html index 4216c4f97..116362403 100644 --- a/docs/api/source_utils_Subtitles.brs.html +++ b/docs/api/source_utils_Subtitles.brs.html @@ -33,7 +33,7 @@ @@ -845,7 +845,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/source_utils_config.brs.html b/docs/api/source_utils_config.brs.html index 2fe07ba19..e23d7675c 100644 --- a/docs/api/source_utils_config.brs.html +++ b/docs/api/source_utils_config.brs.html @@ -33,7 +33,7 @@ @@ -109,7 +109,7 @@

    Source: source/utils/config.brs

    registryData = {} for each item in regKeyList ' ignore session related tokens - if item <> "token" and item <> "username" and item <> "password" + if item <> "token" and item <> "username" and item <> "password" and LCase(item) <> "lastrunversion" if registry.Exists(item) registryData.AddReplace(item, registry.Read(item)) end if @@ -119,6 +119,12 @@

    Source: source/utils/config.brs

    return registryData end function +' Return an array of all the registry section keys +function getRegistrySections() as object + registry = CreateObject("roRegistry") + return registry.GetSectionList() +end function + ' "Jellyfin" registry accessors for the default global settings function get_setting(key, defaultValue = invalid) value = registry_read(key, "Jellyfin") @@ -166,6 +172,43 @@

    Source: source/utils/config.brs

    return invalid end function + +' Returns an array of saved users from the registry +' that belong to the active server +function getSavedUsers() as object + registrySections = getRegistrySections() + + savedUsers = [] + for each section in registrySections + if LCase(section) <> "jellyfin" + savedUsers.push(section) + end if + end for + + savedServerUsers = [] + for each userId in savedUsers + userArray = { + id: userId + } + token = registry_read("token", userId) + + username = registry_read("username", userId) + if username <> invalid + userArray["username"] = username + end if + + serverId = registry_read("serverId", userId) + if serverId <> invalid + userArray["serverId"] = serverId + end if + + if username <> invalid and token <> invalid and serverId <> invalid and serverId = m.global.session.server.id + savedServerUsers.push(userArray) + end if + end for + + return savedServerUsers +end function @@ -209,7 +252,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/source_utils_deviceCapabilities.brs.html b/docs/api/source_utils_deviceCapabilities.brs.html index 3abf35b07..dea0ead86 100644 --- a/docs/api/source_utils_deviceCapabilities.brs.html +++ b/docs/api/source_utils_deviceCapabilities.brs.html @@ -33,7 +33,7 @@ @@ -1140,7 +1140,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/source_utils_globals.brs.html b/docs/api/source_utils_globals.brs.html index efda3c01b..813891b5f 100644 --- a/docs/api/source_utils_globals.brs.html +++ b/docs/api/source_utils_globals.brs.html @@ -33,7 +33,7 @@ @@ -100,11 +100,13 @@

    Source: source/utils/globals.brs

    ' Save information from roAppInfo to m.global.app sub SaveAppToGlobal() appInfo = CreateObject("roAppInfo") + lastRunVersion = get_setting("LastRunVersion") m.global.addFields({ app: { id: appInfo.GetID(), isDev: appInfo.IsDev(), - version: appInfo.GetVersion() + version: appInfo.GetVersion(), + lastRunVersion: lastRunVersion } }) end sub @@ -177,6 +179,7 @@

    Source: source/utils/globals.brs

    uuid: deviceInfo.GetRandomUUID(), name: displayName, friendlyName: filteredFriendly, + serverDeviceName: deviceInfo.getChannelClientID(), model: deviceInfo.GetModel(), modelType: deviceInfo.GetModelType(), modelDetails: deviceInfo.GetModelDetails(), @@ -240,7 +243,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/source_utils_misc.brs.html b/docs/api/source_utils_misc.brs.html index c4bc602e7..8550503fe 100644 --- a/docs/api/source_utils_misc.brs.html +++ b/docs/api/source_utils_misc.brs.html @@ -33,7 +33,7 @@ @@ -464,6 +464,16 @@

    Source: source/utils/misc.brs

    end for return false end function + +' Takes an array of data, shuffles the order, then returns the array +' uses the Fisher-Yates shuffling algorithm +function shuffleArray(array as object) as object + for i = array.count() - 1 to 1 step -1 + j = Rnd(i + 1) - 1 + t = array[i] : array[i] = array[j] : array[j] = t + end for + return array +end function @@ -507,7 +517,7 @@ Documentation generated by JSDoc 4.0.2 - on Oct 27th 2023 + on Oct 28th 2023 using the DocStrap template. diff --git a/docs/api/source_utils_quickplay.bs.html b/docs/api/source_utils_quickplay.bs.html new file mode 100644 index 000000000..99a09fae7 --- /dev/null +++ b/docs/api/source_utils_quickplay.bs.html @@ -0,0 +1,792 @@ + + + + + + + jellyfin-roku api docs Source: source/utils/quickplay.bs + + + + + + + + + + + + + +
    +
    + + +
    + +
    + + +

    Source: source/utils/quickplay.bs

    + +
    +
    +
    ' All of the Quick Play logic seperated by media type
    +namespace quickplay
    +
    +    ' Takes an array of items and adds to global queue.
    +    ' Also shuffles the playlist if asked
    +    sub pushToQueue(queueArray as object, shufflePlay = false as boolean)
    +        if isValidAndNotEmpty(queueArray)
    +            ' load everything
    +            for each item in queueArray
    +                m.global.queueManager.callFunc("push", item)
    +            end for
    +            ' shuffle the playlist if asked
    +            if shufflePlay and m.global.queueManager.callFunc("getCount") > 1
    +                m.global.queueManager.callFunc("toggleShuffle")
    +            end if
    +        end if
    +    end sub
    +
    +    ' A single video file.
    +    sub video(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) or not isValid(itemNode.json) then return
    +
    +        ' attempt to play video file. resume if possible
    +        if isValid(itemNode.selectedVideoStreamId)
    +            itemNode.id = itemNode.selectedVideoStreamId
    +        end if
    +
    +        audio_stream_idx = 0
    +        if isValid(itemNode.selectedAudioStreamIndex) and itemNode.selectedAudioStreamIndex > 0
    +            audio_stream_idx = itemNode.selectedAudioStreamIndex
    +        end if
    +        itemNode.selectedAudioStreamIndex = audio_stream_idx
    +
    +        playbackPosition = 0
    +        if isValid(itemNode.json.userdata) and isValid(itemNode.json.userdata.PlaybackPositionTicks)
    +            playbackPosition = itemNode.json.userdata.PlaybackPositionTicks
    +        end if
    +        itemNode.startingPoint = playbackPosition
    +
    +        m.global.queueManager.callFunc("push", itemNode)
    +    end sub
    +
    +    ' A single audio file.
    +    sub audio(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) then return
    +
    +        m.global.queueManager.callFunc("push", itemNode)
    +    end sub
    +
    +    ' A single music video file.
    +    sub musicVideo(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) or not isValid(itemNode.json) then return
    +
    +        m.global.queueManager.callFunc("push", itemNode)
    +    end sub
    +
    +    ' A music album.
    +    ' Play the entire album starting with track 1.
    +    sub album(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) then return
    +
    +        ' grab list of songs in the album
    +        albumSongs = api.users.GetItemsByQuery(m.global.session.user.id, {
    +            "parentId": itemNode.id,
    +            "imageTypeLimit": 1,
    +            "sortBy": "SortName",
    +            "limit": 2000,
    +            "enableUserData": false,
    +            "EnableTotalRecordCount": false
    +        })
    +        if isValid(albumSongs) and isValidAndNotEmpty(albumSongs.items)
    +            quickplay.pushToQueue(albumSongs.items)
    +        end if
    +    end sub
    +
    +    ' A music artist.
    +    ' Shuffle play all songs by artist.
    +    sub artist(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) then return
    +
    +        ' get all songs by artist
    +        artistSongs = api.users.GetItemsByQuery(m.global.session.user.id, {
    +            "artistIds": itemNode.id,
    +            "includeItemTypes": "Audio",
    +            "sortBy": "Album",
    +            "limit": 2000,
    +            "imageTypeLimit": 1,
    +            "Recursive": true,
    +            "enableUserData": false,
    +            "EnableTotalRecordCount": false
    +        })
    +        print "artistSongs=", artistSongs
    +
    +        if isValid(artistSongs) and isValidAndNotEmpty(artistSongs.items)
    +            quickplay.pushToQueue(artistSongs.items, true)
    +        end if
    +    end sub
    +
    +    ' A boxset.
    +    ' Play all items inside.
    +    sub boxset(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) then return
    +
    +        data = api.items.GetByQuery({
    +            "userid": m.global.session.user.id,
    +            "parentid": itemNode.id,
    +            "limit": 2000,
    +            "EnableTotalRecordCount": false
    +        })
    +        if isValid(data) and isValidAndNotEmpty(data.Items)
    +            quickplay.pushToQueue(data.items)
    +        end if
    +    end sub
    +
    +    ' A TV Show Series.
    +    ' Play the first unwatched episode.
    +    ' If none, shuffle play the whole series.
    +    sub series(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) then return
    +
    +        data = api.shows.GetNextUp({
    +            "seriesId": itemNode.id,
    +            "recursive": true,
    +            "SortBy": "DatePlayed",
    +            "SortOrder": "Descending",
    +            "ImageTypeLimit": 1,
    +            "UserId": m.global.session.user.id,
    +            "EnableRewatching": false,
    +            "DisableFirstEpisode": false,
    +            "EnableTotalRecordCount": false
    +        })
    +
    +        if isValid(data) and isValidAndNotEmpty(data.Items)
    +            ' there are unwatched episodes
    +            m.global.queueManager.callFunc("push", data.Items[0])
    +        else
    +            ' next up check was empty
    +            ' check for a resumable episode
    +            data = api.users.GetResumeItemsByQuery(m.global.session.user.id, {
    +                "parentId": itemNode.id,
    +                "userid": m.global.session.user.id,
    +                "SortBy": "DatePlayed",
    +                "recursive": true,
    +                "SortOrder": "Descending",
    +                "Filters": "IsResumable",
    +                "EnableTotalRecordCount": false
    +            })
    +            print "resumeitems data=", data
    +            if isValid(data) and isValidAndNotEmpty(data.Items)
    +                ' play the resumable episode
    +                if isValid(data.Items[0].UserData) and isValid(data.Items[0].UserData.PlaybackPositionTicks)
    +                    data.Items[0].startingPoint = data.Items[0].userdata.PlaybackPositionTicks
    +                end if
    +                m.global.queueManager.callFunc("push", data.Items[0])
    +            else
    +                ' shuffle all episodes
    +                data = api.shows.GetEpisodes(itemNode.id, {
    +                    "userid": m.global.session.user.id,
    +                    "SortBy": "Random",
    +                    "limit": 2000,
    +                    "EnableTotalRecordCount": false
    +                })
    +
    +                if isValid(data) and isValidAndNotEmpty(data.Items)
    +                    ' add all episodes found to a playlist
    +                    quickplay.pushToQueue(data.Items)
    +                end if
    +            end if
    +        end if
    +    end sub
    +
    +    ' More than one TV Show Series.
    +    ' Shuffle play all watched episodes
    +    sub multipleSeries(itemNodes as object)
    +        if isValidAndNotEmpty(itemNodes)
    +            numTotal = 0
    +            numLimit = 2000
    +            for each tvshow in itemNodes
    +                ' grab all watched episodes for each series
    +                showData = api.shows.GetEpisodes(tvshow.id, {
    +                    "userId": m.global.session.user.id,
    +                    "SortBy": "Random",
    +                    "imageTypeLimit": 0,
    +                    "EnableTotalRecordCount": false,
    +                    "enableImages": false
    +                })
    +
    +                if isValid(showData) and isValidAndNotEmpty(showData.items)
    +                    playedEpisodes = []
    +                    ' add all played episodes to queue
    +                    for each episode in showData.items
    +                        if isValid(episode.userdata) and isValid(episode.userdata.Played)
    +                            if episode.userdata.Played
    +                                playedEpisodes.push(episode)
    +                            end if
    +                        end if
    +                    end for
    +                    quickplay.pushToQueue(playedEpisodes)
    +
    +                    ' keep track of how many items we've seen
    +                    numTotal = numTotal + showData.items.count()
    +                    if numTotal >= numLimit
    +                        ' stop grabbing more items if we hit our limit
    +                        exit for
    +                    end if
    +                end if
    +            end for
    +            if m.global.queueManager.callFunc("getCount") > 1
    +                m.global.queueManager.callFunc("toggleShuffle")
    +            end if
    +        end if
    +    end sub
    +
    +    ' A TV Show Season.
    +    ' Play the first unwatched episode.
    +    ' If none, play the whole season starting with episode 1.
    +    sub season(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) then return
    +
    +        unwatchedData = api.shows.GetEpisodes(itemNode.json.SeriesId, {
    +            "seasonId": itemNode.id,
    +            "userid": m.global.session.user.id,
    +            "limit": 2000,
    +            "EnableTotalRecordCount": false
    +        })
    +
    +        if isValid(unwatchedData) and isValidAndNotEmpty(unwatchedData.Items)
    +            ' find the first unwatched episode
    +            firstUnwatchedEpisodeIndex = invalid
    +            for each item in unwatchedData.Items
    +                if isValid(item.UserData)
    +                    if isValid(item.UserData.Played) and item.UserData.Played = false
    +                        firstUnwatchedEpisodeIndex = item.IndexNumber - 1
    +                        if isValid(item.UserData.PlaybackPositionTicks)
    +                            item.startingPoint = item.UserData.PlaybackPositionTicks
    +                        end if
    +                        exit for
    +                    end if
    +                end if
    +            end for
    +
    +            if isValid(firstUnwatchedEpisodeIndex)
    +                ' add the first unwatched episode and the rest of the season to a playlist
    +                for i = firstUnwatchedEpisodeIndex to unwatchedData.Items.count() - 1
    +                    m.global.queueManager.callFunc("push", unwatchedData.Items[i])
    +                end for
    +            else
    +                ' try to find a "continue watching" episode
    +                continueData = api.users.GetResumeItemsByQuery(m.global.session.user.id, {
    +                    "parentId": itemNode.id,
    +                    "userid": m.global.session.user.id,
    +                    "SortBy": "DatePlayed",
    +                    "recursive": true,
    +                    "SortOrder": "Descending",
    +                    "Filters": "IsResumable",
    +                    "EnableTotalRecordCount": false
    +                })
    +
    +                if isValid(continueData) and isValidAndNotEmpty(continueData.Items)
    +                    ' play the resumable episode
    +                    for each item in continueData.Items
    +                        if isValid(item.UserData) and isValid(item.UserData.PlaybackPositionTicks)
    +                            item.startingPoint = item.userdata.PlaybackPositionTicks
    +                        end if
    +                        m.global.queueManager.callFunc("push", item)
    +                    end for
    +                else
    +                    ' play the whole season in order
    +                    if isValid(unwatchedData) and isValidAndNotEmpty(unwatchedData.Items)
    +                        ' add all episodes found to a playlist
    +                        pushToQueue(unwatchedData.Items)
    +                    end if
    +                end if
    +            end if
    +        end if
    +    end sub
    +
    +    ' Quick Play A Person.
    +    ' Shuffle play all videos found
    +    sub person(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) then return
    +        ' get movies and videos by the person
    +        personMovies = api.users.GetItemsByQuery(m.global.session.user.id, {
    +            "personIds": itemNode.id,
    +            "includeItemTypes": "Movie,Video",
    +            "excludeItemTypes": "Season,Series",
    +            "recursive": true,
    +            "limit": 2000
    +        })
    +        print "personMovies=", personMovies
    +
    +        if isValid(personMovies) and isValidAndNotEmpty(personMovies.Items)
    +            ' add each item to the queue
    +            quickplay.pushToQueue(personMovies.Items)
    +        end if
    +
    +        ' get watched episodes by the person
    +        personEpisodes = api.users.GetItemsByQuery(m.global.session.user.id, {
    +            "personIds": itemNode.id,
    +            "includeItemTypes": "Episode",
    +            "isPlayed": true,
    +            "excludeItemTypes": "Season,Series",
    +            "recursive": true,
    +            "limit": 2000
    +        })
    +        print "personEpisodes=", personEpisodes
    +
    +        if isValid(personEpisodes) and isValidAndNotEmpty(personEpisodes.Items)
    +            ' add each item to the queue
    +            quickplay.pushToQueue(personEpisodes.Items)
    +        end if
    +
    +        if m.global.queueManager.callFunc("getCount") > 1
    +            m.global.queueManager.callFunc("toggleShuffle")
    +        end if
    +    end sub
    +
    +    ' Quick Play A TVChannel
    +    sub tvChannel(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) then return
    +
    +        stopLoadingSpinner()
    +        group = CreateVideoPlayerGroup(itemNode.id)
    +        m.global.sceneManager.callFunc("pushScene", group)
    +    end sub
    +
    +    ' Quick Play A Live Program
    +    sub program(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.json) or not isValid(itemNode.json.ChannelId) then return
    +
    +        stopLoadingSpinner()
    +        group = CreateVideoPlayerGroup(itemNode.json.ChannelId)
    +        m.global.sceneManager.callFunc("pushScene", group)
    +    end sub
    +
    +    ' Quick Play A Playlist.
    +    ' Play the first unwatched episode.
    +    ' If none, play the whole season starting with episode 1.
    +    sub playlist(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) then return
    +        ' get playlist items
    +        myPlaylist = api.playlists.GetItems(itemNode.id, {
    +            "userId": m.global.session.user.id,
    +            "limit": 2000
    +        })
    +
    +        if isValid(myPlaylist) and isValidAndNotEmpty(myPlaylist.Items)
    +            ' add each item to the queue
    +            quickplay.pushToQueue(myPlaylist.Items)
    +            if m.global.queueManager.callFunc("getCount") > 1
    +                m.global.queueManager.callFunc("toggleShuffle")
    +            end if
    +        end if
    +    end sub
    +
    +    ' Quick Play A folder.
    +    ' Shuffle play all items found
    +    sub folder(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) then return
    +
    +        paramArray = {
    +            "includeItemTypes": ["Episode", "Movie", "Video"],
    +            "videoTypes": "VideoFile",
    +            "sortBy": "Random",
    +            "limit": 2000,
    +            "imageTypeLimit": 1,
    +            "Recursive": true,
    +            "enableUserData": false,
    +            "EnableTotalRecordCount": false
    +        }
    +        ' modify api query based on folder type
    +        folderType = Lcase(itemNode.json.type)
    +        if folderType = "studio"
    +            paramArray["studioIds"] = itemNode.id
    +        else if folderType = "genre"
    +            paramArray["genreIds"] = itemNode.id
    +            if isValid(itemNode.json.MovieCount) and itemNode.json.MovieCount > 0
    +                paramArray["includeItemTypes"] = "Movie"
    +            end if
    +        else if folderType = "musicgenre"
    +            paramArray["genreIds"] = itemNode.id
    +            paramArray.delete("videoTypes")
    +            paramArray["includeItemTypes"] = "Audio"
    +        else
    +            paramArray["parentId"] = itemNode.id
    +        end if
    +        ' look for tv series instead of video files
    +        if isValid(itemNode.json.SeriesCount) and itemNode.json.SeriesCount > 0
    +            paramArray["includeItemTypes"] = "Series"
    +            paramArray.Delete("videoTypes")
    +        end if
    +        ' get folder items
    +        folderData = api.users.GetItemsByQuery(m.global.session.user.id, paramArray)
    +        print "folderData=", folderData
    +
    +        if isValid(folderData) and isValidAndNotEmpty(folderData.items)
    +            if isValid(itemNode.json.SeriesCount) and itemNode.json.SeriesCount > 0
    +                if itemNode.json.SeriesCount = 1
    +                    quickplay.series(folderData.items[0])
    +                else
    +                    quickplay.multipleSeries(folderData.items)
    +                end if
    +            else
    +                quickplay.pushToQueue(folderData.items, true)
    +            end if
    +        end if
    +    end sub
    +
    +    ' Quick Play A CollectionFolder.
    +    ' Shuffle play the items inside
    +    ' with some differences based on collectionType.
    +    sub collectionFolder(itemNode as object)
    +        if not isValid(itemNode) or not isValid(itemNode.id) then return
    +        ' play depends on the kind of files inside the collectionfolder
    +        print "attempting to quickplay a collection folder"
    +        collectionType = LCase(itemNode.collectionType)
    +        print "collectionType=", collectionType
    +
    +        if collectionType = "movies"
    +            ' get randomized list of movies inside
    +            data = api.users.GetItemsByQuery(m.global.session.user.id, {
    +                "parentId": itemNode.id,
    +                "sortBy": "Random",
    +                "limit": 2000
    +            })
    +
    +            if isValid(data) and isValidAndNotEmpty(data.items)
    +                movieList = []
    +                ' add each item to the queue
    +                for each item in data.Items
    +                    ' only add movies we're not currently watching
    +                    if isValid(item.userdata) and isValid(item.userdata.PlaybackPositionTicks)
    +                        if item.userdata.PlaybackPositionTicks = 0
    +                            movieList.push(item)
    +                        end if
    +                    end if
    +                end for
    +                quickplay.pushToQueue(movieList)
    +            end if
    +        else if collectionType = "music"
    +            ' get audio files from under this collection
    +            ' sort songs by album then artist
    +            songsData = api.users.GetItemsByQuery(m.global.session.user.id, {
    +                "parentId": itemNode.id,
    +                "includeItemTypes": "Audio",
    +                "sortBy": "Album",
    +                "Recursive": true,
    +                "limit": 2000,
    +                "imageTypeLimit": 1,
    +                "enableUserData": false,
    +                "EnableTotalRecordCount": false
    +            })
    +            print "songsData=", songsData
    +            if isValid(songsData) and isValidAndNotEmpty(songsData.items)
    +                quickplay.pushToQueue(songsData.Items, true)
    +            end if
    +        else if collectionType = "boxsets"
    +            ' get list of all boxsets inside
    +            boxsetData = api.users.GetItemsByQuery(m.global.session.user.id, {
    +                "parentId": itemNode.id,
    +                "limit": 2000,
    +                "imageTypeLimit": 0,
    +                "enableUserData": false,
    +                "EnableTotalRecordCount": false,
    +                "enableImages": false
    +            })
    +
    +            print "boxsetData=", boxsetData
    +
    +            if isValid(boxsetData) and isValidAndNotEmpty(boxsetData.items)
    +                ' pick a random boxset
    +                arrayIndex = Rnd(boxsetData.items.count()) - 1
    +                myBoxset = boxsetData.items[arrayIndex]
    +                ' grab list of items from boxset
    +                print "myBoxset=", myBoxset
    +                boxsetData = api.users.GetItemsByQuery(m.global.session.user.id, {
    +                    "parentId": myBoxset.id,
    +                    "EnableTotalRecordCount": false
    +                })
    +
    +                if isValid(boxsetData) and isValidAndNotEmpty(boxsetData.items)
    +                    ' add all boxset items to queue
    +                    quickplay.pushToQueue(boxsetData.Items)
    +                end if
    +            end if
    +        else if collectionType = "tvshows" or collectionType = "collectionfolder"
    +            ' get list of tv shows inside
    +            tvshowsData = api.users.GetItemsByQuery(m.global.session.user.id, {
    +                "parentId": itemNode.id,
    +                "sortBy": "Random",
    +                "imageTypeLimit": 0,
    +                "enableUserData": false,
    +                "EnableTotalRecordCount": false,
    +                "enableImages": false
    +            })
    +
    +            print "tvshowsData=", tvshowsData
    +
    +            if isValid(tvshowsData) and isValidAndNotEmpty(tvshowsData.items)
    +                quickplay.multipleSeries(tvshowsData.items)
    +            end if
    +        else if collectionType = "musicvideos"
    +            ' get randomized list of videos inside
    +            data = api.users.GetItemsByQuery(m.global.session.user.id, {
    +                "parentId": itemNode.id,
    +                "includeItemTypes": "MusicVideo",
    +                "sortBy": "Random",
    +                "Recursive": true,
    +                "limit": 2000,
    +                "imageTypeLimit": 1,
    +                "enableUserData": false,
    +                "EnableTotalRecordCount": false
    +            })
    +            print "data=", data
    +            if isValid(data) and isValidAndNotEmpty(data.items)
    +                quickplay.pushToQueue(data.Items)
    +            end if
    +            ' else if collectionType = "homevideos" ' also used for a "Photo" library
    +        else
    +            print "Quick Play WARNING: Unknown collection type"
    +        end if
    +    end sub
    +
    +    ' Quick Play A UserView.
    +    ' Play logic depends on "collectionType".
    +    sub userView(itemNode as object)
    +        ' play depends on the kind of files inside the collectionfolder
    +        collectionType = LCase(itemNode.collectionType)
    +        print "collectionType=", collectionType
    +
    +        if collectionType = "playlists"
    +            ' get list of all playlists inside
    +            playlistData = api.users.GetItemsByQuery(m.global.session.user.id, {
    +                "parentId": itemNode.id,
    +                "imageTypeLimit": 0,
    +                "enableUserData": false,
    +                "EnableTotalRecordCount": false,
    +                "enableImages": false
    +            })
    +
    +            print "playlistData=", playlistData
    +
    +            if isValid(playlistData) and isValidAndNotEmpty(playlistData.items)
    +                ' pick a random playlist
    +                arrayIndex = Rnd(playlistData.items.count()) - 1
    +                myPlaylist = playlistData.items[arrayIndex]
    +                ' grab list of items from playlist
    +                print "myPlaylist=", myPlaylist
    +                playlistItems = api.playlists.GetItems(myPlaylist.id, {
    +                    "userId": m.global.session.user.id,
    +                    "EnableTotalRecordCount": false,
    +                    "limit": 2000
    +                })
    +                ' validate api results
    +                if isValid(playlistItems) and isValidAndNotEmpty(playlistItems.items)
    +                    quickplay.pushToQueue(playlistItems.items, true)
    +                end if
    +            end if
    +        else if collectionType = "livetv"
    +            ' get list of all tv channels
    +            channelData = api.users.GetItemsByQuery(m.global.session.user.id, {
    +                "includeItemTypes": "TVChannel",
    +                "sortBy": "Random",
    +                "Recursive": true,
    +                "imageTypeLimit": 0,
    +                "enableUserData": false,
    +                "EnableTotalRecordCount": false,
    +                "enableImages": false
    +            })
    +            print "channelData=", channelData
    +
    +            if isValid(channelData) and isValidAndNotEmpty(channelData.items)
    +                ' pick a random channel
    +                arrayIndex = Rnd(channelData.items.count()) - 1
    +                myChannel = channelData.items[arrayIndex]
    +                print "myChannel=", myChannel
    +                ' play channel
    +                quickplay.tvChannel(myChannel)
    +            end if
    +        else
    +            print "Quick Play CollectionFolder WARNING: Unknown collection type"
    +        end if
    +    end sub
    +
    +end namespace
    +
    +
    +
    + + + + + +
    +
    + +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index 37f085596..2f8166801 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "rimraf": "5.0.5", "roku-deploy": "3.10.3", "roku-log-bsc-plugin": "0.8.1", - "rooibos-roku": "5.7.0", + "rooibos-roku": "5.8.0", "ropm": "0.10.18", "spellchecker-cli": "6.1.1", "undent": "0.1.0" @@ -4914,9 +4914,9 @@ "dev": true }, "node_modules/rooibos-roku": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/rooibos-roku/-/rooibos-roku-5.7.0.tgz", - "integrity": "sha512-rkEAaowZeuLbwvtBcRZ1r5ber2yeBRqjxcwya9kfYQmDJ+m2XP8pGO9j10C0eW9hx6H7ZZl+5z1oHjnjwQsmBQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/rooibos-roku/-/rooibos-roku-5.8.0.tgz", + "integrity": "sha512-mPAszwOH1VdxMgSaoXQ/CgpAZ3RQ0A+d3BoxyY8axMsYS5kPO/8dL8fa7iFTGEZYA7803Ur52zlyN8GXqV5nLg==", "dev": true, "dependencies": { "source-map": "^0.7.3", diff --git a/package.json b/package.json index c895c9d08..854df4f72 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "rimraf": "5.0.5", "roku-deploy": "3.10.3", "roku-log-bsc-plugin": "0.8.1", - "rooibos-roku": "5.7.0", + "rooibos-roku": "5.8.0", "ropm": "0.10.18", "spellchecker-cli": "6.1.1", "undent": "0.1.0" diff --git a/source/Main.brs b/source/Main.brs index 8a86ac075..f2d0ecf05 100644 --- a/source/Main.brs +++ b/source/Main.brs @@ -61,44 +61,24 @@ sub Main (args as dynamic) as void end if end if - ' Only show the Whats New popup the first time a user runs a new client version. - appLastRunVersion = get_setting("LastRunVersion") - if m.global.app.version <> appLastRunVersion - ' Ensure the user hasn't disabled Whats New popups + ' Save the global last run version of the app + if m.global.app.version <> m.global.app.lastRunVersion + ' update global LastRunVersion + set_setting("LastRunVersion", m.global.app.version) + + ' Show the Whats New popup if m.global.session.user.settings["load.allowwhatsnew"] = true - set_setting("LastRunVersion", m.global.app.version) dialog = createObject("roSGNode", "WhatsNewDialog") m.scene.dialog = dialog m.scene.dialog.observeField("buttonSelected", m.port) end if end if - ' Registry migrations - if isValid(appLastRunVersion) and not versionChecker(appLastRunVersion, "1.7.0") - ' last app version used less than 1.7.0 - ' no longer saving raw password to registry - ' auth token and username are now stored in user settings and not global settings - print "Running 1.7.0 registry migrations" - ' remove global settings - unset_setting("token") - unset_setting("username") - unset_setting("password") - ' remove user settings - unset_user_setting("password") - ' remove saved credentials from saved_servers - saved = get_setting("saved_servers") - if isValid(saved) - savedServers = ParseJson(saved) - if isValid(savedServers.serverList) and savedServers.serverList.Count() > 0 - newServers = { serverList: [] } - for each item in savedServers.serverList - item.Delete("username") - item.Delete("password") - newServers.serverList.Push(item) - end for - set_setting("saved_servers", FormatJson(newServers)) - end if - end if + ' Save the user last run version of the app + if m.global.session.user.lastRunVersion <> m.global.app.lastRunVersion + ' update user LastRunVersion + set_user_setting("LastRunVersion", m.global.app.version) + session.user.Update("lastRunVersion", m.global.app.version) end if ' Handle input messages @@ -145,48 +125,89 @@ sub Main (args as dynamic) as void group.setFocus(true) end if else if isNodeEvent(msg, "quickPlayNode") + ' measure processing time + timeSpan = CreateObject("roTimespan") + + startMediaLoadingSpinner() + group = sceneManager.callFunc("getActiveScene") reportingNode = msg.getRoSGNode() - itemNode = reportingNode.quickPlayNode + itemNode = invalid + if isValid(reportingNode) + itemNode = reportingNode.quickPlayNode + reportingNodeType = reportingNode.subtype() + print "Quick Play reporting node type=", reportingNodeType + ' prevent double fire bug + if isValid(reportingNodeType) and (reportingNodeType = "Home" or reportingNodeType = "TVEpisodes") + reportingNode.quickPlayNode = invalid + end if + end if + print "Quick Play started. itemNode=", itemNode + ' if itemNode.json <> invalid + ' print "itemNode.json=", itemNode.json + ' end if if isValid(itemNode) and isValid(itemNode.id) and itemNode.id <> "" - if itemNode.type = "Episode" or itemNode.type = "Movie" or itemNode.type = "Video" - if isValid(itemNode.selectedVideoStreamId) - itemNode.id = itemNode.selectedVideoStreamId - end if - - audio_stream_idx = 0 - if isValid(itemNode.selectedAudioStreamIndex) and itemNode.selectedAudioStreamIndex > 0 - audio_stream_idx = itemNode.selectedAudioStreamIndex - end if - - itemNode.selectedAudioStreamIndex = audio_stream_idx - - playbackPosition = 0 - - ' Display playback options dialog - if isValid(itemNode.json) and isValid(itemNode.json.userdata) and isValid(itemNode.json.userdata.PlaybackPositionTicks) - playbackPosition = itemNode.json.userdata.PlaybackPositionTicks - end if - - if playbackPosition > 0 - m.global.queueManager.callFunc("hold", itemNode) - playbackOptionDialog(playbackPosition, itemNode.json) - else - m.global.queueManager.callFunc("clear") - m.global.queueManager.callFunc("push", itemNode) - m.global.queueManager.callFunc("playQueue") + ' make sure there is a type and convert type to lowercase + itemType = invalid + if isValid(itemNode.type) and itemNode.type <> "" + itemType = Lcase(itemNode.type) + else + ' grab type from json and convert to lowercase + if isValid(itemNode.json) and isValid(itemNode.json.type) + itemType = Lcase(itemNode.json.type) end if - - ' Prevent quick play node from double firing - reportingNode.quickPlayNode = invalid - - if LCase(group.subtype()) = "tvepisodes" - if isValid(group.lastFocus) - group.lastFocus.setFocus(true) + end if + print "Quick Play itemNode type=", itemType + + ' can't play the item without knowing what type it is + if isValid(itemType) + m.global.queueManager.callFunc("clear") ' empty queue/playlist + m.global.queueManager.callFunc("resetShuffle") ' turn shuffle off + + if itemType = "episode" or itemType = "movie" or itemType = "video" + quickplay.video(itemNode) + ' restore focus + if LCase(group.subtype()) = "tvepisodes" + if isValid(group.lastFocus) + group.lastFocus.setFocus(true) + end if end if + else if itemType = "audio" + quickplay.audio(itemNode) + else if itemType = "musicalbum" + quickplay.album(itemNode) + else if itemType = "musicartist" + quickplay.artist(itemNode) + else if itemType = "series" + quickplay.series(itemNode) + else if itemType = "season" + quickplay.season(itemNode) + else if itemType = "boxset" + quickplay.boxset(itemNode) + else if itemType = "collectionfolder" + quickplay.collectionFolder(itemNode) + else if itemType = "playlist" + quickplay.playlist(itemNode) + else if itemType = "userview" + quickplay.userView(itemNode) + else if itemType = "folder" + quickplay.folder(itemNode) + else if itemType = "musicvideo" + quickplay.musicVideo(itemNode) + else if itemType = "person" + quickplay.person(itemNode) + else if itemType = "tvchannel" + quickplay.tvChannel(itemNode) + else if itemType = "program" + quickplay.program(itemNode) end if + + m.global.queueManager.callFunc("playQueue") end if end if + stopLoadingSpinner() + elapsed = timeSpan.TotalMilliseconds() / 1000 + print "Quick Play finished loading in " + elapsed.toStr() + " seconds." else if isNodeEvent(msg, "selectedItem") ' If you select a library from ANYWHERE, follow this flow selectedItem = msg.getData() @@ -279,6 +300,8 @@ sub Main (args as dynamic) as void end if else if selectedItemType = "MusicAlbum" group = CreateAlbumView(selectedItem.json) + else if selectedItemType = "MusicVideo" + group = CreateMovieDetailsGroup(selectedItem) else if selectedItemType = "Playlist" group = CreatePlaylistView(selectedItem.json) else if selectedItemType = "Audio" @@ -417,6 +440,8 @@ sub Main (args as dynamic) as void group = CreateArtistView(node.json) else if node.type = "MusicAlbum" group = CreateAlbumView(node.json) + else if node.type = "MusicVideo" + group = CreateMovieDetailsGroup(node) else if node.type = "Audio" m.global.queueManager.callFunc("clear") m.global.queueManager.callFunc("resetShuffle") @@ -641,6 +666,7 @@ sub Main (args as dynamic) as void ' - "low" means that the general memory is below acceptable levels but not critical ' - "critical" means that general memory are at dangerously low level and that the OS may force terminate the application print "event.generalMemoryLevel = ", event.generalMemoryLevel + session.Update("memoreyLevel", event.generalMemoryLevel) else if isValid(event.audioCodecCapabilityChanged) ' The audio codec capability has changed if true. print "event.audioCodecCapabilityChanged = ", event.audioCodecCapabilityChanged diff --git a/source/ShowScenes.brs b/source/ShowScenes.brs index b3b890575..ebac0c585 100644 --- a/source/ShowScenes.brs +++ b/source/ShowScenes.brs @@ -43,19 +43,48 @@ function LoginFlow() print "No active user found in registry" user_select: SendPerformanceBeacon("AppDialogInitiate") ' Roku Performance monitoring - Dialog Starting + publicUsers = GetPublicUsers() + savedUsers = getSavedUsers() + numPubUsers = publicUsers.count() - if numPubUsers > 0 + numSavedUsers = savedUsers.count() + + if numPubUsers > 0 or numSavedUsers > 0 publicUsersNodes = [] - for each item in publicUsers - user = CreateObject("roSGNode", "PublicUserData") - user.id = item.Id - user.name = item.Name - if isValid(item.PrimaryImageTag) - user.ImageURL = UserImageURL(user.id, { "tag": item.PrimaryImageTag }) - end if - publicUsersNodes.push(user) - end for + publicUserIds = [] + ' load public users + if numPubUsers > 0 + for each item in publicUsers + user = CreateObject("roSGNode", "PublicUserData") + user.id = item.Id + user.name = item.Name + if isValid(item.PrimaryImageTag) + user.ImageURL = UserImageURL(user.id, { "tag": item.PrimaryImageTag }) + end if + publicUsersNodes.push(user) + publicUserIds.push(user.id) + end for + end if + ' load saved users for this server id + if numSavedUsers > 0 + for each savedUser in savedUsers + if isValid(savedUser.serverId) and savedUser.serverId = m.global.session.server.id + ' only show unique userids on screen. + if not arrayHasValue(publicUserIds, savedUser.Id) + user = CreateObject("roSGNode", "PublicUserData") + user.id = savedUser.Id + + if isValid(savedUser.username) + user.name = savedUser.username + end if + + publicUsersNodes.push(user) + end if + end if + end for + end if + ' push all users to the user select view userSelected = CreateUserSelectGroup(publicUsersNodes) SendPerformanceBeacon("AppDialogComplete") ' Roku Performance monitoring - Dialog Closed @@ -89,8 +118,7 @@ function LoginFlow() unset_user_setting("username") else print "Success! Auth token is still valid" - session.user.Login(currentUser) - session.user.LoadUserPreferences() + session.user.Login(currentUser, true) LoadUserAbilities() return true end if @@ -102,8 +130,7 @@ function LoginFlow() userData = get_token(userSelected, "") if isValid(userData) print "login success!" - session.user.Login(userData) - session.user.LoadUserPreferences() + session.user.Login(userData, true) LoadUserAbilities() return true else @@ -145,8 +172,7 @@ function LoginFlow() userData = get_token(myUsername, "") if isValid(userData) print "login success!" - session.user.Login(userData) - session.user.LoadUserPreferences() + session.user.Login(userData, true) LoadUserAbilities() return true else @@ -158,7 +184,7 @@ function LoginFlow() end if else print "Success! Auth token is still valid" - session.user.Login(currentUser) + session.user.Login(currentUser, true) end if else print "No auth token found in registry" @@ -172,7 +198,6 @@ function LoginFlow() goto start_login end if - session.user.LoadUserPreferences() LoadUserAbilities() m.global.sceneManager.callFunc("clearScenes") @@ -282,11 +307,11 @@ function CreateServerGroup() m.scene.dialog = dialog serverUrl = standardize_jellyfin_url(screen.serverUrl) - set_setting("server", serverUrl) isConnected = session.server.UpdateURL(serverUrl) serverInfoResult = invalid if isConnected + set_setting("server", serverUrl) serverInfoResult = ServerInfo() end if dialog.close = true @@ -302,9 +327,10 @@ function CreateServerGroup() ' If server redirected received, update the URL if isValid(serverInfoResult.UpdatedUrl) serverUrl = serverInfoResult.UpdatedUrl - set_setting("server", serverUrl) + isConnected = session.server.UpdateURL(serverUrl) if isConnected + set_setting("server", serverUrl) screen.visible = false return "" end if @@ -450,11 +476,14 @@ function CreateSigninGroup(user = "") ' Validate credentials activeUser = get_token(username.value, password.value) if isValid(activeUser) - session.user.Login(activeUser) - ' save credentials + print "activeUser=", activeUser if checkbox.checkedState[0] = true + ' save credentials + session.user.Login(activeUser, true) set_user_setting("token", activeUser.token) set_user_setting("username", username.value) + else + session.user.Login(activeUser) end if return "true" end if @@ -569,6 +598,7 @@ function CreateMovieDetailsGroup(movie as object) as dynamic end if ' start building MovieDetails view group = CreateObject("roSGNode", "MovieDetails") + group.observeField("quickPlayNode", m.port) group.overhangTitle = movie.title group.optionsAvailable = false group.trailerAvailable = false @@ -622,6 +652,7 @@ function CreateSeriesDetailsGroup(seriesID as string) as dynamic group.seasonData = seasonData ' watch for button presses group.observeField("seasonSelected", m.port) + group.observeField("quickPlayNode", m.port) ' setup and load series extras extras = group.findNode("extrasGrid") extras.observeField("selectedItem", m.port) @@ -674,6 +705,7 @@ function CreateArtistView(artist as object) as dynamic group.observeField("appearsOnSelected", m.port) end if + group.observeField("quickPlayNode", m.port) m.global.sceneManager.callFunc("pushScene", group) return group @@ -792,6 +824,7 @@ function CreateItemGrid(libraryItem as object) as dynamic group.parentItem = libraryItem group.optionsAvailable = true group.observeField("selectedItem", m.port) + group.observeField("quickPlayNode", m.port) return group end function @@ -803,6 +836,7 @@ function CreateMovieLibraryView(libraryItem as object) as dynamic group.parentItem = libraryItem group.optionsAvailable = true group.observeField("selectedItem", m.port) + group.observeField("quickPlayNode", m.port) return group end function @@ -814,6 +848,7 @@ function CreateMusicLibraryView(libraryItem as object) as dynamic group.parentItem = libraryItem group.optionsAvailable = true group.observeField("selectedItem", m.port) + group.observeField("quickPlayNode", m.port) return group end function diff --git a/source/VideoPlayer.brs b/source/VideoPlayer.brs index d8615ec7c..f992b1cd4 100644 --- a/source/VideoPlayer.brs +++ b/source/VideoPlayer.brs @@ -468,7 +468,8 @@ end sub ' Returns an array of playback info to be displayed during playback. ' In the future, with a custom playback info view, we can return an associated array. function GetPlaybackInfo() - sessions = api.sessions.Get() + sessions = api.sessions.Get({ "deviceId": m.global.device.serverDeviceName }) + if isValid(sessions) and sessions.Count() > 0 return GetTranscodingStats(sessions[0]) end if diff --git a/source/api/Items.brs b/source/api/Items.brs index 1fc244821..c61ee8564 100644 --- a/source/api/Items.brs +++ b/source/api/Items.brs @@ -221,15 +221,20 @@ function AppearsOnList(id as string) end function ' Get list of songs belonging to an artist -function GetSongsByArtist(id as string) +function GetSongsByArtist(id as string, params = {} as object) url = Substitute("Users/{0}/Items", m.global.session.user.id) - resp = APIRequest(url, { + paramArray = { "AlbumArtistIds": id, "includeitemtypes": "Audio", "sortBy": "SortName", "Recursive": true - }) + } + ' overwrite defaults with the params provided + for each param in params + paramArray.AddReplace(param, params[param]) + end for + resp = APIRequest(url, paramArray) data = getJson(resp) results = [] @@ -406,7 +411,7 @@ function TVSeasons(id as string) as dynamic results = [] for each item in data.Items imgParams = { "AddPlayedIndicator": item.UserData.Played } - tmp = CreateObject("roSGNode", "TVEpisodeData") + tmp = CreateObject("roSGNode", "TVSeasonData") tmp.image = PosterImage(item.id, imgParams) tmp.json = item results.push(tmp) diff --git a/source/api/baserequest.brs b/source/api/baserequest.brs index 103461339..d68fcba45 100644 --- a/source/api/baserequest.brs +++ b/source/api/baserequest.brs @@ -205,11 +205,7 @@ function authRequest(request as object) as object auth = auth + ", UserId=" + QUOTE + m.global.session.user.id + QUOTE end if - if m.global.session.user <> invalid and m.global.session.user.friendlyName <> invalid - auth = auth + ", DeviceId=" + QUOTE + m.global.device.id + m.global.session.user.friendlyName + QUOTE - else - auth = auth + ", DeviceId=" + QUOTE + m.global.device.id + QUOTE - end if + auth = auth + ", DeviceId=" + QUOTE + m.global.device.serverDeviceName + QUOTE if m.global.session.user.authToken <> invalid auth = auth + ", Token=" + QUOTE + m.global.session.user.authToken + QUOTE diff --git a/source/api/sdk.bs b/source/api/sdk.bs index 51bca7834..9cd713f91 100644 --- a/source/api/sdk.bs +++ b/source/api/sdk.bs @@ -1200,8 +1200,8 @@ namespace api end function ' Gets the original items of a playlist. - function GetItems(id as string, params = {} as object) - req = APIRequest(Substitute("/playlists/{0}/items", id), params) + function GetItems(playlistID as string, params = {} as object) + req = APIRequest(Substitute("/playlists/{0}/items", playlistID), params) return getJson(req) end function @@ -1374,7 +1374,7 @@ namespace api end function ' Gets a list of sessions. - function Get(params = { "deviceId": m.global.device.id } as object) + function Get(params = { "deviceId": m.global.device.serverDeviceName } as object) req = APIRequest("/sessions", params) return getJson(req) end function diff --git a/source/api/userauth.brs b/source/api/userauth.brs index 33f32252e..a49d156e2 100644 --- a/source/api/userauth.brs +++ b/source/api/userauth.brs @@ -33,7 +33,7 @@ function AboutMe(id = "" as string) end function sub SignOut(deleteSavedEntry = true as boolean) - if m.global.session.user.id <> invalid and deleteSavedEntry = true + if deleteSavedEntry unset_user_setting("token") unset_user_setting("username") end if diff --git a/source/migrations.bs b/source/migrations.bs new file mode 100644 index 000000000..3f6359ea8 --- /dev/null +++ b/source/migrations.bs @@ -0,0 +1,70 @@ +import "pkg:/source/utils/misc.brs" + +' Functions that update the registry based on the last run version and the currently running version + +' Run all necessary registry mirations on the "global" Jellyfin registry section +sub runGlobalMigrations() + ' Global registry migrations + if isValid(m.global.app.lastRunVersion) and not versionChecker(m.global.app.lastRunVersion, "1.7.0") + ' last app version used was less than 1.7.0 + print "Running 1.7.0 global registry migrations" + ' no longer saving raw password to registry + ' auth token and username are now stored in user settings and not global settings + + savedUserId = get_setting("active_user") + if isValid(savedUserId) + registry_write("serverId", m.global.session.server.id, savedUserId) + ' copy saved credentials to user block + savedUsername = get_setting("username") + if isValid(savedUsername) + registry_write("username", savedUsername, savedUserId) + end if + + savedToken = get_setting("token") + if isValid(savedToken) + registry_write("token", savedToken, savedUserId) + end if + end if + unset_setting("port") + unset_setting("token") + unset_setting("username") + unset_setting("password") + ' remove saved credentials from saved_servers + saved = get_setting("saved_servers") + if isValid(saved) + savedServers = ParseJson(saved) + if isValid(savedServers.serverList) and savedServers.serverList.Count() > 0 + newServers = { serverList: [] } + for each item in savedServers.serverList + item.Delete("username") + item.Delete("password") + newServers.serverList.Push(item) + end for + set_setting("saved_servers", FormatJson(newServers)) + end if + end if + end if + if m.global.app.lastRunVersion <> invalid + runRegistryUserMigrations(m.global.app.lastRunVersion) + end if +end sub + +sub runRegistryUserMigrations(version as string) + regSections = getRegistrySections() + for each section in regSections + if LCase(section) <> "jellyfin" + if version = "1.7.0" + print "Running User Registry Migration for 1.7.0" + ' now saving LastRunVersion globally and per user so that we can run user specific registry migrations + ' duplicate LastRunVersion to all user settings in the registry so that we can run user specific migrations + ' + ' now saving LastRunVersion per user in addition to globally + registry_write("LastRunVersion", m.global.app.version, section) + ' no longer saving password to registry + registry_delete("password", section) + ' av1 playback no longer hidden behind user setting + registry_delete("playback.av1", section) + end if + end if + end for +end sub diff --git a/source/utils/config.brs b/source/utils/config.brs index 7b8f38877..d6c184b14 100644 --- a/source/utils/config.brs +++ b/source/utils/config.brs @@ -37,7 +37,7 @@ function RegistryReadAll(section as string) as dynamic registryData = {} for each item in regKeyList ' ignore session related tokens - if item <> "token" and item <> "username" and item <> "password" + if item <> "token" and item <> "username" and item <> "password" and LCase(item) <> "lastrunversion" if registry.Exists(item) registryData.AddReplace(item, registry.Read(item)) end if @@ -47,6 +47,12 @@ function RegistryReadAll(section as string) as dynamic return registryData end function +' Return an array of all the registry section keys +function getRegistrySections() as object + registry = CreateObject("roRegistry") + return registry.GetSectionList() +end function + ' "Jellyfin" registry accessors for the default global settings function get_setting(key, defaultValue = invalid) value = registry_read(key, "Jellyfin") @@ -94,3 +100,40 @@ function findConfigTreeKey(key as string, tree) return invalid end function + +' Returns an array of saved users from the registry +' that belong to the active server +function getSavedUsers() as object + registrySections = getRegistrySections() + + savedUsers = [] + for each section in registrySections + if LCase(section) <> "jellyfin" + savedUsers.push(section) + end if + end for + + savedServerUsers = [] + for each userId in savedUsers + userArray = { + id: userId + } + token = registry_read("token", userId) + + username = registry_read("username", userId) + if username <> invalid + userArray["username"] = username + end if + + serverId = registry_read("serverId", userId) + if serverId <> invalid + userArray["serverId"] = serverId + end if + + if username <> invalid and token <> invalid and serverId <> invalid and serverId = m.global.session.server.id + savedServerUsers.push(userArray) + end if + end for + + return savedServerUsers +end function diff --git a/source/utils/globals.brs b/source/utils/globals.brs index 943984c7a..2c3dd2a76 100644 --- a/source/utils/globals.brs +++ b/source/utils/globals.brs @@ -28,11 +28,13 @@ end sub ' Save information from roAppInfo to m.global.app sub SaveAppToGlobal() appInfo = CreateObject("roAppInfo") + lastRunVersion = get_setting("LastRunVersion") m.global.addFields({ app: { id: appInfo.GetID(), isDev: appInfo.IsDev(), - version: appInfo.GetVersion() + version: appInfo.GetVersion(), + lastRunVersion: lastRunVersion } }) end sub @@ -105,6 +107,7 @@ sub SaveDeviceToGlobal() uuid: deviceInfo.GetRandomUUID(), name: displayName, friendlyName: filteredFriendly, + serverDeviceName: deviceInfo.getChannelClientID(), model: deviceInfo.GetModel(), modelType: deviceInfo.GetModelType(), modelDetails: deviceInfo.GetModelDetails(), diff --git a/source/utils/misc.brs b/source/utils/misc.brs index f91b8b16c..4138a0c9a 100644 --- a/source/utils/misc.brs +++ b/source/utils/misc.brs @@ -392,3 +392,13 @@ function arrayHasValue(arr as object, value as dynamic) as boolean end for return false end function + +' Takes an array of data, shuffles the order, then returns the array +' uses the Fisher-Yates shuffling algorithm +function shuffleArray(array as object) as object + for i = array.count() - 1 to 1 step -1 + j = Rnd(i + 1) - 1 + t = array[i] : array[i] = array[j] : array[j] = t + end for + return array +end function diff --git a/source/utils/quickplay.bs b/source/utils/quickplay.bs new file mode 100644 index 000000000..794d8ef67 --- /dev/null +++ b/source/utils/quickplay.bs @@ -0,0 +1,585 @@ +' All of the Quick Play logic seperated by media type +namespace quickplay + + ' Takes an array of items and adds to global queue. + ' Also shuffles the playlist if asked + sub pushToQueue(queueArray as object, shufflePlay = false as boolean) + if isValidAndNotEmpty(queueArray) + ' load everything + for each item in queueArray + m.global.queueManager.callFunc("push", item) + end for + ' shuffle the playlist if asked + if shufflePlay and m.global.queueManager.callFunc("getCount") > 1 + m.global.queueManager.callFunc("toggleShuffle") + end if + end if + end sub + + ' A single video file. + sub video(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) or not isValid(itemNode.json) then return + + ' attempt to play video file. resume if possible + if isValid(itemNode.selectedVideoStreamId) + itemNode.id = itemNode.selectedVideoStreamId + end if + + audio_stream_idx = 0 + if isValid(itemNode.selectedAudioStreamIndex) and itemNode.selectedAudioStreamIndex > 0 + audio_stream_idx = itemNode.selectedAudioStreamIndex + end if + itemNode.selectedAudioStreamIndex = audio_stream_idx + + playbackPosition = 0 + if isValid(itemNode.json.userdata) and isValid(itemNode.json.userdata.PlaybackPositionTicks) + playbackPosition = itemNode.json.userdata.PlaybackPositionTicks + end if + itemNode.startingPoint = playbackPosition + + m.global.queueManager.callFunc("push", itemNode) + end sub + + ' A single audio file. + sub audio(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) then return + + m.global.queueManager.callFunc("push", itemNode) + end sub + + ' A single music video file. + sub musicVideo(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) or not isValid(itemNode.json) then return + + m.global.queueManager.callFunc("push", itemNode) + end sub + + ' A music album. + ' Play the entire album starting with track 1. + sub album(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) then return + + ' grab list of songs in the album + albumSongs = api.users.GetItemsByQuery(m.global.session.user.id, { + "parentId": itemNode.id, + "imageTypeLimit": 1, + "sortBy": "SortName", + "limit": 2000, + "enableUserData": false, + "EnableTotalRecordCount": false + }) + if isValid(albumSongs) and isValidAndNotEmpty(albumSongs.items) + quickplay.pushToQueue(albumSongs.items) + end if + end sub + + ' A music artist. + ' Shuffle play all songs by artist. + sub artist(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) then return + + ' get all songs by artist + artistSongs = api.users.GetItemsByQuery(m.global.session.user.id, { + "artistIds": itemNode.id, + "includeItemTypes": "Audio", + "sortBy": "Album", + "limit": 2000, + "imageTypeLimit": 1, + "Recursive": true, + "enableUserData": false, + "EnableTotalRecordCount": false + }) + print "artistSongs=", artistSongs + + if isValid(artistSongs) and isValidAndNotEmpty(artistSongs.items) + quickplay.pushToQueue(artistSongs.items, true) + end if + end sub + + ' A boxset. + ' Play all items inside. + sub boxset(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) then return + + data = api.items.GetByQuery({ + "userid": m.global.session.user.id, + "parentid": itemNode.id, + "limit": 2000, + "EnableTotalRecordCount": false + }) + if isValid(data) and isValidAndNotEmpty(data.Items) + quickplay.pushToQueue(data.items) + end if + end sub + + ' A TV Show Series. + ' Play the first unwatched episode. + ' If none, shuffle play the whole series. + sub series(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) then return + + data = api.shows.GetNextUp({ + "seriesId": itemNode.id, + "recursive": true, + "SortBy": "DatePlayed", + "SortOrder": "Descending", + "ImageTypeLimit": 1, + "UserId": m.global.session.user.id, + "EnableRewatching": false, + "DisableFirstEpisode": false, + "EnableTotalRecordCount": false + }) + + if isValid(data) and isValidAndNotEmpty(data.Items) + ' there are unwatched episodes + m.global.queueManager.callFunc("push", data.Items[0]) + else + ' next up check was empty + ' check for a resumable episode + data = api.users.GetResumeItemsByQuery(m.global.session.user.id, { + "parentId": itemNode.id, + "userid": m.global.session.user.id, + "SortBy": "DatePlayed", + "recursive": true, + "SortOrder": "Descending", + "Filters": "IsResumable", + "EnableTotalRecordCount": false + }) + print "resumeitems data=", data + if isValid(data) and isValidAndNotEmpty(data.Items) + ' play the resumable episode + if isValid(data.Items[0].UserData) and isValid(data.Items[0].UserData.PlaybackPositionTicks) + data.Items[0].startingPoint = data.Items[0].userdata.PlaybackPositionTicks + end if + m.global.queueManager.callFunc("push", data.Items[0]) + else + ' shuffle all episodes + data = api.shows.GetEpisodes(itemNode.id, { + "userid": m.global.session.user.id, + "SortBy": "Random", + "limit": 2000, + "EnableTotalRecordCount": false + }) + + if isValid(data) and isValidAndNotEmpty(data.Items) + ' add all episodes found to a playlist + quickplay.pushToQueue(data.Items) + end if + end if + end if + end sub + + ' More than one TV Show Series. + ' Shuffle play all watched episodes + sub multipleSeries(itemNodes as object) + if isValidAndNotEmpty(itemNodes) + numTotal = 0 + numLimit = 2000 + for each tvshow in itemNodes + ' grab all watched episodes for each series + showData = api.shows.GetEpisodes(tvshow.id, { + "userId": m.global.session.user.id, + "SortBy": "Random", + "imageTypeLimit": 0, + "EnableTotalRecordCount": false, + "enableImages": false + }) + + if isValid(showData) and isValidAndNotEmpty(showData.items) + playedEpisodes = [] + ' add all played episodes to queue + for each episode in showData.items + if isValid(episode.userdata) and isValid(episode.userdata.Played) + if episode.userdata.Played + playedEpisodes.push(episode) + end if + end if + end for + quickplay.pushToQueue(playedEpisodes) + + ' keep track of how many items we've seen + numTotal = numTotal + showData.items.count() + if numTotal >= numLimit + ' stop grabbing more items if we hit our limit + exit for + end if + end if + end for + if m.global.queueManager.callFunc("getCount") > 1 + m.global.queueManager.callFunc("toggleShuffle") + end if + end if + end sub + + ' A TV Show Season. + ' Play the first unwatched episode. + ' If none, play the whole season starting with episode 1. + sub season(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) then return + + unwatchedData = api.shows.GetEpisodes(itemNode.json.SeriesId, { + "seasonId": itemNode.id, + "userid": m.global.session.user.id, + "limit": 2000, + "EnableTotalRecordCount": false + }) + + if isValid(unwatchedData) and isValidAndNotEmpty(unwatchedData.Items) + ' find the first unwatched episode + firstUnwatchedEpisodeIndex = invalid + for each item in unwatchedData.Items + if isValid(item.UserData) + if isValid(item.UserData.Played) and item.UserData.Played = false + firstUnwatchedEpisodeIndex = item.IndexNumber - 1 + if isValid(item.UserData.PlaybackPositionTicks) + item.startingPoint = item.UserData.PlaybackPositionTicks + end if + exit for + end if + end if + end for + + if isValid(firstUnwatchedEpisodeIndex) + ' add the first unwatched episode and the rest of the season to a playlist + for i = firstUnwatchedEpisodeIndex to unwatchedData.Items.count() - 1 + m.global.queueManager.callFunc("push", unwatchedData.Items[i]) + end for + else + ' try to find a "continue watching" episode + continueData = api.users.GetResumeItemsByQuery(m.global.session.user.id, { + "parentId": itemNode.id, + "userid": m.global.session.user.id, + "SortBy": "DatePlayed", + "recursive": true, + "SortOrder": "Descending", + "Filters": "IsResumable", + "EnableTotalRecordCount": false + }) + + if isValid(continueData) and isValidAndNotEmpty(continueData.Items) + ' play the resumable episode + for each item in continueData.Items + if isValid(item.UserData) and isValid(item.UserData.PlaybackPositionTicks) + item.startingPoint = item.userdata.PlaybackPositionTicks + end if + m.global.queueManager.callFunc("push", item) + end for + else + ' play the whole season in order + if isValid(unwatchedData) and isValidAndNotEmpty(unwatchedData.Items) + ' add all episodes found to a playlist + pushToQueue(unwatchedData.Items) + end if + end if + end if + end if + end sub + + ' Quick Play A Person. + ' Shuffle play all videos found + sub person(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) then return + ' get movies and videos by the person + personMovies = api.users.GetItemsByQuery(m.global.session.user.id, { + "personIds": itemNode.id, + "includeItemTypes": "Movie,Video", + "excludeItemTypes": "Season,Series", + "recursive": true, + "limit": 2000 + }) + print "personMovies=", personMovies + + if isValid(personMovies) and isValidAndNotEmpty(personMovies.Items) + ' add each item to the queue + quickplay.pushToQueue(personMovies.Items) + end if + + ' get watched episodes by the person + personEpisodes = api.users.GetItemsByQuery(m.global.session.user.id, { + "personIds": itemNode.id, + "includeItemTypes": "Episode", + "isPlayed": true, + "excludeItemTypes": "Season,Series", + "recursive": true, + "limit": 2000 + }) + print "personEpisodes=", personEpisodes + + if isValid(personEpisodes) and isValidAndNotEmpty(personEpisodes.Items) + ' add each item to the queue + quickplay.pushToQueue(personEpisodes.Items) + end if + + if m.global.queueManager.callFunc("getCount") > 1 + m.global.queueManager.callFunc("toggleShuffle") + end if + end sub + + ' Quick Play A TVChannel + sub tvChannel(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) then return + + stopLoadingSpinner() + group = CreateVideoPlayerGroup(itemNode.id) + m.global.sceneManager.callFunc("pushScene", group) + end sub + + ' Quick Play A Live Program + sub program(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.json) or not isValid(itemNode.json.ChannelId) then return + + stopLoadingSpinner() + group = CreateVideoPlayerGroup(itemNode.json.ChannelId) + m.global.sceneManager.callFunc("pushScene", group) + end sub + + ' Quick Play A Playlist. + ' Play the first unwatched episode. + ' If none, play the whole season starting with episode 1. + sub playlist(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) then return + ' get playlist items + myPlaylist = api.playlists.GetItems(itemNode.id, { + "userId": m.global.session.user.id, + "limit": 2000 + }) + + if isValid(myPlaylist) and isValidAndNotEmpty(myPlaylist.Items) + ' add each item to the queue + quickplay.pushToQueue(myPlaylist.Items) + if m.global.queueManager.callFunc("getCount") > 1 + m.global.queueManager.callFunc("toggleShuffle") + end if + end if + end sub + + ' Quick Play A folder. + ' Shuffle play all items found + sub folder(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) then return + + paramArray = { + "includeItemTypes": ["Episode", "Movie", "Video"], + "videoTypes": "VideoFile", + "sortBy": "Random", + "limit": 2000, + "imageTypeLimit": 1, + "Recursive": true, + "enableUserData": false, + "EnableTotalRecordCount": false + } + ' modify api query based on folder type + folderType = Lcase(itemNode.json.type) + if folderType = "studio" + paramArray["studioIds"] = itemNode.id + else if folderType = "genre" + paramArray["genreIds"] = itemNode.id + if isValid(itemNode.json.MovieCount) and itemNode.json.MovieCount > 0 + paramArray["includeItemTypes"] = "Movie" + end if + else if folderType = "musicgenre" + paramArray["genreIds"] = itemNode.id + paramArray.delete("videoTypes") + paramArray["includeItemTypes"] = "Audio" + else + paramArray["parentId"] = itemNode.id + end if + ' look for tv series instead of video files + if isValid(itemNode.json.SeriesCount) and itemNode.json.SeriesCount > 0 + paramArray["includeItemTypes"] = "Series" + paramArray.Delete("videoTypes") + end if + ' get folder items + folderData = api.users.GetItemsByQuery(m.global.session.user.id, paramArray) + print "folderData=", folderData + + if isValid(folderData) and isValidAndNotEmpty(folderData.items) + if isValid(itemNode.json.SeriesCount) and itemNode.json.SeriesCount > 0 + if itemNode.json.SeriesCount = 1 + quickplay.series(folderData.items[0]) + else + quickplay.multipleSeries(folderData.items) + end if + else + quickplay.pushToQueue(folderData.items, true) + end if + end if + end sub + + ' Quick Play A CollectionFolder. + ' Shuffle play the items inside + ' with some differences based on collectionType. + sub collectionFolder(itemNode as object) + if not isValid(itemNode) or not isValid(itemNode.id) then return + ' play depends on the kind of files inside the collectionfolder + print "attempting to quickplay a collection folder" + collectionType = LCase(itemNode.collectionType) + print "collectionType=", collectionType + + if collectionType = "movies" + ' get randomized list of movies inside + data = api.users.GetItemsByQuery(m.global.session.user.id, { + "parentId": itemNode.id, + "sortBy": "Random", + "limit": 2000 + }) + + if isValid(data) and isValidAndNotEmpty(data.items) + movieList = [] + ' add each item to the queue + for each item in data.Items + ' only add movies we're not currently watching + if isValid(item.userdata) and isValid(item.userdata.PlaybackPositionTicks) + if item.userdata.PlaybackPositionTicks = 0 + movieList.push(item) + end if + end if + end for + quickplay.pushToQueue(movieList) + end if + else if collectionType = "music" + ' get audio files from under this collection + ' sort songs by album then artist + songsData = api.users.GetItemsByQuery(m.global.session.user.id, { + "parentId": itemNode.id, + "includeItemTypes": "Audio", + "sortBy": "Album", + "Recursive": true, + "limit": 2000, + "imageTypeLimit": 1, + "enableUserData": false, + "EnableTotalRecordCount": false + }) + print "songsData=", songsData + if isValid(songsData) and isValidAndNotEmpty(songsData.items) + quickplay.pushToQueue(songsData.Items, true) + end if + else if collectionType = "boxsets" + ' get list of all boxsets inside + boxsetData = api.users.GetItemsByQuery(m.global.session.user.id, { + "parentId": itemNode.id, + "limit": 2000, + "imageTypeLimit": 0, + "enableUserData": false, + "EnableTotalRecordCount": false, + "enableImages": false + }) + + print "boxsetData=", boxsetData + + if isValid(boxsetData) and isValidAndNotEmpty(boxsetData.items) + ' pick a random boxset + arrayIndex = Rnd(boxsetData.items.count()) - 1 + myBoxset = boxsetData.items[arrayIndex] + ' grab list of items from boxset + print "myBoxset=", myBoxset + boxsetData = api.users.GetItemsByQuery(m.global.session.user.id, { + "parentId": myBoxset.id, + "EnableTotalRecordCount": false + }) + + if isValid(boxsetData) and isValidAndNotEmpty(boxsetData.items) + ' add all boxset items to queue + quickplay.pushToQueue(boxsetData.Items) + end if + end if + else if collectionType = "tvshows" or collectionType = "collectionfolder" + ' get list of tv shows inside + tvshowsData = api.users.GetItemsByQuery(m.global.session.user.id, { + "parentId": itemNode.id, + "sortBy": "Random", + "imageTypeLimit": 0, + "enableUserData": false, + "EnableTotalRecordCount": false, + "enableImages": false + }) + + print "tvshowsData=", tvshowsData + + if isValid(tvshowsData) and isValidAndNotEmpty(tvshowsData.items) + quickplay.multipleSeries(tvshowsData.items) + end if + else if collectionType = "musicvideos" + ' get randomized list of videos inside + data = api.users.GetItemsByQuery(m.global.session.user.id, { + "parentId": itemNode.id, + "includeItemTypes": "MusicVideo", + "sortBy": "Random", + "Recursive": true, + "limit": 2000, + "imageTypeLimit": 1, + "enableUserData": false, + "EnableTotalRecordCount": false + }) + print "data=", data + if isValid(data) and isValidAndNotEmpty(data.items) + quickplay.pushToQueue(data.Items) + end if + ' else if collectionType = "homevideos" ' also used for a "Photo" library + else + print "Quick Play WARNING: Unknown collection type" + end if + end sub + + ' Quick Play A UserView. + ' Play logic depends on "collectionType". + sub userView(itemNode as object) + ' play depends on the kind of files inside the collectionfolder + collectionType = LCase(itemNode.collectionType) + print "collectionType=", collectionType + + if collectionType = "playlists" + ' get list of all playlists inside + playlistData = api.users.GetItemsByQuery(m.global.session.user.id, { + "parentId": itemNode.id, + "imageTypeLimit": 0, + "enableUserData": false, + "EnableTotalRecordCount": false, + "enableImages": false + }) + + print "playlistData=", playlistData + + if isValid(playlistData) and isValidAndNotEmpty(playlistData.items) + ' pick a random playlist + arrayIndex = Rnd(playlistData.items.count()) - 1 + myPlaylist = playlistData.items[arrayIndex] + ' grab list of items from playlist + print "myPlaylist=", myPlaylist + playlistItems = api.playlists.GetItems(myPlaylist.id, { + "userId": m.global.session.user.id, + "EnableTotalRecordCount": false, + "limit": 2000 + }) + ' validate api results + if isValid(playlistItems) and isValidAndNotEmpty(playlistItems.items) + quickplay.pushToQueue(playlistItems.items, true) + end if + end if + else if collectionType = "livetv" + ' get list of all tv channels + channelData = api.users.GetItemsByQuery(m.global.session.user.id, { + "includeItemTypes": "TVChannel", + "sortBy": "Random", + "Recursive": true, + "imageTypeLimit": 0, + "enableUserData": false, + "EnableTotalRecordCount": false, + "enableImages": false + }) + print "channelData=", channelData + + if isValid(channelData) and isValidAndNotEmpty(channelData.items) + ' pick a random channel + arrayIndex = Rnd(channelData.items.count()) - 1 + myChannel = channelData.items[arrayIndex] + print "myChannel=", myChannel + ' play channel + quickplay.tvChannel(myChannel) + end if + else + print "Quick Play CollectionFolder WARNING: Unknown collection type" + end if + end sub + +end namespace diff --git a/source/utils/session.bs b/source/utils/session.bs index c84f3ef67..43d950b82 100644 --- a/source/utils/session.bs +++ b/source/utils/session.bs @@ -1,17 +1,20 @@ ' these are needed for ServerInfo() inside session.server.Populate() import "pkg:/source/api/userauth.brs" import "pkg:/source/api/baserequest.brs" +import "pkg:/source/migrations.bs" namespace session ' Initialize the global session array sub Init() m.global.addFields({ session: { + "memoryLevel": "normal", server: {}, user: { Configuration: {}, Policy: {}, - settings: {} + settings: {}, + lastRunVersion: invalid } } }) @@ -70,6 +73,9 @@ namespace session session.server.Delete() end if + ' migrate registry if needed + runGlobalMigrations() + return success end function @@ -121,7 +127,7 @@ namespace session ' Update the global session after user is authenticated. ' Accepts a UserData.xml object from get_token() or an assocArray from AboutMe() - sub Login(userData as object) + sub Login(userData as object, saveCredentials = false as boolean) ' validate parameters if userData = invalid or userData.id = invalid then return ' make copy of global user session array @@ -146,6 +152,12 @@ namespace session ' update global user session session.Update("user", tmpSession.user) + ' grab lastRunVersion for this user + lastRunVersion = get_user_setting("LastRunVersion") + if lastRunVersion <> invalid + session.user.Update("LastRunVersion", lastRunVersion) + end if + ' update user session settings with values from registry userSettings = RegistryReadAll(tmpSession.user.id) for each setting in userSettings @@ -156,14 +168,30 @@ namespace session print "m.global.session.user.settings = ", m.global.session.user.settings end if - if m.global.session.user.settings["global.rememberme"] + set_user_setting("serverId", m.global.session.server.id) + + if saveCredentials set_user_setting("token", tmpSession.user.authToken) set_user_setting("username", tmpSession.user.name) end if + + session.user.LoadUserPreferences() + end sub + + ' Sets the global server device name value used by the API + sub SetServerDeviceName() + if isValid(m.global.session.user) and isValid(m.global.session.user.friendlyName) + m.global.device.serverDeviceName = m.global.device.id + m.global.session.user.friendlyName + else + m.global.device.serverDeviceName = m.global.device.id + end if end sub ' Load and parse Display Settings from server sub LoadUserPreferences() + ' Save device id so we don't calculate it every time we need it + session.user.SetServerDeviceName() + id = m.global.session.user.id ' Currently using client "emby", which is what website uses so we get same Display prefs as web. ' May want to change to specific Roku display settings @@ -324,6 +352,9 @@ namespace session session.user.settings.Save(item, get_setting(item)) end if end for + + ' Reset server device name state + session.user.SetServerDeviceName() end sub ' Saves the user setting to the global session.