From 312e6731e4bc4a50ac7c87afc37e775f1652c54f Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 18 Nov 2023 08:38:57 -0500 Subject: [PATCH 01/82] increase font size for unwatched episode count --- components/ItemGrid/GridItem.xml | 2 +- components/ListPoster.xml | 2 +- components/home/HomeItem.xml | 2 +- components/tvshows/TVEpisodes.xml | 2 +- components/tvshows/TVShowDetails.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/components/ItemGrid/GridItem.xml b/components/ItemGrid/GridItem.xml index ce615fb1e7..2bd177c8da 100644 --- a/components/ItemGrid/GridItem.xml +++ b/components/ItemGrid/GridItem.xml @@ -5,7 +5,7 @@ - diff --git a/components/ListPoster.xml b/components/ListPoster.xml index 4e70e8f406..391cb95b4e 100644 --- a/components/ListPoster.xml +++ b/components/ListPoster.xml @@ -5,7 +5,7 @@ - diff --git a/components/home/HomeItem.xml b/components/home/HomeItem.xml index f401da9598..334a843a8e 100644 --- a/components/home/HomeItem.xml +++ b/components/home/HomeItem.xml @@ -5,7 +5,7 @@ - diff --git a/components/tvshows/TVEpisodes.xml b/components/tvshows/TVEpisodes.xml index ec2dd9520b..06af1fe943 100644 --- a/components/tvshows/TVEpisodes.xml +++ b/components/tvshows/TVEpisodes.xml @@ -3,7 +3,7 @@ - diff --git a/components/tvshows/TVShowDetails.xml b/components/tvshows/TVShowDetails.xml index 197ee81cfd..6183100466 100644 --- a/components/tvshows/TVShowDetails.xml +++ b/components/tvshows/TVShowDetails.xml @@ -5,7 +5,7 @@ - From 328e6f088fff12dc698ed8db6eed99f652581939 Mon Sep 17 00:00:00 2001 From: David Wendorff Date: Sat, 18 Nov 2023 12:28:38 +0000 Subject: [PATCH 02/82] Translated using Weblate (German) Currently translated at 26.0% (71 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/de/ --- locale/de_DE/translations.ts | 141 +++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts index 4f3a6ceb91..0ea164867f 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -13150,5 +13150,146 @@ Episodes Episoden + + Change Server + Server wechseln + + + Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc) + NO_ITEMS + Diese(r) %1 enthält keine Elemente + + + Extras + Extras + + + Sign Out + Ausloggen + + + Save Credentials? + Anmeldeinformationen speichern? + + + On Now + Gerade läuft + + + Episodes + Episoden + + + RUNTIME + Spieldauer + + + More Like This + Empfehlungen + + + Title of Tab for options to sort library content + TAB_SORT + Sortieren + + + Died + Gestorben am + + + Error loading Channel Data + Fehler beim laden von Kanaldaten + + + Delete Saved + Gespeicherte löschen + + + Title of Tab for options to filter library content + TAB_FILTER + Filtern + + + RELEASE_DATE + Veröffentlichungsdatum + + + Error During Playback + Wiedergabefehler + Dialog title when error occurs during playback + + + Name or Title field of media item + TITLE + Name + + + Title of Tab for switching "views" when looking at a library + TAB_VIEW + Ansicht + + + CRITIC_RATING + Kritiker:innen Bewertung + + + Age + Alter + + + Cast & Crew + Mitwirkende + + + Press 'OK' to Close + 'OK' drücken zum Schließen + + + OFFICIAL_RATING + Jugendfreigabe + + + There was an error retrieving the data for this item from the server. + Es gab einen Fehler beim Laden dieses Inhalts von dem Server. + Dialog detail when unable to load Content from Server + + + An error was encountered while playing this item. + Ein Fehler bei der Wiedergabe dieses Inhalts ist aufgetreten. + Dialog detail when error occurs during playback + + + Loading Channel Data + Laden von Kanaldaten + + + Unable to load Channel Data from the server + Laden der Kanaldaten vom Server nicht möglich + + + Born + Geburtsdatum + + + IMDB_RATING + IMDb Bewertung + + + PLAY_COUNT + Anzahl der Wiedergaben + + + DATE_PLAYED + Wiedergegeben am + + + DATE_ADDED + Hinzugefügt am + + + Error Retrieving Content + Fehler beim Laden + Dialog title when unable to load Content from Server + From 388bd0a371b7c3b21a8c153e0766166c690e4ad1 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 18 Nov 2023 09:38:36 -0500 Subject: [PATCH 03/82] fix episode list bug where OK was triggering quickplay --- components/tvshows/TVEpisodes.bs | 55 ++++++++++++++++++++----------- components/tvshows/TVEpisodes.xml | 1 + source/ShowScenes.bs | 2 +- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/components/tvshows/TVEpisodes.bs b/components/tvshows/TVEpisodes.bs index 583e4d30b0..f820357d15 100644 --- a/components/tvshows/TVEpisodes.bs +++ b/components/tvshows/TVEpisodes.bs @@ -46,10 +46,28 @@ sub updateSeason() m.top.overhangTitle = m.top.seasonData.SeriesName + " - " + m.top.seasonData.name end sub +' get the currently focused item +function getFocusedItem() as dynamic + if isValid(m.top.focusedChild) and isValid(m.top.focusedChild.focusedChild) + focusedChild = m.top.focusedChild.focusedChild + if not isValid(focusedChild.content) then return invalid + m.top.lastFocus = focusedChild + else + return invalid + end if + + if isValidAndNotEmpty(focusedChild.rowItemFocused) + itemToPlay = focusedChild.content.getChild(focusedChild.rowItemFocused[0]).getChild(0) + if isValid(itemToPlay) and isValidAndNotEmpty(itemToPlay.id) + return itemToPlay + end if + end if + + return invalid +end function + ' Handle navigation input from the remote and act on it function onKeyEvent(key as string, press as boolean) as boolean - handled = false - if key = "left" and m.tvEpisodeRow.hasFocus() m.shuffle.setFocus(true) return true @@ -70,7 +88,15 @@ function onKeyEvent(key as string, press as boolean) as boolean return true end if - if key = "OK" or key = "play" + if key = "OK" + if m.tvEpisodeRow.isInFocusChain() + focusedItem = getFocusedItem() + if isValid(focusedItem) + m.top.selectedItem = focusedItem + end if + return true + end if + if m.shuffle.hasFocus() episodeList = m.rows.getChild(0).objects.items @@ -97,22 +123,13 @@ function onKeyEvent(key as string, press as boolean) as boolean end if end if - focusedChild = m.top.focusedChild.focusedChild - if focusedChild.content = invalid then return handled - - ' OK needs to be handled on release... - proceed = false - if key = "OK" - proceed = true - end if - - if press and key = "play" or proceed = true - m.top.lastFocus = focusedChild - itemToPlay = focusedChild.content.getChild(focusedChild.rowItemFocused[0]).getChild(0) - if isValid(itemToPlay) and isValid(itemToPlay.id) and itemToPlay.id <> "" - m.top.quickPlayNode = itemToPlay + if key = "play" + focusedItem = getFocusedItem() + if isValid(focusedItem) + m.top.quickPlayNode = focusedItem end if - handled = true + return true end if - return handled + + return false end function diff --git a/components/tvshows/TVEpisodes.xml b/components/tvshows/TVEpisodes.xml index ec2dd9520b..84d26f5df0 100644 --- a/components/tvshows/TVEpisodes.xml +++ b/components/tvshows/TVEpisodes.xml @@ -12,6 +12,7 @@ + diff --git a/source/ShowScenes.bs b/source/ShowScenes.bs index dca7b2b28f..4f301b7c96 100644 --- a/source/ShowScenes.bs +++ b/source/ShowScenes.bs @@ -790,7 +790,7 @@ function CreateSeasonDetailsGroup(series as object, season as object) as dynamic group.extrasObjects = TVSeasonExtras(season.id) ' watch for button presses - group.observeField("episodeSelected", m.port) + group.observeField("selectedItem", m.port) group.observeField("quickPlayNode", m.port) ' finished building SeasonDetails view stopLoadingSpinner() From 605f34a1a39d45e1ddaab10e010ef5f7ce6cdd27 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 18 Nov 2023 17:54:25 -0500 Subject: [PATCH 04/82] use loading spinners for selectedItem in main loop --- components/JFScene.xml | 1 + source/Main.bs | 32 +++++++++++++++++++++---- source/ShowScenes.bs | 10 ++++---- source/utils/misc.bs | 53 +++++++++++++++++++++++++++++++----------- 4 files changed, 74 insertions(+), 22 deletions(-) diff --git a/components/JFScene.xml b/components/JFScene.xml index 4bed5a467f..56416c06b9 100644 --- a/components/JFScene.xml +++ b/components/JFScene.xml @@ -5,6 +5,7 @@ + \ No newline at end of file diff --git a/source/Main.bs b/source/Main.bs index e805176a9d..b2e750439a 100644 --- a/source/Main.bs +++ b/source/Main.bs @@ -129,8 +129,6 @@ sub Main (args as dynamic) as void ' measure processing time timeSpan = CreateObject("roTimespan") - startMediaLoadingSpinner() - group = sceneManager.callFunc("getActiveScene") reportingNode = msg.getRoSGNode() itemNode = invalid @@ -162,6 +160,10 @@ sub Main (args as dynamic) as void ' can't play the item without knowing what type it is if isValid(itemType) + if not isValid(m.scene) + m.scene = m.top.getScene() + end if + startMediaLoadingSpinner() m.global.queueManager.callFunc("clear") ' empty queue/playlist m.global.queueManager.callFunc("resetShuffle") ' turn shuffle off @@ -206,7 +208,7 @@ sub Main (args as dynamic) as void else if itemType = "photoalbum" quickplay.photoAlbum(itemNode) end if - + stopLoadingSpinner() m.global.queueManager.callFunc("playQueue") end if end if @@ -217,6 +219,10 @@ sub Main (args as dynamic) as void ' If you select a library from ANYWHERE, follow this flow selectedItem = msg.getData() if isValid(selectedItem) + if not isValid(m.scene) + m.scene = m.top.getScene() + end if + startMediaLoadingSpinner() selectedItemType = selectedItem.type @@ -228,6 +234,7 @@ sub Main (args as dynamic) as void else group = CreateItemGrid(selectedItem) end if + stopLoadingSpinner() sceneManager.callFunc("pushScene", group) else if selectedItemType = "Folder" and selectedItem.json.type = "Genre" ' User clicked on a genre folder @@ -236,12 +243,15 @@ sub Main (args as dynamic) as void else group = CreateItemGrid(selectedItem) end if + stopLoadingSpinner() sceneManager.callFunc("pushScene", group) else if selectedItemType = "Folder" and selectedItem.json.type = "MusicGenre" group = CreateMusicLibraryView(selectedItem) + stopLoadingSpinner() sceneManager.callFunc("pushScene", group) else if selectedItemType = "UserView" or selectedItemType = "Folder" or selectedItemType = "Channel" or selectedItemType = "Boxset" group = CreateItemGrid(selectedItem) + stopLoadingSpinner() sceneManager.callFunc("pushScene", group) else if selectedItemType = "Episode" ' User has selected a TV episode they want us to play @@ -251,7 +261,7 @@ sub Main (args as dynamic) as void end if selectedItem.selectedAudioStreamIndex = audio_stream_idx - + stopLoadingSpinner() ' Display playback options dialog if selectedItem.json.userdata.PlaybackPositionTicks > 0 m.global.queueManager.callFunc("hold", selectedItem) @@ -264,16 +274,20 @@ sub Main (args as dynamic) as void else if selectedItemType = "Series" group = CreateSeriesDetailsGroup(selectedItem.json.id) + stopLoadingSpinner() else if selectedItemType = "Season" group = CreateSeasonDetailsGroupByID(selectedItem.json.SeriesId, selectedItem.id) + stopLoadingSpinner() else if selectedItemType = "Movie" ' open movie detail page group = CreateMovieDetailsGroup(selectedItem) + stopLoadingSpinner() else if selectedItemType = "Person" CreatePersonView(selectedItem) + stopLoadingSpinner() else if selectedItemType = "TvChannel" or selectedItemType = "Video" or selectedItemType = "Program" ' User selected a Live TV channel / program - + stopLoadingSpinner() ' Show Channel Loading spinner dialog = createObject("roSGNode", "ProgressDialog") dialog.title = tr("Loading Channel Data") @@ -304,6 +318,7 @@ sub Main (args as dynamic) as void quickplay.photo(selectedItem) end if + stopLoadingSpinner() else if selectedItemType = "PhotoAlbum" print "a photo album was selected" print "selectedItem=", selectedItem @@ -322,24 +337,31 @@ sub Main (args as dynamic) as void photoPlayer.itemIndex = 0 m.global.sceneManager.callfunc("pushScene", photoPlayer) end if + stopLoadingSpinner() else if selectedItemType = "MusicArtist" group = CreateArtistView(selectedItem.json) + stopLoadingSpinner() if not isValid(group) message_dialog(tr("Unable to find any albums or songs belonging to this artist")) end if else if selectedItemType = "MusicAlbum" group = CreateAlbumView(selectedItem.json) + stopLoadingSpinner() else if selectedItemType = "MusicVideo" group = CreateMovieDetailsGroup(selectedItem) + stopLoadingSpinner() else if selectedItemType = "Playlist" group = CreatePlaylistView(selectedItem.json) + stopLoadingSpinner() else if selectedItemType = "Audio" m.global.queueManager.callFunc("clear") m.global.queueManager.callFunc("resetShuffle") m.global.queueManager.callFunc("push", selectedItem.json) + stopLoadingSpinner() m.global.queueManager.callFunc("playQueue") else ' TODO - switch on more node types + stopLoadingSpinner() message_dialog("This type is not yet supported: " + selectedItemType + ".") end if end if diff --git a/source/ShowScenes.bs b/source/ShowScenes.bs index dca7b2b28f..ab9348ab9c 100644 --- a/source/ShowScenes.bs +++ b/source/ShowScenes.bs @@ -813,17 +813,19 @@ function CreateSeasonDetailsGroupByID(seriesID as string, seasonID as string) as group = CreateObject("roSGNode", "TVEpisodes") group.optionsAvailable = false ' push scene asap (to prevent extra button presses when retriving series/movie info) - m.global.sceneManager.callFunc("pushScene", group) group.seasonData = seasonMetaData.json group.objects = TVEpisodes(seriesID, seasonID) group.episodeObjects = group.objects - group.extrasObjects = TVSeasonExtras(seasonID) - ' watch for button presses group.observeField("episodeSelected", m.port) group.observeField("quickPlayNode", m.port) - ' finished building SeasonDetails view + ' don't wait for the extras button stopLoadingSpinner() + m.global.sceneManager.callFunc("pushScene", group) + ' check for specials/extras for this season + group.extrasObjects = TVSeasonExtras(seasonID) + + ' finished building SeasonDetails view return group end function diff --git a/source/utils/misc.bs b/source/utils/misc.bs index 3cb48ed96f..66ec3d2735 100644 --- a/source/utils/misc.bs +++ b/source/utils/misc.bs @@ -452,26 +452,53 @@ function toString(input) as string end function sub startLoadingSpinner() - m.spinner = createObject("roSGNode", "Spinner") - m.spinner.translation = "[900, 450]" - m.spinner.visible = true - m.scene.appendChild(m.spinner) + if not isValid(m.scene) + m.scene = m.top.getScene() + end if + + if not m.scene.isLoading + m.scene.isLoading = true + + m.spinner = createObject("roSGNode", "Spinner") + m.spinner.translation = "[900, 450]" + m.spinner.visible = true + + m.scene.appendChild(m.spinner) + end if end sub sub startMediaLoadingSpinner() - dialog = createObject("roSGNode", "ProgressDialog") - dialog.id = "invisibiledialog" - dialog.visible = false - m.scene.dialog = dialog - startLoadingSpinner() + if not isValid(m.scene) + m.scene = m.top.getScene() + end if + + if not m.scene.isLoading + dialog = createObject("roSGNode", "ProgressDialog") + dialog.id = "invisibiledialog" + dialog.visible = false + m.scene.dialog = dialog + + startLoadingSpinner() + end if end sub sub stopLoadingSpinner() - if isValid(m.spinner) - m.spinner.visible = false + if not isValid(m.scene) + m.scene = m.top.getScene() end if - if isValid(m.scene) and isValid(m.scene.dialog) - m.scene.dialog.close = true + + if m.scene.isLoading + m.scene.isLoading = false + if isValid(m.spinner) + m.spinner.visible = false + end if + if isValid(m.scene) and isValid(m.scene.dialog) + if m.scene.dialog.isSubType("ProgressDialog") + m.scene.dialog.close = true + else if m.scene.dialog.isSubType("Spinner") + m.scene.dialog.close = true + end if + end if end if end sub From 26cf3517f853a089cafaca945d449a3ee84aa7bf Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 18 Nov 2023 17:59:22 -0500 Subject: [PATCH 05/82] remove duplicate code --- source/Main.bs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/source/Main.bs b/source/Main.bs index b2e750439a..957259efa1 100644 --- a/source/Main.bs +++ b/source/Main.bs @@ -160,9 +160,6 @@ sub Main (args as dynamic) as void ' can't play the item without knowing what type it is if isValid(itemType) - if not isValid(m.scene) - m.scene = m.top.getScene() - end if startMediaLoadingSpinner() m.global.queueManager.callFunc("clear") ' empty queue/playlist m.global.queueManager.callFunc("resetShuffle") ' turn shuffle off @@ -219,9 +216,6 @@ sub Main (args as dynamic) as void ' If you select a library from ANYWHERE, follow this flow selectedItem = msg.getData() if isValid(selectedItem) - if not isValid(m.scene) - m.scene = m.top.getScene() - end if startMediaLoadingSpinner() selectedItemType = selectedItem.type From 3942636b7a88a9fc774798a17d532efe271817f1 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:43:05 -0500 Subject: [PATCH 06/82] Return to OSD on dialog close Fixes #1504 --- components/video/OSD.bs | 5 +++++ components/video/VideoPlayerView.bs | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/components/video/OSD.bs b/components/video/OSD.bs index fe27a45311..fe640a1e77 100644 --- a/components/video/OSD.bs +++ b/components/video/OSD.bs @@ -110,6 +110,11 @@ end sub ' inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu. ' sub inactiveCheck() + ' If user is currently seeing a dialog box, ignore inactive check + if m.global.sceneManager.callFunc("isDialogOpen") + return + end if + if m.deviceInfo.timeSinceLastKeypress() >= m.top.inactiveTimeout m.top.action = "hide" end if diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index d3d6bbaffc..11fe9d2767 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -161,14 +161,12 @@ end sub ' sub handleShowSubtitleMenuAction() m.top.selectSubtitlePressed = true - handleHideAction(false) end sub ' handleShowVideoInfoPopupAction: Handles action to show video info popup ' sub handleShowVideoInfoPopupAction() m.top.selectPlaybackInfoPressed = true - handleHideAction(false) end sub ' onOSDAction: Process action events from OSD to their respective handlers From e403b2ce331c359d53f6bd6a012c8bfe97833421 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Sun, 19 Nov 2023 12:22:50 +0000 Subject: [PATCH 07/82] Update API docs --- docs/api/components_video_OSD.bs.html | 5 +++++ docs/api/components_video_VideoPlayerView.bs.html | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/api/components_video_OSD.bs.html b/docs/api/components_video_OSD.bs.html index 7c409f1932..2e82129b23 100644 --- a/docs/api/components_video_OSD.bs.html +++ b/docs/api/components_video_OSD.bs.html @@ -112,6 +112,11 @@ ' inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu. ' sub inactiveCheck() + ' If user is currently seeing a dialog box, ignore inactive check + if m.global.sceneManager.callFunc("isDialogOpen") + return + end if + if m.deviceInfo.timeSinceLastKeypress() >= m.top.inactiveTimeout m.top.action = "hide" end if diff --git a/docs/api/components_video_VideoPlayerView.bs.html b/docs/api/components_video_VideoPlayerView.bs.html index 79a823d08b..f5d068bff6 100644 --- a/docs/api/components_video_VideoPlayerView.bs.html +++ b/docs/api/components_video_VideoPlayerView.bs.html @@ -163,14 +163,12 @@ ' sub handleShowSubtitleMenuAction() m.top.selectSubtitlePressed = true - handleHideAction(false) end sub ' handleShowVideoInfoPopupAction: Handles action to show video info popup ' sub handleShowVideoInfoPopupAction() m.top.selectPlaybackInfoPressed = true - handleHideAction(false) end sub ' onOSDAction: Process action events from OSD to their respective handlers From 4ef61785ea8984146f6ad517c08b991f0567d6a9 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 19 Nov 2023 16:20:13 +0000 Subject: [PATCH 08/82] Translated using Weblate (German) Currently translated at 32.6% (89 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/de/ --- locale/de_DE/translations.ts | 87 ++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts index 0ea164867f..4a1b554cb5 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -13291,5 +13291,92 @@ Fehler beim Laden Dialog title when unable to load Content from Server + + Sunday + Sonntag + Day of Week + + + Started at + Gestartet um + (Past Tense) For defining time when a program started today (e.g. Started at 08:00) + + + yesterday + gestern + Previous day + + + tomorrow + morgen + Next day + + + Movies (Grid) + Filme (Kachelansicht) + Movie library view option + + + today + heute + Current day + + + Tuesday + Dienstag + Day of Week + + + Additional Parts + Zusätzliche Teile + Additional parts of a video + + + Monday + Montag + Day of Week + + + Thursday + Donnerstag + Day of Week + + + Started + Gestartet + (Past Tense) For defining a day and time when a program started (e.g. Started Wednesday, 08:00) + + + Friday + Freitag + Day of Week + + + Special Features + Besonderheiten + + + Movies + Filme + + + Saturday + Samstag + Day of Week + + + Movies (Presentation) + Filme (Präsentation) + Movie library view option + + + TV Shows + TV-Serien + + + Wednesday + Mittwoch + Day of Week + From 1ce210f96bb48b32fb5a5cecfb76ee0635dd374d Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sun, 19 Nov 2023 17:42:42 -0500 Subject: [PATCH 09/82] Don't show nextEpisode button if trickplay bar is shown Fixes #1511 --- components/video/VideoPlayerView.bs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index 11fe9d2767..d86a7e6121 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -412,6 +412,9 @@ sub checkTimeToDisplayNextEpisode() if m.top.content.contenttype <> 4 then return ' only display when content is type "Episode" if m.nextupbuttonseconds = 0 then return ' is the button disabled? + ' Don't show Next Episode button if trickPlayBar is visible + if m.top.trickPlayBar.visible then return + if isValid(m.top.duration) and isValid(m.top.position) nextEpisodeCountdown = Int(m.top.duration - m.top.position) From 250e2244c8c32d2f84c3472895b96b2c16377499 Mon Sep 17 00:00:00 2001 From: Jimi Date: Sun, 19 Nov 2023 16:22:50 -0700 Subject: [PATCH 10/82] Fix crash --- components/liveTv/ProgramDetails.bs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/liveTv/ProgramDetails.bs b/components/liveTv/ProgramDetails.bs index 617959f182..c1ec9e02ff 100644 --- a/components/liveTv/ProgramDetails.bs +++ b/components/liveTv/ProgramDetails.bs @@ -329,7 +329,7 @@ function onKeyEvent(key as string, press as boolean) as boolean return true end if - if m.userCanRecord = "true" + if m.userCanRecord = true if key = "right" and m.viewChannelButton.hasFocus() m.recordButton.setFocus(true) m.viewChannelOutline.visible = false From 007bca3d7182125936e8180252eee555a01dfc4a Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Mon, 20 Nov 2023 00:23:52 +0000 Subject: [PATCH 11/82] Update API docs --- docs/api/components_liveTv_ProgramDetails.bs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/components_liveTv_ProgramDetails.bs.html b/docs/api/components_liveTv_ProgramDetails.bs.html index 8f8e27b42a..a95c6744ab 100644 --- a/docs/api/components_liveTv_ProgramDetails.bs.html +++ b/docs/api/components_liveTv_ProgramDetails.bs.html @@ -331,7 +331,7 @@ return true end if - if m.userCanRecord = "true" + if m.userCanRecord = true if key = "right" and m.viewChannelButton.hasFocus() m.recordButton.setFocus(true) m.viewChannelOutline.visible = false From 491ef43fd5347178b99db7a54d10c3407af88bc5 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sun, 19 Nov 2023 22:04:17 -0500 Subject: [PATCH 12/82] refactor to remove else clause --- components/tvshows/TVEpisodes.bs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/tvshows/TVEpisodes.bs b/components/tvshows/TVEpisodes.bs index f820357d15..ffc225cdc7 100644 --- a/components/tvshows/TVEpisodes.bs +++ b/components/tvshows/TVEpisodes.bs @@ -48,14 +48,14 @@ end sub ' get the currently focused item function getFocusedItem() as dynamic - if isValid(m.top.focusedChild) and isValid(m.top.focusedChild.focusedChild) - focusedChild = m.top.focusedChild.focusedChild - if not isValid(focusedChild.content) then return invalid - m.top.lastFocus = focusedChild - else + if not isValid(m.top.focusedChild) or not isValid(m.top.focusedChild.focusedChild) return invalid end if + focusedChild = m.top.focusedChild.focusedChild + if not isValid(focusedChild.content) then return invalid + m.top.lastFocus = focusedChild + if isValidAndNotEmpty(focusedChild.rowItemFocused) itemToPlay = focusedChild.content.getChild(focusedChild.rowItemFocused[0]).getChild(0) if isValid(itemToPlay) and isValidAndNotEmpty(itemToPlay.id) From 3f2c48d3988a098e61f0b57a92bddd11490aa3f6 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Mon, 20 Nov 2023 03:09:14 +0000 Subject: [PATCH 13/82] Update API docs --- docs/api/components_video_VideoPlayerView.bs.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/api/components_video_VideoPlayerView.bs.html b/docs/api/components_video_VideoPlayerView.bs.html index f5d068bff6..5f30c664f0 100644 --- a/docs/api/components_video_VideoPlayerView.bs.html +++ b/docs/api/components_video_VideoPlayerView.bs.html @@ -414,6 +414,9 @@ if m.top.content.contenttype <> 4 then return ' only display when content is type "Episode" if m.nextupbuttonseconds = 0 then return ' is the button disabled? + ' Don't show Next Episode button if trickPlayBar is visible + if m.top.trickPlayBar.visible then return + if isValid(m.top.duration) and isValid(m.top.position) nextEpisodeCountdown = Int(m.top.duration - m.top.position) From de8beacfc94b6831fc813513520f351d3dcc85cc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 Nov 2023 07:38:36 +0000 Subject: [PATCH 14/82] Update dependency markdownlint-cli2 to v0.11.0 --- package-lock.json | 111 ++++++++++++++++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 78 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 669a489040..69d8634a38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "clean-jsdoc-theme": "4.2.17", "jsdoc": "4.0.2", "jshint": "2.13.6", - "markdownlint-cli2": "0.10.0", + "markdownlint-cli2": "0.11.0", "rimraf": "5.0.5", "roku-deploy": "3.10.5", "roku-log-bsc-plugin": "0.8.1", @@ -386,6 +386,18 @@ "node": ">=6" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", + "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", @@ -1862,9 +1874,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2943,9 +2955,9 @@ } }, "node_modules/markdown-it": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", - "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", "dev": true, "dependencies": { "argparse": "^2.0.1", @@ -2969,30 +2981,33 @@ } }, "node_modules/markdownlint": { - "version": "0.31.1", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.31.1.tgz", - "integrity": "sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA==", + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.32.1.tgz", + "integrity": "sha512-3sx9xpi4xlHlokGyHO9k0g3gJbNY4DI6oNEeEYq5gQ4W7UkiJ90VDAnuDl2U+yyXOUa6BX+0gf69ZlTUGIBp6A==", "dev": true, "dependencies": { - "markdown-it": "13.0.1", + "markdown-it": "13.0.2", "markdownlint-micromark": "0.1.7" }, "engines": { - "node": ">=16" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" } }, "node_modules/markdownlint-cli2": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.10.0.tgz", - "integrity": "sha512-kVxjPyKFC+eW7iqcxiNI50RDzwugpXkEX5eQlDso/0IUs9M73jXYguLFHDzgi5KatcxU/57Fu8KoGtkFft9lfA==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.11.0.tgz", + "integrity": "sha512-RmFpr+My5in8KT+H/A6ozKIVYVzZtL5t9c8DYdv0YJdljl385z44CcCVBrclpHxCGMY2tr0hZ/ca+meGGvgdnQ==", "dev": true, "dependencies": { - "globby": "13.2.2", - "markdownlint": "0.31.1", + "globby": "14.0.0", + "markdownlint": "0.32.1", "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", "strip-json-comments": "5.0.1", - "yaml": "2.3.2" + "yaml": "2.3.4" }, "bin": { "markdownlint-cli2": "markdownlint-cli2.js", @@ -3000,7 +3015,10 @@ "markdownlint-cli2-fix": "markdownlint-cli2-fix.js" }, "engines": { - "node": ">=16" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" } }, "node_modules/markdownlint-cli2-formatter-default": { @@ -3013,19 +3031,32 @@ } }, "node_modules/markdownlint-cli2/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", + "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", "dev": true, "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", + "@sindresorhus/merge-streams": "^1.0.0", + "fast-glob": "^3.3.2", "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdownlint-cli2/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5376,12 +5407,12 @@ } }, "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5790,6 +5821,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unified": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", @@ -6299,9 +6342,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { "node": ">= 14" diff --git a/package.json b/package.json index cfe2218019..38e84d6cf5 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "clean-jsdoc-theme": "4.2.17", "jsdoc": "4.0.2", "jshint": "2.13.6", - "markdownlint-cli2": "0.10.0", + "markdownlint-cli2": "0.11.0", "rimraf": "5.0.5", "roku-deploy": "3.10.5", "roku-log-bsc-plugin": "0.8.1", From d8f6b976bfe681a9f8c0b175107391c69fba60f2 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Mon, 20 Nov 2023 13:46:58 +0000 Subject: [PATCH 15/82] Update API docs --- .../api/components_tvshows_TVEpisodes.bs.html | 55 ++++++++++++------- docs/api/data/search.json | 2 +- docs/api/module-TVEpisodes.html | 2 +- docs/api/source_ShowScenes.bs.html | 2 +- 4 files changed, 39 insertions(+), 22 deletions(-) diff --git a/docs/api/components_tvshows_TVEpisodes.bs.html b/docs/api/components_tvshows_TVEpisodes.bs.html index ec5e128b80..7e256f98fb 100644 --- a/docs/api/components_tvshows_TVEpisodes.bs.html +++ b/docs/api/components_tvshows_TVEpisodes.bs.html @@ -48,10 +48,28 @@ m.top.overhangTitle = m.top.seasonData.SeriesName + " - " + m.top.seasonData.name end sub +' get the currently focused item +function getFocusedItem() as dynamic + if not isValid(m.top.focusedChild) or not isValid(m.top.focusedChild.focusedChild) + return invalid + end if + + focusedChild = m.top.focusedChild.focusedChild + if not isValid(focusedChild.content) then return invalid + m.top.lastFocus = focusedChild + + if isValidAndNotEmpty(focusedChild.rowItemFocused) + itemToPlay = focusedChild.content.getChild(focusedChild.rowItemFocused[0]).getChild(0) + if isValid(itemToPlay) and isValidAndNotEmpty(itemToPlay.id) + return itemToPlay + end if + end if + + return invalid +end function + ' Handle navigation input from the remote and act on it function onKeyEvent(key as string, press as boolean) as boolean - handled = false - if key = "left" and m.tvEpisodeRow.hasFocus() m.shuffle.setFocus(true) return true @@ -72,7 +90,15 @@ return true end if - if key = "OK" or key = "play" + if key = "OK" + if m.tvEpisodeRow.isInFocusChain() + focusedItem = getFocusedItem() + if isValid(focusedItem) + m.top.selectedItem = focusedItem + end if + return true + end if + if m.shuffle.hasFocus() episodeList = m.rows.getChild(0).objects.items @@ -99,23 +125,14 @@ end if end if - focusedChild = m.top.focusedChild.focusedChild - if focusedChild.content = invalid then return handled - - ' OK needs to be handled on release... - proceed = false - if key = "OK" - proceed = true - end if - - if press and key = "play" or proceed = true - m.top.lastFocus = focusedChild - itemToPlay = focusedChild.content.getChild(focusedChild.rowItemFocused[0]).getChild(0) - if isValid(itemToPlay) and isValid(itemToPlay.id) and itemToPlay.id <> "" - m.top.quickPlayNode = itemToPlay + if key = "play" + focusedItem = getFocusedItem() + if isValid(focusedItem) + m.top.quickPlayNode = focusedItem end if - handled = true + return true end if - return handled + + return false end function
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/data/search.json b/docs/api/data/search.json index c000f84128..b14a85f840 100644 --- a/docs/api/data/search.json +++ b/docs/api/data/search.json @@ -1 +1 @@ -{"list":[{"title":"module:AlbumData","link":"AlbumData"},{"title":"module:AlbumData.setFields","link":"setFields"},{"title":"module:AlbumGrid","link":"AlbumGrid"},{"title":"module:AlbumGrid.getData","link":"getData"},{"title":"module:AlbumGrid.init","link":"init"},{"title":"module:AlbumGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumTrackList","link":"AlbumTrackList"},{"title":"module:AlbumTrackList.getData","link":"getData"},{"title":"module:AlbumTrackList.init","link":"init"},{"title":"module:AlbumView","link":"AlbumView"},{"title":"module:AlbumView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:AlbumView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:AlbumView.createDialogPallete","link":"createDialogPallete"},{"title":"module:AlbumView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:AlbumView.init","link":"init"},{"title":"module:AlbumView.onDoneLoading","link":"onDoneLoading"},{"title":"module:AlbumView.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:AlbumView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AlbumView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AlbumView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AlbumView.setupMainNode","link":"setupMainNode"},{"title":"module:Alpha","link":"Alpha"},{"title":"module:Alpha.init","link":"init"},{"title":"module:Alpha.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView","link":"ArtistView"},{"title":"module:ArtistView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:ArtistView.OnScreenShown","link":"OnScreenShown"},{"title":"module:ArtistView.artistOverviewChanged","link":"artistOverviewChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:ArtistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:ArtistView.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:ArtistView.init","link":"init"},{"title":"module:ArtistView.onAlbumsData","link":"onAlbumsData"},{"title":"module:ArtistView.onAlbumsEscape","link":"onAlbumsEscape"},{"title":"module:ArtistView.onAppearsOnData","link":"onAppearsOnData"},{"title":"module:ArtistView.onAppearsOnEscape","link":"onAppearsOnEscape"},{"title":"module:ArtistView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:ArtistView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:ArtistView.onEllipsisChanged","link":"onEllipsisChanged"},{"title":"module:ArtistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView.onSectionNavigationEscape","link":"onSectionNavigationEscape"},{"title":"module:ArtistView.onSectionNavigationSelected","link":"onSectionNavigationSelected"},{"title":"module:ArtistView.onSectionScrollerChange","link":"onSectionScrollerChange"},{"title":"module:ArtistView.pageContentChanged","link":"pageContentChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:ArtistView.setPosterImage","link":"setPosterImage"},{"title":"module:ArtistView.setScreenTitle","link":"setScreenTitle"},{"title":"module:ArtistView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:ArtistView.setupMainNode","link":"setupMainNode"},{"title":"module:AudioPlayer","link":"AudioPlayer"},{"title":"module:AudioPlayer.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:AudioPlayer.audioStateChanged","link":"audioStateChanged","description":"

State Change Event Handler

"},{"title":"module:AudioPlayer.init","link":"init"},{"title":"module:AudioPlayerView","link":"AudioPlayerView"},{"title":"module:AudioPlayerView.LoadNextSong","link":"LoadNextSong"},{"title":"module:AudioPlayerView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:AudioPlayerView.audioPositionChanged","link":"audioPositionChanged"},{"title":"module:AudioPlayerView.audioStateChanged","link":"audioStateChanged"},{"title":"module:AudioPlayerView.bufferPositionChanged","link":"bufferPositionChanged"},{"title":"module:AudioPlayerView.endScreenSaver","link":"endScreenSaver"},{"title":"module:AudioPlayerView.findCurrentSongIndex","link":"findCurrentSongIndex"},{"title":"module:AudioPlayerView.init","link":"init"},{"title":"module:AudioPlayerView.loadButtons","link":"loadButtons","description":"

If we have more and 1 song to play, fade in the next and previous controls

"},{"title":"module:AudioPlayerView.loopClicked","link":"loopClicked"},{"title":"module:AudioPlayerView.nextClicked","link":"nextClicked"},{"title":"module:AudioPlayerView.onAudioStreamLoaded","link":"onAudioStreamLoaded"},{"title":"module:AudioPlayerView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:AudioPlayerView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:AudioPlayerView.onKeyEvent","link":"onKeyEvent","description":"

Process key press events

"},{"title":"module:AudioPlayerView.onMetaDataLoaded","link":"onMetaDataLoaded"},{"title":"module:AudioPlayerView.onScreensaverTimeoutLoaded","link":"onScreensaverTimeoutLoaded"},{"title":"module:AudioPlayerView.pageContentChanged","link":"pageContentChanged","description":"

Update values on screen when page content changes

"},{"title":"module:AudioPlayerView.playAction","link":"playAction"},{"title":"module:AudioPlayerView.previousClicked","link":"previousClicked"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.screenSaverActive","link":"screenSaverActive"},{"title":"module:AudioPlayerView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:AudioPlayerView.setLoopButtonImage","link":"setLoopButtonImage"},{"title":"module:AudioPlayerView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AudioPlayerView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AudioPlayerView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AudioPlayerView.setShuffleIconState","link":"setShuffleIconState"},{"title":"module:AudioPlayerView.setTrackNumberDisplay","link":"setTrackNumberDisplay"},{"title":"module:AudioPlayerView.setupAnimationTasks","link":"setupAnimationTasks"},{"title":"module:AudioPlayerView.setupAudioNode","link":"setupAudioNode","description":"

Creates audio node used to play song(s)

"},{"title":"module:AudioPlayerView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:AudioPlayerView.setupDataTasks","link":"setupDataTasks","description":"

Creates tasks to gather data needed to render Scene and play song

"},{"title":"module:AudioPlayerView.setupInfoNodes","link":"setupInfoNodes"},{"title":"module:AudioPlayerView.setupScreenSaver","link":"setupScreenSaver"},{"title":"module:AudioPlayerView.shuffleClicked","link":"shuffleClicked"},{"title":"module:AudioPlayerView.startScreenSaver","link":"startScreenSaver"},{"title":"module:AudioPlayerView.toggleShuffleEnabled","link":"toggleShuffleEnabled"},{"title":"module:AudioTrackListItem","link":"AudioTrackListItem"},{"title":"module:AudioTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:AudioTrackListItem.init","link":"init"},{"title":"module:AudioTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ButtonGroupHoriz","link":"ButtonGroupHoriz"},{"title":"module:ButtonGroupHoriz.init","link":"init"},{"title":"module:ButtonGroupHoriz.onKeyEvent","link":"onKeyEvent"},{"title":"module:ButtonGroupVert","link":"ButtonGroupVert"},{"title":"module:ButtonGroupVert.init","link":"init"},{"title":"module:ButtonGroupVert.onFocusButtonChanged","link":"onFocusButtonChanged"},{"title":"module:ButtonGroupVert.onFocusChanged","link":"onFocusChanged"},{"title":"module:ButtonGroupVert.onKeyEvent","link":"onKeyEvent"},{"title":"module:ChannelData","link":"ChannelData"},{"title":"module:ChannelData.setFields","link":"setFields"},{"title":"module:ChannelData.setPoster","link":"setPoster"},{"title":"module:Clock","link":"Clock"},{"title":"module:Clock.init","link":"init"},{"title":"module:Clock.onCurrentTimeTimerFire","link":"onCurrentTimeTimerFire","description":"

onCurrentTimeTimerFire: Code that runs every time the currentTimeTimer fires

"},{"title":"module:CollectionData","link":"CollectionData"},{"title":"module:CollectionData.setFields","link":"setFields"},{"title":"module:CollectionData.setPoster","link":"setPoster"},{"title":"module:ConfigData","link":"ConfigData"},{"title":"module:ConfigData.init","link":"init"},{"title":"module:ConfigItem","link":"ConfigItem"},{"title":"module:ConfigItem.init","link":"init"},{"title":"module:ConfigItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ConfigItem.setColors","link":"setColors"},{"title":"module:ConfigList","link":"ConfigList"},{"title":"module:ConfigList.configListShowDialog","link":"configListShowDialog"},{"title":"module:ConfigList.dismiss_dialog","link":"dismiss_dialog"},{"title":"module:ConfigList.init","link":"init"},{"title":"module:ConfigList.onDialogButton","link":"onDialogButton"},{"title":"module:ConfigList.onItemSelected","link":"onItemSelected"},{"title":"module:ConfigList.setData","link":"setData"},{"title":"module:ExtrasItem","link":"ExtrasItem"},{"title":"module:ExtrasItem.focusChanged","link":"focusChanged"},{"title":"module:ExtrasItem.init","link":"init"},{"title":"module:ExtrasItem.showContent","link":"showContent"},{"title":"module:ExtrasRowList","link":"ExtrasRowList"},{"title":"module:ExtrasRowList.addRowSize","link":"addRowSize"},{"title":"module:ExtrasRowList.buildRow","link":"buildRow"},{"title":"module:ExtrasRowList.init","link":"init"},{"title":"module:ExtrasRowList.loadParts","link":"loadParts"},{"title":"module:ExtrasRowList.loadPersonVideos","link":"loadPersonVideos"},{"title":"module:ExtrasRowList.onAdditionalPartsLoaded","link":"onAdditionalPartsLoaded"},{"title":"module:ExtrasRowList.onLikeThisLoaded","link":"onLikeThisLoaded"},{"title":"module:ExtrasRowList.onMoviesLoaded","link":"onMoviesLoaded"},{"title":"module:ExtrasRowList.onPeopleLoaded","link":"onPeopleLoaded"},{"title":"module:ExtrasRowList.onRowItemFocused","link":"onRowItemFocused"},{"title":"module:ExtrasRowList.onRowItemSelected","link":"onRowItemSelected"},{"title":"module:ExtrasRowList.onSeriesLoaded","link":"onSeriesLoaded"},{"title":"module:ExtrasRowList.onShowsLoaded","link":"onShowsLoaded"},{"title":"module:ExtrasRowList.onSpecialFeaturesLoaded","link":"onSpecialFeaturesLoaded"},{"title":"module:ExtrasRowList.updateSize","link":"updateSize"},{"title":"module:FavoriteItemsTask","link":"FavoriteItemsTask"},{"title":"module:FavoriteItemsTask.init","link":"init"},{"title":"module:FavoriteItemsTask.setFavoriteStatus","link":"setFavoriteStatus"},{"title":"module:FolderData","link":"FolderData"},{"title":"module:FolderData.setFields","link":"setFields"},{"title":"module:FolderData.setPoster","link":"setPoster"},{"title":"module:GetFiltersTask","link":"GetFiltersTask"},{"title":"module:GetFiltersTask.getFiltersTask","link":"getFiltersTask"},{"title":"module:GetFiltersTask.init","link":"init"},{"title":"module:GetNextEpisodeTask","link":"GetNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.getNextEpisodeTask","link":"getNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.init","link":"init"},{"title":"module:GetPlaybackInfoTask","link":"GetPlaybackInfoTask"},{"title":"module:GetPlaybackInfoTask.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:GetPlaybackInfoTask.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:GetPlaybackInfoTask.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:GetPlaybackInfoTask.getPlaybackInfoTask","link":"getPlaybackInfoTask","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:GetPlaybackInfoTask.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:GetPlaybackInfoTask.init","link":"init"},{"title":"module:GetShuffleEpisodesTask","link":"GetShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.getShuffleEpisodesTask","link":"getShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.init","link":"init"},{"title":"module:GridItem","link":"GridItem"},{"title":"module:GridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:GridItem.focusChanging","link":"focusChanging","description":"

Use FocusPercent to animate scaling of Poser Image

"},{"title":"module:GridItem.init","link":"init"},{"title":"module:GridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:GridItemSmall","link":"GridItemSmall"},{"title":"module:GridItemSmall.focusChanged","link":"focusChanged"},{"title":"module:GridItemSmall.init","link":"init"},{"title":"module:GridItemSmall.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItemSmall.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:Home","link":"Home"},{"title":"module:Home.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook that gets ran as needed.\nUsed to update the focus, the state of the data, and tells the server about the device profile

"},{"title":"module:Home.init","link":"init"},{"title":"module:Home.loadLibraries","link":"loadLibraries"},{"title":"module:Home.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:Home.refresh","link":"refresh"},{"title":"module:HomeData","link":"HomeData"},{"title":"module:HomeData.setData","link":"setData"},{"title":"module:HomeItem","link":"HomeItem"},{"title":"module:HomeItem.drawProgressBar","link":"drawProgressBar","description":"

Draws and animates item progress bar

"},{"title":"module:HomeItem.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:HomeItem.init","link":"init"},{"title":"module:HomeItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:HomeItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and icon when poster loaded

"},{"title":"module:HomeRows","link":"HomeRows"},{"title":"module:HomeRows.addHomeSection","link":"addHomeSection","description":"

Adds a new home section to the home rows.\nReturns a boolean indicating whether the section was handled.

"},{"title":"module:HomeRows.createContinueWatchingRow","link":"createContinueWatchingRow","description":"

Create a row displaying items the user can continue watching

"},{"title":"module:HomeRows.createFavoritesRow","link":"createFavoritesRow","description":"

Create a row displaying items from the user's favorites list

"},{"title":"module:HomeRows.createLatestInRows","link":"createLatestInRows","description":"

Create a row displaying latest items in each of the user's libraries

"},{"title":"module:HomeRows.createLibraryRow","link":"createLibraryRow","description":"

Create a row displaying the user's libraries

"},{"title":"module:HomeRows.createLiveTVRow","link":"createLiveTVRow","description":"

Create a row displaying the live tv now on section

"},{"title":"module:HomeRows.createNextUpRow","link":"createNextUpRow","description":"

Create a row displaying next episodes up to watch

"},{"title":"module:HomeRows.filterNodeArray","link":"filterNodeArray"},{"title":"module:HomeRows.init","link":"init"},{"title":"module:HomeRows.itemSelected","link":"itemSelected"},{"title":"module:HomeRows.loadLibraries","link":"loadLibraries"},{"title":"module:HomeRows.onKeyEvent","link":"onKeyEvent"},{"title":"module:HomeRows.onLibrariesLoaded","link":"onLibrariesLoaded"},{"title":"module:HomeRows.removeHomeSection","link":"removeHomeSection","description":"

Removes a home section from the home rows

"},{"title":"module:HomeRows.updateContinueWatchingItems","link":"updateContinueWatchingItems"},{"title":"module:HomeRows.updateFavoritesItems","link":"updateFavoritesItems"},{"title":"module:HomeRows.updateHomeRows","link":"updateHomeRows","description":"

Update home row data

"},{"title":"module:HomeRows.updateLatestInRows","link":"updateLatestInRows","description":"

Iterate over user's libraries and update data for each Latest In section

"},{"title":"module:HomeRows.updateLatestItems","link":"updateLatestItems"},{"title":"module:HomeRows.updateNextUpItems","link":"updateNextUpItems"},{"title":"module:HomeRows.updateOnNowItems","link":"updateOnNowItems"},{"title":"module:HomeRows.updateSize","link":"updateSize"},{"title":"module:HomeRows.updateSizeArray","link":"updateSizeArray"},{"title":"module:IconButton","link":"IconButton"},{"title":"module:IconButton.init","link":"init"},{"title":"module:IconButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:IconButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:IconButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:IconButton.onIconChanged","link":"onIconChanged"},{"title":"module:IconButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:IconButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:IconButton.onTextChanged","link":"onTextChanged"},{"title":"module:IconButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:IconButton.setIconSize","link":"setIconSize"},{"title":"module:Image","link":"Image"},{"title":"module:Image.ImageURL","link":"ImageURL"},{"title":"module:Image.ItemImages","link":"ItemImages"},{"title":"module:Image.PosterImage","link":"PosterImage"},{"title":"module:Image.UserImageURL","link":"UserImageURL"},{"title":"module:ImageData","link":"ImageData"},{"title":"module:ImageData.setFields","link":"setFields"},{"title":"module:IntegerKeyboard","link":"IntegerKeyboard"},{"title":"module:IntegerKeyboard.init","link":"init"},{"title":"module:IntegerKeyboard.keySelected","link":"keySelected"},{"title":"module:IntegerKeyboard.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid","link":"ItemGrid"},{"title":"module:ItemGrid.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:ItemGrid.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:ItemGrid.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:ItemGrid.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:ItemGrid.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:ItemGrid.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:ItemGrid.init","link":"init"},{"title":"module:ItemGrid.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:ItemGrid.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:ItemGrid.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:ItemGrid.onChannelFocused","link":"onChannelFocused"},{"title":"module:ItemGrid.onChannelSelected","link":"onChannelSelected"},{"title":"module:ItemGrid.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:ItemGrid.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:ItemGrid.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:ItemGrid.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:ItemGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:ItemGrid.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:ItemGrid.setBoxsetsOptions","link":"setBoxsetsOptions","description":"

Set Boxset view, sort, and filter options

"},{"title":"module:ItemGrid.setDefaultOptions","link":"setDefaultOptions","description":"

Set Default view, sort, and filter options

"},{"title":"module:ItemGrid.setLiveTvOptions","link":"setLiveTvOptions","description":"

Set Live TV view, sort, and filter options

"},{"title":"module:ItemGrid.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:ItemGrid.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:ItemGrid.setPhotoAlbumOptions","link":"setPhotoAlbumOptions","description":"

Set Photo Album view, sort, and filter options

"},{"title":"module:ItemGrid.setTvShowsOptions","link":"setTvShowsOptions","description":"

Set TV Show view, sort, and filter options

"},{"title":"module:ItemGrid.showTVGuide","link":"showTVGuide"},{"title":"module:ItemGrid.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:ItemGrid.updateTitle","link":"updateTitle"},{"title":"module:ItemGridOptions","link":"ItemGridOptions"},{"title":"module:ItemGridOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:ItemGridOptions.hideChecklist","link":"hideChecklist"},{"title":"module:ItemGridOptions.init","link":"init"},{"title":"module:ItemGridOptions.isFilterMenuDataValid","link":"isFilterMenuDataValid","description":"

Check if data for Filter Menu is valid

"},{"title":"module:ItemGridOptions.onFilterFocusChange","link":"onFilterFocusChange"},{"title":"module:ItemGridOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGridOptions.optionsSet","link":"optionsSet"},{"title":"module:ItemGridOptions.saveFavoriteItemSelected","link":"saveFavoriteItemSelected"},{"title":"module:ItemGridOptions.setHeartColor","link":"setHeartColor"},{"title":"module:ItemGridOptions.showChecklist","link":"showChecklist"},{"title":"module:ItemGridOptions.toggleFavorite","link":"toggleFavorite"},{"title":"module:Items","link":"Items"},{"title":"module:Items.AppearsOnList","link":"AppearsOnList","description":"

Get list of albums an artist appears on

"},{"title":"module:Items.ArtistOverview","link":"ArtistOverview","description":"

Music Artist Data

"},{"title":"module:Items.AudioItem","link":"AudioItem","description":"

Get Songs that are on an Album

"},{"title":"module:Items.AudioStream","link":"AudioStream"},{"title":"module:Items.BackdropImage","link":"BackdropImage"},{"title":"module:Items.CreateArtistMix","link":"CreateArtistMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.CreateInstantMix","link":"CreateInstantMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.GetIntroVideos","link":"GetIntroVideos","description":"

Get Intro Videos for an item

"},{"title":"module:Items.GetSongsByArtist","link":"GetSongsByArtist","description":"

Get list of songs belonging to an artist

"},{"title":"module:Items.ItemGetPlaybackInfo","link":"ItemGetPlaybackInfo"},{"title":"module:Items.ItemMetaData","link":"ItemMetaData","description":"

MetaData about an item

"},{"title":"module:Items.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:Items.MusicAlbumList","link":"MusicAlbumList","description":"

Get list of albums belonging to an artist

"},{"title":"module:Items.MusicSongList","link":"MusicSongList","description":"

Get Songs that are on an Album

"},{"title":"module:Items.PlaylistItemList","link":"PlaylistItemList","description":"

Get Items that are under the provided item

"},{"title":"module:Items.TVEpisodeShuffleList","link":"TVEpisodeShuffleList"},{"title":"module:Items.TVEpisodes","link":"TVEpisodes","description":"

Returns a list of TV Shows for a given TV Show and season\nAccepts strings for the TV Show Id and the season Id

"},{"title":"module:Items.TVSeasonExtras","link":"TVSeasonExtras","description":"

Returns a list of extra features for a TV Show season\nAccepts a string that is a TV Show season id

"},{"title":"module:Items.TVSeasons","link":"TVSeasons","description":"

Seasons for a TV Show

"},{"title":"module:Items.searchMedia","link":"searchMedia","description":"

Search across all libraries

"},{"title":"module:Items.useTranscodeAudioStream","link":"useTranscodeAudioStream"},{"title":"module:JFButton","link":"JFButton"},{"title":"module:JFButton.init","link":"init"},{"title":"module:JFButton.onTextChanged","link":"onTextChanged","description":"

Whenever the text changes, pad both sides with whitespace so we can center the button text

"},{"title":"module:JFButtons","link":"JFButtons"},{"title":"module:JFButtons.focusChanged","link":"focusChanged","description":"

Change opacity of the highlighted menu item based on focus

"},{"title":"module:JFButtons.highlightSelected","link":"highlightSelected","description":"

Highlight selected menu option

"},{"title":"module:JFButtons.init","link":"init"},{"title":"module:JFButtons.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFButtons.renderChanged","link":"renderChanged","description":"

When options are fully displayed, set focus and selected option

"},{"title":"module:JFButtons.selectedIndexChanged","link":"selectedIndexChanged","description":"

When Selected Index set, ensure it is the one Focused

"},{"title":"module:JFButtons.showButtons","link":"showButtons"},{"title":"module:JFButtons.updateButtons","link":"updateButtons"},{"title":"module:JFGroup","link":"JFGroup"},{"title":"module:JFGroup.init","link":"init"},{"title":"module:JFGroup.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog","link":"JFMessageDialog"},{"title":"module:JFMessageDialog.init","link":"init"},{"title":"module:JFMessageDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog.redraw","link":"redraw"},{"title":"module:JFMessageDialog.updateMessage","link":"updateMessage"},{"title":"module:JFMessageDialog.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang","link":"JFOverhang"},{"title":"module:JFOverhang.init","link":"init"},{"title":"module:JFOverhang.onVisibleChange","link":"onVisibleChange"},{"title":"module:JFOverhang.resetTime","link":"resetTime"},{"title":"module:JFOverhang.setClockVisibility","link":"setClockVisibility"},{"title":"module:JFOverhang.setRightSeperatorVisibility","link":"setRightSeperatorVisibility"},{"title":"module:JFOverhang.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang.updateTime","link":"updateTime"},{"title":"module:JFOverhang.updateTimeDisplay","link":"updateTimeDisplay"},{"title":"module:JFOverhang.updateTitle","link":"updateTitle"},{"title":"module:JFOverhang.updateUser","link":"updateUser"},{"title":"module:JFScene","link":"JFScene"},{"title":"module:JFScene.init","link":"init"},{"title":"module:JFScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFScreen","link":"JFScreen"},{"title":"module:JFScreen.OnScreenHidden","link":"OnScreenHidden","description":"

Function called when the screen is hidden by the screen manager\nIt is expected that screens override this function if required,\nto handle focus any actions required on the screen being hidden

"},{"title":"module:JFScreen.OnScreenShown","link":"OnScreenShown","description":"

Function called when the screen is displayed by the screen manager\nIt is expected that screens override this function to handle focus\nmanagmenet and any other actions required on screen shown

"},{"title":"module:JFScreen.init","link":"init"},{"title":"module:JFServer","link":"JFServer"},{"title":"module:JFServer.init","link":"init"},{"title":"module:JFServer.itemContentChanged","link":"itemContentChanged"},{"title":"module:JFServer.onFocusPercentChange","link":"onFocusPercentChange"},{"title":"module:JFServer.setTextColor","link":"setTextColor"},{"title":"module:JFVideo","link":"JFVideo"},{"title":"module:JFVideo.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:JFVideo.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:JFVideo.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:JFVideo.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:JFVideo.init","link":"init"},{"title":"module:JFVideo.loadCaption","link":"loadCaption"},{"title":"module:JFVideo.onAllowCaptionsChange","link":"onAllowCaptionsChange"},{"title":"module:JFVideo.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:JFVideo.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFVideo.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:JFVideo.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:JFVideo.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:JFVideo.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:JFVideo.toggleCaption","link":"toggleCaption"},{"title":"module:JFVideo.updateCaption","link":"updateCaption"},{"title":"module:JFVideo.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:ListPoster","link":"ListPoster"},{"title":"module:ListPoster.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:ListPoster.init","link":"init"},{"title":"module:ListPoster.itemContentChanged","link":"itemContentChanged"},{"title":"module:ListPoster.updateSize","link":"updateSize"},{"title":"module:LoadChannelsTask","link":"LoadChannelsTask"},{"title":"module:LoadChannelsTask.init","link":"init"},{"title":"module:LoadChannelsTask.loadChannels","link":"loadChannels"},{"title":"module:LoadItemsTask","link":"LoadItemsTask"},{"title":"module:LoadItemsTask.getPersonVideos","link":"getPersonVideos"},{"title":"module:LoadItemsTask.init","link":"init"},{"title":"module:LoadItemsTask.loadItems","link":"loadItems"},{"title":"module:LoadItemsTask2","link":"LoadItemsTask2"},{"title":"module:LoadItemsTask2.init","link":"init"},{"title":"module:LoadItemsTask2.loadItems","link":"loadItems"},{"title":"module:LoadPhotoTask","link":"LoadPhotoTask"},{"title":"module:LoadPhotoTask.init","link":"init"},{"title":"module:LoadPhotoTask.loadItems","link":"loadItems"},{"title":"module:LoadProgramDetailsTask","link":"LoadProgramDetailsTask"},{"title":"module:LoadProgramDetailsTask.init","link":"init"},{"title":"module:LoadProgramDetailsTask.loadProgramDetails","link":"loadProgramDetails"},{"title":"module:LoadScreenSaverTimeoutTask","link":"LoadScreenSaverTimeoutTask"},{"title":"module:LoadScreenSaverTimeoutTask.getScreensaverTimeout","link":"getScreensaverTimeout"},{"title":"module:LoadScreenSaverTimeoutTask.init","link":"init"},{"title":"module:LoadSheduleTask","link":"LoadSheduleTask"},{"title":"module:LoadSheduleTask.init","link":"init"},{"title":"module:LoadSheduleTask.loadSchedule","link":"loadSchedule"},{"title":"module:LoadVideoContentTask","link":"LoadVideoContentTask"},{"title":"module:LoadVideoContentTask.FindPreferredAudioStream","link":"FindPreferredAudioStream"},{"title":"module:LoadVideoContentTask.LoadItems_AddVideoContent","link":"LoadItems_AddVideoContent"},{"title":"module:LoadVideoContentTask.LoadItems_VideoPlayer","link":"LoadItems_VideoPlayer"},{"title":"module:LoadVideoContentTask.addNextEpisodesToQueue","link":"addNextEpisodesToQueue","description":"

Add next episodes to the playback queue

"},{"title":"module:LoadVideoContentTask.addSubtitlesToVideo","link":"addSubtitlesToVideo"},{"title":"module:LoadVideoContentTask.addVideoContentURL","link":"addVideoContentURL"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"title":"module:LoadVideoContentTask.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:LoadVideoContentTask.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:LoadVideoContentTask.init","link":"init"},{"title":"module:LoadVideoContentTask.loadItems","link":"loadItems"},{"title":"module:LoadVideoContentTask.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:LoginScene","link":"LoginScene"},{"title":"module:LoginScene.init","link":"init"},{"title":"module:LoginScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:Main","link":"Main"},{"title":"module:Main.Main","link":"Main"},{"title":"module:MovieData","link":"MovieData"},{"title":"module:MovieData.setContainer","link":"setContainer"},{"title":"module:MovieData.setFields","link":"setFields"},{"title":"module:MovieData.setPoster","link":"setPoster"},{"title":"module:MovieDetails","link":"MovieDetails"},{"title":"module:MovieDetails.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieDetails.SetDefaultAudioTrack","link":"SetDefaultAudioTrack"},{"title":"module:MovieDetails.SetUpAudioOptions","link":"SetUpAudioOptions"},{"title":"module:MovieDetails.SetUpVideoOptions","link":"SetUpVideoOptions"},{"title":"module:MovieDetails.audioOptionsClosed","link":"audioOptionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieDetails.getEndTime","link":"getEndTime"},{"title":"module:MovieDetails.getRuntime","link":"getRuntime"},{"title":"module:MovieDetails.init","link":"init"},{"title":"module:MovieDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:MovieDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieDetails.round","link":"round"},{"title":"module:MovieDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:MovieDetails.setFieldText","link":"setFieldText"},{"title":"module:MovieDetails.setWatchedColor","link":"setWatchedColor"},{"title":"module:MovieDetails.trailerAvailableChanged","link":"trailerAvailableChanged"},{"title":"module:MovieDetails.videoOptionsClosed","link":"videoOptionsClosed","description":"

Check if options were updated and if any reloding is needed...

"},{"title":"module:MovieLibraryView","link":"MovieLibraryView"},{"title":"module:MovieLibraryView.FilterDataLoaded","link":"FilterDataLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MovieLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MovieLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MovieLibraryView.SetName","link":"SetName","description":"

Set Selected Movie Name

"},{"title":"module:MovieLibraryView.SetOfficialRating","link":"SetOfficialRating","description":"

Set Selected Movie OfficialRating

"},{"title":"module:MovieLibraryView.SetOverview","link":"SetOverview","description":"

Set Selected Movie Overview

"},{"title":"module:MovieLibraryView.SetProductionYear","link":"SetProductionYear","description":"

Set Selected Movie ProductionYear

"},{"title":"module:MovieLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MovieLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MovieLibraryView.getRuntime","link":"getRuntime"},{"title":"module:MovieLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MovieLibraryView.init","link":"init"},{"title":"module:MovieLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MovieLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MovieLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MovieLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MovieLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MovieLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MovieLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MovieLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MovieLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MovieLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieLibraryView.round","link":"round"},{"title":"module:MovieLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MovieLibraryView.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:MovieLibraryView.setSelectedOptions","link":"setSelectedOptions","description":"

Data to display when options button selected

"},{"title":"module:MovieLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MovieLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MovieOptions","link":"MovieOptions"},{"title":"module:MovieOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:MovieOptions.init","link":"init"},{"title":"module:MovieOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieOptions.optionsSet","link":"optionsSet"},{"title":"module:MusicAlbumData","link":"MusicAlbumData"},{"title":"module:MusicAlbumData.setFields","link":"setFields"},{"title":"module:MusicAlbumData.setPoster","link":"setPoster"},{"title":"module:MusicAlbumSongListData","link":"MusicAlbumSongListData"},{"title":"module:MusicAlbumSongListData.setFields","link":"setFields"},{"title":"module:MusicAlbumSongListData.setPoster","link":"setPoster"},{"title":"module:MusicArtistData","link":"MusicArtistData"},{"title":"module:MusicArtistData.setFields","link":"setFields"},{"title":"module:MusicArtistData.setPoster","link":"setPoster"},{"title":"module:MusicArtistGridItem","link":"MusicArtistGridItem"},{"title":"module:MusicArtistGridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:MusicArtistGridItem.init","link":"init"},{"title":"module:MusicArtistGridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:MusicArtistGridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:MusicLibraryView","link":"MusicLibraryView"},{"title":"module:MusicLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MusicLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MusicLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MusicLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MusicLibraryView.SetAlbumCount","link":"SetAlbumCount","description":"

Set Selected Artist Album Count

"},{"title":"module:MusicLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MusicLibraryView.SetGenres","link":"SetGenres","description":"

Set Selected Artist Genres

"},{"title":"module:MusicLibraryView.SetName","link":"SetName","description":"

Set Selected Artist Name

"},{"title":"module:MusicLibraryView.SetSongCount","link":"SetSongCount","description":"

Set Selected Artist Song Count

"},{"title":"module:MusicLibraryView.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:MusicLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MusicLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MusicLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MusicLibraryView.init","link":"init"},{"title":"module:MusicLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MusicLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MusicLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MusicLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MusicLibraryView.onGenreItemFocused","link":"onGenreItemFocused","description":"

Genre Item Focused

"},{"title":"module:MusicLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MusicLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MusicLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MusicLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MusicLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MusicLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MusicLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MusicLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MusicLibraryView.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:MusicLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MusicLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MusicSongData","link":"MusicSongData"},{"title":"module:MusicSongData.setFields","link":"setFields"},{"title":"module:MusicSongData.setPoster","link":"setPoster"},{"title":"module:OSD","link":"OSD"},{"title":"module:OSD.inactiveCheck","link":"inactiveCheck","description":"

inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.

"},{"title":"module:OSD.init","link":"init"},{"title":"module:OSD.onButtonSelected","link":"onButtonSelected","description":"

onButtonSelected: Handler for selection of buttons from the menu.

"},{"title":"module:OSD.onFocusChanged","link":"onFocusChanged","description":"

onFocusChanged: Handler for changes to the focus of this menu.

"},{"title":"module:OSD.onItemTitleTextChanged","link":"onItemTitleTextChanged","description":"

onItemTitleTextChanged: Handler for changes to m.top.itemTitleText param.

"},{"title":"module:OSD.onKeyEvent","link":"onKeyEvent"},{"title":"module:OSD.onPlaybackStateChanged","link":"onPlaybackStateChanged","description":"

onPlaybackStateChanged: Handler for changes to m.top.playbackState param

"},{"title":"module:OSD.onProgressPercentageChanged","link":"onProgressPercentageChanged","description":"

onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param

"},{"title":"module:OSD.onVisibleChanged","link":"onVisibleChanged","description":"

onVisibleChanged: Handler for changes to the visibility of this menu.

"},{"title":"module:OSD.resetFocusToDefaultButton","link":"resetFocusToDefaultButton","description":"

resetFocusToDefaultButton: Reset focus back to the default button

"},{"title":"module:OptionNode","link":"OptionNode"},{"title":"module:OptionNode.init","link":"init"},{"title":"module:OptionsButton","link":"OptionsButton"},{"title":"module:OptionsButton.init","link":"init"},{"title":"module:OptionsButton.press","link":"press"},{"title":"module:OptionsData","link":"OptionsData"},{"title":"module:OptionsData.init","link":"init"},{"title":"module:OptionsData.press","link":"press"},{"title":"module:OptionsData.update_title","link":"update_title"},{"title":"module:OptionsSlider","link":"OptionsSlider"},{"title":"module:OptionsSlider.init","link":"init"},{"title":"module:OptionsSlider.onKeyEvent","link":"onKeyEvent"},{"title":"module:OptionsSlider.setFields","link":"setFields"},{"title":"module:OverviewDialog","link":"OverviewDialog"},{"title":"module:OverviewDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:OverviewDialog.setOverview","link":"setOverview"},{"title":"module:OverviewDialog.setTitle","link":"setTitle"},{"title":"module:PersonData","link":"PersonData"},{"title":"module:PersonData.setFields","link":"setFields"},{"title":"module:PersonData.setPoster","link":"setPoster"},{"title":"module:PersonDetails","link":"PersonDetails"},{"title":"module:PersonDetails.createDialogPallete","link":"createDialogPallete"},{"title":"module:PersonDetails.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PersonDetails.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:PersonDetails.init","link":"init"},{"title":"module:PersonDetails.loadPerson","link":"loadPerson"},{"title":"module:PersonDetails.onButtonGroupEscaped","link":"onButtonGroupEscaped"},{"title":"module:PersonDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PersonDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:PersonDetails.shortDate","link":"shortDate"},{"title":"module:PhotoData","link":"PhotoData"},{"title":"module:PhotoData.setFields","link":"setFields"},{"title":"module:PhotoData.setPoster","link":"setPoster"},{"title":"module:PhotoDetails","link":"PhotoDetails"},{"title":"module:PhotoDetails.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook.\nUsed to ensure tasks are stopped

"},{"title":"module:PhotoDetails.init","link":"init"},{"title":"module:PhotoDetails.isRandomChanged","link":"isRandomChanged","description":"

isRandom component field has changed

"},{"title":"module:PhotoDetails.isSlideshowChanged","link":"isSlideshowChanged","description":"

isSlideshow component field has changed

"},{"title":"module:PhotoDetails.isValidToContinue","link":"isValidToContinue"},{"title":"module:PhotoDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:PhotoDetails.nextSlide","link":"nextSlide"},{"title":"module:PhotoDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PhotoDetails.onPhotoLoaded","link":"onPhotoLoaded"},{"title":"module:PhotoDetails.statusUpdate","link":"statusUpdate"},{"title":"module:PlaybackDialog","link":"PlaybackDialog"},{"title":"module:PlaybackDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlayedCheckmark","link":"PlayedCheckmark"},{"title":"module:PlayedCheckmark.init","link":"init"},{"title":"module:PlaylistData","link":"PlaylistData"},{"title":"module:PlaylistData.setFields","link":"setFields"},{"title":"module:PlaylistData.setPoster","link":"setPoster"},{"title":"module:PlaylistView","link":"PlaylistView"},{"title":"module:PlaylistView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:PlaylistView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:PlaylistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:PlaylistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PlaylistView.init","link":"init"},{"title":"module:PlaylistView.onDoneLoading","link":"onDoneLoading"},{"title":"module:PlaylistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlaylistView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:PlaylistView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:PlaylistView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:PlaylistView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:PlaylistView.setupMainNode","link":"setupMainNode"},{"title":"module:PlaystateTask","link":"PlaystateTask"},{"title":"module:PlaystateTask.PlaystateDefaults","link":"PlaystateDefaults"},{"title":"module:PlaystateTask.PlaystateUpdate","link":"PlaystateUpdate"},{"title":"module:PlaystateTask.init","link":"init"},{"title":"module:PostTask","link":"PostTask"},{"title":"module:PostTask.asyncPost","link":"asyncPost","description":"

Post data and wait for response code

"},{"title":"module:PostTask.empty","link":"empty","description":"

Revert PostTask to default state

"},{"title":"module:PostTask.init","link":"init"},{"title":"module:PostTask.postItems","link":"postItems","description":"

Main function for PostTask.\nPosts either an array of data\nor a string of data to an API endpoint.\nSaves the response information

"},{"title":"module:ProgramDetails","link":"ProgramDetails"},{"title":"module:ProgramDetails.channelUpdated","link":"channelUpdated"},{"title":"module:ProgramDetails.focusChanged","link":"focusChanged","description":"

Show view channel button when item has Focus

"},{"title":"module:ProgramDetails.getDurationStringFromSeconds","link":"getDurationStringFromSeconds","description":"

Get program duration string (e.g. 1h 20m)

"},{"title":"module:ProgramDetails.getRelativeDayName","link":"getRelativeDayName","description":"

Get relative date name for a date (yesterday, today, tomorrow, or otherwise weekday name )

"},{"title":"module:ProgramDetails.init","link":"init"},{"title":"module:ProgramDetails.onAnimationComplete","link":"onAnimationComplete"},{"title":"module:ProgramDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:ProgramDetails.programUpdated","link":"programUpdated"},{"title":"module:ProgramDetails.setupLabels","link":"setupLabels","description":"

Set up Live and Repeat label sizes

"},{"title":"module:ProgramDetails.updateLabels","link":"updateLabels"},{"title":"module:PublicUserData","link":"PublicUserData"},{"title":"module:PublicUserData.init","link":"init"},{"title":"module:QueueManager","link":"QueueManager"},{"title":"module:QueueManager.clear","link":"clear","description":"

Clear all content from play queue

"},{"title":"module:QueueManager.clearHold","link":"clearHold","description":"

Clear all hold content

"},{"title":"module:QueueManager.deleteAtIndex","link":"deleteAtIndex","description":"

Delete item from play queue at passed index

"},{"title":"module:QueueManager.getCount","link":"getCount","description":"

Return the number of items in the play queue

"},{"title":"module:QueueManager.getCurrentItem","link":"getCurrentItem","description":"

Return the item currently in focus from the play queue

"},{"title":"module:QueueManager.getHold","link":"getHold","description":"

Return the items in the hold

"},{"title":"module:QueueManager.getIsShuffled","link":"getIsShuffled","description":"

Return whether or not shuffle is enabled

"},{"title":"module:QueueManager.getItemByIndex","link":"getItemByIndex","description":"

Return the item in the passed index from the play queue

"},{"title":"module:QueueManager.getItemType","link":"getItemType"},{"title":"module:QueueManager.getPosition","link":"getPosition","description":"

Returns current playback position within the queue

"},{"title":"module:QueueManager.getQueue","link":"getQueue","description":"

Return the current play queue

"},{"title":"module:QueueManager.getQueueTypes","link":"getQueueTypes","description":"

Return the types of items in current play queue

"},{"title":"module:QueueManager.getQueueUniqueTypes","link":"getQueueUniqueTypes","description":"

Return the unique types of items in current play queue

"},{"title":"module:QueueManager.getUnshuffledQueue","link":"getUnshuffledQueue","description":"

Return original, unshuffled queue

"},{"title":"module:QueueManager.hold","link":"hold","description":"

Hold an item

"},{"title":"module:QueueManager.init","link":"init"},{"title":"module:QueueManager.isPrerollActive","link":"isPrerollActive","description":"

Return isPrerollActive status

"},{"title":"module:QueueManager.moveBack","link":"moveBack","description":"

Move queue position back one

"},{"title":"module:QueueManager.moveForward","link":"moveForward","description":"

Move queue position ahead one

"},{"title":"module:QueueManager.peek","link":"peek","description":"

Return item at end of play queue without removing

"},{"title":"module:QueueManager.playQueue","link":"playQueue","description":"

Play items in queue

"},{"title":"module:QueueManager.pop","link":"pop","description":"

Remove item at end of play queue

"},{"title":"module:QueueManager.push","link":"push","description":"

Push new items to the play queue

"},{"title":"module:QueueManager.resetQueueItemOrder","link":"resetQueueItemOrder","description":"

Reset queue items back to original, unshuffled order

"},{"title":"module:QueueManager.resetShuffle","link":"resetShuffle","description":"

Reset shuffle to off state

"},{"title":"module:QueueManager.set","link":"set","description":"

Replace play queue with passed array

"},{"title":"module:QueueManager.setPosition","link":"setPosition","description":"

Set the queue position

"},{"title":"module:QueueManager.setPrerollStatus","link":"setPrerollStatus","description":"

Set prerollActive status

"},{"title":"module:QueueManager.setTopStartingPoint","link":"setTopStartingPoint","description":"

Set starting point for top item in the queue

"},{"title":"module:QueueManager.shuffleQueueItems","link":"shuffleQueueItems","description":"

Save a copy of the original queue and randomize order of queue items

"},{"title":"module:QueueManager.toggleShuffle","link":"toggleShuffle","description":"

Toggle shuffleEnabled state

"},{"title":"module:QueueManager.top","link":"top","description":"

Return the fitst item in the play queue

"},{"title":"module:QuickConnect","link":"QuickConnect"},{"title":"module:QuickConnect.init","link":"init"},{"title":"module:QuickConnect.monitorQuickConnect","link":"monitorQuickConnect"},{"title":"module:QuickConnectDialog","link":"QuickConnectDialog"},{"title":"module:QuickConnectDialog.OnAuthenticated","link":"OnAuthenticated"},{"title":"module:QuickConnectDialog.init","link":"init"},{"title":"module:QuickConnectDialog.onButtonSelected","link":"onButtonSelected"},{"title":"module:QuickConnectDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:QuickConnectDialog.quickConnectClosed","link":"quickConnectClosed"},{"title":"module:QuickConnectDialog.quickConnectStatus","link":"quickConnectStatus"},{"title":"module:RadioDialog","link":"RadioDialog"},{"title":"module:RadioDialog.init","link":"init"},{"title":"module:RadioDialog.moveScrollBar","link":"moveScrollBar","description":"

Move the popup's scroll bar

"},{"title":"module:RadioDialog.onButtonSelected","link":"onButtonSelected","description":"

Event handler for when user selected a button

"},{"title":"module:RadioDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:RadioDialog.onItemFocused","link":"onItemFocused","description":"

Event handler for when user's cursor highlights an option in the option list

"},{"title":"module:RadioDialog.onItemSelected","link":"onItemSelected","description":"

Once user selected an item, move cursor down to OK button

"},{"title":"module:RadioDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:RadioDialog.onScrollBarFocus","link":"onScrollBarFocus","description":"

If somehow the scrollbar gains focus, set focus back to the option list

"},{"title":"module:RecordProgramTask","link":"RecordProgramTask"},{"title":"module:RecordProgramTask.RecordOrCancelProgram","link":"RecordOrCancelProgram"},{"title":"module:RecordProgramTask.init","link":"init"},{"title":"module:SceneManager","link":"SceneManager"},{"title":"module:SceneManager.clearPreviousScene","link":"clearPreviousScene","description":"

Clear previous scene from group stack

"},{"title":"module:SceneManager.clearScenes","link":"clearScenes","description":"

Clear all content from group stack

"},{"title":"module:SceneManager.deleteSceneAtIndex","link":"deleteSceneAtIndex","description":"

Delete scene from group stack at passed index

"},{"title":"module:SceneManager.dismissDialog","link":"dismissDialog","description":"

Close currently displayed dialog

"},{"title":"module:SceneManager.getActiveScene","link":"getActiveScene","description":"

Return group at top of stack without removing

"},{"title":"module:SceneManager.init","link":"init"},{"title":"module:SceneManager.isDialogOpen","link":"isDialogOpen","description":"

Returns bool indicating if dialog is currently displayed

"},{"title":"module:SceneManager.optionClosed","link":"optionClosed","description":"

Return button the user selected

"},{"title":"module:SceneManager.optionDialog","link":"optionDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.optionSelected","link":"optionSelected","description":"

Return button the user selected

"},{"title":"module:SceneManager.popScene","link":"popScene","description":"

Remove the current group and load the last group from the stack

"},{"title":"module:SceneManager.pushScene","link":"pushScene","description":"

Push a new group onto the stack, replacing the existing group on the screen

"},{"title":"module:SceneManager.radioDialog","link":"radioDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.registerOverhangData","link":"registerOverhangData","description":"

Register observers for overhang data

"},{"title":"module:SceneManager.resetTime","link":"resetTime","description":"

Reset time

"},{"title":"module:SceneManager.settings","link":"settings","description":"

Display user/device settings screen

"},{"title":"module:SceneManager.standardDialog","link":"standardDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.unregisterOverhangData","link":"unregisterOverhangData","description":"

Remove observers for overhang data

"},{"title":"module:SceneManager.updateOptions","link":"updateOptions","description":"

Update options availability

"},{"title":"module:SceneManager.updateOverhangTitle","link":"updateOverhangTitle","description":"

Update overhang title

"},{"title":"module:SceneManager.updateOverhangVisible","link":"updateOverhangVisible","description":"

Update whether the overhang is visible or not

"},{"title":"module:SceneManager.updateUser","link":"updateUser","description":"

Update username in overhang

"},{"title":"module:SceneManager.userMessage","link":"userMessage","description":"

Display dialog to user with an OK button

"},{"title":"module:ScheduleProgramData","link":"ScheduleProgramData"},{"title":"module:ScheduleProgramData.setFields","link":"setFields"},{"title":"module:ScheduleProgramData.setPoster","link":"setPoster"},{"title":"module:SearchBox","link":"SearchBox"},{"title":"module:SearchBox.init","link":"init"},{"title":"module:SearchBox.searchMedias","link":"searchMedias"},{"title":"module:SearchData","link":"SearchData"},{"title":"module:SearchData.setFields","link":"setFields"},{"title":"module:SearchData.setPoster","link":"setPoster"},{"title":"module:SearchResults","link":"SearchResults"},{"title":"module:SearchResults.init","link":"init"},{"title":"module:SearchResults.loadResults","link":"loadResults"},{"title":"module:SearchResults.onKeyEvent","link":"onKeyEvent"},{"title":"module:SearchResults.searchMedias","link":"searchMedias"},{"title":"module:SearchRow","link":"SearchRow"},{"title":"module:SearchRow.addRow","link":"addRow"},{"title":"module:SearchRow.getData","link":"getData"},{"title":"module:SearchRow.init","link":"init"},{"title":"module:SearchRow.updateSize","link":"updateSize"},{"title":"module:SearchTask","link":"SearchTask"},{"title":"module:SearchTask.init","link":"init"},{"title":"module:SearchTask.search","link":"search"},{"title":"module:SeriesData","link":"SeriesData"},{"title":"module:SeriesData.setFields","link":"setFields"},{"title":"module:SeriesData.setPoster","link":"setPoster"},{"title":"module:ServerDiscoveryTask","link":"ServerDiscoveryTask"},{"title":"module:ServerDiscoveryTask.AddServer","link":"AddServer"},{"title":"module:ServerDiscoveryTask.ProcessClientDiscoveryResponse","link":"ProcessClientDiscoveryResponse"},{"title":"module:ServerDiscoveryTask.ProcessSSDPResponse","link":"ProcessSSDPResponse"},{"title":"module:ServerDiscoveryTask.SendClientDiscoveryBroadcast","link":"SendClientDiscoveryBroadcast"},{"title":"module:ServerDiscoveryTask.SendSSDPBroadcast","link":"SendSSDPBroadcast"},{"title":"module:ServerDiscoveryTask.execute","link":"execute"},{"title":"module:ServerDiscoveryTask.init","link":"init","description":"

Task used to discover jellyfin servers on the local network

"},{"title":"module:SetServerScreen","link":"SetServerScreen"},{"title":"module:SetServerScreen.ScanForServers","link":"ScanForServers"},{"title":"module:SetServerScreen.ScanForServersComplete","link":"ScanForServersComplete"},{"title":"module:SetServerScreen.ShowKeyboard","link":"ShowKeyboard"},{"title":"module:SetServerScreen.clearErrorMessage","link":"clearErrorMessage"},{"title":"module:SetServerScreen.init","link":"init"},{"title":"module:SetServerScreen.onDialogButton","link":"onDialogButton"},{"title":"module:SetServerScreen.onKeyEvent","link":"onKeyEvent"},{"title":"module:ShowScenes","link":"ShowScenes"},{"title":"module:ShowScenes.CreateAlbumView","link":"CreateAlbumView","description":"

Shows details on selected album. Description text, image, and list of available songs

"},{"title":"module:ShowScenes.CreateArtistView","link":"CreateArtistView","description":"

Shows details on selected artist. Bio, image, and list of available albums

"},{"title":"module:ShowScenes.CreateHomeGroup","link":"CreateHomeGroup"},{"title":"module:ShowScenes.CreateItemGrid","link":"CreateItemGrid"},{"title":"module:ShowScenes.CreateMovieDetailsGroup","link":"CreateMovieDetailsGroup"},{"title":"module:ShowScenes.CreateMovieLibraryView","link":"CreateMovieLibraryView"},{"title":"module:ShowScenes.CreateMusicLibraryView","link":"CreateMusicLibraryView"},{"title":"module:ShowScenes.CreatePersonView","link":"CreatePersonView"},{"title":"module:ShowScenes.CreatePlaylistView","link":"CreatePlaylistView","description":"

Shows details on selected playlist. Description text, image, and list of available items

"},{"title":"module:ShowScenes.CreateSearchPage","link":"CreateSearchPage"},{"title":"module:ShowScenes.CreateSeasonDetailsGroup","link":"CreateSeasonDetailsGroup"},{"title":"module:ShowScenes.CreateSeasonDetailsGroupByID","link":"CreateSeasonDetailsGroupByID"},{"title":"module:ShowScenes.CreateSeriesDetailsGroup","link":"CreateSeriesDetailsGroup"},{"title":"module:ShowScenes.CreateServerGroup","link":"CreateServerGroup"},{"title":"module:ShowScenes.CreateSigninGroup","link":"CreateSigninGroup"},{"title":"module:ShowScenes.CreateUserSelectGroup","link":"CreateUserSelectGroup"},{"title":"module:ShowScenes.CreateVideoPlayerGroup","link":"CreateVideoPlayerGroup"},{"title":"module:ShowScenes.DeleteFromServerList","link":"DeleteFromServerList"},{"title":"module:ShowScenes.LoginFlow","link":"LoginFlow"},{"title":"module:ShowScenes.SaveServerList","link":"SaveServerList"},{"title":"module:ShowScenes.SendPerformanceBeacon","link":"SendPerformanceBeacon","description":"

Roku Performance monitoring

"},{"title":"module:ShowScenes.playbackOptionDialog","link":"playbackOptionDialog","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:SlideOutButton","link":"SlideOutButton"},{"title":"module:SlideOutButton.init","link":"init"},{"title":"module:SlideOutButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:SlideOutButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:SlideOutButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:SlideOutButton.onHighlightChanged","link":"onHighlightChanged"},{"title":"module:SlideOutButton.onIconChanged","link":"onIconChanged"},{"title":"module:SlideOutButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:SlideOutButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:SlideOutButton.onTextChanged","link":"onTextChanged"},{"title":"module:SlideOutButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:SlideOutButton.setIconSize","link":"setIconSize"},{"title":"module:SongItem","link":"SongItem"},{"title":"module:SongItem.focusChanged","link":"focusChanged"},{"title":"module:SongItem.init","link":"init"},{"title":"module:SongItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:Spinner","link":"Spinner"},{"title":"module:Spinner.init","link":"init"},{"title":"module:StandardDialog","link":"StandardDialog"},{"title":"module:StandardDialog.init","link":"init"},{"title":"module:StandardDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:Subtitles","link":"Subtitles"},{"title":"module:Subtitles.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:Subtitles.changeSubtitleDuringPlayback","link":"changeSubtitleDuringPlayback"},{"title":"module:Subtitles.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

Identify the default subtitle track\nif "requires_text" is true, only return a track if it is textual\nThis allows forcing text subs, since roku requires transcoding of non-text subs\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.defaultSubtitleTrackFromVid","link":"defaultSubtitleTrackFromVid","description":"

Identify the default subtitle track for a given video id\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:Subtitles.getSubtitleSelIdxFromSubIdx","link":"getSubtitleSelIdxFromSubIdx","description":"

The subtitle index on the server differs from the index we track locally\nThis function converts the former into the latter

"},{"title":"module:Subtitles.selectSubtitleTrack","link":"selectSubtitleTrack"},{"title":"module:Subtitles.selectSubtitleTrackDialog","link":"selectSubtitleTrackDialog","description":"

Present Dialog to user to select subtitle track

"},{"title":"module:Subtitles.setupSubtitle","link":"setupSubtitle","description":"

Given a set of subtitles, and a subtitle index (the index on the server, not in the list provided)\nthis will set all relevant settings for roku (mainly closed captions) and return the index of the\nsubtitle track specified, but indexed based on the provided list of subtitles

"},{"title":"module:Subtitles.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:Subtitles.turnoffSubtitles","link":"turnoffSubtitles"},{"title":"module:TVEpisode","link":"TVEpisode"},{"title":"module:TVEpisode.setFields","link":"setFields"},{"title":"module:TVEpisode.setPoster","link":"setPoster"},{"title":"module:TVEpisodeData","link":"TVEpisodeData"},{"title":"module:TVEpisodeData.setFields","link":"setFields"},{"title":"module:TVEpisodeData.setPoster","link":"setPoster"},{"title":"module:TVEpisodeRow","link":"TVEpisodeRow"},{"title":"module:TVEpisodeRow.init","link":"init"},{"title":"module:TVEpisodeRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRow.setData","link":"setData"},{"title":"module:TVEpisodeRow.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRow.updateSize","link":"updateSize"},{"title":"module:TVEpisodeRowWithOptions","link":"TVEpisodeRowWithOptions"},{"title":"module:TVEpisodeRowWithOptions.SetUpAudioOptions","link":"SetUpAudioOptions","description":"

List of audio tracks to choose from

"},{"title":"module:TVEpisodeRowWithOptions.SetUpVideoOptions","link":"SetUpVideoOptions","description":"

List of video versions to choose from

"},{"title":"module:TVEpisodeRowWithOptions.audioOptionsClosed","link":"audioOptionsClosed"},{"title":"module:TVEpisodeRowWithOptions.init","link":"init"},{"title":"module:TVEpisodeRowWithOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRowWithOptions.rowsDoneLoading","link":"rowsDoneLoading"},{"title":"module:TVEpisodeRowWithOptions.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRowWithOptions.videoOptionsClosed","link":"videoOptionsClosed"},{"title":"module:TVEpisodes","link":"TVEpisodes"},{"title":"module:TVEpisodes.init","link":"init"},{"title":"module:TVEpisodes.onKeyEvent","link":"onKeyEvent","description":"

Handle navigation input from the remote and act on it

"},{"title":"module:TVEpisodes.setExtraButtonVisibility","link":"setExtraButtonVisibility","description":"

Updates the visibility of the Extras button based on if this season has any extra features

"},{"title":"module:TVEpisodes.setSeasonLoading","link":"setSeasonLoading"},{"title":"module:TVEpisodes.updateSeason","link":"updateSeason"},{"title":"module:TVListDetails","link":"TVListDetails"},{"title":"module:TVListDetails.DisplayAudioAvailable","link":"DisplayAudioAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one audio track to choose from

"},{"title":"module:TVListDetails.DisplayVideoAvailable","link":"DisplayVideoAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one video version to choose from

"},{"title":"module:TVListDetails.SetupAudioDisplay","link":"SetupAudioDisplay","description":"

Display current audio_codec and check if there is more than one audio track to choose from...

"},{"title":"module:TVListDetails.focusChanged","link":"focusChanged"},{"title":"module:TVListDetails.getEndTime","link":"getEndTime"},{"title":"module:TVListDetails.getRuntime","link":"getRuntime"},{"title":"module:TVListDetails.init","link":"init"},{"title":"module:TVListDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVListOptions","link":"TVListOptions"},{"title":"module:TVListOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:TVListOptions.init","link":"init"},{"title":"module:TVListOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVListOptions.optionsSet","link":"optionsSet"},{"title":"module:TVSeasonData","link":"TVSeasonData"},{"title":"module:TVSeasonData.setFields","link":"setFields"},{"title":"module:TVSeasonData.setPoster","link":"setPoster"},{"title":"module:TVSeasonRow","link":"TVSeasonRow"},{"title":"module:TVSeasonRow.getData","link":"getData"},{"title":"module:TVSeasonRow.init","link":"init"},{"title":"module:TVSeasonRow.updateSize","link":"updateSize"},{"title":"module:TVShowDescription","link":"TVShowDescription"},{"title":"module:TVShowDescription.getEndTime","link":"getEndTime"},{"title":"module:TVShowDescription.getHistory","link":"getHistory"},{"title":"module:TVShowDescription.getRuntime","link":"getRuntime"},{"title":"module:TVShowDescription.init","link":"init"},{"title":"module:TVShowDescription.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDescription.round","link":"round"},{"title":"module:TVShowDescription.setFieldText","link":"setFieldText"},{"title":"module:TVShowDetails","link":"TVShowDetails"},{"title":"module:TVShowDetails.getEndTime","link":"getEndTime"},{"title":"module:TVShowDetails.getHistory","link":"getHistory"},{"title":"module:TVShowDetails.getRuntime","link":"getRuntime"},{"title":"module:TVShowDetails.init","link":"init"},{"title":"module:TVShowDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVShowDetails.onShuffleEpisodeDataLoaded","link":"onShuffleEpisodeDataLoaded"},{"title":"module:TVShowDetails.round","link":"round"},{"title":"module:TVShowDetails.setFieldText","link":"setFieldText"},{"title":"module:TextSizeTask","link":"TextSizeTask"},{"title":"module:TextSizeTask.getTextSize","link":"getTextSize"},{"title":"module:TextSizeTask.init","link":"init"},{"title":"module:UserData","link":"UserData"},{"title":"module:UserData.getPreference","link":"getPreference"},{"title":"module:UserData.loadFromJSON","link":"loadFromJSON"},{"title":"module:UserData.loadFromRegistry","link":"loadFromRegistry"},{"title":"module:UserData.removeFromRegistry","link":"removeFromRegistry"},{"title":"module:UserData.saveToRegistry","link":"saveToRegistry"},{"title":"module:UserData.setActive","link":"setActive"},{"title":"module:UserData.setDataFromJSON","link":"setDataFromJSON"},{"title":"module:UserData.setPreference","link":"setPreference"},{"title":"module:UserData.setServer","link":"setServer"},{"title":"module:UserItem","link":"UserItem"},{"title":"module:UserItem.init","link":"init"},{"title":"module:UserItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserLibrary","link":"UserLibrary"},{"title":"module:UserLibrary.MarkItemFavorite","link":"MarkItemFavorite"},{"title":"module:UserLibrary.MarkItemWatched","link":"MarkItemWatched"},{"title":"module:UserLibrary.UnmarkItemFavorite","link":"UnmarkItemFavorite"},{"title":"module:UserLibrary.UnmarkItemWatched","link":"UnmarkItemWatched"},{"title":"module:UserRow","link":"UserRow"},{"title":"module:UserRow.init","link":"init"},{"title":"module:UserRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserRow.setData","link":"setData"},{"title":"module:UserRow.setUser","link":"setUser"},{"title":"module:UserRow.updateSize","link":"updateSize"},{"title":"module:UserSelect","link":"UserSelect"},{"title":"module:UserSelect.init","link":"init"},{"title":"module:UserSelect.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserSelect.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserSelect.redraw","link":"redraw"},{"title":"module:VideoData","link":"VideoData"},{"title":"module:VideoData.setFields","link":"setFields"},{"title":"module:VideoData.setPoster","link":"setPoster"},{"title":"module:VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.AddVideoContent","link":"AddVideoContent"},{"title":"module:VideoPlayer.GetPlaybackInfo","link":"GetPlaybackInfo","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:VideoPlayer.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:VideoPlayer.PlayIntroVideo","link":"PlayIntroVideo"},{"title":"module:VideoPlayer.VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.autoPlayNextEpisode","link":"autoPlayNextEpisode"},{"title":"module:VideoPlayer.directPlaySupported","link":"directPlaySupported"},{"title":"module:VideoPlayer.getAudioFormat","link":"getAudioFormat"},{"title":"module:VideoPlayer.getAudioInfo","link":"getAudioInfo"},{"title":"module:VideoPlayer.getContainerType","link":"getContainerType"},{"title":"module:VideoPlayer.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:VideoPlayer.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:VideoPlayer.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:VideoPlayer.startPlayBackOver","link":"startPlayBackOver","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:VideoPlayerView","link":"VideoPlayerView"},{"title":"module:VideoPlayerView.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:VideoPlayerView.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:VideoPlayerView.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:VideoPlayerView.getCurrentChapterIndex","link":"getCurrentChapterIndex","description":"

getCurrentChapterIndex: Finds current chapter index

"},{"title":"module:VideoPlayerView.handleChapterListAction","link":"handleChapterListAction","description":"

handleChapterListAction: Handles action to show chapter list

"},{"title":"module:VideoPlayerView.handleChapterSkipAction","link":"handleChapterSkipAction","description":"

handleChapterSkipAction: Handles user command to skip chapters in playing video

"},{"title":"module:VideoPlayerView.handleHideAction","link":"handleHideAction","description":"

handleHideAction: Handles action to hide OSD menu

"},{"title":"module:VideoPlayerView.handleShowSubtitleMenuAction","link":"handleShowSubtitleMenuAction","description":"

handleShowSubtitleMenuAction: Handles action to show subtitle selection menu

"},{"title":"module:VideoPlayerView.handleShowVideoInfoPopupAction","link":"handleShowVideoInfoPopupAction","description":"

handleShowVideoInfoPopupAction: Handles action to show video info popup

"},{"title":"module:VideoPlayerView.handleVideoPlayPauseAction","link":"handleVideoPlayPauseAction","description":"

handleVideoPlayPauseAction: Handles action to either play or pause the video content

"},{"title":"module:VideoPlayerView.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:VideoPlayerView.init","link":"init"},{"title":"module:VideoPlayerView.loadCaption","link":"loadCaption","description":"

Set caption url to server subtitle track

"},{"title":"module:VideoPlayerView.onAllowCaptionsChange","link":"onAllowCaptionsChange","description":"

Only setup caption items if captions are allowed

"},{"title":"module:VideoPlayerView.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:VideoPlayerView.onKeyEvent","link":"onKeyEvent"},{"title":"module:VideoPlayerView.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:VideoPlayerView.onOSDAction","link":"onOSDAction","description":"

onOSDAction: Process action events from OSD to their respective handlers

"},{"title":"module:VideoPlayerView.onPlaybackErrorButtonSelected","link":"onPlaybackErrorButtonSelected"},{"title":"module:VideoPlayerView.onPlaybackErrorDialogClosed","link":"onPlaybackErrorDialogClosed"},{"title":"module:VideoPlayerView.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onSubtitleChange","link":"onSubtitleChange","description":"

Event handler for when selectedSubtitle changes

"},{"title":"module:VideoPlayerView.onVideoContentLoaded","link":"onVideoContentLoaded"},{"title":"module:VideoPlayerView.populateChapterMenu","link":"populateChapterMenu","description":"

populateChapterMenu: ' Parse chapter data from API and appeand to chapter list menu

"},{"title":"module:VideoPlayerView.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:VideoPlayerView.showPlaybackErrorDialog","link":"showPlaybackErrorDialog"},{"title":"module:VideoPlayerView.stateAllowsOSD","link":"stateAllowsOSD","description":"

stateAllowsOSD: Check if current video state allows showing the OSD

"},{"title":"module:VideoPlayerView.toggleCaption","link":"toggleCaption","description":"

Toggles visibility of custom subtitles and sets captionTask's player state

"},{"title":"module:VideoPlayerView.updateCaption","link":"updateCaption","description":"

Removes old subtitle lines and adds new subtitle lines

"},{"title":"module:VideoPlayerView.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:VideoTrackListItem","link":"VideoTrackListItem"},{"title":"module:VideoTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:VideoTrackListItem.init","link":"init"},{"title":"module:VideoTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ViewCreator","link":"ViewCreator"},{"title":"module:ViewCreator.CreateAudioPlayerView","link":"CreateAudioPlayerView","description":"

Play Audio

"},{"title":"module:ViewCreator.CreateVideoPlayerView","link":"CreateVideoPlayerView","description":"

Play Video

"},{"title":"module:ViewCreator.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:ViewCreator.onPlaybackInfoLoaded","link":"onPlaybackInfoLoaded","description":"

The playback info task has returned data

"},{"title":"module:ViewCreator.onSelectPlaybackInfoPressed","link":"onSelectPlaybackInfoPressed","description":"

User requested playback info

"},{"title":"module:ViewCreator.onSelectSubtitlePressed","link":"onSelectSubtitlePressed","description":"

User requested subtitle selection popup

"},{"title":"module:ViewCreator.onSelectionMade","link":"onSelectionMade","description":"

User has selected something from the radioDialog popup

"},{"title":"module:ViewCreator.onStateChange","link":"onStateChange","description":"

Playback state change event handlers

"},{"title":"module:ViewCreator.processSubtitleSelection","link":"processSubtitleSelection"},{"title":"module:WhatsNewDialog","link":"WhatsNewDialog"},{"title":"module:WhatsNewDialog.init","link":"init"},{"title":"module:WhatsNewDialog.setPalette","link":"setPalette"},{"title":"module:baserequest","link":"baserequest"},{"title":"module:baserequest.APIRequest","link":"APIRequest"},{"title":"module:baserequest.authRequest","link":"authRequest","description":"

Takes and returns a roUrlTransfer object after adding a Jellyfin "Authorization" header

"},{"title":"module:baserequest.buildAuthHeader","link":"buildAuthHeader","description":"

Returns a string containing the "Authorization" header payload

"},{"title":"module:baserequest.buildParams","link":"buildParams","description":"

Functions for making requests to the API

"},{"title":"module:baserequest.buildURL","link":"buildURL"},{"title":"module:baserequest.deleteVoid","link":"deleteVoid"},{"title":"module:baserequest.getJson","link":"getJson"},{"title":"module:baserequest.getString","link":"getString"},{"title":"module:baserequest.getVoid","link":"getVoid"},{"title":"module:baserequest.get_url","link":"get_url"},{"title":"module:baserequest.headVoid","link":"headVoid"},{"title":"module:baserequest.postJson","link":"postJson"},{"title":"module:baserequest.postString","link":"postString"},{"title":"module:baserequest.postVoid","link":"postVoid"},{"title":"module:baserequest.setCertificateAuthority","link":"setCertificateAuthority","description":"

sets the certificate authority by file path on the passed node

"},{"title":"module:captionTask","link":"captionTask"},{"title":"module:captionTask.fetchCaption","link":"fetchCaption"},{"title":"module:captionTask.init","link":"init"},{"title":"module:captionTask.isTime","link":"isTime"},{"title":"module:captionTask.newLayoutGroup","link":"newLayoutGroup"},{"title":"module:captionTask.newRect","link":"newRect"},{"title":"module:captionTask.newlabel","link":"newlabel"},{"title":"module:captionTask.parseVTT","link":"parseVTT"},{"title":"module:captionTask.setFont","link":"setFont"},{"title":"module:captionTask.toMs","link":"toMs"},{"title":"module:captionTask.updateCaption","link":"updateCaption"},{"title":"module:conditional","link":"conditional"},{"title":"module:conditional.printRegistry","link":"printRegistry","description":"

Print out all of the registry contents to the debug log

"},{"title":"module:config","link":"config"},{"title":"module:config.GetConfigTree","link":"GetConfigTree","description":"

Read config tree from json config file and return

"},{"title":"module:config.RegistryReadAll","link":"RegistryReadAll","description":"

Return all data found inside a registry section

"},{"title":"module:config.findConfigTreeKey","link":"findConfigTreeKey","description":"

Recursivly search the config tree for entry with settingname equal to key

"},{"title":"module:config.getRegistrySections","link":"getRegistrySections","description":"

Return an array of all the registry section keys

"},{"title":"module:config.getSavedUsers","link":"getSavedUsers","description":"

Returns an array of saved users from the registry\nthat belong to the active server

"},{"title":"module:config.get_setting","link":"get_setting","description":"

"Jellyfin" registry accessors for the default global settings

"},{"title":"module:config.get_user_setting","link":"get_user_setting","description":"

User registry accessors for the currently active user

"},{"title":"module:config.registry_delete","link":"registry_delete"},{"title":"module:config.registry_read","link":"registry_read","description":"

Generic registry accessors

"},{"title":"module:config.registry_write","link":"registry_write"},{"title":"module:config.set_setting","link":"set_setting"},{"title":"module:config.set_user_setting","link":"set_user_setting"},{"title":"module:config.unset_setting","link":"unset_setting"},{"title":"module:config.unset_user_setting","link":"unset_user_setting"},{"title":"module:deviceCapabilities","link":"deviceCapabilities"},{"title":"module:deviceCapabilities.GetBitRateLimit","link":"GetBitRateLimit"},{"title":"module:deviceCapabilities.GetDirectPlayProfiles","link":"GetDirectPlayProfiles"},{"title":"module:deviceCapabilities.getCodecProfiles","link":"getCodecProfiles"},{"title":"module:deviceCapabilities.getContainerProfiles","link":"getContainerProfiles"},{"title":"module:deviceCapabilities.getDeviceCapabilities","link":"getDeviceCapabilities","description":"

Returns the Device Capabilities for Roku.\nAlso prints out the device profile for debugging

"},{"title":"module:deviceCapabilities.getDeviceProfile","link":"getDeviceProfile"},{"title":"module:deviceCapabilities.getMaxHeightArray","link":"getMaxHeightArray"},{"title":"module:deviceCapabilities.getMaxWidthArray","link":"getMaxWidthArray"},{"title":"module:deviceCapabilities.getSubtitleProfiles","link":"getSubtitleProfiles"},{"title":"module:deviceCapabilities.getTranscodingProfiles","link":"getTranscodingProfiles"},{"title":"module:deviceCapabilities.printDeviceProfile","link":"printDeviceProfile","description":"

Print out the deviceProfile for debugging

"},{"title":"module:deviceCapabilities.removeDecimals","link":"removeDecimals","description":"

Remove all decimals from a string

"},{"title":"module:deviceCapabilities.setPreferredCodec","link":"setPreferredCodec","description":"

Takes and returns a comma delimited string of codecs.\nMoves the preferred codec to the front of the string

"},{"title":"module:deviceCapabilities.updateProfileArray","link":"updateProfileArray","description":"

Recieves and returns an assArray of supported profiles and levels for each video codec

"},{"title":"module:globals","link":"globals"},{"title":"module:globals.SaveAppToGlobal","link":"SaveAppToGlobal","description":"

Save information from roAppInfo to m.global.app

"},{"title":"module:globals.SaveDeviceToGlobal","link":"SaveDeviceToGlobal","description":"

Save information from roDeviceInfo to m.global.device

"},{"title":"module:globals.setConstants","link":"setConstants","description":"

Set global constants

"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.runGlobalMigrations","link":"runGlobalMigrations","description":"

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

"},{"title":"module:migrations.runRegistryUserMigrations","link":"runRegistryUserMigrations"},{"title":"module:misc","link":"misc"},{"title":"module:misc.AssocArrayEqual","link":"AssocArrayEqual"},{"title":"module:misc.arrayHasValue","link":"arrayHasValue","description":"

Check if a specific value is inside of an array

"},{"title":"module:misc.div_ceiling","link":"div_ceiling"},{"title":"module:misc.findNodeBySubtype","link":"findNodeBySubtype"},{"title":"module:misc.formatTime","link":"formatTime","description":"

Format time as 12 or 24 hour format based on system clock setting

"},{"title":"module:misc.getButton","link":"getButton"},{"title":"module:misc.getMinutes","link":"getMinutes","description":"

Converts ticks to minutes

"},{"title":"module:misc.getMsgPicker","link":"getMsgPicker"},{"title":"module:misc.get_dialog_result","link":"get_dialog_result","description":"

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

"},{"title":"module:misc.inArray","link":"inArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:misc.inferServerUrl","link":"inferServerUrl","description":"

take an incomplete url string and use it to make educated guesses about\nthe complete url. then tests these guesses to see if it can find a jf server\nreturns the url of the server it found, or an empty string

"},{"title":"module:misc.isJellyfinServer","link":"isJellyfinServer","description":"

accepts the raw json string of /system/info/public and returns\na boolean indicating if ProductName is "Jellyfin Server"

"},{"title":"module:misc.isLocalhost","link":"isLocalhost","description":"

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

"},{"title":"module:misc.isNodeEvent","link":"isNodeEvent"},{"title":"module:misc.isValid","link":"isValid","description":"

Returns whether or not passed value is valid

"},{"title":"module:misc.isValidAndNotEmpty","link":"isValidAndNotEmpty","description":"

Returns whether or not passed value is valid and not empty\nAccepts a string, or any countable type (arrays and lists)

"},{"title":"module:misc.lastFocusedChild","link":"lastFocusedChild"},{"title":"module:misc.leftPad","link":"leftPad"},{"title":"module:misc.message_dialog","link":"message_dialog"},{"title":"module:misc.option_dialog","link":"option_dialog"},{"title":"module:misc.parseUrl","link":"parseUrl","description":"

Returns an array from a url = [ url, proto, host, port, subdir+params ]\nIf port or subdir are not found, an empty string will be added to the array\nProto must be declared or array will be empty

"},{"title":"module:misc.roundNumber","link":"roundNumber","description":"

Rounds number to nearest integer

"},{"title":"module:misc.secondsToHuman","link":"secondsToHuman"},{"title":"module:misc.setFieldTextValue","link":"setFieldTextValue"},{"title":"module:misc.show_dialog","link":"show_dialog"},{"title":"module:misc.shuffleArray","link":"shuffleArray","description":"

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

"},{"title":"module:misc.startLoadingSpinner","link":"startLoadingSpinner"},{"title":"module:misc.startMediaLoadingSpinner","link":"startMediaLoadingSpinner"},{"title":"module:misc.stopLoadingSpinner","link":"stopLoadingSpinner"},{"title":"module:misc.ticksToHuman","link":"ticksToHuman"},{"title":"module:misc.toString","link":"toString"},{"title":"module:misc.urlCandidates","link":"urlCandidates","description":"

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates\nfor the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated\nfull urls.

"},{"title":"module:misc.versionChecker","link":"versionChecker","description":"

Returns whether or not a version number (e.g. 10.7.7) is greater or equal\nto some minimum version allowed (e.g. 10.8.0)

"},{"title":"module:quickplay","link":"quickplay"},{"title":"module:quickplay.album","link":"album","description":"

A music album.\nPlay the entire album starting with track 1.

"},{"title":"module:quickplay.artist","link":"artist","description":"

A music artist.\nShuffle play all songs by artist.

"},{"title":"module:quickplay.audio","link":"audio","description":"

A single audio file.

"},{"title":"module:quickplay.boxset","link":"boxset","description":"

A boxset.\nPlay all items inside.

"},{"title":"module:quickplay.collectionFolder","link":"collectionFolder","description":"

Quick Play A CollectionFolder.\nShuffle play the items inside\nwith some differences based on collectionType.

"},{"title":"module:quickplay.folder","link":"folder","description":"

Quick Play A folder.\nShuffle play all items found

"},{"title":"module:quickplay.multipleSeries","link":"multipleSeries","description":"

More than one TV Show Series.\nShuffle play all watched episodes

"},{"title":"module:quickplay.musicVideo","link":"musicVideo","description":"

A single music video file.

"},{"title":"module:quickplay.person","link":"person","description":"

Quick Play A Person.\nShuffle play all videos found

"},{"title":"module:quickplay.photo","link":"photo","description":"

A single photo.

"},{"title":"module:quickplay.photoAlbum","link":"photoAlbum","description":"

A photo album.

"},{"title":"module:quickplay.playlist","link":"playlist","description":"

Quick Play A Playlist.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.program","link":"program","description":"

Quick Play A Live Program

"},{"title":"module:quickplay.pushToQueue","link":"pushToQueue","description":"

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

"},{"title":"module:quickplay.season","link":"season","description":"

A TV Show Season.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.series","link":"series","description":"

A TV Show Series.\nPlay the first unwatched episode.\nIf none, shuffle play the whole series.

"},{"title":"module:quickplay.tvChannel","link":"tvChannel","description":"

Quick Play A TVChannel

"},{"title":"module:quickplay.userView","link":"userView","description":"

Quick Play A UserView.\nPlay logic depends on "collectionType".

"},{"title":"module:quickplay.video","link":"video","description":"

A single video file.

"},{"title":"module:schedule","link":"schedule"},{"title":"module:schedule.channelFilterSet","link":"channelFilterSet"},{"title":"module:schedule.channelsearchTermSet","link":"channelsearchTermSet","description":"

Voice Search set

"},{"title":"module:schedule.focusProgramDetails","link":"focusProgramDetails","description":"

Move the TV Guide Grid down or up depending whether details are selected

"},{"title":"module:schedule.init","link":"init"},{"title":"module:schedule.onChannelsLoaded","link":"onChannelsLoaded","description":"

Initial list of channels loaded

"},{"title":"module:schedule.onGridScrolled","link":"onGridScrolled","description":"

As user scrolls grid, check if more data requries to be loaded

"},{"title":"module:schedule.onKeyEvent","link":"onKeyEvent"},{"title":"module:schedule.onProgramDetailsLoaded","link":"onProgramDetailsLoaded","description":"

Update the Program Details with full information

"},{"title":"module:schedule.onProgramFocused","link":"onProgramFocused"},{"title":"module:schedule.onProgramSelected","link":"onProgramSelected"},{"title":"module:schedule.onRecordChannelSelected","link":"onRecordChannelSelected","description":"

Handle user selecting "Record Channel" from Program Details

"},{"title":"module:schedule.onRecordOperationDone","link":"onRecordOperationDone"},{"title":"module:schedule.onRecordSeriesChannelSelected","link":"onRecordSeriesChannelSelected","description":"

Handle user selecting "Record Series" from Program Details

"},{"title":"module:schedule.onScheduleLoaded","link":"onScheduleLoaded","description":"

When LoadScheduleTask completes (initial or more data) and we have a schedule to display

"},{"title":"module:schedule.onWatchChannelSelected","link":"onWatchChannelSelected","description":"

Handle user selecting "Watch Channel" from Program Details

"},{"title":"module:section","link":"section"},{"title":"module:section.init","link":"init"},{"title":"module:section.onFocusChange","link":"onFocusChange"},{"title":"module:section.onIDChange","link":"onIDChange"},{"title":"module:section.onTranslationChange","link":"onTranslationChange"},{"title":"module:section.scrollDownToOnDeck","link":"scrollDownToOnDeck"},{"title":"module:section.scrollOffBottom","link":"scrollOffBottom"},{"title":"module:section.scrollOffOnDeck","link":"scrollOffOnDeck"},{"title":"module:section.scrollOffTop","link":"scrollOffTop"},{"title":"module:section.scrollUpToOnDeck","link":"scrollUpToOnDeck"},{"title":"module:section.showFromBottom","link":"showFromBottom"},{"title":"module:section.showFromTop","link":"showFromTop"},{"title":"module:sectionScroller","link":"sectionScroller"},{"title":"module:sectionScroller.displayedIndexChanged","link":"displayedIndexChanged"},{"title":"module:sectionScroller.init","link":"init"},{"title":"module:sectionScroller.onFocusChange","link":"onFocusChange"},{"title":"module:settings","link":"settings"},{"title":"module:settings.LoadMenu","link":"LoadMenu"},{"title":"module:settings.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook that gets ran as needed.\nAssumes settings were changed and they affect the device profile.\nPosts a new device profile to the server using the task thread

"},{"title":"module:settings.boolSettingChanged","link":"boolSettingChanged"},{"title":"module:settings.init","link":"init"},{"title":"module:settings.isFormInFocus","link":"isFormInFocus","description":"

Returns true if any of the data entry forms are in focus

"},{"title":"module:settings.onKeyEvent","link":"onKeyEvent"},{"title":"module:settings.onKeyGridEscape","link":"onKeyGridEscape"},{"title":"module:settings.onKeyGridSubmit","link":"onKeyGridSubmit"},{"title":"module:settings.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:settings.radioSettingChanged","link":"radioSettingChanged"},{"title":"module:settings.settingFocused","link":"settingFocused"},{"title":"module:settings.settingSelected","link":"settingSelected"},{"title":"module:userauth","link":"userauth"},{"title":"module:userauth.AboutMe","link":"AboutMe"},{"title":"module:userauth.AuthenticateViaQuickConnect","link":"AuthenticateViaQuickConnect"},{"title":"module:userauth.AvailableUsers","link":"AvailableUsers"},{"title":"module:userauth.GetPublicUsers","link":"GetPublicUsers"},{"title":"module:userauth.LoadUserAbilities","link":"LoadUserAbilities"},{"title":"module:userauth.ServerInfo","link":"ServerInfo"},{"title":"module:userauth.SignOut","link":"SignOut"},{"title":"module:userauth.checkQuickConnect","link":"checkQuickConnect"},{"title":"module:userauth.get_token","link":"get_token"},{"title":"module:userauth.initQuickConnect","link":"initQuickConnect"}]} \ No newline at end of file +{"list":[{"title":"module:AlbumData","link":"AlbumData"},{"title":"module:AlbumData.setFields","link":"setFields"},{"title":"module:AlbumGrid","link":"AlbumGrid"},{"title":"module:AlbumGrid.getData","link":"getData"},{"title":"module:AlbumGrid.init","link":"init"},{"title":"module:AlbumGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumTrackList","link":"AlbumTrackList"},{"title":"module:AlbumTrackList.getData","link":"getData"},{"title":"module:AlbumTrackList.init","link":"init"},{"title":"module:AlbumView","link":"AlbumView"},{"title":"module:AlbumView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:AlbumView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:AlbumView.createDialogPallete","link":"createDialogPallete"},{"title":"module:AlbumView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:AlbumView.init","link":"init"},{"title":"module:AlbumView.onDoneLoading","link":"onDoneLoading"},{"title":"module:AlbumView.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:AlbumView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AlbumView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AlbumView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AlbumView.setupMainNode","link":"setupMainNode"},{"title":"module:Alpha","link":"Alpha"},{"title":"module:Alpha.init","link":"init"},{"title":"module:Alpha.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView","link":"ArtistView"},{"title":"module:ArtistView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:ArtistView.OnScreenShown","link":"OnScreenShown"},{"title":"module:ArtistView.artistOverviewChanged","link":"artistOverviewChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:ArtistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:ArtistView.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:ArtistView.init","link":"init"},{"title":"module:ArtistView.onAlbumsData","link":"onAlbumsData"},{"title":"module:ArtistView.onAlbumsEscape","link":"onAlbumsEscape"},{"title":"module:ArtistView.onAppearsOnData","link":"onAppearsOnData"},{"title":"module:ArtistView.onAppearsOnEscape","link":"onAppearsOnEscape"},{"title":"module:ArtistView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:ArtistView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:ArtistView.onEllipsisChanged","link":"onEllipsisChanged"},{"title":"module:ArtistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView.onSectionNavigationEscape","link":"onSectionNavigationEscape"},{"title":"module:ArtistView.onSectionNavigationSelected","link":"onSectionNavigationSelected"},{"title":"module:ArtistView.onSectionScrollerChange","link":"onSectionScrollerChange"},{"title":"module:ArtistView.pageContentChanged","link":"pageContentChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:ArtistView.setPosterImage","link":"setPosterImage"},{"title":"module:ArtistView.setScreenTitle","link":"setScreenTitle"},{"title":"module:ArtistView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:ArtistView.setupMainNode","link":"setupMainNode"},{"title":"module:AudioPlayer","link":"AudioPlayer"},{"title":"module:AudioPlayer.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:AudioPlayer.audioStateChanged","link":"audioStateChanged","description":"

State Change Event Handler

"},{"title":"module:AudioPlayer.init","link":"init"},{"title":"module:AudioPlayerView","link":"AudioPlayerView"},{"title":"module:AudioPlayerView.LoadNextSong","link":"LoadNextSong"},{"title":"module:AudioPlayerView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:AudioPlayerView.audioPositionChanged","link":"audioPositionChanged"},{"title":"module:AudioPlayerView.audioStateChanged","link":"audioStateChanged"},{"title":"module:AudioPlayerView.bufferPositionChanged","link":"bufferPositionChanged"},{"title":"module:AudioPlayerView.endScreenSaver","link":"endScreenSaver"},{"title":"module:AudioPlayerView.findCurrentSongIndex","link":"findCurrentSongIndex"},{"title":"module:AudioPlayerView.init","link":"init"},{"title":"module:AudioPlayerView.loadButtons","link":"loadButtons","description":"

If we have more and 1 song to play, fade in the next and previous controls

"},{"title":"module:AudioPlayerView.loopClicked","link":"loopClicked"},{"title":"module:AudioPlayerView.nextClicked","link":"nextClicked"},{"title":"module:AudioPlayerView.onAudioStreamLoaded","link":"onAudioStreamLoaded"},{"title":"module:AudioPlayerView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:AudioPlayerView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:AudioPlayerView.onKeyEvent","link":"onKeyEvent","description":"

Process key press events

"},{"title":"module:AudioPlayerView.onMetaDataLoaded","link":"onMetaDataLoaded"},{"title":"module:AudioPlayerView.onScreensaverTimeoutLoaded","link":"onScreensaverTimeoutLoaded"},{"title":"module:AudioPlayerView.pageContentChanged","link":"pageContentChanged","description":"

Update values on screen when page content changes

"},{"title":"module:AudioPlayerView.playAction","link":"playAction"},{"title":"module:AudioPlayerView.previousClicked","link":"previousClicked"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.screenSaverActive","link":"screenSaverActive"},{"title":"module:AudioPlayerView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:AudioPlayerView.setLoopButtonImage","link":"setLoopButtonImage"},{"title":"module:AudioPlayerView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AudioPlayerView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AudioPlayerView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AudioPlayerView.setShuffleIconState","link":"setShuffleIconState"},{"title":"module:AudioPlayerView.setTrackNumberDisplay","link":"setTrackNumberDisplay"},{"title":"module:AudioPlayerView.setupAnimationTasks","link":"setupAnimationTasks"},{"title":"module:AudioPlayerView.setupAudioNode","link":"setupAudioNode","description":"

Creates audio node used to play song(s)

"},{"title":"module:AudioPlayerView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:AudioPlayerView.setupDataTasks","link":"setupDataTasks","description":"

Creates tasks to gather data needed to render Scene and play song

"},{"title":"module:AudioPlayerView.setupInfoNodes","link":"setupInfoNodes"},{"title":"module:AudioPlayerView.setupScreenSaver","link":"setupScreenSaver"},{"title":"module:AudioPlayerView.shuffleClicked","link":"shuffleClicked"},{"title":"module:AudioPlayerView.startScreenSaver","link":"startScreenSaver"},{"title":"module:AudioPlayerView.toggleShuffleEnabled","link":"toggleShuffleEnabled"},{"title":"module:AudioTrackListItem","link":"AudioTrackListItem"},{"title":"module:AudioTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:AudioTrackListItem.init","link":"init"},{"title":"module:AudioTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ButtonGroupHoriz","link":"ButtonGroupHoriz"},{"title":"module:ButtonGroupHoriz.init","link":"init"},{"title":"module:ButtonGroupHoriz.onKeyEvent","link":"onKeyEvent"},{"title":"module:ButtonGroupVert","link":"ButtonGroupVert"},{"title":"module:ButtonGroupVert.init","link":"init"},{"title":"module:ButtonGroupVert.onFocusButtonChanged","link":"onFocusButtonChanged"},{"title":"module:ButtonGroupVert.onFocusChanged","link":"onFocusChanged"},{"title":"module:ButtonGroupVert.onKeyEvent","link":"onKeyEvent"},{"title":"module:ChannelData","link":"ChannelData"},{"title":"module:ChannelData.setFields","link":"setFields"},{"title":"module:ChannelData.setPoster","link":"setPoster"},{"title":"module:Clock","link":"Clock"},{"title":"module:Clock.init","link":"init"},{"title":"module:Clock.onCurrentTimeTimerFire","link":"onCurrentTimeTimerFire","description":"

onCurrentTimeTimerFire: Code that runs every time the currentTimeTimer fires

"},{"title":"module:CollectionData","link":"CollectionData"},{"title":"module:CollectionData.setFields","link":"setFields"},{"title":"module:CollectionData.setPoster","link":"setPoster"},{"title":"module:ConfigData","link":"ConfigData"},{"title":"module:ConfigData.init","link":"init"},{"title":"module:ConfigItem","link":"ConfigItem"},{"title":"module:ConfigItem.init","link":"init"},{"title":"module:ConfigItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ConfigItem.setColors","link":"setColors"},{"title":"module:ConfigList","link":"ConfigList"},{"title":"module:ConfigList.configListShowDialog","link":"configListShowDialog"},{"title":"module:ConfigList.dismiss_dialog","link":"dismiss_dialog"},{"title":"module:ConfigList.init","link":"init"},{"title":"module:ConfigList.onDialogButton","link":"onDialogButton"},{"title":"module:ConfigList.onItemSelected","link":"onItemSelected"},{"title":"module:ConfigList.setData","link":"setData"},{"title":"module:ExtrasItem","link":"ExtrasItem"},{"title":"module:ExtrasItem.focusChanged","link":"focusChanged"},{"title":"module:ExtrasItem.init","link":"init"},{"title":"module:ExtrasItem.showContent","link":"showContent"},{"title":"module:ExtrasRowList","link":"ExtrasRowList"},{"title":"module:ExtrasRowList.addRowSize","link":"addRowSize"},{"title":"module:ExtrasRowList.buildRow","link":"buildRow"},{"title":"module:ExtrasRowList.init","link":"init"},{"title":"module:ExtrasRowList.loadParts","link":"loadParts"},{"title":"module:ExtrasRowList.loadPersonVideos","link":"loadPersonVideos"},{"title":"module:ExtrasRowList.onAdditionalPartsLoaded","link":"onAdditionalPartsLoaded"},{"title":"module:ExtrasRowList.onLikeThisLoaded","link":"onLikeThisLoaded"},{"title":"module:ExtrasRowList.onMoviesLoaded","link":"onMoviesLoaded"},{"title":"module:ExtrasRowList.onPeopleLoaded","link":"onPeopleLoaded"},{"title":"module:ExtrasRowList.onRowItemFocused","link":"onRowItemFocused"},{"title":"module:ExtrasRowList.onRowItemSelected","link":"onRowItemSelected"},{"title":"module:ExtrasRowList.onSeriesLoaded","link":"onSeriesLoaded"},{"title":"module:ExtrasRowList.onShowsLoaded","link":"onShowsLoaded"},{"title":"module:ExtrasRowList.onSpecialFeaturesLoaded","link":"onSpecialFeaturesLoaded"},{"title":"module:ExtrasRowList.updateSize","link":"updateSize"},{"title":"module:FavoriteItemsTask","link":"FavoriteItemsTask"},{"title":"module:FavoriteItemsTask.init","link":"init"},{"title":"module:FavoriteItemsTask.setFavoriteStatus","link":"setFavoriteStatus"},{"title":"module:FolderData","link":"FolderData"},{"title":"module:FolderData.setFields","link":"setFields"},{"title":"module:FolderData.setPoster","link":"setPoster"},{"title":"module:GetFiltersTask","link":"GetFiltersTask"},{"title":"module:GetFiltersTask.getFiltersTask","link":"getFiltersTask"},{"title":"module:GetFiltersTask.init","link":"init"},{"title":"module:GetNextEpisodeTask","link":"GetNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.getNextEpisodeTask","link":"getNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.init","link":"init"},{"title":"module:GetPlaybackInfoTask","link":"GetPlaybackInfoTask"},{"title":"module:GetPlaybackInfoTask.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:GetPlaybackInfoTask.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:GetPlaybackInfoTask.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:GetPlaybackInfoTask.getPlaybackInfoTask","link":"getPlaybackInfoTask","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:GetPlaybackInfoTask.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:GetPlaybackInfoTask.init","link":"init"},{"title":"module:GetShuffleEpisodesTask","link":"GetShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.getShuffleEpisodesTask","link":"getShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.init","link":"init"},{"title":"module:GridItem","link":"GridItem"},{"title":"module:GridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:GridItem.focusChanging","link":"focusChanging","description":"

Use FocusPercent to animate scaling of Poser Image

"},{"title":"module:GridItem.init","link":"init"},{"title":"module:GridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:GridItemSmall","link":"GridItemSmall"},{"title":"module:GridItemSmall.focusChanged","link":"focusChanged"},{"title":"module:GridItemSmall.init","link":"init"},{"title":"module:GridItemSmall.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItemSmall.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:Home","link":"Home"},{"title":"module:Home.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook that gets ran as needed.\nUsed to update the focus, the state of the data, and tells the server about the device profile

"},{"title":"module:Home.init","link":"init"},{"title":"module:Home.loadLibraries","link":"loadLibraries"},{"title":"module:Home.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:Home.refresh","link":"refresh"},{"title":"module:HomeData","link":"HomeData"},{"title":"module:HomeData.setData","link":"setData"},{"title":"module:HomeItem","link":"HomeItem"},{"title":"module:HomeItem.drawProgressBar","link":"drawProgressBar","description":"

Draws and animates item progress bar

"},{"title":"module:HomeItem.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:HomeItem.init","link":"init"},{"title":"module:HomeItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:HomeItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and icon when poster loaded

"},{"title":"module:HomeRows","link":"HomeRows"},{"title":"module:HomeRows.addHomeSection","link":"addHomeSection","description":"

Adds a new home section to the home rows.\nReturns a boolean indicating whether the section was handled.

"},{"title":"module:HomeRows.createContinueWatchingRow","link":"createContinueWatchingRow","description":"

Create a row displaying items the user can continue watching

"},{"title":"module:HomeRows.createFavoritesRow","link":"createFavoritesRow","description":"

Create a row displaying items from the user's favorites list

"},{"title":"module:HomeRows.createLatestInRows","link":"createLatestInRows","description":"

Create a row displaying latest items in each of the user's libraries

"},{"title":"module:HomeRows.createLibraryRow","link":"createLibraryRow","description":"

Create a row displaying the user's libraries

"},{"title":"module:HomeRows.createLiveTVRow","link":"createLiveTVRow","description":"

Create a row displaying the live tv now on section

"},{"title":"module:HomeRows.createNextUpRow","link":"createNextUpRow","description":"

Create a row displaying next episodes up to watch

"},{"title":"module:HomeRows.filterNodeArray","link":"filterNodeArray"},{"title":"module:HomeRows.init","link":"init"},{"title":"module:HomeRows.itemSelected","link":"itemSelected"},{"title":"module:HomeRows.loadLibraries","link":"loadLibraries"},{"title":"module:HomeRows.onKeyEvent","link":"onKeyEvent"},{"title":"module:HomeRows.onLibrariesLoaded","link":"onLibrariesLoaded"},{"title":"module:HomeRows.removeHomeSection","link":"removeHomeSection","description":"

Removes a home section from the home rows

"},{"title":"module:HomeRows.updateContinueWatchingItems","link":"updateContinueWatchingItems"},{"title":"module:HomeRows.updateFavoritesItems","link":"updateFavoritesItems"},{"title":"module:HomeRows.updateHomeRows","link":"updateHomeRows","description":"

Update home row data

"},{"title":"module:HomeRows.updateLatestInRows","link":"updateLatestInRows","description":"

Iterate over user's libraries and update data for each Latest In section

"},{"title":"module:HomeRows.updateLatestItems","link":"updateLatestItems"},{"title":"module:HomeRows.updateNextUpItems","link":"updateNextUpItems"},{"title":"module:HomeRows.updateOnNowItems","link":"updateOnNowItems"},{"title":"module:HomeRows.updateSize","link":"updateSize"},{"title":"module:HomeRows.updateSizeArray","link":"updateSizeArray"},{"title":"module:IconButton","link":"IconButton"},{"title":"module:IconButton.init","link":"init"},{"title":"module:IconButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:IconButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:IconButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:IconButton.onIconChanged","link":"onIconChanged"},{"title":"module:IconButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:IconButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:IconButton.onTextChanged","link":"onTextChanged"},{"title":"module:IconButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:IconButton.setIconSize","link":"setIconSize"},{"title":"module:Image","link":"Image"},{"title":"module:Image.ImageURL","link":"ImageURL"},{"title":"module:Image.ItemImages","link":"ItemImages"},{"title":"module:Image.PosterImage","link":"PosterImage"},{"title":"module:Image.UserImageURL","link":"UserImageURL"},{"title":"module:ImageData","link":"ImageData"},{"title":"module:ImageData.setFields","link":"setFields"},{"title":"module:IntegerKeyboard","link":"IntegerKeyboard"},{"title":"module:IntegerKeyboard.init","link":"init"},{"title":"module:IntegerKeyboard.keySelected","link":"keySelected"},{"title":"module:IntegerKeyboard.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid","link":"ItemGrid"},{"title":"module:ItemGrid.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:ItemGrid.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:ItemGrid.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:ItemGrid.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:ItemGrid.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:ItemGrid.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:ItemGrid.init","link":"init"},{"title":"module:ItemGrid.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:ItemGrid.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:ItemGrid.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:ItemGrid.onChannelFocused","link":"onChannelFocused"},{"title":"module:ItemGrid.onChannelSelected","link":"onChannelSelected"},{"title":"module:ItemGrid.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:ItemGrid.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:ItemGrid.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:ItemGrid.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:ItemGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:ItemGrid.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:ItemGrid.setBoxsetsOptions","link":"setBoxsetsOptions","description":"

Set Boxset view, sort, and filter options

"},{"title":"module:ItemGrid.setDefaultOptions","link":"setDefaultOptions","description":"

Set Default view, sort, and filter options

"},{"title":"module:ItemGrid.setLiveTvOptions","link":"setLiveTvOptions","description":"

Set Live TV view, sort, and filter options

"},{"title":"module:ItemGrid.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:ItemGrid.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:ItemGrid.setPhotoAlbumOptions","link":"setPhotoAlbumOptions","description":"

Set Photo Album view, sort, and filter options

"},{"title":"module:ItemGrid.setTvShowsOptions","link":"setTvShowsOptions","description":"

Set TV Show view, sort, and filter options

"},{"title":"module:ItemGrid.showTVGuide","link":"showTVGuide"},{"title":"module:ItemGrid.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:ItemGrid.updateTitle","link":"updateTitle"},{"title":"module:ItemGridOptions","link":"ItemGridOptions"},{"title":"module:ItemGridOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:ItemGridOptions.hideChecklist","link":"hideChecklist"},{"title":"module:ItemGridOptions.init","link":"init"},{"title":"module:ItemGridOptions.isFilterMenuDataValid","link":"isFilterMenuDataValid","description":"

Check if data for Filter Menu is valid

"},{"title":"module:ItemGridOptions.onFilterFocusChange","link":"onFilterFocusChange"},{"title":"module:ItemGridOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGridOptions.optionsSet","link":"optionsSet"},{"title":"module:ItemGridOptions.saveFavoriteItemSelected","link":"saveFavoriteItemSelected"},{"title":"module:ItemGridOptions.setHeartColor","link":"setHeartColor"},{"title":"module:ItemGridOptions.showChecklist","link":"showChecklist"},{"title":"module:ItemGridOptions.toggleFavorite","link":"toggleFavorite"},{"title":"module:Items","link":"Items"},{"title":"module:Items.AppearsOnList","link":"AppearsOnList","description":"

Get list of albums an artist appears on

"},{"title":"module:Items.ArtistOverview","link":"ArtistOverview","description":"

Music Artist Data

"},{"title":"module:Items.AudioItem","link":"AudioItem","description":"

Get Songs that are on an Album

"},{"title":"module:Items.AudioStream","link":"AudioStream"},{"title":"module:Items.BackdropImage","link":"BackdropImage"},{"title":"module:Items.CreateArtistMix","link":"CreateArtistMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.CreateInstantMix","link":"CreateInstantMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.GetIntroVideos","link":"GetIntroVideos","description":"

Get Intro Videos for an item

"},{"title":"module:Items.GetSongsByArtist","link":"GetSongsByArtist","description":"

Get list of songs belonging to an artist

"},{"title":"module:Items.ItemGetPlaybackInfo","link":"ItemGetPlaybackInfo"},{"title":"module:Items.ItemMetaData","link":"ItemMetaData","description":"

MetaData about an item

"},{"title":"module:Items.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:Items.MusicAlbumList","link":"MusicAlbumList","description":"

Get list of albums belonging to an artist

"},{"title":"module:Items.MusicSongList","link":"MusicSongList","description":"

Get Songs that are on an Album

"},{"title":"module:Items.PlaylistItemList","link":"PlaylistItemList","description":"

Get Items that are under the provided item

"},{"title":"module:Items.TVEpisodeShuffleList","link":"TVEpisodeShuffleList"},{"title":"module:Items.TVEpisodes","link":"TVEpisodes","description":"

Returns a list of TV Shows for a given TV Show and season\nAccepts strings for the TV Show Id and the season Id

"},{"title":"module:Items.TVSeasonExtras","link":"TVSeasonExtras","description":"

Returns a list of extra features for a TV Show season\nAccepts a string that is a TV Show season id

"},{"title":"module:Items.TVSeasons","link":"TVSeasons","description":"

Seasons for a TV Show

"},{"title":"module:Items.searchMedia","link":"searchMedia","description":"

Search across all libraries

"},{"title":"module:Items.useTranscodeAudioStream","link":"useTranscodeAudioStream"},{"title":"module:JFButton","link":"JFButton"},{"title":"module:JFButton.init","link":"init"},{"title":"module:JFButton.onTextChanged","link":"onTextChanged","description":"

Whenever the text changes, pad both sides with whitespace so we can center the button text

"},{"title":"module:JFButtons","link":"JFButtons"},{"title":"module:JFButtons.focusChanged","link":"focusChanged","description":"

Change opacity of the highlighted menu item based on focus

"},{"title":"module:JFButtons.highlightSelected","link":"highlightSelected","description":"

Highlight selected menu option

"},{"title":"module:JFButtons.init","link":"init"},{"title":"module:JFButtons.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFButtons.renderChanged","link":"renderChanged","description":"

When options are fully displayed, set focus and selected option

"},{"title":"module:JFButtons.selectedIndexChanged","link":"selectedIndexChanged","description":"

When Selected Index set, ensure it is the one Focused

"},{"title":"module:JFButtons.showButtons","link":"showButtons"},{"title":"module:JFButtons.updateButtons","link":"updateButtons"},{"title":"module:JFGroup","link":"JFGroup"},{"title":"module:JFGroup.init","link":"init"},{"title":"module:JFGroup.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog","link":"JFMessageDialog"},{"title":"module:JFMessageDialog.init","link":"init"},{"title":"module:JFMessageDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog.redraw","link":"redraw"},{"title":"module:JFMessageDialog.updateMessage","link":"updateMessage"},{"title":"module:JFMessageDialog.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang","link":"JFOverhang"},{"title":"module:JFOverhang.init","link":"init"},{"title":"module:JFOverhang.onVisibleChange","link":"onVisibleChange"},{"title":"module:JFOverhang.resetTime","link":"resetTime"},{"title":"module:JFOverhang.setClockVisibility","link":"setClockVisibility"},{"title":"module:JFOverhang.setRightSeperatorVisibility","link":"setRightSeperatorVisibility"},{"title":"module:JFOverhang.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang.updateTime","link":"updateTime"},{"title":"module:JFOverhang.updateTimeDisplay","link":"updateTimeDisplay"},{"title":"module:JFOverhang.updateTitle","link":"updateTitle"},{"title":"module:JFOverhang.updateUser","link":"updateUser"},{"title":"module:JFScene","link":"JFScene"},{"title":"module:JFScene.init","link":"init"},{"title":"module:JFScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFScreen","link":"JFScreen"},{"title":"module:JFScreen.OnScreenHidden","link":"OnScreenHidden","description":"

Function called when the screen is hidden by the screen manager\nIt is expected that screens override this function if required,\nto handle focus any actions required on the screen being hidden

"},{"title":"module:JFScreen.OnScreenShown","link":"OnScreenShown","description":"

Function called when the screen is displayed by the screen manager\nIt is expected that screens override this function to handle focus\nmanagmenet and any other actions required on screen shown

"},{"title":"module:JFScreen.init","link":"init"},{"title":"module:JFServer","link":"JFServer"},{"title":"module:JFServer.init","link":"init"},{"title":"module:JFServer.itemContentChanged","link":"itemContentChanged"},{"title":"module:JFServer.onFocusPercentChange","link":"onFocusPercentChange"},{"title":"module:JFServer.setTextColor","link":"setTextColor"},{"title":"module:JFVideo","link":"JFVideo"},{"title":"module:JFVideo.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:JFVideo.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:JFVideo.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:JFVideo.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:JFVideo.init","link":"init"},{"title":"module:JFVideo.loadCaption","link":"loadCaption"},{"title":"module:JFVideo.onAllowCaptionsChange","link":"onAllowCaptionsChange"},{"title":"module:JFVideo.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:JFVideo.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFVideo.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:JFVideo.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:JFVideo.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:JFVideo.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:JFVideo.toggleCaption","link":"toggleCaption"},{"title":"module:JFVideo.updateCaption","link":"updateCaption"},{"title":"module:JFVideo.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:ListPoster","link":"ListPoster"},{"title":"module:ListPoster.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:ListPoster.init","link":"init"},{"title":"module:ListPoster.itemContentChanged","link":"itemContentChanged"},{"title":"module:ListPoster.updateSize","link":"updateSize"},{"title":"module:LoadChannelsTask","link":"LoadChannelsTask"},{"title":"module:LoadChannelsTask.init","link":"init"},{"title":"module:LoadChannelsTask.loadChannels","link":"loadChannels"},{"title":"module:LoadItemsTask","link":"LoadItemsTask"},{"title":"module:LoadItemsTask.getPersonVideos","link":"getPersonVideos"},{"title":"module:LoadItemsTask.init","link":"init"},{"title":"module:LoadItemsTask.loadItems","link":"loadItems"},{"title":"module:LoadItemsTask2","link":"LoadItemsTask2"},{"title":"module:LoadItemsTask2.init","link":"init"},{"title":"module:LoadItemsTask2.loadItems","link":"loadItems"},{"title":"module:LoadPhotoTask","link":"LoadPhotoTask"},{"title":"module:LoadPhotoTask.init","link":"init"},{"title":"module:LoadPhotoTask.loadItems","link":"loadItems"},{"title":"module:LoadProgramDetailsTask","link":"LoadProgramDetailsTask"},{"title":"module:LoadProgramDetailsTask.init","link":"init"},{"title":"module:LoadProgramDetailsTask.loadProgramDetails","link":"loadProgramDetails"},{"title":"module:LoadScreenSaverTimeoutTask","link":"LoadScreenSaverTimeoutTask"},{"title":"module:LoadScreenSaverTimeoutTask.getScreensaverTimeout","link":"getScreensaverTimeout"},{"title":"module:LoadScreenSaverTimeoutTask.init","link":"init"},{"title":"module:LoadSheduleTask","link":"LoadSheduleTask"},{"title":"module:LoadSheduleTask.init","link":"init"},{"title":"module:LoadSheduleTask.loadSchedule","link":"loadSchedule"},{"title":"module:LoadVideoContentTask","link":"LoadVideoContentTask"},{"title":"module:LoadVideoContentTask.FindPreferredAudioStream","link":"FindPreferredAudioStream"},{"title":"module:LoadVideoContentTask.LoadItems_AddVideoContent","link":"LoadItems_AddVideoContent"},{"title":"module:LoadVideoContentTask.LoadItems_VideoPlayer","link":"LoadItems_VideoPlayer"},{"title":"module:LoadVideoContentTask.addNextEpisodesToQueue","link":"addNextEpisodesToQueue","description":"

Add next episodes to the playback queue

"},{"title":"module:LoadVideoContentTask.addSubtitlesToVideo","link":"addSubtitlesToVideo"},{"title":"module:LoadVideoContentTask.addVideoContentURL","link":"addVideoContentURL"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"title":"module:LoadVideoContentTask.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:LoadVideoContentTask.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:LoadVideoContentTask.init","link":"init"},{"title":"module:LoadVideoContentTask.loadItems","link":"loadItems"},{"title":"module:LoadVideoContentTask.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:LoginScene","link":"LoginScene"},{"title":"module:LoginScene.init","link":"init"},{"title":"module:LoginScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:Main","link":"Main"},{"title":"module:Main.Main","link":"Main"},{"title":"module:MovieData","link":"MovieData"},{"title":"module:MovieData.setContainer","link":"setContainer"},{"title":"module:MovieData.setFields","link":"setFields"},{"title":"module:MovieData.setPoster","link":"setPoster"},{"title":"module:MovieDetails","link":"MovieDetails"},{"title":"module:MovieDetails.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieDetails.SetDefaultAudioTrack","link":"SetDefaultAudioTrack"},{"title":"module:MovieDetails.SetUpAudioOptions","link":"SetUpAudioOptions"},{"title":"module:MovieDetails.SetUpVideoOptions","link":"SetUpVideoOptions"},{"title":"module:MovieDetails.audioOptionsClosed","link":"audioOptionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieDetails.getEndTime","link":"getEndTime"},{"title":"module:MovieDetails.getRuntime","link":"getRuntime"},{"title":"module:MovieDetails.init","link":"init"},{"title":"module:MovieDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:MovieDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieDetails.round","link":"round"},{"title":"module:MovieDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:MovieDetails.setFieldText","link":"setFieldText"},{"title":"module:MovieDetails.setWatchedColor","link":"setWatchedColor"},{"title":"module:MovieDetails.trailerAvailableChanged","link":"trailerAvailableChanged"},{"title":"module:MovieDetails.videoOptionsClosed","link":"videoOptionsClosed","description":"

Check if options were updated and if any reloding is needed...

"},{"title":"module:MovieLibraryView","link":"MovieLibraryView"},{"title":"module:MovieLibraryView.FilterDataLoaded","link":"FilterDataLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MovieLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MovieLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MovieLibraryView.SetName","link":"SetName","description":"

Set Selected Movie Name

"},{"title":"module:MovieLibraryView.SetOfficialRating","link":"SetOfficialRating","description":"

Set Selected Movie OfficialRating

"},{"title":"module:MovieLibraryView.SetOverview","link":"SetOverview","description":"

Set Selected Movie Overview

"},{"title":"module:MovieLibraryView.SetProductionYear","link":"SetProductionYear","description":"

Set Selected Movie ProductionYear

"},{"title":"module:MovieLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MovieLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MovieLibraryView.getRuntime","link":"getRuntime"},{"title":"module:MovieLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MovieLibraryView.init","link":"init"},{"title":"module:MovieLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MovieLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MovieLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MovieLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MovieLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MovieLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MovieLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MovieLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MovieLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MovieLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieLibraryView.round","link":"round"},{"title":"module:MovieLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MovieLibraryView.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:MovieLibraryView.setSelectedOptions","link":"setSelectedOptions","description":"

Data to display when options button selected

"},{"title":"module:MovieLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MovieLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MovieOptions","link":"MovieOptions"},{"title":"module:MovieOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:MovieOptions.init","link":"init"},{"title":"module:MovieOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieOptions.optionsSet","link":"optionsSet"},{"title":"module:MusicAlbumData","link":"MusicAlbumData"},{"title":"module:MusicAlbumData.setFields","link":"setFields"},{"title":"module:MusicAlbumData.setPoster","link":"setPoster"},{"title":"module:MusicAlbumSongListData","link":"MusicAlbumSongListData"},{"title":"module:MusicAlbumSongListData.setFields","link":"setFields"},{"title":"module:MusicAlbumSongListData.setPoster","link":"setPoster"},{"title":"module:MusicArtistData","link":"MusicArtistData"},{"title":"module:MusicArtistData.setFields","link":"setFields"},{"title":"module:MusicArtistData.setPoster","link":"setPoster"},{"title":"module:MusicArtistGridItem","link":"MusicArtistGridItem"},{"title":"module:MusicArtistGridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:MusicArtistGridItem.init","link":"init"},{"title":"module:MusicArtistGridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:MusicArtistGridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:MusicLibraryView","link":"MusicLibraryView"},{"title":"module:MusicLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MusicLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MusicLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MusicLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MusicLibraryView.SetAlbumCount","link":"SetAlbumCount","description":"

Set Selected Artist Album Count

"},{"title":"module:MusicLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MusicLibraryView.SetGenres","link":"SetGenres","description":"

Set Selected Artist Genres

"},{"title":"module:MusicLibraryView.SetName","link":"SetName","description":"

Set Selected Artist Name

"},{"title":"module:MusicLibraryView.SetSongCount","link":"SetSongCount","description":"

Set Selected Artist Song Count

"},{"title":"module:MusicLibraryView.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:MusicLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MusicLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MusicLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MusicLibraryView.init","link":"init"},{"title":"module:MusicLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MusicLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MusicLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MusicLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MusicLibraryView.onGenreItemFocused","link":"onGenreItemFocused","description":"

Genre Item Focused

"},{"title":"module:MusicLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MusicLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MusicLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MusicLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MusicLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MusicLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MusicLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MusicLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MusicLibraryView.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:MusicLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MusicLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MusicSongData","link":"MusicSongData"},{"title":"module:MusicSongData.setFields","link":"setFields"},{"title":"module:MusicSongData.setPoster","link":"setPoster"},{"title":"module:OSD","link":"OSD"},{"title":"module:OSD.inactiveCheck","link":"inactiveCheck","description":"

inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.

"},{"title":"module:OSD.init","link":"init"},{"title":"module:OSD.onButtonSelected","link":"onButtonSelected","description":"

onButtonSelected: Handler for selection of buttons from the menu.

"},{"title":"module:OSD.onFocusChanged","link":"onFocusChanged","description":"

onFocusChanged: Handler for changes to the focus of this menu.

"},{"title":"module:OSD.onItemTitleTextChanged","link":"onItemTitleTextChanged","description":"

onItemTitleTextChanged: Handler for changes to m.top.itemTitleText param.

"},{"title":"module:OSD.onKeyEvent","link":"onKeyEvent"},{"title":"module:OSD.onPlaybackStateChanged","link":"onPlaybackStateChanged","description":"

onPlaybackStateChanged: Handler for changes to m.top.playbackState param

"},{"title":"module:OSD.onProgressPercentageChanged","link":"onProgressPercentageChanged","description":"

onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param

"},{"title":"module:OSD.onVisibleChanged","link":"onVisibleChanged","description":"

onVisibleChanged: Handler for changes to the visibility of this menu.

"},{"title":"module:OSD.resetFocusToDefaultButton","link":"resetFocusToDefaultButton","description":"

resetFocusToDefaultButton: Reset focus back to the default button

"},{"title":"module:OptionNode","link":"OptionNode"},{"title":"module:OptionNode.init","link":"init"},{"title":"module:OptionsButton","link":"OptionsButton"},{"title":"module:OptionsButton.init","link":"init"},{"title":"module:OptionsButton.press","link":"press"},{"title":"module:OptionsData","link":"OptionsData"},{"title":"module:OptionsData.init","link":"init"},{"title":"module:OptionsData.press","link":"press"},{"title":"module:OptionsData.update_title","link":"update_title"},{"title":"module:OptionsSlider","link":"OptionsSlider"},{"title":"module:OptionsSlider.init","link":"init"},{"title":"module:OptionsSlider.onKeyEvent","link":"onKeyEvent"},{"title":"module:OptionsSlider.setFields","link":"setFields"},{"title":"module:OverviewDialog","link":"OverviewDialog"},{"title":"module:OverviewDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:OverviewDialog.setOverview","link":"setOverview"},{"title":"module:OverviewDialog.setTitle","link":"setTitle"},{"title":"module:PersonData","link":"PersonData"},{"title":"module:PersonData.setFields","link":"setFields"},{"title":"module:PersonData.setPoster","link":"setPoster"},{"title":"module:PersonDetails","link":"PersonDetails"},{"title":"module:PersonDetails.createDialogPallete","link":"createDialogPallete"},{"title":"module:PersonDetails.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PersonDetails.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:PersonDetails.init","link":"init"},{"title":"module:PersonDetails.loadPerson","link":"loadPerson"},{"title":"module:PersonDetails.onButtonGroupEscaped","link":"onButtonGroupEscaped"},{"title":"module:PersonDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PersonDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:PersonDetails.shortDate","link":"shortDate"},{"title":"module:PhotoData","link":"PhotoData"},{"title":"module:PhotoData.setFields","link":"setFields"},{"title":"module:PhotoData.setPoster","link":"setPoster"},{"title":"module:PhotoDetails","link":"PhotoDetails"},{"title":"module:PhotoDetails.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook.\nUsed to ensure tasks are stopped

"},{"title":"module:PhotoDetails.init","link":"init"},{"title":"module:PhotoDetails.isRandomChanged","link":"isRandomChanged","description":"

isRandom component field has changed

"},{"title":"module:PhotoDetails.isSlideshowChanged","link":"isSlideshowChanged","description":"

isSlideshow component field has changed

"},{"title":"module:PhotoDetails.isValidToContinue","link":"isValidToContinue"},{"title":"module:PhotoDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:PhotoDetails.nextSlide","link":"nextSlide"},{"title":"module:PhotoDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PhotoDetails.onPhotoLoaded","link":"onPhotoLoaded"},{"title":"module:PhotoDetails.statusUpdate","link":"statusUpdate"},{"title":"module:PlaybackDialog","link":"PlaybackDialog"},{"title":"module:PlaybackDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlayedCheckmark","link":"PlayedCheckmark"},{"title":"module:PlayedCheckmark.init","link":"init"},{"title":"module:PlaylistData","link":"PlaylistData"},{"title":"module:PlaylistData.setFields","link":"setFields"},{"title":"module:PlaylistData.setPoster","link":"setPoster"},{"title":"module:PlaylistView","link":"PlaylistView"},{"title":"module:PlaylistView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:PlaylistView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:PlaylistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:PlaylistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PlaylistView.init","link":"init"},{"title":"module:PlaylistView.onDoneLoading","link":"onDoneLoading"},{"title":"module:PlaylistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlaylistView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:PlaylistView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:PlaylistView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:PlaylistView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:PlaylistView.setupMainNode","link":"setupMainNode"},{"title":"module:PlaystateTask","link":"PlaystateTask"},{"title":"module:PlaystateTask.PlaystateDefaults","link":"PlaystateDefaults"},{"title":"module:PlaystateTask.PlaystateUpdate","link":"PlaystateUpdate"},{"title":"module:PlaystateTask.init","link":"init"},{"title":"module:PostTask","link":"PostTask"},{"title":"module:PostTask.asyncPost","link":"asyncPost","description":"

Post data and wait for response code

"},{"title":"module:PostTask.empty","link":"empty","description":"

Revert PostTask to default state

"},{"title":"module:PostTask.init","link":"init"},{"title":"module:PostTask.postItems","link":"postItems","description":"

Main function for PostTask.\nPosts either an array of data\nor a string of data to an API endpoint.\nSaves the response information

"},{"title":"module:ProgramDetails","link":"ProgramDetails"},{"title":"module:ProgramDetails.channelUpdated","link":"channelUpdated"},{"title":"module:ProgramDetails.focusChanged","link":"focusChanged","description":"

Show view channel button when item has Focus

"},{"title":"module:ProgramDetails.getDurationStringFromSeconds","link":"getDurationStringFromSeconds","description":"

Get program duration string (e.g. 1h 20m)

"},{"title":"module:ProgramDetails.getRelativeDayName","link":"getRelativeDayName","description":"

Get relative date name for a date (yesterday, today, tomorrow, or otherwise weekday name )

"},{"title":"module:ProgramDetails.init","link":"init"},{"title":"module:ProgramDetails.onAnimationComplete","link":"onAnimationComplete"},{"title":"module:ProgramDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:ProgramDetails.programUpdated","link":"programUpdated"},{"title":"module:ProgramDetails.setupLabels","link":"setupLabels","description":"

Set up Live and Repeat label sizes

"},{"title":"module:ProgramDetails.updateLabels","link":"updateLabels"},{"title":"module:PublicUserData","link":"PublicUserData"},{"title":"module:PublicUserData.init","link":"init"},{"title":"module:QueueManager","link":"QueueManager"},{"title":"module:QueueManager.clear","link":"clear","description":"

Clear all content from play queue

"},{"title":"module:QueueManager.clearHold","link":"clearHold","description":"

Clear all hold content

"},{"title":"module:QueueManager.deleteAtIndex","link":"deleteAtIndex","description":"

Delete item from play queue at passed index

"},{"title":"module:QueueManager.getCount","link":"getCount","description":"

Return the number of items in the play queue

"},{"title":"module:QueueManager.getCurrentItem","link":"getCurrentItem","description":"

Return the item currently in focus from the play queue

"},{"title":"module:QueueManager.getHold","link":"getHold","description":"

Return the items in the hold

"},{"title":"module:QueueManager.getIsShuffled","link":"getIsShuffled","description":"

Return whether or not shuffle is enabled

"},{"title":"module:QueueManager.getItemByIndex","link":"getItemByIndex","description":"

Return the item in the passed index from the play queue

"},{"title":"module:QueueManager.getItemType","link":"getItemType"},{"title":"module:QueueManager.getPosition","link":"getPosition","description":"

Returns current playback position within the queue

"},{"title":"module:QueueManager.getQueue","link":"getQueue","description":"

Return the current play queue

"},{"title":"module:QueueManager.getQueueTypes","link":"getQueueTypes","description":"

Return the types of items in current play queue

"},{"title":"module:QueueManager.getQueueUniqueTypes","link":"getQueueUniqueTypes","description":"

Return the unique types of items in current play queue

"},{"title":"module:QueueManager.getUnshuffledQueue","link":"getUnshuffledQueue","description":"

Return original, unshuffled queue

"},{"title":"module:QueueManager.hold","link":"hold","description":"

Hold an item

"},{"title":"module:QueueManager.init","link":"init"},{"title":"module:QueueManager.isPrerollActive","link":"isPrerollActive","description":"

Return isPrerollActive status

"},{"title":"module:QueueManager.moveBack","link":"moveBack","description":"

Move queue position back one

"},{"title":"module:QueueManager.moveForward","link":"moveForward","description":"

Move queue position ahead one

"},{"title":"module:QueueManager.peek","link":"peek","description":"

Return item at end of play queue without removing

"},{"title":"module:QueueManager.playQueue","link":"playQueue","description":"

Play items in queue

"},{"title":"module:QueueManager.pop","link":"pop","description":"

Remove item at end of play queue

"},{"title":"module:QueueManager.push","link":"push","description":"

Push new items to the play queue

"},{"title":"module:QueueManager.resetQueueItemOrder","link":"resetQueueItemOrder","description":"

Reset queue items back to original, unshuffled order

"},{"title":"module:QueueManager.resetShuffle","link":"resetShuffle","description":"

Reset shuffle to off state

"},{"title":"module:QueueManager.set","link":"set","description":"

Replace play queue with passed array

"},{"title":"module:QueueManager.setPosition","link":"setPosition","description":"

Set the queue position

"},{"title":"module:QueueManager.setPrerollStatus","link":"setPrerollStatus","description":"

Set prerollActive status

"},{"title":"module:QueueManager.setTopStartingPoint","link":"setTopStartingPoint","description":"

Set starting point for top item in the queue

"},{"title":"module:QueueManager.shuffleQueueItems","link":"shuffleQueueItems","description":"

Save a copy of the original queue and randomize order of queue items

"},{"title":"module:QueueManager.toggleShuffle","link":"toggleShuffle","description":"

Toggle shuffleEnabled state

"},{"title":"module:QueueManager.top","link":"top","description":"

Return the fitst item in the play queue

"},{"title":"module:QuickConnect","link":"QuickConnect"},{"title":"module:QuickConnect.init","link":"init"},{"title":"module:QuickConnect.monitorQuickConnect","link":"monitorQuickConnect"},{"title":"module:QuickConnectDialog","link":"QuickConnectDialog"},{"title":"module:QuickConnectDialog.OnAuthenticated","link":"OnAuthenticated"},{"title":"module:QuickConnectDialog.init","link":"init"},{"title":"module:QuickConnectDialog.onButtonSelected","link":"onButtonSelected"},{"title":"module:QuickConnectDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:QuickConnectDialog.quickConnectClosed","link":"quickConnectClosed"},{"title":"module:QuickConnectDialog.quickConnectStatus","link":"quickConnectStatus"},{"title":"module:RadioDialog","link":"RadioDialog"},{"title":"module:RadioDialog.init","link":"init"},{"title":"module:RadioDialog.moveScrollBar","link":"moveScrollBar","description":"

Move the popup's scroll bar

"},{"title":"module:RadioDialog.onButtonSelected","link":"onButtonSelected","description":"

Event handler for when user selected a button

"},{"title":"module:RadioDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:RadioDialog.onItemFocused","link":"onItemFocused","description":"

Event handler for when user's cursor highlights an option in the option list

"},{"title":"module:RadioDialog.onItemSelected","link":"onItemSelected","description":"

Once user selected an item, move cursor down to OK button

"},{"title":"module:RadioDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:RadioDialog.onScrollBarFocus","link":"onScrollBarFocus","description":"

If somehow the scrollbar gains focus, set focus back to the option list

"},{"title":"module:RecordProgramTask","link":"RecordProgramTask"},{"title":"module:RecordProgramTask.RecordOrCancelProgram","link":"RecordOrCancelProgram"},{"title":"module:RecordProgramTask.init","link":"init"},{"title":"module:SceneManager","link":"SceneManager"},{"title":"module:SceneManager.clearPreviousScene","link":"clearPreviousScene","description":"

Clear previous scene from group stack

"},{"title":"module:SceneManager.clearScenes","link":"clearScenes","description":"

Clear all content from group stack

"},{"title":"module:SceneManager.deleteSceneAtIndex","link":"deleteSceneAtIndex","description":"

Delete scene from group stack at passed index

"},{"title":"module:SceneManager.dismissDialog","link":"dismissDialog","description":"

Close currently displayed dialog

"},{"title":"module:SceneManager.getActiveScene","link":"getActiveScene","description":"

Return group at top of stack without removing

"},{"title":"module:SceneManager.init","link":"init"},{"title":"module:SceneManager.isDialogOpen","link":"isDialogOpen","description":"

Returns bool indicating if dialog is currently displayed

"},{"title":"module:SceneManager.optionClosed","link":"optionClosed","description":"

Return button the user selected

"},{"title":"module:SceneManager.optionDialog","link":"optionDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.optionSelected","link":"optionSelected","description":"

Return button the user selected

"},{"title":"module:SceneManager.popScene","link":"popScene","description":"

Remove the current group and load the last group from the stack

"},{"title":"module:SceneManager.pushScene","link":"pushScene","description":"

Push a new group onto the stack, replacing the existing group on the screen

"},{"title":"module:SceneManager.radioDialog","link":"radioDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.registerOverhangData","link":"registerOverhangData","description":"

Register observers for overhang data

"},{"title":"module:SceneManager.resetTime","link":"resetTime","description":"

Reset time

"},{"title":"module:SceneManager.settings","link":"settings","description":"

Display user/device settings screen

"},{"title":"module:SceneManager.standardDialog","link":"standardDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.unregisterOverhangData","link":"unregisterOverhangData","description":"

Remove observers for overhang data

"},{"title":"module:SceneManager.updateOptions","link":"updateOptions","description":"

Update options availability

"},{"title":"module:SceneManager.updateOverhangTitle","link":"updateOverhangTitle","description":"

Update overhang title

"},{"title":"module:SceneManager.updateOverhangVisible","link":"updateOverhangVisible","description":"

Update whether the overhang is visible or not

"},{"title":"module:SceneManager.updateUser","link":"updateUser","description":"

Update username in overhang

"},{"title":"module:SceneManager.userMessage","link":"userMessage","description":"

Display dialog to user with an OK button

"},{"title":"module:ScheduleProgramData","link":"ScheduleProgramData"},{"title":"module:ScheduleProgramData.setFields","link":"setFields"},{"title":"module:ScheduleProgramData.setPoster","link":"setPoster"},{"title":"module:SearchBox","link":"SearchBox"},{"title":"module:SearchBox.init","link":"init"},{"title":"module:SearchBox.searchMedias","link":"searchMedias"},{"title":"module:SearchData","link":"SearchData"},{"title":"module:SearchData.setFields","link":"setFields"},{"title":"module:SearchData.setPoster","link":"setPoster"},{"title":"module:SearchResults","link":"SearchResults"},{"title":"module:SearchResults.init","link":"init"},{"title":"module:SearchResults.loadResults","link":"loadResults"},{"title":"module:SearchResults.onKeyEvent","link":"onKeyEvent"},{"title":"module:SearchResults.searchMedias","link":"searchMedias"},{"title":"module:SearchRow","link":"SearchRow"},{"title":"module:SearchRow.addRow","link":"addRow"},{"title":"module:SearchRow.getData","link":"getData"},{"title":"module:SearchRow.init","link":"init"},{"title":"module:SearchRow.updateSize","link":"updateSize"},{"title":"module:SearchTask","link":"SearchTask"},{"title":"module:SearchTask.init","link":"init"},{"title":"module:SearchTask.search","link":"search"},{"title":"module:SeriesData","link":"SeriesData"},{"title":"module:SeriesData.setFields","link":"setFields"},{"title":"module:SeriesData.setPoster","link":"setPoster"},{"title":"module:ServerDiscoveryTask","link":"ServerDiscoveryTask"},{"title":"module:ServerDiscoveryTask.AddServer","link":"AddServer"},{"title":"module:ServerDiscoveryTask.ProcessClientDiscoveryResponse","link":"ProcessClientDiscoveryResponse"},{"title":"module:ServerDiscoveryTask.ProcessSSDPResponse","link":"ProcessSSDPResponse"},{"title":"module:ServerDiscoveryTask.SendClientDiscoveryBroadcast","link":"SendClientDiscoveryBroadcast"},{"title":"module:ServerDiscoveryTask.SendSSDPBroadcast","link":"SendSSDPBroadcast"},{"title":"module:ServerDiscoveryTask.execute","link":"execute"},{"title":"module:ServerDiscoveryTask.init","link":"init","description":"

Task used to discover jellyfin servers on the local network

"},{"title":"module:SetServerScreen","link":"SetServerScreen"},{"title":"module:SetServerScreen.ScanForServers","link":"ScanForServers"},{"title":"module:SetServerScreen.ScanForServersComplete","link":"ScanForServersComplete"},{"title":"module:SetServerScreen.ShowKeyboard","link":"ShowKeyboard"},{"title":"module:SetServerScreen.clearErrorMessage","link":"clearErrorMessage"},{"title":"module:SetServerScreen.init","link":"init"},{"title":"module:SetServerScreen.onDialogButton","link":"onDialogButton"},{"title":"module:SetServerScreen.onKeyEvent","link":"onKeyEvent"},{"title":"module:ShowScenes","link":"ShowScenes"},{"title":"module:ShowScenes.CreateAlbumView","link":"CreateAlbumView","description":"

Shows details on selected album. Description text, image, and list of available songs

"},{"title":"module:ShowScenes.CreateArtistView","link":"CreateArtistView","description":"

Shows details on selected artist. Bio, image, and list of available albums

"},{"title":"module:ShowScenes.CreateHomeGroup","link":"CreateHomeGroup"},{"title":"module:ShowScenes.CreateItemGrid","link":"CreateItemGrid"},{"title":"module:ShowScenes.CreateMovieDetailsGroup","link":"CreateMovieDetailsGroup"},{"title":"module:ShowScenes.CreateMovieLibraryView","link":"CreateMovieLibraryView"},{"title":"module:ShowScenes.CreateMusicLibraryView","link":"CreateMusicLibraryView"},{"title":"module:ShowScenes.CreatePersonView","link":"CreatePersonView"},{"title":"module:ShowScenes.CreatePlaylistView","link":"CreatePlaylistView","description":"

Shows details on selected playlist. Description text, image, and list of available items

"},{"title":"module:ShowScenes.CreateSearchPage","link":"CreateSearchPage"},{"title":"module:ShowScenes.CreateSeasonDetailsGroup","link":"CreateSeasonDetailsGroup"},{"title":"module:ShowScenes.CreateSeasonDetailsGroupByID","link":"CreateSeasonDetailsGroupByID"},{"title":"module:ShowScenes.CreateSeriesDetailsGroup","link":"CreateSeriesDetailsGroup"},{"title":"module:ShowScenes.CreateServerGroup","link":"CreateServerGroup"},{"title":"module:ShowScenes.CreateSigninGroup","link":"CreateSigninGroup"},{"title":"module:ShowScenes.CreateUserSelectGroup","link":"CreateUserSelectGroup"},{"title":"module:ShowScenes.CreateVideoPlayerGroup","link":"CreateVideoPlayerGroup"},{"title":"module:ShowScenes.DeleteFromServerList","link":"DeleteFromServerList"},{"title":"module:ShowScenes.LoginFlow","link":"LoginFlow"},{"title":"module:ShowScenes.SaveServerList","link":"SaveServerList"},{"title":"module:ShowScenes.SendPerformanceBeacon","link":"SendPerformanceBeacon","description":"

Roku Performance monitoring

"},{"title":"module:ShowScenes.playbackOptionDialog","link":"playbackOptionDialog","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:SlideOutButton","link":"SlideOutButton"},{"title":"module:SlideOutButton.init","link":"init"},{"title":"module:SlideOutButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:SlideOutButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:SlideOutButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:SlideOutButton.onHighlightChanged","link":"onHighlightChanged"},{"title":"module:SlideOutButton.onIconChanged","link":"onIconChanged"},{"title":"module:SlideOutButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:SlideOutButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:SlideOutButton.onTextChanged","link":"onTextChanged"},{"title":"module:SlideOutButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:SlideOutButton.setIconSize","link":"setIconSize"},{"title":"module:SongItem","link":"SongItem"},{"title":"module:SongItem.focusChanged","link":"focusChanged"},{"title":"module:SongItem.init","link":"init"},{"title":"module:SongItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:Spinner","link":"Spinner"},{"title":"module:Spinner.init","link":"init"},{"title":"module:StandardDialog","link":"StandardDialog"},{"title":"module:StandardDialog.init","link":"init"},{"title":"module:StandardDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:Subtitles","link":"Subtitles"},{"title":"module:Subtitles.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:Subtitles.changeSubtitleDuringPlayback","link":"changeSubtitleDuringPlayback"},{"title":"module:Subtitles.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

Identify the default subtitle track\nif "requires_text" is true, only return a track if it is textual\nThis allows forcing text subs, since roku requires transcoding of non-text subs\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.defaultSubtitleTrackFromVid","link":"defaultSubtitleTrackFromVid","description":"

Identify the default subtitle track for a given video id\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:Subtitles.getSubtitleSelIdxFromSubIdx","link":"getSubtitleSelIdxFromSubIdx","description":"

The subtitle index on the server differs from the index we track locally\nThis function converts the former into the latter

"},{"title":"module:Subtitles.selectSubtitleTrack","link":"selectSubtitleTrack"},{"title":"module:Subtitles.selectSubtitleTrackDialog","link":"selectSubtitleTrackDialog","description":"

Present Dialog to user to select subtitle track

"},{"title":"module:Subtitles.setupSubtitle","link":"setupSubtitle","description":"

Given a set of subtitles, and a subtitle index (the index on the server, not in the list provided)\nthis will set all relevant settings for roku (mainly closed captions) and return the index of the\nsubtitle track specified, but indexed based on the provided list of subtitles

"},{"title":"module:Subtitles.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:Subtitles.turnoffSubtitles","link":"turnoffSubtitles"},{"title":"module:TVEpisode","link":"TVEpisode"},{"title":"module:TVEpisode.setFields","link":"setFields"},{"title":"module:TVEpisode.setPoster","link":"setPoster"},{"title":"module:TVEpisodeData","link":"TVEpisodeData"},{"title":"module:TVEpisodeData.setFields","link":"setFields"},{"title":"module:TVEpisodeData.setPoster","link":"setPoster"},{"title":"module:TVEpisodeRow","link":"TVEpisodeRow"},{"title":"module:TVEpisodeRow.init","link":"init"},{"title":"module:TVEpisodeRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRow.setData","link":"setData"},{"title":"module:TVEpisodeRow.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRow.updateSize","link":"updateSize"},{"title":"module:TVEpisodeRowWithOptions","link":"TVEpisodeRowWithOptions"},{"title":"module:TVEpisodeRowWithOptions.SetUpAudioOptions","link":"SetUpAudioOptions","description":"

List of audio tracks to choose from

"},{"title":"module:TVEpisodeRowWithOptions.SetUpVideoOptions","link":"SetUpVideoOptions","description":"

List of video versions to choose from

"},{"title":"module:TVEpisodeRowWithOptions.audioOptionsClosed","link":"audioOptionsClosed"},{"title":"module:TVEpisodeRowWithOptions.init","link":"init"},{"title":"module:TVEpisodeRowWithOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRowWithOptions.rowsDoneLoading","link":"rowsDoneLoading"},{"title":"module:TVEpisodeRowWithOptions.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRowWithOptions.videoOptionsClosed","link":"videoOptionsClosed"},{"title":"module:TVEpisodes","link":"TVEpisodes"},{"title":"module:TVEpisodes.getFocusedItem","link":"getFocusedItem","description":"

get the currently focused item

"},{"title":"module:TVEpisodes.init","link":"init"},{"title":"module:TVEpisodes.onKeyEvent","link":"onKeyEvent","description":"

Handle navigation input from the remote and act on it

"},{"title":"module:TVEpisodes.setExtraButtonVisibility","link":"setExtraButtonVisibility","description":"

Updates the visibility of the Extras button based on if this season has any extra features

"},{"title":"module:TVEpisodes.setSeasonLoading","link":"setSeasonLoading"},{"title":"module:TVEpisodes.updateSeason","link":"updateSeason"},{"title":"module:TVListDetails","link":"TVListDetails"},{"title":"module:TVListDetails.DisplayAudioAvailable","link":"DisplayAudioAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one audio track to choose from

"},{"title":"module:TVListDetails.DisplayVideoAvailable","link":"DisplayVideoAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one video version to choose from

"},{"title":"module:TVListDetails.SetupAudioDisplay","link":"SetupAudioDisplay","description":"

Display current audio_codec and check if there is more than one audio track to choose from...

"},{"title":"module:TVListDetails.focusChanged","link":"focusChanged"},{"title":"module:TVListDetails.getEndTime","link":"getEndTime"},{"title":"module:TVListDetails.getRuntime","link":"getRuntime"},{"title":"module:TVListDetails.init","link":"init"},{"title":"module:TVListDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVListOptions","link":"TVListOptions"},{"title":"module:TVListOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:TVListOptions.init","link":"init"},{"title":"module:TVListOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVListOptions.optionsSet","link":"optionsSet"},{"title":"module:TVSeasonData","link":"TVSeasonData"},{"title":"module:TVSeasonData.setFields","link":"setFields"},{"title":"module:TVSeasonData.setPoster","link":"setPoster"},{"title":"module:TVSeasonRow","link":"TVSeasonRow"},{"title":"module:TVSeasonRow.getData","link":"getData"},{"title":"module:TVSeasonRow.init","link":"init"},{"title":"module:TVSeasonRow.updateSize","link":"updateSize"},{"title":"module:TVShowDescription","link":"TVShowDescription"},{"title":"module:TVShowDescription.getEndTime","link":"getEndTime"},{"title":"module:TVShowDescription.getHistory","link":"getHistory"},{"title":"module:TVShowDescription.getRuntime","link":"getRuntime"},{"title":"module:TVShowDescription.init","link":"init"},{"title":"module:TVShowDescription.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDescription.round","link":"round"},{"title":"module:TVShowDescription.setFieldText","link":"setFieldText"},{"title":"module:TVShowDetails","link":"TVShowDetails"},{"title":"module:TVShowDetails.getEndTime","link":"getEndTime"},{"title":"module:TVShowDetails.getHistory","link":"getHistory"},{"title":"module:TVShowDetails.getRuntime","link":"getRuntime"},{"title":"module:TVShowDetails.init","link":"init"},{"title":"module:TVShowDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVShowDetails.onShuffleEpisodeDataLoaded","link":"onShuffleEpisodeDataLoaded"},{"title":"module:TVShowDetails.round","link":"round"},{"title":"module:TVShowDetails.setFieldText","link":"setFieldText"},{"title":"module:TextSizeTask","link":"TextSizeTask"},{"title":"module:TextSizeTask.getTextSize","link":"getTextSize"},{"title":"module:TextSizeTask.init","link":"init"},{"title":"module:UserData","link":"UserData"},{"title":"module:UserData.getPreference","link":"getPreference"},{"title":"module:UserData.loadFromJSON","link":"loadFromJSON"},{"title":"module:UserData.loadFromRegistry","link":"loadFromRegistry"},{"title":"module:UserData.removeFromRegistry","link":"removeFromRegistry"},{"title":"module:UserData.saveToRegistry","link":"saveToRegistry"},{"title":"module:UserData.setActive","link":"setActive"},{"title":"module:UserData.setDataFromJSON","link":"setDataFromJSON"},{"title":"module:UserData.setPreference","link":"setPreference"},{"title":"module:UserData.setServer","link":"setServer"},{"title":"module:UserItem","link":"UserItem"},{"title":"module:UserItem.init","link":"init"},{"title":"module:UserItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserLibrary","link":"UserLibrary"},{"title":"module:UserLibrary.MarkItemFavorite","link":"MarkItemFavorite"},{"title":"module:UserLibrary.MarkItemWatched","link":"MarkItemWatched"},{"title":"module:UserLibrary.UnmarkItemFavorite","link":"UnmarkItemFavorite"},{"title":"module:UserLibrary.UnmarkItemWatched","link":"UnmarkItemWatched"},{"title":"module:UserRow","link":"UserRow"},{"title":"module:UserRow.init","link":"init"},{"title":"module:UserRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserRow.setData","link":"setData"},{"title":"module:UserRow.setUser","link":"setUser"},{"title":"module:UserRow.updateSize","link":"updateSize"},{"title":"module:UserSelect","link":"UserSelect"},{"title":"module:UserSelect.init","link":"init"},{"title":"module:UserSelect.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserSelect.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserSelect.redraw","link":"redraw"},{"title":"module:VideoData","link":"VideoData"},{"title":"module:VideoData.setFields","link":"setFields"},{"title":"module:VideoData.setPoster","link":"setPoster"},{"title":"module:VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.AddVideoContent","link":"AddVideoContent"},{"title":"module:VideoPlayer.GetPlaybackInfo","link":"GetPlaybackInfo","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:VideoPlayer.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:VideoPlayer.PlayIntroVideo","link":"PlayIntroVideo"},{"title":"module:VideoPlayer.VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.autoPlayNextEpisode","link":"autoPlayNextEpisode"},{"title":"module:VideoPlayer.directPlaySupported","link":"directPlaySupported"},{"title":"module:VideoPlayer.getAudioFormat","link":"getAudioFormat"},{"title":"module:VideoPlayer.getAudioInfo","link":"getAudioInfo"},{"title":"module:VideoPlayer.getContainerType","link":"getContainerType"},{"title":"module:VideoPlayer.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:VideoPlayer.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:VideoPlayer.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:VideoPlayer.startPlayBackOver","link":"startPlayBackOver","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:VideoPlayerView","link":"VideoPlayerView"},{"title":"module:VideoPlayerView.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:VideoPlayerView.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:VideoPlayerView.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:VideoPlayerView.getCurrentChapterIndex","link":"getCurrentChapterIndex","description":"

getCurrentChapterIndex: Finds current chapter index

"},{"title":"module:VideoPlayerView.handleChapterListAction","link":"handleChapterListAction","description":"

handleChapterListAction: Handles action to show chapter list

"},{"title":"module:VideoPlayerView.handleChapterSkipAction","link":"handleChapterSkipAction","description":"

handleChapterSkipAction: Handles user command to skip chapters in playing video

"},{"title":"module:VideoPlayerView.handleHideAction","link":"handleHideAction","description":"

handleHideAction: Handles action to hide OSD menu

"},{"title":"module:VideoPlayerView.handleShowSubtitleMenuAction","link":"handleShowSubtitleMenuAction","description":"

handleShowSubtitleMenuAction: Handles action to show subtitle selection menu

"},{"title":"module:VideoPlayerView.handleShowVideoInfoPopupAction","link":"handleShowVideoInfoPopupAction","description":"

handleShowVideoInfoPopupAction: Handles action to show video info popup

"},{"title":"module:VideoPlayerView.handleVideoPlayPauseAction","link":"handleVideoPlayPauseAction","description":"

handleVideoPlayPauseAction: Handles action to either play or pause the video content

"},{"title":"module:VideoPlayerView.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:VideoPlayerView.init","link":"init"},{"title":"module:VideoPlayerView.loadCaption","link":"loadCaption","description":"

Set caption url to server subtitle track

"},{"title":"module:VideoPlayerView.onAllowCaptionsChange","link":"onAllowCaptionsChange","description":"

Only setup caption items if captions are allowed

"},{"title":"module:VideoPlayerView.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:VideoPlayerView.onKeyEvent","link":"onKeyEvent"},{"title":"module:VideoPlayerView.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:VideoPlayerView.onOSDAction","link":"onOSDAction","description":"

onOSDAction: Process action events from OSD to their respective handlers

"},{"title":"module:VideoPlayerView.onPlaybackErrorButtonSelected","link":"onPlaybackErrorButtonSelected"},{"title":"module:VideoPlayerView.onPlaybackErrorDialogClosed","link":"onPlaybackErrorDialogClosed"},{"title":"module:VideoPlayerView.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onSubtitleChange","link":"onSubtitleChange","description":"

Event handler for when selectedSubtitle changes

"},{"title":"module:VideoPlayerView.onVideoContentLoaded","link":"onVideoContentLoaded"},{"title":"module:VideoPlayerView.populateChapterMenu","link":"populateChapterMenu","description":"

populateChapterMenu: ' Parse chapter data from API and appeand to chapter list menu

"},{"title":"module:VideoPlayerView.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:VideoPlayerView.showPlaybackErrorDialog","link":"showPlaybackErrorDialog"},{"title":"module:VideoPlayerView.stateAllowsOSD","link":"stateAllowsOSD","description":"

stateAllowsOSD: Check if current video state allows showing the OSD

"},{"title":"module:VideoPlayerView.toggleCaption","link":"toggleCaption","description":"

Toggles visibility of custom subtitles and sets captionTask's player state

"},{"title":"module:VideoPlayerView.updateCaption","link":"updateCaption","description":"

Removes old subtitle lines and adds new subtitle lines

"},{"title":"module:VideoPlayerView.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:VideoTrackListItem","link":"VideoTrackListItem"},{"title":"module:VideoTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:VideoTrackListItem.init","link":"init"},{"title":"module:VideoTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ViewCreator","link":"ViewCreator"},{"title":"module:ViewCreator.CreateAudioPlayerView","link":"CreateAudioPlayerView","description":"

Play Audio

"},{"title":"module:ViewCreator.CreateVideoPlayerView","link":"CreateVideoPlayerView","description":"

Play Video

"},{"title":"module:ViewCreator.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:ViewCreator.onPlaybackInfoLoaded","link":"onPlaybackInfoLoaded","description":"

The playback info task has returned data

"},{"title":"module:ViewCreator.onSelectPlaybackInfoPressed","link":"onSelectPlaybackInfoPressed","description":"

User requested playback info

"},{"title":"module:ViewCreator.onSelectSubtitlePressed","link":"onSelectSubtitlePressed","description":"

User requested subtitle selection popup

"},{"title":"module:ViewCreator.onSelectionMade","link":"onSelectionMade","description":"

User has selected something from the radioDialog popup

"},{"title":"module:ViewCreator.onStateChange","link":"onStateChange","description":"

Playback state change event handlers

"},{"title":"module:ViewCreator.processSubtitleSelection","link":"processSubtitleSelection"},{"title":"module:WhatsNewDialog","link":"WhatsNewDialog"},{"title":"module:WhatsNewDialog.init","link":"init"},{"title":"module:WhatsNewDialog.setPalette","link":"setPalette"},{"title":"module:baserequest","link":"baserequest"},{"title":"module:baserequest.APIRequest","link":"APIRequest"},{"title":"module:baserequest.authRequest","link":"authRequest","description":"

Takes and returns a roUrlTransfer object after adding a Jellyfin "Authorization" header

"},{"title":"module:baserequest.buildAuthHeader","link":"buildAuthHeader","description":"

Returns a string containing the "Authorization" header payload

"},{"title":"module:baserequest.buildParams","link":"buildParams","description":"

Functions for making requests to the API

"},{"title":"module:baserequest.buildURL","link":"buildURL"},{"title":"module:baserequest.deleteVoid","link":"deleteVoid"},{"title":"module:baserequest.getJson","link":"getJson"},{"title":"module:baserequest.getString","link":"getString"},{"title":"module:baserequest.getVoid","link":"getVoid"},{"title":"module:baserequest.get_url","link":"get_url"},{"title":"module:baserequest.headVoid","link":"headVoid"},{"title":"module:baserequest.postJson","link":"postJson"},{"title":"module:baserequest.postString","link":"postString"},{"title":"module:baserequest.postVoid","link":"postVoid"},{"title":"module:baserequest.setCertificateAuthority","link":"setCertificateAuthority","description":"

sets the certificate authority by file path on the passed node

"},{"title":"module:captionTask","link":"captionTask"},{"title":"module:captionTask.fetchCaption","link":"fetchCaption"},{"title":"module:captionTask.init","link":"init"},{"title":"module:captionTask.isTime","link":"isTime"},{"title":"module:captionTask.newLayoutGroup","link":"newLayoutGroup"},{"title":"module:captionTask.newRect","link":"newRect"},{"title":"module:captionTask.newlabel","link":"newlabel"},{"title":"module:captionTask.parseVTT","link":"parseVTT"},{"title":"module:captionTask.setFont","link":"setFont"},{"title":"module:captionTask.toMs","link":"toMs"},{"title":"module:captionTask.updateCaption","link":"updateCaption"},{"title":"module:conditional","link":"conditional"},{"title":"module:conditional.printRegistry","link":"printRegistry","description":"

Print out all of the registry contents to the debug log

"},{"title":"module:config","link":"config"},{"title":"module:config.GetConfigTree","link":"GetConfigTree","description":"

Read config tree from json config file and return

"},{"title":"module:config.RegistryReadAll","link":"RegistryReadAll","description":"

Return all data found inside a registry section

"},{"title":"module:config.findConfigTreeKey","link":"findConfigTreeKey","description":"

Recursivly search the config tree for entry with settingname equal to key

"},{"title":"module:config.getRegistrySections","link":"getRegistrySections","description":"

Return an array of all the registry section keys

"},{"title":"module:config.getSavedUsers","link":"getSavedUsers","description":"

Returns an array of saved users from the registry\nthat belong to the active server

"},{"title":"module:config.get_setting","link":"get_setting","description":"

"Jellyfin" registry accessors for the default global settings

"},{"title":"module:config.get_user_setting","link":"get_user_setting","description":"

User registry accessors for the currently active user

"},{"title":"module:config.registry_delete","link":"registry_delete"},{"title":"module:config.registry_read","link":"registry_read","description":"

Generic registry accessors

"},{"title":"module:config.registry_write","link":"registry_write"},{"title":"module:config.set_setting","link":"set_setting"},{"title":"module:config.set_user_setting","link":"set_user_setting"},{"title":"module:config.unset_setting","link":"unset_setting"},{"title":"module:config.unset_user_setting","link":"unset_user_setting"},{"title":"module:deviceCapabilities","link":"deviceCapabilities"},{"title":"module:deviceCapabilities.GetBitRateLimit","link":"GetBitRateLimit"},{"title":"module:deviceCapabilities.GetDirectPlayProfiles","link":"GetDirectPlayProfiles"},{"title":"module:deviceCapabilities.getCodecProfiles","link":"getCodecProfiles"},{"title":"module:deviceCapabilities.getContainerProfiles","link":"getContainerProfiles"},{"title":"module:deviceCapabilities.getDeviceCapabilities","link":"getDeviceCapabilities","description":"

Returns the Device Capabilities for Roku.\nAlso prints out the device profile for debugging

"},{"title":"module:deviceCapabilities.getDeviceProfile","link":"getDeviceProfile"},{"title":"module:deviceCapabilities.getMaxHeightArray","link":"getMaxHeightArray"},{"title":"module:deviceCapabilities.getMaxWidthArray","link":"getMaxWidthArray"},{"title":"module:deviceCapabilities.getSubtitleProfiles","link":"getSubtitleProfiles"},{"title":"module:deviceCapabilities.getTranscodingProfiles","link":"getTranscodingProfiles"},{"title":"module:deviceCapabilities.printDeviceProfile","link":"printDeviceProfile","description":"

Print out the deviceProfile for debugging

"},{"title":"module:deviceCapabilities.removeDecimals","link":"removeDecimals","description":"

Remove all decimals from a string

"},{"title":"module:deviceCapabilities.setPreferredCodec","link":"setPreferredCodec","description":"

Takes and returns a comma delimited string of codecs.\nMoves the preferred codec to the front of the string

"},{"title":"module:deviceCapabilities.updateProfileArray","link":"updateProfileArray","description":"

Recieves and returns an assArray of supported profiles and levels for each video codec

"},{"title":"module:globals","link":"globals"},{"title":"module:globals.SaveAppToGlobal","link":"SaveAppToGlobal","description":"

Save information from roAppInfo to m.global.app

"},{"title":"module:globals.SaveDeviceToGlobal","link":"SaveDeviceToGlobal","description":"

Save information from roDeviceInfo to m.global.device

"},{"title":"module:globals.setConstants","link":"setConstants","description":"

Set global constants

"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.runGlobalMigrations","link":"runGlobalMigrations","description":"

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

"},{"title":"module:migrations.runRegistryUserMigrations","link":"runRegistryUserMigrations"},{"title":"module:misc","link":"misc"},{"title":"module:misc.AssocArrayEqual","link":"AssocArrayEqual"},{"title":"module:misc.arrayHasValue","link":"arrayHasValue","description":"

Check if a specific value is inside of an array

"},{"title":"module:misc.div_ceiling","link":"div_ceiling"},{"title":"module:misc.findNodeBySubtype","link":"findNodeBySubtype"},{"title":"module:misc.formatTime","link":"formatTime","description":"

Format time as 12 or 24 hour format based on system clock setting

"},{"title":"module:misc.getButton","link":"getButton"},{"title":"module:misc.getMinutes","link":"getMinutes","description":"

Converts ticks to minutes

"},{"title":"module:misc.getMsgPicker","link":"getMsgPicker"},{"title":"module:misc.get_dialog_result","link":"get_dialog_result","description":"

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

"},{"title":"module:misc.inArray","link":"inArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:misc.inferServerUrl","link":"inferServerUrl","description":"

take an incomplete url string and use it to make educated guesses about\nthe complete url. then tests these guesses to see if it can find a jf server\nreturns the url of the server it found, or an empty string

"},{"title":"module:misc.isJellyfinServer","link":"isJellyfinServer","description":"

accepts the raw json string of /system/info/public and returns\na boolean indicating if ProductName is "Jellyfin Server"

"},{"title":"module:misc.isLocalhost","link":"isLocalhost","description":"

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

"},{"title":"module:misc.isNodeEvent","link":"isNodeEvent"},{"title":"module:misc.isValid","link":"isValid","description":"

Returns whether or not passed value is valid

"},{"title":"module:misc.isValidAndNotEmpty","link":"isValidAndNotEmpty","description":"

Returns whether or not passed value is valid and not empty\nAccepts a string, or any countable type (arrays and lists)

"},{"title":"module:misc.lastFocusedChild","link":"lastFocusedChild"},{"title":"module:misc.leftPad","link":"leftPad"},{"title":"module:misc.message_dialog","link":"message_dialog"},{"title":"module:misc.option_dialog","link":"option_dialog"},{"title":"module:misc.parseUrl","link":"parseUrl","description":"

Returns an array from a url = [ url, proto, host, port, subdir+params ]\nIf port or subdir are not found, an empty string will be added to the array\nProto must be declared or array will be empty

"},{"title":"module:misc.roundNumber","link":"roundNumber","description":"

Rounds number to nearest integer

"},{"title":"module:misc.secondsToHuman","link":"secondsToHuman"},{"title":"module:misc.setFieldTextValue","link":"setFieldTextValue"},{"title":"module:misc.show_dialog","link":"show_dialog"},{"title":"module:misc.shuffleArray","link":"shuffleArray","description":"

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

"},{"title":"module:misc.startLoadingSpinner","link":"startLoadingSpinner"},{"title":"module:misc.startMediaLoadingSpinner","link":"startMediaLoadingSpinner"},{"title":"module:misc.stopLoadingSpinner","link":"stopLoadingSpinner"},{"title":"module:misc.ticksToHuman","link":"ticksToHuman"},{"title":"module:misc.toString","link":"toString"},{"title":"module:misc.urlCandidates","link":"urlCandidates","description":"

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates\nfor the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated\nfull urls.

"},{"title":"module:misc.versionChecker","link":"versionChecker","description":"

Returns whether or not a version number (e.g. 10.7.7) is greater or equal\nto some minimum version allowed (e.g. 10.8.0)

"},{"title":"module:quickplay","link":"quickplay"},{"title":"module:quickplay.album","link":"album","description":"

A music album.\nPlay the entire album starting with track 1.

"},{"title":"module:quickplay.artist","link":"artist","description":"

A music artist.\nShuffle play all songs by artist.

"},{"title":"module:quickplay.audio","link":"audio","description":"

A single audio file.

"},{"title":"module:quickplay.boxset","link":"boxset","description":"

A boxset.\nPlay all items inside.

"},{"title":"module:quickplay.collectionFolder","link":"collectionFolder","description":"

Quick Play A CollectionFolder.\nShuffle play the items inside\nwith some differences based on collectionType.

"},{"title":"module:quickplay.folder","link":"folder","description":"

Quick Play A folder.\nShuffle play all items found

"},{"title":"module:quickplay.multipleSeries","link":"multipleSeries","description":"

More than one TV Show Series.\nShuffle play all watched episodes

"},{"title":"module:quickplay.musicVideo","link":"musicVideo","description":"

A single music video file.

"},{"title":"module:quickplay.person","link":"person","description":"

Quick Play A Person.\nShuffle play all videos found

"},{"title":"module:quickplay.photo","link":"photo","description":"

A single photo.

"},{"title":"module:quickplay.photoAlbum","link":"photoAlbum","description":"

A photo album.

"},{"title":"module:quickplay.playlist","link":"playlist","description":"

Quick Play A Playlist.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.program","link":"program","description":"

Quick Play A Live Program

"},{"title":"module:quickplay.pushToQueue","link":"pushToQueue","description":"

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

"},{"title":"module:quickplay.season","link":"season","description":"

A TV Show Season.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.series","link":"series","description":"

A TV Show Series.\nPlay the first unwatched episode.\nIf none, shuffle play the whole series.

"},{"title":"module:quickplay.tvChannel","link":"tvChannel","description":"

Quick Play A TVChannel

"},{"title":"module:quickplay.userView","link":"userView","description":"

Quick Play A UserView.\nPlay logic depends on "collectionType".

"},{"title":"module:quickplay.video","link":"video","description":"

A single video file.

"},{"title":"module:schedule","link":"schedule"},{"title":"module:schedule.channelFilterSet","link":"channelFilterSet"},{"title":"module:schedule.channelsearchTermSet","link":"channelsearchTermSet","description":"

Voice Search set

"},{"title":"module:schedule.focusProgramDetails","link":"focusProgramDetails","description":"

Move the TV Guide Grid down or up depending whether details are selected

"},{"title":"module:schedule.init","link":"init"},{"title":"module:schedule.onChannelsLoaded","link":"onChannelsLoaded","description":"

Initial list of channels loaded

"},{"title":"module:schedule.onGridScrolled","link":"onGridScrolled","description":"

As user scrolls grid, check if more data requries to be loaded

"},{"title":"module:schedule.onKeyEvent","link":"onKeyEvent"},{"title":"module:schedule.onProgramDetailsLoaded","link":"onProgramDetailsLoaded","description":"

Update the Program Details with full information

"},{"title":"module:schedule.onProgramFocused","link":"onProgramFocused"},{"title":"module:schedule.onProgramSelected","link":"onProgramSelected"},{"title":"module:schedule.onRecordChannelSelected","link":"onRecordChannelSelected","description":"

Handle user selecting "Record Channel" from Program Details

"},{"title":"module:schedule.onRecordOperationDone","link":"onRecordOperationDone"},{"title":"module:schedule.onRecordSeriesChannelSelected","link":"onRecordSeriesChannelSelected","description":"

Handle user selecting "Record Series" from Program Details

"},{"title":"module:schedule.onScheduleLoaded","link":"onScheduleLoaded","description":"

When LoadScheduleTask completes (initial or more data) and we have a schedule to display

"},{"title":"module:schedule.onWatchChannelSelected","link":"onWatchChannelSelected","description":"

Handle user selecting "Watch Channel" from Program Details

"},{"title":"module:section","link":"section"},{"title":"module:section.init","link":"init"},{"title":"module:section.onFocusChange","link":"onFocusChange"},{"title":"module:section.onIDChange","link":"onIDChange"},{"title":"module:section.onTranslationChange","link":"onTranslationChange"},{"title":"module:section.scrollDownToOnDeck","link":"scrollDownToOnDeck"},{"title":"module:section.scrollOffBottom","link":"scrollOffBottom"},{"title":"module:section.scrollOffOnDeck","link":"scrollOffOnDeck"},{"title":"module:section.scrollOffTop","link":"scrollOffTop"},{"title":"module:section.scrollUpToOnDeck","link":"scrollUpToOnDeck"},{"title":"module:section.showFromBottom","link":"showFromBottom"},{"title":"module:section.showFromTop","link":"showFromTop"},{"title":"module:sectionScroller","link":"sectionScroller"},{"title":"module:sectionScroller.displayedIndexChanged","link":"displayedIndexChanged"},{"title":"module:sectionScroller.init","link":"init"},{"title":"module:sectionScroller.onFocusChange","link":"onFocusChange"},{"title":"module:settings","link":"settings"},{"title":"module:settings.LoadMenu","link":"LoadMenu"},{"title":"module:settings.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook that gets ran as needed.\nAssumes settings were changed and they affect the device profile.\nPosts a new device profile to the server using the task thread

"},{"title":"module:settings.boolSettingChanged","link":"boolSettingChanged"},{"title":"module:settings.init","link":"init"},{"title":"module:settings.isFormInFocus","link":"isFormInFocus","description":"

Returns true if any of the data entry forms are in focus

"},{"title":"module:settings.onKeyEvent","link":"onKeyEvent"},{"title":"module:settings.onKeyGridEscape","link":"onKeyGridEscape"},{"title":"module:settings.onKeyGridSubmit","link":"onKeyGridSubmit"},{"title":"module:settings.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:settings.radioSettingChanged","link":"radioSettingChanged"},{"title":"module:settings.settingFocused","link":"settingFocused"},{"title":"module:settings.settingSelected","link":"settingSelected"},{"title":"module:userauth","link":"userauth"},{"title":"module:userauth.AboutMe","link":"AboutMe"},{"title":"module:userauth.AuthenticateViaQuickConnect","link":"AuthenticateViaQuickConnect"},{"title":"module:userauth.AvailableUsers","link":"AvailableUsers"},{"title":"module:userauth.GetPublicUsers","link":"GetPublicUsers"},{"title":"module:userauth.LoadUserAbilities","link":"LoadUserAbilities"},{"title":"module:userauth.ServerInfo","link":"ServerInfo"},{"title":"module:userauth.SignOut","link":"SignOut"},{"title":"module:userauth.checkQuickConnect","link":"checkQuickConnect"},{"title":"module:userauth.get_token","link":"get_token"},{"title":"module:userauth.initQuickConnect","link":"initQuickConnect"}]} \ No newline at end of file diff --git a/docs/api/module-TVEpisodes.html b/docs/api/module-TVEpisodes.html index e97c34fc3b..e37f67e379 100644 --- a/docs/api/module-TVEpisodes.html +++ b/docs/api/module-TVEpisodes.html @@ -1,3 +1,3 @@ Module: TVEpisodes
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Handle navigation input from the remote and act on it

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) setExtraButtonVisibility() → {void}

Updates the visibility of the Extras button based on if this season has any extra features

Returns:
Type: 
void

(static) setSeasonLoading() → {void}

Returns:
Type: 
void

(static) updateSeason() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) getFocusedItem() → {dynamic}

get the currently focused item

Returns:
Type: 
dynamic

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Handle navigation input from the remote and act on it

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) setExtraButtonVisibility() → {void}

Updates the visibility of the Extras button based on if this season has any extra features

Returns:
Type: 
void

(static) setSeasonLoading() → {void}

Returns:
Type: 
void

(static) updateSeason() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_ShowScenes.bs.html b/docs/api/source_ShowScenes.bs.html index 5b5b420f63..ba20496962 100644 --- a/docs/api/source_ShowScenes.bs.html +++ b/docs/api/source_ShowScenes.bs.html @@ -792,7 +792,7 @@ group.extrasObjects = TVSeasonExtras(season.id) ' watch for button presses - group.observeField("episodeSelected", m.port) + group.observeField("selectedItem", m.port) group.observeField("quickPlayNode", m.port) ' finished building SeasonDetails view stopLoadingSpinner() From fd23023977814fde452da33a63e44a2d0d239a03 Mon Sep 17 00:00:00 2001 From: Jimi Date: Tue, 21 Nov 2023 17:50:27 -0700 Subject: [PATCH 16/82] Fix TV Guide bug --- components/ItemGrid/ItemGrid.bs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/ItemGrid/ItemGrid.bs b/components/ItemGrid/ItemGrid.bs index ea3299b0f2..c23bc962ba 100644 --- a/components/ItemGrid/ItemGrid.bs +++ b/components/ItemGrid/ItemGrid.bs @@ -735,6 +735,9 @@ sub onChannelSelected(msg) if node.watchChannel <> invalid ' Clone the node when it's reused/update in the TimeGrid it doesn't automatically start playing m.top.selectedItem = node.watchChannel.clone(false) + ' Make sure to set watchChanel to invalid in case the user hits back and then selects + ' the same channel on the guide (without moving away from the currently selected channel) + m.tvGuide.watchChannel = invalid end if end sub From d2fcc932b2aca7a9daf8dd58b158aa6f1398d73b Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 21 Nov 2023 21:14:40 -0500 Subject: [PATCH 17/82] move spinner to JFScene and migrate all other screnes to use it + use booleans on JFScene to control spinner + resize spinner to be similar size as video player spinner --- components/ItemGrid/ItemGrid.bs | 19 +++++------ components/ItemGrid/ItemGrid.xml | 1 - components/ItemGrid/MovieLibraryView.bs | 15 +++------ components/ItemGrid/MovieLibraryView.xml | 1 - components/ItemGrid/MusicLibraryView.bs | 13 ++------ components/ItemGrid/MusicLibraryView.xml | 1 - components/JFScene.bs | 25 ++++++++++++++ components/JFScene.xml | 4 ++- components/Spinner.bs | 2 +- components/config/SetServerScreen.bs | 5 ++- components/config/SetServerScreen.xml | 1 - components/liveTv/schedule.bs | 10 +++--- components/liveTv/schedule.xml | 1 - components/mediaPlayers/AudioPlayer.bs | 1 + components/movies/MovieDetails.bs | 4 +-- components/movies/MovieDetails.xml | 1 - components/music/AlbumView.bs | 10 +----- components/music/AlbumView.xml | 1 - components/music/ArtistView.bs | 1 + components/music/PlaylistView.bs | 10 +----- components/music/PlaylistView.xml | 1 - components/photos/PhotoDetails.bs | 2 ++ components/search/SearchResults.bs | 7 ++-- components/search/SearchResults.xml | 1 - components/video/VideoPlayerView.bs | 2 ++ images/spinner.png | Bin 7212 -> 7744 bytes source/Main.bs | 32 ++++-------------- source/ShowScenes.bs | 8 ++--- source/VideoPlayer.bs | 2 +- source/utils/misc.bs | 40 +++++------------------ source/utils/quickplay.bs | 2 ++ 31 files changed, 84 insertions(+), 139 deletions(-) diff --git a/components/ItemGrid/ItemGrid.bs b/components/ItemGrid/ItemGrid.bs index ea3299b0f2..c14558619c 100644 --- a/components/ItemGrid/ItemGrid.bs +++ b/components/ItemGrid/ItemGrid.bs @@ -64,9 +64,6 @@ sub init() 'set inital counts for overhang before content is loaded. m.loadItemsTask.totalRecordCount = 0 - m.spinner = m.top.findNode("spinner") - m.spinner.visible = true - m.Alpha = m.top.findNode("AlphaMenu") m.AlphaSelected = m.top.findNode("AlphaSelected") @@ -92,7 +89,7 @@ end sub 'Load initial set of Data sub loadInitialItems() m.loadItemsTask.control = "stop" - m.spinner.visible = true + startLoadingSpinner() if m.top.parentItem.json.Type = "CollectionFolder" 'or m.top.parentItem.json.Type = "Folder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -238,7 +235,7 @@ sub loadInitialItems() end if m.loadItemsTask.observeField("content", "ItemDataLoaded") - m.spinner.visible = true + startLoadingSpinner(false) m.loadItemsTask.control = "RUN" SetUpOptions() end sub @@ -450,6 +447,7 @@ end sub ' 'Handle loaded data, and add to Grid sub ItemDataLoaded(msg) + stopLoadingSpinner() m.top.alphaActive = false itemData = msg.GetData() m.loadItemsTask.unobserveField("content") @@ -475,7 +473,7 @@ sub ItemDataLoaded(msg) m.genreList.setFocus(true) m.loading = false - m.spinner.visible = false + stopLoadingSpinner() return end if @@ -498,7 +496,7 @@ sub ItemDataLoaded(msg) m.itemGrid.setFocus(true) m.genreList.setFocus(false) - m.spinner.visible = false + stopLoadingSpinner() end sub ' @@ -571,7 +569,7 @@ end sub ' 'Load next set of items sub loadMoreData() - m.spinner.visible = true + startLoadingSpinner(false) if m.Loading = true then return m.Loading = true m.loadItemsTask.startIndex = m.loadedItems @@ -594,7 +592,7 @@ sub onItemalphaSelected() m.loadItemsTask.searchTerm = "" m.VoiceBox.text = "" m.loadItemsTask.nameStartsWith = m.alpha.itemAlphaSelected - m.spinner.visible = true + startLoadingSpinner(false) loadInitialItems() end if end sub @@ -609,7 +607,7 @@ sub onvoiceFilter() m.loadItemsTask.NameStartsWith = " " m.loadItemsTask.searchTerm = m.voiceBox.text m.loadItemsTask.recursive = true - m.spinner.visible = true + startLoadingSpinner(false) loadInitialItems() end if end sub @@ -842,7 +840,6 @@ function onKeyEvent(key as string, press as boolean) as boolean end if if key = "replay" - m.spinner.visible = true m.loadItemsTask.searchTerm = "" m.loadItemsTask.nameStartsWith = "" m.voiceBox.text = "" diff --git a/components/ItemGrid/ItemGrid.xml b/components/ItemGrid/ItemGrid.xml index 3c5d2c797a..8522ab45d7 100644 --- a/components/ItemGrid/ItemGrid.xml +++ b/components/ItemGrid/ItemGrid.xml @@ -22,7 +22,6 @@
On this page

Methods

(static) getPreference(key) → {dynamic}

Parameters:
NameTypeDescription
keystring
Returns:
Type: 
dynamic

(static) loadFromJSON(json) → {void}

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) loadFromRegistry(id) → {void}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
void

(static) removeFromRegistry() → {void}

Returns:
Type: 
void

(static) saveToRegistry() → {void}

Returns:
Type: 
void

(static) setActive() → {void}

Returns:
Type: 
void

(static) setDataFromJSON() → {void}

Returns:
Type: 
void

(static) setPreference(key, value) → {dynamic}

Parameters:
NameTypeDescription
keystring
valuestring
Returns:
Type: 
dynamic

(static) setServer(hostname) → {void}

Parameters:
NameTypeDescription
hostnamestring
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) getPreference(key) → {dynamic}

Parameters:
NameTypeDescription
keystring
Returns:
Type: 
dynamic

(static) loadFromJSON(json) → {void}

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) loadFromRegistry(id) → {void}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
void

(static) removeFromRegistry() → {void}

Returns:
Type: 
void

(static) saveToRegistry() → {void}

Returns:
Type: 
void

(static) setDataFromJSON() → {void}

Returns:
Type: 
void

(static) setPreference(key, value) → {dynamic}

Parameters:
NameTypeDescription
keystring
valuestring
Returns:
Type: 
dynamic

(static) setServer(hostname) → {void}

Parameters:
NameTypeDescription
hostnamestring
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_api_userauth.bs.html b/docs/api/source_api_userauth.bs.html index 42c078b536..6cd2488cf8 100644 --- a/docs/api/source_api_userauth.bs.html +++ b/docs/api/source_api_userauth.bs.html @@ -14,9 +14,8 @@ userdata = CreateObject("roSGNode", "UserData") userdata.json = json - - userdata.callFunc("setActive") userdata.callFunc("saveToRegistry") + return userdata end function @@ -165,8 +164,8 @@ userdata.json = jsonResponse session.user.Update("id", jsonResponse.User.Id) session.user.Update("authToken", jsonResponse.AccessToken) - userdata.callFunc("setActive") userdata.callFunc("saveToRegistry") + return true end if From 4043f3ef4562cc0975e659e3a93f7197bc4a8a7f Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Wed, 22 Nov 2023 17:08:37 -0500 Subject: [PATCH 32/82] fix photo and album infinite spinner --- components/photos/PhotoDetails.bs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/components/photos/PhotoDetails.bs b/components/photos/PhotoDetails.bs index 0048d1a241..07d16f67a9 100644 --- a/components/photos/PhotoDetails.bs +++ b/components/photos/PhotoDetails.bs @@ -23,14 +23,12 @@ sub itemContentChanged() if isValidToContinue(m.top.itemIndex) m.LoadLibrariesTask = createObject("roSGNode", "LoadPhotoTask") if isValid(m.top.itemsNode) - stopLoadingSpinner() if isValid(m.top.itemsNode.content) m.LoadLibrariesTask.itemNodeContent = m.top.itemsNode.content.getChild(m.top.itemIndex) else if isValidAndNotEmpty(m.top.itemsNode.id) m.LoadLibrariesTask.itemNodeContent = m.top.itemsNode end if else if isValid(m.top.itemsArray) - stopLoadingSpinner() itemContent = m.top.itemsArray[m.top.itemIndex] m.LoadLibrariesTask.itemArrayContent = itemContent else @@ -43,6 +41,7 @@ sub itemContentChanged() end sub sub onPhotoLoaded() + stopLoadingSpinner() if m.LoadLibrariesTask.results <> invalid photo = m.top.findNode("photo") photo.uri = m.LoadLibrariesTask.results From a5af2555bf8a62274a38c75157e08c75ef7376cd Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Wed, 22 Nov 2023 18:23:04 -0500 Subject: [PATCH 33/82] Reset focus to selected item when returning to home view --- components/home/HomeRows.bs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index 25acd3ac04..9ab2087682 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -333,6 +333,8 @@ sub updateFavoritesItems() ' replace the old row m.top.content.replaceChild(row, rowIndex) + ' Set focus on previously focused item + setFocusToPreviousFocusedItem() end if end sub @@ -365,6 +367,8 @@ sub updateContinueWatchingItems() ' replace the old row m.top.content.replaceChild(row, m.homeSections.resume.index) + ' Set focus on previously focused item + setFocusToPreviousFocusedItem() end sub sub updateNextUpItems() @@ -389,6 +393,8 @@ sub updateNextUpItems() ' replace the old row m.top.content.replaceChild(row, m.homeSections.nextup.index) + ' Set focus on previously focused item + setFocusToPreviousFocusedItem() end if end sub @@ -460,6 +466,10 @@ sub updateLatestItems(msg) ' Replace the old row if isValid(rowIndex) m.top.content.replaceChild(row, rowIndex) + + ' Set focus on previously focused item + setFocusToPreviousFocusedItem() + return end if end if @@ -499,6 +509,16 @@ sub updateLatestItems(msg) end if end sub +' setFocusToPreviousFocusedItem: Sets the cursor focus to the row and item previously selected +' +sub setFocusToPreviousFocusedItem() + if isValid(m.selectedRowItem) + if isValid(m.homeSections[m.selectedRowItem[0]]) + m.top.jumpToRowItem = [m.homeSections[m.selectedRowItem[0]].index, m.selectedRowItem[1]] + end if + end if +end sub + sub updateOnNowItems() itemData = m.LoadOnNowTask.content m.LoadOnNowTask.unobserveField("content") @@ -530,11 +550,19 @@ sub updateOnNowItems() ' replace the old row m.top.content.replaceChild(row, m.homeSections.livetv.index) + ' Set focus on previously focused item + setFocusToPreviousFocusedItem() end if end sub sub itemSelected() + for each section in m.homeSections + if m.homeSections[section].index = m.top.rowItemSelected[0] + m.selectedRowItem = [section, m.top.rowItemSelected[1]] + end if + end for + m.top.selectedItem = m.top.content.getChild(m.top.rowItemSelected[0]).getChild(m.top.rowItemSelected[1]) 'Prevent the selected item event from double firing From 06af8b203019b5e8e7453ed6e2b1072260ded035 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Wed, 22 Nov 2023 20:55:41 -0500 Subject: [PATCH 34/82] Don't allow Roku's component reuse to mess up library fonts --- components/home/HomeItem.bs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/home/HomeItem.bs b/components/home/HomeItem.bs index f83be55ad6..ff84644d26 100644 --- a/components/home/HomeItem.bs +++ b/components/home/HomeItem.bs @@ -65,6 +65,10 @@ sub itemContentChanged() ' Format the Data based on the type of Home Data if itemData.type = "CollectionFolder" or itemData.type = "UserView" or itemData.type = "Channel" + m.itemText.font.size = 35 + m.itemText.height = 64 + m.itemText.horizAlign = "center" + m.itemText.vertAlign = "bottom" m.itemText.text = itemData.name m.itemPoster.uri = itemData.widePosterURL return From c136016c8d84ef9c711238ce6703ab88b21e2602 Mon Sep 17 00:00:00 2001 From: Jesse Date: Thu, 23 Nov 2023 03:54:28 +0000 Subject: [PATCH 35/82] Translated using Weblate (English (United Kingdom)) Currently translated at 30.0% (82 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/en_GB/ --- locale/en_GB/translations.ts | 73 +++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/locale/en_GB/translations.ts b/locale/en_GB/translations.ts index 67e2792d5b..61754a1738 100644 --- a/locale/en_GB/translations.ts +++ b/locale/en_GB/translations.ts @@ -255,7 +255,7 @@ today - today + today Current day @@ -5515,5 +5515,76 @@ Enter the server name or IP address Title of KeyboardDialog when manually entering a server URL + + On Now + On Now + + + Extras + Extras + + + Cast & Crew + Cast & Crew + + + More Like This + More Like This + + + Movies (Presentation) + Movies (Presentation) + Movie library view option + + + Age + Age + + + Died + Died + + + Additional Parts + Additional Parts + Additional parts of a video + + + TV Shows + TV Shows + + + Movies + Movies + + + Delete Saved + Delete Saved + + + Born + Born + + + Special Features + Special Features + + + Episodes + Episodes + + + Movies (Grid) + Movies (Grid) + Movie library view option + + + Save Credentials? + Save Credentials? + + + Press 'OK' to Close + Press 'OK' to Close + From 69ab11cdb9f490da5f5156ca1889e1776b553eec Mon Sep 17 00:00:00 2001 From: Peter Farkas Date: Thu, 23 Nov 2023 20:21:59 +0000 Subject: [PATCH 36/82] Translated using Weblate (Hungarian) Currently translated at 19.0% (52 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/hu/ --- locale/hu/translations.ts | 52 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/locale/hu/translations.ts b/locale/hu/translations.ts index a217d39528..4730aac903 100644 --- a/locale/hu/translations.ts +++ b/locale/hu/translations.ts @@ -11537,5 +11537,57 @@ Save Credentials? Menti a bejelentkezési adatokat? + + Unable to load Channel Data from the server + Nem sikerült betölteni a csatornaadatokat a szerverről + + + Extras + Extrák + + + Episodes + Epizódok + + + Delete Saved + Törlés mentve + + + There was an error retrieving the data for this item from the server. + Hiba történt az elem adatainak a szerverről történő lekérdezésében. + Dialog detail when unable to load Content from Server + + + On Now + Adásban + + + Error Retrieving Content + Hiba a tartalom lekérdezésében + Dialog title when unable to load Content from Server + + + Error During Playback + Hiba lejátszás közben + Dialog title when error occurs during playback + + + An error was encountered while playing this item. + Hiba történt az elem lejátszása közben. + Dialog detail when error occurs during playback + + + Loading Channel Data + Csatornaadatok betöltése + + + Error loading Channel Data + Hiba a csatornaadatok betöltésében + + + Save Credentials? + Menti a bejelentkezési adatokat? + From da656931e5d05a5b2812fd3e6e054d7b0eec7be0 Mon Sep 17 00:00:00 2001 From: Lars Eichler Date: Fri, 24 Nov 2023 08:26:12 +0000 Subject: [PATCH 37/82] Translated using Weblate (German) Currently translated at 34.4% (94 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/de/ --- locale/de_DE/translations.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts index 4a1b554cb5..7103a9c426 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -13378,5 +13378,30 @@ Mittwoch Day of Week + + Starts + Beginnt + (Future Tense) For defining a day and time when a program will start (e.g. Starts Wednesday, 08:00) + + + Live + Live + If TV Show is being broadcast live (not pre-recorded) + + + Ends at + Endete am + (Past Tense) For defining a day and time when a program ended (e.g. Ended Wednesday, 08:00) + + + Starts at + Beginnt um + (Future Tense) For defining time when a program will start today (e.g. Starts at 08:00) + + + Ended at + Endete um + (Past Tense) For defining time when a program will ended (e.g. Ended at 08:00) + From 867667f5168d1619f290682c6ad1a6db8cba32d1 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Thu, 23 Nov 2023 08:52:44 -0500 Subject: [PATCH 38/82] Add setting to match web's home sections --- .vscode/settings.json | 2 +- components/ImageSizes.bs | 5 +++ components/home/HomeRows.bs | 75 ++++++++++++++++++++++++------------ locale/en_US/translations.ts | 10 +++++ settings/settings.json | 7 ++++ source/utils/misc.bs | 3 ++ source/utils/session.bs | 14 +++++++ 7 files changed, 90 insertions(+), 26 deletions(-) create mode 100644 components/ImageSizes.bs diff --git a/.vscode/settings.json b/.vscode/settings.json index a005ef427b..746c772b13 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,4 +18,4 @@ "docs/api/**": true }, "brightscriptcomment.addExtraAtStartAndEnd": false -} +} \ No newline at end of file diff --git a/components/ImageSizes.bs b/components/ImageSizes.bs new file mode 100644 index 0000000000..2371a30fc8 --- /dev/null +++ b/components/ImageSizes.bs @@ -0,0 +1,5 @@ +namespace imageSizes + const WIDE_POSTER = [464, 331] + const MOVIE_POSTER = [188, 331] + const MUSIC_ALBUM = [261, 331] +end namespace diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index 9ab2087682..f5895e88c6 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -1,4 +1,9 @@ import "pkg:/source/utils/misc.bs" +import "pkg:/components/ImageSizes.bs" + +' The maximum number of seconds we will show the loading spinner and delay the user from using the home view while the content loads +' We use this to wait for the rows to load so we can reset focus to the row/item once it loads +const MAX_TIME_HOME_LOADING_SPINNER_SHOWN = 1 sub init() m.top.itemComponentName = "HomeItem" @@ -14,6 +19,11 @@ sub init() m.homeSections = {} + m.loadingTimer = createObject("roSGNode", "Timer") + m.loadingTimer.duration = MAX_TIME_HOME_LOADING_SPINNER_SHOWN + m.loadingTimer.repeat = true + m.loadingTimer.observeField("fire", "stopLoadingSpinner") + updateSize() m.top.setfocus(true) @@ -190,7 +200,7 @@ sub createLibraryRow(content as dynamic) mediaRow.title = tr("My Media") m.homeSections.AddReplace("library", { - imageSize: [464, 331], + imageSize: imageSizes.WIDE_POSTER, index: m.homeSections.count() }) @@ -212,12 +222,12 @@ sub createLatestInRows(content as dynamic) latestInRow = content.CreateChild("HomeRow") latestInRow.title = tr("Latest in") + " " + lib.name + " >" - imagesize = [464, 331] + imagesize = imageSizes.WIDE_POSTER if LCase(lib.collectionType) = "movies" - imagesize = [188, 331] + imagesize = imageSizes.MOVIE_POSTER else if LCase(lib.collectionType) = "music" - imagesize = [261, 331] + imagesize = imageSizes.MUSIC_ALBUM end if m.homeSections.AddReplace("latestin" + LCase(lib.name).Replace(" ", ""), { @@ -244,7 +254,7 @@ sub createLiveTVRow(content as dynamic) contentRow = content.CreateChild("HomeRow") contentRow.title = tr("On Now") m.homeSections.AddReplace("livetv", { - imageSize: [464, 331], + imageSize: imageSizes.WIDE_POSTER, index: m.homeSections.count() }) @@ -257,7 +267,7 @@ sub createContinueWatchingRow(content as dynamic) continueWatchingRow = content.CreateChild("HomeRow") continueWatchingRow.title = tr("Continue Watching") m.homeSections.AddReplace("resume", { - imageSize: [464, 331], + imageSize: imageSizes.WIDE_POSTER, index: m.homeSections.count() }) @@ -271,7 +281,7 @@ sub createNextUpRow(content as dynamic) nextUpRow = content.CreateChild("HomeRow") nextUpRow.title = tr("Next Up >") m.homeSections.AddReplace("nextup", { - imageSize: [464, 331], + imageSize: imageSizes.WIDE_POSTER, index: m.homeSections.count() }) @@ -286,7 +296,7 @@ sub createFavoritesRow(content as dynamic) favoritesRow.title = tr("Favorites") m.homeSections.AddReplace("favorites", { - imageSize: [464, 331], + imageSize: imageSizes.WIDE_POSTER, index: m.homeSections.count() }) @@ -297,6 +307,7 @@ end sub ' Update home row data sub updateHomeRows() + startMediaLoadingSpinner() content = processUserSections() setRowItemSizes() m.top.content = content @@ -375,6 +386,7 @@ sub updateNextUpItems() itemData = m.LoadNextUpTask.content m.LoadNextUpTask.unobserveField("content") m.LoadNextUpTask.content = [] + m.LoadNextUpTask.control = "STOP" if itemData = invalid then return @@ -444,14 +456,14 @@ sub updateLatestItems(msg) row.usePoster = true ' Handle specific types with different item widths if node.metadata.contentType = "movies" - row.imageWidth = 180 - itemSize = [188, 331] + row.imageWidth = imageSizes.MOVIE_POSTER[0] + itemSize = imageSizes.MOVIE_POSTER else if node.metadata.contentType = "music" - row.imageWidth = 261 - itemSize = [261, 331] + row.imageWidth = imageSizes.MUSIC_ALBUM[0] + itemSize = imageSizes.MUSIC_ALBUM else - row.imageWidth = 464 - itemSize = [464, 331] + row.imageWidth = imageSizes.WIDE_POSTER[0] + itemSize = imageSizes.WIDE_POSTER end if for each item in itemData @@ -512,9 +524,21 @@ end sub ' setFocusToPreviousFocusedItem: Sets the cursor focus to the row and item previously selected ' sub setFocusToPreviousFocusedItem() + m.loadingTimer.control = "start" + if isValid(m.selectedRowItem) - if isValid(m.homeSections[m.selectedRowItem[0]]) - m.top.jumpToRowItem = [m.homeSections[m.selectedRowItem[0]].index, m.selectedRowItem[1]] + ' Set focus to row if it exists + itemRow = m.top.content.getChild(m.top.rowItemSelected[0]) + if isValid(itemRow) + m.top.jumpToItem = m.top.rowItemSelected[0] + + ' Set focus to column if it exists + itemColumn = itemRow.getChild(m.top.rowItemSelected[1]) + if isValid(itemColumn) + m.top.jumpToRowItem = [m.selectedRowItem[0], m.selectedRowItem[1]] + m.loadingTimer.control = "stop" + stopLoadingSpinner() + end if end if end if end sub @@ -533,16 +557,18 @@ sub updateOnNowItems() ' remake row using the new data row = CreateObject("roSGNode", "HomeRow") row.title = tr("On Now") - 'itemSize = [464, 331] - row.imageWidth = 464 + row.imageWidth = imageSizes.WIDE_POSTER[0] for each item in itemData row.usePoster = false + if (not isValid(item.thumbnailURL) or item.thumbnailURL = "") and isValid(item.json) and isValid(item.json.imageURL) item.thumbnailURL = item.json.imageURL row.usePoster = true - row.imageWidth = 180 - 'itemSize = [188, 331] + row.imageWidth = imageSizes.MOVIE_POSTER[0] + + m.homeSections.livetv.imageSize = imageSizes.MOVIE_POSTER end if + item.usePoster = row.usePoster item.imageWidth = row.imageWidth row.appendChild(item) @@ -553,15 +579,14 @@ sub updateOnNowItems() ' Set focus on previously focused item setFocusToPreviousFocusedItem() + ' We may now have different poster sizes. Reset the row item sizes + setRowItemSizes() + end if end sub sub itemSelected() - for each section in m.homeSections - if m.homeSections[section].index = m.top.rowItemSelected[0] - m.selectedRowItem = [section, m.top.rowItemSelected[1]] - end if - end for + m.selectedRowItem = m.top.rowItemSelected m.top.selectedItem = m.top.content.getChild(m.top.rowItemSelected[0]).getChild(m.top.rowItemSelected[1]) diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts index eccdff59ec..54af561bfd 100644 --- a/locale/en_US/translations.ts +++ b/locale/en_US/translations.ts @@ -1231,5 +1231,15 @@ No Chapter Data Found Message shown in OSD when no chapter data is returned by the API + + Use Web's Home Section Arrangement + Use Web's Home Section Arrangement + User Setting - Setting title + + + Make the arrangement of the Roku home view sections match the web's home screen. Jellyfin will need to be closed and reopened for change to take effect. + Make the arrangement of the Roku home view sections match the web's home screen. Jellyfin will need to be closed and reopened for change to take effect. + User Setting - Setting description + \ No newline at end of file diff --git a/settings/settings.json b/settings/settings.json index 497202f625..bbe7138603 100644 --- a/settings/settings.json +++ b/settings/settings.json @@ -231,6 +231,13 @@ "settingName": "ui.home.splashBackground", "type": "bool", "default": "false" + }, + { + "title": "Use Web's Home Section Arrangement", + "description": "Make the arrangement of the Roku home view sections match the web's home screen. Jellyfin will need to be closed and reopened for change to take effect.", + "settingName": "ui.home.useWebSectionArrangement", + "type": "bool", + "default": "false" } ] }, diff --git a/source/utils/misc.bs b/source/utils/misc.bs index 3cb48ed96f..e9d2c5f808 100644 --- a/source/utils/misc.bs +++ b/source/utils/misc.bs @@ -459,6 +459,9 @@ sub startLoadingSpinner() end sub sub startMediaLoadingSpinner() + if not isValid(m.scene) + m.scene = m.top.getScene() + end if dialog = createObject("roSGNode", "ProgressDialog") dialog.id = "invisibiledialog" dialog.visible = false diff --git a/source/utils/session.bs b/source/utils/session.bs index d252661b0c..14518d355a 100644 --- a/source/utils/session.bs +++ b/source/utils/session.bs @@ -226,6 +226,20 @@ namespace session userPreferences = customPrefs rowTypes = [] + ' If this is a first time user, set the useWebSectionArrangement setting to true + ' This way the home view for upgrading users is not changed without them opting in + if not isValid(m.global.app.lastRunVersion) + set_user_setting("ui.home.useWebSectionArrangement", "true") + end if + + useWebSectionArrangement = m.global.session.user.settings["ui.home.useWebSectionArrangement"] + + if isValid(useWebSectionArrangement) + if not useWebSectionArrangement + userPreferences.delete("homesection0") + end if + end if + ' If user has no section preferences, use default settings if not userPreferences.doesExist("homesection0") userPreferences = { From 525485b78f62f31383c32682e1e858f044297c11 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Fri, 24 Nov 2023 22:27:28 +0000 Subject: [PATCH 39/82] Update API docs --- docs/api/source_migrations.bs.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/api/source_migrations.bs.html b/docs/api/source_migrations.bs.html index 44bb508fb9..e41682f0fa 100644 --- a/docs/api/source_migrations.bs.html +++ b/docs/api/source_migrations.bs.html @@ -18,6 +18,13 @@ ' no longer saving raw password to registry ' auth token and username are now stored in user settings and not global settings + ' enable remember me global setting for all devices whos last run version is < 2.0.0 + ' NOTE: remember me will be disabled for new installs + rememberMe = registry_read("global.rememberme", "Jellyfin") + if not isValid(rememberMe) + ' don't overwrite users current setting (dev installs) + set_setting("global.rememberme", "true") + end if ' migrate saved credentials for "active_user" if found savedUserId = get_setting("active_user") if isValid(savedUserId) From 48af6ba8f2b1217595168babd40467e8b80cf74d Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Fri, 24 Nov 2023 21:47:13 -0500 Subject: [PATCH 40/82] fix quickplay on recordings library --- source/utils/quickplay.bs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/source/utils/quickplay.bs b/source/utils/quickplay.bs index 8342bbaad6..970dfe6b07 100644 --- a/source/utils/quickplay.bs +++ b/source/utils/quickplay.bs @@ -276,13 +276,10 @@ namespace quickplay end sub ' A container with some kind of videos inside of it - ' Shuffle play all watched Episodes found inside sub videoContainer(itemNode as object) print "itemNode=", itemNode - includeItemTypes = "" collectionType = Lcase(itemNode.collectionType) if collectionType = "movies" - includeItemTypes = "Movie,Video" ' get randomized list of videos inside data = api.users.GetItemsByQuery(m.global.session.user.id, { "parentId": itemNode.id, @@ -307,14 +304,14 @@ namespace quickplay quickplay.pushToQueue(videoList) end if return - else if collectionType = "tvshows" - includeItemTypes = "Series" + 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", "recursive": true, - "includeItemTypes": includeItemTypes, + "excludeItemTypes": "Season", "imageTypeLimit": 0, "enableUserData": false, "EnableTotalRecordCount": false, @@ -324,7 +321,13 @@ namespace quickplay print "tvshowsData=", tvshowsData if isValid(tvshowsData) and isValidAndNotEmpty(tvshowsData.items) - quickplay.multipleSeries(tvshowsData.items) + ' the type of media returned from api may change. + if tvshowsData.items[0].Type = "Series" + quickplay.multipleSeries(tvshowsData.items) + else + ' if first item is not a series, then assume they are all videos and/or episodes + quickplay.pushToQueue(tvshowsData.items) + end if end if end if end sub From 3c883c046c4068d9360437b6f6a05afe0bd710e3 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Fri, 24 Nov 2023 22:00:01 -0500 Subject: [PATCH 41/82] stop spinners when no items are returned or there's an unknown type --- source/utils/quickplay.bs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/utils/quickplay.bs b/source/utils/quickplay.bs index 970dfe6b07..42d988721b 100644 --- a/source/utils/quickplay.bs +++ b/source/utils/quickplay.bs @@ -302,6 +302,8 @@ namespace quickplay end if end for quickplay.pushToQueue(videoList) + else + stopLoadingSpinner() end if return else if collectionType = "tvshows" or collectionType = "collectionfolder" @@ -328,7 +330,12 @@ namespace quickplay ' if first item is not a series, then assume they are all videos and/or episodes quickplay.pushToQueue(tvshowsData.items) end if + else + stopLoadingSpinner() end if + else + stopLoadingSpinner() + print "Quick Play videoContainer WARNING: Unknown collection type" end if end sub From b4d5a4e6d351344ea3eaa12fbe8464855a170151 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Fri, 24 Nov 2023 22:09:29 -0500 Subject: [PATCH 42/82] remove spinner when quickplay api queries return no results + fix recording library bug --- source/utils/quickplay.bs | 48 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/source/utils/quickplay.bs b/source/utils/quickplay.bs index a010a8ab82..99a72c6b2a 100644 --- a/source/utils/quickplay.bs +++ b/source/utils/quickplay.bs @@ -84,6 +84,8 @@ namespace quickplay photoPlayer.itemsArray = photoAlbumData.items photoPlayer.itemIndex = 0 m.global.sceneManager.callfunc("pushScene", photoPlayer) + else + stopLoadingSpinner() end if end sub @@ -103,6 +105,8 @@ namespace quickplay }) if isValid(albumSongs) and isValidAndNotEmpty(albumSongs.items) quickplay.pushToQueue(albumSongs.items) + else + stopLoadingSpinner() end if end sub @@ -126,6 +130,8 @@ namespace quickplay if isValid(artistSongs) and isValidAndNotEmpty(artistSongs.items) quickplay.pushToQueue(artistSongs.items, true) + else + stopLoadingSpinner() end if end sub @@ -142,6 +148,8 @@ namespace quickplay }) if isValid(data) and isValidAndNotEmpty(data.Items) quickplay.pushToQueue(data.items) + else + stopLoadingSpinner() end if end sub @@ -197,6 +205,8 @@ namespace quickplay if isValid(data) and isValidAndNotEmpty(data.Items) ' add all episodes found to a playlist quickplay.pushToQueue(data.Items) + else + stopLoadingSpinner() end if end if end if @@ -240,6 +250,8 @@ namespace quickplay end for if m.global.queueManager.callFunc("getCount") > 1 m.global.queueManager.callFunc("toggleShuffle") + else + stopLoadingSpinner() end if end if end sub @@ -305,6 +317,8 @@ namespace quickplay end if end if end if + else + stopLoadingSpinner() end if end sub @@ -345,6 +359,8 @@ namespace quickplay if m.global.queueManager.callFunc("getCount") > 1 m.global.queueManager.callFunc("toggleShuffle") + else + stopLoadingSpinner() end if end sub @@ -352,8 +368,8 @@ namespace quickplay sub tvChannel(itemNode as object) if not isValid(itemNode) or not isValid(itemNode.id) then return - stopLoadingSpinner() group = CreateVideoPlayerGroup(itemNode.id) + stopLoadingSpinner() m.global.sceneManager.callFunc("pushScene", group) end sub @@ -361,8 +377,8 @@ namespace quickplay 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) + stopLoadingSpinner() m.global.sceneManager.callFunc("pushScene", group) end sub @@ -383,6 +399,8 @@ namespace quickplay if m.global.queueManager.callFunc("getCount") > 1 m.global.queueManager.callFunc("toggleShuffle") end if + else + stopLoadingSpinner() end if end sub @@ -451,6 +469,8 @@ namespace quickplay quickplay.pushToQueue(folderData.items, true) end if end if + else + stopLoadingSpinner() end if end sub @@ -484,6 +504,8 @@ namespace quickplay end if end for quickplay.pushToQueue(movieList) + else + stopLoadingSpinner() end if else if collectionType = "music" ' get audio files from under this collection @@ -501,6 +523,8 @@ namespace quickplay print "songsData=", songsData if isValid(songsData) and isValidAndNotEmpty(songsData.items) quickplay.pushToQueue(songsData.Items, true) + else + stopLoadingSpinner() end if else if collectionType = "boxsets" ' get list of all boxsets inside @@ -529,6 +553,8 @@ namespace quickplay if isValid(boxsetData) and isValidAndNotEmpty(boxsetData.items) ' add all boxset items to queue quickplay.pushToQueue(boxsetData.Items) + else + stopLoadingSpinner() end if end if else if collectionType = "tvshows" or collectionType = "collectionfolder" @@ -545,7 +571,15 @@ namespace quickplay print "tvshowsData=", tvshowsData if isValid(tvshowsData) and isValidAndNotEmpty(tvshowsData.items) - quickplay.multipleSeries(tvshowsData.items) + ' the type of media returned from api may change. + if tvshowsData.items[0].Type = "Series" + quickplay.multipleSeries(tvshowsData.items) + else + ' if first item is not a series, then assume they are all videos and/or episodes + quickplay.pushToQueue(tvshowsData.items) + end if + else + stopLoadingSpinner() end if else if collectionType = "musicvideos" ' get randomized list of videos inside @@ -562,6 +596,8 @@ namespace quickplay print "data=", data if isValid(data) and isValidAndNotEmpty(data.items) quickplay.pushToQueue(data.Items) + else + stopLoadingSpinner() end if else if collectionType = "homevideos" ' Photo library - items can be type video, photo, or photoAlbum @@ -582,6 +618,8 @@ namespace quickplay photoPlayer.itemsArray = folderData.items photoPlayer.itemIndex = 0 m.global.sceneManager.callfunc("pushScene", photoPlayer) + else + stopLoadingSpinner() end if else stopLoadingSpinner() @@ -622,6 +660,8 @@ namespace quickplay ' validate api results if isValid(playlistItems) and isValidAndNotEmpty(playlistItems.items) quickplay.pushToQueue(playlistItems.items, true) + else + stopLoadingSpinner() end if end if else if collectionType = "livetv" @@ -644,6 +684,8 @@ namespace quickplay print "myChannel=", myChannel ' play channel quickplay.tvChannel(myChannel) + else + stopLoadingSpinner() end if else stopLoadingSpinner() From 8c703a8dc3aacfc3ef58c7b5b141a7e09ea2f718 Mon Sep 17 00:00:00 2001 From: Arturo Cuya Date: Sun, 26 Nov 2023 11:52:02 -0500 Subject: [PATCH 43/82] use `type=module` in package.json to allow for import statements in future scripts --- package.json | 5 +++-- scripts/{ropm-hook.js => ropm-hook.cjs} | 0 2 files changed, 3 insertions(+), 2 deletions(-) rename scripts/{ropm-hook.js => ropm-hook.cjs} (100%) diff --git a/package.json b/package.json index 38e84d6cf5..85429e1f99 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "jellyfin-roku", + "type": "module", "version": "1.6.6", "description": "Roku app for Jellyfin media server", "dependencies": { @@ -37,7 +38,7 @@ "lint-markdown": "markdownlint-cli2 \"**/*.md\" \"#node_modules\"", "lint-spelling": "spellchecker -d dictionary.txt --files \"**/*.md\" \"**/.*/**/*.md\" \"!node_modules/**/*.md\"", "postinstall": "npm run ropm", - "ropm": "ropm copy && node scripts/ropm-hook.js", + "ropm": "ropm copy && node scripts/ropm-hook.cjs", "validate": "npx bsc --copy-to-staging=false --create-package=false" }, "repository": { @@ -54,4 +55,4 @@ "url": "https://github.com/jellyfin/jellyfin-roku/issues" }, "homepage": "https://github.com/jellyfin/jellyfin-roku" -} +} \ No newline at end of file diff --git a/scripts/ropm-hook.js b/scripts/ropm-hook.cjs similarity index 100% rename from scripts/ropm-hook.js rename to scripts/ropm-hook.cjs From 40925199d46657ee60c3c111bf6d1978e0eb44fc Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 25 Nov 2023 08:25:31 -0500 Subject: [PATCH 44/82] Review Updates & Bug Fix Fix Roku component reuse bug Don't repeat loadingTimer Move ImageSizes enum to source folder Update setting text & translation Check selectedRowItem is valid and not empty --- components/home/HomeItem.bs | 1 + components/home/HomeRows.bs | 33 +++++++++---------- locale/en_US/translations.ts | 8 ++--- settings/settings.json | 6 ++-- .../constants}/ImageSizes.bs | 4 ++- source/migrations.bs | 8 +++++ source/utils/session.bs | 6 ---- 7 files changed, 35 insertions(+), 31 deletions(-) rename {components => source/constants}/ImageSizes.bs (54%) diff --git a/components/home/HomeItem.bs b/components/home/HomeItem.bs index ff84644d26..882f6b5f50 100644 --- a/components/home/HomeItem.bs +++ b/components/home/HomeItem.bs @@ -28,6 +28,7 @@ end sub sub itemContentChanged() + m.unplayedCount.visible = false itemData = m.top.itemContent if itemData = invalid then return diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index f5895e88c6..a611ebcf13 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -1,5 +1,5 @@ import "pkg:/source/utils/misc.bs" -import "pkg:/components/ImageSizes.bs" +import "pkg:/source/constants/ImageSizes.bs" ' The maximum number of seconds we will show the loading spinner and delay the user from using the home view while the content loads ' We use this to wait for the rows to load so we can reset focus to the row/item once it loads @@ -21,7 +21,6 @@ sub init() m.loadingTimer = createObject("roSGNode", "Timer") m.loadingTimer.duration = MAX_TIME_HOME_LOADING_SPINNER_SHOWN - m.loadingTimer.repeat = true m.loadingTimer.observeField("fire", "stopLoadingSpinner") updateSize() @@ -308,6 +307,7 @@ end sub ' Update home row data sub updateHomeRows() startMediaLoadingSpinner() + m.loadingTimer.control = "start" content = processUserSections() setRowItemSizes() m.top.content = content @@ -454,6 +454,7 @@ sub updateLatestItems(msg) row = CreateObject("roSGNode", "HomeRow") row.title = tr("Latest in") + " " + node.metadata.title + " >" row.usePoster = true + ' Handle specific types with different item widths if node.metadata.contentType = "movies" row.imageWidth = imageSizes.MOVIE_POSTER[0] @@ -524,21 +525,19 @@ end sub ' setFocusToPreviousFocusedItem: Sets the cursor focus to the row and item previously selected ' sub setFocusToPreviousFocusedItem() - m.loadingTimer.control = "start" - - if isValid(m.selectedRowItem) - ' Set focus to row if it exists - itemRow = m.top.content.getChild(m.top.rowItemSelected[0]) - if isValid(itemRow) - m.top.jumpToItem = m.top.rowItemSelected[0] - - ' Set focus to column if it exists - itemColumn = itemRow.getChild(m.top.rowItemSelected[1]) - if isValid(itemColumn) - m.top.jumpToRowItem = [m.selectedRowItem[0], m.selectedRowItem[1]] - m.loadingTimer.control = "stop" - stopLoadingSpinner() - end if + if not isValidAndNotEmpty(m.selectedRowItem) then return + + ' Set focus to row if it exists + itemRow = m.top.content.getChild(m.selectedRowItem[0]) + if isValid(itemRow) + m.top.jumpToItem = m.selectedRowItem[0] + + ' Set focus to column if it exists + itemColumn = itemRow.getChild(m.selectedRowItem[1]) + if isValid(itemColumn) + m.top.jumpToRowItem = [m.selectedRowItem[0], m.selectedRowItem[1]] + m.loadingTimer.control = "stop" + stopLoadingSpinner() end if end if end sub diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts index 54af561bfd..1fe478489d 100644 --- a/locale/en_US/translations.ts +++ b/locale/en_US/translations.ts @@ -1232,13 +1232,13 @@ Message shown in OSD when no chapter data is returned by the API - Use Web's Home Section Arrangement - Use Web's Home Section Arrangement + Use Web Client's Home Section Arrangement + Use Web Client's Home Section Arrangement User Setting - Setting title - Make the arrangement of the Roku home view sections match the web's home screen. Jellyfin will need to be closed and reopened for change to take effect. - Make the arrangement of the Roku home view sections match the web's home screen. Jellyfin will need to be closed and reopened for change to take effect. + Make the arrangement of the Roku home view sections match the web client's home screen. Jellyfin will need to be closed and reopened for change to take effect. + Make the arrangement of the Roku home view sections match the web client's home screen. Jellyfin will need to be closed and reopened for change to take effect. User Setting - Setting description diff --git a/settings/settings.json b/settings/settings.json index bbe7138603..9c33a6b01c 100644 --- a/settings/settings.json +++ b/settings/settings.json @@ -233,11 +233,11 @@ "default": "false" }, { - "title": "Use Web's Home Section Arrangement", - "description": "Make the arrangement of the Roku home view sections match the web's home screen. Jellyfin will need to be closed and reopened for change to take effect.", + "title": "Use Web Client's Home Section Arrangement", + "description": "Make the arrangement of the Roku home view sections match the web client's home screen. Jellyfin will need to be closed and reopened for change to take effect.", "settingName": "ui.home.useWebSectionArrangement", "type": "bool", - "default": "false" + "default": "true" } ] }, diff --git a/components/ImageSizes.bs b/source/constants/ImageSizes.bs similarity index 54% rename from components/ImageSizes.bs rename to source/constants/ImageSizes.bs index 2371a30fc8..2e3df0b774 100644 --- a/components/ImageSizes.bs +++ b/source/constants/ImageSizes.bs @@ -1,5 +1,7 @@ +' @fileoverview Constants for various image sizes. + namespace imageSizes const WIDE_POSTER = [464, 331] - const MOVIE_POSTER = [188, 331] + const MOVIE_POSTER = [180, 331] const MUSIC_ALBUM = [261, 331] end namespace diff --git a/source/migrations.bs b/source/migrations.bs index 70cec93f98..201ffc66ca 100644 --- a/source/migrations.bs +++ b/source/migrations.bs @@ -72,6 +72,14 @@ sub runRegistryUserMigrations() m.wasMigrated = true print `Running Registry Migration for ${CLIENT_VERSION_REQUIRING_BASE_MIGRATION} for userid: ${section}` + ' If this is an existing user, set the useWebSectionArrangement setting to false + ' This way the home view for upgrading users is not changed without them opting in + useWebSectionArrangement = registry_read("ui.home.useWebSectionArrangement", section) + + if not isValid(useWebSectionArrangement) + registry_write("ui.home.useWebSectionArrangement", "false", section) + end if + ' no longer saving password to registry registry_delete("password", section) ' av1 playback no longer hidden behind user setting diff --git a/source/utils/session.bs b/source/utils/session.bs index 14518d355a..f6eee976d1 100644 --- a/source/utils/session.bs +++ b/source/utils/session.bs @@ -226,12 +226,6 @@ namespace session userPreferences = customPrefs rowTypes = [] - ' If this is a first time user, set the useWebSectionArrangement setting to true - ' This way the home view for upgrading users is not changed without them opting in - if not isValid(m.global.app.lastRunVersion) - set_user_setting("ui.home.useWebSectionArrangement", "true") - end if - useWebSectionArrangement = m.global.session.user.settings["ui.home.useWebSectionArrangement"] if isValid(useWebSectionArrangement) From 47781b77d7c834217026646f24606c11b93eb5a3 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sun, 26 Nov 2023 15:48:50 -0500 Subject: [PATCH 45/82] Fix 1st run setting --- source/migrations.bs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/migrations.bs b/source/migrations.bs index 201ffc66ca..19182e90e3 100644 --- a/source/migrations.bs +++ b/source/migrations.bs @@ -74,9 +74,8 @@ sub runRegistryUserMigrations() ' If this is an existing user, set the useWebSectionArrangement setting to false ' This way the home view for upgrading users is not changed without them opting in - useWebSectionArrangement = registry_read("ui.home.useWebSectionArrangement", section) - - if not isValid(useWebSectionArrangement) + if not hasUserVersion + print "useWebSectionArrangement set to false" registry_write("ui.home.useWebSectionArrangement", "false", section) end if From f1da07ea6e47550c86a5c987c04d6abd199721bd Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Mon, 27 Nov 2023 17:14:19 -0500 Subject: [PATCH 46/82] Rename ImageSizes file to match actual use --- components/home/HomeRows.bs | 36 +++++++++---------- .../{ImageSizes.bs => HomeRowItemSizes.bs} | 4 +-- 2 files changed, 20 insertions(+), 20 deletions(-) rename source/constants/{ImageSizes.bs => HomeRowItemSizes.bs} (58%) diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index a611ebcf13..ff2abb236b 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -1,5 +1,5 @@ import "pkg:/source/utils/misc.bs" -import "pkg:/source/constants/ImageSizes.bs" +import "pkg:/source/constants/HomeRowItemSizes.bs" ' The maximum number of seconds we will show the loading spinner and delay the user from using the home view while the content loads ' We use this to wait for the rows to load so we can reset focus to the row/item once it loads @@ -199,7 +199,7 @@ sub createLibraryRow(content as dynamic) mediaRow.title = tr("My Media") m.homeSections.AddReplace("library", { - imageSize: imageSizes.WIDE_POSTER, + imageSize: homeRowItemSizes.WIDE_POSTER, index: m.homeSections.count() }) @@ -221,12 +221,12 @@ sub createLatestInRows(content as dynamic) latestInRow = content.CreateChild("HomeRow") latestInRow.title = tr("Latest in") + " " + lib.name + " >" - imagesize = imageSizes.WIDE_POSTER + imagesize = homeRowItemSizes.WIDE_POSTER if LCase(lib.collectionType) = "movies" - imagesize = imageSizes.MOVIE_POSTER + imagesize = homeRowItemSizes.MOVIE_POSTER else if LCase(lib.collectionType) = "music" - imagesize = imageSizes.MUSIC_ALBUM + imagesize = homeRowItemSizes.MUSIC_ALBUM end if m.homeSections.AddReplace("latestin" + LCase(lib.name).Replace(" ", ""), { @@ -253,7 +253,7 @@ sub createLiveTVRow(content as dynamic) contentRow = content.CreateChild("HomeRow") contentRow.title = tr("On Now") m.homeSections.AddReplace("livetv", { - imageSize: imageSizes.WIDE_POSTER, + imageSize: homeRowItemSizes.WIDE_POSTER, index: m.homeSections.count() }) @@ -266,7 +266,7 @@ sub createContinueWatchingRow(content as dynamic) continueWatchingRow = content.CreateChild("HomeRow") continueWatchingRow.title = tr("Continue Watching") m.homeSections.AddReplace("resume", { - imageSize: imageSizes.WIDE_POSTER, + imageSize: homeRowItemSizes.WIDE_POSTER, index: m.homeSections.count() }) @@ -280,7 +280,7 @@ sub createNextUpRow(content as dynamic) nextUpRow = content.CreateChild("HomeRow") nextUpRow.title = tr("Next Up >") m.homeSections.AddReplace("nextup", { - imageSize: imageSizes.WIDE_POSTER, + imageSize: homeRowItemSizes.WIDE_POSTER, index: m.homeSections.count() }) @@ -295,7 +295,7 @@ sub createFavoritesRow(content as dynamic) favoritesRow.title = tr("Favorites") m.homeSections.AddReplace("favorites", { - imageSize: imageSizes.WIDE_POSTER, + imageSize: homeRowItemSizes.WIDE_POSTER, index: m.homeSections.count() }) @@ -457,14 +457,14 @@ sub updateLatestItems(msg) ' Handle specific types with different item widths if node.metadata.contentType = "movies" - row.imageWidth = imageSizes.MOVIE_POSTER[0] - itemSize = imageSizes.MOVIE_POSTER + row.imageWidth = homeRowItemSizes.MOVIE_POSTER[0] + itemSize = homeRowItemSizes.MOVIE_POSTER else if node.metadata.contentType = "music" - row.imageWidth = imageSizes.MUSIC_ALBUM[0] - itemSize = imageSizes.MUSIC_ALBUM + row.imageWidth = homeRowItemSizes.MUSIC_ALBUM[0] + itemSize = homeRowItemSizes.MUSIC_ALBUM else - row.imageWidth = imageSizes.WIDE_POSTER[0] - itemSize = imageSizes.WIDE_POSTER + row.imageWidth = homeRowItemSizes.WIDE_POSTER[0] + itemSize = homeRowItemSizes.WIDE_POSTER end if for each item in itemData @@ -556,16 +556,16 @@ sub updateOnNowItems() ' remake row using the new data row = CreateObject("roSGNode", "HomeRow") row.title = tr("On Now") - row.imageWidth = imageSizes.WIDE_POSTER[0] + row.imageWidth = homeRowItemSizes.WIDE_POSTER[0] for each item in itemData row.usePoster = false if (not isValid(item.thumbnailURL) or item.thumbnailURL = "") and isValid(item.json) and isValid(item.json.imageURL) item.thumbnailURL = item.json.imageURL row.usePoster = true - row.imageWidth = imageSizes.MOVIE_POSTER[0] + row.imageWidth = homeRowItemSizes.MOVIE_POSTER[0] - m.homeSections.livetv.imageSize = imageSizes.MOVIE_POSTER + m.homeSections.livetv.imageSize = homeRowItemSizes.MOVIE_POSTER end if item.usePoster = row.usePoster diff --git a/source/constants/ImageSizes.bs b/source/constants/HomeRowItemSizes.bs similarity index 58% rename from source/constants/ImageSizes.bs rename to source/constants/HomeRowItemSizes.bs index 2e3df0b774..9ee0690a3b 100644 --- a/source/constants/ImageSizes.bs +++ b/source/constants/HomeRowItemSizes.bs @@ -1,6 +1,6 @@ -' @fileoverview Constants for various image sizes. +' @fileoverview Constants for rowItemSize on the home view -namespace imageSizes +namespace homeRowItemSizes const WIDE_POSTER = [464, 331] const MOVIE_POSTER = [180, 331] const MUSIC_ALBUM = [261, 331] From b185c08c0cd45f8739c733d5454f493b79a58b51 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Mon, 27 Nov 2023 20:08:16 -0500 Subject: [PATCH 47/82] Fix 1st time setting bug Fix by Cewert --- source/migrations.bs | 5 ----- source/utils/session.bs | 5 ++++- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/source/migrations.bs b/source/migrations.bs index 19182e90e3..58660b813e 100644 --- a/source/migrations.bs +++ b/source/migrations.bs @@ -84,11 +84,6 @@ sub runRegistryUserMigrations() ' av1 playback no longer hidden behind user setting registry_delete("playback.av1", section) end if - - ' update lastRunVersion if needed - if hasUserVersion and lastRunVersion <> m.global.app.version - registry_write("LastRunVersion", m.global.app.version, section) - end if end if end for end sub diff --git a/source/utils/session.bs b/source/utils/session.bs index f6eee976d1..c87f3c496c 100644 --- a/source/utils/session.bs +++ b/source/utils/session.bs @@ -156,8 +156,11 @@ namespace session ' grab lastRunVersion for this user lastRunVersion = get_user_setting("LastRunVersion") - if lastRunVersion <> invalid + if isValid(lastRunVersion) and lastRunVersion = m.global.app.version + ' Don't update the registry, only update the global session session.user.Update("LastRunVersion", lastRunVersion) + else + set_user_setting("LastRunVersion", m.global.app.version) end if ' update user session settings with values from registry From a8256c257627ea354ab55279b2cf65e28a6da87a Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 28 Nov 2023 16:32:57 -0500 Subject: [PATCH 48/82] address reviewer feedback Co-authored-by: 1hitsong <3330318+1hitsong@users.noreply.github.com> --- source/utils/quickplay.bs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/utils/quickplay.bs b/source/utils/quickplay.bs index 99a72c6b2a..429b5a642b 100644 --- a/source/utils/quickplay.bs +++ b/source/utils/quickplay.bs @@ -572,7 +572,7 @@ namespace quickplay if isValid(tvshowsData) and isValidAndNotEmpty(tvshowsData.items) ' the type of media returned from api may change. - if tvshowsData.items[0].Type = "Series" + if LCase(tvshowsData.items[0].Type) = "series" quickplay.multipleSeries(tvshowsData.items) else ' if first item is not a series, then assume they are all videos and/or episodes From fd1b424e4746e27b9b5a93543cbecad3254ebce6 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 28 Nov 2023 22:13:44 -0500 Subject: [PATCH 49/82] quickplay a season from the start when the episodes have no index (recordings) --- source/utils/quickplay.bs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/utils/quickplay.bs b/source/utils/quickplay.bs index 42d988721b..8d284af6ca 100644 --- a/source/utils/quickplay.bs +++ b/source/utils/quickplay.bs @@ -358,7 +358,7 @@ namespace quickplay for each item in unwatchedData.Items if isValid(item.UserData) if isValid(item.UserData.Played) and item.UserData.Played = false - firstUnwatchedEpisodeIndex = item.IndexNumber - 1 + firstUnwatchedEpisodeIndex = isValid(item.IndexNumber) ? item.IndexNumber - 1 : 0 if isValid(item.UserData.PlaybackPositionTicks) item.startingPoint = item.UserData.PlaybackPositionTicks end if From 39b4e6db19562aadf696881be7dbac0a7e707b3b Mon Sep 17 00:00:00 2001 From: photonconvergence <116527579+photonconvergence@users.noreply.github.com> Date: Tue, 28 Nov 2023 21:09:36 -0800 Subject: [PATCH 50/82] round corner --- components/ItemGrid/GridItem.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ItemGrid/GridItem.xml b/components/ItemGrid/GridItem.xml index 2bd177c8da..51cbd96557 100644 --- a/components/ItemGrid/GridItem.xml +++ b/components/ItemGrid/GridItem.xml @@ -4,7 +4,7 @@ - + From 6ec89e127e25f9a1f4a8b32f9a345a8f39d45498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dr=2E=20M=C3=BCcke?= Date: Wed, 29 Nov 2023 10:49:40 +0000 Subject: [PATCH 51/82] Translated using Weblate (German) Currently translated at 42.8% (117 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/de/ --- locale/de_DE/translations.ts | 108 +++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts index 7103a9c426..bcfa5dc52c 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -13403,5 +13403,113 @@ Endete um (Past Tense) For defining time when a program will ended (e.g. Ended at 08:00) + + Repeat + Wiederholung + If TV Shows has previously been broadcasted + + + Cancel Series Recording + Serienaufnahme abbrechen + + + MPEG-2 + MPEG-2 + Name of codec used in settings menu + + + Cancel Recording + Aufnahme abbrechen + + + Playback + Wiedergabe + Title for Playback section in user setting screen. + + + Record Series + Serie aufnehmen + + + Pick a Jellyfin server from the local network + Einen Jellyfin-Server im lokalen Netzwerk auswählen: + Instructions on initial app launch when the user is asked to pick a server from a list + + + Version + Version + + + Error Getting Playback Information + Fehler beim Übertragen der Wiedergabeinformationen + Dialog Title: Received error from server when trying to get information about the selected item for playback + + + TV Guide + TV-Programm + Menu option for showing Live TV Guide / Schedule + + + Channels + Kanäle + Menu option for showing Live TV Channel List + + + View Channel + Kanal ansehen + + + Codec Support + Codec-Support + Settings Menu - Title for settings group related to codec support + + + ...or enter server URL manually: + Wenn kein Server angeführt wird, kann die Serveradresse auch manuell angegeben werden: + Instructions on initial app launch when the user is asked to manually enter a server URL + + + Unknown + Unbekannt + Title for a cast member for which we have no information for + + + Not found + Nicht gefunden + Title of message box when the requested content is not found on the server + + + An error was encountered while playing this item. Server did not provide required transcoding data. + Bei der Wiedergabe trat ein Fehler auf. Der Server hat die benötigten Transcodinginformationen nicht übermittelt. + Content of message box when trying to play an item which requires transcoding, and the server did not provide transcode url + + + Enable or disable Direct Play for optional codecs + Direkte Wiedergabe für optionale Codecs aktivieren oder deaktivieren + Settings Menu - Title for settings group related to codec support + + + Connecting to Server + Verbinde mit Server + Message to display to user while client is attempting to connect to the server + + + Enter the server name or IP address + Hostnamen oder IP-Adresse des Servers angeben + Title of KeyboardDialog when manually entering a server URL + + + Record + Aufnehmen + + + Close + Schließen + + + The requested content does not exist on the server + Der gewünschte Inhalt existiert nicht auf dem Server + Content of message box when the requested content is not found on the server + From 45ef835a93d1931614564a9833f80cbb75c7b8a3 Mon Sep 17 00:00:00 2001 From: emmanuel billeaud Date: Wed, 29 Nov 2023 09:43:27 +0000 Subject: [PATCH 52/82] Translated using Weblate (French) Currently translated at 15.3% (42 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/fr/ --- locale/fr/translations.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/locale/fr/translations.ts b/locale/fr/translations.ts index 113b452fc2..b44578e40a 100644 --- a/locale/fr/translations.ts +++ b/locale/fr/translations.ts @@ -10625,5 +10625,15 @@ Age Âge + + Error During Playback + Erreur lors de la lecture + Dialog title when error occurs during playback + + + Error Retrieving Content + Erreur lors de la récupération du contenu + Dialog title when unable to load Content from Server + From c3566a4dd59370ec4b2baecd35e9f65a5a97bb1e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:55:59 +0000 Subject: [PATCH 53/82] Update actions/setup-java action to v4 --- .github/workflows/roku-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/roku-analysis.yml b/.github/workflows/roku-analysis.yml index 97a19d5353..d83efb9f15 100644 --- a/.github/workflows/roku-analysis.yml +++ b/.github/workflows/roku-analysis.yml @@ -27,7 +27,7 @@ jobs: if: env.BRANCH_NAME == 'master' run: npm run build-prod - name: Use Java 17 - uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0 # v3 + uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93 # v4 with: distribution: "temurin" java-version: "17" From b3834bd60df8a56a6aa3c9e369f04eb0aa5d3dc3 Mon Sep 17 00:00:00 2001 From: DJSweder Date: Wed, 29 Nov 2023 16:59:29 +0000 Subject: [PATCH 54/82] Translated using Weblate (Czech) Currently translated at 17.2% (47 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/cs/ --- locale/cs/translations.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/locale/cs/translations.ts b/locale/cs/translations.ts index d1a1a55b69..ae440f868d 100644 --- a/locale/cs/translations.ts +++ b/locale/cs/translations.ts @@ -4515,5 +4515,9 @@ On Now Nyní + + Save Credentials? + Uložit přihlašovací údaje? + From d6b50440d4f6b1ba4817f7263012389dc9ec7c82 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Wed, 29 Nov 2023 16:06:54 -0500 Subject: [PATCH 55/82] Fix refresh delay --- components/home/HomeRows.bs | 245 ++++++++++++++++-------------------- 1 file changed, 109 insertions(+), 136 deletions(-) diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index ff2abb236b..f3a4aa2c8a 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -1,10 +1,6 @@ import "pkg:/source/utils/misc.bs" import "pkg:/source/constants/HomeRowItemSizes.bs" -' The maximum number of seconds we will show the loading spinner and delay the user from using the home view while the content loads -' We use this to wait for the rows to load so we can reset focus to the row/item once it loads -const MAX_TIME_HOME_LOADING_SPINNER_SHOWN = 1 - sub init() m.top.itemComponentName = "HomeItem" ' how many rows are visible on the screen @@ -19,10 +15,6 @@ sub init() m.homeSections = {} - m.loadingTimer = createObject("roSGNode", "Timer") - m.loadingTimer.duration = MAX_TIME_HOME_LOADING_SPINNER_SHOWN - m.loadingTimer.observeField("fire", "stopLoadingSpinner") - updateSize() m.top.setfocus(true) @@ -71,8 +63,6 @@ end sub ' ' @return {dynamic} content node filled with child nodes for each row function processUserSections() as dynamic - m.homeSections = {} - loadedSections = 0 content = CreateObject("roSGNode", "ContentNode") @@ -124,13 +114,14 @@ sub removeHomeSection(sectionType as string) if not isValid(removedSection) then return if not isValid(removedSection.index) then return + m.homeSections.Delete(sectionName) + for each section in m.homeSections if m.homeSections[section].index > removedSection.index m.homeSections[section].index-- end if end for - m.homeSections.Delete(sectionName) m.top.content.removeChildIndex(removedSection.index) setRowItemSizes() @@ -198,15 +189,31 @@ sub createLibraryRow(content as dynamic) mediaRow = content.CreateChild("HomeRow") mediaRow.title = tr("My Media") + sectionIndex = m.homeSections.count() + + isUpdate = false + + if m.homeSections.doesExist("library") + sectionIndex = m.homeSections.library.index + isUpdate = true + end if + m.homeSections.AddReplace("library", { imageSize: homeRowItemSizes.WIDE_POSTER, - index: m.homeSections.count() + index: sectionIndex }) filteredMedia = filterNodeArray(m.libraryData, "id", m.global.session.user.configuration.MyMediaExcludes) for each item in filteredMedia mediaRow.appendChild(item) end for + + if isUpdate + m.top.content.replaceChild(mediaRow, m.homeSections.library.index) + return + end if + + content.appendChild(mediaRow) end sub ' Create a row displaying latest items in each of the user's libraries @@ -218,8 +225,16 @@ sub createLatestInRows(content as dynamic) filteredLatest = filterNodeArray(m.libraryData, "id", m.global.session.user.configuration.LatestItemsExcludes) for each lib in filteredLatest if lib.collectionType <> "boxsets" and lib.collectionType <> "livetv" and lib.json.CollectionType <> "Program" - latestInRow = content.CreateChild("HomeRow") - latestInRow.title = tr("Latest in") + " " + lib.name + " >" + + sectionName = "latestin" + LCase(lib.name).Replace(" ", "") + + if not m.homeSections.doesExist(sectionName) + latestInRow = content.CreateChild("HomeRow") + latestInRow.title = tr("Latest in") + " " + lib.name + " >" + sectionIndex = m.homeSections.count() + else + sectionIndex = m.homeSections[sectionName].index + end if imagesize = homeRowItemSizes.WIDE_POSTER @@ -229,9 +244,9 @@ sub createLatestInRows(content as dynamic) imagesize = homeRowItemSizes.MUSIC_ALBUM end if - m.homeSections.AddReplace("latestin" + LCase(lib.name).Replace(" ", ""), { + m.homeSections.AddReplace(sectionName, { imageSize: imagesize, - index: m.homeSections.count() + index: sectionIndex }) loadLatest = createObject("roSGNode", "LoadItemsTask") @@ -250,11 +265,20 @@ end sub ' Create a row displaying the live tv now on section sub createLiveTVRow(content as dynamic) - contentRow = content.CreateChild("HomeRow") - contentRow.title = tr("On Now") + if not m.homeSections.doesExist("livetv") + contentRow = content.CreateChild("HomeRow") + contentRow.title = tr("On Now") + end if + + sectionIndex = m.homeSections.count() + + if m.homeSections.doesExist("livetv") + sectionIndex = m.homeSections.livetv.index + end if + m.homeSections.AddReplace("livetv", { imageSize: homeRowItemSizes.WIDE_POSTER, - index: m.homeSections.count() + index: sectionIndex }) m.LoadOnNowTask.observeField("content", "updateOnNowItems") @@ -263,11 +287,19 @@ end sub ' Create a row displaying items the user can continue watching sub createContinueWatchingRow(content as dynamic) - continueWatchingRow = content.CreateChild("HomeRow") - continueWatchingRow.title = tr("Continue Watching") + if not m.homeSections.doesExist("resume") + continueWatchingRow = content.CreateChild("HomeRow") + continueWatchingRow.title = tr("Continue Watching") + end if + sectionIndex = m.homeSections.count() + + if m.homeSections.doesExist("resume") + sectionIndex = m.homeSections.resume.index + end if + m.homeSections.AddReplace("resume", { imageSize: homeRowItemSizes.WIDE_POSTER, - index: m.homeSections.count() + index: sectionIndex }) ' Load the Continue Watching Data @@ -277,11 +309,19 @@ end sub ' Create a row displaying next episodes up to watch sub createNextUpRow(content as dynamic) - nextUpRow = content.CreateChild("HomeRow") - nextUpRow.title = tr("Next Up >") + if not m.homeSections.doesExist("nextup") + nextUpRow = content.CreateChild("HomeRow") + nextUpRow.title = tr("Next Up >") + end if + sectionIndex = m.homeSections.count() + + if m.homeSections.doesExist("nextup") + sectionIndex = m.homeSections.nextup.index + end if + m.homeSections.AddReplace("nextup", { imageSize: homeRowItemSizes.WIDE_POSTER, - index: m.homeSections.count() + index: sectionIndex }) ' Load the Next Up Data @@ -291,12 +331,20 @@ end sub ' Create a row displaying items from the user's favorites list sub createFavoritesRow(content as dynamic) - favoritesRow = content.CreateChild("HomeRow") - favoritesRow.title = tr("Favorites") + if not m.homeSections.doesExist("favorites") + favoritesRow = content.CreateChild("HomeRow") + favoritesRow.title = tr("Favorites") + end if + + sectionIndex = m.homeSections.count() + + if m.homeSections.doesExist("favorites") + sectionIndex = m.homeSections.favorites.index + end if m.homeSections.AddReplace("favorites", { imageSize: homeRowItemSizes.WIDE_POSTER, - index: m.homeSections.count() + index: sectionIndex }) ' Load the Favorites Data @@ -306,11 +354,8 @@ end sub ' Update home row data sub updateHomeRows() - startMediaLoadingSpinner() - m.loadingTimer.control = "start" - content = processUserSections() + processUserSections() setRowItemSizes() - m.top.content = content end sub sub updateFavoritesItems() @@ -342,11 +387,19 @@ sub updateFavoritesItems() row.appendChild(item) end for - ' replace the old row - m.top.content.replaceChild(row, rowIndex) - ' Set focus on previously focused item - setFocusToPreviousFocusedItem() + if isValid(m.top.content.getChild(rowIndex)) + m.top.content.replaceChild(row, rowIndex) + else + for each section in m.homeSections + if m.homeSections[section].index >= m.top.content.getChildCount() + m.homeSections[section].index++ + end if + end for + + m.homeSections.favorites.index = m.top.content.getChildCount() + m.top.content.insertChild(row, m.top.content.getChildCount()) + end if end if end sub @@ -378,8 +431,6 @@ sub updateContinueWatchingItems() ' replace the old row m.top.content.replaceChild(row, m.homeSections.resume.index) - ' Set focus on previously focused item - setFocusToPreviousFocusedItem() end sub sub updateNextUpItems() @@ -405,36 +456,9 @@ sub updateNextUpItems() ' replace the old row m.top.content.replaceChild(row, m.homeSections.nextup.index) - ' Set focus on previously focused item - setFocusToPreviousFocusedItem() end if end sub -' Iterate over user's libraries and update data for each Latest In section -sub updateLatestInRows() - ' Ensure we have data - if not isValidAndNotEmpty(m.libraryData) then return - - ' Load new data for each library - filteredLatest = filterNodeArray(m.libraryData, "id", m.global.session.user.configuration.LatestItemsExcludes) - for each lib in filteredLatest - if lib.collectionType <> "boxsets" and lib.collectionType <> "livetv" and lib.json.CollectionType <> "Program" - loadLatest = createObject("roSGNode", "LoadItemsTask") - loadLatest.itemsToLoad = "latest" - loadLatest.itemId = lib.id - - metadata = { - "title": lib.name, - "contentType": lib.json.CollectionType - } - - loadLatest.metadata = metadata - loadLatest.observeField("content", "updateLatestItems") - loadLatest.control = "RUN" - end if - end for -end sub - sub updateLatestItems(msg) itemData = msg.GetData() @@ -455,90 +479,41 @@ sub updateLatestItems(msg) row.title = tr("Latest in") + " " + node.metadata.title + " >" row.usePoster = true - ' Handle specific types with different item widths - if node.metadata.contentType = "movies" - row.imageWidth = homeRowItemSizes.MOVIE_POSTER[0] - itemSize = homeRowItemSizes.MOVIE_POSTER - else if node.metadata.contentType = "music" - row.imageWidth = homeRowItemSizes.MUSIC_ALBUM[0] - itemSize = homeRowItemSizes.MUSIC_ALBUM - else - row.imageWidth = homeRowItemSizes.WIDE_POSTER[0] - itemSize = homeRowItemSizes.WIDE_POSTER - end if - for each item in itemData item.usePoster = row.usePoster - item.imageWidth = row.imageWidth + item.imageWidth = m.homeSections[sectionName].imageSize[0] row.appendChild(item) end for - if isValid(m.homeSections[sectionName]) - rowIndex = m.homeSections[sectionName].index + rowIndex = m.homeSections[sectionName].index + if isValid(rowIndex) and isValid(m.top.content.getChild(rowIndex)) ' Replace the old row - if isValid(rowIndex) - m.top.content.replaceChild(row, rowIndex) - - ' Set focus on previously focused item - setFocusToPreviousFocusedItem() - - return - end if - end if - - ' Determine highest index of a Lastest In section so we can append the new section after it - highestLatestHomeSectionIndex = 0 + m.top.content.replaceChild(row, rowIndex) + else + firstLatestHomeSectionIndex = m.homeSections.count() - 1 - for each section in m.homeSections - if LCase(Left(section, 6)) = "latest" - if m.homeSections[section].index > highestLatestHomeSectionIndex - highestLatestHomeSectionIndex = m.homeSections[section].index + for each section in m.homeSections + if LCase(Left(section, 6)) = "latest" + if m.homeSections[section].index < firstLatestHomeSectionIndex + firstLatestHomeSectionIndex = m.homeSections[section].index + end if end if - end if - end for - - ' We have data for a section that doesn't currently exist - rowIndex = highestLatestHomeSectionIndex + 1 + end for - ' Advance all the indexes greater than or equal than our new row - for each section in m.homeSections - if m.homeSections[section].index >= rowIndex - m.homeSections[section].index++ - end if - end for - - m.homeSections.AddReplace(sectionName, { - imageSize: itemSize, - index: rowIndex - }) + for each section in m.homeSections + if m.homeSections[section].index >= firstLatestHomeSectionIndex + m.homeSections[section].index++ + end if + end for - m.top.content.insertChild(row, rowIndex) + m.homeSections[sectionName].index = firstLatestHomeSectionIndex + m.top.content.insertChild(row, firstLatestHomeSectionIndex) + end if - ' We've inserted a new row, we must set the row sizes again to ensure they're correct setRowItemSizes() - return - end if -end sub -' setFocusToPreviousFocusedItem: Sets the cursor focus to the row and item previously selected -' -sub setFocusToPreviousFocusedItem() - if not isValidAndNotEmpty(m.selectedRowItem) then return - - ' Set focus to row if it exists - itemRow = m.top.content.getChild(m.selectedRowItem[0]) - if isValid(itemRow) - m.top.jumpToItem = m.selectedRowItem[0] - - ' Set focus to column if it exists - itemColumn = itemRow.getChild(m.selectedRowItem[1]) - if isValid(itemColumn) - m.top.jumpToRowItem = [m.selectedRowItem[0], m.selectedRowItem[1]] - m.loadingTimer.control = "stop" - stopLoadingSpinner() - end if end if end sub @@ -575,8 +550,6 @@ sub updateOnNowItems() ' replace the old row m.top.content.replaceChild(row, m.homeSections.livetv.index) - ' Set focus on previously focused item - setFocusToPreviousFocusedItem() ' We may now have different poster sizes. Reset the row item sizes setRowItemSizes() From 1a3313ba1163bbdbd5fe050d727af933267a03b7 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Thu, 30 Nov 2023 01:22:26 +0000 Subject: [PATCH 56/82] Update API docs --- docs/api/components_ItemGrid_ItemGrid.bs.html | 19 +++---- ...mponents_ItemGrid_MovieLibraryView.bs.html | 15 ++---- ...mponents_ItemGrid_MusicLibraryView.bs.html | 15 ++---- docs/api/components_JFScene.bs.html | 21 ++++++++ docs/api/components_Spinner.bs.html | 2 +- .../components_config_SetServerScreen.bs.html | 5 +- docs/api/components_liveTv_schedule.bs.html | 12 ++--- docs/api/components_login_UserSelect.bs.html | 5 +- .../components_movies_MovieDetails.bs.html | 4 +- docs/api/components_music_AlbumView.bs.html | 10 +--- docs/api/components_music_ArtistView.bs.html | 1 + .../components_music_AudioPlayerView.bs.html | 1 + .../api/components_music_PlaylistView.bs.html | 10 +--- .../components_photos_PhotoDetails.bs.html | 1 + .../components_search_SearchResults.bs.html | 7 ++- .../components_video_VideoPlayerView.bs.html | 2 + docs/api/data/search.json | 2 +- docs/api/module-AlbumView.html | 2 +- docs/api/module-JFScene.html | 2 +- docs/api/module-PlaylistView.html | 2 +- docs/api/module-misc.html | 2 +- docs/api/source_Main.bs.html | 46 +++++++++++------ docs/api/source_ShowScenes.bs.html | 32 ++++++------ docs/api/source_VideoPlayer.bs.html | 2 +- docs/api/source_utils_misc.bs.html | 35 +++++++------ docs/api/source_utils_quickplay.bs.html | 50 +++++++++++++++++-- 26 files changed, 176 insertions(+), 129 deletions(-) diff --git a/docs/api/components_ItemGrid_ItemGrid.bs.html b/docs/api/components_ItemGrid_ItemGrid.bs.html index cbe4f7221c..e6abc9e184 100644 --- a/docs/api/components_ItemGrid_ItemGrid.bs.html +++ b/docs/api/components_ItemGrid_ItemGrid.bs.html @@ -66,9 +66,6 @@ 'set inital counts for overhang before content is loaded. m.loadItemsTask.totalRecordCount = 0 - m.spinner = m.top.findNode("spinner") - m.spinner.visible = true - m.Alpha = m.top.findNode("AlphaMenu") m.AlphaSelected = m.top.findNode("AlphaSelected") @@ -94,7 +91,7 @@ 'Load initial set of Data sub loadInitialItems() m.loadItemsTask.control = "stop" - m.spinner.visible = true + startLoadingSpinner() if m.top.parentItem.json.Type = "CollectionFolder" 'or m.top.parentItem.json.Type = "Folder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -240,7 +237,7 @@ end if m.loadItemsTask.observeField("content", "ItemDataLoaded") - m.spinner.visible = true + startLoadingSpinner(false) m.loadItemsTask.control = "RUN" SetUpOptions() end sub @@ -452,6 +449,7 @@ ' 'Handle loaded data, and add to Grid sub ItemDataLoaded(msg) + stopLoadingSpinner() m.top.alphaActive = false itemData = msg.GetData() m.loadItemsTask.unobserveField("content") @@ -477,7 +475,7 @@ m.genreList.setFocus(true) m.loading = false - m.spinner.visible = false + stopLoadingSpinner() return end if @@ -500,7 +498,7 @@ m.itemGrid.setFocus(true) m.genreList.setFocus(false) - m.spinner.visible = false + stopLoadingSpinner() end sub ' @@ -573,7 +571,7 @@ ' 'Load next set of items sub loadMoreData() - m.spinner.visible = true + startLoadingSpinner(false) if m.Loading = true then return m.Loading = true m.loadItemsTask.startIndex = m.loadedItems @@ -596,7 +594,7 @@ m.loadItemsTask.searchTerm = "" m.VoiceBox.text = "" m.loadItemsTask.nameStartsWith = m.alpha.itemAlphaSelected - m.spinner.visible = true + startLoadingSpinner(false) loadInitialItems() end if end sub @@ -611,7 +609,7 @@ m.loadItemsTask.NameStartsWith = " " m.loadItemsTask.searchTerm = m.voiceBox.text m.loadItemsTask.recursive = true - m.spinner.visible = true + startLoadingSpinner(false) loadInitialItems() end if end sub @@ -847,7 +845,6 @@ end if if key = "replay" - m.spinner.visible = true m.loadItemsTask.searchTerm = "" m.loadItemsTask.nameStartsWith = "" m.voiceBox.text = "" diff --git a/docs/api/components_ItemGrid_MovieLibraryView.bs.html b/docs/api/components_ItemGrid_MovieLibraryView.bs.html index d4b1431d2d..3b2b481d7d 100644 --- a/docs/api/components_ItemGrid_MovieLibraryView.bs.html +++ b/docs/api/components_ItemGrid_MovieLibraryView.bs.html @@ -19,7 +19,6 @@ m.selectedMovieOfficialRating = m.top.findNode("selectedMovieOfficialRating") m.movieLogo = m.top.findNode("movieLogo") m.swapAnimation = m.top.findNode("backroundSwapAnimation") - m.spinner = m.top.findNode("spinner") m.Alpha = m.top.findNode("AlphaMenu") m.AlphaSelected = m.top.findNode("AlphaSelected") m.micButton = m.top.findNode("micButton") @@ -85,8 +84,6 @@ 'set inital counts for overhang before content is loaded. m.loadItemsTask.totalRecordCount = 0 - m.spinner.visible = true - 'Get reset folder setting m.resetGrid = m.global.session.user.settings["itemgrid.reset"] @@ -119,7 +116,7 @@ 'Load initial set of Data sub loadInitialItems() m.loadItemsTask.control = "stop" - m.spinner.visible = true + startLoadingSpinner(false) if m.top.parentItem.json.Type = "CollectionFolder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -221,7 +218,6 @@ end if m.loadItemsTask.observeField("content", "ItemDataLoaded") - m.spinner.visible = true m.loadItemsTask.control = "RUN" m.getFiltersTask.observeField("filters", "FilterDataLoaded") @@ -438,7 +434,7 @@ m.genreList.setFocus(true) m.loading = false - m.spinner.visible = false + stopLoadingSpinner() ' Return focus to options menu if it was opened while library was loading if m.options.visible m.options.setFocus(true) @@ -488,7 +484,7 @@ m.emptyText.visible = true end if - m.spinner.visible = false + stopLoadingSpinner() ' Return focus to options menu if it was opened while library was loading if m.options.visible m.options.setFocus(true) @@ -693,7 +689,7 @@ ' 'Load next set of items sub loadMoreData() - m.spinner.visible = true + startLoadingSpinner(false) if m.Loading = true then return m.Loading = true m.loadItemsTask.startIndex = m.loadedItems @@ -738,7 +734,6 @@ m.loadItemsTask.searchTerm = "" m.VoiceBox.text = "" m.loadItemsTask.nameStartsWith = m.alpha.itemAlphaSelected - m.spinner.visible = true loadInitialItems() end if end sub @@ -753,7 +748,6 @@ m.loadItemsTask.NameStartsWith = " " m.loadItemsTask.searchTerm = m.voiceBox.text m.loadItemsTask.recursive = true - m.spinner.visible = true loadInitialItems() end if end sub @@ -926,7 +920,6 @@ end if if key = "replay" - m.spinner.visible = true m.loadItemsTask.searchTerm = "" m.loadItemsTask.nameStartsWith = "" m.voiceBox.text = "" diff --git a/docs/api/components_ItemGrid_MusicLibraryView.bs.html b/docs/api/components_ItemGrid_MusicLibraryView.bs.html index 19807283c3..a6e2b2b2bb 100644 --- a/docs/api/components_ItemGrid_MusicLibraryView.bs.html +++ b/docs/api/components_ItemGrid_MusicLibraryView.bs.html @@ -19,7 +19,6 @@ m.selectedArtistGenres = m.top.findNode("selectedArtistGenres") m.artistLogo = m.top.findNode("artistLogo") m.swapAnimation = m.top.findNode("backroundSwapAnimation") - m.spinner = m.top.findNode("spinner") m.Alpha = m.top.findNode("AlphaMenu") m.AlphaSelected = m.top.findNode("AlphaSelected") m.micButton = m.top.findNode("micButton") @@ -79,8 +78,6 @@ 'set inital counts for overhang before content is loaded. m.loadItemsTask.totalRecordCount = 0 - m.spinner.visible = true - 'Get reset folder setting m.resetGrid = m.global.session.user.settings["itemgrid.reset"] @@ -113,7 +110,7 @@ 'Load initial set of Data sub loadInitialItems() m.loadItemsTask.control = "stop" - m.spinner.visible = true + startLoadingSpinner() if LCase(m.top.parentItem.json.Type) = "collectionfolder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -206,7 +203,6 @@ end if m.loadItemsTask.observeField("content", "ItemDataLoaded") - m.spinner.visible = true m.loadItemsTask.control = "RUN" SetUpOptions() end sub @@ -328,6 +324,7 @@ ' 'Handle loaded data, and add to Grid sub ItemDataLoaded(msg) + stopLoadingSpinner() m.top.alphaActive = false itemData = msg.GetData() m.loadItemsTask.unobserveField("content") @@ -353,7 +350,6 @@ m.loadedRows = m.loadedItems / m.genreList.numColumns m.loading = false - m.spinner.visible = false return end if @@ -376,8 +372,6 @@ m.emptyText.text = tr("NO_ITEMS").Replace("%1", m.top.parentItem.Type) m.emptyText.visible = true end if - - m.spinner.visible = false end sub ' @@ -558,7 +552,7 @@ ' 'Load next set of items sub loadMoreData() - m.spinner.visible = true + startLoadingSpinner(false) if m.Loading = true then return m.Loading = true m.loadItemsTask.startIndex = m.loadedItems @@ -614,7 +608,6 @@ m.loadItemsTask.searchTerm = "" m.VoiceBox.text = "" m.loadItemsTask.nameStartsWith = m.alpha.itemAlphaSelected - m.spinner.visible = true loadInitialItems() end if end sub @@ -629,7 +622,6 @@ m.loadItemsTask.NameStartsWith = " " m.loadItemsTask.searchTerm = m.voiceBox.text m.loadItemsTask.recursive = true - m.spinner.visible = true loadInitialItems() end if end sub @@ -789,7 +781,6 @@ end if if key = "replay" - m.spinner.visible = true m.loadItemsTask.searchTerm = "" m.loadItemsTask.nameStartsWith = "" m.voiceBox.text = "" diff --git a/docs/api/components_JFScene.bs.html b/docs/api/components_JFScene.bs.html index dbbe2fae9f..f2c70bda5c 100644 --- a/docs/api/components_JFScene.bs.html +++ b/docs/api/components_JFScene.bs.html @@ -5,6 +5,27 @@ sub init() m.top.backgroundColor = "#262626" '"#101010" m.top.backgroundURI = "" + m.spinner = m.top.findNode("spinner") +end sub + +' Triggered when the isLoading boolean component field is changed +sub isLoadingChanged() + m.spinner.visible = m.top.isLoading +end sub + +' Triggered when the disableRemote boolean component field is changed +sub disableRemoteChanged() + if m.top.disableRemote + dialog = createObject("roSGNode", "ProgressDialog") + dialog.id = "invisibiledialog" + dialog.visible = false + dialog.opacity = 0 + m.top.dialog = dialog + else + if isValid(m.top.dialog) + m.top.dialog.close = true + end if + end if end sub function onKeyEvent(key as string, press as boolean) as boolean diff --git a/docs/api/components_Spinner.bs.html b/docs/api/components_Spinner.bs.html index b08431a3d8..468d57cddf 100644 --- a/docs/api/components_Spinner.bs.html +++ b/docs/api/components_Spinner.bs.html @@ -4,6 +4,6 @@ m.top.poster.uri = "pkg:/images/spinner.png" m.top.control = "start" m.top.clockwise = true - m.top.spinInterval = 3 + m.top.spinInterval = 1 end sub
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_SetServerScreen.bs.html b/docs/api/components_config_SetServerScreen.bs.html index b66d5540a1..ba2fe7683b 100644 --- a/docs/api/components_config_SetServerScreen.bs.html +++ b/docs/api/components_config_SetServerScreen.bs.html @@ -7,7 +7,6 @@ m.log = log.Logger("SetServerScreen") m.top.setFocus(true) - m.spinner = m.top.findNode("spinner") m.serverPicker = m.top.findNode("serverPicker") m.serverUrlTextbox = m.top.findNode("serverUrlTextbox") m.serverUrlContainer = m.top.findNode("serverUrlContainer") @@ -78,7 +77,7 @@ 'run the task m.ssdpScanner.observeField("content", "ScanForServersComplete") m.ssdpScanner.control = "RUN" - m.spinner.visible = true + startLoadingSpinner(false) end sub sub ScanForServersComplete(event) @@ -111,7 +110,7 @@ end if m.serverPicker.content = items - m.spinner.visible = false + stopLoadingSpinner() 'if we have at least one server, focus on the server picker if m.servers.Count() > 0 diff --git a/docs/api/components_liveTv_schedule.bs.html b/docs/api/components_liveTv_schedule.bs.html index 4b15b4b871..0160dde405 100644 --- a/docs/api/components_liveTv_schedule.bs.html +++ b/docs/api/components_liveTv_schedule.bs.html @@ -1,6 +1,8 @@ Source: components/liveTv/schedule.bs
On this page

components_liveTv_schedule.bs

sub init()
+    
On this page

components_liveTv_schedule.bs

import "pkg:/source/utils/misc.bs"
+
+sub init()
     m.EPGLaunchCompleteSignaled = false
     m.scheduleGrid = m.top.findNode("scheduleGrid")
     m.detailsPane = m.top.findNode("detailsPane")
@@ -28,8 +30,6 @@
     m.top.lastFocus = m.scheduleGrid
 
     m.channelIndex = {}
-
-    m.spinner = m.top.findNode("spinner")
 end sub
 
 sub channelFilterSet()
@@ -50,14 +50,14 @@
     if LCase(m.top.searchTerm) = LCase(tr("all")) or m.LoadChannelsTask.searchTerm = LCase(tr("all"))
         m.top.searchTerm = " "
         m.LoadChannelsTask.searchTerm = " "
-        m.spinner.visible = true
+        startLoadingSpinner()
         m.LoadChannelsTask.control = "RUN"
         'filter if the searterm is not invalid
     else if m.top.searchTerm <> invalid and LCase(m.LoadChannelsTask.searchTerm) <> LCase(m.top.searchTerm)
         if m.LoadChannelsTask.state = "run" then m.LoadChannelsTask.control = "stop"
 
         m.LoadChannelsTask.searchTerm = m.top.searchTerm
-        m.spinner.visible = true
+        startLoadingSpinner()
         m.LoadChannelsTask.control = "RUN"
     end if
 
@@ -127,7 +127,7 @@
     m.scheduleGrid.showLoadingDataFeedback = false
     m.scheduleGrid.setFocus(true)
     m.LoadScheduleTask.schedule = []
-    m.spinner.visible = false
+    stopLoadingSpinner()
 end sub
 
 sub onProgramFocused()
diff --git a/docs/api/components_login_UserSelect.bs.html b/docs/api/components_login_UserSelect.bs.html
index 5dd4c57ee0..d8a7eac556 100644
--- a/docs/api/components_login_UserSelect.bs.html
+++ b/docs/api/components_login_UserSelect.bs.html
@@ -1,10 +1,13 @@
 Source: components/login/UserSelect.bs
On this page

components_login_UserSelect.bs

sub init()
+    
On this page

components_login_UserSelect.bs

import "pkg:/source/utils/misc.bs"
+
+sub init()
     m.top.optionsAvailable = false
 end sub
 
 sub itemContentChanged()
+    stopLoadingSpinner()
     m.top.findNode("UserRow").ItemContent = m.top.itemContent
     redraw()
 end sub
diff --git a/docs/api/components_movies_MovieDetails.bs.html b/docs/api/components_movies_MovieDetails.bs.html
index 3c70f54257..5984250937 100644
--- a/docs/api/components_movies_MovieDetails.bs.html
+++ b/docs/api/components_movies_MovieDetails.bs.html
@@ -23,8 +23,6 @@
     m.buttonGrp.setFocus(true)
     m.top.lastFocus = m.buttonGrp
 
-    m.spinner = m.top.findNode("spinner")
-
     m.top.observeField("itemContent", "itemContentChanged")
 end sub
 
@@ -152,7 +150,7 @@
     SetUpVideoOptions(itemData.mediaSources)
     SetUpAudioOptions(itemData.mediaStreams)
     m.buttonGrp.visible = true
-    m.spinner.visible = false
+    stopLoadingSpinner()
 end sub
 
 
diff --git a/docs/api/components_music_AlbumView.bs.html b/docs/api/components_music_AlbumView.bs.html
index e18abb314d..57710835ee 100644
--- a/docs/api/components_music_AlbumView.bs.html
+++ b/docs/api/components_music_AlbumView.bs.html
@@ -14,8 +14,6 @@
     m.songListRect = m.top.FindNode("songListRect")
 
     m.songList.observeField("doneLoading", "onDoneLoading")
-    m.spinner = m.top.findNode("spinner")
-    m.spinner.visible = true
 
     m.dscr = m.top.findNode("overview")
     createDialogPallete()
@@ -101,8 +99,6 @@
 function onKeyEvent(key as string, press as boolean) as boolean
     if not press then return false
 
-    if m.spinner.visible then return false
-
     if key = "options"
         if m.dscr.isTextEllipsized
             createFullDscrDlg()
@@ -171,10 +167,6 @@
 
 sub onDoneLoading()
     m.songList.unobservefield("doneLoading")
-    m.spinner.visible = false
-end sub
-
-sub OnScreenHidden()
-    m.spinner.visible = false
+    stopLoadingSpinner()
 end sub
 
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_ArtistView.bs.html b/docs/api/components_music_ArtistView.bs.html index 5b7a1fa2ac..71e0cb1b1c 100644 --- a/docs/api/components_music_ArtistView.bs.html +++ b/docs/api/components_music_ArtistView.bs.html @@ -78,6 +78,7 @@ m.overhang.isVisible = false m.overhang.opacity = "1" end if + stopLoadingSpinner() end sub sub OnScreenHidden() diff --git a/docs/api/components_music_AudioPlayerView.bs.html b/docs/api/components_music_AudioPlayerView.bs.html index a1a022b041..f93374fe70 100644 --- a/docs/api/components_music_AudioPlayerView.bs.html +++ b/docs/api/components_music_AudioPlayerView.bs.html @@ -449,6 +449,7 @@ end sub sub onAudioStreamLoaded() + stopLoadingSpinner() data = m.LoadAudioStreamTask.content[0] m.LoadAudioStreamTask.unobserveField("content") if data <> invalid and data.count() > 0 diff --git a/docs/api/components_music_PlaylistView.bs.html b/docs/api/components_music_PlaylistView.bs.html index 238f4af293..da5406d3db 100644 --- a/docs/api/components_music_PlaylistView.bs.html +++ b/docs/api/components_music_PlaylistView.bs.html @@ -13,8 +13,6 @@ m.songListRect = m.top.FindNode("songListRect") m.songList.observeField("doneLoading", "onDoneLoading") - m.spinner = m.top.findNode("spinner") - m.spinner.visible = true m.dscr = m.top.findNode("overview") createDialogPallete() @@ -100,8 +98,6 @@ function onKeyEvent(key as string, press as boolean) as boolean if not press then return false - if m.spinner.visible then return false - if key = "options" if m.dscr.isTextEllipsized createFullDscrDlg() @@ -162,10 +158,6 @@ sub onDoneLoading() m.songList.unobservefield("doneLoading") - m.spinner.visible = false -end sub - -sub OnScreenHidden() - m.spinner.visible = false + stopLoadingSpinner() end sub
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_photos_PhotoDetails.bs.html b/docs/api/components_photos_PhotoDetails.bs.html index c567df10bd..1b3035bfe2 100644 --- a/docs/api/components_photos_PhotoDetails.bs.html +++ b/docs/api/components_photos_PhotoDetails.bs.html @@ -43,6 +43,7 @@ end sub sub onPhotoLoaded() + stopLoadingSpinner() if m.LoadLibrariesTask.results <> invalid photo = m.top.findNode("photo") photo.uri = m.LoadLibrariesTask.results diff --git a/docs/api/components_search_SearchResults.bs.html b/docs/api/components_search_SearchResults.bs.html index 76e62711ed..f2dd5a1664 100644 --- a/docs/api/components_search_SearchResults.bs.html +++ b/docs/api/components_search_SearchResults.bs.html @@ -8,7 +8,6 @@ sub init() m.top.optionsAvailable = false - m.searchSpinner = m.top.findnode("searchSpinner") m.searchSelect = m.top.findnode("searchSelect") m.searchTask = CreateObject("roSGNode", "SearchTask") @@ -22,12 +21,12 @@ query = m.top.searchAlpha 'if user deletes the search string hide the spinner if query.len() = 0 - m.searchSpinner.visible = false + stopLoadingSpinner() end if 'if search task is running and user selectes another letter stop the search and load the next letter m.searchTask.control = "stop" if query <> invalid and query <> "" - m.searchSpinner.visible = true + startLoadingSpinner(false) end if m.searchTask.observeField("results", "loadResults") m.searchTask.query = query @@ -39,7 +38,7 @@ sub loadResults() m.searchTask.unobserveField("results") - m.searchSpinner.visible = false + stopLoadingSpinner() m.searchSelect.itemdata = m.searchTask.results m.searchSelect.query = m.top.SearchAlpha m.searchHelpText.visible = false diff --git a/docs/api/components_video_VideoPlayerView.bs.html b/docs/api/components_video_VideoPlayerView.bs.html index 5f30c664f0..10031de0fa 100644 --- a/docs/api/components_video_VideoPlayerView.bs.html +++ b/docs/api/components_video_VideoPlayerView.bs.html @@ -299,6 +299,8 @@ videoContent = m.LoadMetaDataTask.content m.LoadMetaDataTask.content = [] + stopLoadingSpinner() + ' If we have nothing to play, return to previous screen if not isValid(videoContent) showPlaybackErrorDialog(tr("There was an error retrieving the data for this item from the server.")) diff --git a/docs/api/data/search.json b/docs/api/data/search.json index 043b18ca51..3922842e1a 100644 --- a/docs/api/data/search.json +++ b/docs/api/data/search.json @@ -1 +1 @@ -{"list":[{"title":"module:AlbumData","link":"AlbumData"},{"title":"module:AlbumData.setFields","link":"setFields"},{"title":"module:AlbumGrid","link":"AlbumGrid"},{"title":"module:AlbumGrid.getData","link":"getData"},{"title":"module:AlbumGrid.init","link":"init"},{"title":"module:AlbumGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumTrackList","link":"AlbumTrackList"},{"title":"module:AlbumTrackList.getData","link":"getData"},{"title":"module:AlbumTrackList.init","link":"init"},{"title":"module:AlbumView","link":"AlbumView"},{"title":"module:AlbumView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:AlbumView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:AlbumView.createDialogPallete","link":"createDialogPallete"},{"title":"module:AlbumView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:AlbumView.init","link":"init"},{"title":"module:AlbumView.onDoneLoading","link":"onDoneLoading"},{"title":"module:AlbumView.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:AlbumView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AlbumView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AlbumView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AlbumView.setupMainNode","link":"setupMainNode"},{"title":"module:Alpha","link":"Alpha"},{"title":"module:Alpha.init","link":"init"},{"title":"module:Alpha.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView","link":"ArtistView"},{"title":"module:ArtistView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:ArtistView.OnScreenShown","link":"OnScreenShown"},{"title":"module:ArtistView.artistOverviewChanged","link":"artistOverviewChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:ArtistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:ArtistView.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:ArtistView.init","link":"init"},{"title":"module:ArtistView.onAlbumsData","link":"onAlbumsData"},{"title":"module:ArtistView.onAlbumsEscape","link":"onAlbumsEscape"},{"title":"module:ArtistView.onAppearsOnData","link":"onAppearsOnData"},{"title":"module:ArtistView.onAppearsOnEscape","link":"onAppearsOnEscape"},{"title":"module:ArtistView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:ArtistView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:ArtistView.onEllipsisChanged","link":"onEllipsisChanged"},{"title":"module:ArtistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView.onSectionNavigationEscape","link":"onSectionNavigationEscape"},{"title":"module:ArtistView.onSectionNavigationSelected","link":"onSectionNavigationSelected"},{"title":"module:ArtistView.onSectionScrollerChange","link":"onSectionScrollerChange"},{"title":"module:ArtistView.pageContentChanged","link":"pageContentChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:ArtistView.setPosterImage","link":"setPosterImage"},{"title":"module:ArtistView.setScreenTitle","link":"setScreenTitle"},{"title":"module:ArtistView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:ArtistView.setupMainNode","link":"setupMainNode"},{"title":"module:AudioPlayer","link":"AudioPlayer"},{"title":"module:AudioPlayer.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:AudioPlayer.audioStateChanged","link":"audioStateChanged","description":"

State Change Event Handler

"},{"title":"module:AudioPlayer.init","link":"init"},{"title":"module:AudioPlayerView","link":"AudioPlayerView"},{"title":"module:AudioPlayerView.LoadNextSong","link":"LoadNextSong"},{"title":"module:AudioPlayerView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:AudioPlayerView.audioPositionChanged","link":"audioPositionChanged"},{"title":"module:AudioPlayerView.audioStateChanged","link":"audioStateChanged"},{"title":"module:AudioPlayerView.bufferPositionChanged","link":"bufferPositionChanged"},{"title":"module:AudioPlayerView.endScreenSaver","link":"endScreenSaver"},{"title":"module:AudioPlayerView.findCurrentSongIndex","link":"findCurrentSongIndex"},{"title":"module:AudioPlayerView.init","link":"init"},{"title":"module:AudioPlayerView.loadButtons","link":"loadButtons","description":"

If we have more and 1 song to play, fade in the next and previous controls

"},{"title":"module:AudioPlayerView.loopClicked","link":"loopClicked"},{"title":"module:AudioPlayerView.nextClicked","link":"nextClicked"},{"title":"module:AudioPlayerView.onAudioStreamLoaded","link":"onAudioStreamLoaded"},{"title":"module:AudioPlayerView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:AudioPlayerView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:AudioPlayerView.onKeyEvent","link":"onKeyEvent","description":"

Process key press events

"},{"title":"module:AudioPlayerView.onMetaDataLoaded","link":"onMetaDataLoaded"},{"title":"module:AudioPlayerView.onScreensaverTimeoutLoaded","link":"onScreensaverTimeoutLoaded"},{"title":"module:AudioPlayerView.pageContentChanged","link":"pageContentChanged","description":"

Update values on screen when page content changes

"},{"title":"module:AudioPlayerView.playAction","link":"playAction"},{"title":"module:AudioPlayerView.previousClicked","link":"previousClicked"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.screenSaverActive","link":"screenSaverActive"},{"title":"module:AudioPlayerView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:AudioPlayerView.setLoopButtonImage","link":"setLoopButtonImage"},{"title":"module:AudioPlayerView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AudioPlayerView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AudioPlayerView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AudioPlayerView.setShuffleIconState","link":"setShuffleIconState"},{"title":"module:AudioPlayerView.setTrackNumberDisplay","link":"setTrackNumberDisplay"},{"title":"module:AudioPlayerView.setupAnimationTasks","link":"setupAnimationTasks"},{"title":"module:AudioPlayerView.setupAudioNode","link":"setupAudioNode","description":"

Creates audio node used to play song(s)

"},{"title":"module:AudioPlayerView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:AudioPlayerView.setupDataTasks","link":"setupDataTasks","description":"

Creates tasks to gather data needed to render Scene and play song

"},{"title":"module:AudioPlayerView.setupInfoNodes","link":"setupInfoNodes"},{"title":"module:AudioPlayerView.setupScreenSaver","link":"setupScreenSaver"},{"title":"module:AudioPlayerView.shuffleClicked","link":"shuffleClicked"},{"title":"module:AudioPlayerView.startScreenSaver","link":"startScreenSaver"},{"title":"module:AudioPlayerView.toggleShuffleEnabled","link":"toggleShuffleEnabled"},{"title":"module:AudioTrackListItem","link":"AudioTrackListItem"},{"title":"module:AudioTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:AudioTrackListItem.init","link":"init"},{"title":"module:AudioTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ButtonGroupHoriz","link":"ButtonGroupHoriz"},{"title":"module:ButtonGroupHoriz.init","link":"init"},{"title":"module:ButtonGroupHoriz.onKeyEvent","link":"onKeyEvent"},{"title":"module:ButtonGroupVert","link":"ButtonGroupVert"},{"title":"module:ButtonGroupVert.init","link":"init"},{"title":"module:ButtonGroupVert.onFocusButtonChanged","link":"onFocusButtonChanged"},{"title":"module:ButtonGroupVert.onFocusChanged","link":"onFocusChanged"},{"title":"module:ButtonGroupVert.onKeyEvent","link":"onKeyEvent"},{"title":"module:ChannelData","link":"ChannelData"},{"title":"module:ChannelData.setFields","link":"setFields"},{"title":"module:ChannelData.setPoster","link":"setPoster"},{"title":"module:Clock","link":"Clock"},{"title":"module:Clock.init","link":"init"},{"title":"module:Clock.onCurrentTimeTimerFire","link":"onCurrentTimeTimerFire","description":"

onCurrentTimeTimerFire: Code that runs every time the currentTimeTimer fires

"},{"title":"module:CollectionData","link":"CollectionData"},{"title":"module:CollectionData.setFields","link":"setFields"},{"title":"module:CollectionData.setPoster","link":"setPoster"},{"title":"module:ConfigData","link":"ConfigData"},{"title":"module:ConfigData.init","link":"init"},{"title":"module:ConfigItem","link":"ConfigItem"},{"title":"module:ConfigItem.init","link":"init"},{"title":"module:ConfigItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ConfigItem.setColors","link":"setColors"},{"title":"module:ConfigList","link":"ConfigList"},{"title":"module:ConfigList.configListShowDialog","link":"configListShowDialog"},{"title":"module:ConfigList.dismiss_dialog","link":"dismiss_dialog"},{"title":"module:ConfigList.init","link":"init"},{"title":"module:ConfigList.onDialogButton","link":"onDialogButton"},{"title":"module:ConfigList.onItemSelected","link":"onItemSelected"},{"title":"module:ConfigList.setData","link":"setData"},{"title":"module:ExtrasItem","link":"ExtrasItem"},{"title":"module:ExtrasItem.focusChanged","link":"focusChanged"},{"title":"module:ExtrasItem.init","link":"init"},{"title":"module:ExtrasItem.showContent","link":"showContent"},{"title":"module:ExtrasRowList","link":"ExtrasRowList"},{"title":"module:ExtrasRowList.addRowSize","link":"addRowSize"},{"title":"module:ExtrasRowList.buildRow","link":"buildRow"},{"title":"module:ExtrasRowList.init","link":"init"},{"title":"module:ExtrasRowList.loadParts","link":"loadParts"},{"title":"module:ExtrasRowList.loadPersonVideos","link":"loadPersonVideos"},{"title":"module:ExtrasRowList.onAdditionalPartsLoaded","link":"onAdditionalPartsLoaded"},{"title":"module:ExtrasRowList.onLikeThisLoaded","link":"onLikeThisLoaded"},{"title":"module:ExtrasRowList.onMoviesLoaded","link":"onMoviesLoaded"},{"title":"module:ExtrasRowList.onPeopleLoaded","link":"onPeopleLoaded"},{"title":"module:ExtrasRowList.onRowItemFocused","link":"onRowItemFocused"},{"title":"module:ExtrasRowList.onRowItemSelected","link":"onRowItemSelected"},{"title":"module:ExtrasRowList.onSeriesLoaded","link":"onSeriesLoaded"},{"title":"module:ExtrasRowList.onShowsLoaded","link":"onShowsLoaded"},{"title":"module:ExtrasRowList.onSpecialFeaturesLoaded","link":"onSpecialFeaturesLoaded"},{"title":"module:ExtrasRowList.updateSize","link":"updateSize"},{"title":"module:FavoriteItemsTask","link":"FavoriteItemsTask"},{"title":"module:FavoriteItemsTask.init","link":"init"},{"title":"module:FavoriteItemsTask.setFavoriteStatus","link":"setFavoriteStatus"},{"title":"module:FolderData","link":"FolderData"},{"title":"module:FolderData.setFields","link":"setFields"},{"title":"module:FolderData.setPoster","link":"setPoster"},{"title":"module:GetFiltersTask","link":"GetFiltersTask"},{"title":"module:GetFiltersTask.getFiltersTask","link":"getFiltersTask"},{"title":"module:GetFiltersTask.init","link":"init"},{"title":"module:GetNextEpisodeTask","link":"GetNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.getNextEpisodeTask","link":"getNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.init","link":"init"},{"title":"module:GetPlaybackInfoTask","link":"GetPlaybackInfoTask"},{"title":"module:GetPlaybackInfoTask.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:GetPlaybackInfoTask.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:GetPlaybackInfoTask.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:GetPlaybackInfoTask.getPlaybackInfoTask","link":"getPlaybackInfoTask","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:GetPlaybackInfoTask.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:GetPlaybackInfoTask.init","link":"init"},{"title":"module:GetShuffleEpisodesTask","link":"GetShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.getShuffleEpisodesTask","link":"getShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.init","link":"init"},{"title":"module:GridItem","link":"GridItem"},{"title":"module:GridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:GridItem.focusChanging","link":"focusChanging","description":"

Use FocusPercent to animate scaling of Poser Image

"},{"title":"module:GridItem.init","link":"init"},{"title":"module:GridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:GridItemSmall","link":"GridItemSmall"},{"title":"module:GridItemSmall.focusChanged","link":"focusChanged"},{"title":"module:GridItemSmall.init","link":"init"},{"title":"module:GridItemSmall.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItemSmall.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:Home","link":"Home"},{"title":"module:Home.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook that gets ran as needed.\nUsed to update the focus, the state of the data, and tells the server about the device profile

"},{"title":"module:Home.init","link":"init"},{"title":"module:Home.loadLibraries","link":"loadLibraries"},{"title":"module:Home.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:Home.refresh","link":"refresh"},{"title":"module:HomeData","link":"HomeData"},{"title":"module:HomeData.setData","link":"setData"},{"title":"module:HomeItem","link":"HomeItem"},{"title":"module:HomeItem.drawProgressBar","link":"drawProgressBar","description":"

Draws and animates item progress bar

"},{"title":"module:HomeItem.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:HomeItem.init","link":"init"},{"title":"module:HomeItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:HomeItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and icon when poster loaded

"},{"title":"module:HomeRows","link":"HomeRows"},{"title":"module:HomeRows.addHomeSection","link":"addHomeSection","description":"

Adds a new home section to the home rows.\nReturns a boolean indicating whether the section was handled.

"},{"title":"module:HomeRows.createContinueWatchingRow","link":"createContinueWatchingRow","description":"

Create a row displaying items the user can continue watching

"},{"title":"module:HomeRows.createFavoritesRow","link":"createFavoritesRow","description":"

Create a row displaying items from the user's favorites list

"},{"title":"module:HomeRows.createLatestInRows","link":"createLatestInRows","description":"

Create a row displaying latest items in each of the user's libraries

"},{"title":"module:HomeRows.createLibraryRow","link":"createLibraryRow","description":"

Create a row displaying the user's libraries

"},{"title":"module:HomeRows.createLiveTVRow","link":"createLiveTVRow","description":"

Create a row displaying the live tv now on section

"},{"title":"module:HomeRows.createNextUpRow","link":"createNextUpRow","description":"

Create a row displaying next episodes up to watch

"},{"title":"module:HomeRows.filterNodeArray","link":"filterNodeArray"},{"title":"module:HomeRows.init","link":"init"},{"title":"module:HomeRows.itemSelected","link":"itemSelected"},{"title":"module:HomeRows.loadLibraries","link":"loadLibraries"},{"title":"module:HomeRows.onKeyEvent","link":"onKeyEvent"},{"title":"module:HomeRows.onLibrariesLoaded","link":"onLibrariesLoaded"},{"title":"module:HomeRows.removeHomeSection","link":"removeHomeSection","description":"

Removes a home section from the home rows

"},{"title":"module:HomeRows.updateContinueWatchingItems","link":"updateContinueWatchingItems"},{"title":"module:HomeRows.updateFavoritesItems","link":"updateFavoritesItems"},{"title":"module:HomeRows.updateHomeRows","link":"updateHomeRows","description":"

Update home row data

"},{"title":"module:HomeRows.updateLatestInRows","link":"updateLatestInRows","description":"

Iterate over user's libraries and update data for each Latest In section

"},{"title":"module:HomeRows.updateLatestItems","link":"updateLatestItems"},{"title":"module:HomeRows.updateNextUpItems","link":"updateNextUpItems"},{"title":"module:HomeRows.updateOnNowItems","link":"updateOnNowItems"},{"title":"module:HomeRows.updateSize","link":"updateSize"},{"title":"module:HomeRows.updateSizeArray","link":"updateSizeArray"},{"title":"module:IconButton","link":"IconButton"},{"title":"module:IconButton.init","link":"init"},{"title":"module:IconButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:IconButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:IconButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:IconButton.onIconChanged","link":"onIconChanged"},{"title":"module:IconButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:IconButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:IconButton.onTextChanged","link":"onTextChanged"},{"title":"module:IconButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:IconButton.setIconSize","link":"setIconSize"},{"title":"module:Image","link":"Image"},{"title":"module:Image.ImageURL","link":"ImageURL"},{"title":"module:Image.ItemImages","link":"ItemImages"},{"title":"module:Image.PosterImage","link":"PosterImage"},{"title":"module:Image.UserImageURL","link":"UserImageURL"},{"title":"module:ImageData","link":"ImageData"},{"title":"module:ImageData.setFields","link":"setFields"},{"title":"module:IntegerKeyboard","link":"IntegerKeyboard"},{"title":"module:IntegerKeyboard.init","link":"init"},{"title":"module:IntegerKeyboard.keySelected","link":"keySelected"},{"title":"module:IntegerKeyboard.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid","link":"ItemGrid"},{"title":"module:ItemGrid.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:ItemGrid.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:ItemGrid.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:ItemGrid.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:ItemGrid.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:ItemGrid.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:ItemGrid.init","link":"init"},{"title":"module:ItemGrid.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:ItemGrid.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:ItemGrid.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:ItemGrid.onChannelFocused","link":"onChannelFocused"},{"title":"module:ItemGrid.onChannelSelected","link":"onChannelSelected"},{"title":"module:ItemGrid.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:ItemGrid.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:ItemGrid.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:ItemGrid.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:ItemGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:ItemGrid.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:ItemGrid.setBoxsetsOptions","link":"setBoxsetsOptions","description":"

Set Boxset view, sort, and filter options

"},{"title":"module:ItemGrid.setDefaultOptions","link":"setDefaultOptions","description":"

Set Default view, sort, and filter options

"},{"title":"module:ItemGrid.setLiveTvOptions","link":"setLiveTvOptions","description":"

Set Live TV view, sort, and filter options

"},{"title":"module:ItemGrid.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:ItemGrid.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:ItemGrid.setPhotoAlbumOptions","link":"setPhotoAlbumOptions","description":"

Set Photo Album view, sort, and filter options

"},{"title":"module:ItemGrid.setTvShowsOptions","link":"setTvShowsOptions","description":"

Set TV Show view, sort, and filter options

"},{"title":"module:ItemGrid.showTVGuide","link":"showTVGuide"},{"title":"module:ItemGrid.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:ItemGrid.updateTitle","link":"updateTitle"},{"title":"module:ItemGridOptions","link":"ItemGridOptions"},{"title":"module:ItemGridOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:ItemGridOptions.hideChecklist","link":"hideChecklist"},{"title":"module:ItemGridOptions.init","link":"init"},{"title":"module:ItemGridOptions.isFilterMenuDataValid","link":"isFilterMenuDataValid","description":"

Check if data for Filter Menu is valid

"},{"title":"module:ItemGridOptions.onFilterFocusChange","link":"onFilterFocusChange"},{"title":"module:ItemGridOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGridOptions.optionsSet","link":"optionsSet"},{"title":"module:ItemGridOptions.saveFavoriteItemSelected","link":"saveFavoriteItemSelected"},{"title":"module:ItemGridOptions.setHeartColor","link":"setHeartColor"},{"title":"module:ItemGridOptions.showChecklist","link":"showChecklist"},{"title":"module:ItemGridOptions.toggleFavorite","link":"toggleFavorite"},{"title":"module:Items","link":"Items"},{"title":"module:Items.AppearsOnList","link":"AppearsOnList","description":"

Get list of albums an artist appears on

"},{"title":"module:Items.ArtistOverview","link":"ArtistOverview","description":"

Music Artist Data

"},{"title":"module:Items.AudioItem","link":"AudioItem","description":"

Get Songs that are on an Album

"},{"title":"module:Items.AudioStream","link":"AudioStream"},{"title":"module:Items.BackdropImage","link":"BackdropImage"},{"title":"module:Items.CreateArtistMix","link":"CreateArtistMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.CreateInstantMix","link":"CreateInstantMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.GetIntroVideos","link":"GetIntroVideos","description":"

Get Intro Videos for an item

"},{"title":"module:Items.GetSongsByArtist","link":"GetSongsByArtist","description":"

Get list of songs belonging to an artist

"},{"title":"module:Items.ItemGetPlaybackInfo","link":"ItemGetPlaybackInfo"},{"title":"module:Items.ItemMetaData","link":"ItemMetaData","description":"

MetaData about an item

"},{"title":"module:Items.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:Items.MusicAlbumList","link":"MusicAlbumList","description":"

Get list of albums belonging to an artist

"},{"title":"module:Items.MusicSongList","link":"MusicSongList","description":"

Get Songs that are on an Album

"},{"title":"module:Items.PlaylistItemList","link":"PlaylistItemList","description":"

Get Items that are under the provided item

"},{"title":"module:Items.TVEpisodeShuffleList","link":"TVEpisodeShuffleList"},{"title":"module:Items.TVEpisodes","link":"TVEpisodes","description":"

Returns a list of TV Shows for a given TV Show and season\nAccepts strings for the TV Show Id and the season Id

"},{"title":"module:Items.TVSeasonExtras","link":"TVSeasonExtras","description":"

Returns a list of extra features for a TV Show season\nAccepts a string that is a TV Show season id

"},{"title":"module:Items.TVSeasons","link":"TVSeasons","description":"

Seasons for a TV Show

"},{"title":"module:Items.searchMedia","link":"searchMedia","description":"

Search across all libraries

"},{"title":"module:Items.useTranscodeAudioStream","link":"useTranscodeAudioStream"},{"title":"module:JFButton","link":"JFButton"},{"title":"module:JFButton.init","link":"init"},{"title":"module:JFButton.onTextChanged","link":"onTextChanged","description":"

Whenever the text changes, pad both sides with whitespace so we can center the button text

"},{"title":"module:JFButtons","link":"JFButtons"},{"title":"module:JFButtons.focusChanged","link":"focusChanged","description":"

Change opacity of the highlighted menu item based on focus

"},{"title":"module:JFButtons.highlightSelected","link":"highlightSelected","description":"

Highlight selected menu option

"},{"title":"module:JFButtons.init","link":"init"},{"title":"module:JFButtons.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFButtons.renderChanged","link":"renderChanged","description":"

When options are fully displayed, set focus and selected option

"},{"title":"module:JFButtons.selectedIndexChanged","link":"selectedIndexChanged","description":"

When Selected Index set, ensure it is the one Focused

"},{"title":"module:JFButtons.showButtons","link":"showButtons"},{"title":"module:JFButtons.updateButtons","link":"updateButtons"},{"title":"module:JFGroup","link":"JFGroup"},{"title":"module:JFGroup.init","link":"init"},{"title":"module:JFGroup.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog","link":"JFMessageDialog"},{"title":"module:JFMessageDialog.init","link":"init"},{"title":"module:JFMessageDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog.redraw","link":"redraw"},{"title":"module:JFMessageDialog.updateMessage","link":"updateMessage"},{"title":"module:JFMessageDialog.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang","link":"JFOverhang"},{"title":"module:JFOverhang.init","link":"init"},{"title":"module:JFOverhang.onVisibleChange","link":"onVisibleChange"},{"title":"module:JFOverhang.resetTime","link":"resetTime"},{"title":"module:JFOverhang.setClockVisibility","link":"setClockVisibility"},{"title":"module:JFOverhang.setRightSeperatorVisibility","link":"setRightSeperatorVisibility"},{"title":"module:JFOverhang.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang.updateTime","link":"updateTime"},{"title":"module:JFOverhang.updateTimeDisplay","link":"updateTimeDisplay"},{"title":"module:JFOverhang.updateTitle","link":"updateTitle"},{"title":"module:JFOverhang.updateUser","link":"updateUser"},{"title":"module:JFScene","link":"JFScene"},{"title":"module:JFScene.init","link":"init"},{"title":"module:JFScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFScreen","link":"JFScreen"},{"title":"module:JFScreen.OnScreenHidden","link":"OnScreenHidden","description":"

Function called when the screen is hidden by the screen manager\nIt is expected that screens override this function if required,\nto handle focus any actions required on the screen being hidden

"},{"title":"module:JFScreen.OnScreenShown","link":"OnScreenShown","description":"

Function called when the screen is displayed by the screen manager\nIt is expected that screens override this function to handle focus\nmanagmenet and any other actions required on screen shown

"},{"title":"module:JFScreen.init","link":"init"},{"title":"module:JFServer","link":"JFServer"},{"title":"module:JFServer.init","link":"init"},{"title":"module:JFServer.itemContentChanged","link":"itemContentChanged"},{"title":"module:JFServer.onFocusPercentChange","link":"onFocusPercentChange"},{"title":"module:JFServer.setTextColor","link":"setTextColor"},{"title":"module:JFVideo","link":"JFVideo"},{"title":"module:JFVideo.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:JFVideo.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:JFVideo.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:JFVideo.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:JFVideo.init","link":"init"},{"title":"module:JFVideo.loadCaption","link":"loadCaption"},{"title":"module:JFVideo.onAllowCaptionsChange","link":"onAllowCaptionsChange"},{"title":"module:JFVideo.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:JFVideo.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFVideo.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:JFVideo.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:JFVideo.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:JFVideo.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:JFVideo.toggleCaption","link":"toggleCaption"},{"title":"module:JFVideo.updateCaption","link":"updateCaption"},{"title":"module:JFVideo.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:ListPoster","link":"ListPoster"},{"title":"module:ListPoster.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:ListPoster.init","link":"init"},{"title":"module:ListPoster.itemContentChanged","link":"itemContentChanged"},{"title":"module:ListPoster.updateSize","link":"updateSize"},{"title":"module:LoadChannelsTask","link":"LoadChannelsTask"},{"title":"module:LoadChannelsTask.init","link":"init"},{"title":"module:LoadChannelsTask.loadChannels","link":"loadChannels"},{"title":"module:LoadItemsTask","link":"LoadItemsTask"},{"title":"module:LoadItemsTask.getPersonVideos","link":"getPersonVideos"},{"title":"module:LoadItemsTask.init","link":"init"},{"title":"module:LoadItemsTask.loadItems","link":"loadItems"},{"title":"module:LoadItemsTask2","link":"LoadItemsTask2"},{"title":"module:LoadItemsTask2.init","link":"init"},{"title":"module:LoadItemsTask2.loadItems","link":"loadItems"},{"title":"module:LoadPhotoTask","link":"LoadPhotoTask"},{"title":"module:LoadPhotoTask.init","link":"init"},{"title":"module:LoadPhotoTask.loadItems","link":"loadItems"},{"title":"module:LoadProgramDetailsTask","link":"LoadProgramDetailsTask"},{"title":"module:LoadProgramDetailsTask.init","link":"init"},{"title":"module:LoadProgramDetailsTask.loadProgramDetails","link":"loadProgramDetails"},{"title":"module:LoadScreenSaverTimeoutTask","link":"LoadScreenSaverTimeoutTask"},{"title":"module:LoadScreenSaverTimeoutTask.getScreensaverTimeout","link":"getScreensaverTimeout"},{"title":"module:LoadScreenSaverTimeoutTask.init","link":"init"},{"title":"module:LoadSheduleTask","link":"LoadSheduleTask"},{"title":"module:LoadSheduleTask.init","link":"init"},{"title":"module:LoadSheduleTask.loadSchedule","link":"loadSchedule"},{"title":"module:LoadVideoContentTask","link":"LoadVideoContentTask"},{"title":"module:LoadVideoContentTask.FindPreferredAudioStream","link":"FindPreferredAudioStream"},{"title":"module:LoadVideoContentTask.LoadItems_AddVideoContent","link":"LoadItems_AddVideoContent"},{"title":"module:LoadVideoContentTask.LoadItems_VideoPlayer","link":"LoadItems_VideoPlayer"},{"title":"module:LoadVideoContentTask.addNextEpisodesToQueue","link":"addNextEpisodesToQueue","description":"

Add next episodes to the playback queue

"},{"title":"module:LoadVideoContentTask.addSubtitlesToVideo","link":"addSubtitlesToVideo"},{"title":"module:LoadVideoContentTask.addVideoContentURL","link":"addVideoContentURL"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"title":"module:LoadVideoContentTask.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:LoadVideoContentTask.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:LoadVideoContentTask.init","link":"init"},{"title":"module:LoadVideoContentTask.loadItems","link":"loadItems"},{"title":"module:LoadVideoContentTask.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:LoginScene","link":"LoginScene"},{"title":"module:LoginScene.init","link":"init"},{"title":"module:LoginScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:Main","link":"Main"},{"title":"module:Main.Main","link":"Main"},{"title":"module:MovieData","link":"MovieData"},{"title":"module:MovieData.setContainer","link":"setContainer"},{"title":"module:MovieData.setFields","link":"setFields"},{"title":"module:MovieData.setPoster","link":"setPoster"},{"title":"module:MovieDetails","link":"MovieDetails"},{"title":"module:MovieDetails.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieDetails.SetDefaultAudioTrack","link":"SetDefaultAudioTrack"},{"title":"module:MovieDetails.SetUpAudioOptions","link":"SetUpAudioOptions"},{"title":"module:MovieDetails.SetUpVideoOptions","link":"SetUpVideoOptions"},{"title":"module:MovieDetails.audioOptionsClosed","link":"audioOptionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieDetails.getEndTime","link":"getEndTime"},{"title":"module:MovieDetails.getRuntime","link":"getRuntime"},{"title":"module:MovieDetails.init","link":"init"},{"title":"module:MovieDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:MovieDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieDetails.round","link":"round"},{"title":"module:MovieDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:MovieDetails.setFieldText","link":"setFieldText"},{"title":"module:MovieDetails.setWatchedColor","link":"setWatchedColor"},{"title":"module:MovieDetails.trailerAvailableChanged","link":"trailerAvailableChanged"},{"title":"module:MovieDetails.videoOptionsClosed","link":"videoOptionsClosed","description":"

Check if options were updated and if any reloding is needed...

"},{"title":"module:MovieLibraryView","link":"MovieLibraryView"},{"title":"module:MovieLibraryView.FilterDataLoaded","link":"FilterDataLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MovieLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MovieLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MovieLibraryView.SetName","link":"SetName","description":"

Set Selected Movie Name

"},{"title":"module:MovieLibraryView.SetOfficialRating","link":"SetOfficialRating","description":"

Set Selected Movie OfficialRating

"},{"title":"module:MovieLibraryView.SetOverview","link":"SetOverview","description":"

Set Selected Movie Overview

"},{"title":"module:MovieLibraryView.SetProductionYear","link":"SetProductionYear","description":"

Set Selected Movie ProductionYear

"},{"title":"module:MovieLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MovieLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MovieLibraryView.getRuntime","link":"getRuntime"},{"title":"module:MovieLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MovieLibraryView.init","link":"init"},{"title":"module:MovieLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MovieLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MovieLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MovieLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MovieLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MovieLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MovieLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MovieLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MovieLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MovieLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieLibraryView.round","link":"round"},{"title":"module:MovieLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MovieLibraryView.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:MovieLibraryView.setSelectedOptions","link":"setSelectedOptions","description":"

Data to display when options button selected

"},{"title":"module:MovieLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MovieLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MovieOptions","link":"MovieOptions"},{"title":"module:MovieOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:MovieOptions.init","link":"init"},{"title":"module:MovieOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieOptions.optionsSet","link":"optionsSet"},{"title":"module:MusicAlbumData","link":"MusicAlbumData"},{"title":"module:MusicAlbumData.setFields","link":"setFields"},{"title":"module:MusicAlbumData.setPoster","link":"setPoster"},{"title":"module:MusicAlbumSongListData","link":"MusicAlbumSongListData"},{"title":"module:MusicAlbumSongListData.setFields","link":"setFields"},{"title":"module:MusicAlbumSongListData.setPoster","link":"setPoster"},{"title":"module:MusicArtistData","link":"MusicArtistData"},{"title":"module:MusicArtistData.setFields","link":"setFields"},{"title":"module:MusicArtistData.setPoster","link":"setPoster"},{"title":"module:MusicArtistGridItem","link":"MusicArtistGridItem"},{"title":"module:MusicArtistGridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:MusicArtistGridItem.init","link":"init"},{"title":"module:MusicArtistGridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:MusicArtistGridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:MusicLibraryView","link":"MusicLibraryView"},{"title":"module:MusicLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MusicLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MusicLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MusicLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MusicLibraryView.SetAlbumCount","link":"SetAlbumCount","description":"

Set Selected Artist Album Count

"},{"title":"module:MusicLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MusicLibraryView.SetGenres","link":"SetGenres","description":"

Set Selected Artist Genres

"},{"title":"module:MusicLibraryView.SetName","link":"SetName","description":"

Set Selected Artist Name

"},{"title":"module:MusicLibraryView.SetSongCount","link":"SetSongCount","description":"

Set Selected Artist Song Count

"},{"title":"module:MusicLibraryView.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:MusicLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MusicLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MusicLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MusicLibraryView.init","link":"init"},{"title":"module:MusicLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MusicLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MusicLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MusicLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MusicLibraryView.onGenreItemFocused","link":"onGenreItemFocused","description":"

Genre Item Focused

"},{"title":"module:MusicLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MusicLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MusicLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MusicLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MusicLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MusicLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MusicLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MusicLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MusicLibraryView.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:MusicLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MusicLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MusicSongData","link":"MusicSongData"},{"title":"module:MusicSongData.setFields","link":"setFields"},{"title":"module:MusicSongData.setPoster","link":"setPoster"},{"title":"module:OSD","link":"OSD"},{"title":"module:OSD.inactiveCheck","link":"inactiveCheck","description":"

inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.

"},{"title":"module:OSD.init","link":"init"},{"title":"module:OSD.onButtonSelected","link":"onButtonSelected","description":"

onButtonSelected: Handler for selection of buttons from the menu.

"},{"title":"module:OSD.onFocusChanged","link":"onFocusChanged","description":"

onFocusChanged: Handler for changes to the focus of this menu.

"},{"title":"module:OSD.onItemTitleTextChanged","link":"onItemTitleTextChanged","description":"

onItemTitleTextChanged: Handler for changes to m.top.itemTitleText param.

"},{"title":"module:OSD.onKeyEvent","link":"onKeyEvent"},{"title":"module:OSD.onPlaybackStateChanged","link":"onPlaybackStateChanged","description":"

onPlaybackStateChanged: Handler for changes to m.top.playbackState param

"},{"title":"module:OSD.onProgressPercentageChanged","link":"onProgressPercentageChanged","description":"

onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param

"},{"title":"module:OSD.onVisibleChanged","link":"onVisibleChanged","description":"

onVisibleChanged: Handler for changes to the visibility of this menu.

"},{"title":"module:OSD.resetFocusToDefaultButton","link":"resetFocusToDefaultButton","description":"

resetFocusToDefaultButton: Reset focus back to the default button

"},{"title":"module:OptionNode","link":"OptionNode"},{"title":"module:OptionNode.init","link":"init"},{"title":"module:OptionsButton","link":"OptionsButton"},{"title":"module:OptionsButton.init","link":"init"},{"title":"module:OptionsButton.press","link":"press"},{"title":"module:OptionsData","link":"OptionsData"},{"title":"module:OptionsData.init","link":"init"},{"title":"module:OptionsData.press","link":"press"},{"title":"module:OptionsData.update_title","link":"update_title"},{"title":"module:OptionsSlider","link":"OptionsSlider"},{"title":"module:OptionsSlider.init","link":"init"},{"title":"module:OptionsSlider.onKeyEvent","link":"onKeyEvent"},{"title":"module:OptionsSlider.setFields","link":"setFields"},{"title":"module:OverviewDialog","link":"OverviewDialog"},{"title":"module:OverviewDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:OverviewDialog.setOverview","link":"setOverview"},{"title":"module:OverviewDialog.setTitle","link":"setTitle"},{"title":"module:PersonData","link":"PersonData"},{"title":"module:PersonData.setFields","link":"setFields"},{"title":"module:PersonData.setPoster","link":"setPoster"},{"title":"module:PersonDetails","link":"PersonDetails"},{"title":"module:PersonDetails.createDialogPallete","link":"createDialogPallete"},{"title":"module:PersonDetails.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PersonDetails.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:PersonDetails.init","link":"init"},{"title":"module:PersonDetails.loadPerson","link":"loadPerson"},{"title":"module:PersonDetails.onButtonGroupEscaped","link":"onButtonGroupEscaped"},{"title":"module:PersonDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PersonDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:PersonDetails.shortDate","link":"shortDate"},{"title":"module:PhotoData","link":"PhotoData"},{"title":"module:PhotoData.setFields","link":"setFields"},{"title":"module:PhotoData.setPoster","link":"setPoster"},{"title":"module:PhotoDetails","link":"PhotoDetails"},{"title":"module:PhotoDetails.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook.\nUsed to ensure tasks are stopped

"},{"title":"module:PhotoDetails.init","link":"init"},{"title":"module:PhotoDetails.isRandomChanged","link":"isRandomChanged","description":"

isRandom component field has changed

"},{"title":"module:PhotoDetails.isSlideshowChanged","link":"isSlideshowChanged","description":"

isSlideshow component field has changed

"},{"title":"module:PhotoDetails.isValidToContinue","link":"isValidToContinue"},{"title":"module:PhotoDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:PhotoDetails.nextSlide","link":"nextSlide"},{"title":"module:PhotoDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PhotoDetails.onPhotoLoaded","link":"onPhotoLoaded"},{"title":"module:PhotoDetails.statusUpdate","link":"statusUpdate"},{"title":"module:PlaybackDialog","link":"PlaybackDialog"},{"title":"module:PlaybackDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlayedCheckmark","link":"PlayedCheckmark"},{"title":"module:PlayedCheckmark.init","link":"init"},{"title":"module:PlaylistData","link":"PlaylistData"},{"title":"module:PlaylistData.setFields","link":"setFields"},{"title":"module:PlaylistData.setPoster","link":"setPoster"},{"title":"module:PlaylistView","link":"PlaylistView"},{"title":"module:PlaylistView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:PlaylistView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:PlaylistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:PlaylistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PlaylistView.init","link":"init"},{"title":"module:PlaylistView.onDoneLoading","link":"onDoneLoading"},{"title":"module:PlaylistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlaylistView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:PlaylistView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:PlaylistView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:PlaylistView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:PlaylistView.setupMainNode","link":"setupMainNode"},{"title":"module:PlaystateTask","link":"PlaystateTask"},{"title":"module:PlaystateTask.PlaystateDefaults","link":"PlaystateDefaults"},{"title":"module:PlaystateTask.PlaystateUpdate","link":"PlaystateUpdate"},{"title":"module:PlaystateTask.init","link":"init"},{"title":"module:PostTask","link":"PostTask"},{"title":"module:PostTask.asyncPost","link":"asyncPost","description":"

Post data and wait for response code

"},{"title":"module:PostTask.empty","link":"empty","description":"

Revert PostTask to default state

"},{"title":"module:PostTask.init","link":"init"},{"title":"module:PostTask.postItems","link":"postItems","description":"

Main function for PostTask.\nPosts either an array of data\nor a string of data to an API endpoint.\nSaves the response information

"},{"title":"module:ProgramDetails","link":"ProgramDetails"},{"title":"module:ProgramDetails.channelUpdated","link":"channelUpdated"},{"title":"module:ProgramDetails.focusChanged","link":"focusChanged","description":"

Show view channel button when item has Focus

"},{"title":"module:ProgramDetails.getDurationStringFromSeconds","link":"getDurationStringFromSeconds","description":"

Get program duration string (e.g. 1h 20m)

"},{"title":"module:ProgramDetails.getRelativeDayName","link":"getRelativeDayName","description":"

Get relative date name for a date (yesterday, today, tomorrow, or otherwise weekday name )

"},{"title":"module:ProgramDetails.init","link":"init"},{"title":"module:ProgramDetails.onAnimationComplete","link":"onAnimationComplete"},{"title":"module:ProgramDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:ProgramDetails.programUpdated","link":"programUpdated"},{"title":"module:ProgramDetails.setupLabels","link":"setupLabels","description":"

Set up Live and Repeat label sizes

"},{"title":"module:ProgramDetails.updateLabels","link":"updateLabels"},{"title":"module:PublicUserData","link":"PublicUserData"},{"title":"module:PublicUserData.init","link":"init"},{"title":"module:QueueManager","link":"QueueManager"},{"title":"module:QueueManager.clear","link":"clear","description":"

Clear all content from play queue

"},{"title":"module:QueueManager.clearHold","link":"clearHold","description":"

Clear all hold content

"},{"title":"module:QueueManager.deleteAtIndex","link":"deleteAtIndex","description":"

Delete item from play queue at passed index

"},{"title":"module:QueueManager.getCount","link":"getCount","description":"

Return the number of items in the play queue

"},{"title":"module:QueueManager.getCurrentItem","link":"getCurrentItem","description":"

Return the item currently in focus from the play queue

"},{"title":"module:QueueManager.getHold","link":"getHold","description":"

Return the items in the hold

"},{"title":"module:QueueManager.getIsShuffled","link":"getIsShuffled","description":"

Return whether or not shuffle is enabled

"},{"title":"module:QueueManager.getItemByIndex","link":"getItemByIndex","description":"

Return the item in the passed index from the play queue

"},{"title":"module:QueueManager.getItemType","link":"getItemType"},{"title":"module:QueueManager.getPosition","link":"getPosition","description":"

Returns current playback position within the queue

"},{"title":"module:QueueManager.getQueue","link":"getQueue","description":"

Return the current play queue

"},{"title":"module:QueueManager.getQueueTypes","link":"getQueueTypes","description":"

Return the types of items in current play queue

"},{"title":"module:QueueManager.getQueueUniqueTypes","link":"getQueueUniqueTypes","description":"

Return the unique types of items in current play queue

"},{"title":"module:QueueManager.getUnshuffledQueue","link":"getUnshuffledQueue","description":"

Return original, unshuffled queue

"},{"title":"module:QueueManager.hold","link":"hold","description":"

Hold an item

"},{"title":"module:QueueManager.init","link":"init"},{"title":"module:QueueManager.isPrerollActive","link":"isPrerollActive","description":"

Return isPrerollActive status

"},{"title":"module:QueueManager.moveBack","link":"moveBack","description":"

Move queue position back one

"},{"title":"module:QueueManager.moveForward","link":"moveForward","description":"

Move queue position ahead one

"},{"title":"module:QueueManager.peek","link":"peek","description":"

Return item at end of play queue without removing

"},{"title":"module:QueueManager.playQueue","link":"playQueue","description":"

Play items in queue

"},{"title":"module:QueueManager.pop","link":"pop","description":"

Remove item at end of play queue

"},{"title":"module:QueueManager.push","link":"push","description":"

Push new items to the play queue

"},{"title":"module:QueueManager.resetQueueItemOrder","link":"resetQueueItemOrder","description":"

Reset queue items back to original, unshuffled order

"},{"title":"module:QueueManager.resetShuffle","link":"resetShuffle","description":"

Reset shuffle to off state

"},{"title":"module:QueueManager.set","link":"set","description":"

Replace play queue with passed array

"},{"title":"module:QueueManager.setPosition","link":"setPosition","description":"

Set the queue position

"},{"title":"module:QueueManager.setPrerollStatus","link":"setPrerollStatus","description":"

Set prerollActive status

"},{"title":"module:QueueManager.setTopStartingPoint","link":"setTopStartingPoint","description":"

Set starting point for top item in the queue

"},{"title":"module:QueueManager.shuffleQueueItems","link":"shuffleQueueItems","description":"

Save a copy of the original queue and randomize order of queue items

"},{"title":"module:QueueManager.toggleShuffle","link":"toggleShuffle","description":"

Toggle shuffleEnabled state

"},{"title":"module:QueueManager.top","link":"top","description":"

Return the fitst item in the play queue

"},{"title":"module:QuickConnect","link":"QuickConnect"},{"title":"module:QuickConnect.init","link":"init"},{"title":"module:QuickConnect.monitorQuickConnect","link":"monitorQuickConnect"},{"title":"module:QuickConnectDialog","link":"QuickConnectDialog"},{"title":"module:QuickConnectDialog.OnAuthenticated","link":"OnAuthenticated"},{"title":"module:QuickConnectDialog.init","link":"init"},{"title":"module:QuickConnectDialog.onButtonSelected","link":"onButtonSelected"},{"title":"module:QuickConnectDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:QuickConnectDialog.quickConnectClosed","link":"quickConnectClosed"},{"title":"module:QuickConnectDialog.quickConnectStatus","link":"quickConnectStatus"},{"title":"module:RadioDialog","link":"RadioDialog"},{"title":"module:RadioDialog.init","link":"init"},{"title":"module:RadioDialog.moveScrollBar","link":"moveScrollBar","description":"

Move the popup's scroll bar

"},{"title":"module:RadioDialog.onButtonSelected","link":"onButtonSelected","description":"

Event handler for when user selected a button

"},{"title":"module:RadioDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:RadioDialog.onItemFocused","link":"onItemFocused","description":"

Event handler for when user's cursor highlights an option in the option list

"},{"title":"module:RadioDialog.onItemSelected","link":"onItemSelected","description":"

Once user selected an item, move cursor down to OK button

"},{"title":"module:RadioDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:RadioDialog.onScrollBarFocus","link":"onScrollBarFocus","description":"

If somehow the scrollbar gains focus, set focus back to the option list

"},{"title":"module:RecordProgramTask","link":"RecordProgramTask"},{"title":"module:RecordProgramTask.RecordOrCancelProgram","link":"RecordOrCancelProgram"},{"title":"module:RecordProgramTask.init","link":"init"},{"title":"module:SceneManager","link":"SceneManager"},{"title":"module:SceneManager.clearPreviousScene","link":"clearPreviousScene","description":"

Clear previous scene from group stack

"},{"title":"module:SceneManager.clearScenes","link":"clearScenes","description":"

Clear all content from group stack

"},{"title":"module:SceneManager.deleteSceneAtIndex","link":"deleteSceneAtIndex","description":"

Delete scene from group stack at passed index

"},{"title":"module:SceneManager.dismissDialog","link":"dismissDialog","description":"

Close currently displayed dialog

"},{"title":"module:SceneManager.getActiveScene","link":"getActiveScene","description":"

Return group at top of stack without removing

"},{"title":"module:SceneManager.init","link":"init"},{"title":"module:SceneManager.isDialogOpen","link":"isDialogOpen","description":"

Returns bool indicating if dialog is currently displayed

"},{"title":"module:SceneManager.optionClosed","link":"optionClosed","description":"

Return button the user selected

"},{"title":"module:SceneManager.optionDialog","link":"optionDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.optionSelected","link":"optionSelected","description":"

Return button the user selected

"},{"title":"module:SceneManager.popScene","link":"popScene","description":"

Remove the current group and load the last group from the stack

"},{"title":"module:SceneManager.pushScene","link":"pushScene","description":"

Push a new group onto the stack, replacing the existing group on the screen

"},{"title":"module:SceneManager.radioDialog","link":"radioDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.registerOverhangData","link":"registerOverhangData","description":"

Register observers for overhang data

"},{"title":"module:SceneManager.resetTime","link":"resetTime","description":"

Reset time

"},{"title":"module:SceneManager.settings","link":"settings","description":"

Display user/device settings screen

"},{"title":"module:SceneManager.standardDialog","link":"standardDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.unregisterOverhangData","link":"unregisterOverhangData","description":"

Remove observers for overhang data

"},{"title":"module:SceneManager.updateOptions","link":"updateOptions","description":"

Update options availability

"},{"title":"module:SceneManager.updateOverhangTitle","link":"updateOverhangTitle","description":"

Update overhang title

"},{"title":"module:SceneManager.updateOverhangVisible","link":"updateOverhangVisible","description":"

Update whether the overhang is visible or not

"},{"title":"module:SceneManager.updateUser","link":"updateUser","description":"

Update username in overhang

"},{"title":"module:SceneManager.userMessage","link":"userMessage","description":"

Display dialog to user with an OK button

"},{"title":"module:ScheduleProgramData","link":"ScheduleProgramData"},{"title":"module:ScheduleProgramData.setFields","link":"setFields"},{"title":"module:ScheduleProgramData.setPoster","link":"setPoster"},{"title":"module:SearchBox","link":"SearchBox"},{"title":"module:SearchBox.init","link":"init"},{"title":"module:SearchBox.searchMedias","link":"searchMedias"},{"title":"module:SearchData","link":"SearchData"},{"title":"module:SearchData.setFields","link":"setFields"},{"title":"module:SearchData.setPoster","link":"setPoster"},{"title":"module:SearchResults","link":"SearchResults"},{"title":"module:SearchResults.init","link":"init"},{"title":"module:SearchResults.loadResults","link":"loadResults"},{"title":"module:SearchResults.onKeyEvent","link":"onKeyEvent"},{"title":"module:SearchResults.searchMedias","link":"searchMedias"},{"title":"module:SearchRow","link":"SearchRow"},{"title":"module:SearchRow.addRow","link":"addRow"},{"title":"module:SearchRow.getData","link":"getData"},{"title":"module:SearchRow.init","link":"init"},{"title":"module:SearchRow.updateSize","link":"updateSize"},{"title":"module:SearchTask","link":"SearchTask"},{"title":"module:SearchTask.init","link":"init"},{"title":"module:SearchTask.search","link":"search"},{"title":"module:SeriesData","link":"SeriesData"},{"title":"module:SeriesData.setFields","link":"setFields"},{"title":"module:SeriesData.setPoster","link":"setPoster"},{"title":"module:ServerDiscoveryTask","link":"ServerDiscoveryTask"},{"title":"module:ServerDiscoveryTask.AddServer","link":"AddServer"},{"title":"module:ServerDiscoveryTask.ProcessClientDiscoveryResponse","link":"ProcessClientDiscoveryResponse"},{"title":"module:ServerDiscoveryTask.ProcessSSDPResponse","link":"ProcessSSDPResponse"},{"title":"module:ServerDiscoveryTask.SendClientDiscoveryBroadcast","link":"SendClientDiscoveryBroadcast"},{"title":"module:ServerDiscoveryTask.SendSSDPBroadcast","link":"SendSSDPBroadcast"},{"title":"module:ServerDiscoveryTask.execute","link":"execute"},{"title":"module:ServerDiscoveryTask.init","link":"init","description":"

Task used to discover jellyfin servers on the local network

"},{"title":"module:SetServerScreen","link":"SetServerScreen"},{"title":"module:SetServerScreen.ScanForServers","link":"ScanForServers"},{"title":"module:SetServerScreen.ScanForServersComplete","link":"ScanForServersComplete"},{"title":"module:SetServerScreen.ShowKeyboard","link":"ShowKeyboard"},{"title":"module:SetServerScreen.clearErrorMessage","link":"clearErrorMessage"},{"title":"module:SetServerScreen.init","link":"init"},{"title":"module:SetServerScreen.onDialogButton","link":"onDialogButton"},{"title":"module:SetServerScreen.onKeyEvent","link":"onKeyEvent"},{"title":"module:ShowScenes","link":"ShowScenes"},{"title":"module:ShowScenes.CreateAlbumView","link":"CreateAlbumView","description":"

Shows details on selected album. Description text, image, and list of available songs

"},{"title":"module:ShowScenes.CreateArtistView","link":"CreateArtistView","description":"

Shows details on selected artist. Bio, image, and list of available albums

"},{"title":"module:ShowScenes.CreateHomeGroup","link":"CreateHomeGroup"},{"title":"module:ShowScenes.CreateItemGrid","link":"CreateItemGrid"},{"title":"module:ShowScenes.CreateMovieDetailsGroup","link":"CreateMovieDetailsGroup"},{"title":"module:ShowScenes.CreateMovieLibraryView","link":"CreateMovieLibraryView"},{"title":"module:ShowScenes.CreateMusicLibraryView","link":"CreateMusicLibraryView"},{"title":"module:ShowScenes.CreatePersonView","link":"CreatePersonView"},{"title":"module:ShowScenes.CreatePlaylistView","link":"CreatePlaylistView","description":"

Shows details on selected playlist. Description text, image, and list of available items

"},{"title":"module:ShowScenes.CreateSearchPage","link":"CreateSearchPage"},{"title":"module:ShowScenes.CreateSeasonDetailsGroup","link":"CreateSeasonDetailsGroup"},{"title":"module:ShowScenes.CreateSeasonDetailsGroupByID","link":"CreateSeasonDetailsGroupByID"},{"title":"module:ShowScenes.CreateSeriesDetailsGroup","link":"CreateSeriesDetailsGroup"},{"title":"module:ShowScenes.CreateServerGroup","link":"CreateServerGroup"},{"title":"module:ShowScenes.CreateSigninGroup","link":"CreateSigninGroup"},{"title":"module:ShowScenes.CreateUserSelectGroup","link":"CreateUserSelectGroup"},{"title":"module:ShowScenes.CreateVideoPlayerGroup","link":"CreateVideoPlayerGroup"},{"title":"module:ShowScenes.DeleteFromServerList","link":"DeleteFromServerList"},{"title":"module:ShowScenes.LoginFlow","link":"LoginFlow"},{"title":"module:ShowScenes.SaveServerList","link":"SaveServerList"},{"title":"module:ShowScenes.SendPerformanceBeacon","link":"SendPerformanceBeacon","description":"

Roku Performance monitoring

"},{"title":"module:ShowScenes.playbackOptionDialog","link":"playbackOptionDialog","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:SlideOutButton","link":"SlideOutButton"},{"title":"module:SlideOutButton.init","link":"init"},{"title":"module:SlideOutButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:SlideOutButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:SlideOutButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:SlideOutButton.onHighlightChanged","link":"onHighlightChanged"},{"title":"module:SlideOutButton.onIconChanged","link":"onIconChanged"},{"title":"module:SlideOutButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:SlideOutButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:SlideOutButton.onTextChanged","link":"onTextChanged"},{"title":"module:SlideOutButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:SlideOutButton.setIconSize","link":"setIconSize"},{"title":"module:SongItem","link":"SongItem"},{"title":"module:SongItem.focusChanged","link":"focusChanged"},{"title":"module:SongItem.init","link":"init"},{"title":"module:SongItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:Spinner","link":"Spinner"},{"title":"module:Spinner.init","link":"init"},{"title":"module:StandardDialog","link":"StandardDialog"},{"title":"module:StandardDialog.init","link":"init"},{"title":"module:StandardDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:Subtitles","link":"Subtitles"},{"title":"module:Subtitles.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:Subtitles.changeSubtitleDuringPlayback","link":"changeSubtitleDuringPlayback"},{"title":"module:Subtitles.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

Identify the default subtitle track\nif "requires_text" is true, only return a track if it is textual\nThis allows forcing text subs, since roku requires transcoding of non-text subs\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.defaultSubtitleTrackFromVid","link":"defaultSubtitleTrackFromVid","description":"

Identify the default subtitle track for a given video id\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:Subtitles.getSubtitleSelIdxFromSubIdx","link":"getSubtitleSelIdxFromSubIdx","description":"

The subtitle index on the server differs from the index we track locally\nThis function converts the former into the latter

"},{"title":"module:Subtitles.selectSubtitleTrack","link":"selectSubtitleTrack"},{"title":"module:Subtitles.selectSubtitleTrackDialog","link":"selectSubtitleTrackDialog","description":"

Present Dialog to user to select subtitle track

"},{"title":"module:Subtitles.setupSubtitle","link":"setupSubtitle","description":"

Given a set of subtitles, and a subtitle index (the index on the server, not in the list provided)\nthis will set all relevant settings for roku (mainly closed captions) and return the index of the\nsubtitle track specified, but indexed based on the provided list of subtitles

"},{"title":"module:Subtitles.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:Subtitles.turnoffSubtitles","link":"turnoffSubtitles"},{"title":"module:TVEpisode","link":"TVEpisode"},{"title":"module:TVEpisode.setFields","link":"setFields"},{"title":"module:TVEpisode.setPoster","link":"setPoster"},{"title":"module:TVEpisodeData","link":"TVEpisodeData"},{"title":"module:TVEpisodeData.setFields","link":"setFields"},{"title":"module:TVEpisodeData.setPoster","link":"setPoster"},{"title":"module:TVEpisodeRow","link":"TVEpisodeRow"},{"title":"module:TVEpisodeRow.init","link":"init"},{"title":"module:TVEpisodeRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRow.setData","link":"setData"},{"title":"module:TVEpisodeRow.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRow.updateSize","link":"updateSize"},{"title":"module:TVEpisodeRowWithOptions","link":"TVEpisodeRowWithOptions"},{"title":"module:TVEpisodeRowWithOptions.SetUpAudioOptions","link":"SetUpAudioOptions","description":"

List of audio tracks to choose from

"},{"title":"module:TVEpisodeRowWithOptions.SetUpVideoOptions","link":"SetUpVideoOptions","description":"

List of video versions to choose from

"},{"title":"module:TVEpisodeRowWithOptions.audioOptionsClosed","link":"audioOptionsClosed"},{"title":"module:TVEpisodeRowWithOptions.init","link":"init"},{"title":"module:TVEpisodeRowWithOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRowWithOptions.rowsDoneLoading","link":"rowsDoneLoading"},{"title":"module:TVEpisodeRowWithOptions.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRowWithOptions.videoOptionsClosed","link":"videoOptionsClosed"},{"title":"module:TVEpisodes","link":"TVEpisodes"},{"title":"module:TVEpisodes.getFocusedItem","link":"getFocusedItem","description":"

get the currently focused item

"},{"title":"module:TVEpisodes.init","link":"init"},{"title":"module:TVEpisodes.onKeyEvent","link":"onKeyEvent","description":"

Handle navigation input from the remote and act on it

"},{"title":"module:TVEpisodes.setExtraButtonVisibility","link":"setExtraButtonVisibility","description":"

Updates the visibility of the Extras button based on if this season has any extra features

"},{"title":"module:TVEpisodes.setSeasonLoading","link":"setSeasonLoading"},{"title":"module:TVEpisodes.updateSeason","link":"updateSeason"},{"title":"module:TVListDetails","link":"TVListDetails"},{"title":"module:TVListDetails.DisplayAudioAvailable","link":"DisplayAudioAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one audio track to choose from

"},{"title":"module:TVListDetails.DisplayVideoAvailable","link":"DisplayVideoAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one video version to choose from

"},{"title":"module:TVListDetails.SetupAudioDisplay","link":"SetupAudioDisplay","description":"

Display current audio_codec and check if there is more than one audio track to choose from...

"},{"title":"module:TVListDetails.focusChanged","link":"focusChanged"},{"title":"module:TVListDetails.getEndTime","link":"getEndTime"},{"title":"module:TVListDetails.getRuntime","link":"getRuntime"},{"title":"module:TVListDetails.init","link":"init"},{"title":"module:TVListDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVListOptions","link":"TVListOptions"},{"title":"module:TVListOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:TVListOptions.init","link":"init"},{"title":"module:TVListOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVListOptions.optionsSet","link":"optionsSet"},{"title":"module:TVSeasonData","link":"TVSeasonData"},{"title":"module:TVSeasonData.setFields","link":"setFields"},{"title":"module:TVSeasonData.setPoster","link":"setPoster"},{"title":"module:TVSeasonRow","link":"TVSeasonRow"},{"title":"module:TVSeasonRow.getData","link":"getData"},{"title":"module:TVSeasonRow.init","link":"init"},{"title":"module:TVSeasonRow.updateSize","link":"updateSize"},{"title":"module:TVShowDescription","link":"TVShowDescription"},{"title":"module:TVShowDescription.getEndTime","link":"getEndTime"},{"title":"module:TVShowDescription.getHistory","link":"getHistory"},{"title":"module:TVShowDescription.getRuntime","link":"getRuntime"},{"title":"module:TVShowDescription.init","link":"init"},{"title":"module:TVShowDescription.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDescription.round","link":"round"},{"title":"module:TVShowDescription.setFieldText","link":"setFieldText"},{"title":"module:TVShowDetails","link":"TVShowDetails"},{"title":"module:TVShowDetails.getEndTime","link":"getEndTime"},{"title":"module:TVShowDetails.getHistory","link":"getHistory"},{"title":"module:TVShowDetails.getRuntime","link":"getRuntime"},{"title":"module:TVShowDetails.init","link":"init"},{"title":"module:TVShowDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVShowDetails.onShuffleEpisodeDataLoaded","link":"onShuffleEpisodeDataLoaded"},{"title":"module:TVShowDetails.round","link":"round"},{"title":"module:TVShowDetails.setFieldText","link":"setFieldText"},{"title":"module:TextSizeTask","link":"TextSizeTask"},{"title":"module:TextSizeTask.getTextSize","link":"getTextSize"},{"title":"module:TextSizeTask.init","link":"init"},{"title":"module:UserData","link":"UserData"},{"title":"module:UserData.getPreference","link":"getPreference"},{"title":"module:UserData.loadFromJSON","link":"loadFromJSON"},{"title":"module:UserData.loadFromRegistry","link":"loadFromRegistry"},{"title":"module:UserData.removeFromRegistry","link":"removeFromRegistry"},{"title":"module:UserData.saveToRegistry","link":"saveToRegistry"},{"title":"module:UserData.setDataFromJSON","link":"setDataFromJSON"},{"title":"module:UserData.setPreference","link":"setPreference"},{"title":"module:UserData.setServer","link":"setServer"},{"title":"module:UserItem","link":"UserItem"},{"title":"module:UserItem.init","link":"init"},{"title":"module:UserItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserLibrary","link":"UserLibrary"},{"title":"module:UserLibrary.MarkItemFavorite","link":"MarkItemFavorite"},{"title":"module:UserLibrary.MarkItemWatched","link":"MarkItemWatched"},{"title":"module:UserLibrary.UnmarkItemFavorite","link":"UnmarkItemFavorite"},{"title":"module:UserLibrary.UnmarkItemWatched","link":"UnmarkItemWatched"},{"title":"module:UserRow","link":"UserRow"},{"title":"module:UserRow.init","link":"init"},{"title":"module:UserRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserRow.setData","link":"setData"},{"title":"module:UserRow.setUser","link":"setUser"},{"title":"module:UserRow.updateSize","link":"updateSize"},{"title":"module:UserSelect","link":"UserSelect"},{"title":"module:UserSelect.init","link":"init"},{"title":"module:UserSelect.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserSelect.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserSelect.redraw","link":"redraw"},{"title":"module:VideoData","link":"VideoData"},{"title":"module:VideoData.setFields","link":"setFields"},{"title":"module:VideoData.setPoster","link":"setPoster"},{"title":"module:VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.AddVideoContent","link":"AddVideoContent"},{"title":"module:VideoPlayer.GetPlaybackInfo","link":"GetPlaybackInfo","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:VideoPlayer.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:VideoPlayer.PlayIntroVideo","link":"PlayIntroVideo"},{"title":"module:VideoPlayer.VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.autoPlayNextEpisode","link":"autoPlayNextEpisode"},{"title":"module:VideoPlayer.directPlaySupported","link":"directPlaySupported"},{"title":"module:VideoPlayer.getAudioFormat","link":"getAudioFormat"},{"title":"module:VideoPlayer.getAudioInfo","link":"getAudioInfo"},{"title":"module:VideoPlayer.getContainerType","link":"getContainerType"},{"title":"module:VideoPlayer.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:VideoPlayer.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:VideoPlayer.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:VideoPlayer.startPlayBackOver","link":"startPlayBackOver","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:VideoPlayerView","link":"VideoPlayerView"},{"title":"module:VideoPlayerView.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:VideoPlayerView.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:VideoPlayerView.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:VideoPlayerView.getCurrentChapterIndex","link":"getCurrentChapterIndex","description":"

getCurrentChapterIndex: Finds current chapter index

"},{"title":"module:VideoPlayerView.handleChapterListAction","link":"handleChapterListAction","description":"

handleChapterListAction: Handles action to show chapter list

"},{"title":"module:VideoPlayerView.handleChapterSkipAction","link":"handleChapterSkipAction","description":"

handleChapterSkipAction: Handles user command to skip chapters in playing video

"},{"title":"module:VideoPlayerView.handleHideAction","link":"handleHideAction","description":"

handleHideAction: Handles action to hide OSD menu

"},{"title":"module:VideoPlayerView.handleShowSubtitleMenuAction","link":"handleShowSubtitleMenuAction","description":"

handleShowSubtitleMenuAction: Handles action to show subtitle selection menu

"},{"title":"module:VideoPlayerView.handleShowVideoInfoPopupAction","link":"handleShowVideoInfoPopupAction","description":"

handleShowVideoInfoPopupAction: Handles action to show video info popup

"},{"title":"module:VideoPlayerView.handleVideoPlayPauseAction","link":"handleVideoPlayPauseAction","description":"

handleVideoPlayPauseAction: Handles action to either play or pause the video content

"},{"title":"module:VideoPlayerView.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:VideoPlayerView.init","link":"init"},{"title":"module:VideoPlayerView.loadCaption","link":"loadCaption","description":"

Set caption url to server subtitle track

"},{"title":"module:VideoPlayerView.onAllowCaptionsChange","link":"onAllowCaptionsChange","description":"

Only setup caption items if captions are allowed

"},{"title":"module:VideoPlayerView.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:VideoPlayerView.onKeyEvent","link":"onKeyEvent"},{"title":"module:VideoPlayerView.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:VideoPlayerView.onOSDAction","link":"onOSDAction","description":"

onOSDAction: Process action events from OSD to their respective handlers

"},{"title":"module:VideoPlayerView.onPlaybackErrorButtonSelected","link":"onPlaybackErrorButtonSelected"},{"title":"module:VideoPlayerView.onPlaybackErrorDialogClosed","link":"onPlaybackErrorDialogClosed"},{"title":"module:VideoPlayerView.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onSubtitleChange","link":"onSubtitleChange","description":"

Event handler for when selectedSubtitle changes

"},{"title":"module:VideoPlayerView.onVideoContentLoaded","link":"onVideoContentLoaded"},{"title":"module:VideoPlayerView.populateChapterMenu","link":"populateChapterMenu","description":"

populateChapterMenu: ' Parse chapter data from API and appeand to chapter list menu

"},{"title":"module:VideoPlayerView.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:VideoPlayerView.showPlaybackErrorDialog","link":"showPlaybackErrorDialog"},{"title":"module:VideoPlayerView.stateAllowsOSD","link":"stateAllowsOSD","description":"

stateAllowsOSD: Check if current video state allows showing the OSD

"},{"title":"module:VideoPlayerView.toggleCaption","link":"toggleCaption","description":"

Toggles visibility of custom subtitles and sets captionTask's player state

"},{"title":"module:VideoPlayerView.updateCaption","link":"updateCaption","description":"

Removes old subtitle lines and adds new subtitle lines

"},{"title":"module:VideoPlayerView.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:VideoTrackListItem","link":"VideoTrackListItem"},{"title":"module:VideoTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:VideoTrackListItem.init","link":"init"},{"title":"module:VideoTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ViewCreator","link":"ViewCreator"},{"title":"module:ViewCreator.CreateAudioPlayerView","link":"CreateAudioPlayerView","description":"

Play Audio

"},{"title":"module:ViewCreator.CreateVideoPlayerView","link":"CreateVideoPlayerView","description":"

Play Video

"},{"title":"module:ViewCreator.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:ViewCreator.onPlaybackInfoLoaded","link":"onPlaybackInfoLoaded","description":"

The playback info task has returned data

"},{"title":"module:ViewCreator.onSelectPlaybackInfoPressed","link":"onSelectPlaybackInfoPressed","description":"

User requested playback info

"},{"title":"module:ViewCreator.onSelectSubtitlePressed","link":"onSelectSubtitlePressed","description":"

User requested subtitle selection popup

"},{"title":"module:ViewCreator.onSelectionMade","link":"onSelectionMade","description":"

User has selected something from the radioDialog popup

"},{"title":"module:ViewCreator.onStateChange","link":"onStateChange","description":"

Playback state change event handlers

"},{"title":"module:ViewCreator.processSubtitleSelection","link":"processSubtitleSelection"},{"title":"module:WhatsNewDialog","link":"WhatsNewDialog"},{"title":"module:WhatsNewDialog.init","link":"init"},{"title":"module:WhatsNewDialog.setPalette","link":"setPalette"},{"title":"module:baserequest","link":"baserequest"},{"title":"module:baserequest.APIRequest","link":"APIRequest"},{"title":"module:baserequest.authRequest","link":"authRequest","description":"

Takes and returns a roUrlTransfer object after adding a Jellyfin "Authorization" header

"},{"title":"module:baserequest.buildAuthHeader","link":"buildAuthHeader","description":"

Returns a string containing the "Authorization" header payload

"},{"title":"module:baserequest.buildParams","link":"buildParams","description":"

Functions for making requests to the API

"},{"title":"module:baserequest.buildURL","link":"buildURL"},{"title":"module:baserequest.deleteVoid","link":"deleteVoid"},{"title":"module:baserequest.getJson","link":"getJson"},{"title":"module:baserequest.getString","link":"getString"},{"title":"module:baserequest.getVoid","link":"getVoid"},{"title":"module:baserequest.get_url","link":"get_url"},{"title":"module:baserequest.headVoid","link":"headVoid"},{"title":"module:baserequest.postJson","link":"postJson"},{"title":"module:baserequest.postString","link":"postString"},{"title":"module:baserequest.postVoid","link":"postVoid"},{"title":"module:baserequest.setCertificateAuthority","link":"setCertificateAuthority","description":"

sets the certificate authority by file path on the passed node

"},{"title":"module:captionTask","link":"captionTask"},{"title":"module:captionTask.fetchCaption","link":"fetchCaption"},{"title":"module:captionTask.init","link":"init"},{"title":"module:captionTask.isTime","link":"isTime"},{"title":"module:captionTask.newLayoutGroup","link":"newLayoutGroup"},{"title":"module:captionTask.newRect","link":"newRect"},{"title":"module:captionTask.newlabel","link":"newlabel"},{"title":"module:captionTask.parseVTT","link":"parseVTT"},{"title":"module:captionTask.setFont","link":"setFont"},{"title":"module:captionTask.toMs","link":"toMs"},{"title":"module:captionTask.updateCaption","link":"updateCaption"},{"title":"module:conditional","link":"conditional"},{"title":"module:conditional.printRegistry","link":"printRegistry","description":"

Print out all of the registry contents to the debug log

"},{"title":"module:config","link":"config"},{"title":"module:config.GetConfigTree","link":"GetConfigTree","description":"

Read config tree from json config file and return

"},{"title":"module:config.RegistryReadAll","link":"RegistryReadAll","description":"

Return all data found inside a registry section

"},{"title":"module:config.findConfigTreeKey","link":"findConfigTreeKey","description":"

Recursivly search the config tree for entry with settingname equal to key

"},{"title":"module:config.getRegistrySections","link":"getRegistrySections","description":"

Return an array of all the registry section keys

"},{"title":"module:config.getSavedUsers","link":"getSavedUsers","description":"

Returns an array of saved users from the registry\nthat belong to the active server

"},{"title":"module:config.get_setting","link":"get_setting","description":"

"Jellyfin" registry accessors for the default global settings

"},{"title":"module:config.get_user_setting","link":"get_user_setting","description":"

User registry accessors for the currently active user

"},{"title":"module:config.registry_delete","link":"registry_delete"},{"title":"module:config.registry_read","link":"registry_read","description":"

Generic registry accessors

"},{"title":"module:config.registry_write","link":"registry_write"},{"title":"module:config.set_setting","link":"set_setting"},{"title":"module:config.set_user_setting","link":"set_user_setting"},{"title":"module:config.unset_setting","link":"unset_setting"},{"title":"module:config.unset_user_setting","link":"unset_user_setting"},{"title":"module:deviceCapabilities","link":"deviceCapabilities"},{"title":"module:deviceCapabilities.GetBitRateLimit","link":"GetBitRateLimit"},{"title":"module:deviceCapabilities.GetDirectPlayProfiles","link":"GetDirectPlayProfiles"},{"title":"module:deviceCapabilities.getCodecProfiles","link":"getCodecProfiles"},{"title":"module:deviceCapabilities.getContainerProfiles","link":"getContainerProfiles"},{"title":"module:deviceCapabilities.getDeviceCapabilities","link":"getDeviceCapabilities","description":"

Returns the Device Capabilities for Roku.\nAlso prints out the device profile for debugging

"},{"title":"module:deviceCapabilities.getDeviceProfile","link":"getDeviceProfile"},{"title":"module:deviceCapabilities.getMaxHeightArray","link":"getMaxHeightArray"},{"title":"module:deviceCapabilities.getMaxWidthArray","link":"getMaxWidthArray"},{"title":"module:deviceCapabilities.getSubtitleProfiles","link":"getSubtitleProfiles"},{"title":"module:deviceCapabilities.getTranscodingProfiles","link":"getTranscodingProfiles"},{"title":"module:deviceCapabilities.printDeviceProfile","link":"printDeviceProfile","description":"

Print out the deviceProfile for debugging

"},{"title":"module:deviceCapabilities.removeDecimals","link":"removeDecimals","description":"

Remove all decimals from a string

"},{"title":"module:deviceCapabilities.setPreferredCodec","link":"setPreferredCodec","description":"

Takes and returns a comma delimited string of codecs.\nMoves the preferred codec to the front of the string

"},{"title":"module:deviceCapabilities.updateProfileArray","link":"updateProfileArray","description":"

Recieves and returns an assArray of supported profiles and levels for each video codec

"},{"title":"module:globals","link":"globals"},{"title":"module:globals.SaveAppToGlobal","link":"SaveAppToGlobal","description":"

Save information from roAppInfo to m.global.app

"},{"title":"module:globals.SaveDeviceToGlobal","link":"SaveDeviceToGlobal","description":"

Save information from roDeviceInfo to m.global.device

"},{"title":"module:globals.setConstants","link":"setConstants","description":"

Set global constants

"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.runGlobalMigrations","link":"runGlobalMigrations","description":"

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

"},{"title":"module:migrations.runRegistryUserMigrations","link":"runRegistryUserMigrations"},{"title":"module:misc","link":"misc"},{"title":"module:misc.AssocArrayEqual","link":"AssocArrayEqual"},{"title":"module:misc.arrayHasValue","link":"arrayHasValue","description":"

Check if a specific value is inside of an array

"},{"title":"module:misc.div_ceiling","link":"div_ceiling"},{"title":"module:misc.findNodeBySubtype","link":"findNodeBySubtype"},{"title":"module:misc.formatTime","link":"formatTime","description":"

Format time as 12 or 24 hour format based on system clock setting

"},{"title":"module:misc.getButton","link":"getButton"},{"title":"module:misc.getMinutes","link":"getMinutes","description":"

Converts ticks to minutes

"},{"title":"module:misc.getMsgPicker","link":"getMsgPicker"},{"title":"module:misc.get_dialog_result","link":"get_dialog_result","description":"

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

"},{"title":"module:misc.inArray","link":"inArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:misc.inferServerUrl","link":"inferServerUrl","description":"

take an incomplete url string and use it to make educated guesses about\nthe complete url. then tests these guesses to see if it can find a jf server\nreturns the url of the server it found, or an empty string

"},{"title":"module:misc.isJellyfinServer","link":"isJellyfinServer","description":"

accepts the raw json string of /system/info/public and returns\na boolean indicating if ProductName is "Jellyfin Server"

"},{"title":"module:misc.isLocalhost","link":"isLocalhost","description":"

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

"},{"title":"module:misc.isNodeEvent","link":"isNodeEvent"},{"title":"module:misc.isValid","link":"isValid","description":"

Returns whether or not passed value is valid

"},{"title":"module:misc.isValidAndNotEmpty","link":"isValidAndNotEmpty","description":"

Returns whether or not passed value is valid and not empty\nAccepts a string, or any countable type (arrays and lists)

"},{"title":"module:misc.lastFocusedChild","link":"lastFocusedChild"},{"title":"module:misc.leftPad","link":"leftPad"},{"title":"module:misc.message_dialog","link":"message_dialog"},{"title":"module:misc.option_dialog","link":"option_dialog"},{"title":"module:misc.parseUrl","link":"parseUrl","description":"

Returns an array from a url = [ url, proto, host, port, subdir+params ]\nIf port or subdir are not found, an empty string will be added to the array\nProto must be declared or array will be empty

"},{"title":"module:misc.roundNumber","link":"roundNumber","description":"

Rounds number to nearest integer

"},{"title":"module:misc.secondsToHuman","link":"secondsToHuman"},{"title":"module:misc.setFieldTextValue","link":"setFieldTextValue"},{"title":"module:misc.show_dialog","link":"show_dialog"},{"title":"module:misc.shuffleArray","link":"shuffleArray","description":"

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

"},{"title":"module:misc.startLoadingSpinner","link":"startLoadingSpinner"},{"title":"module:misc.startMediaLoadingSpinner","link":"startMediaLoadingSpinner"},{"title":"module:misc.stopLoadingSpinner","link":"stopLoadingSpinner"},{"title":"module:misc.ticksToHuman","link":"ticksToHuman"},{"title":"module:misc.toString","link":"toString"},{"title":"module:misc.urlCandidates","link":"urlCandidates","description":"

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates\nfor the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated\nfull urls.

"},{"title":"module:misc.versionChecker","link":"versionChecker","description":"

Returns whether or not a version number (e.g. 10.7.7) is greater or equal\nto some minimum version allowed (e.g. 10.8.0)

"},{"title":"module:quickplay","link":"quickplay"},{"title":"module:quickplay.album","link":"album","description":"

A music album.\nPlay the entire album starting with track 1.

"},{"title":"module:quickplay.artist","link":"artist","description":"

A music artist.\nShuffle play all songs by artist.

"},{"title":"module:quickplay.audio","link":"audio","description":"

A single audio file.

"},{"title":"module:quickplay.boxset","link":"boxset","description":"

A boxset.\nPlay all items inside.

"},{"title":"module:quickplay.collectionFolder","link":"collectionFolder","description":"

Quick Play A CollectionFolder.\nShuffle play the items inside\nwith some differences based on collectionType.

"},{"title":"module:quickplay.folder","link":"folder","description":"

Quick Play A folder.\nShuffle play all items found

"},{"title":"module:quickplay.multipleSeries","link":"multipleSeries","description":"

More than one TV Show Series.\nShuffle play all watched episodes

"},{"title":"module:quickplay.musicVideo","link":"musicVideo","description":"

A single music video file.

"},{"title":"module:quickplay.person","link":"person","description":"

Quick Play A Person.\nShuffle play all videos found

"},{"title":"module:quickplay.photo","link":"photo","description":"

A single photo.

"},{"title":"module:quickplay.photoAlbum","link":"photoAlbum","description":"

A photo album.

"},{"title":"module:quickplay.playlist","link":"playlist","description":"

Quick Play A Playlist.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.program","link":"program","description":"

Quick Play A Live Program

"},{"title":"module:quickplay.pushToQueue","link":"pushToQueue","description":"

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

"},{"title":"module:quickplay.season","link":"season","description":"

A TV Show Season.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.series","link":"series","description":"

A TV Show Series.\nPlay the first unwatched episode.\nIf none, shuffle play the whole series.

"},{"title":"module:quickplay.tvChannel","link":"tvChannel","description":"

Quick Play A TVChannel

"},{"title":"module:quickplay.userView","link":"userView","description":"

Quick Play A UserView.\nPlay logic depends on "collectionType".

"},{"title":"module:quickplay.video","link":"video","description":"

A single video file.

"},{"title":"module:schedule","link":"schedule"},{"title":"module:schedule.channelFilterSet","link":"channelFilterSet"},{"title":"module:schedule.channelsearchTermSet","link":"channelsearchTermSet","description":"

Voice Search set

"},{"title":"module:schedule.focusProgramDetails","link":"focusProgramDetails","description":"

Move the TV Guide Grid down or up depending whether details are selected

"},{"title":"module:schedule.init","link":"init"},{"title":"module:schedule.onChannelsLoaded","link":"onChannelsLoaded","description":"

Initial list of channels loaded

"},{"title":"module:schedule.onGridScrolled","link":"onGridScrolled","description":"

As user scrolls grid, check if more data requries to be loaded

"},{"title":"module:schedule.onKeyEvent","link":"onKeyEvent"},{"title":"module:schedule.onProgramDetailsLoaded","link":"onProgramDetailsLoaded","description":"

Update the Program Details with full information

"},{"title":"module:schedule.onProgramFocused","link":"onProgramFocused"},{"title":"module:schedule.onProgramSelected","link":"onProgramSelected"},{"title":"module:schedule.onRecordChannelSelected","link":"onRecordChannelSelected","description":"

Handle user selecting "Record Channel" from Program Details

"},{"title":"module:schedule.onRecordOperationDone","link":"onRecordOperationDone"},{"title":"module:schedule.onRecordSeriesChannelSelected","link":"onRecordSeriesChannelSelected","description":"

Handle user selecting "Record Series" from Program Details

"},{"title":"module:schedule.onScheduleLoaded","link":"onScheduleLoaded","description":"

When LoadScheduleTask completes (initial or more data) and we have a schedule to display

"},{"title":"module:schedule.onWatchChannelSelected","link":"onWatchChannelSelected","description":"

Handle user selecting "Watch Channel" from Program Details

"},{"title":"module:section","link":"section"},{"title":"module:section.init","link":"init"},{"title":"module:section.onFocusChange","link":"onFocusChange"},{"title":"module:section.onIDChange","link":"onIDChange"},{"title":"module:section.onTranslationChange","link":"onTranslationChange"},{"title":"module:section.scrollDownToOnDeck","link":"scrollDownToOnDeck"},{"title":"module:section.scrollOffBottom","link":"scrollOffBottom"},{"title":"module:section.scrollOffOnDeck","link":"scrollOffOnDeck"},{"title":"module:section.scrollOffTop","link":"scrollOffTop"},{"title":"module:section.scrollUpToOnDeck","link":"scrollUpToOnDeck"},{"title":"module:section.showFromBottom","link":"showFromBottom"},{"title":"module:section.showFromTop","link":"showFromTop"},{"title":"module:sectionScroller","link":"sectionScroller"},{"title":"module:sectionScroller.displayedIndexChanged","link":"displayedIndexChanged"},{"title":"module:sectionScroller.init","link":"init"},{"title":"module:sectionScroller.onFocusChange","link":"onFocusChange"},{"title":"module:settings","link":"settings"},{"title":"module:settings.LoadMenu","link":"LoadMenu"},{"title":"module:settings.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook that gets ran as needed.\nAssumes settings were changed and they affect the device profile.\nPosts a new device profile to the server using the task thread

"},{"title":"module:settings.boolSettingChanged","link":"boolSettingChanged"},{"title":"module:settings.init","link":"init"},{"title":"module:settings.isFormInFocus","link":"isFormInFocus","description":"

Returns true if any of the data entry forms are in focus

"},{"title":"module:settings.onKeyEvent","link":"onKeyEvent"},{"title":"module:settings.onKeyGridEscape","link":"onKeyGridEscape"},{"title":"module:settings.onKeyGridSubmit","link":"onKeyGridSubmit"},{"title":"module:settings.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:settings.radioSettingChanged","link":"radioSettingChanged"},{"title":"module:settings.settingFocused","link":"settingFocused"},{"title":"module:settings.settingSelected","link":"settingSelected"},{"title":"module:userauth","link":"userauth"},{"title":"module:userauth.AboutMe","link":"AboutMe"},{"title":"module:userauth.AuthenticateViaQuickConnect","link":"AuthenticateViaQuickConnect"},{"title":"module:userauth.AvailableUsers","link":"AvailableUsers"},{"title":"module:userauth.GetPublicUsers","link":"GetPublicUsers"},{"title":"module:userauth.LoadUserAbilities","link":"LoadUserAbilities"},{"title":"module:userauth.ServerInfo","link":"ServerInfo"},{"title":"module:userauth.SignOut","link":"SignOut"},{"title":"module:userauth.checkQuickConnect","link":"checkQuickConnect"},{"title":"module:userauth.get_token","link":"get_token"},{"title":"module:userauth.initQuickConnect","link":"initQuickConnect"}]} \ No newline at end of file +{"list":[{"title":"module:AlbumData","link":"AlbumData"},{"title":"module:AlbumData.setFields","link":"setFields"},{"title":"module:AlbumGrid","link":"AlbumGrid"},{"title":"module:AlbumGrid.getData","link":"getData"},{"title":"module:AlbumGrid.init","link":"init"},{"title":"module:AlbumGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumTrackList","link":"AlbumTrackList"},{"title":"module:AlbumTrackList.getData","link":"getData"},{"title":"module:AlbumTrackList.init","link":"init"},{"title":"module:AlbumView","link":"AlbumView"},{"title":"module:AlbumView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:AlbumView.createDialogPallete","link":"createDialogPallete"},{"title":"module:AlbumView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:AlbumView.init","link":"init"},{"title":"module:AlbumView.onDoneLoading","link":"onDoneLoading"},{"title":"module:AlbumView.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:AlbumView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AlbumView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AlbumView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AlbumView.setupMainNode","link":"setupMainNode"},{"title":"module:Alpha","link":"Alpha"},{"title":"module:Alpha.init","link":"init"},{"title":"module:Alpha.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView","link":"ArtistView"},{"title":"module:ArtistView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:ArtistView.OnScreenShown","link":"OnScreenShown"},{"title":"module:ArtistView.artistOverviewChanged","link":"artistOverviewChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:ArtistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:ArtistView.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:ArtistView.init","link":"init"},{"title":"module:ArtistView.onAlbumsData","link":"onAlbumsData"},{"title":"module:ArtistView.onAlbumsEscape","link":"onAlbumsEscape"},{"title":"module:ArtistView.onAppearsOnData","link":"onAppearsOnData"},{"title":"module:ArtistView.onAppearsOnEscape","link":"onAppearsOnEscape"},{"title":"module:ArtistView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:ArtistView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:ArtistView.onEllipsisChanged","link":"onEllipsisChanged"},{"title":"module:ArtistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView.onSectionNavigationEscape","link":"onSectionNavigationEscape"},{"title":"module:ArtistView.onSectionNavigationSelected","link":"onSectionNavigationSelected"},{"title":"module:ArtistView.onSectionScrollerChange","link":"onSectionScrollerChange"},{"title":"module:ArtistView.pageContentChanged","link":"pageContentChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:ArtistView.setPosterImage","link":"setPosterImage"},{"title":"module:ArtistView.setScreenTitle","link":"setScreenTitle"},{"title":"module:ArtistView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:ArtistView.setupMainNode","link":"setupMainNode"},{"title":"module:AudioPlayer","link":"AudioPlayer"},{"title":"module:AudioPlayer.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:AudioPlayer.audioStateChanged","link":"audioStateChanged","description":"

State Change Event Handler

"},{"title":"module:AudioPlayer.init","link":"init"},{"title":"module:AudioPlayerView","link":"AudioPlayerView"},{"title":"module:AudioPlayerView.LoadNextSong","link":"LoadNextSong"},{"title":"module:AudioPlayerView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:AudioPlayerView.audioPositionChanged","link":"audioPositionChanged"},{"title":"module:AudioPlayerView.audioStateChanged","link":"audioStateChanged"},{"title":"module:AudioPlayerView.bufferPositionChanged","link":"bufferPositionChanged"},{"title":"module:AudioPlayerView.endScreenSaver","link":"endScreenSaver"},{"title":"module:AudioPlayerView.findCurrentSongIndex","link":"findCurrentSongIndex"},{"title":"module:AudioPlayerView.init","link":"init"},{"title":"module:AudioPlayerView.loadButtons","link":"loadButtons","description":"

If we have more and 1 song to play, fade in the next and previous controls

"},{"title":"module:AudioPlayerView.loopClicked","link":"loopClicked"},{"title":"module:AudioPlayerView.nextClicked","link":"nextClicked"},{"title":"module:AudioPlayerView.onAudioStreamLoaded","link":"onAudioStreamLoaded"},{"title":"module:AudioPlayerView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:AudioPlayerView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:AudioPlayerView.onKeyEvent","link":"onKeyEvent","description":"

Process key press events

"},{"title":"module:AudioPlayerView.onMetaDataLoaded","link":"onMetaDataLoaded"},{"title":"module:AudioPlayerView.onScreensaverTimeoutLoaded","link":"onScreensaverTimeoutLoaded"},{"title":"module:AudioPlayerView.pageContentChanged","link":"pageContentChanged","description":"

Update values on screen when page content changes

"},{"title":"module:AudioPlayerView.playAction","link":"playAction"},{"title":"module:AudioPlayerView.previousClicked","link":"previousClicked"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.screenSaverActive","link":"screenSaverActive"},{"title":"module:AudioPlayerView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:AudioPlayerView.setLoopButtonImage","link":"setLoopButtonImage"},{"title":"module:AudioPlayerView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AudioPlayerView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AudioPlayerView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AudioPlayerView.setShuffleIconState","link":"setShuffleIconState"},{"title":"module:AudioPlayerView.setTrackNumberDisplay","link":"setTrackNumberDisplay"},{"title":"module:AudioPlayerView.setupAnimationTasks","link":"setupAnimationTasks"},{"title":"module:AudioPlayerView.setupAudioNode","link":"setupAudioNode","description":"

Creates audio node used to play song(s)

"},{"title":"module:AudioPlayerView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:AudioPlayerView.setupDataTasks","link":"setupDataTasks","description":"

Creates tasks to gather data needed to render Scene and play song

"},{"title":"module:AudioPlayerView.setupInfoNodes","link":"setupInfoNodes"},{"title":"module:AudioPlayerView.setupScreenSaver","link":"setupScreenSaver"},{"title":"module:AudioPlayerView.shuffleClicked","link":"shuffleClicked"},{"title":"module:AudioPlayerView.startScreenSaver","link":"startScreenSaver"},{"title":"module:AudioPlayerView.toggleShuffleEnabled","link":"toggleShuffleEnabled"},{"title":"module:AudioTrackListItem","link":"AudioTrackListItem"},{"title":"module:AudioTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:AudioTrackListItem.init","link":"init"},{"title":"module:AudioTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ButtonGroupHoriz","link":"ButtonGroupHoriz"},{"title":"module:ButtonGroupHoriz.init","link":"init"},{"title":"module:ButtonGroupHoriz.onKeyEvent","link":"onKeyEvent"},{"title":"module:ButtonGroupVert","link":"ButtonGroupVert"},{"title":"module:ButtonGroupVert.init","link":"init"},{"title":"module:ButtonGroupVert.onFocusButtonChanged","link":"onFocusButtonChanged"},{"title":"module:ButtonGroupVert.onFocusChanged","link":"onFocusChanged"},{"title":"module:ButtonGroupVert.onKeyEvent","link":"onKeyEvent"},{"title":"module:ChannelData","link":"ChannelData"},{"title":"module:ChannelData.setFields","link":"setFields"},{"title":"module:ChannelData.setPoster","link":"setPoster"},{"title":"module:Clock","link":"Clock"},{"title":"module:Clock.init","link":"init"},{"title":"module:Clock.onCurrentTimeTimerFire","link":"onCurrentTimeTimerFire","description":"

onCurrentTimeTimerFire: Code that runs every time the currentTimeTimer fires

"},{"title":"module:CollectionData","link":"CollectionData"},{"title":"module:CollectionData.setFields","link":"setFields"},{"title":"module:CollectionData.setPoster","link":"setPoster"},{"title":"module:ConfigData","link":"ConfigData"},{"title":"module:ConfigData.init","link":"init"},{"title":"module:ConfigItem","link":"ConfigItem"},{"title":"module:ConfigItem.init","link":"init"},{"title":"module:ConfigItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ConfigItem.setColors","link":"setColors"},{"title":"module:ConfigList","link":"ConfigList"},{"title":"module:ConfigList.configListShowDialog","link":"configListShowDialog"},{"title":"module:ConfigList.dismiss_dialog","link":"dismiss_dialog"},{"title":"module:ConfigList.init","link":"init"},{"title":"module:ConfigList.onDialogButton","link":"onDialogButton"},{"title":"module:ConfigList.onItemSelected","link":"onItemSelected"},{"title":"module:ConfigList.setData","link":"setData"},{"title":"module:ExtrasItem","link":"ExtrasItem"},{"title":"module:ExtrasItem.focusChanged","link":"focusChanged"},{"title":"module:ExtrasItem.init","link":"init"},{"title":"module:ExtrasItem.showContent","link":"showContent"},{"title":"module:ExtrasRowList","link":"ExtrasRowList"},{"title":"module:ExtrasRowList.addRowSize","link":"addRowSize"},{"title":"module:ExtrasRowList.buildRow","link":"buildRow"},{"title":"module:ExtrasRowList.init","link":"init"},{"title":"module:ExtrasRowList.loadParts","link":"loadParts"},{"title":"module:ExtrasRowList.loadPersonVideos","link":"loadPersonVideos"},{"title":"module:ExtrasRowList.onAdditionalPartsLoaded","link":"onAdditionalPartsLoaded"},{"title":"module:ExtrasRowList.onLikeThisLoaded","link":"onLikeThisLoaded"},{"title":"module:ExtrasRowList.onMoviesLoaded","link":"onMoviesLoaded"},{"title":"module:ExtrasRowList.onPeopleLoaded","link":"onPeopleLoaded"},{"title":"module:ExtrasRowList.onRowItemFocused","link":"onRowItemFocused"},{"title":"module:ExtrasRowList.onRowItemSelected","link":"onRowItemSelected"},{"title":"module:ExtrasRowList.onSeriesLoaded","link":"onSeriesLoaded"},{"title":"module:ExtrasRowList.onShowsLoaded","link":"onShowsLoaded"},{"title":"module:ExtrasRowList.onSpecialFeaturesLoaded","link":"onSpecialFeaturesLoaded"},{"title":"module:ExtrasRowList.updateSize","link":"updateSize"},{"title":"module:FavoriteItemsTask","link":"FavoriteItemsTask"},{"title":"module:FavoriteItemsTask.init","link":"init"},{"title":"module:FavoriteItemsTask.setFavoriteStatus","link":"setFavoriteStatus"},{"title":"module:FolderData","link":"FolderData"},{"title":"module:FolderData.setFields","link":"setFields"},{"title":"module:FolderData.setPoster","link":"setPoster"},{"title":"module:GetFiltersTask","link":"GetFiltersTask"},{"title":"module:GetFiltersTask.getFiltersTask","link":"getFiltersTask"},{"title":"module:GetFiltersTask.init","link":"init"},{"title":"module:GetNextEpisodeTask","link":"GetNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.getNextEpisodeTask","link":"getNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.init","link":"init"},{"title":"module:GetPlaybackInfoTask","link":"GetPlaybackInfoTask"},{"title":"module:GetPlaybackInfoTask.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:GetPlaybackInfoTask.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:GetPlaybackInfoTask.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:GetPlaybackInfoTask.getPlaybackInfoTask","link":"getPlaybackInfoTask","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:GetPlaybackInfoTask.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:GetPlaybackInfoTask.init","link":"init"},{"title":"module:GetShuffleEpisodesTask","link":"GetShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.getShuffleEpisodesTask","link":"getShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.init","link":"init"},{"title":"module:GridItem","link":"GridItem"},{"title":"module:GridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:GridItem.focusChanging","link":"focusChanging","description":"

Use FocusPercent to animate scaling of Poser Image

"},{"title":"module:GridItem.init","link":"init"},{"title":"module:GridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:GridItemSmall","link":"GridItemSmall"},{"title":"module:GridItemSmall.focusChanged","link":"focusChanged"},{"title":"module:GridItemSmall.init","link":"init"},{"title":"module:GridItemSmall.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItemSmall.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:Home","link":"Home"},{"title":"module:Home.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook that gets ran as needed.\nUsed to update the focus, the state of the data, and tells the server about the device profile

"},{"title":"module:Home.init","link":"init"},{"title":"module:Home.loadLibraries","link":"loadLibraries"},{"title":"module:Home.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:Home.refresh","link":"refresh"},{"title":"module:HomeData","link":"HomeData"},{"title":"module:HomeData.setData","link":"setData"},{"title":"module:HomeItem","link":"HomeItem"},{"title":"module:HomeItem.drawProgressBar","link":"drawProgressBar","description":"

Draws and animates item progress bar

"},{"title":"module:HomeItem.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:HomeItem.init","link":"init"},{"title":"module:HomeItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:HomeItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and icon when poster loaded

"},{"title":"module:HomeRows","link":"HomeRows"},{"title":"module:HomeRows.addHomeSection","link":"addHomeSection","description":"

Adds a new home section to the home rows.\nReturns a boolean indicating whether the section was handled.

"},{"title":"module:HomeRows.createContinueWatchingRow","link":"createContinueWatchingRow","description":"

Create a row displaying items the user can continue watching

"},{"title":"module:HomeRows.createFavoritesRow","link":"createFavoritesRow","description":"

Create a row displaying items from the user's favorites list

"},{"title":"module:HomeRows.createLatestInRows","link":"createLatestInRows","description":"

Create a row displaying latest items in each of the user's libraries

"},{"title":"module:HomeRows.createLibraryRow","link":"createLibraryRow","description":"

Create a row displaying the user's libraries

"},{"title":"module:HomeRows.createLiveTVRow","link":"createLiveTVRow","description":"

Create a row displaying the live tv now on section

"},{"title":"module:HomeRows.createNextUpRow","link":"createNextUpRow","description":"

Create a row displaying next episodes up to watch

"},{"title":"module:HomeRows.filterNodeArray","link":"filterNodeArray"},{"title":"module:HomeRows.init","link":"init"},{"title":"module:HomeRows.itemSelected","link":"itemSelected"},{"title":"module:HomeRows.loadLibraries","link":"loadLibraries"},{"title":"module:HomeRows.onKeyEvent","link":"onKeyEvent"},{"title":"module:HomeRows.onLibrariesLoaded","link":"onLibrariesLoaded"},{"title":"module:HomeRows.removeHomeSection","link":"removeHomeSection","description":"

Removes a home section from the home rows

"},{"title":"module:HomeRows.updateContinueWatchingItems","link":"updateContinueWatchingItems"},{"title":"module:HomeRows.updateFavoritesItems","link":"updateFavoritesItems"},{"title":"module:HomeRows.updateHomeRows","link":"updateHomeRows","description":"

Update home row data

"},{"title":"module:HomeRows.updateLatestInRows","link":"updateLatestInRows","description":"

Iterate over user's libraries and update data for each Latest In section

"},{"title":"module:HomeRows.updateLatestItems","link":"updateLatestItems"},{"title":"module:HomeRows.updateNextUpItems","link":"updateNextUpItems"},{"title":"module:HomeRows.updateOnNowItems","link":"updateOnNowItems"},{"title":"module:HomeRows.updateSize","link":"updateSize"},{"title":"module:HomeRows.updateSizeArray","link":"updateSizeArray"},{"title":"module:IconButton","link":"IconButton"},{"title":"module:IconButton.init","link":"init"},{"title":"module:IconButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:IconButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:IconButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:IconButton.onIconChanged","link":"onIconChanged"},{"title":"module:IconButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:IconButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:IconButton.onTextChanged","link":"onTextChanged"},{"title":"module:IconButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:IconButton.setIconSize","link":"setIconSize"},{"title":"module:Image","link":"Image"},{"title":"module:Image.ImageURL","link":"ImageURL"},{"title":"module:Image.ItemImages","link":"ItemImages"},{"title":"module:Image.PosterImage","link":"PosterImage"},{"title":"module:Image.UserImageURL","link":"UserImageURL"},{"title":"module:ImageData","link":"ImageData"},{"title":"module:ImageData.setFields","link":"setFields"},{"title":"module:IntegerKeyboard","link":"IntegerKeyboard"},{"title":"module:IntegerKeyboard.init","link":"init"},{"title":"module:IntegerKeyboard.keySelected","link":"keySelected"},{"title":"module:IntegerKeyboard.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid","link":"ItemGrid"},{"title":"module:ItemGrid.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:ItemGrid.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:ItemGrid.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:ItemGrid.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:ItemGrid.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:ItemGrid.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:ItemGrid.init","link":"init"},{"title":"module:ItemGrid.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:ItemGrid.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:ItemGrid.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:ItemGrid.onChannelFocused","link":"onChannelFocused"},{"title":"module:ItemGrid.onChannelSelected","link":"onChannelSelected"},{"title":"module:ItemGrid.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:ItemGrid.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:ItemGrid.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:ItemGrid.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:ItemGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:ItemGrid.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:ItemGrid.setBoxsetsOptions","link":"setBoxsetsOptions","description":"

Set Boxset view, sort, and filter options

"},{"title":"module:ItemGrid.setDefaultOptions","link":"setDefaultOptions","description":"

Set Default view, sort, and filter options

"},{"title":"module:ItemGrid.setLiveTvOptions","link":"setLiveTvOptions","description":"

Set Live TV view, sort, and filter options

"},{"title":"module:ItemGrid.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:ItemGrid.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:ItemGrid.setPhotoAlbumOptions","link":"setPhotoAlbumOptions","description":"

Set Photo Album view, sort, and filter options

"},{"title":"module:ItemGrid.setTvShowsOptions","link":"setTvShowsOptions","description":"

Set TV Show view, sort, and filter options

"},{"title":"module:ItemGrid.showTVGuide","link":"showTVGuide"},{"title":"module:ItemGrid.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:ItemGrid.updateTitle","link":"updateTitle"},{"title":"module:ItemGridOptions","link":"ItemGridOptions"},{"title":"module:ItemGridOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:ItemGridOptions.hideChecklist","link":"hideChecklist"},{"title":"module:ItemGridOptions.init","link":"init"},{"title":"module:ItemGridOptions.isFilterMenuDataValid","link":"isFilterMenuDataValid","description":"

Check if data for Filter Menu is valid

"},{"title":"module:ItemGridOptions.onFilterFocusChange","link":"onFilterFocusChange"},{"title":"module:ItemGridOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGridOptions.optionsSet","link":"optionsSet"},{"title":"module:ItemGridOptions.saveFavoriteItemSelected","link":"saveFavoriteItemSelected"},{"title":"module:ItemGridOptions.setHeartColor","link":"setHeartColor"},{"title":"module:ItemGridOptions.showChecklist","link":"showChecklist"},{"title":"module:ItemGridOptions.toggleFavorite","link":"toggleFavorite"},{"title":"module:Items","link":"Items"},{"title":"module:Items.AppearsOnList","link":"AppearsOnList","description":"

Get list of albums an artist appears on

"},{"title":"module:Items.ArtistOverview","link":"ArtistOverview","description":"

Music Artist Data

"},{"title":"module:Items.AudioItem","link":"AudioItem","description":"

Get Songs that are on an Album

"},{"title":"module:Items.AudioStream","link":"AudioStream"},{"title":"module:Items.BackdropImage","link":"BackdropImage"},{"title":"module:Items.CreateArtistMix","link":"CreateArtistMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.CreateInstantMix","link":"CreateInstantMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.GetIntroVideos","link":"GetIntroVideos","description":"

Get Intro Videos for an item

"},{"title":"module:Items.GetSongsByArtist","link":"GetSongsByArtist","description":"

Get list of songs belonging to an artist

"},{"title":"module:Items.ItemGetPlaybackInfo","link":"ItemGetPlaybackInfo"},{"title":"module:Items.ItemMetaData","link":"ItemMetaData","description":"

MetaData about an item

"},{"title":"module:Items.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:Items.MusicAlbumList","link":"MusicAlbumList","description":"

Get list of albums belonging to an artist

"},{"title":"module:Items.MusicSongList","link":"MusicSongList","description":"

Get Songs that are on an Album

"},{"title":"module:Items.PlaylistItemList","link":"PlaylistItemList","description":"

Get Items that are under the provided item

"},{"title":"module:Items.TVEpisodeShuffleList","link":"TVEpisodeShuffleList"},{"title":"module:Items.TVEpisodes","link":"TVEpisodes","description":"

Returns a list of TV Shows for a given TV Show and season\nAccepts strings for the TV Show Id and the season Id

"},{"title":"module:Items.TVSeasonExtras","link":"TVSeasonExtras","description":"

Returns a list of extra features for a TV Show season\nAccepts a string that is a TV Show season id

"},{"title":"module:Items.TVSeasons","link":"TVSeasons","description":"

Seasons for a TV Show

"},{"title":"module:Items.searchMedia","link":"searchMedia","description":"

Search across all libraries

"},{"title":"module:Items.useTranscodeAudioStream","link":"useTranscodeAudioStream"},{"title":"module:JFButton","link":"JFButton"},{"title":"module:JFButton.init","link":"init"},{"title":"module:JFButton.onTextChanged","link":"onTextChanged","description":"

Whenever the text changes, pad both sides with whitespace so we can center the button text

"},{"title":"module:JFButtons","link":"JFButtons"},{"title":"module:JFButtons.focusChanged","link":"focusChanged","description":"

Change opacity of the highlighted menu item based on focus

"},{"title":"module:JFButtons.highlightSelected","link":"highlightSelected","description":"

Highlight selected menu option

"},{"title":"module:JFButtons.init","link":"init"},{"title":"module:JFButtons.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFButtons.renderChanged","link":"renderChanged","description":"

When options are fully displayed, set focus and selected option

"},{"title":"module:JFButtons.selectedIndexChanged","link":"selectedIndexChanged","description":"

When Selected Index set, ensure it is the one Focused

"},{"title":"module:JFButtons.showButtons","link":"showButtons"},{"title":"module:JFButtons.updateButtons","link":"updateButtons"},{"title":"module:JFGroup","link":"JFGroup"},{"title":"module:JFGroup.init","link":"init"},{"title":"module:JFGroup.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog","link":"JFMessageDialog"},{"title":"module:JFMessageDialog.init","link":"init"},{"title":"module:JFMessageDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog.redraw","link":"redraw"},{"title":"module:JFMessageDialog.updateMessage","link":"updateMessage"},{"title":"module:JFMessageDialog.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang","link":"JFOverhang"},{"title":"module:JFOverhang.init","link":"init"},{"title":"module:JFOverhang.onVisibleChange","link":"onVisibleChange"},{"title":"module:JFOverhang.resetTime","link":"resetTime"},{"title":"module:JFOverhang.setClockVisibility","link":"setClockVisibility"},{"title":"module:JFOverhang.setRightSeperatorVisibility","link":"setRightSeperatorVisibility"},{"title":"module:JFOverhang.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang.updateTime","link":"updateTime"},{"title":"module:JFOverhang.updateTimeDisplay","link":"updateTimeDisplay"},{"title":"module:JFOverhang.updateTitle","link":"updateTitle"},{"title":"module:JFOverhang.updateUser","link":"updateUser"},{"title":"module:JFScene","link":"JFScene"},{"title":"module:JFScene.disableRemoteChanged","link":"disableRemoteChanged","description":"

Triggered when the disableRemote boolean component field is changed

"},{"title":"module:JFScene.init","link":"init"},{"title":"module:JFScene.isLoadingChanged","link":"isLoadingChanged","description":"

Triggered when the isLoading boolean component field is changed

"},{"title":"module:JFScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFScreen","link":"JFScreen"},{"title":"module:JFScreen.OnScreenHidden","link":"OnScreenHidden","description":"

Function called when the screen is hidden by the screen manager\nIt is expected that screens override this function if required,\nto handle focus any actions required on the screen being hidden

"},{"title":"module:JFScreen.OnScreenShown","link":"OnScreenShown","description":"

Function called when the screen is displayed by the screen manager\nIt is expected that screens override this function to handle focus\nmanagmenet and any other actions required on screen shown

"},{"title":"module:JFScreen.init","link":"init"},{"title":"module:JFServer","link":"JFServer"},{"title":"module:JFServer.init","link":"init"},{"title":"module:JFServer.itemContentChanged","link":"itemContentChanged"},{"title":"module:JFServer.onFocusPercentChange","link":"onFocusPercentChange"},{"title":"module:JFServer.setTextColor","link":"setTextColor"},{"title":"module:JFVideo","link":"JFVideo"},{"title":"module:JFVideo.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:JFVideo.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:JFVideo.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:JFVideo.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:JFVideo.init","link":"init"},{"title":"module:JFVideo.loadCaption","link":"loadCaption"},{"title":"module:JFVideo.onAllowCaptionsChange","link":"onAllowCaptionsChange"},{"title":"module:JFVideo.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:JFVideo.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFVideo.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:JFVideo.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:JFVideo.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:JFVideo.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:JFVideo.toggleCaption","link":"toggleCaption"},{"title":"module:JFVideo.updateCaption","link":"updateCaption"},{"title":"module:JFVideo.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:ListPoster","link":"ListPoster"},{"title":"module:ListPoster.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:ListPoster.init","link":"init"},{"title":"module:ListPoster.itemContentChanged","link":"itemContentChanged"},{"title":"module:ListPoster.updateSize","link":"updateSize"},{"title":"module:LoadChannelsTask","link":"LoadChannelsTask"},{"title":"module:LoadChannelsTask.init","link":"init"},{"title":"module:LoadChannelsTask.loadChannels","link":"loadChannels"},{"title":"module:LoadItemsTask","link":"LoadItemsTask"},{"title":"module:LoadItemsTask.getPersonVideos","link":"getPersonVideos"},{"title":"module:LoadItemsTask.init","link":"init"},{"title":"module:LoadItemsTask.loadItems","link":"loadItems"},{"title":"module:LoadItemsTask2","link":"LoadItemsTask2"},{"title":"module:LoadItemsTask2.init","link":"init"},{"title":"module:LoadItemsTask2.loadItems","link":"loadItems"},{"title":"module:LoadPhotoTask","link":"LoadPhotoTask"},{"title":"module:LoadPhotoTask.init","link":"init"},{"title":"module:LoadPhotoTask.loadItems","link":"loadItems"},{"title":"module:LoadProgramDetailsTask","link":"LoadProgramDetailsTask"},{"title":"module:LoadProgramDetailsTask.init","link":"init"},{"title":"module:LoadProgramDetailsTask.loadProgramDetails","link":"loadProgramDetails"},{"title":"module:LoadScreenSaverTimeoutTask","link":"LoadScreenSaverTimeoutTask"},{"title":"module:LoadScreenSaverTimeoutTask.getScreensaverTimeout","link":"getScreensaverTimeout"},{"title":"module:LoadScreenSaverTimeoutTask.init","link":"init"},{"title":"module:LoadSheduleTask","link":"LoadSheduleTask"},{"title":"module:LoadSheduleTask.init","link":"init"},{"title":"module:LoadSheduleTask.loadSchedule","link":"loadSchedule"},{"title":"module:LoadVideoContentTask","link":"LoadVideoContentTask"},{"title":"module:LoadVideoContentTask.FindPreferredAudioStream","link":"FindPreferredAudioStream"},{"title":"module:LoadVideoContentTask.LoadItems_AddVideoContent","link":"LoadItems_AddVideoContent"},{"title":"module:LoadVideoContentTask.LoadItems_VideoPlayer","link":"LoadItems_VideoPlayer"},{"title":"module:LoadVideoContentTask.addNextEpisodesToQueue","link":"addNextEpisodesToQueue","description":"

Add next episodes to the playback queue

"},{"title":"module:LoadVideoContentTask.addSubtitlesToVideo","link":"addSubtitlesToVideo"},{"title":"module:LoadVideoContentTask.addVideoContentURL","link":"addVideoContentURL"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"title":"module:LoadVideoContentTask.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:LoadVideoContentTask.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:LoadVideoContentTask.init","link":"init"},{"title":"module:LoadVideoContentTask.loadItems","link":"loadItems"},{"title":"module:LoadVideoContentTask.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:LoginScene","link":"LoginScene"},{"title":"module:LoginScene.init","link":"init"},{"title":"module:LoginScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:Main","link":"Main"},{"title":"module:Main.Main","link":"Main"},{"title":"module:MovieData","link":"MovieData"},{"title":"module:MovieData.setContainer","link":"setContainer"},{"title":"module:MovieData.setFields","link":"setFields"},{"title":"module:MovieData.setPoster","link":"setPoster"},{"title":"module:MovieDetails","link":"MovieDetails"},{"title":"module:MovieDetails.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieDetails.SetDefaultAudioTrack","link":"SetDefaultAudioTrack"},{"title":"module:MovieDetails.SetUpAudioOptions","link":"SetUpAudioOptions"},{"title":"module:MovieDetails.SetUpVideoOptions","link":"SetUpVideoOptions"},{"title":"module:MovieDetails.audioOptionsClosed","link":"audioOptionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieDetails.getEndTime","link":"getEndTime"},{"title":"module:MovieDetails.getRuntime","link":"getRuntime"},{"title":"module:MovieDetails.init","link":"init"},{"title":"module:MovieDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:MovieDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieDetails.round","link":"round"},{"title":"module:MovieDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:MovieDetails.setFieldText","link":"setFieldText"},{"title":"module:MovieDetails.setWatchedColor","link":"setWatchedColor"},{"title":"module:MovieDetails.trailerAvailableChanged","link":"trailerAvailableChanged"},{"title":"module:MovieDetails.videoOptionsClosed","link":"videoOptionsClosed","description":"

Check if options were updated and if any reloding is needed...

"},{"title":"module:MovieLibraryView","link":"MovieLibraryView"},{"title":"module:MovieLibraryView.FilterDataLoaded","link":"FilterDataLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MovieLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MovieLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MovieLibraryView.SetName","link":"SetName","description":"

Set Selected Movie Name

"},{"title":"module:MovieLibraryView.SetOfficialRating","link":"SetOfficialRating","description":"

Set Selected Movie OfficialRating

"},{"title":"module:MovieLibraryView.SetOverview","link":"SetOverview","description":"

Set Selected Movie Overview

"},{"title":"module:MovieLibraryView.SetProductionYear","link":"SetProductionYear","description":"

Set Selected Movie ProductionYear

"},{"title":"module:MovieLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MovieLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MovieLibraryView.getRuntime","link":"getRuntime"},{"title":"module:MovieLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MovieLibraryView.init","link":"init"},{"title":"module:MovieLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MovieLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MovieLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MovieLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MovieLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MovieLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MovieLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MovieLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MovieLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MovieLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieLibraryView.round","link":"round"},{"title":"module:MovieLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MovieLibraryView.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:MovieLibraryView.setSelectedOptions","link":"setSelectedOptions","description":"

Data to display when options button selected

"},{"title":"module:MovieLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MovieLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MovieOptions","link":"MovieOptions"},{"title":"module:MovieOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:MovieOptions.init","link":"init"},{"title":"module:MovieOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieOptions.optionsSet","link":"optionsSet"},{"title":"module:MusicAlbumData","link":"MusicAlbumData"},{"title":"module:MusicAlbumData.setFields","link":"setFields"},{"title":"module:MusicAlbumData.setPoster","link":"setPoster"},{"title":"module:MusicAlbumSongListData","link":"MusicAlbumSongListData"},{"title":"module:MusicAlbumSongListData.setFields","link":"setFields"},{"title":"module:MusicAlbumSongListData.setPoster","link":"setPoster"},{"title":"module:MusicArtistData","link":"MusicArtistData"},{"title":"module:MusicArtistData.setFields","link":"setFields"},{"title":"module:MusicArtistData.setPoster","link":"setPoster"},{"title":"module:MusicArtistGridItem","link":"MusicArtistGridItem"},{"title":"module:MusicArtistGridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:MusicArtistGridItem.init","link":"init"},{"title":"module:MusicArtistGridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:MusicArtistGridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:MusicLibraryView","link":"MusicLibraryView"},{"title":"module:MusicLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MusicLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MusicLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MusicLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MusicLibraryView.SetAlbumCount","link":"SetAlbumCount","description":"

Set Selected Artist Album Count

"},{"title":"module:MusicLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MusicLibraryView.SetGenres","link":"SetGenres","description":"

Set Selected Artist Genres

"},{"title":"module:MusicLibraryView.SetName","link":"SetName","description":"

Set Selected Artist Name

"},{"title":"module:MusicLibraryView.SetSongCount","link":"SetSongCount","description":"

Set Selected Artist Song Count

"},{"title":"module:MusicLibraryView.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:MusicLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MusicLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MusicLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MusicLibraryView.init","link":"init"},{"title":"module:MusicLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MusicLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MusicLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MusicLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MusicLibraryView.onGenreItemFocused","link":"onGenreItemFocused","description":"

Genre Item Focused

"},{"title":"module:MusicLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MusicLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MusicLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MusicLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MusicLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MusicLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MusicLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MusicLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MusicLibraryView.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:MusicLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MusicLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MusicSongData","link":"MusicSongData"},{"title":"module:MusicSongData.setFields","link":"setFields"},{"title":"module:MusicSongData.setPoster","link":"setPoster"},{"title":"module:OSD","link":"OSD"},{"title":"module:OSD.inactiveCheck","link":"inactiveCheck","description":"

inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.

"},{"title":"module:OSD.init","link":"init"},{"title":"module:OSD.onButtonSelected","link":"onButtonSelected","description":"

onButtonSelected: Handler for selection of buttons from the menu.

"},{"title":"module:OSD.onFocusChanged","link":"onFocusChanged","description":"

onFocusChanged: Handler for changes to the focus of this menu.

"},{"title":"module:OSD.onItemTitleTextChanged","link":"onItemTitleTextChanged","description":"

onItemTitleTextChanged: Handler for changes to m.top.itemTitleText param.

"},{"title":"module:OSD.onKeyEvent","link":"onKeyEvent"},{"title":"module:OSD.onPlaybackStateChanged","link":"onPlaybackStateChanged","description":"

onPlaybackStateChanged: Handler for changes to m.top.playbackState param

"},{"title":"module:OSD.onProgressPercentageChanged","link":"onProgressPercentageChanged","description":"

onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param

"},{"title":"module:OSD.onVisibleChanged","link":"onVisibleChanged","description":"

onVisibleChanged: Handler for changes to the visibility of this menu.

"},{"title":"module:OSD.resetFocusToDefaultButton","link":"resetFocusToDefaultButton","description":"

resetFocusToDefaultButton: Reset focus back to the default button

"},{"title":"module:OptionNode","link":"OptionNode"},{"title":"module:OptionNode.init","link":"init"},{"title":"module:OptionsButton","link":"OptionsButton"},{"title":"module:OptionsButton.init","link":"init"},{"title":"module:OptionsButton.press","link":"press"},{"title":"module:OptionsData","link":"OptionsData"},{"title":"module:OptionsData.init","link":"init"},{"title":"module:OptionsData.press","link":"press"},{"title":"module:OptionsData.update_title","link":"update_title"},{"title":"module:OptionsSlider","link":"OptionsSlider"},{"title":"module:OptionsSlider.init","link":"init"},{"title":"module:OptionsSlider.onKeyEvent","link":"onKeyEvent"},{"title":"module:OptionsSlider.setFields","link":"setFields"},{"title":"module:OverviewDialog","link":"OverviewDialog"},{"title":"module:OverviewDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:OverviewDialog.setOverview","link":"setOverview"},{"title":"module:OverviewDialog.setTitle","link":"setTitle"},{"title":"module:PersonData","link":"PersonData"},{"title":"module:PersonData.setFields","link":"setFields"},{"title":"module:PersonData.setPoster","link":"setPoster"},{"title":"module:PersonDetails","link":"PersonDetails"},{"title":"module:PersonDetails.createDialogPallete","link":"createDialogPallete"},{"title":"module:PersonDetails.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PersonDetails.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:PersonDetails.init","link":"init"},{"title":"module:PersonDetails.loadPerson","link":"loadPerson"},{"title":"module:PersonDetails.onButtonGroupEscaped","link":"onButtonGroupEscaped"},{"title":"module:PersonDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PersonDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:PersonDetails.shortDate","link":"shortDate"},{"title":"module:PhotoData","link":"PhotoData"},{"title":"module:PhotoData.setFields","link":"setFields"},{"title":"module:PhotoData.setPoster","link":"setPoster"},{"title":"module:PhotoDetails","link":"PhotoDetails"},{"title":"module:PhotoDetails.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook.\nUsed to ensure tasks are stopped

"},{"title":"module:PhotoDetails.init","link":"init"},{"title":"module:PhotoDetails.isRandomChanged","link":"isRandomChanged","description":"

isRandom component field has changed

"},{"title":"module:PhotoDetails.isSlideshowChanged","link":"isSlideshowChanged","description":"

isSlideshow component field has changed

"},{"title":"module:PhotoDetails.isValidToContinue","link":"isValidToContinue"},{"title":"module:PhotoDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:PhotoDetails.nextSlide","link":"nextSlide"},{"title":"module:PhotoDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PhotoDetails.onPhotoLoaded","link":"onPhotoLoaded"},{"title":"module:PhotoDetails.statusUpdate","link":"statusUpdate"},{"title":"module:PlaybackDialog","link":"PlaybackDialog"},{"title":"module:PlaybackDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlayedCheckmark","link":"PlayedCheckmark"},{"title":"module:PlayedCheckmark.init","link":"init"},{"title":"module:PlaylistData","link":"PlaylistData"},{"title":"module:PlaylistData.setFields","link":"setFields"},{"title":"module:PlaylistData.setPoster","link":"setPoster"},{"title":"module:PlaylistView","link":"PlaylistView"},{"title":"module:PlaylistView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:PlaylistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:PlaylistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PlaylistView.init","link":"init"},{"title":"module:PlaylistView.onDoneLoading","link":"onDoneLoading"},{"title":"module:PlaylistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlaylistView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:PlaylistView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:PlaylistView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:PlaylistView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:PlaylistView.setupMainNode","link":"setupMainNode"},{"title":"module:PlaystateTask","link":"PlaystateTask"},{"title":"module:PlaystateTask.PlaystateDefaults","link":"PlaystateDefaults"},{"title":"module:PlaystateTask.PlaystateUpdate","link":"PlaystateUpdate"},{"title":"module:PlaystateTask.init","link":"init"},{"title":"module:PostTask","link":"PostTask"},{"title":"module:PostTask.asyncPost","link":"asyncPost","description":"

Post data and wait for response code

"},{"title":"module:PostTask.empty","link":"empty","description":"

Revert PostTask to default state

"},{"title":"module:PostTask.init","link":"init"},{"title":"module:PostTask.postItems","link":"postItems","description":"

Main function for PostTask.\nPosts either an array of data\nor a string of data to an API endpoint.\nSaves the response information

"},{"title":"module:ProgramDetails","link":"ProgramDetails"},{"title":"module:ProgramDetails.channelUpdated","link":"channelUpdated"},{"title":"module:ProgramDetails.focusChanged","link":"focusChanged","description":"

Show view channel button when item has Focus

"},{"title":"module:ProgramDetails.getDurationStringFromSeconds","link":"getDurationStringFromSeconds","description":"

Get program duration string (e.g. 1h 20m)

"},{"title":"module:ProgramDetails.getRelativeDayName","link":"getRelativeDayName","description":"

Get relative date name for a date (yesterday, today, tomorrow, or otherwise weekday name )

"},{"title":"module:ProgramDetails.init","link":"init"},{"title":"module:ProgramDetails.onAnimationComplete","link":"onAnimationComplete"},{"title":"module:ProgramDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:ProgramDetails.programUpdated","link":"programUpdated"},{"title":"module:ProgramDetails.setupLabels","link":"setupLabels","description":"

Set up Live and Repeat label sizes

"},{"title":"module:ProgramDetails.updateLabels","link":"updateLabels"},{"title":"module:PublicUserData","link":"PublicUserData"},{"title":"module:PublicUserData.init","link":"init"},{"title":"module:QueueManager","link":"QueueManager"},{"title":"module:QueueManager.clear","link":"clear","description":"

Clear all content from play queue

"},{"title":"module:QueueManager.clearHold","link":"clearHold","description":"

Clear all hold content

"},{"title":"module:QueueManager.deleteAtIndex","link":"deleteAtIndex","description":"

Delete item from play queue at passed index

"},{"title":"module:QueueManager.getCount","link":"getCount","description":"

Return the number of items in the play queue

"},{"title":"module:QueueManager.getCurrentItem","link":"getCurrentItem","description":"

Return the item currently in focus from the play queue

"},{"title":"module:QueueManager.getHold","link":"getHold","description":"

Return the items in the hold

"},{"title":"module:QueueManager.getIsShuffled","link":"getIsShuffled","description":"

Return whether or not shuffle is enabled

"},{"title":"module:QueueManager.getItemByIndex","link":"getItemByIndex","description":"

Return the item in the passed index from the play queue

"},{"title":"module:QueueManager.getItemType","link":"getItemType"},{"title":"module:QueueManager.getPosition","link":"getPosition","description":"

Returns current playback position within the queue

"},{"title":"module:QueueManager.getQueue","link":"getQueue","description":"

Return the current play queue

"},{"title":"module:QueueManager.getQueueTypes","link":"getQueueTypes","description":"

Return the types of items in current play queue

"},{"title":"module:QueueManager.getQueueUniqueTypes","link":"getQueueUniqueTypes","description":"

Return the unique types of items in current play queue

"},{"title":"module:QueueManager.getUnshuffledQueue","link":"getUnshuffledQueue","description":"

Return original, unshuffled queue

"},{"title":"module:QueueManager.hold","link":"hold","description":"

Hold an item

"},{"title":"module:QueueManager.init","link":"init"},{"title":"module:QueueManager.isPrerollActive","link":"isPrerollActive","description":"

Return isPrerollActive status

"},{"title":"module:QueueManager.moveBack","link":"moveBack","description":"

Move queue position back one

"},{"title":"module:QueueManager.moveForward","link":"moveForward","description":"

Move queue position ahead one

"},{"title":"module:QueueManager.peek","link":"peek","description":"

Return item at end of play queue without removing

"},{"title":"module:QueueManager.playQueue","link":"playQueue","description":"

Play items in queue

"},{"title":"module:QueueManager.pop","link":"pop","description":"

Remove item at end of play queue

"},{"title":"module:QueueManager.push","link":"push","description":"

Push new items to the play queue

"},{"title":"module:QueueManager.resetQueueItemOrder","link":"resetQueueItemOrder","description":"

Reset queue items back to original, unshuffled order

"},{"title":"module:QueueManager.resetShuffle","link":"resetShuffle","description":"

Reset shuffle to off state

"},{"title":"module:QueueManager.set","link":"set","description":"

Replace play queue with passed array

"},{"title":"module:QueueManager.setPosition","link":"setPosition","description":"

Set the queue position

"},{"title":"module:QueueManager.setPrerollStatus","link":"setPrerollStatus","description":"

Set prerollActive status

"},{"title":"module:QueueManager.setTopStartingPoint","link":"setTopStartingPoint","description":"

Set starting point for top item in the queue

"},{"title":"module:QueueManager.shuffleQueueItems","link":"shuffleQueueItems","description":"

Save a copy of the original queue and randomize order of queue items

"},{"title":"module:QueueManager.toggleShuffle","link":"toggleShuffle","description":"

Toggle shuffleEnabled state

"},{"title":"module:QueueManager.top","link":"top","description":"

Return the fitst item in the play queue

"},{"title":"module:QuickConnect","link":"QuickConnect"},{"title":"module:QuickConnect.init","link":"init"},{"title":"module:QuickConnect.monitorQuickConnect","link":"monitorQuickConnect"},{"title":"module:QuickConnectDialog","link":"QuickConnectDialog"},{"title":"module:QuickConnectDialog.OnAuthenticated","link":"OnAuthenticated"},{"title":"module:QuickConnectDialog.init","link":"init"},{"title":"module:QuickConnectDialog.onButtonSelected","link":"onButtonSelected"},{"title":"module:QuickConnectDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:QuickConnectDialog.quickConnectClosed","link":"quickConnectClosed"},{"title":"module:QuickConnectDialog.quickConnectStatus","link":"quickConnectStatus"},{"title":"module:RadioDialog","link":"RadioDialog"},{"title":"module:RadioDialog.init","link":"init"},{"title":"module:RadioDialog.moveScrollBar","link":"moveScrollBar","description":"

Move the popup's scroll bar

"},{"title":"module:RadioDialog.onButtonSelected","link":"onButtonSelected","description":"

Event handler for when user selected a button

"},{"title":"module:RadioDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:RadioDialog.onItemFocused","link":"onItemFocused","description":"

Event handler for when user's cursor highlights an option in the option list

"},{"title":"module:RadioDialog.onItemSelected","link":"onItemSelected","description":"

Once user selected an item, move cursor down to OK button

"},{"title":"module:RadioDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:RadioDialog.onScrollBarFocus","link":"onScrollBarFocus","description":"

If somehow the scrollbar gains focus, set focus back to the option list

"},{"title":"module:RecordProgramTask","link":"RecordProgramTask"},{"title":"module:RecordProgramTask.RecordOrCancelProgram","link":"RecordOrCancelProgram"},{"title":"module:RecordProgramTask.init","link":"init"},{"title":"module:SceneManager","link":"SceneManager"},{"title":"module:SceneManager.clearPreviousScene","link":"clearPreviousScene","description":"

Clear previous scene from group stack

"},{"title":"module:SceneManager.clearScenes","link":"clearScenes","description":"

Clear all content from group stack

"},{"title":"module:SceneManager.deleteSceneAtIndex","link":"deleteSceneAtIndex","description":"

Delete scene from group stack at passed index

"},{"title":"module:SceneManager.dismissDialog","link":"dismissDialog","description":"

Close currently displayed dialog

"},{"title":"module:SceneManager.getActiveScene","link":"getActiveScene","description":"

Return group at top of stack without removing

"},{"title":"module:SceneManager.init","link":"init"},{"title":"module:SceneManager.isDialogOpen","link":"isDialogOpen","description":"

Returns bool indicating if dialog is currently displayed

"},{"title":"module:SceneManager.optionClosed","link":"optionClosed","description":"

Return button the user selected

"},{"title":"module:SceneManager.optionDialog","link":"optionDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.optionSelected","link":"optionSelected","description":"

Return button the user selected

"},{"title":"module:SceneManager.popScene","link":"popScene","description":"

Remove the current group and load the last group from the stack

"},{"title":"module:SceneManager.pushScene","link":"pushScene","description":"

Push a new group onto the stack, replacing the existing group on the screen

"},{"title":"module:SceneManager.radioDialog","link":"radioDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.registerOverhangData","link":"registerOverhangData","description":"

Register observers for overhang data

"},{"title":"module:SceneManager.resetTime","link":"resetTime","description":"

Reset time

"},{"title":"module:SceneManager.settings","link":"settings","description":"

Display user/device settings screen

"},{"title":"module:SceneManager.standardDialog","link":"standardDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.unregisterOverhangData","link":"unregisterOverhangData","description":"

Remove observers for overhang data

"},{"title":"module:SceneManager.updateOptions","link":"updateOptions","description":"

Update options availability

"},{"title":"module:SceneManager.updateOverhangTitle","link":"updateOverhangTitle","description":"

Update overhang title

"},{"title":"module:SceneManager.updateOverhangVisible","link":"updateOverhangVisible","description":"

Update whether the overhang is visible or not

"},{"title":"module:SceneManager.updateUser","link":"updateUser","description":"

Update username in overhang

"},{"title":"module:SceneManager.userMessage","link":"userMessage","description":"

Display dialog to user with an OK button

"},{"title":"module:ScheduleProgramData","link":"ScheduleProgramData"},{"title":"module:ScheduleProgramData.setFields","link":"setFields"},{"title":"module:ScheduleProgramData.setPoster","link":"setPoster"},{"title":"module:SearchBox","link":"SearchBox"},{"title":"module:SearchBox.init","link":"init"},{"title":"module:SearchBox.searchMedias","link":"searchMedias"},{"title":"module:SearchData","link":"SearchData"},{"title":"module:SearchData.setFields","link":"setFields"},{"title":"module:SearchData.setPoster","link":"setPoster"},{"title":"module:SearchResults","link":"SearchResults"},{"title":"module:SearchResults.init","link":"init"},{"title":"module:SearchResults.loadResults","link":"loadResults"},{"title":"module:SearchResults.onKeyEvent","link":"onKeyEvent"},{"title":"module:SearchResults.searchMedias","link":"searchMedias"},{"title":"module:SearchRow","link":"SearchRow"},{"title":"module:SearchRow.addRow","link":"addRow"},{"title":"module:SearchRow.getData","link":"getData"},{"title":"module:SearchRow.init","link":"init"},{"title":"module:SearchRow.updateSize","link":"updateSize"},{"title":"module:SearchTask","link":"SearchTask"},{"title":"module:SearchTask.init","link":"init"},{"title":"module:SearchTask.search","link":"search"},{"title":"module:SeriesData","link":"SeriesData"},{"title":"module:SeriesData.setFields","link":"setFields"},{"title":"module:SeriesData.setPoster","link":"setPoster"},{"title":"module:ServerDiscoveryTask","link":"ServerDiscoveryTask"},{"title":"module:ServerDiscoveryTask.AddServer","link":"AddServer"},{"title":"module:ServerDiscoveryTask.ProcessClientDiscoveryResponse","link":"ProcessClientDiscoveryResponse"},{"title":"module:ServerDiscoveryTask.ProcessSSDPResponse","link":"ProcessSSDPResponse"},{"title":"module:ServerDiscoveryTask.SendClientDiscoveryBroadcast","link":"SendClientDiscoveryBroadcast"},{"title":"module:ServerDiscoveryTask.SendSSDPBroadcast","link":"SendSSDPBroadcast"},{"title":"module:ServerDiscoveryTask.execute","link":"execute"},{"title":"module:ServerDiscoveryTask.init","link":"init","description":"

Task used to discover jellyfin servers on the local network

"},{"title":"module:SetServerScreen","link":"SetServerScreen"},{"title":"module:SetServerScreen.ScanForServers","link":"ScanForServers"},{"title":"module:SetServerScreen.ScanForServersComplete","link":"ScanForServersComplete"},{"title":"module:SetServerScreen.ShowKeyboard","link":"ShowKeyboard"},{"title":"module:SetServerScreen.clearErrorMessage","link":"clearErrorMessage"},{"title":"module:SetServerScreen.init","link":"init"},{"title":"module:SetServerScreen.onDialogButton","link":"onDialogButton"},{"title":"module:SetServerScreen.onKeyEvent","link":"onKeyEvent"},{"title":"module:ShowScenes","link":"ShowScenes"},{"title":"module:ShowScenes.CreateAlbumView","link":"CreateAlbumView","description":"

Shows details on selected album. Description text, image, and list of available songs

"},{"title":"module:ShowScenes.CreateArtistView","link":"CreateArtistView","description":"

Shows details on selected artist. Bio, image, and list of available albums

"},{"title":"module:ShowScenes.CreateHomeGroup","link":"CreateHomeGroup"},{"title":"module:ShowScenes.CreateItemGrid","link":"CreateItemGrid"},{"title":"module:ShowScenes.CreateMovieDetailsGroup","link":"CreateMovieDetailsGroup"},{"title":"module:ShowScenes.CreateMovieLibraryView","link":"CreateMovieLibraryView"},{"title":"module:ShowScenes.CreateMusicLibraryView","link":"CreateMusicLibraryView"},{"title":"module:ShowScenes.CreatePersonView","link":"CreatePersonView"},{"title":"module:ShowScenes.CreatePlaylistView","link":"CreatePlaylistView","description":"

Shows details on selected playlist. Description text, image, and list of available items

"},{"title":"module:ShowScenes.CreateSearchPage","link":"CreateSearchPage"},{"title":"module:ShowScenes.CreateSeasonDetailsGroup","link":"CreateSeasonDetailsGroup"},{"title":"module:ShowScenes.CreateSeasonDetailsGroupByID","link":"CreateSeasonDetailsGroupByID"},{"title":"module:ShowScenes.CreateSeriesDetailsGroup","link":"CreateSeriesDetailsGroup"},{"title":"module:ShowScenes.CreateServerGroup","link":"CreateServerGroup"},{"title":"module:ShowScenes.CreateSigninGroup","link":"CreateSigninGroup"},{"title":"module:ShowScenes.CreateUserSelectGroup","link":"CreateUserSelectGroup"},{"title":"module:ShowScenes.CreateVideoPlayerGroup","link":"CreateVideoPlayerGroup"},{"title":"module:ShowScenes.DeleteFromServerList","link":"DeleteFromServerList"},{"title":"module:ShowScenes.LoginFlow","link":"LoginFlow"},{"title":"module:ShowScenes.SaveServerList","link":"SaveServerList"},{"title":"module:ShowScenes.SendPerformanceBeacon","link":"SendPerformanceBeacon","description":"

Roku Performance monitoring

"},{"title":"module:ShowScenes.playbackOptionDialog","link":"playbackOptionDialog","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:SlideOutButton","link":"SlideOutButton"},{"title":"module:SlideOutButton.init","link":"init"},{"title":"module:SlideOutButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:SlideOutButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:SlideOutButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:SlideOutButton.onHighlightChanged","link":"onHighlightChanged"},{"title":"module:SlideOutButton.onIconChanged","link":"onIconChanged"},{"title":"module:SlideOutButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:SlideOutButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:SlideOutButton.onTextChanged","link":"onTextChanged"},{"title":"module:SlideOutButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:SlideOutButton.setIconSize","link":"setIconSize"},{"title":"module:SongItem","link":"SongItem"},{"title":"module:SongItem.focusChanged","link":"focusChanged"},{"title":"module:SongItem.init","link":"init"},{"title":"module:SongItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:Spinner","link":"Spinner"},{"title":"module:Spinner.init","link":"init"},{"title":"module:StandardDialog","link":"StandardDialog"},{"title":"module:StandardDialog.init","link":"init"},{"title":"module:StandardDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:Subtitles","link":"Subtitles"},{"title":"module:Subtitles.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:Subtitles.changeSubtitleDuringPlayback","link":"changeSubtitleDuringPlayback"},{"title":"module:Subtitles.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

Identify the default subtitle track\nif "requires_text" is true, only return a track if it is textual\nThis allows forcing text subs, since roku requires transcoding of non-text subs\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.defaultSubtitleTrackFromVid","link":"defaultSubtitleTrackFromVid","description":"

Identify the default subtitle track for a given video id\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:Subtitles.getSubtitleSelIdxFromSubIdx","link":"getSubtitleSelIdxFromSubIdx","description":"

The subtitle index on the server differs from the index we track locally\nThis function converts the former into the latter

"},{"title":"module:Subtitles.selectSubtitleTrack","link":"selectSubtitleTrack"},{"title":"module:Subtitles.selectSubtitleTrackDialog","link":"selectSubtitleTrackDialog","description":"

Present Dialog to user to select subtitle track

"},{"title":"module:Subtitles.setupSubtitle","link":"setupSubtitle","description":"

Given a set of subtitles, and a subtitle index (the index on the server, not in the list provided)\nthis will set all relevant settings for roku (mainly closed captions) and return the index of the\nsubtitle track specified, but indexed based on the provided list of subtitles

"},{"title":"module:Subtitles.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:Subtitles.turnoffSubtitles","link":"turnoffSubtitles"},{"title":"module:TVEpisode","link":"TVEpisode"},{"title":"module:TVEpisode.setFields","link":"setFields"},{"title":"module:TVEpisode.setPoster","link":"setPoster"},{"title":"module:TVEpisodeData","link":"TVEpisodeData"},{"title":"module:TVEpisodeData.setFields","link":"setFields"},{"title":"module:TVEpisodeData.setPoster","link":"setPoster"},{"title":"module:TVEpisodeRow","link":"TVEpisodeRow"},{"title":"module:TVEpisodeRow.init","link":"init"},{"title":"module:TVEpisodeRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRow.setData","link":"setData"},{"title":"module:TVEpisodeRow.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRow.updateSize","link":"updateSize"},{"title":"module:TVEpisodeRowWithOptions","link":"TVEpisodeRowWithOptions"},{"title":"module:TVEpisodeRowWithOptions.SetUpAudioOptions","link":"SetUpAudioOptions","description":"

List of audio tracks to choose from

"},{"title":"module:TVEpisodeRowWithOptions.SetUpVideoOptions","link":"SetUpVideoOptions","description":"

List of video versions to choose from

"},{"title":"module:TVEpisodeRowWithOptions.audioOptionsClosed","link":"audioOptionsClosed"},{"title":"module:TVEpisodeRowWithOptions.init","link":"init"},{"title":"module:TVEpisodeRowWithOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRowWithOptions.rowsDoneLoading","link":"rowsDoneLoading"},{"title":"module:TVEpisodeRowWithOptions.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRowWithOptions.videoOptionsClosed","link":"videoOptionsClosed"},{"title":"module:TVEpisodes","link":"TVEpisodes"},{"title":"module:TVEpisodes.getFocusedItem","link":"getFocusedItem","description":"

get the currently focused item

"},{"title":"module:TVEpisodes.init","link":"init"},{"title":"module:TVEpisodes.onKeyEvent","link":"onKeyEvent","description":"

Handle navigation input from the remote and act on it

"},{"title":"module:TVEpisodes.setExtraButtonVisibility","link":"setExtraButtonVisibility","description":"

Updates the visibility of the Extras button based on if this season has any extra features

"},{"title":"module:TVEpisodes.setSeasonLoading","link":"setSeasonLoading"},{"title":"module:TVEpisodes.updateSeason","link":"updateSeason"},{"title":"module:TVListDetails","link":"TVListDetails"},{"title":"module:TVListDetails.DisplayAudioAvailable","link":"DisplayAudioAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one audio track to choose from

"},{"title":"module:TVListDetails.DisplayVideoAvailable","link":"DisplayVideoAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one video version to choose from

"},{"title":"module:TVListDetails.SetupAudioDisplay","link":"SetupAudioDisplay","description":"

Display current audio_codec and check if there is more than one audio track to choose from...

"},{"title":"module:TVListDetails.focusChanged","link":"focusChanged"},{"title":"module:TVListDetails.getEndTime","link":"getEndTime"},{"title":"module:TVListDetails.getRuntime","link":"getRuntime"},{"title":"module:TVListDetails.init","link":"init"},{"title":"module:TVListDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVListOptions","link":"TVListOptions"},{"title":"module:TVListOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:TVListOptions.init","link":"init"},{"title":"module:TVListOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVListOptions.optionsSet","link":"optionsSet"},{"title":"module:TVSeasonData","link":"TVSeasonData"},{"title":"module:TVSeasonData.setFields","link":"setFields"},{"title":"module:TVSeasonData.setPoster","link":"setPoster"},{"title":"module:TVSeasonRow","link":"TVSeasonRow"},{"title":"module:TVSeasonRow.getData","link":"getData"},{"title":"module:TVSeasonRow.init","link":"init"},{"title":"module:TVSeasonRow.updateSize","link":"updateSize"},{"title":"module:TVShowDescription","link":"TVShowDescription"},{"title":"module:TVShowDescription.getEndTime","link":"getEndTime"},{"title":"module:TVShowDescription.getHistory","link":"getHistory"},{"title":"module:TVShowDescription.getRuntime","link":"getRuntime"},{"title":"module:TVShowDescription.init","link":"init"},{"title":"module:TVShowDescription.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDescription.round","link":"round"},{"title":"module:TVShowDescription.setFieldText","link":"setFieldText"},{"title":"module:TVShowDetails","link":"TVShowDetails"},{"title":"module:TVShowDetails.getEndTime","link":"getEndTime"},{"title":"module:TVShowDetails.getHistory","link":"getHistory"},{"title":"module:TVShowDetails.getRuntime","link":"getRuntime"},{"title":"module:TVShowDetails.init","link":"init"},{"title":"module:TVShowDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVShowDetails.onShuffleEpisodeDataLoaded","link":"onShuffleEpisodeDataLoaded"},{"title":"module:TVShowDetails.round","link":"round"},{"title":"module:TVShowDetails.setFieldText","link":"setFieldText"},{"title":"module:TextSizeTask","link":"TextSizeTask"},{"title":"module:TextSizeTask.getTextSize","link":"getTextSize"},{"title":"module:TextSizeTask.init","link":"init"},{"title":"module:UserData","link":"UserData"},{"title":"module:UserData.getPreference","link":"getPreference"},{"title":"module:UserData.loadFromJSON","link":"loadFromJSON"},{"title":"module:UserData.loadFromRegistry","link":"loadFromRegistry"},{"title":"module:UserData.removeFromRegistry","link":"removeFromRegistry"},{"title":"module:UserData.saveToRegistry","link":"saveToRegistry"},{"title":"module:UserData.setDataFromJSON","link":"setDataFromJSON"},{"title":"module:UserData.setPreference","link":"setPreference"},{"title":"module:UserData.setServer","link":"setServer"},{"title":"module:UserItem","link":"UserItem"},{"title":"module:UserItem.init","link":"init"},{"title":"module:UserItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserLibrary","link":"UserLibrary"},{"title":"module:UserLibrary.MarkItemFavorite","link":"MarkItemFavorite"},{"title":"module:UserLibrary.MarkItemWatched","link":"MarkItemWatched"},{"title":"module:UserLibrary.UnmarkItemFavorite","link":"UnmarkItemFavorite"},{"title":"module:UserLibrary.UnmarkItemWatched","link":"UnmarkItemWatched"},{"title":"module:UserRow","link":"UserRow"},{"title":"module:UserRow.init","link":"init"},{"title":"module:UserRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserRow.setData","link":"setData"},{"title":"module:UserRow.setUser","link":"setUser"},{"title":"module:UserRow.updateSize","link":"updateSize"},{"title":"module:UserSelect","link":"UserSelect"},{"title":"module:UserSelect.init","link":"init"},{"title":"module:UserSelect.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserSelect.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserSelect.redraw","link":"redraw"},{"title":"module:VideoData","link":"VideoData"},{"title":"module:VideoData.setFields","link":"setFields"},{"title":"module:VideoData.setPoster","link":"setPoster"},{"title":"module:VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.AddVideoContent","link":"AddVideoContent"},{"title":"module:VideoPlayer.GetPlaybackInfo","link":"GetPlaybackInfo","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:VideoPlayer.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:VideoPlayer.PlayIntroVideo","link":"PlayIntroVideo"},{"title":"module:VideoPlayer.VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.autoPlayNextEpisode","link":"autoPlayNextEpisode"},{"title":"module:VideoPlayer.directPlaySupported","link":"directPlaySupported"},{"title":"module:VideoPlayer.getAudioFormat","link":"getAudioFormat"},{"title":"module:VideoPlayer.getAudioInfo","link":"getAudioInfo"},{"title":"module:VideoPlayer.getContainerType","link":"getContainerType"},{"title":"module:VideoPlayer.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:VideoPlayer.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:VideoPlayer.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:VideoPlayer.startPlayBackOver","link":"startPlayBackOver","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:VideoPlayerView","link":"VideoPlayerView"},{"title":"module:VideoPlayerView.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:VideoPlayerView.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:VideoPlayerView.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:VideoPlayerView.getCurrentChapterIndex","link":"getCurrentChapterIndex","description":"

getCurrentChapterIndex: Finds current chapter index

"},{"title":"module:VideoPlayerView.handleChapterListAction","link":"handleChapterListAction","description":"

handleChapterListAction: Handles action to show chapter list

"},{"title":"module:VideoPlayerView.handleChapterSkipAction","link":"handleChapterSkipAction","description":"

handleChapterSkipAction: Handles user command to skip chapters in playing video

"},{"title":"module:VideoPlayerView.handleHideAction","link":"handleHideAction","description":"

handleHideAction: Handles action to hide OSD menu

"},{"title":"module:VideoPlayerView.handleShowSubtitleMenuAction","link":"handleShowSubtitleMenuAction","description":"

handleShowSubtitleMenuAction: Handles action to show subtitle selection menu

"},{"title":"module:VideoPlayerView.handleShowVideoInfoPopupAction","link":"handleShowVideoInfoPopupAction","description":"

handleShowVideoInfoPopupAction: Handles action to show video info popup

"},{"title":"module:VideoPlayerView.handleVideoPlayPauseAction","link":"handleVideoPlayPauseAction","description":"

handleVideoPlayPauseAction: Handles action to either play or pause the video content

"},{"title":"module:VideoPlayerView.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:VideoPlayerView.init","link":"init"},{"title":"module:VideoPlayerView.loadCaption","link":"loadCaption","description":"

Set caption url to server subtitle track

"},{"title":"module:VideoPlayerView.onAllowCaptionsChange","link":"onAllowCaptionsChange","description":"

Only setup caption items if captions are allowed

"},{"title":"module:VideoPlayerView.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:VideoPlayerView.onKeyEvent","link":"onKeyEvent"},{"title":"module:VideoPlayerView.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:VideoPlayerView.onOSDAction","link":"onOSDAction","description":"

onOSDAction: Process action events from OSD to their respective handlers

"},{"title":"module:VideoPlayerView.onPlaybackErrorButtonSelected","link":"onPlaybackErrorButtonSelected"},{"title":"module:VideoPlayerView.onPlaybackErrorDialogClosed","link":"onPlaybackErrorDialogClosed"},{"title":"module:VideoPlayerView.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onSubtitleChange","link":"onSubtitleChange","description":"

Event handler for when selectedSubtitle changes

"},{"title":"module:VideoPlayerView.onVideoContentLoaded","link":"onVideoContentLoaded"},{"title":"module:VideoPlayerView.populateChapterMenu","link":"populateChapterMenu","description":"

populateChapterMenu: ' Parse chapter data from API and appeand to chapter list menu

"},{"title":"module:VideoPlayerView.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:VideoPlayerView.showPlaybackErrorDialog","link":"showPlaybackErrorDialog"},{"title":"module:VideoPlayerView.stateAllowsOSD","link":"stateAllowsOSD","description":"

stateAllowsOSD: Check if current video state allows showing the OSD

"},{"title":"module:VideoPlayerView.toggleCaption","link":"toggleCaption","description":"

Toggles visibility of custom subtitles and sets captionTask's player state

"},{"title":"module:VideoPlayerView.updateCaption","link":"updateCaption","description":"

Removes old subtitle lines and adds new subtitle lines

"},{"title":"module:VideoPlayerView.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:VideoTrackListItem","link":"VideoTrackListItem"},{"title":"module:VideoTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:VideoTrackListItem.init","link":"init"},{"title":"module:VideoTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ViewCreator","link":"ViewCreator"},{"title":"module:ViewCreator.CreateAudioPlayerView","link":"CreateAudioPlayerView","description":"

Play Audio

"},{"title":"module:ViewCreator.CreateVideoPlayerView","link":"CreateVideoPlayerView","description":"

Play Video

"},{"title":"module:ViewCreator.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:ViewCreator.onPlaybackInfoLoaded","link":"onPlaybackInfoLoaded","description":"

The playback info task has returned data

"},{"title":"module:ViewCreator.onSelectPlaybackInfoPressed","link":"onSelectPlaybackInfoPressed","description":"

User requested playback info

"},{"title":"module:ViewCreator.onSelectSubtitlePressed","link":"onSelectSubtitlePressed","description":"

User requested subtitle selection popup

"},{"title":"module:ViewCreator.onSelectionMade","link":"onSelectionMade","description":"

User has selected something from the radioDialog popup

"},{"title":"module:ViewCreator.onStateChange","link":"onStateChange","description":"

Playback state change event handlers

"},{"title":"module:ViewCreator.processSubtitleSelection","link":"processSubtitleSelection"},{"title":"module:WhatsNewDialog","link":"WhatsNewDialog"},{"title":"module:WhatsNewDialog.init","link":"init"},{"title":"module:WhatsNewDialog.setPalette","link":"setPalette"},{"title":"module:baserequest","link":"baserequest"},{"title":"module:baserequest.APIRequest","link":"APIRequest"},{"title":"module:baserequest.authRequest","link":"authRequest","description":"

Takes and returns a roUrlTransfer object after adding a Jellyfin "Authorization" header

"},{"title":"module:baserequest.buildAuthHeader","link":"buildAuthHeader","description":"

Returns a string containing the "Authorization" header payload

"},{"title":"module:baserequest.buildParams","link":"buildParams","description":"

Functions for making requests to the API

"},{"title":"module:baserequest.buildURL","link":"buildURL"},{"title":"module:baserequest.deleteVoid","link":"deleteVoid"},{"title":"module:baserequest.getJson","link":"getJson"},{"title":"module:baserequest.getString","link":"getString"},{"title":"module:baserequest.getVoid","link":"getVoid"},{"title":"module:baserequest.get_url","link":"get_url"},{"title":"module:baserequest.headVoid","link":"headVoid"},{"title":"module:baserequest.postJson","link":"postJson"},{"title":"module:baserequest.postString","link":"postString"},{"title":"module:baserequest.postVoid","link":"postVoid"},{"title":"module:baserequest.setCertificateAuthority","link":"setCertificateAuthority","description":"

sets the certificate authority by file path on the passed node

"},{"title":"module:captionTask","link":"captionTask"},{"title":"module:captionTask.fetchCaption","link":"fetchCaption"},{"title":"module:captionTask.init","link":"init"},{"title":"module:captionTask.isTime","link":"isTime"},{"title":"module:captionTask.newLayoutGroup","link":"newLayoutGroup"},{"title":"module:captionTask.newRect","link":"newRect"},{"title":"module:captionTask.newlabel","link":"newlabel"},{"title":"module:captionTask.parseVTT","link":"parseVTT"},{"title":"module:captionTask.setFont","link":"setFont"},{"title":"module:captionTask.toMs","link":"toMs"},{"title":"module:captionTask.updateCaption","link":"updateCaption"},{"title":"module:conditional","link":"conditional"},{"title":"module:conditional.printRegistry","link":"printRegistry","description":"

Print out all of the registry contents to the debug log

"},{"title":"module:config","link":"config"},{"title":"module:config.GetConfigTree","link":"GetConfigTree","description":"

Read config tree from json config file and return

"},{"title":"module:config.RegistryReadAll","link":"RegistryReadAll","description":"

Return all data found inside a registry section

"},{"title":"module:config.findConfigTreeKey","link":"findConfigTreeKey","description":"

Recursivly search the config tree for entry with settingname equal to key

"},{"title":"module:config.getRegistrySections","link":"getRegistrySections","description":"

Return an array of all the registry section keys

"},{"title":"module:config.getSavedUsers","link":"getSavedUsers","description":"

Returns an array of saved users from the registry\nthat belong to the active server

"},{"title":"module:config.get_setting","link":"get_setting","description":"

"Jellyfin" registry accessors for the default global settings

"},{"title":"module:config.get_user_setting","link":"get_user_setting","description":"

User registry accessors for the currently active user

"},{"title":"module:config.registry_delete","link":"registry_delete"},{"title":"module:config.registry_read","link":"registry_read","description":"

Generic registry accessors

"},{"title":"module:config.registry_write","link":"registry_write"},{"title":"module:config.set_setting","link":"set_setting"},{"title":"module:config.set_user_setting","link":"set_user_setting"},{"title":"module:config.unset_setting","link":"unset_setting"},{"title":"module:config.unset_user_setting","link":"unset_user_setting"},{"title":"module:deviceCapabilities","link":"deviceCapabilities"},{"title":"module:deviceCapabilities.GetBitRateLimit","link":"GetBitRateLimit"},{"title":"module:deviceCapabilities.GetDirectPlayProfiles","link":"GetDirectPlayProfiles"},{"title":"module:deviceCapabilities.getCodecProfiles","link":"getCodecProfiles"},{"title":"module:deviceCapabilities.getContainerProfiles","link":"getContainerProfiles"},{"title":"module:deviceCapabilities.getDeviceCapabilities","link":"getDeviceCapabilities","description":"

Returns the Device Capabilities for Roku.\nAlso prints out the device profile for debugging

"},{"title":"module:deviceCapabilities.getDeviceProfile","link":"getDeviceProfile"},{"title":"module:deviceCapabilities.getMaxHeightArray","link":"getMaxHeightArray"},{"title":"module:deviceCapabilities.getMaxWidthArray","link":"getMaxWidthArray"},{"title":"module:deviceCapabilities.getSubtitleProfiles","link":"getSubtitleProfiles"},{"title":"module:deviceCapabilities.getTranscodingProfiles","link":"getTranscodingProfiles"},{"title":"module:deviceCapabilities.printDeviceProfile","link":"printDeviceProfile","description":"

Print out the deviceProfile for debugging

"},{"title":"module:deviceCapabilities.removeDecimals","link":"removeDecimals","description":"

Remove all decimals from a string

"},{"title":"module:deviceCapabilities.setPreferredCodec","link":"setPreferredCodec","description":"

Takes and returns a comma delimited string of codecs.\nMoves the preferred codec to the front of the string

"},{"title":"module:deviceCapabilities.updateProfileArray","link":"updateProfileArray","description":"

Recieves and returns an assArray of supported profiles and levels for each video codec

"},{"title":"module:globals","link":"globals"},{"title":"module:globals.SaveAppToGlobal","link":"SaveAppToGlobal","description":"

Save information from roAppInfo to m.global.app

"},{"title":"module:globals.SaveDeviceToGlobal","link":"SaveDeviceToGlobal","description":"

Save information from roDeviceInfo to m.global.device

"},{"title":"module:globals.setConstants","link":"setConstants","description":"

Set global constants

"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.runGlobalMigrations","link":"runGlobalMigrations","description":"

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

"},{"title":"module:migrations.runRegistryUserMigrations","link":"runRegistryUserMigrations"},{"title":"module:misc","link":"misc"},{"title":"module:misc.AssocArrayEqual","link":"AssocArrayEqual"},{"title":"module:misc.arrayHasValue","link":"arrayHasValue","description":"

Check if a specific value is inside of an array

"},{"title":"module:misc.div_ceiling","link":"div_ceiling"},{"title":"module:misc.findNodeBySubtype","link":"findNodeBySubtype"},{"title":"module:misc.formatTime","link":"formatTime","description":"

Format time as 12 or 24 hour format based on system clock setting

"},{"title":"module:misc.getButton","link":"getButton"},{"title":"module:misc.getMinutes","link":"getMinutes","description":"

Converts ticks to minutes

"},{"title":"module:misc.getMsgPicker","link":"getMsgPicker"},{"title":"module:misc.get_dialog_result","link":"get_dialog_result","description":"

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

"},{"title":"module:misc.inArray","link":"inArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:misc.inferServerUrl","link":"inferServerUrl","description":"

take an incomplete url string and use it to make educated guesses about\nthe complete url. then tests these guesses to see if it can find a jf server\nreturns the url of the server it found, or an empty string

"},{"title":"module:misc.isJellyfinServer","link":"isJellyfinServer","description":"

accepts the raw json string of /system/info/public and returns\na boolean indicating if ProductName is "Jellyfin Server"

"},{"title":"module:misc.isLocalhost","link":"isLocalhost","description":"

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

"},{"title":"module:misc.isNodeEvent","link":"isNodeEvent"},{"title":"module:misc.isValid","link":"isValid","description":"

Returns whether or not passed value is valid

"},{"title":"module:misc.isValidAndNotEmpty","link":"isValidAndNotEmpty","description":"

Returns whether or not passed value is valid and not empty\nAccepts a string, or any countable type (arrays and lists)

"},{"title":"module:misc.lastFocusedChild","link":"lastFocusedChild"},{"title":"module:misc.leftPad","link":"leftPad"},{"title":"module:misc.message_dialog","link":"message_dialog"},{"title":"module:misc.option_dialog","link":"option_dialog"},{"title":"module:misc.parseUrl","link":"parseUrl","description":"

Returns an array from a url = [ url, proto, host, port, subdir+params ]\nIf port or subdir are not found, an empty string will be added to the array\nProto must be declared or array will be empty

"},{"title":"module:misc.roundNumber","link":"roundNumber","description":"

Rounds number to nearest integer

"},{"title":"module:misc.secondsToHuman","link":"secondsToHuman"},{"title":"module:misc.setFieldTextValue","link":"setFieldTextValue"},{"title":"module:misc.show_dialog","link":"show_dialog"},{"title":"module:misc.shuffleArray","link":"shuffleArray","description":"

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

"},{"title":"module:misc.startLoadingSpinner","link":"startLoadingSpinner","description":"

startLoadingSpinner: Start a loading spinner and attach it to the main JFScene.\nDisplays an invisible ProgressDialog node by default to disable keypresses while loading.

"},{"title":"module:misc.stopLoadingSpinner","link":"stopLoadingSpinner"},{"title":"module:misc.ticksToHuman","link":"ticksToHuman"},{"title":"module:misc.toString","link":"toString"},{"title":"module:misc.urlCandidates","link":"urlCandidates","description":"

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates\nfor the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated\nfull urls.

"},{"title":"module:misc.versionChecker","link":"versionChecker","description":"

Returns whether or not a version number (e.g. 10.7.7) is greater or equal\nto some minimum version allowed (e.g. 10.8.0)

"},{"title":"module:quickplay","link":"quickplay"},{"title":"module:quickplay.album","link":"album","description":"

A music album.\nPlay the entire album starting with track 1.

"},{"title":"module:quickplay.artist","link":"artist","description":"

A music artist.\nShuffle play all songs by artist.

"},{"title":"module:quickplay.audio","link":"audio","description":"

A single audio file.

"},{"title":"module:quickplay.boxset","link":"boxset","description":"

A boxset.\nPlay all items inside.

"},{"title":"module:quickplay.collectionFolder","link":"collectionFolder","description":"

Quick Play A CollectionFolder.\nShuffle play the items inside\nwith some differences based on collectionType.

"},{"title":"module:quickplay.folder","link":"folder","description":"

Quick Play A folder.\nShuffle play all items found

"},{"title":"module:quickplay.multipleSeries","link":"multipleSeries","description":"

More than one TV Show Series.\nShuffle play all watched episodes

"},{"title":"module:quickplay.musicVideo","link":"musicVideo","description":"

A single music video file.

"},{"title":"module:quickplay.person","link":"person","description":"

Quick Play A Person.\nShuffle play all videos found

"},{"title":"module:quickplay.photo","link":"photo","description":"

A single photo.

"},{"title":"module:quickplay.photoAlbum","link":"photoAlbum","description":"

A photo album.

"},{"title":"module:quickplay.playlist","link":"playlist","description":"

Quick Play A Playlist.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.program","link":"program","description":"

Quick Play A Live Program

"},{"title":"module:quickplay.pushToQueue","link":"pushToQueue","description":"

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

"},{"title":"module:quickplay.season","link":"season","description":"

A TV Show Season.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.series","link":"series","description":"

A TV Show Series.\nPlay the first unwatched episode.\nIf none, shuffle play the whole series.

"},{"title":"module:quickplay.tvChannel","link":"tvChannel","description":"

Quick Play A TVChannel

"},{"title":"module:quickplay.userView","link":"userView","description":"

Quick Play A UserView.\nPlay logic depends on "collectionType".

"},{"title":"module:quickplay.video","link":"video","description":"

A single video file.

"},{"title":"module:schedule","link":"schedule"},{"title":"module:schedule.channelFilterSet","link":"channelFilterSet"},{"title":"module:schedule.channelsearchTermSet","link":"channelsearchTermSet","description":"

Voice Search set

"},{"title":"module:schedule.focusProgramDetails","link":"focusProgramDetails","description":"

Move the TV Guide Grid down or up depending whether details are selected

"},{"title":"module:schedule.init","link":"init"},{"title":"module:schedule.onChannelsLoaded","link":"onChannelsLoaded","description":"

Initial list of channels loaded

"},{"title":"module:schedule.onGridScrolled","link":"onGridScrolled","description":"

As user scrolls grid, check if more data requries to be loaded

"},{"title":"module:schedule.onKeyEvent","link":"onKeyEvent"},{"title":"module:schedule.onProgramDetailsLoaded","link":"onProgramDetailsLoaded","description":"

Update the Program Details with full information

"},{"title":"module:schedule.onProgramFocused","link":"onProgramFocused"},{"title":"module:schedule.onProgramSelected","link":"onProgramSelected"},{"title":"module:schedule.onRecordChannelSelected","link":"onRecordChannelSelected","description":"

Handle user selecting "Record Channel" from Program Details

"},{"title":"module:schedule.onRecordOperationDone","link":"onRecordOperationDone"},{"title":"module:schedule.onRecordSeriesChannelSelected","link":"onRecordSeriesChannelSelected","description":"

Handle user selecting "Record Series" from Program Details

"},{"title":"module:schedule.onScheduleLoaded","link":"onScheduleLoaded","description":"

When LoadScheduleTask completes (initial or more data) and we have a schedule to display

"},{"title":"module:schedule.onWatchChannelSelected","link":"onWatchChannelSelected","description":"

Handle user selecting "Watch Channel" from Program Details

"},{"title":"module:section","link":"section"},{"title":"module:section.init","link":"init"},{"title":"module:section.onFocusChange","link":"onFocusChange"},{"title":"module:section.onIDChange","link":"onIDChange"},{"title":"module:section.onTranslationChange","link":"onTranslationChange"},{"title":"module:section.scrollDownToOnDeck","link":"scrollDownToOnDeck"},{"title":"module:section.scrollOffBottom","link":"scrollOffBottom"},{"title":"module:section.scrollOffOnDeck","link":"scrollOffOnDeck"},{"title":"module:section.scrollOffTop","link":"scrollOffTop"},{"title":"module:section.scrollUpToOnDeck","link":"scrollUpToOnDeck"},{"title":"module:section.showFromBottom","link":"showFromBottom"},{"title":"module:section.showFromTop","link":"showFromTop"},{"title":"module:sectionScroller","link":"sectionScroller"},{"title":"module:sectionScroller.displayedIndexChanged","link":"displayedIndexChanged"},{"title":"module:sectionScroller.init","link":"init"},{"title":"module:sectionScroller.onFocusChange","link":"onFocusChange"},{"title":"module:settings","link":"settings"},{"title":"module:settings.LoadMenu","link":"LoadMenu"},{"title":"module:settings.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook that gets ran as needed.\nAssumes settings were changed and they affect the device profile.\nPosts a new device profile to the server using the task thread

"},{"title":"module:settings.boolSettingChanged","link":"boolSettingChanged"},{"title":"module:settings.init","link":"init"},{"title":"module:settings.isFormInFocus","link":"isFormInFocus","description":"

Returns true if any of the data entry forms are in focus

"},{"title":"module:settings.onKeyEvent","link":"onKeyEvent"},{"title":"module:settings.onKeyGridEscape","link":"onKeyGridEscape"},{"title":"module:settings.onKeyGridSubmit","link":"onKeyGridSubmit"},{"title":"module:settings.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:settings.radioSettingChanged","link":"radioSettingChanged"},{"title":"module:settings.settingFocused","link":"settingFocused"},{"title":"module:settings.settingSelected","link":"settingSelected"},{"title":"module:userauth","link":"userauth"},{"title":"module:userauth.AboutMe","link":"AboutMe"},{"title":"module:userauth.AuthenticateViaQuickConnect","link":"AuthenticateViaQuickConnect"},{"title":"module:userauth.AvailableUsers","link":"AvailableUsers"},{"title":"module:userauth.GetPublicUsers","link":"GetPublicUsers"},{"title":"module:userauth.LoadUserAbilities","link":"LoadUserAbilities"},{"title":"module:userauth.ServerInfo","link":"ServerInfo"},{"title":"module:userauth.SignOut","link":"SignOut"},{"title":"module:userauth.checkQuickConnect","link":"checkQuickConnect"},{"title":"module:userauth.get_token","link":"get_token"},{"title":"module:userauth.initQuickConnect","link":"initQuickConnect"}]} \ No newline at end of file diff --git a/docs/api/module-AlbumView.html b/docs/api/module-AlbumView.html index 9dc61c858d..bc8e69280e 100644 --- a/docs/api/module-AlbumView.html +++ b/docs/api/module-AlbumView.html @@ -1,3 +1,3 @@ Module: AlbumView
On this page

Methods

(static) OnScreenHidden() → {void}

Returns:
Type: 
void

(static) adjustScreenForNoOverview() → {void}

Adjust scene by removing overview node and showing more songs

Returns:
Type: 
void

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDoneLoading() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) pageContentChanged() → {void}

Set values for displayed values on screen

Returns:
Type: 
void

(static) setOnScreenTextValues(json) → {void}

Populate on screen text variables

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Set poster image on screen

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Set screen's title text

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setupMainNode() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) adjustScreenForNoOverview() → {void}

Adjust scene by removing overview node and showing more songs

Returns:
Type: 
void

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDoneLoading() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) pageContentChanged() → {void}

Set values for displayed values on screen

Returns:
Type: 
void

(static) setOnScreenTextValues(json) → {void}

Populate on screen text variables

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Set poster image on screen

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Set screen's title text

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setupMainNode() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-JFScene.html b/docs/api/module-JFScene.html index 043fe49161..c7c3cd9026 100644 --- a/docs/api/module-JFScene.html +++ b/docs/api/module-JFScene.html @@ -1,3 +1,3 @@ Module: JFScene
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) disableRemoteChanged() → {void}

Triggered when the disableRemote boolean component field is changed

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isLoadingChanged() → {void}

Triggered when the isLoading boolean component field is changed

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PlaylistView.html b/docs/api/module-PlaylistView.html index 6fa69be3c8..4a2ce07a8b 100644 --- a/docs/api/module-PlaylistView.html +++ b/docs/api/module-PlaylistView.html @@ -1,3 +1,3 @@ Module: PlaylistView
On this page

Methods

(static) OnScreenHidden() → {void}

Returns:
Type: 
void

(static) adjustScreenForNoOverview() → {void}

Adjust scene by removing overview node and showing more songs

Returns:
Type: 
void

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDoneLoading() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) pageContentChanged() → {void}

Set values for displayed values on screen

Returns:
Type: 
void

(static) setOnScreenTextValues(json) → {void}

Populate on screen text variables

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Set poster image on screen

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Set screen's title text

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setupMainNode() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) adjustScreenForNoOverview() → {void}

Adjust scene by removing overview node and showing more songs

Returns:
Type: 
void

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDoneLoading() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) pageContentChanged() → {void}

Set values for displayed values on screen

Returns:
Type: 
void

(static) setOnScreenTextValues(json) → {void}

Populate on screen text variables

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Set poster image on screen

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Set screen's title text

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setupMainNode() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-misc.html b/docs/api/module-misc.html index e8b9bdf5b6..2b26202e53 100644 --- a/docs/api/module-misc.html +++ b/docs/api/module-misc.html @@ -1,3 +1,3 @@ Module: misc
On this page

Methods

(static) AssocArrayEqual(Array1, Array2) → {boolean}

Parameters:
NameTypeDescription
Array1object
Array2object
Returns:
Type: 
boolean

(static) arrayHasValue(arr, value) → {boolean}

Check if a specific value is inside of an array

Parameters:
NameTypeDescription
arrobject
valuedynamic
Returns:
Type: 
boolean

(static) div_ceiling(a, b) → {integer}

Parameters:
NameTypeDescription
ainteger
binteger
Returns:
Type: 
integer

(static) findNodeBySubtype(node, subtype) → {dynamic}

Parameters:
NameTypeDescription
nodedynamic
subtypedynamic
Returns:
Type: 
dynamic

(static) formatTime(time) → {string}

Format time as 12 or 24 hour format based on system clock setting

Parameters:
NameTypeDescription
timedynamic
Returns:
Type: 
string

(static) getButton(msg, subnodeopt) → {object}

Parameters:
NameTypeAttributesDefaultDescription
msgdynamic
subnodestring<optional>
"buttons"
Returns:
Type: 
object

(static) getMinutes(ticks) → {integer}

Converts ticks to minutes

Parameters:
NameTypeDescription
ticksdynamic
Returns:
Type: 
integer

(static) getMsgPicker(msg, subnodeopt) → {object}

Parameters:
NameTypeAttributesDefaultDescription
msgdynamic
subnodestring<optional>
""
Returns:
Type: 
object

(static) get_dialog_result(dialog, port) → {dynamic}

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

Parameters:
NameTypeDescription
dialogdynamic
portdynamic
Returns:
Type: 
dynamic

(static) inArray(haystack, needle) → {boolean}

Search string array for search value. Return if it's found

Parameters:
NameTypeDescription
haystackdynamic
needledynamic
Returns:
Type: 
boolean

(static) inferServerUrl(url) → {string}

take an incomplete url string and use it to make educated guesses about the complete url. then tests these guesses to see if it can find a jf server returns the url of the server it found, or an empty string

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
string

(static) isJellyfinServer(systemInfo) → {boolean}

accepts the raw json string of /system/info/public and returns a boolean indicating if ProductName is "Jellyfin Server"

Parameters:
NameTypeDescription
systemInfoobject
Returns:
Type: 
boolean

(static) isLocalhost(url) → {boolean}

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
boolean

(static) isNodeEvent(msg, field) → {boolean}

Parameters:
NameTypeDescription
msgdynamic
fieldstring
Returns:
Type: 
boolean

(static) isValid(input) → {boolean}

Returns whether or not passed value is valid

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
boolean

(static) isValidAndNotEmpty(input) → {boolean}

Returns whether or not passed value is valid and not empty Accepts a string, or any countable type (arrays and lists)

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
boolean

(static) lastFocusedChild(obj) → {object}

Parameters:
NameTypeDescription
objobject
Returns:
Type: 
object

(static) leftPad(base, fill, length) → {string}

Parameters:
NameTypeDescription
basestring
fillstring
lengthinteger
Returns:
Type: 
string

(static) message_dialog(messageopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
messagestring<optional>
""
Returns:
Type: 
dynamic

(static) option_dialog(options, messageopt, defaultSelectionopt) → {integer}

Parameters:
NameTypeAttributesDefaultDescription
optionsdynamic
messagedynamic<optional>
""
defaultSelectiondynamic<optional>
0
Returns:
Type: 
integer

(static) parseUrl(url) → {object}

Returns an array from a url = [ url, proto, host, port, subdir+params ] If port or subdir are not found, an empty string will be added to the array Proto must be declared or array will be empty

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
object

(static) roundNumber(f) → {integer}

Rounds number to nearest integer

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) secondsToHuman(totalSeconds, addLeadingMinuteZero) → {string}

Parameters:
NameTypeDescription
totalSecondsinteger
addLeadingMinuteZeroboolean
Returns:
Type: 
string

(static) setFieldTextValue(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void

(static) show_dialog(message, optionsopt, defaultSelectionopt) → {integer}

Parameters:
NameTypeAttributesDefaultDescription
messagestring
optionsdynamic<optional>
[]
defaultSelectiondynamic<optional>
0
Returns:
Type: 
integer

(static) shuffleArray(array) → {object}

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

Parameters:
NameTypeDescription
arrayobject
Returns:
Type: 
object

(static) startLoadingSpinner() → {void}

Returns:
Type: 
void

(static) startMediaLoadingSpinner() → {void}

Returns:
Type: 
void

(static) stopLoadingSpinner() → {void}

Returns:
Type: 
void

(static) ticksToHuman(ticks) → {string}

Parameters:
NameTypeDescription
tickslonginteger
Returns:
Type: 
string

(static) toString(input) → {string}

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
string

(static) urlCandidates(input) → {dynamic}

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates for the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated full urls.

Parameters:
NameTypeDescription
inputstring
Returns:
Type: 
dynamic

(static) versionChecker(versionToCheck, minVersionAccepted) → {dynamic}

Returns whether or not a version number (e.g. 10.7.7) is greater or equal to some minimum version allowed (e.g. 10.8.0)

Parameters:
NameTypeDescription
versionToCheckstring
minVersionAcceptedstring
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) AssocArrayEqual(Array1, Array2) → {boolean}

Parameters:
NameTypeDescription
Array1object
Array2object
Returns:
Type: 
boolean

(static) arrayHasValue(arr, value) → {boolean}

Check if a specific value is inside of an array

Parameters:
NameTypeDescription
arrobject
valuedynamic
Returns:
Type: 
boolean

(static) div_ceiling(a, b) → {integer}

Parameters:
NameTypeDescription
ainteger
binteger
Returns:
Type: 
integer

(static) findNodeBySubtype(node, subtype) → {dynamic}

Parameters:
NameTypeDescription
nodedynamic
subtypedynamic
Returns:
Type: 
dynamic

(static) formatTime(time) → {string}

Format time as 12 or 24 hour format based on system clock setting

Parameters:
NameTypeDescription
timedynamic
Returns:
Type: 
string

(static) getButton(msg, subnodeopt) → {object}

Parameters:
NameTypeAttributesDefaultDescription
msgdynamic
subnodestring<optional>
"buttons"
Returns:
Type: 
object

(static) getMinutes(ticks) → {integer}

Converts ticks to minutes

Parameters:
NameTypeDescription
ticksdynamic
Returns:
Type: 
integer

(static) getMsgPicker(msg, subnodeopt) → {object}

Parameters:
NameTypeAttributesDefaultDescription
msgdynamic
subnodestring<optional>
""
Returns:
Type: 
object

(static) get_dialog_result(dialog, port) → {dynamic}

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

Parameters:
NameTypeDescription
dialogdynamic
portdynamic
Returns:
Type: 
dynamic

(static) inArray(haystack, needle) → {boolean}

Search string array for search value. Return if it's found

Parameters:
NameTypeDescription
haystackdynamic
needledynamic
Returns:
Type: 
boolean

(static) inferServerUrl(url) → {string}

take an incomplete url string and use it to make educated guesses about the complete url. then tests these guesses to see if it can find a jf server returns the url of the server it found, or an empty string

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
string

(static) isJellyfinServer(systemInfo) → {boolean}

accepts the raw json string of /system/info/public and returns a boolean indicating if ProductName is "Jellyfin Server"

Parameters:
NameTypeDescription
systemInfoobject
Returns:
Type: 
boolean

(static) isLocalhost(url) → {boolean}

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
boolean

(static) isNodeEvent(msg, field) → {boolean}

Parameters:
NameTypeDescription
msgdynamic
fieldstring
Returns:
Type: 
boolean

(static) isValid(input) → {boolean}

Returns whether or not passed value is valid

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
boolean

(static) isValidAndNotEmpty(input) → {boolean}

Returns whether or not passed value is valid and not empty Accepts a string, or any countable type (arrays and lists)

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
boolean

(static) lastFocusedChild(obj) → {object}

Parameters:
NameTypeDescription
objobject
Returns:
Type: 
object

(static) leftPad(base, fill, length) → {string}

Parameters:
NameTypeDescription
basestring
fillstring
lengthinteger
Returns:
Type: 
string

(static) message_dialog(messageopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
messagestring<optional>
""
Returns:
Type: 
dynamic

(static) option_dialog(options, messageopt, defaultSelectionopt) → {integer}

Parameters:
NameTypeAttributesDefaultDescription
optionsdynamic
messagedynamic<optional>
""
defaultSelectiondynamic<optional>
0
Returns:
Type: 
integer

(static) parseUrl(url) → {object}

Returns an array from a url = [ url, proto, host, port, subdir+params ] If port or subdir are not found, an empty string will be added to the array Proto must be declared or array will be empty

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
object

(static) roundNumber(f) → {integer}

Rounds number to nearest integer

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) secondsToHuman(totalSeconds, addLeadingMinuteZero) → {string}

Parameters:
NameTypeDescription
totalSecondsinteger
addLeadingMinuteZeroboolean
Returns:
Type: 
string

(static) setFieldTextValue(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void

(static) show_dialog(message, optionsopt, defaultSelectionopt) → {integer}

Parameters:
NameTypeAttributesDefaultDescription
messagestring
optionsdynamic<optional>
[]
defaultSelectiondynamic<optional>
0
Returns:
Type: 
integer

(static) shuffleArray(array) → {object}

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

Parameters:
NameTypeDescription
arrayobject
Returns:
Type: 
object

(static) startLoadingSpinner(disableRemoteopt) → {void}

startLoadingSpinner: Start a loading spinner and attach it to the main JFScene. Displays an invisible ProgressDialog node by default to disable keypresses while loading.

Parameters:
NameTypeAttributesDefaultDescription
disableRemoteboolean<optional>
true
Returns:
Type: 
void

(static) stopLoadingSpinner() → {void}

Returns:
Type: 
void

(static) ticksToHuman(ticks) → {string}

Parameters:
NameTypeDescription
tickslonginteger
Returns:
Type: 
string

(static) toString(input) → {string}

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
string

(static) urlCandidates(input) → {dynamic}

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates for the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated full urls.

Parameters:
NameTypeDescription
inputstring
Returns:
Type: 
dynamic

(static) versionChecker(versionToCheck, minVersionAccepted) → {dynamic}

Returns whether or not a version number (e.g. 10.7.7) is greater or equal to some minimum version allowed (e.g. 10.8.0)

Parameters:
NameTypeDescription
versionToCheckstring
minVersionAcceptedstring
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_Main.bs.html b/docs/api/source_Main.bs.html index f3d75a367e..ea2540a00b 100644 --- a/docs/api/source_Main.bs.html +++ b/docs/api/source_Main.bs.html @@ -50,12 +50,11 @@ ' remove login scenes from the stack sceneManager.callFunc("clearScenes") - stopLoadingSpinner() - ' load home page sceneManager.currentUser = m.global.session.user.name group = CreateHomeGroup() group.callFunc("loadLibraries") + stopLoadingSpinner() sceneManager.callFunc("pushScene", group) m.scene.observeField("exit", m.port) @@ -131,8 +130,6 @@ ' measure processing time timeSpan = CreateObject("roTimespan") - startMediaLoadingSpinner() - group = sceneManager.callFunc("getActiveScene") reportingNode = msg.getRoSGNode() itemNode = invalid @@ -164,6 +161,7 @@ ' can't play the item without knowing what type it is if isValid(itemType) + startLoadingSpinner() m.global.queueManager.callFunc("clear") ' empty queue/playlist m.global.queueManager.callFunc("resetShuffle") ' turn shuffle off @@ -208,20 +206,18 @@ else if itemType = "photoalbum" quickplay.photoAlbum(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() if isValid(selectedItem) + startLoadingSpinner() selectedItemType = selectedItem.type - if selectedItemType = "CollectionFolder" if selectedItem.collectionType = "movies" group = CreateMovieLibraryView(selectedItem) @@ -253,7 +249,6 @@ end if selectedItem.selectedAudioStreamIndex = audio_stream_idx - ' Display playback options dialog if selectedItem.json.userdata.PlaybackPositionTicks > 0 m.global.queueManager.callFunc("hold", selectedItem) @@ -275,7 +270,6 @@ CreatePersonView(selectedItem) else if selectedItemType = "TvChannel" or selectedItemType = "Video" or selectedItemType = "Program" ' User selected a Live TV channel / program - ' Show Channel Loading spinner dialog = createObject("roSGNode", "ProgressDialog") dialog.title = tr("Loading Channel Data") @@ -327,6 +321,7 @@ else if selectedItemType = "MusicArtist" group = CreateArtistView(selectedItem.json) if not isValid(group) + stopLoadingSpinner() message_dialog(tr("Unable to find any albums or songs belonging to this artist")) end if else if selectedItemType = "MusicAlbum" @@ -342,19 +337,23 @@ m.global.queueManager.callFunc("playQueue") else ' TODO - switch on more node types + stopLoadingSpinner() message_dialog("This type is not yet supported: " + selectedItemType + ".") end if end if else if isNodeEvent(msg, "movieSelected") ' If you select a movie from ANYWHERE, follow this flow + startLoadingSpinner() node = getMsgPicker(msg, "picker") group = CreateMovieDetailsGroup(node) else if isNodeEvent(msg, "seriesSelected") ' If you select a TV Series from ANYWHERE, follow this flow + startLoadingSpinner() node = getMsgPicker(msg, "picker") group = CreateSeriesDetailsGroup(node.id) else if isNodeEvent(msg, "seasonSelected") ' If you select a TV Season from ANYWHERE, follow this flow + startLoadingSpinner() ptr = msg.getData() ' ptr is for [row, col] of selected item... but we only have 1 row series = msg.getRoSGNode() @@ -364,18 +363,27 @@ end if else if isNodeEvent(msg, "musicAlbumSelected") ' If you select a Music Album from ANYWHERE, follow this flow + startLoadingSpinner() ptr = msg.getData() albums = msg.getRoSGNode() node = albums.musicArtistAlbumData.items[ptr] group = CreateAlbumView(node) + if not isValid(group) + stopLoadingSpinner() + end if else if isNodeEvent(msg, "appearsOnSelected") ' If you select a Music Album from ANYWHERE, follow this flow + startLoadingSpinner() ptr = msg.getData() albums = msg.getRoSGNode() node = albums.musicArtistAppearsOnData.items[ptr] group = CreateAlbumView(node) + if not isValid(group) + stopLoadingSpinner() + end if else if isNodeEvent(msg, "playSong") ' User has selected audio they want us to play + startLoadingSpinner() selectedIndex = msg.getData() screenContent = msg.getRoSGNode() @@ -385,6 +393,7 @@ m.global.queueManager.callFunc("playQueue") else if isNodeEvent(msg, "playItem") ' User has selected audio they want us to play + startLoadingSpinner() selectedIndex = msg.getData() screenContent = msg.getRoSGNode() @@ -395,8 +404,7 @@ else if isNodeEvent(msg, "playAllSelected") ' User has selected playlist of of audio they want us to play screenContent = msg.getRoSGNode() - m.spinner = screenContent.findNode("spinner") - m.spinner.visible = true + startLoadingSpinner() m.global.queueManager.callFunc("clear") m.global.queueManager.callFunc("resetShuffle") @@ -404,6 +412,7 @@ m.global.queueManager.callFunc("playQueue") else if isNodeEvent(msg, "playArtistSelected") ' User has selected playlist of of audio they want us to play + startLoadingSpinner() screenContent = msg.getRoSGNode() m.global.queueManager.callFunc("clear") @@ -415,10 +424,7 @@ ' User has selected instant mix ' User has selected playlist of of audio they want us to play screenContent = msg.getRoSGNode() - m.spinner = screenContent.findNode("spinner") - if isValid(m.spinner) - m.spinner.visible = true - end if + startLoadingSpinner() viewHandled = false @@ -460,6 +466,7 @@ options.query = query else if isNodeEvent(msg, "itemSelected") ' Search item selected + startLoadingSpinner() node = getMsgPicker(msg) ' TODO - swap this based on target.mediatype ' types: [ Series (Show), Episode, Movie, Audio, Person, Studio, MusicArtist ] @@ -495,6 +502,7 @@ m.global.queueManager.callFunc("playQueue") else ' TODO - switch on more node types + stopLoadingSpinner() message_dialog("This type is not yet supported: " + node.type + ".") end if else if isNodeEvent(msg, "buttonSelected") @@ -503,7 +511,7 @@ group = sceneManager.callFunc("getActiveScene") if isValid(btn) and btn.id = "play-button" ' User chose Play button from movie detail view - + startLoadingSpinner() ' Check if a specific Audio Stream was selected audio_stream_idx = 0 if isValid(group) and isValid(group.selectedAudioStreamIndex) @@ -536,6 +544,7 @@ else if btn <> invalid and btn.id = "trailer-button" ' User chose to play a trailer from the movie detail view + startLoadingSpinner() dialog = createObject("roSGNode", "ProgressDialog") dialog.title = tr("Loading trailer") m.scene.dialog = dialog @@ -547,6 +556,8 @@ m.global.queueManager.callFunc("set", trailerData) m.global.queueManager.callFunc("playQueue") dialog.close = true + else + stopLoadingSpinner() end if if isValid(group) and isValid(group.lastFocus) @@ -734,6 +745,7 @@ end if else if isNodeEvent(msg, "dataReturned") popupNode = msg.getRoSGNode() + stopLoadingSpinner() if isValid(popupNode) and isValid(popupNode.returnData) selectedItem = m.global.queueManager.callFunc("getHold") m.global.queueManager.callFunc("clearHold") @@ -741,6 +753,7 @@ if isValid(selectedItem) and selectedItem.count() > 0 and isValid(selectedItem[0]) if popupNode.returnData.indexselected = 0 'Resume video from resume point + startLoadingSpinner() startingPoint = 0 if isValid(selectedItem[0].json) and isValid(selectedItem[0].json.UserData) and isValid(selectedItem[0].json.UserData.PlaybackPositionTicks) @@ -755,6 +768,7 @@ m.global.queueManager.callFunc("playQueue") else if popupNode.returnData.indexselected = 1 'Start Over from beginning selected, set position to 0 + startLoadingSpinner() selectedItem[0].startingPoint = 0 m.global.queueManager.callFunc("clear") m.global.queueManager.callFunc("push", selectedItem[0]) diff --git a/docs/api/source_ShowScenes.bs.html b/docs/api/source_ShowScenes.bs.html index ba20496962..58c3c0a338 100644 --- a/docs/api/source_ShowScenes.bs.html +++ b/docs/api/source_ShowScenes.bs.html @@ -18,12 +18,9 @@ invalidServer = true if not startOver - ' Show Connecting to Server spinner - dialog = createObject("roSGNode", "ProgressDialog") - dialog.title = tr("Connecting to Server") - m.scene.dialog = dialog + m.scene.isLoading = true invalidServer = ServerInfo().Error - dialog.close = true + m.scene.isLoading = false end if m.serverSelection = "Saved" @@ -94,7 +91,7 @@ unset_setting("server") goto start_login else if userSelected <> "" - startMediaLoadingSpinner() + startLoadingSpinner() print "A public user was selected with username=" + userSelected session.user.Update("name", userSelected) regex = CreateObject("roRegex", "[^a-zA-Z0-9\ \-\_]", "") @@ -304,10 +301,7 @@ else if type(msg) = "roSGNodeEvent" node = msg.getNode() if node = "submit" - ' Show Connecting to Server spinner - dialog = createObject("roSGNode", "ProgressDialog") - dialog.title = tr("Connecting to Server") - m.scene.dialog = dialog + m.scene.isLoading = true serverUrl = inferServerUrl(screen.serverUrl) @@ -323,7 +317,7 @@ end if set_setting("server", serverUrl) end if - dialog.close = true + m.scene.isLoading = false if isConnected = false or serverInfoResult = invalid ' Maybe don't unset setting, but offer as a prompt @@ -483,7 +477,7 @@ else if type(msg) = "roSGNodeEvent" node = msg.getNode() if node = "submit" - startMediaLoadingSpinner() + startLoadingSpinner() ' Validate credentials activeUser = get_token(username.value, password.value) if isValid(activeUser) @@ -815,17 +809,19 @@ group = CreateObject("roSGNode", "TVEpisodes") group.optionsAvailable = false ' push scene asap (to prevent extra button presses when retriving series/movie info) - m.global.sceneManager.callFunc("pushScene", group) group.seasonData = seasonMetaData.json group.objects = TVEpisodes(seriesID, seasonID) group.episodeObjects = group.objects - group.extrasObjects = TVSeasonExtras(seasonID) - ' watch for button presses group.observeField("episodeSelected", m.port) group.observeField("quickPlayNode", m.port) - ' finished building SeasonDetails view + ' don't wait for the extras button stopLoadingSpinner() + m.global.sceneManager.callFunc("pushScene", group) + ' check for specials/extras for this season + group.extrasObjects = TVSeasonExtras(seasonID) + + ' finished building SeasonDetails view return group end function @@ -879,7 +875,7 @@ ' validate video_id if not isValid(video_id) or video_id = "" then return invalid - startMediaLoadingSpinner() + startLoadingSpinner() ' Video is Playing video = VideoPlayer(video_id, mediaSourceId, audio_stream_idx, defaultSubtitleTrackFromVid(video_id), forceTranscoding, showIntro, allowResumeDialog) @@ -938,7 +934,7 @@ resumeData.push(tr("Go to episode")) end if end if - + stopLoadingSpinner() m.global.sceneManager.callFunc("optionDialog", tr("Playback Options"), [], resumeData) end sub
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_VideoPlayer.bs.html b/docs/api/source_VideoPlayer.bs.html index a7a885ff6e..5410a29a2f 100644 --- a/docs/api/source_VideoPlayer.bs.html +++ b/docs/api/source_VideoPlayer.bs.html @@ -61,7 +61,7 @@ if playbackPosition > 0 stopLoadingSpinner() dialogResult = startPlayBackOver(playbackPosition) - startMediaLoadingSpinner() + startLoadingSpinner() 'Dialog returns -1 when back pressed, 0 for resume, and 1 for start over if dialogResult = -1 'User pressed back, return invalid and don't load video diff --git a/docs/api/source_utils_misc.bs.html b/docs/api/source_utils_misc.bs.html index 82f890463f..87cf8b006d 100644 --- a/docs/api/source_utils_misc.bs.html +++ b/docs/api/source_utils_misc.bs.html @@ -453,27 +453,30 @@ return str(input) end function -sub startLoadingSpinner() - m.spinner = createObject("roSGNode", "Spinner") - m.spinner.translation = "[900, 450]" - m.spinner.visible = true - m.scene.appendChild(m.spinner) -end sub +' +' startLoadingSpinner: Start a loading spinner and attach it to the main JFScene. +' Displays an invisible ProgressDialog node by default to disable keypresses while loading. +' +' @param {boolean} [disableRemote=true] +sub startLoadingSpinner(disableRemote = true as boolean) + if not isValid(m.scene) + m.scene = m.top.getScene() + end if -sub startMediaLoadingSpinner() - dialog = createObject("roSGNode", "ProgressDialog") - dialog.id = "invisibiledialog" - dialog.visible = false - m.scene.dialog = dialog - startLoadingSpinner() + if not m.scene.isLoading + m.scene.disableRemote = disableRemote + m.scene.isLoading = true + end if end sub sub stopLoadingSpinner() - if isValid(m.spinner) - m.spinner.visible = false + if not isValid(m.scene) + m.scene = m.top.getScene() end if - if isValid(m.scene) and isValid(m.scene.dialog) - m.scene.dialog.close = true + + if m.scene.isLoading + m.scene.disableRemote = false + m.scene.isLoading = false end if end sub diff --git a/docs/api/source_utils_quickplay.bs.html b/docs/api/source_utils_quickplay.bs.html index e45f2f5f60..de7609e2ea 100644 --- a/docs/api/source_utils_quickplay.bs.html +++ b/docs/api/source_utils_quickplay.bs.html @@ -86,6 +86,8 @@ photoPlayer.itemsArray = photoAlbumData.items photoPlayer.itemIndex = 0 m.global.sceneManager.callfunc("pushScene", photoPlayer) + else + stopLoadingSpinner() end if end sub @@ -105,6 +107,8 @@ }) if isValid(albumSongs) and isValidAndNotEmpty(albumSongs.items) quickplay.pushToQueue(albumSongs.items) + else + stopLoadingSpinner() end if end sub @@ -128,6 +132,8 @@ if isValid(artistSongs) and isValidAndNotEmpty(artistSongs.items) quickplay.pushToQueue(artistSongs.items, true) + else + stopLoadingSpinner() end if end sub @@ -144,6 +150,8 @@ }) if isValid(data) and isValidAndNotEmpty(data.Items) quickplay.pushToQueue(data.items) + else + stopLoadingSpinner() end if end sub @@ -199,6 +207,8 @@ if isValid(data) and isValidAndNotEmpty(data.Items) ' add all episodes found to a playlist quickplay.pushToQueue(data.Items) + else + stopLoadingSpinner() end if end if end if @@ -242,6 +252,8 @@ end for if m.global.queueManager.callFunc("getCount") > 1 m.global.queueManager.callFunc("toggleShuffle") + else + stopLoadingSpinner() end if end if end sub @@ -307,6 +319,8 @@ end if end if end if + else + stopLoadingSpinner() end if end sub @@ -347,6 +361,8 @@ if m.global.queueManager.callFunc("getCount") > 1 m.global.queueManager.callFunc("toggleShuffle") + else + stopLoadingSpinner() end if end sub @@ -354,8 +370,8 @@ sub tvChannel(itemNode as object) if not isValid(itemNode) or not isValid(itemNode.id) then return - stopLoadingSpinner() group = CreateVideoPlayerGroup(itemNode.id) + stopLoadingSpinner() m.global.sceneManager.callFunc("pushScene", group) end sub @@ -363,8 +379,8 @@ 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) + stopLoadingSpinner() m.global.sceneManager.callFunc("pushScene", group) end sub @@ -385,6 +401,8 @@ if m.global.queueManager.callFunc("getCount") > 1 m.global.queueManager.callFunc("toggleShuffle") end if + else + stopLoadingSpinner() end if end sub @@ -453,6 +471,8 @@ quickplay.pushToQueue(folderData.items, true) end if end if + else + stopLoadingSpinner() end if end sub @@ -486,6 +506,8 @@ end if end for quickplay.pushToQueue(movieList) + else + stopLoadingSpinner() end if else if collectionType = "music" ' get audio files from under this collection @@ -503,6 +525,8 @@ print "songsData=", songsData if isValid(songsData) and isValidAndNotEmpty(songsData.items) quickplay.pushToQueue(songsData.Items, true) + else + stopLoadingSpinner() end if else if collectionType = "boxsets" ' get list of all boxsets inside @@ -531,6 +555,8 @@ if isValid(boxsetData) and isValidAndNotEmpty(boxsetData.items) ' add all boxset items to queue quickplay.pushToQueue(boxsetData.Items) + else + stopLoadingSpinner() end if end if else if collectionType = "tvshows" or collectionType = "collectionfolder" @@ -547,7 +573,15 @@ print "tvshowsData=", tvshowsData if isValid(tvshowsData) and isValidAndNotEmpty(tvshowsData.items) - quickplay.multipleSeries(tvshowsData.items) + ' the type of media returned from api may change. + if LCase(tvshowsData.items[0].Type) = "series" + quickplay.multipleSeries(tvshowsData.items) + else + ' if first item is not a series, then assume they are all videos and/or episodes + quickplay.pushToQueue(tvshowsData.items) + end if + else + stopLoadingSpinner() end if else if collectionType = "musicvideos" ' get randomized list of videos inside @@ -564,6 +598,8 @@ print "data=", data if isValid(data) and isValidAndNotEmpty(data.items) quickplay.pushToQueue(data.Items) + else + stopLoadingSpinner() end if else if collectionType = "homevideos" ' Photo library - items can be type video, photo, or photoAlbum @@ -584,8 +620,11 @@ photoPlayer.itemsArray = folderData.items photoPlayer.itemIndex = 0 m.global.sceneManager.callfunc("pushScene", photoPlayer) + else + stopLoadingSpinner() end if else + stopLoadingSpinner() print "Quick Play WARNING: Unknown collection type" end if end sub @@ -623,6 +662,8 @@ ' validate api results if isValid(playlistItems) and isValidAndNotEmpty(playlistItems.items) quickplay.pushToQueue(playlistItems.items, true) + else + stopLoadingSpinner() end if end if else if collectionType = "livetv" @@ -645,8 +686,11 @@ print "myChannel=", myChannel ' play channel quickplay.tvChannel(myChannel) + else + stopLoadingSpinner() end if else + stopLoadingSpinner() print "Quick Play CollectionFolder WARNING: Unknown collection type" end if end sub From e318c829729cb1b110e7bdc420e8ff31c7ed9198 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Wed, 29 Nov 2023 22:15:01 -0500 Subject: [PATCH 57/82] remove unused code --- source/utils/quickplay.bs | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/source/utils/quickplay.bs b/source/utils/quickplay.bs index e963e0a061..a022be0f9f 100644 --- a/source/utils/quickplay.bs +++ b/source/utils/quickplay.bs @@ -256,37 +256,6 @@ namespace quickplay end if end sub - ' A folder with Videos inside of it. - ' Shuffle play all videos inside that are not resumable. - sub videoFolder(itemNode as object) - print "itemNode=", itemNode - if isValidAndNotEmpty(itemNode) - ' get randomized list of videos inside - data = api.users.GetItemsByQuery(m.global.session.user.id, { - "parentId": itemNode.id, - "sortBy": "Random", - "recursive": true, - "includeItemTypes": "Movie,Video", - "limit": 2000 - }) - print "data=", data - if isValid(data) and isValidAndNotEmpty(data.items) - videoList = [] - ' add each item to the queue - for each item in data.Items - print "data.Item=", item - ' only add videos we're not currently watching - if isValid(item.userdata) and isValid(item.userdata.PlaybackPositionTicks) - if item.userdata.PlaybackPositionTicks = 0 - videoList.push(item) - end if - end if - end for - quickplay.pushToQueue(videoList) - end if - end if - end sub - ' A container with some kind of videos inside of it sub videoContainer(itemNode as object) print "itemNode=", itemNode From 490e18d62c5bb570581099529b81c9cc4ed36806 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Thu, 30 Nov 2023 03:26:14 +0000 Subject: [PATCH 58/82] Update API docs --- docs/api/data/search.json | 2 +- docs/api/module-quickplay.html | 2 +- docs/api/source_utils_quickplay.bs.html | 117 ++++++++++++++---------- 3 files changed, 73 insertions(+), 48 deletions(-) diff --git a/docs/api/data/search.json b/docs/api/data/search.json index 3922842e1a..2b650d6c3c 100644 --- a/docs/api/data/search.json +++ b/docs/api/data/search.json @@ -1 +1 @@ -{"list":[{"title":"module:AlbumData","link":"AlbumData"},{"title":"module:AlbumData.setFields","link":"setFields"},{"title":"module:AlbumGrid","link":"AlbumGrid"},{"title":"module:AlbumGrid.getData","link":"getData"},{"title":"module:AlbumGrid.init","link":"init"},{"title":"module:AlbumGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumTrackList","link":"AlbumTrackList"},{"title":"module:AlbumTrackList.getData","link":"getData"},{"title":"module:AlbumTrackList.init","link":"init"},{"title":"module:AlbumView","link":"AlbumView"},{"title":"module:AlbumView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:AlbumView.createDialogPallete","link":"createDialogPallete"},{"title":"module:AlbumView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:AlbumView.init","link":"init"},{"title":"module:AlbumView.onDoneLoading","link":"onDoneLoading"},{"title":"module:AlbumView.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:AlbumView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AlbumView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AlbumView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AlbumView.setupMainNode","link":"setupMainNode"},{"title":"module:Alpha","link":"Alpha"},{"title":"module:Alpha.init","link":"init"},{"title":"module:Alpha.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView","link":"ArtistView"},{"title":"module:ArtistView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:ArtistView.OnScreenShown","link":"OnScreenShown"},{"title":"module:ArtistView.artistOverviewChanged","link":"artistOverviewChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:ArtistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:ArtistView.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:ArtistView.init","link":"init"},{"title":"module:ArtistView.onAlbumsData","link":"onAlbumsData"},{"title":"module:ArtistView.onAlbumsEscape","link":"onAlbumsEscape"},{"title":"module:ArtistView.onAppearsOnData","link":"onAppearsOnData"},{"title":"module:ArtistView.onAppearsOnEscape","link":"onAppearsOnEscape"},{"title":"module:ArtistView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:ArtistView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:ArtistView.onEllipsisChanged","link":"onEllipsisChanged"},{"title":"module:ArtistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView.onSectionNavigationEscape","link":"onSectionNavigationEscape"},{"title":"module:ArtistView.onSectionNavigationSelected","link":"onSectionNavigationSelected"},{"title":"module:ArtistView.onSectionScrollerChange","link":"onSectionScrollerChange"},{"title":"module:ArtistView.pageContentChanged","link":"pageContentChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:ArtistView.setPosterImage","link":"setPosterImage"},{"title":"module:ArtistView.setScreenTitle","link":"setScreenTitle"},{"title":"module:ArtistView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:ArtistView.setupMainNode","link":"setupMainNode"},{"title":"module:AudioPlayer","link":"AudioPlayer"},{"title":"module:AudioPlayer.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:AudioPlayer.audioStateChanged","link":"audioStateChanged","description":"

State Change Event Handler

"},{"title":"module:AudioPlayer.init","link":"init"},{"title":"module:AudioPlayerView","link":"AudioPlayerView"},{"title":"module:AudioPlayerView.LoadNextSong","link":"LoadNextSong"},{"title":"module:AudioPlayerView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:AudioPlayerView.audioPositionChanged","link":"audioPositionChanged"},{"title":"module:AudioPlayerView.audioStateChanged","link":"audioStateChanged"},{"title":"module:AudioPlayerView.bufferPositionChanged","link":"bufferPositionChanged"},{"title":"module:AudioPlayerView.endScreenSaver","link":"endScreenSaver"},{"title":"module:AudioPlayerView.findCurrentSongIndex","link":"findCurrentSongIndex"},{"title":"module:AudioPlayerView.init","link":"init"},{"title":"module:AudioPlayerView.loadButtons","link":"loadButtons","description":"

If we have more and 1 song to play, fade in the next and previous controls

"},{"title":"module:AudioPlayerView.loopClicked","link":"loopClicked"},{"title":"module:AudioPlayerView.nextClicked","link":"nextClicked"},{"title":"module:AudioPlayerView.onAudioStreamLoaded","link":"onAudioStreamLoaded"},{"title":"module:AudioPlayerView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:AudioPlayerView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:AudioPlayerView.onKeyEvent","link":"onKeyEvent","description":"

Process key press events

"},{"title":"module:AudioPlayerView.onMetaDataLoaded","link":"onMetaDataLoaded"},{"title":"module:AudioPlayerView.onScreensaverTimeoutLoaded","link":"onScreensaverTimeoutLoaded"},{"title":"module:AudioPlayerView.pageContentChanged","link":"pageContentChanged","description":"

Update values on screen when page content changes

"},{"title":"module:AudioPlayerView.playAction","link":"playAction"},{"title":"module:AudioPlayerView.previousClicked","link":"previousClicked"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.screenSaverActive","link":"screenSaverActive"},{"title":"module:AudioPlayerView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:AudioPlayerView.setLoopButtonImage","link":"setLoopButtonImage"},{"title":"module:AudioPlayerView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AudioPlayerView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AudioPlayerView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AudioPlayerView.setShuffleIconState","link":"setShuffleIconState"},{"title":"module:AudioPlayerView.setTrackNumberDisplay","link":"setTrackNumberDisplay"},{"title":"module:AudioPlayerView.setupAnimationTasks","link":"setupAnimationTasks"},{"title":"module:AudioPlayerView.setupAudioNode","link":"setupAudioNode","description":"

Creates audio node used to play song(s)

"},{"title":"module:AudioPlayerView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:AudioPlayerView.setupDataTasks","link":"setupDataTasks","description":"

Creates tasks to gather data needed to render Scene and play song

"},{"title":"module:AudioPlayerView.setupInfoNodes","link":"setupInfoNodes"},{"title":"module:AudioPlayerView.setupScreenSaver","link":"setupScreenSaver"},{"title":"module:AudioPlayerView.shuffleClicked","link":"shuffleClicked"},{"title":"module:AudioPlayerView.startScreenSaver","link":"startScreenSaver"},{"title":"module:AudioPlayerView.toggleShuffleEnabled","link":"toggleShuffleEnabled"},{"title":"module:AudioTrackListItem","link":"AudioTrackListItem"},{"title":"module:AudioTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:AudioTrackListItem.init","link":"init"},{"title":"module:AudioTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ButtonGroupHoriz","link":"ButtonGroupHoriz"},{"title":"module:ButtonGroupHoriz.init","link":"init"},{"title":"module:ButtonGroupHoriz.onKeyEvent","link":"onKeyEvent"},{"title":"module:ButtonGroupVert","link":"ButtonGroupVert"},{"title":"module:ButtonGroupVert.init","link":"init"},{"title":"module:ButtonGroupVert.onFocusButtonChanged","link":"onFocusButtonChanged"},{"title":"module:ButtonGroupVert.onFocusChanged","link":"onFocusChanged"},{"title":"module:ButtonGroupVert.onKeyEvent","link":"onKeyEvent"},{"title":"module:ChannelData","link":"ChannelData"},{"title":"module:ChannelData.setFields","link":"setFields"},{"title":"module:ChannelData.setPoster","link":"setPoster"},{"title":"module:Clock","link":"Clock"},{"title":"module:Clock.init","link":"init"},{"title":"module:Clock.onCurrentTimeTimerFire","link":"onCurrentTimeTimerFire","description":"

onCurrentTimeTimerFire: Code that runs every time the currentTimeTimer fires

"},{"title":"module:CollectionData","link":"CollectionData"},{"title":"module:CollectionData.setFields","link":"setFields"},{"title":"module:CollectionData.setPoster","link":"setPoster"},{"title":"module:ConfigData","link":"ConfigData"},{"title":"module:ConfigData.init","link":"init"},{"title":"module:ConfigItem","link":"ConfigItem"},{"title":"module:ConfigItem.init","link":"init"},{"title":"module:ConfigItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ConfigItem.setColors","link":"setColors"},{"title":"module:ConfigList","link":"ConfigList"},{"title":"module:ConfigList.configListShowDialog","link":"configListShowDialog"},{"title":"module:ConfigList.dismiss_dialog","link":"dismiss_dialog"},{"title":"module:ConfigList.init","link":"init"},{"title":"module:ConfigList.onDialogButton","link":"onDialogButton"},{"title":"module:ConfigList.onItemSelected","link":"onItemSelected"},{"title":"module:ConfigList.setData","link":"setData"},{"title":"module:ExtrasItem","link":"ExtrasItem"},{"title":"module:ExtrasItem.focusChanged","link":"focusChanged"},{"title":"module:ExtrasItem.init","link":"init"},{"title":"module:ExtrasItem.showContent","link":"showContent"},{"title":"module:ExtrasRowList","link":"ExtrasRowList"},{"title":"module:ExtrasRowList.addRowSize","link":"addRowSize"},{"title":"module:ExtrasRowList.buildRow","link":"buildRow"},{"title":"module:ExtrasRowList.init","link":"init"},{"title":"module:ExtrasRowList.loadParts","link":"loadParts"},{"title":"module:ExtrasRowList.loadPersonVideos","link":"loadPersonVideos"},{"title":"module:ExtrasRowList.onAdditionalPartsLoaded","link":"onAdditionalPartsLoaded"},{"title":"module:ExtrasRowList.onLikeThisLoaded","link":"onLikeThisLoaded"},{"title":"module:ExtrasRowList.onMoviesLoaded","link":"onMoviesLoaded"},{"title":"module:ExtrasRowList.onPeopleLoaded","link":"onPeopleLoaded"},{"title":"module:ExtrasRowList.onRowItemFocused","link":"onRowItemFocused"},{"title":"module:ExtrasRowList.onRowItemSelected","link":"onRowItemSelected"},{"title":"module:ExtrasRowList.onSeriesLoaded","link":"onSeriesLoaded"},{"title":"module:ExtrasRowList.onShowsLoaded","link":"onShowsLoaded"},{"title":"module:ExtrasRowList.onSpecialFeaturesLoaded","link":"onSpecialFeaturesLoaded"},{"title":"module:ExtrasRowList.updateSize","link":"updateSize"},{"title":"module:FavoriteItemsTask","link":"FavoriteItemsTask"},{"title":"module:FavoriteItemsTask.init","link":"init"},{"title":"module:FavoriteItemsTask.setFavoriteStatus","link":"setFavoriteStatus"},{"title":"module:FolderData","link":"FolderData"},{"title":"module:FolderData.setFields","link":"setFields"},{"title":"module:FolderData.setPoster","link":"setPoster"},{"title":"module:GetFiltersTask","link":"GetFiltersTask"},{"title":"module:GetFiltersTask.getFiltersTask","link":"getFiltersTask"},{"title":"module:GetFiltersTask.init","link":"init"},{"title":"module:GetNextEpisodeTask","link":"GetNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.getNextEpisodeTask","link":"getNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.init","link":"init"},{"title":"module:GetPlaybackInfoTask","link":"GetPlaybackInfoTask"},{"title":"module:GetPlaybackInfoTask.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:GetPlaybackInfoTask.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:GetPlaybackInfoTask.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:GetPlaybackInfoTask.getPlaybackInfoTask","link":"getPlaybackInfoTask","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:GetPlaybackInfoTask.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:GetPlaybackInfoTask.init","link":"init"},{"title":"module:GetShuffleEpisodesTask","link":"GetShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.getShuffleEpisodesTask","link":"getShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.init","link":"init"},{"title":"module:GridItem","link":"GridItem"},{"title":"module:GridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:GridItem.focusChanging","link":"focusChanging","description":"

Use FocusPercent to animate scaling of Poser Image

"},{"title":"module:GridItem.init","link":"init"},{"title":"module:GridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:GridItemSmall","link":"GridItemSmall"},{"title":"module:GridItemSmall.focusChanged","link":"focusChanged"},{"title":"module:GridItemSmall.init","link":"init"},{"title":"module:GridItemSmall.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItemSmall.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:Home","link":"Home"},{"title":"module:Home.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook that gets ran as needed.\nUsed to update the focus, the state of the data, and tells the server about the device profile

"},{"title":"module:Home.init","link":"init"},{"title":"module:Home.loadLibraries","link":"loadLibraries"},{"title":"module:Home.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:Home.refresh","link":"refresh"},{"title":"module:HomeData","link":"HomeData"},{"title":"module:HomeData.setData","link":"setData"},{"title":"module:HomeItem","link":"HomeItem"},{"title":"module:HomeItem.drawProgressBar","link":"drawProgressBar","description":"

Draws and animates item progress bar

"},{"title":"module:HomeItem.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:HomeItem.init","link":"init"},{"title":"module:HomeItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:HomeItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and icon when poster loaded

"},{"title":"module:HomeRows","link":"HomeRows"},{"title":"module:HomeRows.addHomeSection","link":"addHomeSection","description":"

Adds a new home section to the home rows.\nReturns a boolean indicating whether the section was handled.

"},{"title":"module:HomeRows.createContinueWatchingRow","link":"createContinueWatchingRow","description":"

Create a row displaying items the user can continue watching

"},{"title":"module:HomeRows.createFavoritesRow","link":"createFavoritesRow","description":"

Create a row displaying items from the user's favorites list

"},{"title":"module:HomeRows.createLatestInRows","link":"createLatestInRows","description":"

Create a row displaying latest items in each of the user's libraries

"},{"title":"module:HomeRows.createLibraryRow","link":"createLibraryRow","description":"

Create a row displaying the user's libraries

"},{"title":"module:HomeRows.createLiveTVRow","link":"createLiveTVRow","description":"

Create a row displaying the live tv now on section

"},{"title":"module:HomeRows.createNextUpRow","link":"createNextUpRow","description":"

Create a row displaying next episodes up to watch

"},{"title":"module:HomeRows.filterNodeArray","link":"filterNodeArray"},{"title":"module:HomeRows.init","link":"init"},{"title":"module:HomeRows.itemSelected","link":"itemSelected"},{"title":"module:HomeRows.loadLibraries","link":"loadLibraries"},{"title":"module:HomeRows.onKeyEvent","link":"onKeyEvent"},{"title":"module:HomeRows.onLibrariesLoaded","link":"onLibrariesLoaded"},{"title":"module:HomeRows.removeHomeSection","link":"removeHomeSection","description":"

Removes a home section from the home rows

"},{"title":"module:HomeRows.updateContinueWatchingItems","link":"updateContinueWatchingItems"},{"title":"module:HomeRows.updateFavoritesItems","link":"updateFavoritesItems"},{"title":"module:HomeRows.updateHomeRows","link":"updateHomeRows","description":"

Update home row data

"},{"title":"module:HomeRows.updateLatestInRows","link":"updateLatestInRows","description":"

Iterate over user's libraries and update data for each Latest In section

"},{"title":"module:HomeRows.updateLatestItems","link":"updateLatestItems"},{"title":"module:HomeRows.updateNextUpItems","link":"updateNextUpItems"},{"title":"module:HomeRows.updateOnNowItems","link":"updateOnNowItems"},{"title":"module:HomeRows.updateSize","link":"updateSize"},{"title":"module:HomeRows.updateSizeArray","link":"updateSizeArray"},{"title":"module:IconButton","link":"IconButton"},{"title":"module:IconButton.init","link":"init"},{"title":"module:IconButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:IconButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:IconButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:IconButton.onIconChanged","link":"onIconChanged"},{"title":"module:IconButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:IconButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:IconButton.onTextChanged","link":"onTextChanged"},{"title":"module:IconButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:IconButton.setIconSize","link":"setIconSize"},{"title":"module:Image","link":"Image"},{"title":"module:Image.ImageURL","link":"ImageURL"},{"title":"module:Image.ItemImages","link":"ItemImages"},{"title":"module:Image.PosterImage","link":"PosterImage"},{"title":"module:Image.UserImageURL","link":"UserImageURL"},{"title":"module:ImageData","link":"ImageData"},{"title":"module:ImageData.setFields","link":"setFields"},{"title":"module:IntegerKeyboard","link":"IntegerKeyboard"},{"title":"module:IntegerKeyboard.init","link":"init"},{"title":"module:IntegerKeyboard.keySelected","link":"keySelected"},{"title":"module:IntegerKeyboard.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid","link":"ItemGrid"},{"title":"module:ItemGrid.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:ItemGrid.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:ItemGrid.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:ItemGrid.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:ItemGrid.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:ItemGrid.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:ItemGrid.init","link":"init"},{"title":"module:ItemGrid.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:ItemGrid.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:ItemGrid.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:ItemGrid.onChannelFocused","link":"onChannelFocused"},{"title":"module:ItemGrid.onChannelSelected","link":"onChannelSelected"},{"title":"module:ItemGrid.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:ItemGrid.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:ItemGrid.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:ItemGrid.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:ItemGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:ItemGrid.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:ItemGrid.setBoxsetsOptions","link":"setBoxsetsOptions","description":"

Set Boxset view, sort, and filter options

"},{"title":"module:ItemGrid.setDefaultOptions","link":"setDefaultOptions","description":"

Set Default view, sort, and filter options

"},{"title":"module:ItemGrid.setLiveTvOptions","link":"setLiveTvOptions","description":"

Set Live TV view, sort, and filter options

"},{"title":"module:ItemGrid.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:ItemGrid.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:ItemGrid.setPhotoAlbumOptions","link":"setPhotoAlbumOptions","description":"

Set Photo Album view, sort, and filter options

"},{"title":"module:ItemGrid.setTvShowsOptions","link":"setTvShowsOptions","description":"

Set TV Show view, sort, and filter options

"},{"title":"module:ItemGrid.showTVGuide","link":"showTVGuide"},{"title":"module:ItemGrid.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:ItemGrid.updateTitle","link":"updateTitle"},{"title":"module:ItemGridOptions","link":"ItemGridOptions"},{"title":"module:ItemGridOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:ItemGridOptions.hideChecklist","link":"hideChecklist"},{"title":"module:ItemGridOptions.init","link":"init"},{"title":"module:ItemGridOptions.isFilterMenuDataValid","link":"isFilterMenuDataValid","description":"

Check if data for Filter Menu is valid

"},{"title":"module:ItemGridOptions.onFilterFocusChange","link":"onFilterFocusChange"},{"title":"module:ItemGridOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGridOptions.optionsSet","link":"optionsSet"},{"title":"module:ItemGridOptions.saveFavoriteItemSelected","link":"saveFavoriteItemSelected"},{"title":"module:ItemGridOptions.setHeartColor","link":"setHeartColor"},{"title":"module:ItemGridOptions.showChecklist","link":"showChecklist"},{"title":"module:ItemGridOptions.toggleFavorite","link":"toggleFavorite"},{"title":"module:Items","link":"Items"},{"title":"module:Items.AppearsOnList","link":"AppearsOnList","description":"

Get list of albums an artist appears on

"},{"title":"module:Items.ArtistOverview","link":"ArtistOverview","description":"

Music Artist Data

"},{"title":"module:Items.AudioItem","link":"AudioItem","description":"

Get Songs that are on an Album

"},{"title":"module:Items.AudioStream","link":"AudioStream"},{"title":"module:Items.BackdropImage","link":"BackdropImage"},{"title":"module:Items.CreateArtistMix","link":"CreateArtistMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.CreateInstantMix","link":"CreateInstantMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.GetIntroVideos","link":"GetIntroVideos","description":"

Get Intro Videos for an item

"},{"title":"module:Items.GetSongsByArtist","link":"GetSongsByArtist","description":"

Get list of songs belonging to an artist

"},{"title":"module:Items.ItemGetPlaybackInfo","link":"ItemGetPlaybackInfo"},{"title":"module:Items.ItemMetaData","link":"ItemMetaData","description":"

MetaData about an item

"},{"title":"module:Items.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:Items.MusicAlbumList","link":"MusicAlbumList","description":"

Get list of albums belonging to an artist

"},{"title":"module:Items.MusicSongList","link":"MusicSongList","description":"

Get Songs that are on an Album

"},{"title":"module:Items.PlaylistItemList","link":"PlaylistItemList","description":"

Get Items that are under the provided item

"},{"title":"module:Items.TVEpisodeShuffleList","link":"TVEpisodeShuffleList"},{"title":"module:Items.TVEpisodes","link":"TVEpisodes","description":"

Returns a list of TV Shows for a given TV Show and season\nAccepts strings for the TV Show Id and the season Id

"},{"title":"module:Items.TVSeasonExtras","link":"TVSeasonExtras","description":"

Returns a list of extra features for a TV Show season\nAccepts a string that is a TV Show season id

"},{"title":"module:Items.TVSeasons","link":"TVSeasons","description":"

Seasons for a TV Show

"},{"title":"module:Items.searchMedia","link":"searchMedia","description":"

Search across all libraries

"},{"title":"module:Items.useTranscodeAudioStream","link":"useTranscodeAudioStream"},{"title":"module:JFButton","link":"JFButton"},{"title":"module:JFButton.init","link":"init"},{"title":"module:JFButton.onTextChanged","link":"onTextChanged","description":"

Whenever the text changes, pad both sides with whitespace so we can center the button text

"},{"title":"module:JFButtons","link":"JFButtons"},{"title":"module:JFButtons.focusChanged","link":"focusChanged","description":"

Change opacity of the highlighted menu item based on focus

"},{"title":"module:JFButtons.highlightSelected","link":"highlightSelected","description":"

Highlight selected menu option

"},{"title":"module:JFButtons.init","link":"init"},{"title":"module:JFButtons.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFButtons.renderChanged","link":"renderChanged","description":"

When options are fully displayed, set focus and selected option

"},{"title":"module:JFButtons.selectedIndexChanged","link":"selectedIndexChanged","description":"

When Selected Index set, ensure it is the one Focused

"},{"title":"module:JFButtons.showButtons","link":"showButtons"},{"title":"module:JFButtons.updateButtons","link":"updateButtons"},{"title":"module:JFGroup","link":"JFGroup"},{"title":"module:JFGroup.init","link":"init"},{"title":"module:JFGroup.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog","link":"JFMessageDialog"},{"title":"module:JFMessageDialog.init","link":"init"},{"title":"module:JFMessageDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog.redraw","link":"redraw"},{"title":"module:JFMessageDialog.updateMessage","link":"updateMessage"},{"title":"module:JFMessageDialog.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang","link":"JFOverhang"},{"title":"module:JFOverhang.init","link":"init"},{"title":"module:JFOverhang.onVisibleChange","link":"onVisibleChange"},{"title":"module:JFOverhang.resetTime","link":"resetTime"},{"title":"module:JFOverhang.setClockVisibility","link":"setClockVisibility"},{"title":"module:JFOverhang.setRightSeperatorVisibility","link":"setRightSeperatorVisibility"},{"title":"module:JFOverhang.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang.updateTime","link":"updateTime"},{"title":"module:JFOverhang.updateTimeDisplay","link":"updateTimeDisplay"},{"title":"module:JFOverhang.updateTitle","link":"updateTitle"},{"title":"module:JFOverhang.updateUser","link":"updateUser"},{"title":"module:JFScene","link":"JFScene"},{"title":"module:JFScene.disableRemoteChanged","link":"disableRemoteChanged","description":"

Triggered when the disableRemote boolean component field is changed

"},{"title":"module:JFScene.init","link":"init"},{"title":"module:JFScene.isLoadingChanged","link":"isLoadingChanged","description":"

Triggered when the isLoading boolean component field is changed

"},{"title":"module:JFScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFScreen","link":"JFScreen"},{"title":"module:JFScreen.OnScreenHidden","link":"OnScreenHidden","description":"

Function called when the screen is hidden by the screen manager\nIt is expected that screens override this function if required,\nto handle focus any actions required on the screen being hidden

"},{"title":"module:JFScreen.OnScreenShown","link":"OnScreenShown","description":"

Function called when the screen is displayed by the screen manager\nIt is expected that screens override this function to handle focus\nmanagmenet and any other actions required on screen shown

"},{"title":"module:JFScreen.init","link":"init"},{"title":"module:JFServer","link":"JFServer"},{"title":"module:JFServer.init","link":"init"},{"title":"module:JFServer.itemContentChanged","link":"itemContentChanged"},{"title":"module:JFServer.onFocusPercentChange","link":"onFocusPercentChange"},{"title":"module:JFServer.setTextColor","link":"setTextColor"},{"title":"module:JFVideo","link":"JFVideo"},{"title":"module:JFVideo.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:JFVideo.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:JFVideo.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:JFVideo.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:JFVideo.init","link":"init"},{"title":"module:JFVideo.loadCaption","link":"loadCaption"},{"title":"module:JFVideo.onAllowCaptionsChange","link":"onAllowCaptionsChange"},{"title":"module:JFVideo.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:JFVideo.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFVideo.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:JFVideo.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:JFVideo.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:JFVideo.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:JFVideo.toggleCaption","link":"toggleCaption"},{"title":"module:JFVideo.updateCaption","link":"updateCaption"},{"title":"module:JFVideo.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:ListPoster","link":"ListPoster"},{"title":"module:ListPoster.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:ListPoster.init","link":"init"},{"title":"module:ListPoster.itemContentChanged","link":"itemContentChanged"},{"title":"module:ListPoster.updateSize","link":"updateSize"},{"title":"module:LoadChannelsTask","link":"LoadChannelsTask"},{"title":"module:LoadChannelsTask.init","link":"init"},{"title":"module:LoadChannelsTask.loadChannels","link":"loadChannels"},{"title":"module:LoadItemsTask","link":"LoadItemsTask"},{"title":"module:LoadItemsTask.getPersonVideos","link":"getPersonVideos"},{"title":"module:LoadItemsTask.init","link":"init"},{"title":"module:LoadItemsTask.loadItems","link":"loadItems"},{"title":"module:LoadItemsTask2","link":"LoadItemsTask2"},{"title":"module:LoadItemsTask2.init","link":"init"},{"title":"module:LoadItemsTask2.loadItems","link":"loadItems"},{"title":"module:LoadPhotoTask","link":"LoadPhotoTask"},{"title":"module:LoadPhotoTask.init","link":"init"},{"title":"module:LoadPhotoTask.loadItems","link":"loadItems"},{"title":"module:LoadProgramDetailsTask","link":"LoadProgramDetailsTask"},{"title":"module:LoadProgramDetailsTask.init","link":"init"},{"title":"module:LoadProgramDetailsTask.loadProgramDetails","link":"loadProgramDetails"},{"title":"module:LoadScreenSaverTimeoutTask","link":"LoadScreenSaverTimeoutTask"},{"title":"module:LoadScreenSaverTimeoutTask.getScreensaverTimeout","link":"getScreensaverTimeout"},{"title":"module:LoadScreenSaverTimeoutTask.init","link":"init"},{"title":"module:LoadSheduleTask","link":"LoadSheduleTask"},{"title":"module:LoadSheduleTask.init","link":"init"},{"title":"module:LoadSheduleTask.loadSchedule","link":"loadSchedule"},{"title":"module:LoadVideoContentTask","link":"LoadVideoContentTask"},{"title":"module:LoadVideoContentTask.FindPreferredAudioStream","link":"FindPreferredAudioStream"},{"title":"module:LoadVideoContentTask.LoadItems_AddVideoContent","link":"LoadItems_AddVideoContent"},{"title":"module:LoadVideoContentTask.LoadItems_VideoPlayer","link":"LoadItems_VideoPlayer"},{"title":"module:LoadVideoContentTask.addNextEpisodesToQueue","link":"addNextEpisodesToQueue","description":"

Add next episodes to the playback queue

"},{"title":"module:LoadVideoContentTask.addSubtitlesToVideo","link":"addSubtitlesToVideo"},{"title":"module:LoadVideoContentTask.addVideoContentURL","link":"addVideoContentURL"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"title":"module:LoadVideoContentTask.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:LoadVideoContentTask.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:LoadVideoContentTask.init","link":"init"},{"title":"module:LoadVideoContentTask.loadItems","link":"loadItems"},{"title":"module:LoadVideoContentTask.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:LoginScene","link":"LoginScene"},{"title":"module:LoginScene.init","link":"init"},{"title":"module:LoginScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:Main","link":"Main"},{"title":"module:Main.Main","link":"Main"},{"title":"module:MovieData","link":"MovieData"},{"title":"module:MovieData.setContainer","link":"setContainer"},{"title":"module:MovieData.setFields","link":"setFields"},{"title":"module:MovieData.setPoster","link":"setPoster"},{"title":"module:MovieDetails","link":"MovieDetails"},{"title":"module:MovieDetails.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieDetails.SetDefaultAudioTrack","link":"SetDefaultAudioTrack"},{"title":"module:MovieDetails.SetUpAudioOptions","link":"SetUpAudioOptions"},{"title":"module:MovieDetails.SetUpVideoOptions","link":"SetUpVideoOptions"},{"title":"module:MovieDetails.audioOptionsClosed","link":"audioOptionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieDetails.getEndTime","link":"getEndTime"},{"title":"module:MovieDetails.getRuntime","link":"getRuntime"},{"title":"module:MovieDetails.init","link":"init"},{"title":"module:MovieDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:MovieDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieDetails.round","link":"round"},{"title":"module:MovieDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:MovieDetails.setFieldText","link":"setFieldText"},{"title":"module:MovieDetails.setWatchedColor","link":"setWatchedColor"},{"title":"module:MovieDetails.trailerAvailableChanged","link":"trailerAvailableChanged"},{"title":"module:MovieDetails.videoOptionsClosed","link":"videoOptionsClosed","description":"

Check if options were updated and if any reloding is needed...

"},{"title":"module:MovieLibraryView","link":"MovieLibraryView"},{"title":"module:MovieLibraryView.FilterDataLoaded","link":"FilterDataLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MovieLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MovieLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MovieLibraryView.SetName","link":"SetName","description":"

Set Selected Movie Name

"},{"title":"module:MovieLibraryView.SetOfficialRating","link":"SetOfficialRating","description":"

Set Selected Movie OfficialRating

"},{"title":"module:MovieLibraryView.SetOverview","link":"SetOverview","description":"

Set Selected Movie Overview

"},{"title":"module:MovieLibraryView.SetProductionYear","link":"SetProductionYear","description":"

Set Selected Movie ProductionYear

"},{"title":"module:MovieLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MovieLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MovieLibraryView.getRuntime","link":"getRuntime"},{"title":"module:MovieLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MovieLibraryView.init","link":"init"},{"title":"module:MovieLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MovieLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MovieLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MovieLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MovieLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MovieLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MovieLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MovieLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MovieLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MovieLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieLibraryView.round","link":"round"},{"title":"module:MovieLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MovieLibraryView.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:MovieLibraryView.setSelectedOptions","link":"setSelectedOptions","description":"

Data to display when options button selected

"},{"title":"module:MovieLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MovieLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MovieOptions","link":"MovieOptions"},{"title":"module:MovieOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:MovieOptions.init","link":"init"},{"title":"module:MovieOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieOptions.optionsSet","link":"optionsSet"},{"title":"module:MusicAlbumData","link":"MusicAlbumData"},{"title":"module:MusicAlbumData.setFields","link":"setFields"},{"title":"module:MusicAlbumData.setPoster","link":"setPoster"},{"title":"module:MusicAlbumSongListData","link":"MusicAlbumSongListData"},{"title":"module:MusicAlbumSongListData.setFields","link":"setFields"},{"title":"module:MusicAlbumSongListData.setPoster","link":"setPoster"},{"title":"module:MusicArtistData","link":"MusicArtistData"},{"title":"module:MusicArtistData.setFields","link":"setFields"},{"title":"module:MusicArtistData.setPoster","link":"setPoster"},{"title":"module:MusicArtistGridItem","link":"MusicArtistGridItem"},{"title":"module:MusicArtistGridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:MusicArtistGridItem.init","link":"init"},{"title":"module:MusicArtistGridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:MusicArtistGridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:MusicLibraryView","link":"MusicLibraryView"},{"title":"module:MusicLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MusicLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MusicLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MusicLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MusicLibraryView.SetAlbumCount","link":"SetAlbumCount","description":"

Set Selected Artist Album Count

"},{"title":"module:MusicLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MusicLibraryView.SetGenres","link":"SetGenres","description":"

Set Selected Artist Genres

"},{"title":"module:MusicLibraryView.SetName","link":"SetName","description":"

Set Selected Artist Name

"},{"title":"module:MusicLibraryView.SetSongCount","link":"SetSongCount","description":"

Set Selected Artist Song Count

"},{"title":"module:MusicLibraryView.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:MusicLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MusicLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MusicLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MusicLibraryView.init","link":"init"},{"title":"module:MusicLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MusicLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MusicLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MusicLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MusicLibraryView.onGenreItemFocused","link":"onGenreItemFocused","description":"

Genre Item Focused

"},{"title":"module:MusicLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MusicLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MusicLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MusicLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MusicLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MusicLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MusicLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MusicLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MusicLibraryView.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:MusicLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MusicLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MusicSongData","link":"MusicSongData"},{"title":"module:MusicSongData.setFields","link":"setFields"},{"title":"module:MusicSongData.setPoster","link":"setPoster"},{"title":"module:OSD","link":"OSD"},{"title":"module:OSD.inactiveCheck","link":"inactiveCheck","description":"

inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.

"},{"title":"module:OSD.init","link":"init"},{"title":"module:OSD.onButtonSelected","link":"onButtonSelected","description":"

onButtonSelected: Handler for selection of buttons from the menu.

"},{"title":"module:OSD.onFocusChanged","link":"onFocusChanged","description":"

onFocusChanged: Handler for changes to the focus of this menu.

"},{"title":"module:OSD.onItemTitleTextChanged","link":"onItemTitleTextChanged","description":"

onItemTitleTextChanged: Handler for changes to m.top.itemTitleText param.

"},{"title":"module:OSD.onKeyEvent","link":"onKeyEvent"},{"title":"module:OSD.onPlaybackStateChanged","link":"onPlaybackStateChanged","description":"

onPlaybackStateChanged: Handler for changes to m.top.playbackState param

"},{"title":"module:OSD.onProgressPercentageChanged","link":"onProgressPercentageChanged","description":"

onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param

"},{"title":"module:OSD.onVisibleChanged","link":"onVisibleChanged","description":"

onVisibleChanged: Handler for changes to the visibility of this menu.

"},{"title":"module:OSD.resetFocusToDefaultButton","link":"resetFocusToDefaultButton","description":"

resetFocusToDefaultButton: Reset focus back to the default button

"},{"title":"module:OptionNode","link":"OptionNode"},{"title":"module:OptionNode.init","link":"init"},{"title":"module:OptionsButton","link":"OptionsButton"},{"title":"module:OptionsButton.init","link":"init"},{"title":"module:OptionsButton.press","link":"press"},{"title":"module:OptionsData","link":"OptionsData"},{"title":"module:OptionsData.init","link":"init"},{"title":"module:OptionsData.press","link":"press"},{"title":"module:OptionsData.update_title","link":"update_title"},{"title":"module:OptionsSlider","link":"OptionsSlider"},{"title":"module:OptionsSlider.init","link":"init"},{"title":"module:OptionsSlider.onKeyEvent","link":"onKeyEvent"},{"title":"module:OptionsSlider.setFields","link":"setFields"},{"title":"module:OverviewDialog","link":"OverviewDialog"},{"title":"module:OverviewDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:OverviewDialog.setOverview","link":"setOverview"},{"title":"module:OverviewDialog.setTitle","link":"setTitle"},{"title":"module:PersonData","link":"PersonData"},{"title":"module:PersonData.setFields","link":"setFields"},{"title":"module:PersonData.setPoster","link":"setPoster"},{"title":"module:PersonDetails","link":"PersonDetails"},{"title":"module:PersonDetails.createDialogPallete","link":"createDialogPallete"},{"title":"module:PersonDetails.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PersonDetails.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:PersonDetails.init","link":"init"},{"title":"module:PersonDetails.loadPerson","link":"loadPerson"},{"title":"module:PersonDetails.onButtonGroupEscaped","link":"onButtonGroupEscaped"},{"title":"module:PersonDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PersonDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:PersonDetails.shortDate","link":"shortDate"},{"title":"module:PhotoData","link":"PhotoData"},{"title":"module:PhotoData.setFields","link":"setFields"},{"title":"module:PhotoData.setPoster","link":"setPoster"},{"title":"module:PhotoDetails","link":"PhotoDetails"},{"title":"module:PhotoDetails.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook.\nUsed to ensure tasks are stopped

"},{"title":"module:PhotoDetails.init","link":"init"},{"title":"module:PhotoDetails.isRandomChanged","link":"isRandomChanged","description":"

isRandom component field has changed

"},{"title":"module:PhotoDetails.isSlideshowChanged","link":"isSlideshowChanged","description":"

isSlideshow component field has changed

"},{"title":"module:PhotoDetails.isValidToContinue","link":"isValidToContinue"},{"title":"module:PhotoDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:PhotoDetails.nextSlide","link":"nextSlide"},{"title":"module:PhotoDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PhotoDetails.onPhotoLoaded","link":"onPhotoLoaded"},{"title":"module:PhotoDetails.statusUpdate","link":"statusUpdate"},{"title":"module:PlaybackDialog","link":"PlaybackDialog"},{"title":"module:PlaybackDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlayedCheckmark","link":"PlayedCheckmark"},{"title":"module:PlayedCheckmark.init","link":"init"},{"title":"module:PlaylistData","link":"PlaylistData"},{"title":"module:PlaylistData.setFields","link":"setFields"},{"title":"module:PlaylistData.setPoster","link":"setPoster"},{"title":"module:PlaylistView","link":"PlaylistView"},{"title":"module:PlaylistView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:PlaylistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:PlaylistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PlaylistView.init","link":"init"},{"title":"module:PlaylistView.onDoneLoading","link":"onDoneLoading"},{"title":"module:PlaylistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlaylistView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:PlaylistView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:PlaylistView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:PlaylistView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:PlaylistView.setupMainNode","link":"setupMainNode"},{"title":"module:PlaystateTask","link":"PlaystateTask"},{"title":"module:PlaystateTask.PlaystateDefaults","link":"PlaystateDefaults"},{"title":"module:PlaystateTask.PlaystateUpdate","link":"PlaystateUpdate"},{"title":"module:PlaystateTask.init","link":"init"},{"title":"module:PostTask","link":"PostTask"},{"title":"module:PostTask.asyncPost","link":"asyncPost","description":"

Post data and wait for response code

"},{"title":"module:PostTask.empty","link":"empty","description":"

Revert PostTask to default state

"},{"title":"module:PostTask.init","link":"init"},{"title":"module:PostTask.postItems","link":"postItems","description":"

Main function for PostTask.\nPosts either an array of data\nor a string of data to an API endpoint.\nSaves the response information

"},{"title":"module:ProgramDetails","link":"ProgramDetails"},{"title":"module:ProgramDetails.channelUpdated","link":"channelUpdated"},{"title":"module:ProgramDetails.focusChanged","link":"focusChanged","description":"

Show view channel button when item has Focus

"},{"title":"module:ProgramDetails.getDurationStringFromSeconds","link":"getDurationStringFromSeconds","description":"

Get program duration string (e.g. 1h 20m)

"},{"title":"module:ProgramDetails.getRelativeDayName","link":"getRelativeDayName","description":"

Get relative date name for a date (yesterday, today, tomorrow, or otherwise weekday name )

"},{"title":"module:ProgramDetails.init","link":"init"},{"title":"module:ProgramDetails.onAnimationComplete","link":"onAnimationComplete"},{"title":"module:ProgramDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:ProgramDetails.programUpdated","link":"programUpdated"},{"title":"module:ProgramDetails.setupLabels","link":"setupLabels","description":"

Set up Live and Repeat label sizes

"},{"title":"module:ProgramDetails.updateLabels","link":"updateLabels"},{"title":"module:PublicUserData","link":"PublicUserData"},{"title":"module:PublicUserData.init","link":"init"},{"title":"module:QueueManager","link":"QueueManager"},{"title":"module:QueueManager.clear","link":"clear","description":"

Clear all content from play queue

"},{"title":"module:QueueManager.clearHold","link":"clearHold","description":"

Clear all hold content

"},{"title":"module:QueueManager.deleteAtIndex","link":"deleteAtIndex","description":"

Delete item from play queue at passed index

"},{"title":"module:QueueManager.getCount","link":"getCount","description":"

Return the number of items in the play queue

"},{"title":"module:QueueManager.getCurrentItem","link":"getCurrentItem","description":"

Return the item currently in focus from the play queue

"},{"title":"module:QueueManager.getHold","link":"getHold","description":"

Return the items in the hold

"},{"title":"module:QueueManager.getIsShuffled","link":"getIsShuffled","description":"

Return whether or not shuffle is enabled

"},{"title":"module:QueueManager.getItemByIndex","link":"getItemByIndex","description":"

Return the item in the passed index from the play queue

"},{"title":"module:QueueManager.getItemType","link":"getItemType"},{"title":"module:QueueManager.getPosition","link":"getPosition","description":"

Returns current playback position within the queue

"},{"title":"module:QueueManager.getQueue","link":"getQueue","description":"

Return the current play queue

"},{"title":"module:QueueManager.getQueueTypes","link":"getQueueTypes","description":"

Return the types of items in current play queue

"},{"title":"module:QueueManager.getQueueUniqueTypes","link":"getQueueUniqueTypes","description":"

Return the unique types of items in current play queue

"},{"title":"module:QueueManager.getUnshuffledQueue","link":"getUnshuffledQueue","description":"

Return original, unshuffled queue

"},{"title":"module:QueueManager.hold","link":"hold","description":"

Hold an item

"},{"title":"module:QueueManager.init","link":"init"},{"title":"module:QueueManager.isPrerollActive","link":"isPrerollActive","description":"

Return isPrerollActive status

"},{"title":"module:QueueManager.moveBack","link":"moveBack","description":"

Move queue position back one

"},{"title":"module:QueueManager.moveForward","link":"moveForward","description":"

Move queue position ahead one

"},{"title":"module:QueueManager.peek","link":"peek","description":"

Return item at end of play queue without removing

"},{"title":"module:QueueManager.playQueue","link":"playQueue","description":"

Play items in queue

"},{"title":"module:QueueManager.pop","link":"pop","description":"

Remove item at end of play queue

"},{"title":"module:QueueManager.push","link":"push","description":"

Push new items to the play queue

"},{"title":"module:QueueManager.resetQueueItemOrder","link":"resetQueueItemOrder","description":"

Reset queue items back to original, unshuffled order

"},{"title":"module:QueueManager.resetShuffle","link":"resetShuffle","description":"

Reset shuffle to off state

"},{"title":"module:QueueManager.set","link":"set","description":"

Replace play queue with passed array

"},{"title":"module:QueueManager.setPosition","link":"setPosition","description":"

Set the queue position

"},{"title":"module:QueueManager.setPrerollStatus","link":"setPrerollStatus","description":"

Set prerollActive status

"},{"title":"module:QueueManager.setTopStartingPoint","link":"setTopStartingPoint","description":"

Set starting point for top item in the queue

"},{"title":"module:QueueManager.shuffleQueueItems","link":"shuffleQueueItems","description":"

Save a copy of the original queue and randomize order of queue items

"},{"title":"module:QueueManager.toggleShuffle","link":"toggleShuffle","description":"

Toggle shuffleEnabled state

"},{"title":"module:QueueManager.top","link":"top","description":"

Return the fitst item in the play queue

"},{"title":"module:QuickConnect","link":"QuickConnect"},{"title":"module:QuickConnect.init","link":"init"},{"title":"module:QuickConnect.monitorQuickConnect","link":"monitorQuickConnect"},{"title":"module:QuickConnectDialog","link":"QuickConnectDialog"},{"title":"module:QuickConnectDialog.OnAuthenticated","link":"OnAuthenticated"},{"title":"module:QuickConnectDialog.init","link":"init"},{"title":"module:QuickConnectDialog.onButtonSelected","link":"onButtonSelected"},{"title":"module:QuickConnectDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:QuickConnectDialog.quickConnectClosed","link":"quickConnectClosed"},{"title":"module:QuickConnectDialog.quickConnectStatus","link":"quickConnectStatus"},{"title":"module:RadioDialog","link":"RadioDialog"},{"title":"module:RadioDialog.init","link":"init"},{"title":"module:RadioDialog.moveScrollBar","link":"moveScrollBar","description":"

Move the popup's scroll bar

"},{"title":"module:RadioDialog.onButtonSelected","link":"onButtonSelected","description":"

Event handler for when user selected a button

"},{"title":"module:RadioDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:RadioDialog.onItemFocused","link":"onItemFocused","description":"

Event handler for when user's cursor highlights an option in the option list

"},{"title":"module:RadioDialog.onItemSelected","link":"onItemSelected","description":"

Once user selected an item, move cursor down to OK button

"},{"title":"module:RadioDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:RadioDialog.onScrollBarFocus","link":"onScrollBarFocus","description":"

If somehow the scrollbar gains focus, set focus back to the option list

"},{"title":"module:RecordProgramTask","link":"RecordProgramTask"},{"title":"module:RecordProgramTask.RecordOrCancelProgram","link":"RecordOrCancelProgram"},{"title":"module:RecordProgramTask.init","link":"init"},{"title":"module:SceneManager","link":"SceneManager"},{"title":"module:SceneManager.clearPreviousScene","link":"clearPreviousScene","description":"

Clear previous scene from group stack

"},{"title":"module:SceneManager.clearScenes","link":"clearScenes","description":"

Clear all content from group stack

"},{"title":"module:SceneManager.deleteSceneAtIndex","link":"deleteSceneAtIndex","description":"

Delete scene from group stack at passed index

"},{"title":"module:SceneManager.dismissDialog","link":"dismissDialog","description":"

Close currently displayed dialog

"},{"title":"module:SceneManager.getActiveScene","link":"getActiveScene","description":"

Return group at top of stack without removing

"},{"title":"module:SceneManager.init","link":"init"},{"title":"module:SceneManager.isDialogOpen","link":"isDialogOpen","description":"

Returns bool indicating if dialog is currently displayed

"},{"title":"module:SceneManager.optionClosed","link":"optionClosed","description":"

Return button the user selected

"},{"title":"module:SceneManager.optionDialog","link":"optionDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.optionSelected","link":"optionSelected","description":"

Return button the user selected

"},{"title":"module:SceneManager.popScene","link":"popScene","description":"

Remove the current group and load the last group from the stack

"},{"title":"module:SceneManager.pushScene","link":"pushScene","description":"

Push a new group onto the stack, replacing the existing group on the screen

"},{"title":"module:SceneManager.radioDialog","link":"radioDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.registerOverhangData","link":"registerOverhangData","description":"

Register observers for overhang data

"},{"title":"module:SceneManager.resetTime","link":"resetTime","description":"

Reset time

"},{"title":"module:SceneManager.settings","link":"settings","description":"

Display user/device settings screen

"},{"title":"module:SceneManager.standardDialog","link":"standardDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.unregisterOverhangData","link":"unregisterOverhangData","description":"

Remove observers for overhang data

"},{"title":"module:SceneManager.updateOptions","link":"updateOptions","description":"

Update options availability

"},{"title":"module:SceneManager.updateOverhangTitle","link":"updateOverhangTitle","description":"

Update overhang title

"},{"title":"module:SceneManager.updateOverhangVisible","link":"updateOverhangVisible","description":"

Update whether the overhang is visible or not

"},{"title":"module:SceneManager.updateUser","link":"updateUser","description":"

Update username in overhang

"},{"title":"module:SceneManager.userMessage","link":"userMessage","description":"

Display dialog to user with an OK button

"},{"title":"module:ScheduleProgramData","link":"ScheduleProgramData"},{"title":"module:ScheduleProgramData.setFields","link":"setFields"},{"title":"module:ScheduleProgramData.setPoster","link":"setPoster"},{"title":"module:SearchBox","link":"SearchBox"},{"title":"module:SearchBox.init","link":"init"},{"title":"module:SearchBox.searchMedias","link":"searchMedias"},{"title":"module:SearchData","link":"SearchData"},{"title":"module:SearchData.setFields","link":"setFields"},{"title":"module:SearchData.setPoster","link":"setPoster"},{"title":"module:SearchResults","link":"SearchResults"},{"title":"module:SearchResults.init","link":"init"},{"title":"module:SearchResults.loadResults","link":"loadResults"},{"title":"module:SearchResults.onKeyEvent","link":"onKeyEvent"},{"title":"module:SearchResults.searchMedias","link":"searchMedias"},{"title":"module:SearchRow","link":"SearchRow"},{"title":"module:SearchRow.addRow","link":"addRow"},{"title":"module:SearchRow.getData","link":"getData"},{"title":"module:SearchRow.init","link":"init"},{"title":"module:SearchRow.updateSize","link":"updateSize"},{"title":"module:SearchTask","link":"SearchTask"},{"title":"module:SearchTask.init","link":"init"},{"title":"module:SearchTask.search","link":"search"},{"title":"module:SeriesData","link":"SeriesData"},{"title":"module:SeriesData.setFields","link":"setFields"},{"title":"module:SeriesData.setPoster","link":"setPoster"},{"title":"module:ServerDiscoveryTask","link":"ServerDiscoveryTask"},{"title":"module:ServerDiscoveryTask.AddServer","link":"AddServer"},{"title":"module:ServerDiscoveryTask.ProcessClientDiscoveryResponse","link":"ProcessClientDiscoveryResponse"},{"title":"module:ServerDiscoveryTask.ProcessSSDPResponse","link":"ProcessSSDPResponse"},{"title":"module:ServerDiscoveryTask.SendClientDiscoveryBroadcast","link":"SendClientDiscoveryBroadcast"},{"title":"module:ServerDiscoveryTask.SendSSDPBroadcast","link":"SendSSDPBroadcast"},{"title":"module:ServerDiscoveryTask.execute","link":"execute"},{"title":"module:ServerDiscoveryTask.init","link":"init","description":"

Task used to discover jellyfin servers on the local network

"},{"title":"module:SetServerScreen","link":"SetServerScreen"},{"title":"module:SetServerScreen.ScanForServers","link":"ScanForServers"},{"title":"module:SetServerScreen.ScanForServersComplete","link":"ScanForServersComplete"},{"title":"module:SetServerScreen.ShowKeyboard","link":"ShowKeyboard"},{"title":"module:SetServerScreen.clearErrorMessage","link":"clearErrorMessage"},{"title":"module:SetServerScreen.init","link":"init"},{"title":"module:SetServerScreen.onDialogButton","link":"onDialogButton"},{"title":"module:SetServerScreen.onKeyEvent","link":"onKeyEvent"},{"title":"module:ShowScenes","link":"ShowScenes"},{"title":"module:ShowScenes.CreateAlbumView","link":"CreateAlbumView","description":"

Shows details on selected album. Description text, image, and list of available songs

"},{"title":"module:ShowScenes.CreateArtistView","link":"CreateArtistView","description":"

Shows details on selected artist. Bio, image, and list of available albums

"},{"title":"module:ShowScenes.CreateHomeGroup","link":"CreateHomeGroup"},{"title":"module:ShowScenes.CreateItemGrid","link":"CreateItemGrid"},{"title":"module:ShowScenes.CreateMovieDetailsGroup","link":"CreateMovieDetailsGroup"},{"title":"module:ShowScenes.CreateMovieLibraryView","link":"CreateMovieLibraryView"},{"title":"module:ShowScenes.CreateMusicLibraryView","link":"CreateMusicLibraryView"},{"title":"module:ShowScenes.CreatePersonView","link":"CreatePersonView"},{"title":"module:ShowScenes.CreatePlaylistView","link":"CreatePlaylistView","description":"

Shows details on selected playlist. Description text, image, and list of available items

"},{"title":"module:ShowScenes.CreateSearchPage","link":"CreateSearchPage"},{"title":"module:ShowScenes.CreateSeasonDetailsGroup","link":"CreateSeasonDetailsGroup"},{"title":"module:ShowScenes.CreateSeasonDetailsGroupByID","link":"CreateSeasonDetailsGroupByID"},{"title":"module:ShowScenes.CreateSeriesDetailsGroup","link":"CreateSeriesDetailsGroup"},{"title":"module:ShowScenes.CreateServerGroup","link":"CreateServerGroup"},{"title":"module:ShowScenes.CreateSigninGroup","link":"CreateSigninGroup"},{"title":"module:ShowScenes.CreateUserSelectGroup","link":"CreateUserSelectGroup"},{"title":"module:ShowScenes.CreateVideoPlayerGroup","link":"CreateVideoPlayerGroup"},{"title":"module:ShowScenes.DeleteFromServerList","link":"DeleteFromServerList"},{"title":"module:ShowScenes.LoginFlow","link":"LoginFlow"},{"title":"module:ShowScenes.SaveServerList","link":"SaveServerList"},{"title":"module:ShowScenes.SendPerformanceBeacon","link":"SendPerformanceBeacon","description":"

Roku Performance monitoring

"},{"title":"module:ShowScenes.playbackOptionDialog","link":"playbackOptionDialog","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:SlideOutButton","link":"SlideOutButton"},{"title":"module:SlideOutButton.init","link":"init"},{"title":"module:SlideOutButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:SlideOutButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:SlideOutButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:SlideOutButton.onHighlightChanged","link":"onHighlightChanged"},{"title":"module:SlideOutButton.onIconChanged","link":"onIconChanged"},{"title":"module:SlideOutButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:SlideOutButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:SlideOutButton.onTextChanged","link":"onTextChanged"},{"title":"module:SlideOutButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:SlideOutButton.setIconSize","link":"setIconSize"},{"title":"module:SongItem","link":"SongItem"},{"title":"module:SongItem.focusChanged","link":"focusChanged"},{"title":"module:SongItem.init","link":"init"},{"title":"module:SongItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:Spinner","link":"Spinner"},{"title":"module:Spinner.init","link":"init"},{"title":"module:StandardDialog","link":"StandardDialog"},{"title":"module:StandardDialog.init","link":"init"},{"title":"module:StandardDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:Subtitles","link":"Subtitles"},{"title":"module:Subtitles.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:Subtitles.changeSubtitleDuringPlayback","link":"changeSubtitleDuringPlayback"},{"title":"module:Subtitles.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

Identify the default subtitle track\nif "requires_text" is true, only return a track if it is textual\nThis allows forcing text subs, since roku requires transcoding of non-text subs\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.defaultSubtitleTrackFromVid","link":"defaultSubtitleTrackFromVid","description":"

Identify the default subtitle track for a given video id\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:Subtitles.getSubtitleSelIdxFromSubIdx","link":"getSubtitleSelIdxFromSubIdx","description":"

The subtitle index on the server differs from the index we track locally\nThis function converts the former into the latter

"},{"title":"module:Subtitles.selectSubtitleTrack","link":"selectSubtitleTrack"},{"title":"module:Subtitles.selectSubtitleTrackDialog","link":"selectSubtitleTrackDialog","description":"

Present Dialog to user to select subtitle track

"},{"title":"module:Subtitles.setupSubtitle","link":"setupSubtitle","description":"

Given a set of subtitles, and a subtitle index (the index on the server, not in the list provided)\nthis will set all relevant settings for roku (mainly closed captions) and return the index of the\nsubtitle track specified, but indexed based on the provided list of subtitles

"},{"title":"module:Subtitles.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:Subtitles.turnoffSubtitles","link":"turnoffSubtitles"},{"title":"module:TVEpisode","link":"TVEpisode"},{"title":"module:TVEpisode.setFields","link":"setFields"},{"title":"module:TVEpisode.setPoster","link":"setPoster"},{"title":"module:TVEpisodeData","link":"TVEpisodeData"},{"title":"module:TVEpisodeData.setFields","link":"setFields"},{"title":"module:TVEpisodeData.setPoster","link":"setPoster"},{"title":"module:TVEpisodeRow","link":"TVEpisodeRow"},{"title":"module:TVEpisodeRow.init","link":"init"},{"title":"module:TVEpisodeRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRow.setData","link":"setData"},{"title":"module:TVEpisodeRow.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRow.updateSize","link":"updateSize"},{"title":"module:TVEpisodeRowWithOptions","link":"TVEpisodeRowWithOptions"},{"title":"module:TVEpisodeRowWithOptions.SetUpAudioOptions","link":"SetUpAudioOptions","description":"

List of audio tracks to choose from

"},{"title":"module:TVEpisodeRowWithOptions.SetUpVideoOptions","link":"SetUpVideoOptions","description":"

List of video versions to choose from

"},{"title":"module:TVEpisodeRowWithOptions.audioOptionsClosed","link":"audioOptionsClosed"},{"title":"module:TVEpisodeRowWithOptions.init","link":"init"},{"title":"module:TVEpisodeRowWithOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRowWithOptions.rowsDoneLoading","link":"rowsDoneLoading"},{"title":"module:TVEpisodeRowWithOptions.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRowWithOptions.videoOptionsClosed","link":"videoOptionsClosed"},{"title":"module:TVEpisodes","link":"TVEpisodes"},{"title":"module:TVEpisodes.getFocusedItem","link":"getFocusedItem","description":"

get the currently focused item

"},{"title":"module:TVEpisodes.init","link":"init"},{"title":"module:TVEpisodes.onKeyEvent","link":"onKeyEvent","description":"

Handle navigation input from the remote and act on it

"},{"title":"module:TVEpisodes.setExtraButtonVisibility","link":"setExtraButtonVisibility","description":"

Updates the visibility of the Extras button based on if this season has any extra features

"},{"title":"module:TVEpisodes.setSeasonLoading","link":"setSeasonLoading"},{"title":"module:TVEpisodes.updateSeason","link":"updateSeason"},{"title":"module:TVListDetails","link":"TVListDetails"},{"title":"module:TVListDetails.DisplayAudioAvailable","link":"DisplayAudioAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one audio track to choose from

"},{"title":"module:TVListDetails.DisplayVideoAvailable","link":"DisplayVideoAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one video version to choose from

"},{"title":"module:TVListDetails.SetupAudioDisplay","link":"SetupAudioDisplay","description":"

Display current audio_codec and check if there is more than one audio track to choose from...

"},{"title":"module:TVListDetails.focusChanged","link":"focusChanged"},{"title":"module:TVListDetails.getEndTime","link":"getEndTime"},{"title":"module:TVListDetails.getRuntime","link":"getRuntime"},{"title":"module:TVListDetails.init","link":"init"},{"title":"module:TVListDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVListOptions","link":"TVListOptions"},{"title":"module:TVListOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:TVListOptions.init","link":"init"},{"title":"module:TVListOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVListOptions.optionsSet","link":"optionsSet"},{"title":"module:TVSeasonData","link":"TVSeasonData"},{"title":"module:TVSeasonData.setFields","link":"setFields"},{"title":"module:TVSeasonData.setPoster","link":"setPoster"},{"title":"module:TVSeasonRow","link":"TVSeasonRow"},{"title":"module:TVSeasonRow.getData","link":"getData"},{"title":"module:TVSeasonRow.init","link":"init"},{"title":"module:TVSeasonRow.updateSize","link":"updateSize"},{"title":"module:TVShowDescription","link":"TVShowDescription"},{"title":"module:TVShowDescription.getEndTime","link":"getEndTime"},{"title":"module:TVShowDescription.getHistory","link":"getHistory"},{"title":"module:TVShowDescription.getRuntime","link":"getRuntime"},{"title":"module:TVShowDescription.init","link":"init"},{"title":"module:TVShowDescription.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDescription.round","link":"round"},{"title":"module:TVShowDescription.setFieldText","link":"setFieldText"},{"title":"module:TVShowDetails","link":"TVShowDetails"},{"title":"module:TVShowDetails.getEndTime","link":"getEndTime"},{"title":"module:TVShowDetails.getHistory","link":"getHistory"},{"title":"module:TVShowDetails.getRuntime","link":"getRuntime"},{"title":"module:TVShowDetails.init","link":"init"},{"title":"module:TVShowDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVShowDetails.onShuffleEpisodeDataLoaded","link":"onShuffleEpisodeDataLoaded"},{"title":"module:TVShowDetails.round","link":"round"},{"title":"module:TVShowDetails.setFieldText","link":"setFieldText"},{"title":"module:TextSizeTask","link":"TextSizeTask"},{"title":"module:TextSizeTask.getTextSize","link":"getTextSize"},{"title":"module:TextSizeTask.init","link":"init"},{"title":"module:UserData","link":"UserData"},{"title":"module:UserData.getPreference","link":"getPreference"},{"title":"module:UserData.loadFromJSON","link":"loadFromJSON"},{"title":"module:UserData.loadFromRegistry","link":"loadFromRegistry"},{"title":"module:UserData.removeFromRegistry","link":"removeFromRegistry"},{"title":"module:UserData.saveToRegistry","link":"saveToRegistry"},{"title":"module:UserData.setDataFromJSON","link":"setDataFromJSON"},{"title":"module:UserData.setPreference","link":"setPreference"},{"title":"module:UserData.setServer","link":"setServer"},{"title":"module:UserItem","link":"UserItem"},{"title":"module:UserItem.init","link":"init"},{"title":"module:UserItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserLibrary","link":"UserLibrary"},{"title":"module:UserLibrary.MarkItemFavorite","link":"MarkItemFavorite"},{"title":"module:UserLibrary.MarkItemWatched","link":"MarkItemWatched"},{"title":"module:UserLibrary.UnmarkItemFavorite","link":"UnmarkItemFavorite"},{"title":"module:UserLibrary.UnmarkItemWatched","link":"UnmarkItemWatched"},{"title":"module:UserRow","link":"UserRow"},{"title":"module:UserRow.init","link":"init"},{"title":"module:UserRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserRow.setData","link":"setData"},{"title":"module:UserRow.setUser","link":"setUser"},{"title":"module:UserRow.updateSize","link":"updateSize"},{"title":"module:UserSelect","link":"UserSelect"},{"title":"module:UserSelect.init","link":"init"},{"title":"module:UserSelect.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserSelect.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserSelect.redraw","link":"redraw"},{"title":"module:VideoData","link":"VideoData"},{"title":"module:VideoData.setFields","link":"setFields"},{"title":"module:VideoData.setPoster","link":"setPoster"},{"title":"module:VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.AddVideoContent","link":"AddVideoContent"},{"title":"module:VideoPlayer.GetPlaybackInfo","link":"GetPlaybackInfo","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:VideoPlayer.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:VideoPlayer.PlayIntroVideo","link":"PlayIntroVideo"},{"title":"module:VideoPlayer.VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.autoPlayNextEpisode","link":"autoPlayNextEpisode"},{"title":"module:VideoPlayer.directPlaySupported","link":"directPlaySupported"},{"title":"module:VideoPlayer.getAudioFormat","link":"getAudioFormat"},{"title":"module:VideoPlayer.getAudioInfo","link":"getAudioInfo"},{"title":"module:VideoPlayer.getContainerType","link":"getContainerType"},{"title":"module:VideoPlayer.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:VideoPlayer.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:VideoPlayer.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:VideoPlayer.startPlayBackOver","link":"startPlayBackOver","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:VideoPlayerView","link":"VideoPlayerView"},{"title":"module:VideoPlayerView.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:VideoPlayerView.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:VideoPlayerView.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:VideoPlayerView.getCurrentChapterIndex","link":"getCurrentChapterIndex","description":"

getCurrentChapterIndex: Finds current chapter index

"},{"title":"module:VideoPlayerView.handleChapterListAction","link":"handleChapterListAction","description":"

handleChapterListAction: Handles action to show chapter list

"},{"title":"module:VideoPlayerView.handleChapterSkipAction","link":"handleChapterSkipAction","description":"

handleChapterSkipAction: Handles user command to skip chapters in playing video

"},{"title":"module:VideoPlayerView.handleHideAction","link":"handleHideAction","description":"

handleHideAction: Handles action to hide OSD menu

"},{"title":"module:VideoPlayerView.handleShowSubtitleMenuAction","link":"handleShowSubtitleMenuAction","description":"

handleShowSubtitleMenuAction: Handles action to show subtitle selection menu

"},{"title":"module:VideoPlayerView.handleShowVideoInfoPopupAction","link":"handleShowVideoInfoPopupAction","description":"

handleShowVideoInfoPopupAction: Handles action to show video info popup

"},{"title":"module:VideoPlayerView.handleVideoPlayPauseAction","link":"handleVideoPlayPauseAction","description":"

handleVideoPlayPauseAction: Handles action to either play or pause the video content

"},{"title":"module:VideoPlayerView.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:VideoPlayerView.init","link":"init"},{"title":"module:VideoPlayerView.loadCaption","link":"loadCaption","description":"

Set caption url to server subtitle track

"},{"title":"module:VideoPlayerView.onAllowCaptionsChange","link":"onAllowCaptionsChange","description":"

Only setup caption items if captions are allowed

"},{"title":"module:VideoPlayerView.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:VideoPlayerView.onKeyEvent","link":"onKeyEvent"},{"title":"module:VideoPlayerView.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:VideoPlayerView.onOSDAction","link":"onOSDAction","description":"

onOSDAction: Process action events from OSD to their respective handlers

"},{"title":"module:VideoPlayerView.onPlaybackErrorButtonSelected","link":"onPlaybackErrorButtonSelected"},{"title":"module:VideoPlayerView.onPlaybackErrorDialogClosed","link":"onPlaybackErrorDialogClosed"},{"title":"module:VideoPlayerView.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onSubtitleChange","link":"onSubtitleChange","description":"

Event handler for when selectedSubtitle changes

"},{"title":"module:VideoPlayerView.onVideoContentLoaded","link":"onVideoContentLoaded"},{"title":"module:VideoPlayerView.populateChapterMenu","link":"populateChapterMenu","description":"

populateChapterMenu: ' Parse chapter data from API and appeand to chapter list menu

"},{"title":"module:VideoPlayerView.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:VideoPlayerView.showPlaybackErrorDialog","link":"showPlaybackErrorDialog"},{"title":"module:VideoPlayerView.stateAllowsOSD","link":"stateAllowsOSD","description":"

stateAllowsOSD: Check if current video state allows showing the OSD

"},{"title":"module:VideoPlayerView.toggleCaption","link":"toggleCaption","description":"

Toggles visibility of custom subtitles and sets captionTask's player state

"},{"title":"module:VideoPlayerView.updateCaption","link":"updateCaption","description":"

Removes old subtitle lines and adds new subtitle lines

"},{"title":"module:VideoPlayerView.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:VideoTrackListItem","link":"VideoTrackListItem"},{"title":"module:VideoTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:VideoTrackListItem.init","link":"init"},{"title":"module:VideoTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ViewCreator","link":"ViewCreator"},{"title":"module:ViewCreator.CreateAudioPlayerView","link":"CreateAudioPlayerView","description":"

Play Audio

"},{"title":"module:ViewCreator.CreateVideoPlayerView","link":"CreateVideoPlayerView","description":"

Play Video

"},{"title":"module:ViewCreator.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:ViewCreator.onPlaybackInfoLoaded","link":"onPlaybackInfoLoaded","description":"

The playback info task has returned data

"},{"title":"module:ViewCreator.onSelectPlaybackInfoPressed","link":"onSelectPlaybackInfoPressed","description":"

User requested playback info

"},{"title":"module:ViewCreator.onSelectSubtitlePressed","link":"onSelectSubtitlePressed","description":"

User requested subtitle selection popup

"},{"title":"module:ViewCreator.onSelectionMade","link":"onSelectionMade","description":"

User has selected something from the radioDialog popup

"},{"title":"module:ViewCreator.onStateChange","link":"onStateChange","description":"

Playback state change event handlers

"},{"title":"module:ViewCreator.processSubtitleSelection","link":"processSubtitleSelection"},{"title":"module:WhatsNewDialog","link":"WhatsNewDialog"},{"title":"module:WhatsNewDialog.init","link":"init"},{"title":"module:WhatsNewDialog.setPalette","link":"setPalette"},{"title":"module:baserequest","link":"baserequest"},{"title":"module:baserequest.APIRequest","link":"APIRequest"},{"title":"module:baserequest.authRequest","link":"authRequest","description":"

Takes and returns a roUrlTransfer object after adding a Jellyfin "Authorization" header

"},{"title":"module:baserequest.buildAuthHeader","link":"buildAuthHeader","description":"

Returns a string containing the "Authorization" header payload

"},{"title":"module:baserequest.buildParams","link":"buildParams","description":"

Functions for making requests to the API

"},{"title":"module:baserequest.buildURL","link":"buildURL"},{"title":"module:baserequest.deleteVoid","link":"deleteVoid"},{"title":"module:baserequest.getJson","link":"getJson"},{"title":"module:baserequest.getString","link":"getString"},{"title":"module:baserequest.getVoid","link":"getVoid"},{"title":"module:baserequest.get_url","link":"get_url"},{"title":"module:baserequest.headVoid","link":"headVoid"},{"title":"module:baserequest.postJson","link":"postJson"},{"title":"module:baserequest.postString","link":"postString"},{"title":"module:baserequest.postVoid","link":"postVoid"},{"title":"module:baserequest.setCertificateAuthority","link":"setCertificateAuthority","description":"

sets the certificate authority by file path on the passed node

"},{"title":"module:captionTask","link":"captionTask"},{"title":"module:captionTask.fetchCaption","link":"fetchCaption"},{"title":"module:captionTask.init","link":"init"},{"title":"module:captionTask.isTime","link":"isTime"},{"title":"module:captionTask.newLayoutGroup","link":"newLayoutGroup"},{"title":"module:captionTask.newRect","link":"newRect"},{"title":"module:captionTask.newlabel","link":"newlabel"},{"title":"module:captionTask.parseVTT","link":"parseVTT"},{"title":"module:captionTask.setFont","link":"setFont"},{"title":"module:captionTask.toMs","link":"toMs"},{"title":"module:captionTask.updateCaption","link":"updateCaption"},{"title":"module:conditional","link":"conditional"},{"title":"module:conditional.printRegistry","link":"printRegistry","description":"

Print out all of the registry contents to the debug log

"},{"title":"module:config","link":"config"},{"title":"module:config.GetConfigTree","link":"GetConfigTree","description":"

Read config tree from json config file and return

"},{"title":"module:config.RegistryReadAll","link":"RegistryReadAll","description":"

Return all data found inside a registry section

"},{"title":"module:config.findConfigTreeKey","link":"findConfigTreeKey","description":"

Recursivly search the config tree for entry with settingname equal to key

"},{"title":"module:config.getRegistrySections","link":"getRegistrySections","description":"

Return an array of all the registry section keys

"},{"title":"module:config.getSavedUsers","link":"getSavedUsers","description":"

Returns an array of saved users from the registry\nthat belong to the active server

"},{"title":"module:config.get_setting","link":"get_setting","description":"

"Jellyfin" registry accessors for the default global settings

"},{"title":"module:config.get_user_setting","link":"get_user_setting","description":"

User registry accessors for the currently active user

"},{"title":"module:config.registry_delete","link":"registry_delete"},{"title":"module:config.registry_read","link":"registry_read","description":"

Generic registry accessors

"},{"title":"module:config.registry_write","link":"registry_write"},{"title":"module:config.set_setting","link":"set_setting"},{"title":"module:config.set_user_setting","link":"set_user_setting"},{"title":"module:config.unset_setting","link":"unset_setting"},{"title":"module:config.unset_user_setting","link":"unset_user_setting"},{"title":"module:deviceCapabilities","link":"deviceCapabilities"},{"title":"module:deviceCapabilities.GetBitRateLimit","link":"GetBitRateLimit"},{"title":"module:deviceCapabilities.GetDirectPlayProfiles","link":"GetDirectPlayProfiles"},{"title":"module:deviceCapabilities.getCodecProfiles","link":"getCodecProfiles"},{"title":"module:deviceCapabilities.getContainerProfiles","link":"getContainerProfiles"},{"title":"module:deviceCapabilities.getDeviceCapabilities","link":"getDeviceCapabilities","description":"

Returns the Device Capabilities for Roku.\nAlso prints out the device profile for debugging

"},{"title":"module:deviceCapabilities.getDeviceProfile","link":"getDeviceProfile"},{"title":"module:deviceCapabilities.getMaxHeightArray","link":"getMaxHeightArray"},{"title":"module:deviceCapabilities.getMaxWidthArray","link":"getMaxWidthArray"},{"title":"module:deviceCapabilities.getSubtitleProfiles","link":"getSubtitleProfiles"},{"title":"module:deviceCapabilities.getTranscodingProfiles","link":"getTranscodingProfiles"},{"title":"module:deviceCapabilities.printDeviceProfile","link":"printDeviceProfile","description":"

Print out the deviceProfile for debugging

"},{"title":"module:deviceCapabilities.removeDecimals","link":"removeDecimals","description":"

Remove all decimals from a string

"},{"title":"module:deviceCapabilities.setPreferredCodec","link":"setPreferredCodec","description":"

Takes and returns a comma delimited string of codecs.\nMoves the preferred codec to the front of the string

"},{"title":"module:deviceCapabilities.updateProfileArray","link":"updateProfileArray","description":"

Recieves and returns an assArray of supported profiles and levels for each video codec

"},{"title":"module:globals","link":"globals"},{"title":"module:globals.SaveAppToGlobal","link":"SaveAppToGlobal","description":"

Save information from roAppInfo to m.global.app

"},{"title":"module:globals.SaveDeviceToGlobal","link":"SaveDeviceToGlobal","description":"

Save information from roDeviceInfo to m.global.device

"},{"title":"module:globals.setConstants","link":"setConstants","description":"

Set global constants

"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.runGlobalMigrations","link":"runGlobalMigrations","description":"

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

"},{"title":"module:migrations.runRegistryUserMigrations","link":"runRegistryUserMigrations"},{"title":"module:misc","link":"misc"},{"title":"module:misc.AssocArrayEqual","link":"AssocArrayEqual"},{"title":"module:misc.arrayHasValue","link":"arrayHasValue","description":"

Check if a specific value is inside of an array

"},{"title":"module:misc.div_ceiling","link":"div_ceiling"},{"title":"module:misc.findNodeBySubtype","link":"findNodeBySubtype"},{"title":"module:misc.formatTime","link":"formatTime","description":"

Format time as 12 or 24 hour format based on system clock setting

"},{"title":"module:misc.getButton","link":"getButton"},{"title":"module:misc.getMinutes","link":"getMinutes","description":"

Converts ticks to minutes

"},{"title":"module:misc.getMsgPicker","link":"getMsgPicker"},{"title":"module:misc.get_dialog_result","link":"get_dialog_result","description":"

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

"},{"title":"module:misc.inArray","link":"inArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:misc.inferServerUrl","link":"inferServerUrl","description":"

take an incomplete url string and use it to make educated guesses about\nthe complete url. then tests these guesses to see if it can find a jf server\nreturns the url of the server it found, or an empty string

"},{"title":"module:misc.isJellyfinServer","link":"isJellyfinServer","description":"

accepts the raw json string of /system/info/public and returns\na boolean indicating if ProductName is "Jellyfin Server"

"},{"title":"module:misc.isLocalhost","link":"isLocalhost","description":"

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

"},{"title":"module:misc.isNodeEvent","link":"isNodeEvent"},{"title":"module:misc.isValid","link":"isValid","description":"

Returns whether or not passed value is valid

"},{"title":"module:misc.isValidAndNotEmpty","link":"isValidAndNotEmpty","description":"

Returns whether or not passed value is valid and not empty\nAccepts a string, or any countable type (arrays and lists)

"},{"title":"module:misc.lastFocusedChild","link":"lastFocusedChild"},{"title":"module:misc.leftPad","link":"leftPad"},{"title":"module:misc.message_dialog","link":"message_dialog"},{"title":"module:misc.option_dialog","link":"option_dialog"},{"title":"module:misc.parseUrl","link":"parseUrl","description":"

Returns an array from a url = [ url, proto, host, port, subdir+params ]\nIf port or subdir are not found, an empty string will be added to the array\nProto must be declared or array will be empty

"},{"title":"module:misc.roundNumber","link":"roundNumber","description":"

Rounds number to nearest integer

"},{"title":"module:misc.secondsToHuman","link":"secondsToHuman"},{"title":"module:misc.setFieldTextValue","link":"setFieldTextValue"},{"title":"module:misc.show_dialog","link":"show_dialog"},{"title":"module:misc.shuffleArray","link":"shuffleArray","description":"

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

"},{"title":"module:misc.startLoadingSpinner","link":"startLoadingSpinner","description":"

startLoadingSpinner: Start a loading spinner and attach it to the main JFScene.\nDisplays an invisible ProgressDialog node by default to disable keypresses while loading.

"},{"title":"module:misc.stopLoadingSpinner","link":"stopLoadingSpinner"},{"title":"module:misc.ticksToHuman","link":"ticksToHuman"},{"title":"module:misc.toString","link":"toString"},{"title":"module:misc.urlCandidates","link":"urlCandidates","description":"

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates\nfor the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated\nfull urls.

"},{"title":"module:misc.versionChecker","link":"versionChecker","description":"

Returns whether or not a version number (e.g. 10.7.7) is greater or equal\nto some minimum version allowed (e.g. 10.8.0)

"},{"title":"module:quickplay","link":"quickplay"},{"title":"module:quickplay.album","link":"album","description":"

A music album.\nPlay the entire album starting with track 1.

"},{"title":"module:quickplay.artist","link":"artist","description":"

A music artist.\nShuffle play all songs by artist.

"},{"title":"module:quickplay.audio","link":"audio","description":"

A single audio file.

"},{"title":"module:quickplay.boxset","link":"boxset","description":"

A boxset.\nPlay all items inside.

"},{"title":"module:quickplay.collectionFolder","link":"collectionFolder","description":"

Quick Play A CollectionFolder.\nShuffle play the items inside\nwith some differences based on collectionType.

"},{"title":"module:quickplay.folder","link":"folder","description":"

Quick Play A folder.\nShuffle play all items found

"},{"title":"module:quickplay.multipleSeries","link":"multipleSeries","description":"

More than one TV Show Series.\nShuffle play all watched episodes

"},{"title":"module:quickplay.musicVideo","link":"musicVideo","description":"

A single music video file.

"},{"title":"module:quickplay.person","link":"person","description":"

Quick Play A Person.\nShuffle play all videos found

"},{"title":"module:quickplay.photo","link":"photo","description":"

A single photo.

"},{"title":"module:quickplay.photoAlbum","link":"photoAlbum","description":"

A photo album.

"},{"title":"module:quickplay.playlist","link":"playlist","description":"

Quick Play A Playlist.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.program","link":"program","description":"

Quick Play A Live Program

"},{"title":"module:quickplay.pushToQueue","link":"pushToQueue","description":"

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

"},{"title":"module:quickplay.season","link":"season","description":"

A TV Show Season.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.series","link":"series","description":"

A TV Show Series.\nPlay the first unwatched episode.\nIf none, shuffle play the whole series.

"},{"title":"module:quickplay.tvChannel","link":"tvChannel","description":"

Quick Play A TVChannel

"},{"title":"module:quickplay.userView","link":"userView","description":"

Quick Play A UserView.\nPlay logic depends on "collectionType".

"},{"title":"module:quickplay.video","link":"video","description":"

A single video file.

"},{"title":"module:schedule","link":"schedule"},{"title":"module:schedule.channelFilterSet","link":"channelFilterSet"},{"title":"module:schedule.channelsearchTermSet","link":"channelsearchTermSet","description":"

Voice Search set

"},{"title":"module:schedule.focusProgramDetails","link":"focusProgramDetails","description":"

Move the TV Guide Grid down or up depending whether details are selected

"},{"title":"module:schedule.init","link":"init"},{"title":"module:schedule.onChannelsLoaded","link":"onChannelsLoaded","description":"

Initial list of channels loaded

"},{"title":"module:schedule.onGridScrolled","link":"onGridScrolled","description":"

As user scrolls grid, check if more data requries to be loaded

"},{"title":"module:schedule.onKeyEvent","link":"onKeyEvent"},{"title":"module:schedule.onProgramDetailsLoaded","link":"onProgramDetailsLoaded","description":"

Update the Program Details with full information

"},{"title":"module:schedule.onProgramFocused","link":"onProgramFocused"},{"title":"module:schedule.onProgramSelected","link":"onProgramSelected"},{"title":"module:schedule.onRecordChannelSelected","link":"onRecordChannelSelected","description":"

Handle user selecting "Record Channel" from Program Details

"},{"title":"module:schedule.onRecordOperationDone","link":"onRecordOperationDone"},{"title":"module:schedule.onRecordSeriesChannelSelected","link":"onRecordSeriesChannelSelected","description":"

Handle user selecting "Record Series" from Program Details

"},{"title":"module:schedule.onScheduleLoaded","link":"onScheduleLoaded","description":"

When LoadScheduleTask completes (initial or more data) and we have a schedule to display

"},{"title":"module:schedule.onWatchChannelSelected","link":"onWatchChannelSelected","description":"

Handle user selecting "Watch Channel" from Program Details

"},{"title":"module:section","link":"section"},{"title":"module:section.init","link":"init"},{"title":"module:section.onFocusChange","link":"onFocusChange"},{"title":"module:section.onIDChange","link":"onIDChange"},{"title":"module:section.onTranslationChange","link":"onTranslationChange"},{"title":"module:section.scrollDownToOnDeck","link":"scrollDownToOnDeck"},{"title":"module:section.scrollOffBottom","link":"scrollOffBottom"},{"title":"module:section.scrollOffOnDeck","link":"scrollOffOnDeck"},{"title":"module:section.scrollOffTop","link":"scrollOffTop"},{"title":"module:section.scrollUpToOnDeck","link":"scrollUpToOnDeck"},{"title":"module:section.showFromBottom","link":"showFromBottom"},{"title":"module:section.showFromTop","link":"showFromTop"},{"title":"module:sectionScroller","link":"sectionScroller"},{"title":"module:sectionScroller.displayedIndexChanged","link":"displayedIndexChanged"},{"title":"module:sectionScroller.init","link":"init"},{"title":"module:sectionScroller.onFocusChange","link":"onFocusChange"},{"title":"module:settings","link":"settings"},{"title":"module:settings.LoadMenu","link":"LoadMenu"},{"title":"module:settings.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook that gets ran as needed.\nAssumes settings were changed and they affect the device profile.\nPosts a new device profile to the server using the task thread

"},{"title":"module:settings.boolSettingChanged","link":"boolSettingChanged"},{"title":"module:settings.init","link":"init"},{"title":"module:settings.isFormInFocus","link":"isFormInFocus","description":"

Returns true if any of the data entry forms are in focus

"},{"title":"module:settings.onKeyEvent","link":"onKeyEvent"},{"title":"module:settings.onKeyGridEscape","link":"onKeyGridEscape"},{"title":"module:settings.onKeyGridSubmit","link":"onKeyGridSubmit"},{"title":"module:settings.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:settings.radioSettingChanged","link":"radioSettingChanged"},{"title":"module:settings.settingFocused","link":"settingFocused"},{"title":"module:settings.settingSelected","link":"settingSelected"},{"title":"module:userauth","link":"userauth"},{"title":"module:userauth.AboutMe","link":"AboutMe"},{"title":"module:userauth.AuthenticateViaQuickConnect","link":"AuthenticateViaQuickConnect"},{"title":"module:userauth.AvailableUsers","link":"AvailableUsers"},{"title":"module:userauth.GetPublicUsers","link":"GetPublicUsers"},{"title":"module:userauth.LoadUserAbilities","link":"LoadUserAbilities"},{"title":"module:userauth.ServerInfo","link":"ServerInfo"},{"title":"module:userauth.SignOut","link":"SignOut"},{"title":"module:userauth.checkQuickConnect","link":"checkQuickConnect"},{"title":"module:userauth.get_token","link":"get_token"},{"title":"module:userauth.initQuickConnect","link":"initQuickConnect"}]} \ No newline at end of file +{"list":[{"title":"module:AlbumData","link":"AlbumData"},{"title":"module:AlbumData.setFields","link":"setFields"},{"title":"module:AlbumGrid","link":"AlbumGrid"},{"title":"module:AlbumGrid.getData","link":"getData"},{"title":"module:AlbumGrid.init","link":"init"},{"title":"module:AlbumGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumTrackList","link":"AlbumTrackList"},{"title":"module:AlbumTrackList.getData","link":"getData"},{"title":"module:AlbumTrackList.init","link":"init"},{"title":"module:AlbumView","link":"AlbumView"},{"title":"module:AlbumView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:AlbumView.createDialogPallete","link":"createDialogPallete"},{"title":"module:AlbumView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:AlbumView.init","link":"init"},{"title":"module:AlbumView.onDoneLoading","link":"onDoneLoading"},{"title":"module:AlbumView.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:AlbumView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AlbumView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AlbumView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AlbumView.setupMainNode","link":"setupMainNode"},{"title":"module:Alpha","link":"Alpha"},{"title":"module:Alpha.init","link":"init"},{"title":"module:Alpha.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView","link":"ArtistView"},{"title":"module:ArtistView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:ArtistView.OnScreenShown","link":"OnScreenShown"},{"title":"module:ArtistView.artistOverviewChanged","link":"artistOverviewChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:ArtistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:ArtistView.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:ArtistView.init","link":"init"},{"title":"module:ArtistView.onAlbumsData","link":"onAlbumsData"},{"title":"module:ArtistView.onAlbumsEscape","link":"onAlbumsEscape"},{"title":"module:ArtistView.onAppearsOnData","link":"onAppearsOnData"},{"title":"module:ArtistView.onAppearsOnEscape","link":"onAppearsOnEscape"},{"title":"module:ArtistView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:ArtistView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:ArtistView.onEllipsisChanged","link":"onEllipsisChanged"},{"title":"module:ArtistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView.onSectionNavigationEscape","link":"onSectionNavigationEscape"},{"title":"module:ArtistView.onSectionNavigationSelected","link":"onSectionNavigationSelected"},{"title":"module:ArtistView.onSectionScrollerChange","link":"onSectionScrollerChange"},{"title":"module:ArtistView.pageContentChanged","link":"pageContentChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:ArtistView.setPosterImage","link":"setPosterImage"},{"title":"module:ArtistView.setScreenTitle","link":"setScreenTitle"},{"title":"module:ArtistView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:ArtistView.setupMainNode","link":"setupMainNode"},{"title":"module:AudioPlayer","link":"AudioPlayer"},{"title":"module:AudioPlayer.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:AudioPlayer.audioStateChanged","link":"audioStateChanged","description":"

State Change Event Handler

"},{"title":"module:AudioPlayer.init","link":"init"},{"title":"module:AudioPlayerView","link":"AudioPlayerView"},{"title":"module:AudioPlayerView.LoadNextSong","link":"LoadNextSong"},{"title":"module:AudioPlayerView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:AudioPlayerView.audioPositionChanged","link":"audioPositionChanged"},{"title":"module:AudioPlayerView.audioStateChanged","link":"audioStateChanged"},{"title":"module:AudioPlayerView.bufferPositionChanged","link":"bufferPositionChanged"},{"title":"module:AudioPlayerView.endScreenSaver","link":"endScreenSaver"},{"title":"module:AudioPlayerView.findCurrentSongIndex","link":"findCurrentSongIndex"},{"title":"module:AudioPlayerView.init","link":"init"},{"title":"module:AudioPlayerView.loadButtons","link":"loadButtons","description":"

If we have more and 1 song to play, fade in the next and previous controls

"},{"title":"module:AudioPlayerView.loopClicked","link":"loopClicked"},{"title":"module:AudioPlayerView.nextClicked","link":"nextClicked"},{"title":"module:AudioPlayerView.onAudioStreamLoaded","link":"onAudioStreamLoaded"},{"title":"module:AudioPlayerView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:AudioPlayerView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:AudioPlayerView.onKeyEvent","link":"onKeyEvent","description":"

Process key press events

"},{"title":"module:AudioPlayerView.onMetaDataLoaded","link":"onMetaDataLoaded"},{"title":"module:AudioPlayerView.onScreensaverTimeoutLoaded","link":"onScreensaverTimeoutLoaded"},{"title":"module:AudioPlayerView.pageContentChanged","link":"pageContentChanged","description":"

Update values on screen when page content changes

"},{"title":"module:AudioPlayerView.playAction","link":"playAction"},{"title":"module:AudioPlayerView.previousClicked","link":"previousClicked"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.screenSaverActive","link":"screenSaverActive"},{"title":"module:AudioPlayerView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:AudioPlayerView.setLoopButtonImage","link":"setLoopButtonImage"},{"title":"module:AudioPlayerView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AudioPlayerView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AudioPlayerView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AudioPlayerView.setShuffleIconState","link":"setShuffleIconState"},{"title":"module:AudioPlayerView.setTrackNumberDisplay","link":"setTrackNumberDisplay"},{"title":"module:AudioPlayerView.setupAnimationTasks","link":"setupAnimationTasks"},{"title":"module:AudioPlayerView.setupAudioNode","link":"setupAudioNode","description":"

Creates audio node used to play song(s)

"},{"title":"module:AudioPlayerView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:AudioPlayerView.setupDataTasks","link":"setupDataTasks","description":"

Creates tasks to gather data needed to render Scene and play song

"},{"title":"module:AudioPlayerView.setupInfoNodes","link":"setupInfoNodes"},{"title":"module:AudioPlayerView.setupScreenSaver","link":"setupScreenSaver"},{"title":"module:AudioPlayerView.shuffleClicked","link":"shuffleClicked"},{"title":"module:AudioPlayerView.startScreenSaver","link":"startScreenSaver"},{"title":"module:AudioPlayerView.toggleShuffleEnabled","link":"toggleShuffleEnabled"},{"title":"module:AudioTrackListItem","link":"AudioTrackListItem"},{"title":"module:AudioTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:AudioTrackListItem.init","link":"init"},{"title":"module:AudioTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ButtonGroupHoriz","link":"ButtonGroupHoriz"},{"title":"module:ButtonGroupHoriz.init","link":"init"},{"title":"module:ButtonGroupHoriz.onKeyEvent","link":"onKeyEvent"},{"title":"module:ButtonGroupVert","link":"ButtonGroupVert"},{"title":"module:ButtonGroupVert.init","link":"init"},{"title":"module:ButtonGroupVert.onFocusButtonChanged","link":"onFocusButtonChanged"},{"title":"module:ButtonGroupVert.onFocusChanged","link":"onFocusChanged"},{"title":"module:ButtonGroupVert.onKeyEvent","link":"onKeyEvent"},{"title":"module:ChannelData","link":"ChannelData"},{"title":"module:ChannelData.setFields","link":"setFields"},{"title":"module:ChannelData.setPoster","link":"setPoster"},{"title":"module:Clock","link":"Clock"},{"title":"module:Clock.init","link":"init"},{"title":"module:Clock.onCurrentTimeTimerFire","link":"onCurrentTimeTimerFire","description":"

onCurrentTimeTimerFire: Code that runs every time the currentTimeTimer fires

"},{"title":"module:CollectionData","link":"CollectionData"},{"title":"module:CollectionData.setFields","link":"setFields"},{"title":"module:CollectionData.setPoster","link":"setPoster"},{"title":"module:ConfigData","link":"ConfigData"},{"title":"module:ConfigData.init","link":"init"},{"title":"module:ConfigItem","link":"ConfigItem"},{"title":"module:ConfigItem.init","link":"init"},{"title":"module:ConfigItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ConfigItem.setColors","link":"setColors"},{"title":"module:ConfigList","link":"ConfigList"},{"title":"module:ConfigList.configListShowDialog","link":"configListShowDialog"},{"title":"module:ConfigList.dismiss_dialog","link":"dismiss_dialog"},{"title":"module:ConfigList.init","link":"init"},{"title":"module:ConfigList.onDialogButton","link":"onDialogButton"},{"title":"module:ConfigList.onItemSelected","link":"onItemSelected"},{"title":"module:ConfigList.setData","link":"setData"},{"title":"module:ExtrasItem","link":"ExtrasItem"},{"title":"module:ExtrasItem.focusChanged","link":"focusChanged"},{"title":"module:ExtrasItem.init","link":"init"},{"title":"module:ExtrasItem.showContent","link":"showContent"},{"title":"module:ExtrasRowList","link":"ExtrasRowList"},{"title":"module:ExtrasRowList.addRowSize","link":"addRowSize"},{"title":"module:ExtrasRowList.buildRow","link":"buildRow"},{"title":"module:ExtrasRowList.init","link":"init"},{"title":"module:ExtrasRowList.loadParts","link":"loadParts"},{"title":"module:ExtrasRowList.loadPersonVideos","link":"loadPersonVideos"},{"title":"module:ExtrasRowList.onAdditionalPartsLoaded","link":"onAdditionalPartsLoaded"},{"title":"module:ExtrasRowList.onLikeThisLoaded","link":"onLikeThisLoaded"},{"title":"module:ExtrasRowList.onMoviesLoaded","link":"onMoviesLoaded"},{"title":"module:ExtrasRowList.onPeopleLoaded","link":"onPeopleLoaded"},{"title":"module:ExtrasRowList.onRowItemFocused","link":"onRowItemFocused"},{"title":"module:ExtrasRowList.onRowItemSelected","link":"onRowItemSelected"},{"title":"module:ExtrasRowList.onSeriesLoaded","link":"onSeriesLoaded"},{"title":"module:ExtrasRowList.onShowsLoaded","link":"onShowsLoaded"},{"title":"module:ExtrasRowList.onSpecialFeaturesLoaded","link":"onSpecialFeaturesLoaded"},{"title":"module:ExtrasRowList.updateSize","link":"updateSize"},{"title":"module:FavoriteItemsTask","link":"FavoriteItemsTask"},{"title":"module:FavoriteItemsTask.init","link":"init"},{"title":"module:FavoriteItemsTask.setFavoriteStatus","link":"setFavoriteStatus"},{"title":"module:FolderData","link":"FolderData"},{"title":"module:FolderData.setFields","link":"setFields"},{"title":"module:FolderData.setPoster","link":"setPoster"},{"title":"module:GetFiltersTask","link":"GetFiltersTask"},{"title":"module:GetFiltersTask.getFiltersTask","link":"getFiltersTask"},{"title":"module:GetFiltersTask.init","link":"init"},{"title":"module:GetNextEpisodeTask","link":"GetNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.getNextEpisodeTask","link":"getNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.init","link":"init"},{"title":"module:GetPlaybackInfoTask","link":"GetPlaybackInfoTask"},{"title":"module:GetPlaybackInfoTask.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:GetPlaybackInfoTask.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:GetPlaybackInfoTask.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:GetPlaybackInfoTask.getPlaybackInfoTask","link":"getPlaybackInfoTask","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:GetPlaybackInfoTask.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:GetPlaybackInfoTask.init","link":"init"},{"title":"module:GetShuffleEpisodesTask","link":"GetShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.getShuffleEpisodesTask","link":"getShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.init","link":"init"},{"title":"module:GridItem","link":"GridItem"},{"title":"module:GridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:GridItem.focusChanging","link":"focusChanging","description":"

Use FocusPercent to animate scaling of Poser Image

"},{"title":"module:GridItem.init","link":"init"},{"title":"module:GridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:GridItemSmall","link":"GridItemSmall"},{"title":"module:GridItemSmall.focusChanged","link":"focusChanged"},{"title":"module:GridItemSmall.init","link":"init"},{"title":"module:GridItemSmall.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItemSmall.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:Home","link":"Home"},{"title":"module:Home.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook that gets ran as needed.\nUsed to update the focus, the state of the data, and tells the server about the device profile

"},{"title":"module:Home.init","link":"init"},{"title":"module:Home.loadLibraries","link":"loadLibraries"},{"title":"module:Home.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:Home.refresh","link":"refresh"},{"title":"module:HomeData","link":"HomeData"},{"title":"module:HomeData.setData","link":"setData"},{"title":"module:HomeItem","link":"HomeItem"},{"title":"module:HomeItem.drawProgressBar","link":"drawProgressBar","description":"

Draws and animates item progress bar

"},{"title":"module:HomeItem.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:HomeItem.init","link":"init"},{"title":"module:HomeItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:HomeItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and icon when poster loaded

"},{"title":"module:HomeRows","link":"HomeRows"},{"title":"module:HomeRows.addHomeSection","link":"addHomeSection","description":"

Adds a new home section to the home rows.\nReturns a boolean indicating whether the section was handled.

"},{"title":"module:HomeRows.createContinueWatchingRow","link":"createContinueWatchingRow","description":"

Create a row displaying items the user can continue watching

"},{"title":"module:HomeRows.createFavoritesRow","link":"createFavoritesRow","description":"

Create a row displaying items from the user's favorites list

"},{"title":"module:HomeRows.createLatestInRows","link":"createLatestInRows","description":"

Create a row displaying latest items in each of the user's libraries

"},{"title":"module:HomeRows.createLibraryRow","link":"createLibraryRow","description":"

Create a row displaying the user's libraries

"},{"title":"module:HomeRows.createLiveTVRow","link":"createLiveTVRow","description":"

Create a row displaying the live tv now on section

"},{"title":"module:HomeRows.createNextUpRow","link":"createNextUpRow","description":"

Create a row displaying next episodes up to watch

"},{"title":"module:HomeRows.filterNodeArray","link":"filterNodeArray"},{"title":"module:HomeRows.init","link":"init"},{"title":"module:HomeRows.itemSelected","link":"itemSelected"},{"title":"module:HomeRows.loadLibraries","link":"loadLibraries"},{"title":"module:HomeRows.onKeyEvent","link":"onKeyEvent"},{"title":"module:HomeRows.onLibrariesLoaded","link":"onLibrariesLoaded"},{"title":"module:HomeRows.removeHomeSection","link":"removeHomeSection","description":"

Removes a home section from the home rows

"},{"title":"module:HomeRows.updateContinueWatchingItems","link":"updateContinueWatchingItems"},{"title":"module:HomeRows.updateFavoritesItems","link":"updateFavoritesItems"},{"title":"module:HomeRows.updateHomeRows","link":"updateHomeRows","description":"

Update home row data

"},{"title":"module:HomeRows.updateLatestInRows","link":"updateLatestInRows","description":"

Iterate over user's libraries and update data for each Latest In section

"},{"title":"module:HomeRows.updateLatestItems","link":"updateLatestItems"},{"title":"module:HomeRows.updateNextUpItems","link":"updateNextUpItems"},{"title":"module:HomeRows.updateOnNowItems","link":"updateOnNowItems"},{"title":"module:HomeRows.updateSize","link":"updateSize"},{"title":"module:HomeRows.updateSizeArray","link":"updateSizeArray"},{"title":"module:IconButton","link":"IconButton"},{"title":"module:IconButton.init","link":"init"},{"title":"module:IconButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:IconButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:IconButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:IconButton.onIconChanged","link":"onIconChanged"},{"title":"module:IconButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:IconButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:IconButton.onTextChanged","link":"onTextChanged"},{"title":"module:IconButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:IconButton.setIconSize","link":"setIconSize"},{"title":"module:Image","link":"Image"},{"title":"module:Image.ImageURL","link":"ImageURL"},{"title":"module:Image.ItemImages","link":"ItemImages"},{"title":"module:Image.PosterImage","link":"PosterImage"},{"title":"module:Image.UserImageURL","link":"UserImageURL"},{"title":"module:ImageData","link":"ImageData"},{"title":"module:ImageData.setFields","link":"setFields"},{"title":"module:IntegerKeyboard","link":"IntegerKeyboard"},{"title":"module:IntegerKeyboard.init","link":"init"},{"title":"module:IntegerKeyboard.keySelected","link":"keySelected"},{"title":"module:IntegerKeyboard.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid","link":"ItemGrid"},{"title":"module:ItemGrid.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:ItemGrid.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:ItemGrid.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:ItemGrid.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:ItemGrid.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:ItemGrid.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:ItemGrid.init","link":"init"},{"title":"module:ItemGrid.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:ItemGrid.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:ItemGrid.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:ItemGrid.onChannelFocused","link":"onChannelFocused"},{"title":"module:ItemGrid.onChannelSelected","link":"onChannelSelected"},{"title":"module:ItemGrid.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:ItemGrid.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:ItemGrid.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:ItemGrid.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:ItemGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:ItemGrid.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:ItemGrid.setBoxsetsOptions","link":"setBoxsetsOptions","description":"

Set Boxset view, sort, and filter options

"},{"title":"module:ItemGrid.setDefaultOptions","link":"setDefaultOptions","description":"

Set Default view, sort, and filter options

"},{"title":"module:ItemGrid.setLiveTvOptions","link":"setLiveTvOptions","description":"

Set Live TV view, sort, and filter options

"},{"title":"module:ItemGrid.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:ItemGrid.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:ItemGrid.setPhotoAlbumOptions","link":"setPhotoAlbumOptions","description":"

Set Photo Album view, sort, and filter options

"},{"title":"module:ItemGrid.setTvShowsOptions","link":"setTvShowsOptions","description":"

Set TV Show view, sort, and filter options

"},{"title":"module:ItemGrid.showTVGuide","link":"showTVGuide"},{"title":"module:ItemGrid.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:ItemGrid.updateTitle","link":"updateTitle"},{"title":"module:ItemGridOptions","link":"ItemGridOptions"},{"title":"module:ItemGridOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:ItemGridOptions.hideChecklist","link":"hideChecklist"},{"title":"module:ItemGridOptions.init","link":"init"},{"title":"module:ItemGridOptions.isFilterMenuDataValid","link":"isFilterMenuDataValid","description":"

Check if data for Filter Menu is valid

"},{"title":"module:ItemGridOptions.onFilterFocusChange","link":"onFilterFocusChange"},{"title":"module:ItemGridOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGridOptions.optionsSet","link":"optionsSet"},{"title":"module:ItemGridOptions.saveFavoriteItemSelected","link":"saveFavoriteItemSelected"},{"title":"module:ItemGridOptions.setHeartColor","link":"setHeartColor"},{"title":"module:ItemGridOptions.showChecklist","link":"showChecklist"},{"title":"module:ItemGridOptions.toggleFavorite","link":"toggleFavorite"},{"title":"module:Items","link":"Items"},{"title":"module:Items.AppearsOnList","link":"AppearsOnList","description":"

Get list of albums an artist appears on

"},{"title":"module:Items.ArtistOverview","link":"ArtistOverview","description":"

Music Artist Data

"},{"title":"module:Items.AudioItem","link":"AudioItem","description":"

Get Songs that are on an Album

"},{"title":"module:Items.AudioStream","link":"AudioStream"},{"title":"module:Items.BackdropImage","link":"BackdropImage"},{"title":"module:Items.CreateArtistMix","link":"CreateArtistMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.CreateInstantMix","link":"CreateInstantMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.GetIntroVideos","link":"GetIntroVideos","description":"

Get Intro Videos for an item

"},{"title":"module:Items.GetSongsByArtist","link":"GetSongsByArtist","description":"

Get list of songs belonging to an artist

"},{"title":"module:Items.ItemGetPlaybackInfo","link":"ItemGetPlaybackInfo"},{"title":"module:Items.ItemMetaData","link":"ItemMetaData","description":"

MetaData about an item

"},{"title":"module:Items.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:Items.MusicAlbumList","link":"MusicAlbumList","description":"

Get list of albums belonging to an artist

"},{"title":"module:Items.MusicSongList","link":"MusicSongList","description":"

Get Songs that are on an Album

"},{"title":"module:Items.PlaylistItemList","link":"PlaylistItemList","description":"

Get Items that are under the provided item

"},{"title":"module:Items.TVEpisodeShuffleList","link":"TVEpisodeShuffleList"},{"title":"module:Items.TVEpisodes","link":"TVEpisodes","description":"

Returns a list of TV Shows for a given TV Show and season\nAccepts strings for the TV Show Id and the season Id

"},{"title":"module:Items.TVSeasonExtras","link":"TVSeasonExtras","description":"

Returns a list of extra features for a TV Show season\nAccepts a string that is a TV Show season id

"},{"title":"module:Items.TVSeasons","link":"TVSeasons","description":"

Seasons for a TV Show

"},{"title":"module:Items.searchMedia","link":"searchMedia","description":"

Search across all libraries

"},{"title":"module:Items.useTranscodeAudioStream","link":"useTranscodeAudioStream"},{"title":"module:JFButton","link":"JFButton"},{"title":"module:JFButton.init","link":"init"},{"title":"module:JFButton.onTextChanged","link":"onTextChanged","description":"

Whenever the text changes, pad both sides with whitespace so we can center the button text

"},{"title":"module:JFButtons","link":"JFButtons"},{"title":"module:JFButtons.focusChanged","link":"focusChanged","description":"

Change opacity of the highlighted menu item based on focus

"},{"title":"module:JFButtons.highlightSelected","link":"highlightSelected","description":"

Highlight selected menu option

"},{"title":"module:JFButtons.init","link":"init"},{"title":"module:JFButtons.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFButtons.renderChanged","link":"renderChanged","description":"

When options are fully displayed, set focus and selected option

"},{"title":"module:JFButtons.selectedIndexChanged","link":"selectedIndexChanged","description":"

When Selected Index set, ensure it is the one Focused

"},{"title":"module:JFButtons.showButtons","link":"showButtons"},{"title":"module:JFButtons.updateButtons","link":"updateButtons"},{"title":"module:JFGroup","link":"JFGroup"},{"title":"module:JFGroup.init","link":"init"},{"title":"module:JFGroup.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog","link":"JFMessageDialog"},{"title":"module:JFMessageDialog.init","link":"init"},{"title":"module:JFMessageDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog.redraw","link":"redraw"},{"title":"module:JFMessageDialog.updateMessage","link":"updateMessage"},{"title":"module:JFMessageDialog.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang","link":"JFOverhang"},{"title":"module:JFOverhang.init","link":"init"},{"title":"module:JFOverhang.onVisibleChange","link":"onVisibleChange"},{"title":"module:JFOverhang.resetTime","link":"resetTime"},{"title":"module:JFOverhang.setClockVisibility","link":"setClockVisibility"},{"title":"module:JFOverhang.setRightSeperatorVisibility","link":"setRightSeperatorVisibility"},{"title":"module:JFOverhang.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang.updateTime","link":"updateTime"},{"title":"module:JFOverhang.updateTimeDisplay","link":"updateTimeDisplay"},{"title":"module:JFOverhang.updateTitle","link":"updateTitle"},{"title":"module:JFOverhang.updateUser","link":"updateUser"},{"title":"module:JFScene","link":"JFScene"},{"title":"module:JFScene.disableRemoteChanged","link":"disableRemoteChanged","description":"

Triggered when the disableRemote boolean component field is changed

"},{"title":"module:JFScene.init","link":"init"},{"title":"module:JFScene.isLoadingChanged","link":"isLoadingChanged","description":"

Triggered when the isLoading boolean component field is changed

"},{"title":"module:JFScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFScreen","link":"JFScreen"},{"title":"module:JFScreen.OnScreenHidden","link":"OnScreenHidden","description":"

Function called when the screen is hidden by the screen manager\nIt is expected that screens override this function if required,\nto handle focus any actions required on the screen being hidden

"},{"title":"module:JFScreen.OnScreenShown","link":"OnScreenShown","description":"

Function called when the screen is displayed by the screen manager\nIt is expected that screens override this function to handle focus\nmanagmenet and any other actions required on screen shown

"},{"title":"module:JFScreen.init","link":"init"},{"title":"module:JFServer","link":"JFServer"},{"title":"module:JFServer.init","link":"init"},{"title":"module:JFServer.itemContentChanged","link":"itemContentChanged"},{"title":"module:JFServer.onFocusPercentChange","link":"onFocusPercentChange"},{"title":"module:JFServer.setTextColor","link":"setTextColor"},{"title":"module:JFVideo","link":"JFVideo"},{"title":"module:JFVideo.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:JFVideo.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:JFVideo.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:JFVideo.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:JFVideo.init","link":"init"},{"title":"module:JFVideo.loadCaption","link":"loadCaption"},{"title":"module:JFVideo.onAllowCaptionsChange","link":"onAllowCaptionsChange"},{"title":"module:JFVideo.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:JFVideo.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFVideo.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:JFVideo.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:JFVideo.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:JFVideo.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:JFVideo.toggleCaption","link":"toggleCaption"},{"title":"module:JFVideo.updateCaption","link":"updateCaption"},{"title":"module:JFVideo.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:ListPoster","link":"ListPoster"},{"title":"module:ListPoster.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:ListPoster.init","link":"init"},{"title":"module:ListPoster.itemContentChanged","link":"itemContentChanged"},{"title":"module:ListPoster.updateSize","link":"updateSize"},{"title":"module:LoadChannelsTask","link":"LoadChannelsTask"},{"title":"module:LoadChannelsTask.init","link":"init"},{"title":"module:LoadChannelsTask.loadChannels","link":"loadChannels"},{"title":"module:LoadItemsTask","link":"LoadItemsTask"},{"title":"module:LoadItemsTask.getPersonVideos","link":"getPersonVideos"},{"title":"module:LoadItemsTask.init","link":"init"},{"title":"module:LoadItemsTask.loadItems","link":"loadItems"},{"title":"module:LoadItemsTask2","link":"LoadItemsTask2"},{"title":"module:LoadItemsTask2.init","link":"init"},{"title":"module:LoadItemsTask2.loadItems","link":"loadItems"},{"title":"module:LoadPhotoTask","link":"LoadPhotoTask"},{"title":"module:LoadPhotoTask.init","link":"init"},{"title":"module:LoadPhotoTask.loadItems","link":"loadItems"},{"title":"module:LoadProgramDetailsTask","link":"LoadProgramDetailsTask"},{"title":"module:LoadProgramDetailsTask.init","link":"init"},{"title":"module:LoadProgramDetailsTask.loadProgramDetails","link":"loadProgramDetails"},{"title":"module:LoadScreenSaverTimeoutTask","link":"LoadScreenSaverTimeoutTask"},{"title":"module:LoadScreenSaverTimeoutTask.getScreensaverTimeout","link":"getScreensaverTimeout"},{"title":"module:LoadScreenSaverTimeoutTask.init","link":"init"},{"title":"module:LoadSheduleTask","link":"LoadSheduleTask"},{"title":"module:LoadSheduleTask.init","link":"init"},{"title":"module:LoadSheduleTask.loadSchedule","link":"loadSchedule"},{"title":"module:LoadVideoContentTask","link":"LoadVideoContentTask"},{"title":"module:LoadVideoContentTask.FindPreferredAudioStream","link":"FindPreferredAudioStream"},{"title":"module:LoadVideoContentTask.LoadItems_AddVideoContent","link":"LoadItems_AddVideoContent"},{"title":"module:LoadVideoContentTask.LoadItems_VideoPlayer","link":"LoadItems_VideoPlayer"},{"title":"module:LoadVideoContentTask.addNextEpisodesToQueue","link":"addNextEpisodesToQueue","description":"

Add next episodes to the playback queue

"},{"title":"module:LoadVideoContentTask.addSubtitlesToVideo","link":"addSubtitlesToVideo"},{"title":"module:LoadVideoContentTask.addVideoContentURL","link":"addVideoContentURL"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"title":"module:LoadVideoContentTask.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:LoadVideoContentTask.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:LoadVideoContentTask.init","link":"init"},{"title":"module:LoadVideoContentTask.loadItems","link":"loadItems"},{"title":"module:LoadVideoContentTask.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:LoginScene","link":"LoginScene"},{"title":"module:LoginScene.init","link":"init"},{"title":"module:LoginScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:Main","link":"Main"},{"title":"module:Main.Main","link":"Main"},{"title":"module:MovieData","link":"MovieData"},{"title":"module:MovieData.setContainer","link":"setContainer"},{"title":"module:MovieData.setFields","link":"setFields"},{"title":"module:MovieData.setPoster","link":"setPoster"},{"title":"module:MovieDetails","link":"MovieDetails"},{"title":"module:MovieDetails.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieDetails.SetDefaultAudioTrack","link":"SetDefaultAudioTrack"},{"title":"module:MovieDetails.SetUpAudioOptions","link":"SetUpAudioOptions"},{"title":"module:MovieDetails.SetUpVideoOptions","link":"SetUpVideoOptions"},{"title":"module:MovieDetails.audioOptionsClosed","link":"audioOptionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieDetails.getEndTime","link":"getEndTime"},{"title":"module:MovieDetails.getRuntime","link":"getRuntime"},{"title":"module:MovieDetails.init","link":"init"},{"title":"module:MovieDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:MovieDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieDetails.round","link":"round"},{"title":"module:MovieDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:MovieDetails.setFieldText","link":"setFieldText"},{"title":"module:MovieDetails.setWatchedColor","link":"setWatchedColor"},{"title":"module:MovieDetails.trailerAvailableChanged","link":"trailerAvailableChanged"},{"title":"module:MovieDetails.videoOptionsClosed","link":"videoOptionsClosed","description":"

Check if options were updated and if any reloding is needed...

"},{"title":"module:MovieLibraryView","link":"MovieLibraryView"},{"title":"module:MovieLibraryView.FilterDataLoaded","link":"FilterDataLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MovieLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MovieLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MovieLibraryView.SetName","link":"SetName","description":"

Set Selected Movie Name

"},{"title":"module:MovieLibraryView.SetOfficialRating","link":"SetOfficialRating","description":"

Set Selected Movie OfficialRating

"},{"title":"module:MovieLibraryView.SetOverview","link":"SetOverview","description":"

Set Selected Movie Overview

"},{"title":"module:MovieLibraryView.SetProductionYear","link":"SetProductionYear","description":"

Set Selected Movie ProductionYear

"},{"title":"module:MovieLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MovieLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MovieLibraryView.getRuntime","link":"getRuntime"},{"title":"module:MovieLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MovieLibraryView.init","link":"init"},{"title":"module:MovieLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MovieLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MovieLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MovieLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MovieLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MovieLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MovieLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MovieLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MovieLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MovieLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieLibraryView.round","link":"round"},{"title":"module:MovieLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MovieLibraryView.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:MovieLibraryView.setSelectedOptions","link":"setSelectedOptions","description":"

Data to display when options button selected

"},{"title":"module:MovieLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MovieLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MovieOptions","link":"MovieOptions"},{"title":"module:MovieOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:MovieOptions.init","link":"init"},{"title":"module:MovieOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieOptions.optionsSet","link":"optionsSet"},{"title":"module:MusicAlbumData","link":"MusicAlbumData"},{"title":"module:MusicAlbumData.setFields","link":"setFields"},{"title":"module:MusicAlbumData.setPoster","link":"setPoster"},{"title":"module:MusicAlbumSongListData","link":"MusicAlbumSongListData"},{"title":"module:MusicAlbumSongListData.setFields","link":"setFields"},{"title":"module:MusicAlbumSongListData.setPoster","link":"setPoster"},{"title":"module:MusicArtistData","link":"MusicArtistData"},{"title":"module:MusicArtistData.setFields","link":"setFields"},{"title":"module:MusicArtistData.setPoster","link":"setPoster"},{"title":"module:MusicArtistGridItem","link":"MusicArtistGridItem"},{"title":"module:MusicArtistGridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:MusicArtistGridItem.init","link":"init"},{"title":"module:MusicArtistGridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:MusicArtistGridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:MusicLibraryView","link":"MusicLibraryView"},{"title":"module:MusicLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MusicLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MusicLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MusicLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MusicLibraryView.SetAlbumCount","link":"SetAlbumCount","description":"

Set Selected Artist Album Count

"},{"title":"module:MusicLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MusicLibraryView.SetGenres","link":"SetGenres","description":"

Set Selected Artist Genres

"},{"title":"module:MusicLibraryView.SetName","link":"SetName","description":"

Set Selected Artist Name

"},{"title":"module:MusicLibraryView.SetSongCount","link":"SetSongCount","description":"

Set Selected Artist Song Count

"},{"title":"module:MusicLibraryView.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:MusicLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MusicLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MusicLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MusicLibraryView.init","link":"init"},{"title":"module:MusicLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MusicLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MusicLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MusicLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MusicLibraryView.onGenreItemFocused","link":"onGenreItemFocused","description":"

Genre Item Focused

"},{"title":"module:MusicLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MusicLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MusicLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MusicLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MusicLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MusicLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MusicLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MusicLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MusicLibraryView.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:MusicLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MusicLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MusicSongData","link":"MusicSongData"},{"title":"module:MusicSongData.setFields","link":"setFields"},{"title":"module:MusicSongData.setPoster","link":"setPoster"},{"title":"module:OSD","link":"OSD"},{"title":"module:OSD.inactiveCheck","link":"inactiveCheck","description":"

inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.

"},{"title":"module:OSD.init","link":"init"},{"title":"module:OSD.onButtonSelected","link":"onButtonSelected","description":"

onButtonSelected: Handler for selection of buttons from the menu.

"},{"title":"module:OSD.onFocusChanged","link":"onFocusChanged","description":"

onFocusChanged: Handler for changes to the focus of this menu.

"},{"title":"module:OSD.onItemTitleTextChanged","link":"onItemTitleTextChanged","description":"

onItemTitleTextChanged: Handler for changes to m.top.itemTitleText param.

"},{"title":"module:OSD.onKeyEvent","link":"onKeyEvent"},{"title":"module:OSD.onPlaybackStateChanged","link":"onPlaybackStateChanged","description":"

onPlaybackStateChanged: Handler for changes to m.top.playbackState param

"},{"title":"module:OSD.onProgressPercentageChanged","link":"onProgressPercentageChanged","description":"

onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param

"},{"title":"module:OSD.onVisibleChanged","link":"onVisibleChanged","description":"

onVisibleChanged: Handler for changes to the visibility of this menu.

"},{"title":"module:OSD.resetFocusToDefaultButton","link":"resetFocusToDefaultButton","description":"

resetFocusToDefaultButton: Reset focus back to the default button

"},{"title":"module:OptionNode","link":"OptionNode"},{"title":"module:OptionNode.init","link":"init"},{"title":"module:OptionsButton","link":"OptionsButton"},{"title":"module:OptionsButton.init","link":"init"},{"title":"module:OptionsButton.press","link":"press"},{"title":"module:OptionsData","link":"OptionsData"},{"title":"module:OptionsData.init","link":"init"},{"title":"module:OptionsData.press","link":"press"},{"title":"module:OptionsData.update_title","link":"update_title"},{"title":"module:OptionsSlider","link":"OptionsSlider"},{"title":"module:OptionsSlider.init","link":"init"},{"title":"module:OptionsSlider.onKeyEvent","link":"onKeyEvent"},{"title":"module:OptionsSlider.setFields","link":"setFields"},{"title":"module:OverviewDialog","link":"OverviewDialog"},{"title":"module:OverviewDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:OverviewDialog.setOverview","link":"setOverview"},{"title":"module:OverviewDialog.setTitle","link":"setTitle"},{"title":"module:PersonData","link":"PersonData"},{"title":"module:PersonData.setFields","link":"setFields"},{"title":"module:PersonData.setPoster","link":"setPoster"},{"title":"module:PersonDetails","link":"PersonDetails"},{"title":"module:PersonDetails.createDialogPallete","link":"createDialogPallete"},{"title":"module:PersonDetails.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PersonDetails.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:PersonDetails.init","link":"init"},{"title":"module:PersonDetails.loadPerson","link":"loadPerson"},{"title":"module:PersonDetails.onButtonGroupEscaped","link":"onButtonGroupEscaped"},{"title":"module:PersonDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PersonDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:PersonDetails.shortDate","link":"shortDate"},{"title":"module:PhotoData","link":"PhotoData"},{"title":"module:PhotoData.setFields","link":"setFields"},{"title":"module:PhotoData.setPoster","link":"setPoster"},{"title":"module:PhotoDetails","link":"PhotoDetails"},{"title":"module:PhotoDetails.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook.\nUsed to ensure tasks are stopped

"},{"title":"module:PhotoDetails.init","link":"init"},{"title":"module:PhotoDetails.isRandomChanged","link":"isRandomChanged","description":"

isRandom component field has changed

"},{"title":"module:PhotoDetails.isSlideshowChanged","link":"isSlideshowChanged","description":"

isSlideshow component field has changed

"},{"title":"module:PhotoDetails.isValidToContinue","link":"isValidToContinue"},{"title":"module:PhotoDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:PhotoDetails.nextSlide","link":"nextSlide"},{"title":"module:PhotoDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PhotoDetails.onPhotoLoaded","link":"onPhotoLoaded"},{"title":"module:PhotoDetails.statusUpdate","link":"statusUpdate"},{"title":"module:PlaybackDialog","link":"PlaybackDialog"},{"title":"module:PlaybackDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlayedCheckmark","link":"PlayedCheckmark"},{"title":"module:PlayedCheckmark.init","link":"init"},{"title":"module:PlaylistData","link":"PlaylistData"},{"title":"module:PlaylistData.setFields","link":"setFields"},{"title":"module:PlaylistData.setPoster","link":"setPoster"},{"title":"module:PlaylistView","link":"PlaylistView"},{"title":"module:PlaylistView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:PlaylistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:PlaylistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PlaylistView.init","link":"init"},{"title":"module:PlaylistView.onDoneLoading","link":"onDoneLoading"},{"title":"module:PlaylistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlaylistView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:PlaylistView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:PlaylistView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:PlaylistView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:PlaylistView.setupMainNode","link":"setupMainNode"},{"title":"module:PlaystateTask","link":"PlaystateTask"},{"title":"module:PlaystateTask.PlaystateDefaults","link":"PlaystateDefaults"},{"title":"module:PlaystateTask.PlaystateUpdate","link":"PlaystateUpdate"},{"title":"module:PlaystateTask.init","link":"init"},{"title":"module:PostTask","link":"PostTask"},{"title":"module:PostTask.asyncPost","link":"asyncPost","description":"

Post data and wait for response code

"},{"title":"module:PostTask.empty","link":"empty","description":"

Revert PostTask to default state

"},{"title":"module:PostTask.init","link":"init"},{"title":"module:PostTask.postItems","link":"postItems","description":"

Main function for PostTask.\nPosts either an array of data\nor a string of data to an API endpoint.\nSaves the response information

"},{"title":"module:ProgramDetails","link":"ProgramDetails"},{"title":"module:ProgramDetails.channelUpdated","link":"channelUpdated"},{"title":"module:ProgramDetails.focusChanged","link":"focusChanged","description":"

Show view channel button when item has Focus

"},{"title":"module:ProgramDetails.getDurationStringFromSeconds","link":"getDurationStringFromSeconds","description":"

Get program duration string (e.g. 1h 20m)

"},{"title":"module:ProgramDetails.getRelativeDayName","link":"getRelativeDayName","description":"

Get relative date name for a date (yesterday, today, tomorrow, or otherwise weekday name )

"},{"title":"module:ProgramDetails.init","link":"init"},{"title":"module:ProgramDetails.onAnimationComplete","link":"onAnimationComplete"},{"title":"module:ProgramDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:ProgramDetails.programUpdated","link":"programUpdated"},{"title":"module:ProgramDetails.setupLabels","link":"setupLabels","description":"

Set up Live and Repeat label sizes

"},{"title":"module:ProgramDetails.updateLabels","link":"updateLabels"},{"title":"module:PublicUserData","link":"PublicUserData"},{"title":"module:PublicUserData.init","link":"init"},{"title":"module:QueueManager","link":"QueueManager"},{"title":"module:QueueManager.clear","link":"clear","description":"

Clear all content from play queue

"},{"title":"module:QueueManager.clearHold","link":"clearHold","description":"

Clear all hold content

"},{"title":"module:QueueManager.deleteAtIndex","link":"deleteAtIndex","description":"

Delete item from play queue at passed index

"},{"title":"module:QueueManager.getCount","link":"getCount","description":"

Return the number of items in the play queue

"},{"title":"module:QueueManager.getCurrentItem","link":"getCurrentItem","description":"

Return the item currently in focus from the play queue

"},{"title":"module:QueueManager.getHold","link":"getHold","description":"

Return the items in the hold

"},{"title":"module:QueueManager.getIsShuffled","link":"getIsShuffled","description":"

Return whether or not shuffle is enabled

"},{"title":"module:QueueManager.getItemByIndex","link":"getItemByIndex","description":"

Return the item in the passed index from the play queue

"},{"title":"module:QueueManager.getItemType","link":"getItemType"},{"title":"module:QueueManager.getPosition","link":"getPosition","description":"

Returns current playback position within the queue

"},{"title":"module:QueueManager.getQueue","link":"getQueue","description":"

Return the current play queue

"},{"title":"module:QueueManager.getQueueTypes","link":"getQueueTypes","description":"

Return the types of items in current play queue

"},{"title":"module:QueueManager.getQueueUniqueTypes","link":"getQueueUniqueTypes","description":"

Return the unique types of items in current play queue

"},{"title":"module:QueueManager.getUnshuffledQueue","link":"getUnshuffledQueue","description":"

Return original, unshuffled queue

"},{"title":"module:QueueManager.hold","link":"hold","description":"

Hold an item

"},{"title":"module:QueueManager.init","link":"init"},{"title":"module:QueueManager.isPrerollActive","link":"isPrerollActive","description":"

Return isPrerollActive status

"},{"title":"module:QueueManager.moveBack","link":"moveBack","description":"

Move queue position back one

"},{"title":"module:QueueManager.moveForward","link":"moveForward","description":"

Move queue position ahead one

"},{"title":"module:QueueManager.peek","link":"peek","description":"

Return item at end of play queue without removing

"},{"title":"module:QueueManager.playQueue","link":"playQueue","description":"

Play items in queue

"},{"title":"module:QueueManager.pop","link":"pop","description":"

Remove item at end of play queue

"},{"title":"module:QueueManager.push","link":"push","description":"

Push new items to the play queue

"},{"title":"module:QueueManager.resetQueueItemOrder","link":"resetQueueItemOrder","description":"

Reset queue items back to original, unshuffled order

"},{"title":"module:QueueManager.resetShuffle","link":"resetShuffle","description":"

Reset shuffle to off state

"},{"title":"module:QueueManager.set","link":"set","description":"

Replace play queue with passed array

"},{"title":"module:QueueManager.setPosition","link":"setPosition","description":"

Set the queue position

"},{"title":"module:QueueManager.setPrerollStatus","link":"setPrerollStatus","description":"

Set prerollActive status

"},{"title":"module:QueueManager.setTopStartingPoint","link":"setTopStartingPoint","description":"

Set starting point for top item in the queue

"},{"title":"module:QueueManager.shuffleQueueItems","link":"shuffleQueueItems","description":"

Save a copy of the original queue and randomize order of queue items

"},{"title":"module:QueueManager.toggleShuffle","link":"toggleShuffle","description":"

Toggle shuffleEnabled state

"},{"title":"module:QueueManager.top","link":"top","description":"

Return the fitst item in the play queue

"},{"title":"module:QuickConnect","link":"QuickConnect"},{"title":"module:QuickConnect.init","link":"init"},{"title":"module:QuickConnect.monitorQuickConnect","link":"monitorQuickConnect"},{"title":"module:QuickConnectDialog","link":"QuickConnectDialog"},{"title":"module:QuickConnectDialog.OnAuthenticated","link":"OnAuthenticated"},{"title":"module:QuickConnectDialog.init","link":"init"},{"title":"module:QuickConnectDialog.onButtonSelected","link":"onButtonSelected"},{"title":"module:QuickConnectDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:QuickConnectDialog.quickConnectClosed","link":"quickConnectClosed"},{"title":"module:QuickConnectDialog.quickConnectStatus","link":"quickConnectStatus"},{"title":"module:RadioDialog","link":"RadioDialog"},{"title":"module:RadioDialog.init","link":"init"},{"title":"module:RadioDialog.moveScrollBar","link":"moveScrollBar","description":"

Move the popup's scroll bar

"},{"title":"module:RadioDialog.onButtonSelected","link":"onButtonSelected","description":"

Event handler for when user selected a button

"},{"title":"module:RadioDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:RadioDialog.onItemFocused","link":"onItemFocused","description":"

Event handler for when user's cursor highlights an option in the option list

"},{"title":"module:RadioDialog.onItemSelected","link":"onItemSelected","description":"

Once user selected an item, move cursor down to OK button

"},{"title":"module:RadioDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:RadioDialog.onScrollBarFocus","link":"onScrollBarFocus","description":"

If somehow the scrollbar gains focus, set focus back to the option list

"},{"title":"module:RecordProgramTask","link":"RecordProgramTask"},{"title":"module:RecordProgramTask.RecordOrCancelProgram","link":"RecordOrCancelProgram"},{"title":"module:RecordProgramTask.init","link":"init"},{"title":"module:SceneManager","link":"SceneManager"},{"title":"module:SceneManager.clearPreviousScene","link":"clearPreviousScene","description":"

Clear previous scene from group stack

"},{"title":"module:SceneManager.clearScenes","link":"clearScenes","description":"

Clear all content from group stack

"},{"title":"module:SceneManager.deleteSceneAtIndex","link":"deleteSceneAtIndex","description":"

Delete scene from group stack at passed index

"},{"title":"module:SceneManager.dismissDialog","link":"dismissDialog","description":"

Close currently displayed dialog

"},{"title":"module:SceneManager.getActiveScene","link":"getActiveScene","description":"

Return group at top of stack without removing

"},{"title":"module:SceneManager.init","link":"init"},{"title":"module:SceneManager.isDialogOpen","link":"isDialogOpen","description":"

Returns bool indicating if dialog is currently displayed

"},{"title":"module:SceneManager.optionClosed","link":"optionClosed","description":"

Return button the user selected

"},{"title":"module:SceneManager.optionDialog","link":"optionDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.optionSelected","link":"optionSelected","description":"

Return button the user selected

"},{"title":"module:SceneManager.popScene","link":"popScene","description":"

Remove the current group and load the last group from the stack

"},{"title":"module:SceneManager.pushScene","link":"pushScene","description":"

Push a new group onto the stack, replacing the existing group on the screen

"},{"title":"module:SceneManager.radioDialog","link":"radioDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.registerOverhangData","link":"registerOverhangData","description":"

Register observers for overhang data

"},{"title":"module:SceneManager.resetTime","link":"resetTime","description":"

Reset time

"},{"title":"module:SceneManager.settings","link":"settings","description":"

Display user/device settings screen

"},{"title":"module:SceneManager.standardDialog","link":"standardDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.unregisterOverhangData","link":"unregisterOverhangData","description":"

Remove observers for overhang data

"},{"title":"module:SceneManager.updateOptions","link":"updateOptions","description":"

Update options availability

"},{"title":"module:SceneManager.updateOverhangTitle","link":"updateOverhangTitle","description":"

Update overhang title

"},{"title":"module:SceneManager.updateOverhangVisible","link":"updateOverhangVisible","description":"

Update whether the overhang is visible or not

"},{"title":"module:SceneManager.updateUser","link":"updateUser","description":"

Update username in overhang

"},{"title":"module:SceneManager.userMessage","link":"userMessage","description":"

Display dialog to user with an OK button

"},{"title":"module:ScheduleProgramData","link":"ScheduleProgramData"},{"title":"module:ScheduleProgramData.setFields","link":"setFields"},{"title":"module:ScheduleProgramData.setPoster","link":"setPoster"},{"title":"module:SearchBox","link":"SearchBox"},{"title":"module:SearchBox.init","link":"init"},{"title":"module:SearchBox.searchMedias","link":"searchMedias"},{"title":"module:SearchData","link":"SearchData"},{"title":"module:SearchData.setFields","link":"setFields"},{"title":"module:SearchData.setPoster","link":"setPoster"},{"title":"module:SearchResults","link":"SearchResults"},{"title":"module:SearchResults.init","link":"init"},{"title":"module:SearchResults.loadResults","link":"loadResults"},{"title":"module:SearchResults.onKeyEvent","link":"onKeyEvent"},{"title":"module:SearchResults.searchMedias","link":"searchMedias"},{"title":"module:SearchRow","link":"SearchRow"},{"title":"module:SearchRow.addRow","link":"addRow"},{"title":"module:SearchRow.getData","link":"getData"},{"title":"module:SearchRow.init","link":"init"},{"title":"module:SearchRow.updateSize","link":"updateSize"},{"title":"module:SearchTask","link":"SearchTask"},{"title":"module:SearchTask.init","link":"init"},{"title":"module:SearchTask.search","link":"search"},{"title":"module:SeriesData","link":"SeriesData"},{"title":"module:SeriesData.setFields","link":"setFields"},{"title":"module:SeriesData.setPoster","link":"setPoster"},{"title":"module:ServerDiscoveryTask","link":"ServerDiscoveryTask"},{"title":"module:ServerDiscoveryTask.AddServer","link":"AddServer"},{"title":"module:ServerDiscoveryTask.ProcessClientDiscoveryResponse","link":"ProcessClientDiscoveryResponse"},{"title":"module:ServerDiscoveryTask.ProcessSSDPResponse","link":"ProcessSSDPResponse"},{"title":"module:ServerDiscoveryTask.SendClientDiscoveryBroadcast","link":"SendClientDiscoveryBroadcast"},{"title":"module:ServerDiscoveryTask.SendSSDPBroadcast","link":"SendSSDPBroadcast"},{"title":"module:ServerDiscoveryTask.execute","link":"execute"},{"title":"module:ServerDiscoveryTask.init","link":"init","description":"

Task used to discover jellyfin servers on the local network

"},{"title":"module:SetServerScreen","link":"SetServerScreen"},{"title":"module:SetServerScreen.ScanForServers","link":"ScanForServers"},{"title":"module:SetServerScreen.ScanForServersComplete","link":"ScanForServersComplete"},{"title":"module:SetServerScreen.ShowKeyboard","link":"ShowKeyboard"},{"title":"module:SetServerScreen.clearErrorMessage","link":"clearErrorMessage"},{"title":"module:SetServerScreen.init","link":"init"},{"title":"module:SetServerScreen.onDialogButton","link":"onDialogButton"},{"title":"module:SetServerScreen.onKeyEvent","link":"onKeyEvent"},{"title":"module:ShowScenes","link":"ShowScenes"},{"title":"module:ShowScenes.CreateAlbumView","link":"CreateAlbumView","description":"

Shows details on selected album. Description text, image, and list of available songs

"},{"title":"module:ShowScenes.CreateArtistView","link":"CreateArtistView","description":"

Shows details on selected artist. Bio, image, and list of available albums

"},{"title":"module:ShowScenes.CreateHomeGroup","link":"CreateHomeGroup"},{"title":"module:ShowScenes.CreateItemGrid","link":"CreateItemGrid"},{"title":"module:ShowScenes.CreateMovieDetailsGroup","link":"CreateMovieDetailsGroup"},{"title":"module:ShowScenes.CreateMovieLibraryView","link":"CreateMovieLibraryView"},{"title":"module:ShowScenes.CreateMusicLibraryView","link":"CreateMusicLibraryView"},{"title":"module:ShowScenes.CreatePersonView","link":"CreatePersonView"},{"title":"module:ShowScenes.CreatePlaylistView","link":"CreatePlaylistView","description":"

Shows details on selected playlist. Description text, image, and list of available items

"},{"title":"module:ShowScenes.CreateSearchPage","link":"CreateSearchPage"},{"title":"module:ShowScenes.CreateSeasonDetailsGroup","link":"CreateSeasonDetailsGroup"},{"title":"module:ShowScenes.CreateSeasonDetailsGroupByID","link":"CreateSeasonDetailsGroupByID"},{"title":"module:ShowScenes.CreateSeriesDetailsGroup","link":"CreateSeriesDetailsGroup"},{"title":"module:ShowScenes.CreateServerGroup","link":"CreateServerGroup"},{"title":"module:ShowScenes.CreateSigninGroup","link":"CreateSigninGroup"},{"title":"module:ShowScenes.CreateUserSelectGroup","link":"CreateUserSelectGroup"},{"title":"module:ShowScenes.CreateVideoPlayerGroup","link":"CreateVideoPlayerGroup"},{"title":"module:ShowScenes.DeleteFromServerList","link":"DeleteFromServerList"},{"title":"module:ShowScenes.LoginFlow","link":"LoginFlow"},{"title":"module:ShowScenes.SaveServerList","link":"SaveServerList"},{"title":"module:ShowScenes.SendPerformanceBeacon","link":"SendPerformanceBeacon","description":"

Roku Performance monitoring

"},{"title":"module:ShowScenes.playbackOptionDialog","link":"playbackOptionDialog","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:SlideOutButton","link":"SlideOutButton"},{"title":"module:SlideOutButton.init","link":"init"},{"title":"module:SlideOutButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:SlideOutButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:SlideOutButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:SlideOutButton.onHighlightChanged","link":"onHighlightChanged"},{"title":"module:SlideOutButton.onIconChanged","link":"onIconChanged"},{"title":"module:SlideOutButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:SlideOutButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:SlideOutButton.onTextChanged","link":"onTextChanged"},{"title":"module:SlideOutButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:SlideOutButton.setIconSize","link":"setIconSize"},{"title":"module:SongItem","link":"SongItem"},{"title":"module:SongItem.focusChanged","link":"focusChanged"},{"title":"module:SongItem.init","link":"init"},{"title":"module:SongItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:Spinner","link":"Spinner"},{"title":"module:Spinner.init","link":"init"},{"title":"module:StandardDialog","link":"StandardDialog"},{"title":"module:StandardDialog.init","link":"init"},{"title":"module:StandardDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:Subtitles","link":"Subtitles"},{"title":"module:Subtitles.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:Subtitles.changeSubtitleDuringPlayback","link":"changeSubtitleDuringPlayback"},{"title":"module:Subtitles.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

Identify the default subtitle track\nif "requires_text" is true, only return a track if it is textual\nThis allows forcing text subs, since roku requires transcoding of non-text subs\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.defaultSubtitleTrackFromVid","link":"defaultSubtitleTrackFromVid","description":"

Identify the default subtitle track for a given video id\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:Subtitles.getSubtitleSelIdxFromSubIdx","link":"getSubtitleSelIdxFromSubIdx","description":"

The subtitle index on the server differs from the index we track locally\nThis function converts the former into the latter

"},{"title":"module:Subtitles.selectSubtitleTrack","link":"selectSubtitleTrack"},{"title":"module:Subtitles.selectSubtitleTrackDialog","link":"selectSubtitleTrackDialog","description":"

Present Dialog to user to select subtitle track

"},{"title":"module:Subtitles.setupSubtitle","link":"setupSubtitle","description":"

Given a set of subtitles, and a subtitle index (the index on the server, not in the list provided)\nthis will set all relevant settings for roku (mainly closed captions) and return the index of the\nsubtitle track specified, but indexed based on the provided list of subtitles

"},{"title":"module:Subtitles.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:Subtitles.turnoffSubtitles","link":"turnoffSubtitles"},{"title":"module:TVEpisode","link":"TVEpisode"},{"title":"module:TVEpisode.setFields","link":"setFields"},{"title":"module:TVEpisode.setPoster","link":"setPoster"},{"title":"module:TVEpisodeData","link":"TVEpisodeData"},{"title":"module:TVEpisodeData.setFields","link":"setFields"},{"title":"module:TVEpisodeData.setPoster","link":"setPoster"},{"title":"module:TVEpisodeRow","link":"TVEpisodeRow"},{"title":"module:TVEpisodeRow.init","link":"init"},{"title":"module:TVEpisodeRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRow.setData","link":"setData"},{"title":"module:TVEpisodeRow.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRow.updateSize","link":"updateSize"},{"title":"module:TVEpisodeRowWithOptions","link":"TVEpisodeRowWithOptions"},{"title":"module:TVEpisodeRowWithOptions.SetUpAudioOptions","link":"SetUpAudioOptions","description":"

List of audio tracks to choose from

"},{"title":"module:TVEpisodeRowWithOptions.SetUpVideoOptions","link":"SetUpVideoOptions","description":"

List of video versions to choose from

"},{"title":"module:TVEpisodeRowWithOptions.audioOptionsClosed","link":"audioOptionsClosed"},{"title":"module:TVEpisodeRowWithOptions.init","link":"init"},{"title":"module:TVEpisodeRowWithOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRowWithOptions.rowsDoneLoading","link":"rowsDoneLoading"},{"title":"module:TVEpisodeRowWithOptions.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRowWithOptions.videoOptionsClosed","link":"videoOptionsClosed"},{"title":"module:TVEpisodes","link":"TVEpisodes"},{"title":"module:TVEpisodes.getFocusedItem","link":"getFocusedItem","description":"

get the currently focused item

"},{"title":"module:TVEpisodes.init","link":"init"},{"title":"module:TVEpisodes.onKeyEvent","link":"onKeyEvent","description":"

Handle navigation input from the remote and act on it

"},{"title":"module:TVEpisodes.setExtraButtonVisibility","link":"setExtraButtonVisibility","description":"

Updates the visibility of the Extras button based on if this season has any extra features

"},{"title":"module:TVEpisodes.setSeasonLoading","link":"setSeasonLoading"},{"title":"module:TVEpisodes.updateSeason","link":"updateSeason"},{"title":"module:TVListDetails","link":"TVListDetails"},{"title":"module:TVListDetails.DisplayAudioAvailable","link":"DisplayAudioAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one audio track to choose from

"},{"title":"module:TVListDetails.DisplayVideoAvailable","link":"DisplayVideoAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one video version to choose from

"},{"title":"module:TVListDetails.SetupAudioDisplay","link":"SetupAudioDisplay","description":"

Display current audio_codec and check if there is more than one audio track to choose from...

"},{"title":"module:TVListDetails.focusChanged","link":"focusChanged"},{"title":"module:TVListDetails.getEndTime","link":"getEndTime"},{"title":"module:TVListDetails.getRuntime","link":"getRuntime"},{"title":"module:TVListDetails.init","link":"init"},{"title":"module:TVListDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVListOptions","link":"TVListOptions"},{"title":"module:TVListOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:TVListOptions.init","link":"init"},{"title":"module:TVListOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVListOptions.optionsSet","link":"optionsSet"},{"title":"module:TVSeasonData","link":"TVSeasonData"},{"title":"module:TVSeasonData.setFields","link":"setFields"},{"title":"module:TVSeasonData.setPoster","link":"setPoster"},{"title":"module:TVSeasonRow","link":"TVSeasonRow"},{"title":"module:TVSeasonRow.getData","link":"getData"},{"title":"module:TVSeasonRow.init","link":"init"},{"title":"module:TVSeasonRow.updateSize","link":"updateSize"},{"title":"module:TVShowDescription","link":"TVShowDescription"},{"title":"module:TVShowDescription.getEndTime","link":"getEndTime"},{"title":"module:TVShowDescription.getHistory","link":"getHistory"},{"title":"module:TVShowDescription.getRuntime","link":"getRuntime"},{"title":"module:TVShowDescription.init","link":"init"},{"title":"module:TVShowDescription.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDescription.round","link":"round"},{"title":"module:TVShowDescription.setFieldText","link":"setFieldText"},{"title":"module:TVShowDetails","link":"TVShowDetails"},{"title":"module:TVShowDetails.getEndTime","link":"getEndTime"},{"title":"module:TVShowDetails.getHistory","link":"getHistory"},{"title":"module:TVShowDetails.getRuntime","link":"getRuntime"},{"title":"module:TVShowDetails.init","link":"init"},{"title":"module:TVShowDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVShowDetails.onShuffleEpisodeDataLoaded","link":"onShuffleEpisodeDataLoaded"},{"title":"module:TVShowDetails.round","link":"round"},{"title":"module:TVShowDetails.setFieldText","link":"setFieldText"},{"title":"module:TextSizeTask","link":"TextSizeTask"},{"title":"module:TextSizeTask.getTextSize","link":"getTextSize"},{"title":"module:TextSizeTask.init","link":"init"},{"title":"module:UserData","link":"UserData"},{"title":"module:UserData.getPreference","link":"getPreference"},{"title":"module:UserData.loadFromJSON","link":"loadFromJSON"},{"title":"module:UserData.loadFromRegistry","link":"loadFromRegistry"},{"title":"module:UserData.removeFromRegistry","link":"removeFromRegistry"},{"title":"module:UserData.saveToRegistry","link":"saveToRegistry"},{"title":"module:UserData.setDataFromJSON","link":"setDataFromJSON"},{"title":"module:UserData.setPreference","link":"setPreference"},{"title":"module:UserData.setServer","link":"setServer"},{"title":"module:UserItem","link":"UserItem"},{"title":"module:UserItem.init","link":"init"},{"title":"module:UserItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserLibrary","link":"UserLibrary"},{"title":"module:UserLibrary.MarkItemFavorite","link":"MarkItemFavorite"},{"title":"module:UserLibrary.MarkItemWatched","link":"MarkItemWatched"},{"title":"module:UserLibrary.UnmarkItemFavorite","link":"UnmarkItemFavorite"},{"title":"module:UserLibrary.UnmarkItemWatched","link":"UnmarkItemWatched"},{"title":"module:UserRow","link":"UserRow"},{"title":"module:UserRow.init","link":"init"},{"title":"module:UserRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserRow.setData","link":"setData"},{"title":"module:UserRow.setUser","link":"setUser"},{"title":"module:UserRow.updateSize","link":"updateSize"},{"title":"module:UserSelect","link":"UserSelect"},{"title":"module:UserSelect.init","link":"init"},{"title":"module:UserSelect.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserSelect.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserSelect.redraw","link":"redraw"},{"title":"module:VideoData","link":"VideoData"},{"title":"module:VideoData.setFields","link":"setFields"},{"title":"module:VideoData.setPoster","link":"setPoster"},{"title":"module:VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.AddVideoContent","link":"AddVideoContent"},{"title":"module:VideoPlayer.GetPlaybackInfo","link":"GetPlaybackInfo","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:VideoPlayer.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:VideoPlayer.PlayIntroVideo","link":"PlayIntroVideo"},{"title":"module:VideoPlayer.VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.autoPlayNextEpisode","link":"autoPlayNextEpisode"},{"title":"module:VideoPlayer.directPlaySupported","link":"directPlaySupported"},{"title":"module:VideoPlayer.getAudioFormat","link":"getAudioFormat"},{"title":"module:VideoPlayer.getAudioInfo","link":"getAudioInfo"},{"title":"module:VideoPlayer.getContainerType","link":"getContainerType"},{"title":"module:VideoPlayer.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:VideoPlayer.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:VideoPlayer.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:VideoPlayer.startPlayBackOver","link":"startPlayBackOver","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:VideoPlayerView","link":"VideoPlayerView"},{"title":"module:VideoPlayerView.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:VideoPlayerView.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:VideoPlayerView.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:VideoPlayerView.getCurrentChapterIndex","link":"getCurrentChapterIndex","description":"

getCurrentChapterIndex: Finds current chapter index

"},{"title":"module:VideoPlayerView.handleChapterListAction","link":"handleChapterListAction","description":"

handleChapterListAction: Handles action to show chapter list

"},{"title":"module:VideoPlayerView.handleChapterSkipAction","link":"handleChapterSkipAction","description":"

handleChapterSkipAction: Handles user command to skip chapters in playing video

"},{"title":"module:VideoPlayerView.handleHideAction","link":"handleHideAction","description":"

handleHideAction: Handles action to hide OSD menu

"},{"title":"module:VideoPlayerView.handleShowSubtitleMenuAction","link":"handleShowSubtitleMenuAction","description":"

handleShowSubtitleMenuAction: Handles action to show subtitle selection menu

"},{"title":"module:VideoPlayerView.handleShowVideoInfoPopupAction","link":"handleShowVideoInfoPopupAction","description":"

handleShowVideoInfoPopupAction: Handles action to show video info popup

"},{"title":"module:VideoPlayerView.handleVideoPlayPauseAction","link":"handleVideoPlayPauseAction","description":"

handleVideoPlayPauseAction: Handles action to either play or pause the video content

"},{"title":"module:VideoPlayerView.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:VideoPlayerView.init","link":"init"},{"title":"module:VideoPlayerView.loadCaption","link":"loadCaption","description":"

Set caption url to server subtitle track

"},{"title":"module:VideoPlayerView.onAllowCaptionsChange","link":"onAllowCaptionsChange","description":"

Only setup caption items if captions are allowed

"},{"title":"module:VideoPlayerView.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:VideoPlayerView.onKeyEvent","link":"onKeyEvent"},{"title":"module:VideoPlayerView.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:VideoPlayerView.onOSDAction","link":"onOSDAction","description":"

onOSDAction: Process action events from OSD to their respective handlers

"},{"title":"module:VideoPlayerView.onPlaybackErrorButtonSelected","link":"onPlaybackErrorButtonSelected"},{"title":"module:VideoPlayerView.onPlaybackErrorDialogClosed","link":"onPlaybackErrorDialogClosed"},{"title":"module:VideoPlayerView.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onSubtitleChange","link":"onSubtitleChange","description":"

Event handler for when selectedSubtitle changes

"},{"title":"module:VideoPlayerView.onVideoContentLoaded","link":"onVideoContentLoaded"},{"title":"module:VideoPlayerView.populateChapterMenu","link":"populateChapterMenu","description":"

populateChapterMenu: ' Parse chapter data from API and appeand to chapter list menu

"},{"title":"module:VideoPlayerView.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:VideoPlayerView.showPlaybackErrorDialog","link":"showPlaybackErrorDialog"},{"title":"module:VideoPlayerView.stateAllowsOSD","link":"stateAllowsOSD","description":"

stateAllowsOSD: Check if current video state allows showing the OSD

"},{"title":"module:VideoPlayerView.toggleCaption","link":"toggleCaption","description":"

Toggles visibility of custom subtitles and sets captionTask's player state

"},{"title":"module:VideoPlayerView.updateCaption","link":"updateCaption","description":"

Removes old subtitle lines and adds new subtitle lines

"},{"title":"module:VideoPlayerView.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:VideoTrackListItem","link":"VideoTrackListItem"},{"title":"module:VideoTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:VideoTrackListItem.init","link":"init"},{"title":"module:VideoTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ViewCreator","link":"ViewCreator"},{"title":"module:ViewCreator.CreateAudioPlayerView","link":"CreateAudioPlayerView","description":"

Play Audio

"},{"title":"module:ViewCreator.CreateVideoPlayerView","link":"CreateVideoPlayerView","description":"

Play Video

"},{"title":"module:ViewCreator.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:ViewCreator.onPlaybackInfoLoaded","link":"onPlaybackInfoLoaded","description":"

The playback info task has returned data

"},{"title":"module:ViewCreator.onSelectPlaybackInfoPressed","link":"onSelectPlaybackInfoPressed","description":"

User requested playback info

"},{"title":"module:ViewCreator.onSelectSubtitlePressed","link":"onSelectSubtitlePressed","description":"

User requested subtitle selection popup

"},{"title":"module:ViewCreator.onSelectionMade","link":"onSelectionMade","description":"

User has selected something from the radioDialog popup

"},{"title":"module:ViewCreator.onStateChange","link":"onStateChange","description":"

Playback state change event handlers

"},{"title":"module:ViewCreator.processSubtitleSelection","link":"processSubtitleSelection"},{"title":"module:WhatsNewDialog","link":"WhatsNewDialog"},{"title":"module:WhatsNewDialog.init","link":"init"},{"title":"module:WhatsNewDialog.setPalette","link":"setPalette"},{"title":"module:baserequest","link":"baserequest"},{"title":"module:baserequest.APIRequest","link":"APIRequest"},{"title":"module:baserequest.authRequest","link":"authRequest","description":"

Takes and returns a roUrlTransfer object after adding a Jellyfin "Authorization" header

"},{"title":"module:baserequest.buildAuthHeader","link":"buildAuthHeader","description":"

Returns a string containing the "Authorization" header payload

"},{"title":"module:baserequest.buildParams","link":"buildParams","description":"

Functions for making requests to the API

"},{"title":"module:baserequest.buildURL","link":"buildURL"},{"title":"module:baserequest.deleteVoid","link":"deleteVoid"},{"title":"module:baserequest.getJson","link":"getJson"},{"title":"module:baserequest.getString","link":"getString"},{"title":"module:baserequest.getVoid","link":"getVoid"},{"title":"module:baserequest.get_url","link":"get_url"},{"title":"module:baserequest.headVoid","link":"headVoid"},{"title":"module:baserequest.postJson","link":"postJson"},{"title":"module:baserequest.postString","link":"postString"},{"title":"module:baserequest.postVoid","link":"postVoid"},{"title":"module:baserequest.setCertificateAuthority","link":"setCertificateAuthority","description":"

sets the certificate authority by file path on the passed node

"},{"title":"module:captionTask","link":"captionTask"},{"title":"module:captionTask.fetchCaption","link":"fetchCaption"},{"title":"module:captionTask.init","link":"init"},{"title":"module:captionTask.isTime","link":"isTime"},{"title":"module:captionTask.newLayoutGroup","link":"newLayoutGroup"},{"title":"module:captionTask.newRect","link":"newRect"},{"title":"module:captionTask.newlabel","link":"newlabel"},{"title":"module:captionTask.parseVTT","link":"parseVTT"},{"title":"module:captionTask.setFont","link":"setFont"},{"title":"module:captionTask.toMs","link":"toMs"},{"title":"module:captionTask.updateCaption","link":"updateCaption"},{"title":"module:conditional","link":"conditional"},{"title":"module:conditional.printRegistry","link":"printRegistry","description":"

Print out all of the registry contents to the debug log

"},{"title":"module:config","link":"config"},{"title":"module:config.GetConfigTree","link":"GetConfigTree","description":"

Read config tree from json config file and return

"},{"title":"module:config.RegistryReadAll","link":"RegistryReadAll","description":"

Return all data found inside a registry section

"},{"title":"module:config.findConfigTreeKey","link":"findConfigTreeKey","description":"

Recursivly search the config tree for entry with settingname equal to key

"},{"title":"module:config.getRegistrySections","link":"getRegistrySections","description":"

Return an array of all the registry section keys

"},{"title":"module:config.getSavedUsers","link":"getSavedUsers","description":"

Returns an array of saved users from the registry\nthat belong to the active server

"},{"title":"module:config.get_setting","link":"get_setting","description":"

"Jellyfin" registry accessors for the default global settings

"},{"title":"module:config.get_user_setting","link":"get_user_setting","description":"

User registry accessors for the currently active user

"},{"title":"module:config.registry_delete","link":"registry_delete"},{"title":"module:config.registry_read","link":"registry_read","description":"

Generic registry accessors

"},{"title":"module:config.registry_write","link":"registry_write"},{"title":"module:config.set_setting","link":"set_setting"},{"title":"module:config.set_user_setting","link":"set_user_setting"},{"title":"module:config.unset_setting","link":"unset_setting"},{"title":"module:config.unset_user_setting","link":"unset_user_setting"},{"title":"module:deviceCapabilities","link":"deviceCapabilities"},{"title":"module:deviceCapabilities.GetBitRateLimit","link":"GetBitRateLimit"},{"title":"module:deviceCapabilities.GetDirectPlayProfiles","link":"GetDirectPlayProfiles"},{"title":"module:deviceCapabilities.getCodecProfiles","link":"getCodecProfiles"},{"title":"module:deviceCapabilities.getContainerProfiles","link":"getContainerProfiles"},{"title":"module:deviceCapabilities.getDeviceCapabilities","link":"getDeviceCapabilities","description":"

Returns the Device Capabilities for Roku.\nAlso prints out the device profile for debugging

"},{"title":"module:deviceCapabilities.getDeviceProfile","link":"getDeviceProfile"},{"title":"module:deviceCapabilities.getMaxHeightArray","link":"getMaxHeightArray"},{"title":"module:deviceCapabilities.getMaxWidthArray","link":"getMaxWidthArray"},{"title":"module:deviceCapabilities.getSubtitleProfiles","link":"getSubtitleProfiles"},{"title":"module:deviceCapabilities.getTranscodingProfiles","link":"getTranscodingProfiles"},{"title":"module:deviceCapabilities.printDeviceProfile","link":"printDeviceProfile","description":"

Print out the deviceProfile for debugging

"},{"title":"module:deviceCapabilities.removeDecimals","link":"removeDecimals","description":"

Remove all decimals from a string

"},{"title":"module:deviceCapabilities.setPreferredCodec","link":"setPreferredCodec","description":"

Takes and returns a comma delimited string of codecs.\nMoves the preferred codec to the front of the string

"},{"title":"module:deviceCapabilities.updateProfileArray","link":"updateProfileArray","description":"

Recieves and returns an assArray of supported profiles and levels for each video codec

"},{"title":"module:globals","link":"globals"},{"title":"module:globals.SaveAppToGlobal","link":"SaveAppToGlobal","description":"

Save information from roAppInfo to m.global.app

"},{"title":"module:globals.SaveDeviceToGlobal","link":"SaveDeviceToGlobal","description":"

Save information from roDeviceInfo to m.global.device

"},{"title":"module:globals.setConstants","link":"setConstants","description":"

Set global constants

"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.runGlobalMigrations","link":"runGlobalMigrations","description":"

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

"},{"title":"module:migrations.runRegistryUserMigrations","link":"runRegistryUserMigrations"},{"title":"module:misc","link":"misc"},{"title":"module:misc.AssocArrayEqual","link":"AssocArrayEqual"},{"title":"module:misc.arrayHasValue","link":"arrayHasValue","description":"

Check if a specific value is inside of an array

"},{"title":"module:misc.div_ceiling","link":"div_ceiling"},{"title":"module:misc.findNodeBySubtype","link":"findNodeBySubtype"},{"title":"module:misc.formatTime","link":"formatTime","description":"

Format time as 12 or 24 hour format based on system clock setting

"},{"title":"module:misc.getButton","link":"getButton"},{"title":"module:misc.getMinutes","link":"getMinutes","description":"

Converts ticks to minutes

"},{"title":"module:misc.getMsgPicker","link":"getMsgPicker"},{"title":"module:misc.get_dialog_result","link":"get_dialog_result","description":"

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

"},{"title":"module:misc.inArray","link":"inArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:misc.inferServerUrl","link":"inferServerUrl","description":"

take an incomplete url string and use it to make educated guesses about\nthe complete url. then tests these guesses to see if it can find a jf server\nreturns the url of the server it found, or an empty string

"},{"title":"module:misc.isJellyfinServer","link":"isJellyfinServer","description":"

accepts the raw json string of /system/info/public and returns\na boolean indicating if ProductName is "Jellyfin Server"

"},{"title":"module:misc.isLocalhost","link":"isLocalhost","description":"

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

"},{"title":"module:misc.isNodeEvent","link":"isNodeEvent"},{"title":"module:misc.isValid","link":"isValid","description":"

Returns whether or not passed value is valid

"},{"title":"module:misc.isValidAndNotEmpty","link":"isValidAndNotEmpty","description":"

Returns whether or not passed value is valid and not empty\nAccepts a string, or any countable type (arrays and lists)

"},{"title":"module:misc.lastFocusedChild","link":"lastFocusedChild"},{"title":"module:misc.leftPad","link":"leftPad"},{"title":"module:misc.message_dialog","link":"message_dialog"},{"title":"module:misc.option_dialog","link":"option_dialog"},{"title":"module:misc.parseUrl","link":"parseUrl","description":"

Returns an array from a url = [ url, proto, host, port, subdir+params ]\nIf port or subdir are not found, an empty string will be added to the array\nProto must be declared or array will be empty

"},{"title":"module:misc.roundNumber","link":"roundNumber","description":"

Rounds number to nearest integer

"},{"title":"module:misc.secondsToHuman","link":"secondsToHuman"},{"title":"module:misc.setFieldTextValue","link":"setFieldTextValue"},{"title":"module:misc.show_dialog","link":"show_dialog"},{"title":"module:misc.shuffleArray","link":"shuffleArray","description":"

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

"},{"title":"module:misc.startLoadingSpinner","link":"startLoadingSpinner","description":"

startLoadingSpinner: Start a loading spinner and attach it to the main JFScene.\nDisplays an invisible ProgressDialog node by default to disable keypresses while loading.

"},{"title":"module:misc.stopLoadingSpinner","link":"stopLoadingSpinner"},{"title":"module:misc.ticksToHuman","link":"ticksToHuman"},{"title":"module:misc.toString","link":"toString"},{"title":"module:misc.urlCandidates","link":"urlCandidates","description":"

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates\nfor the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated\nfull urls.

"},{"title":"module:misc.versionChecker","link":"versionChecker","description":"

Returns whether or not a version number (e.g. 10.7.7) is greater or equal\nto some minimum version allowed (e.g. 10.8.0)

"},{"title":"module:quickplay","link":"quickplay"},{"title":"module:quickplay.album","link":"album","description":"

A music album.\nPlay the entire album starting with track 1.

"},{"title":"module:quickplay.artist","link":"artist","description":"

A music artist.\nShuffle play all songs by artist.

"},{"title":"module:quickplay.audio","link":"audio","description":"

A single audio file.

"},{"title":"module:quickplay.boxset","link":"boxset","description":"

A boxset.\nPlay all items inside.

"},{"title":"module:quickplay.collectionFolder","link":"collectionFolder","description":"

Quick Play A CollectionFolder.\nShuffle play the items inside\nwith some differences based on collectionType.

"},{"title":"module:quickplay.folder","link":"folder","description":"

Quick Play A folder.\nShuffle play all items found

"},{"title":"module:quickplay.multipleSeries","link":"multipleSeries","description":"

More than one TV Show Series.\nShuffle play all watched episodes

"},{"title":"module:quickplay.musicVideo","link":"musicVideo","description":"

A single music video file.

"},{"title":"module:quickplay.person","link":"person","description":"

Quick Play A Person.\nShuffle play all videos found

"},{"title":"module:quickplay.photo","link":"photo","description":"

A single photo.

"},{"title":"module:quickplay.photoAlbum","link":"photoAlbum","description":"

A photo album.

"},{"title":"module:quickplay.playlist","link":"playlist","description":"

Quick Play A Playlist.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.program","link":"program","description":"

Quick Play A Live Program

"},{"title":"module:quickplay.pushToQueue","link":"pushToQueue","description":"

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

"},{"title":"module:quickplay.season","link":"season","description":"

A TV Show Season.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.series","link":"series","description":"

A TV Show Series.\nPlay the first unwatched episode.\nIf none, shuffle play the whole series.

"},{"title":"module:quickplay.tvChannel","link":"tvChannel","description":"

Quick Play A TVChannel

"},{"title":"module:quickplay.userView","link":"userView","description":"

Quick Play A UserView.\nPlay logic depends on "collectionType".

"},{"title":"module:quickplay.video","link":"video","description":"

A single video file.

"},{"title":"module:quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"},{"title":"module:schedule","link":"schedule"},{"title":"module:schedule.channelFilterSet","link":"channelFilterSet"},{"title":"module:schedule.channelsearchTermSet","link":"channelsearchTermSet","description":"

Voice Search set

"},{"title":"module:schedule.focusProgramDetails","link":"focusProgramDetails","description":"

Move the TV Guide Grid down or up depending whether details are selected

"},{"title":"module:schedule.init","link":"init"},{"title":"module:schedule.onChannelsLoaded","link":"onChannelsLoaded","description":"

Initial list of channels loaded

"},{"title":"module:schedule.onGridScrolled","link":"onGridScrolled","description":"

As user scrolls grid, check if more data requries to be loaded

"},{"title":"module:schedule.onKeyEvent","link":"onKeyEvent"},{"title":"module:schedule.onProgramDetailsLoaded","link":"onProgramDetailsLoaded","description":"

Update the Program Details with full information

"},{"title":"module:schedule.onProgramFocused","link":"onProgramFocused"},{"title":"module:schedule.onProgramSelected","link":"onProgramSelected"},{"title":"module:schedule.onRecordChannelSelected","link":"onRecordChannelSelected","description":"

Handle user selecting "Record Channel" from Program Details

"},{"title":"module:schedule.onRecordOperationDone","link":"onRecordOperationDone"},{"title":"module:schedule.onRecordSeriesChannelSelected","link":"onRecordSeriesChannelSelected","description":"

Handle user selecting "Record Series" from Program Details

"},{"title":"module:schedule.onScheduleLoaded","link":"onScheduleLoaded","description":"

When LoadScheduleTask completes (initial or more data) and we have a schedule to display

"},{"title":"module:schedule.onWatchChannelSelected","link":"onWatchChannelSelected","description":"

Handle user selecting "Watch Channel" from Program Details

"},{"title":"module:section","link":"section"},{"title":"module:section.init","link":"init"},{"title":"module:section.onFocusChange","link":"onFocusChange"},{"title":"module:section.onIDChange","link":"onIDChange"},{"title":"module:section.onTranslationChange","link":"onTranslationChange"},{"title":"module:section.scrollDownToOnDeck","link":"scrollDownToOnDeck"},{"title":"module:section.scrollOffBottom","link":"scrollOffBottom"},{"title":"module:section.scrollOffOnDeck","link":"scrollOffOnDeck"},{"title":"module:section.scrollOffTop","link":"scrollOffTop"},{"title":"module:section.scrollUpToOnDeck","link":"scrollUpToOnDeck"},{"title":"module:section.showFromBottom","link":"showFromBottom"},{"title":"module:section.showFromTop","link":"showFromTop"},{"title":"module:sectionScroller","link":"sectionScroller"},{"title":"module:sectionScroller.displayedIndexChanged","link":"displayedIndexChanged"},{"title":"module:sectionScroller.init","link":"init"},{"title":"module:sectionScroller.onFocusChange","link":"onFocusChange"},{"title":"module:settings","link":"settings"},{"title":"module:settings.LoadMenu","link":"LoadMenu"},{"title":"module:settings.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook that gets ran as needed.\nAssumes settings were changed and they affect the device profile.\nPosts a new device profile to the server using the task thread

"},{"title":"module:settings.boolSettingChanged","link":"boolSettingChanged"},{"title":"module:settings.init","link":"init"},{"title":"module:settings.isFormInFocus","link":"isFormInFocus","description":"

Returns true if any of the data entry forms are in focus

"},{"title":"module:settings.onKeyEvent","link":"onKeyEvent"},{"title":"module:settings.onKeyGridEscape","link":"onKeyGridEscape"},{"title":"module:settings.onKeyGridSubmit","link":"onKeyGridSubmit"},{"title":"module:settings.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:settings.radioSettingChanged","link":"radioSettingChanged"},{"title":"module:settings.settingFocused","link":"settingFocused"},{"title":"module:settings.settingSelected","link":"settingSelected"},{"title":"module:userauth","link":"userauth"},{"title":"module:userauth.AboutMe","link":"AboutMe"},{"title":"module:userauth.AuthenticateViaQuickConnect","link":"AuthenticateViaQuickConnect"},{"title":"module:userauth.AvailableUsers","link":"AvailableUsers"},{"title":"module:userauth.GetPublicUsers","link":"GetPublicUsers"},{"title":"module:userauth.LoadUserAbilities","link":"LoadUserAbilities"},{"title":"module:userauth.ServerInfo","link":"ServerInfo"},{"title":"module:userauth.SignOut","link":"SignOut"},{"title":"module:userauth.checkQuickConnect","link":"checkQuickConnect"},{"title":"module:userauth.get_token","link":"get_token"},{"title":"module:userauth.initQuickConnect","link":"initQuickConnect"}]} \ No newline at end of file diff --git a/docs/api/module-quickplay.html b/docs/api/module-quickplay.html index 4894988047..9c45c44de9 100644 --- a/docs/api/module-quickplay.html +++ b/docs/api/module-quickplay.html @@ -1,3 +1,3 @@ Module: quickplay
On this page

Methods

(static) album(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) artist(itemNode) → {void}

A music artist. Shuffle play all songs by artist.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) audio(itemNode) → {void}

A single audio file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) boxset(itemNode) → {void}

A boxset. Play all items inside.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) collectionFolder(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) folder(itemNode) → {void}

Quick Play A folder. Shuffle play all items found

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) multipleSeries(itemNodes) → {void}

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

Parameters:
NameTypeDescription
itemNodesobject
Returns:
Type: 
void

(static) musicVideo(itemNode) → {void}

A single music video file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) person(itemNode) → {void}

Quick Play A Person. Shuffle play all videos found

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) photo(itemNode) → {void}

A single photo.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) photoAlbum(itemNode) → {void}

A photo album.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) playlist(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) program(itemNode) → {void}

Quick Play A Live Program

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) pushToQueue(queueArray, shufflePlayopt) → {void}

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

Parameters:
NameTypeAttributesDefaultDescription
queueArrayobject
shufflePlayboolean<optional>
false
Returns:
Type: 
void

(static) season(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) series(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) tvChannel(itemNode) → {void}

Quick Play A TVChannel

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) userView(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) video(itemNode) → {void}

A single video file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) album(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) artist(itemNode) → {void}

A music artist. Shuffle play all songs by artist.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) audio(itemNode) → {void}

A single audio file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) boxset(itemNode) → {void}

A boxset. Play all items inside.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) collectionFolder(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) folder(itemNode) → {void}

Quick Play A folder. Shuffle play all items found

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) multipleSeries(itemNodes) → {void}

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

Parameters:
NameTypeDescription
itemNodesobject
Returns:
Type: 
void

(static) musicVideo(itemNode) → {void}

A single music video file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) person(itemNode) → {void}

Quick Play A Person. Shuffle play all videos found

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) photo(itemNode) → {void}

A single photo.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) photoAlbum(itemNode) → {void}

A photo album.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) playlist(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) program(itemNode) → {void}

Quick Play A Live Program

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) pushToQueue(queueArray, shufflePlayopt) → {void}

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

Parameters:
NameTypeAttributesDefaultDescription
queueArrayobject
shufflePlayboolean<optional>
false
Returns:
Type: 
void

(static) season(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) series(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) tvChannel(itemNode) → {void}

Quick Play A TVChannel

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) userView(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) video(itemNode) → {void}

A single video file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) videoContainer(itemNode) → {void}

A container with some kind of videos inside of it

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_quickplay.bs.html b/docs/api/source_utils_quickplay.bs.html index de7609e2ea..8047163702 100644 --- a/docs/api/source_utils_quickplay.bs.html +++ b/docs/api/source_utils_quickplay.bs.html @@ -258,6 +258,70 @@ end if end sub + ' A container with some kind of videos inside of it + sub videoContainer(itemNode as object) + print "itemNode=", itemNode + collectionType = Lcase(itemNode.collectionType) + if collectionType = "movies" + ' get randomized list of videos inside + data = api.users.GetItemsByQuery(m.global.session.user.id, { + "parentId": itemNode.id, + "sortBy": "Random", + "recursive": true, + "includeItemTypes": "Movie,Video", + "limit": 2000 + }) + print "data=", data + if isValid(data) and isValidAndNotEmpty(data.items) + videoList = [] + ' add each item to the queue + for each item in data.Items + print "data.Item=", item + ' only add videos we're not currently watching + if isValid(item.userdata) and isValid(item.userdata.PlaybackPositionTicks) + if item.userdata.PlaybackPositionTicks = 0 + videoList.push(item) + end if + end if + end for + quickplay.pushToQueue(videoList) + else + stopLoadingSpinner() + end if + return + 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", + "recursive": true, + "excludeItemTypes": "Season", + "imageTypeLimit": 0, + "enableUserData": false, + "EnableTotalRecordCount": false, + "enableImages": false + }) + + print "tvshowsData=", tvshowsData + + if isValid(tvshowsData) and isValidAndNotEmpty(tvshowsData.items) + ' the type of media returned from api may change. + if tvshowsData.items[0].Type = "Series" + quickplay.multipleSeries(tvshowsData.items) + else + ' if first item is not a series, then assume they are all videos and/or episodes + quickplay.pushToQueue(tvshowsData.items) + end if + else + stopLoadingSpinner() + end if + else + stopLoadingSpinner() + print "Quick Play videoContainer WARNING: Unknown collection type" + end if + end sub + ' A TV Show Season. ' Play the first unwatched episode. ' If none, play the whole season starting with episode 1. @@ -277,7 +341,7 @@ for each item in unwatchedData.Items if isValid(item.UserData) if isValid(item.UserData.Played) and item.UserData.Played = false - firstUnwatchedEpisodeIndex = item.IndexNumber - 1 + firstUnwatchedEpisodeIndex = isValid(item.IndexNumber) ? item.IndexNumber - 1 : 0 if isValid(item.UserData.PlaybackPositionTicks) item.startingPoint = item.UserData.PlaybackPositionTicks end if @@ -487,28 +551,7 @@ 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) - else - stopLoadingSpinner() - end if + quickplay.videoContainer(itemNode) else if collectionType = "music" ' get audio files from under this collection ' sort songs by album then artist @@ -560,29 +603,7 @@ 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) - ' the type of media returned from api may change. - if LCase(tvshowsData.items[0].Type) = "series" - quickplay.multipleSeries(tvshowsData.items) - else - ' if first item is not a series, then assume they are all videos and/or episodes - quickplay.pushToQueue(tvshowsData.items) - end if - else - stopLoadingSpinner() - end if + quickplay.videoContainer(itemNode) else if collectionType = "musicvideos" ' get randomized list of videos inside data = api.users.GetItemsByQuery(m.global.session.user.id, { @@ -689,6 +710,10 @@ else stopLoadingSpinner() end if + else if collectionType = "movies" + quickplay.videoContainer(itemNode) + else if collectionType = "tvshows" + quickplay.videoContainer(itemNode) else stopLoadingSpinner() print "Quick Play CollectionFolder WARNING: Unknown collection type" From 1ababcff9abb12596107c3f2d54790c17649d48c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:53:48 +0000 Subject: [PATCH 59/82] Update dependency brighterscript to v0.65.11 --- package-lock.json | 50 ++++++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 69d8634a38..1b46d73f80 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@rokucommunity/bslint": "0.8.12", - "brighterscript": "0.65.10", + "brighterscript": "0.65.11", "brighterscript-jsdocs-plugin": "0.6.0", "clean-jsdoc-theme": "4.2.17", "jsdoc": "4.0.2", @@ -751,9 +751,9 @@ } }, "node_modules/brighterscript": { - "version": "0.65.10", - "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.65.10.tgz", - "integrity": "sha512-JGBkH6VDgTfwTMHtvauwUeR8XAotuhURbtr3r9+zaWU/KyO0jwSCLUnoNUjSmsz9ddnWe6KOY3NpR5vVG/iraA==", + "version": "0.65.11", + "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.65.11.tgz", + "integrity": "sha512-eoTqnfp3cuL6tgmqZ45zP0M4bljONBKLSA53W+UwKgPPuChC37mzjWKCpeoFgTfwhI0cL1dZNf6B9i1Pd/Uudw==", "dependencies": { "@rokucommunity/bslib": "^0.1.1", "@xml-tools/parser": "^1.0.7", @@ -778,7 +778,7 @@ "parse-ms": "^2.1.0", "readline": "^1.3.0", "require-relative": "^0.8.7", - "roku-deploy": "^3.10.5", + "roku-deploy": "^3.11.1", "serialize-error": "^7.0.1", "source-map": "^0.7.4", "vscode-languageserver": "7.0.0", @@ -1093,6 +1093,44 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/brighterscript/node_modules/roku-deploy": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.11.1.tgz", + "integrity": "sha512-ri3eJKGyPMexI+pwvBQxpi6I7I3z9670yOidTcVEohpbYhXpnaIHnKdLb2l87kuC+iTtIEsElgmx3fyEdI5Cjg==", + "dependencies": { + "chalk": "^2.4.2", + "dateformat": "^3.0.3", + "dayjs": "^1.11.0", + "fast-glob": "^3.2.12", + "fs-extra": "^7.0.1", + "is-glob": "^4.0.3", + "jsonc-parser": "^2.3.0", + "jszip": "^3.6.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.4", + "moment": "^2.29.1", + "parse-ms": "^2.1.0", + "postman-request": "^2.88.1-postman.32", + "temp-dir": "^2.0.0", + "xml2js": "^0.5.0" + }, + "bin": { + "roku-deploy": "dist/cli.js" + } + }, + "node_modules/brighterscript/node_modules/roku-deploy/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/brighterscript/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -5030,6 +5068,7 @@ "version": "3.10.5", "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.10.5.tgz", "integrity": "sha512-acSi9LKKE8cC1mXul2wNiw7++dxNEWJJCVBS9FJQY7LYaYQ4kQVnWuptjrZ5W8Mu8xhvhytdMVZZhoMCTUoKvQ==", + "dev": true, "dependencies": { "chalk": "^2.4.2", "dateformat": "^3.0.3", @@ -5055,6 +5094,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", diff --git a/package.json b/package.json index 85429e1f99..9c65a459ce 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "devDependencies": { "@rokucommunity/bslint": "0.8.12", - "brighterscript": "0.65.10", + "brighterscript": "0.65.11", "brighterscript-jsdocs-plugin": "0.6.0", "clean-jsdoc-theme": "4.2.17", "jsdoc": "4.0.2", From 383e61f230d9e5fb37b72d46b227f3712effde13 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Fri, 1 Dec 2023 23:05:15 -0500 Subject: [PATCH 60/82] Rewrite index tracking. Reduce/remove flicker. --- components/home/Home.bs | 11 +- components/home/Home.xml | 6 +- components/home/HomeRow.xml | 1 + components/home/HomeRows.bs | 590 ++++++++++++++++++++---------------- 4 files changed, 343 insertions(+), 265 deletions(-) diff --git a/components/home/Home.bs b/components/home/Home.bs index 5c1f39f352..33b3c86060 100644 --- a/components/home/Home.bs +++ b/components/home/Home.bs @@ -9,6 +9,10 @@ sub init() m.top.optionsAvailable = true m.postTask = createObject("roSGNode", "PostTask") + m.homeRows = m.top.findNode("homeRows") + + m.fadeInFocusBitmap = m.top.findNode("fadeInFocusBitmap") + if m.global.session.user.settings["ui.home.splashBackground"] = true m.backdrop = m.top.findNode("backdrop") m.backdrop.uri = buildURL("/Branding/Splashscreen?format=jpg&foregroundLayer=0.15&fillWidth=1280&width=1280&fillHeight=720&height=720&tag=splash") @@ -16,11 +20,14 @@ sub init() end sub sub refresh() - m.top.findNode("homeRows").callFunc("updateHomeRows") + m.homeRows.focusBitmapBlendColor = "0xFFFFFFFF" + m.homeRows.callFunc("updateHomeRows") end sub sub loadLibraries() - m.top.findNode("homeRows").callFunc("loadLibraries") + m.homeRows.focusBitmapBlendColor = "0xFFFFFF00" + m.homeRows.callFunc("loadLibraries") + m.fadeInFocusBitmap.control = "start" end sub ' JFScreen hook that gets ran as needed. diff --git a/components/home/Home.xml b/components/home/Home.xml index 9ce89fcf51..4e06e0013b 100644 --- a/components/home/Home.xml +++ b/components/home/Home.xml @@ -2,8 +2,12 @@ - + + + + + diff --git a/components/home/HomeRow.xml b/components/home/HomeRow.xml index c846e3f20d..8d1db2cc4a 100644 --- a/components/home/HomeRow.xml +++ b/components/home/HomeRow.xml @@ -2,6 +2,7 @@ + \ No newline at end of file diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index f3a4aa2c8a..d1b3be4135 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -1,6 +1,8 @@ import "pkg:/source/utils/misc.bs" import "pkg:/source/constants/HomeRowItemSizes.bs" +const FOCUS_RESIZE_WAIT_TIME = 2 + sub init() m.top.itemComponentName = "HomeItem" ' how many rows are visible on the screen @@ -11,9 +13,14 @@ sub init() m.top.showRowLabel = [true] m.top.rowLabelOffset = [0, 20] - m.top.showRowCounter = [true] + ' Hide the row counter to prevent flicker. We'll show it once loading timer fires + m.top.showRowCounter = [false] + + m.top.content = CreateObject("roSGNode", "ContentNode") - m.homeSections = {} + m.loadingTimer = createObject("roSGNode", "Timer") + m.loadingTimer.duration = FOCUS_RESIZE_WAIT_TIME + m.loadingTimer.observeField("fire", "loadingTimerComplete") updateSize() @@ -25,7 +32,7 @@ sub init() m.LoadLibrariesTask = createObject("roSGNode", "LoadItemsTask") m.LoadLibrariesTask.observeField("content", "onLibrariesLoaded") - ' set up tesk nodes for other rows + ' set up task nodes for other rows m.LoadContinueWatchingTask = createObject("roSGNode", "LoadItemsTask") m.LoadContinueWatchingTask.itemsToLoad = "continue" @@ -56,20 +63,21 @@ sub updateSize() ' spacing between items in a row m.top.rowItemSpacing = [20, 0] + ' Default size to wide poster, the most used size + m.top.rowItemSize = homeRowItemSizes.WIDE_POSTER + m.top.visible = true end sub ' processUserSections: Loop through user's chosen home section settings and generate the content for each row ' -' @return {dynamic} content node filled with child nodes for each row -function processUserSections() as dynamic +sub processUserSections() loadedSections = 0 - content = CreateObject("roSGNode", "ContentNode") ' Add sections in order based on user settings for i = 0 to 6 sectionName = LCase(m.global.session.user.settings["homesection" + i.toStr()]) - sectionLoaded = addHomeSection(content, sectionName) + sectionLoaded = addHomeSection(sectionName) ' Count how many sections with data are loaded if sectionLoaded then loadedSections++ @@ -83,12 +91,12 @@ function processUserSections() as dynamic end if end for - ' Favorites isn't an option on Web settings, so we must manually add it for now - addHomeSection(content, "favorites") - - return content -end function + ' Favorites isn't an option in Web settings, so we manually add it to the end for now + addHomeSection("favorites") + ' Start the timer for creating the content rows before we set the cursor size + m.loadingTimer.control = "start" +end sub ' onLibrariesLoaded: Handler when LoadLibrariesTask returns data ' @@ -98,126 +106,159 @@ sub onLibrariesLoaded() m.LoadLibrariesTask.unobserveField("content") m.LoadLibrariesTask.content = [] - content = processUserSections() - - setRowItemSizes() - - m.top.content = content + processUserSections() end sub -' Removes a home section from the home rows -sub removeHomeSection(sectionType as string) - sectionName = LCase(sectionType) - - removedSection = m.homeSections[sectionName] +' getOriginalSectionIndex: Gets the index of a section from user settings and adds count of currently known latest media sections +' +' @param {string} sectionName - Name of section we're looking up +' +' @return {integer} indicating index of section taking latest media sections into account +function getOriginalSectionIndex(sectionName as string) as integer + searchSectionName = LCase(sectionName).Replace(" ", "") - if not isValid(removedSection) then return - if not isValid(removedSection.index) then return + sectionIndex = 0 + indexLatestMediaSection = 0 - m.homeSections.Delete(sectionName) + for i = 0 to 6 + settingSectionName = LCase(m.global.session.user.settings["homesection" + i.toStr()]) + if settingSectionName = "latestmedia" + indexLatestMediaSection = i + end if - for each section in m.homeSections - if m.homeSections[section].index > removedSection.index - m.homeSections[section].index-- + if settingSectionName = searchSectionName + sectionIndex = i end if end for - m.top.content.removeChildIndex(removedSection.index) + ' If the latest media section is before the section we're searching for, then we need to account for how many latest media rows there are + addLatestMediaSectionCount = (indexLatestMediaSection < sectionIndex) + + if addLatestMediaSectionCount + for i = sectionIndex to m.top.content.getChildCount() - 1 + sectionToTest = m.top.content.getChild(i) + if LCase(Left(sectionToTest.title, 6)) = "latest" + sectionIndex++ + end if + end for + end if + + return sectionIndex +end function + +' removeHomeSection: Removes a home section from the home rows +' +' @param {string} sectionToRemove - Title property of section we're removing +sub removeHomeSection(sectionTitleToRemove as string) + if not isValid(sectionTitleToRemove) then return + + sectionTitle = LCase(sectionTitleToRemove).Replace(" ", "") + if not sectionExists(sectionTitle) then return + + sectionIndexToRemove = getSectionIndex(sectionTitle) - setRowItemSizes() + m.top.content.removeChildIndex(sectionIndexToRemove) end sub -' setRowItemSizes: Loops through all home sections and sets the correct item sizes per row +' setRowItemSize: Loops through all home sections and sets the correct item sizes per row ' -sub setRowItemSizes() - newSizeArray = CreateObject("roArray", m.homeSections.count(), false) +sub setRowItemSize() + if not isValid(m.top.content) then return - for each section in m.homeSections - newSizeArray[m.homeSections[section].index] = m.homeSections[section].imagesize + homeSections = m.top.content.getChildren(-1, 0) + newSizeArray = CreateObject("roArray", homeSections.count(), false) + + for i = 0 to homeSections.count() - 1 + newSizeArray[i] = isValid(homeSections[i].cursorSize) ? homeSections[i].cursorSize : homeRowItemSizes.WIDE_POSTER end for m.top.rowItemSize = newSizeArray end sub -' Adds a new home section to the home rows. -' Returns a boolean indicating whether the section was handled. -function addHomeSection(content as dynamic, sectionName as string) as boolean +' loadingTimerComplete: Event handler for when loading wait time has expired +' +sub loadingTimerComplete() + ' Show the row counter to prevent flicker + m.top.showRowCounter = [true] +end sub + +' addHomeSection: Adds a new home section to the home rows. +' +' @param {string} sectionType - Type of section to add +' @return {boolean} indicating if the section was handled +function addHomeSection(sectionType as string) as boolean ' Poster size library items - if sectionName = "livetv" - createLiveTVRow(content) + if sectionType = "livetv" + createLiveTVRow() return true end if ' Poster size library items - if sectionName = "smalllibrarytiles" - createLibraryRow(content) + if sectionType = "smalllibrarytiles" + createLibraryRow() return true end if ' Continue Watching items - if sectionName = "resume" - createContinueWatchingRow(content) + if sectionType = "resume" + createContinueWatchingRow() return true end if ' Next Up items - if sectionName = "nextup" - createNextUpRow(content) + if sectionType = "nextup" + createNextUpRow() return true end if ' Latest items in each library - if sectionName = "latestmedia" - createLatestInRows(content) + if sectionType = "latestmedia" + createLatestInRows() return true end if ' Favorite Items - if sectionName = "favorites" - createFavoritesRow(content) + if sectionType = "favorites" + createFavoritesRow() return true end if return false end function -' Create a row displaying the user's libraries -sub createLibraryRow(content as dynamic) +' createLibraryRow: Creates a row displaying the user's libraries +' +sub createLibraryRow() ' Ensure we have data if not isValidAndNotEmpty(m.libraryData) then return - mediaRow = content.CreateChild("HomeRow") - mediaRow.title = tr("My Media") - - sectionIndex = m.homeSections.count() - - isUpdate = false - - if m.homeSections.doesExist("library") - sectionIndex = m.homeSections.library.index - isUpdate = true - end if + sectionName = tr("My Media") - m.homeSections.AddReplace("library", { - imageSize: homeRowItemSizes.WIDE_POSTER, - index: sectionIndex - }) + row = CreateObject("roSGNode", "HomeRow") + row.title = sectionName + row.imageWidth = homeRowItemSizes.WIDE_POSTER[0] + row.cursorSize = homeRowItemSizes.WIDE_POSTER filteredMedia = filterNodeArray(m.libraryData, "id", m.global.session.user.configuration.MyMediaExcludes) for each item in filteredMedia - mediaRow.appendChild(item) + row.appendChild(item) end for - if isUpdate - m.top.content.replaceChild(mediaRow, m.homeSections.library.index) + ' Row already exists, replace it with new content + if sectionExists(sectionName) + m.top.content.replaceChild(row, getSectionIndex(sectionName)) + setRowItemSize() return end if - content.appendChild(mediaRow) + ' Row does not exist, insert it into the home view + m.top.content.insertChild(row, getOriginalSectionIndex("smalllibrarytiles")) + setRowItemSize() end sub -' Create a row displaying latest items in each of the user's libraries -sub createLatestInRows(content as dynamic) +' createLatestInRows: Creates a row displaying latest items in each of the user's libraries +' +sub createLatestInRows() ' Ensure we have data if not isValidAndNotEmpty(m.libraryData) then return @@ -226,29 +267,21 @@ sub createLatestInRows(content as dynamic) for each lib in filteredLatest if lib.collectionType <> "boxsets" and lib.collectionType <> "livetv" and lib.json.CollectionType <> "Program" - sectionName = "latestin" + LCase(lib.name).Replace(" ", "") + if not sectionExists(tr("Latest in") + " " + lib.name + " >") + imagesize = homeRowItemSizes.WIDE_POSTER - if not m.homeSections.doesExist(sectionName) - latestInRow = content.CreateChild("HomeRow") - latestInRow.title = tr("Latest in") + " " + lib.name + " >" - sectionIndex = m.homeSections.count() - else - sectionIndex = m.homeSections[sectionName].index - end if - - imagesize = homeRowItemSizes.WIDE_POSTER + if LCase(lib.collectionType) = "movies" + imagesize = homeRowItemSizes.MOVIE_POSTER + else if LCase(lib.collectionType) = "music" + imagesize = homeRowItemSizes.MUSIC_ALBUM + end if - if LCase(lib.collectionType) = "movies" - imagesize = homeRowItemSizes.MOVIE_POSTER - else if LCase(lib.collectionType) = "music" - imagesize = homeRowItemSizes.MUSIC_ALBUM + row = CreateObject("roSGNode", "HomeRow") + row.title = tr("Latest in") + " " + lib.name + " >" + row.imageWidth = imagesize[0] + row.cursorSize = imagesize end if - m.homeSections.AddReplace(sectionName, { - imageSize: imagesize, - index: sectionIndex - }) - loadLatest = createObject("roSGNode", "LoadItemsTask") loadLatest.itemsToLoad = "latest" loadLatest.itemId = lib.id @@ -263,101 +296,105 @@ sub createLatestInRows(content as dynamic) end for end sub -' Create a row displaying the live tv now on section -sub createLiveTVRow(content as dynamic) - if not m.homeSections.doesExist("livetv") - contentRow = content.CreateChild("HomeRow") - contentRow.title = tr("On Now") - end if +' sectionExists: Checks if passed section exists in home row content +' +' @param {string} sectionTitle - Title of section we're checking for +' +' @return {boolean} indicating if the section currently exists in the home row content +function sectionExists(sectionTitle as string) as boolean + if not isValid(sectionTitle) then return false + if not isValid(m.top.content) then return false - sectionIndex = m.homeSections.count() + searchSectionTitle = LCase(sectionTitle).Replace(" ", "") - if m.homeSections.doesExist("livetv") - sectionIndex = m.homeSections.livetv.index - end if + homeSections = m.top.content.getChildren(-1, 0) + + for each section in homeSections + if LCase(section.title).Replace(" ", "") = searchSectionTitle + return true + end if + end for - m.homeSections.AddReplace("livetv", { - imageSize: homeRowItemSizes.WIDE_POSTER, - index: sectionIndex - }) + return false +end function - m.LoadOnNowTask.observeField("content", "updateOnNowItems") - m.LoadOnNowTask.control = "RUN" -end sub +' getSectionIndex: Returns index of requested section in home row content +' +' @param {string} sectionTitle - Title of section we're checking for +' +' @return {integer} indicating index of request section +function getSectionIndex(sectionTitle as string) as integer + if not isValid(sectionTitle) then return false + if not isValid(m.top.content) then return false -' Create a row displaying items the user can continue watching -sub createContinueWatchingRow(content as dynamic) - if not m.homeSections.doesExist("resume") - continueWatchingRow = content.CreateChild("HomeRow") - continueWatchingRow.title = tr("Continue Watching") - end if - sectionIndex = m.homeSections.count() + searchSectionTitle = LCase(sectionTitle).Replace(" ", "") - if m.homeSections.doesExist("resume") - sectionIndex = m.homeSections.resume.index - end if + homeSections = m.top.content.getChildren(-1, 0) - m.homeSections.AddReplace("resume", { - imageSize: homeRowItemSizes.WIDE_POSTER, - index: sectionIndex - }) + sectionIndex = homeSections.count() + i = 0 + for each section in homeSections + if LCase(section.title).Replace(" ", "") = searchSectionTitle + sectionIndex = i + exit for + end if + i++ + end for + + return sectionIndex +end function + +' createLiveTVRow: Creates a row displaying the live tv now on section +' +sub createLiveTVRow() + m.LoadOnNowTask.observeField("content", "updateOnNowItems") + m.LoadOnNowTask.control = "RUN" +end sub + +' createContinueWatchingRow: Creates a row displaying items the user can continue watching +' +sub createContinueWatchingRow() ' Load the Continue Watching Data m.LoadContinueWatchingTask.observeField("content", "updateContinueWatchingItems") m.LoadContinueWatchingTask.control = "RUN" end sub -' Create a row displaying next episodes up to watch -sub createNextUpRow(content as dynamic) - if not m.homeSections.doesExist("nextup") - nextUpRow = content.CreateChild("HomeRow") - nextUpRow.title = tr("Next Up >") - end if - sectionIndex = m.homeSections.count() - - if m.homeSections.doesExist("nextup") - sectionIndex = m.homeSections.nextup.index +' createNextUpRow: Creates a row displaying next episodes up to watch +' +sub createNextUpRow() + sectionName = tr("Next Up") + ">" + + if not sectionExists(sectionName) + nextUpRow = m.top.content.CreateChild("HomeRow") + nextUpRow.title = sectionName + nextUpRow.imageWidth = homeRowItemSizes.WIDE_POSTER[0] + nextUpRow.cursorSize = homeRowItemSizes.WIDE_POSTER end if - m.homeSections.AddReplace("nextup", { - imageSize: homeRowItemSizes.WIDE_POSTER, - index: sectionIndex - }) - ' Load the Next Up Data m.LoadNextUpTask.observeField("content", "updateNextUpItems") m.LoadNextUpTask.control = "RUN" end sub -' Create a row displaying items from the user's favorites list -sub createFavoritesRow(content as dynamic) - if not m.homeSections.doesExist("favorites") - favoritesRow = content.CreateChild("HomeRow") - favoritesRow.title = tr("Favorites") - end if - - sectionIndex = m.homeSections.count() - - if m.homeSections.doesExist("favorites") - sectionIndex = m.homeSections.favorites.index - end if - - m.homeSections.AddReplace("favorites", { - imageSize: homeRowItemSizes.WIDE_POSTER, - index: sectionIndex - }) - +' createFavoritesRow: Creates a row displaying items from the user's favorites list +' +sub createFavoritesRow() ' Load the Favorites Data m.LoadFavoritesTask.observeField("content", "updateFavoritesItems") m.LoadFavoritesTask.control = "RUN" end sub -' Update home row data +' updateHomeRows: Update function exposed to outside components +' sub updateHomeRows() + ' Hide the row counter to prevent flicker. We'll show it once loading timer fires + m.top.showRowCounter = [false] processUserSections() - setRowItemSizes() end sub +' updateFavoritesItems: Processes LoadFavoritesTask content. Removes, Creates, or Updates favorites row as needed +' sub updateFavoritesItems() itemData = m.LoadFavoritesTask.content m.LoadFavoritesTask.unobserveField("content") @@ -365,44 +402,43 @@ sub updateFavoritesItems() if itemData = invalid then return - rowIndex = m.homeSections.favorites.index + sectionName = tr("Favorites") if itemData.count() < 1 - removeHomeSection("favorites") + removeHomeSection(sectionName) return - else - ' remake row using the new data - row = CreateObject("roSGNode", "HomeRow") - row.title = tr("Favorites") - - for each item in itemData - usePoster = true + end if - if lcase(item.type) = "episode" or lcase(item.type) = "audio" or lcase(item.type) = "musicartist" - usePoster = false - end if + ' remake row using the new data + row = CreateObject("roSGNode", "HomeRow") + row.title = sectionName + row.imageWidth = homeRowItemSizes.WIDE_POSTER[0] + row.cursorSize = homeRowItemSizes.WIDE_POSTER - item.usePoster = usePoster - item.imageWidth = row.imageWidth - row.appendChild(item) - end for + for each item in itemData + usePoster = true - if isValid(m.top.content.getChild(rowIndex)) - m.top.content.replaceChild(row, rowIndex) - else + if lcase(item.type) = "episode" or lcase(item.type) = "audio" or lcase(item.type) = "musicartist" + usePoster = false + end if - for each section in m.homeSections - if m.homeSections[section].index >= m.top.content.getChildCount() - m.homeSections[section].index++ - end if - end for + item.usePoster = usePoster + item.imageWidth = row.imageWidth + row.appendChild(item) + end for - m.homeSections.favorites.index = m.top.content.getChildCount() - m.top.content.insertChild(row, m.top.content.getChildCount()) - end if + if sectionExists(sectionName) + m.top.content.replaceChild(row, getSectionIndex(sectionName)) + setRowItemSize() + return end if + + m.top.content.insertChild(row, getSectionIndex(sectionName)) + setRowItemSize() end sub +' updateContinueWatchingItems: Processes LoadContinueWatchingTask content. Removes, Creates, or Updates continue watching row as needed +' sub updateContinueWatchingItems() itemData = m.LoadContinueWatchingTask.content m.LoadContinueWatchingTask.unobserveField("content") @@ -410,14 +446,20 @@ sub updateContinueWatchingItems() if itemData = invalid then return + sectionName = tr("Continue Watching") + if itemData.count() < 1 - removeHomeSection("resume") + removeHomeSection(sectionName) return end if + sectionName = tr("Continue Watching") + ' remake row using the new data row = CreateObject("roSGNode", "HomeRow") - row.title = tr("Continue Watching") + row.title = sectionName + row.imageWidth = homeRowItemSizes.WIDE_POSTER[0] + row.cursorSize = homeRowItemSizes.WIDE_POSTER for each item in itemData if isValid(item.json) and isValid(item.json.UserData) and isValid(item.json.UserData.PlayedPercentage) @@ -429,10 +471,20 @@ sub updateContinueWatchingItems() row.appendChild(item) end for - ' replace the old row - m.top.content.replaceChild(row, m.homeSections.resume.index) + ' Row already exists, replace it with new content + if sectionExists(sectionName) + m.top.content.replaceChild(row, getSectionIndex(sectionName)) + setRowItemSize() + return + end if + + ' Row does not exist, insert it into the home view + m.top.content.insertChild(row, getOriginalSectionIndex("resume")) + setRowItemSize() end sub +' updateNextUpItems: Processes LoadNextUpTask content. Removes, Creates, or Updates next up row as needed +' sub updateNextUpItems() itemData = m.LoadNextUpTask.content m.LoadNextUpTask.unobserveField("content") @@ -441,24 +493,40 @@ sub updateNextUpItems() if itemData = invalid then return + sectionName = tr("Next Up") + " >" + if itemData.count() < 1 - removeHomeSection("nextup") + removeHomeSection(sectionName) return - else - ' remake row using the new data - row = CreateObject("roSGNode", "HomeRow") - row.title = tr("Next Up") + " >" - for each item in itemData - item.usePoster = row.usePoster - item.imageWidth = row.imageWidth - row.appendChild(item) - end for + end if + + ' remake row using the new data + row = CreateObject("roSGNode", "HomeRow") + row.title = tr("Next Up") + " >" + row.imageWidth = homeRowItemSizes.WIDE_POSTER[0] + row.cursorSize = homeRowItemSizes.WIDE_POSTER - ' replace the old row - m.top.content.replaceChild(row, m.homeSections.nextup.index) + for each item in itemData + item.usePoster = row.usePoster + item.imageWidth = row.imageWidth + row.appendChild(item) + end for + + ' Row already exists, replace it with new content + if sectionExists(sectionName) + m.top.content.replaceChild(row, getSectionIndex(sectionName)) + setRowItemSize() + return end if + + ' Row does not exist, insert it into the home view + m.top.content.insertChild(row, getSectionIndex(sectionName)) + setRowItemSize() end sub +' updateLatestItems: Processes LoadItemsTask content. Removes, Creates, or Updates latest in {library} row as needed +' +' @param {dynamic} msg - LoadItemsTask sub updateLatestItems(msg) itemData = msg.GetData() @@ -468,55 +536,46 @@ sub updateLatestItems(msg) if itemData = invalid then return - sectionName = "latestin" + LCase(node.metadata.title).Replace(" ", "") + sectionName = tr("Latest in") + " " + node.metadata.title + " >" if itemData.count() < 1 removeHomeSection(sectionName) return - else - ' remake row using new data - row = CreateObject("roSGNode", "HomeRow") - row.title = tr("Latest in") + " " + node.metadata.title + " >" - row.usePoster = true - - for each item in itemData - item.usePoster = row.usePoster - item.imageWidth = m.homeSections[sectionName].imageSize[0] - row.appendChild(item) - end for - - rowIndex = m.homeSections[sectionName].index - - if isValid(rowIndex) and isValid(m.top.content.getChild(rowIndex)) - ' Replace the old row - m.top.content.replaceChild(row, rowIndex) - else - firstLatestHomeSectionIndex = m.homeSections.count() - 1 - - for each section in m.homeSections - if LCase(Left(section, 6)) = "latest" - if m.homeSections[section].index < firstLatestHomeSectionIndex - firstLatestHomeSectionIndex = m.homeSections[section].index - end if - end if - end for + end if - for each section in m.homeSections - if m.homeSections[section].index >= firstLatestHomeSectionIndex - m.homeSections[section].index++ - end if - end for + imagesize = homeRowItemSizes.WIDE_POSTER - m.homeSections[sectionName].index = firstLatestHomeSectionIndex - m.top.content.insertChild(row, firstLatestHomeSectionIndex) - end if + if LCase(node.metadata.contentType) = "movies" + imagesize = homeRowItemSizes.MOVIE_POSTER + else if LCase(node.metadata.contentType) = "music" + imagesize = homeRowItemSizes.MUSIC_ALBUM + end if - setRowItemSizes() + ' remake row using new data + row = CreateObject("roSGNode", "HomeRow") + row.title = sectionName + row.imageWidth = imagesize[0] + row.cursorSize = imagesize + for each item in itemData + item.usePoster = row.usePoster + item.imageWidth = row.imageWidth + row.appendChild(item) + end for + if sectionExists(sectionName) + ' Row already exists, replace it with new content + m.top.content.replaceChild(row, getSectionIndex(sectionName)) + setRowItemSize() + return end if + + m.top.content.insertChild(row, getOriginalSectionIndex("latestmedia")) + setRowItemSize() end sub +' updateOnNowItems: Processes LoadOnNowTask content. Removes, Creates, or Updates latest in on now row as needed +' sub updateOnNowItems() itemData = m.LoadOnNowTask.content m.LoadOnNowTask.unobserveField("content") @@ -524,37 +583,44 @@ sub updateOnNowItems() if itemData = invalid then return + sectionName = tr("On Now") + if itemData.count() < 1 - removeHomeSection("livetv") + removeHomeSection(sectionName) return - else - ' remake row using the new data - row = CreateObject("roSGNode", "HomeRow") - row.title = tr("On Now") - row.imageWidth = homeRowItemSizes.WIDE_POSTER[0] - for each item in itemData - row.usePoster = false - - if (not isValid(item.thumbnailURL) or item.thumbnailURL = "") and isValid(item.json) and isValid(item.json.imageURL) - item.thumbnailURL = item.json.imageURL - row.usePoster = true - row.imageWidth = homeRowItemSizes.MOVIE_POSTER[0] - - m.homeSections.livetv.imageSize = homeRowItemSizes.MOVIE_POSTER - end if + end if - item.usePoster = row.usePoster - item.imageWidth = row.imageWidth - row.appendChild(item) - end for + ' remake row using the new data + row = CreateObject("roSGNode", "HomeRow") + row.title = tr("On Now") + row.imageWidth = homeRowItemSizes.WIDE_POSTER[0] + row.cursorSize = homeRowItemSizes.WIDE_POSTER - ' replace the old row - m.top.content.replaceChild(row, m.homeSections.livetv.index) + for each item in itemData + row.usePoster = false - ' We may now have different poster sizes. Reset the row item sizes - setRowItemSizes() + if (not isValid(item.thumbnailURL) or item.thumbnailURL = "") and isValid(item.json) and isValid(item.json.imageURL) + item.thumbnailURL = item.json.imageURL + row.usePoster = true + row.imageWidth = homeRowItemSizes.MOVIE_POSTER[0] + row.cursorSize = homeRowItemSizes.MOVIE_POSTER + end if + item.usePoster = row.usePoster + item.imageWidth = row.imageWidth + row.appendChild(item) + end for + + ' Row already exists, replace it with new content + if sectionExists(sectionName) + m.top.content.replaceChild(row, getSectionIndex(sectionName)) + setRowItemSize() + return end if + + ' Row does not exist, insert it into the home view + m.top.content.insertChild(row, getOriginalSectionIndex("livetv")) + setRowItemSize() end sub sub itemSelected() From 9cea33dbc7b13dc7d00f422a6ce7021f43bde474 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 2 Dec 2023 08:29:42 -0500 Subject: [PATCH 61/82] Removed dead code. Fix Latest in TV Shows posters --- components/home/HomeRows.bs | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index d1b3be4135..a4f09e4540 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -266,22 +266,6 @@ sub createLatestInRows() filteredLatest = filterNodeArray(m.libraryData, "id", m.global.session.user.configuration.LatestItemsExcludes) for each lib in filteredLatest if lib.collectionType <> "boxsets" and lib.collectionType <> "livetv" and lib.json.CollectionType <> "Program" - - if not sectionExists(tr("Latest in") + " " + lib.name + " >") - imagesize = homeRowItemSizes.WIDE_POSTER - - if LCase(lib.collectionType) = "movies" - imagesize = homeRowItemSizes.MOVIE_POSTER - else if LCase(lib.collectionType) = "music" - imagesize = homeRowItemSizes.MUSIC_ALBUM - end if - - row = CreateObject("roSGNode", "HomeRow") - row.title = tr("Latest in") + " " + lib.name + " >" - row.imageWidth = imagesize[0] - row.cursorSize = imagesize - end if - loadLatest = createObject("roSGNode", "LoadItemsTask") loadLatest.itemsToLoad = "latest" loadLatest.itemId = lib.id @@ -556,6 +540,7 @@ sub updateLatestItems(msg) row.title = sectionName row.imageWidth = imagesize[0] row.cursorSize = imagesize + row.usePoster = true for each item in itemData item.usePoster = row.usePoster From 551df567e70282f21be864f3016dd5b86ad3ce6b Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 2 Dec 2023 08:47:35 -0500 Subject: [PATCH 62/82] Rename loading timer const --- components/home/HomeRows.bs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index a4f09e4540..a672783dc3 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -1,7 +1,7 @@ import "pkg:/source/utils/misc.bs" import "pkg:/source/constants/HomeRowItemSizes.bs" -const FOCUS_RESIZE_WAIT_TIME = 2 +const LOADING_WAIT_TIME = 2 sub init() m.top.itemComponentName = "HomeItem" @@ -19,7 +19,7 @@ sub init() m.top.content = CreateObject("roSGNode", "ContentNode") m.loadingTimer = createObject("roSGNode", "Timer") - m.loadingTimer.duration = FOCUS_RESIZE_WAIT_TIME + m.loadingTimer.duration = LOADING_WAIT_TIME m.loadingTimer.observeField("fire", "loadingTimerComplete") updateSize() From b9a15fde8cabe6cd9485ead40543c02a687a91c9 Mon Sep 17 00:00:00 2001 From: Kristopher Roller Date: Sat, 2 Dec 2023 18:01:46 +0000 Subject: [PATCH 63/82] Translated using Weblate (German) Currently translated at 76.1% (208 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/de/ --- locale/de_DE/translations.ts | 418 +++++++++++++++++++++++++++++++++++ 1 file changed, 418 insertions(+) diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts index bcfa5dc52c..cba1eb2cdd 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -13511,5 +13511,423 @@ Der gewünschte Inhalt existiert nicht auf dem Server Content of message box when the requested content is not found on the server + + Support Direct Play of MPEG-2 content (e.g., Live TV). This will prevent transcoding of MPEG-2 content, but uses significantly more bandwidth. + Unterstützung für das direkte Abspielen von MPEG-2-Inhalten (z.B. Live-TV). Dadurch wird das Transcodieren von MPEG-2-Inhalten vermieden, es wird jedoch erheblich mehr Bandbreite verwendet. + Settings Menu - Description for option + + + MPEG-4 + MPEG-4 + Name of codec used in settings menu + + + Support Direct Play of MPEG-4 content. This may need to be disabled for playback of DIVX encoded video files. + Unterstützung für das direkte Abspielen von MPEG-4-Inhalten. Dies muss möglicherweise deaktiviert werden, um DIVX-codierte Videodateien abzuspielen. + Settings Menu - Description for option + + + User Interface + Benutzeroberfläche + Title for User Interface section in user setting screen. + + + Set Watched + Gesehen setzen + Button Text - When pressed, marks item as Warched + + + Use voice remote to search + Sprachfernbedienung zur Suche verwenden + Help text in search voice text box + + + Search now + Jetzt suchen + Help text in search Box + + + %1 of %2 + %1 von %2 + Item position and count. %1 = current item. %2 = total number of items + + + Networks + Netzwerke + + + Studios + Studios + + + Hide Taglines + Slogans ausblenden + Option Title in user setting screen + + + Hides tagline text on details pages. + Blendet Slogan-Text auf Detailseiten aus. + + + Media Grid + Mediengitter + UI -> Media Grid section in user setting screen. + + + Shows + Sendungen + + + Use generated splashscreen image as Jellyfin's home background. Jellyfin will need to be closed and reopened for change to take effect. + Verwende das generierte Splashscreen-Bild als Hintergrund für die Startseite von Jellyfin. Jellyfin muss geschlossen und erneut geöffnet werden, damit die Änderung wirksam wird. + Description for option in Setting Screen + + + Reason + Grund + + + Video Codec + Video-Codec + + + direct + direkt + + + Bring the theater experience straight to your living room with the ability to play custom intros before the main feature. + Holen Sie sich das Theatererlebnis direkt ins Wohnzimmer mit der Möglichkeit, individuelle Einleitungen vor dem Hauptfilm abzuspielen. + Settings Menu - Description for option + + + Aired + Ausgestrahlt + Aired date label + + + Cinema Mode + Kinomodus + Settings Menu - Title for option + + + Play Trailer + Trailer abspielen + + + Attempt Direct Play for H.264 media with unsupported profile levels before falling back to transcoding if it fails. + Versuche, Direct Play für H.264-Medien mit nicht unterstützten Profilleveln zu nutzen, bevor auf Transkodierung zurückgegriffen wird, falls dies fehlschlägt. + Settings Menu - Description for option + + + Attempt Direct Play for HEVC media with unsupported profile levels before falling back to transcoding if it fails. + Versuche, Direct Play für HEVC-Medien mit nicht unterstützten Profilleveln zu nutzen, bevor auf Transkodierung zurückgegriffen wird, falls dies fehlschlägt. + Settings Menu - Description for option + + + Audio Codec + Audio-Code + + + Total Bitrate + Gesamtbitrate + + + Audio Channels + Audiokanäle + + + WxH + Breite mal Höhe + Video width x height + + + Unable to find any albums or songs belonging to this artist + Es konnten keine Alben oder Lieder dieses Künstlers gefunden werden. + Popup message when we find no audio data for an artist + + + Custom Subtitles + Benutzerdefinierte Untertitel + Name of a setting - custom subtitles that support CJK fonts + + + Replace Roku's default subtitle functions with custom functions that support CJK fonts. Fallback fonts must be configured and enabled on the server for CJK rendering to work. + Ersetzen Sie die standardmäßigen Untertitelfunktionen von Roku durch benutzerdefinierte Funktionen, die CJK-Schriftarten unterstützen. Ersatzschriftarten müssen auf dem Server konfiguriert und aktiviert sein, damit die CJK-Darstellung funktioniert. + Description of a setting - custom subtitles that support CJK fonts + + + Slideshow Off + Diashow aus + + + Slideshow On + Diashow an + + + Slideshow Paused + Diashow pausiert + + + Parental Ratings + Altersfreigaben + Used in Filter menu + + + Years + Jahre + Used in Filter menu + + + Show What's New Popup + Zeige Popup für Neue Funktionen + Settings Menu - Title for option + + + Enabled + Aktiviert + + + Hide Clock + Uhr ausblenden + Option Title in user setting screen + + + Go to episode + Zur Folge gehen + Continue Watching Popup Menu - Navigate to the Episode Detail Page + + + Options for TV Shows. + Optionen für TV-Sendungen + Description for TV Shows user settings. + + + HEVC + HEVC + Name of codec used in settings menu + + + H.264 + H.264 + Name of codec used in settings menu + + + Media Grid options. + Mediengitter-Optionen + + + Design Elements + Gestaltungselemente + + + Random On + Zufall an + + + Show item count in the library and index of selected item. + Zeige die Anzahl der Elemente in der Bibliothek und den Index des ausgewählten Elements. + Description for option in Setting Screen + + + Item Count + Anzahl der Elemente + UI -> Media Grid -> Item Count in user setting screen. + + + (Dialog will close automatically) + (Dialog wird automatisch geschlossen) + + + Quick Connect + Schnellverbindung + + + Use the replay button to slowly animate to the first item in the folder. (If disabled, the folder will reset to the first item immediately). + Verwenden Sie die Wiederholungstaste, um langsam zum ersten Element im Ordner zu animieren. (Wenn deaktiviert, wird der Ordner sofort auf das erste Element zurückgesetzt). + Description for option in Setting Screen + + + Use Splashscreen as Home Background + Verwende den Splashscreen als Hintergrund für die Startseite + Option Title in user setting screen + + + Go directly to the episode list if a TV series has only one season. + Gehen Sie direkt zur Episodenliste, wenn eine TV-Serie nur eine Staffel hat. + Settings Menu - Description for option + + + Next episode + Nächste Episode + + + Settings relating to playback and supported codec and media types. + Einstellungen im Zusammenhang mit der Wiedergabe und unterstützten Codecs und Medientypen. + + + Set the maximum amount of days a show should stay in the 'Next Up' list without watching it. + Setzen Sie die maximale Anzahl von Tagen, die eine Sendung in der 'Als nächstes' Liste bleiben soll, ohne sie anzusehen. + Settings Menu - Description for option + + + Settings relating to how the application looks. + Einstellungen, die sich darauf beziehen, wie die Anwendung aussieht. + + + Playback Information + Wiedergabeinformationen + + + Transcoding Information + Transkodierungsinformationen + + + Codec + Codec + + + Codec Tag + Codec-Tag + + + Bit Rate + Bitrate + Video streaming bit rate + + + Stream Information + Stream-Informationen + + + Container + Container + Video streaming container + + + Size + Größe + Video size + + + Video range type + Videobereichstyp + + + Pixel format + Pixel-Forma + Video pixel format + + + Text Subtitles Only + Nur Text-Untertitel + Name of a setting - should we hide subtitles that might transcode + + + all + alle + all will reset the searchTerm so all data will be availible + + + Random Off + Zufall aus + + + MPEG-4 Support + MPEG-4-Unterstützung + Settings Menu - Title for option + + + Slideshow Resumed + Diashow fortgesetzt + + + Unplayed + Unabgespielt + + + Played + Abgespielt + + + You can search for Titles, People, Live TV Channels and more + Sie können nach Titeln, Personen, Live-TV-Kanälen und mehr suchen. + Help text in search results + + + Options that alter the design of Jellyfin. + Optionen, die das Design von Jellyfin verändern. + Description for Design Elements user settings. + + + Skip Details for Single Seasons + Details für einzelne Staffeln überspringen + Settings Menu - Title for option + + + Hide all clocks in Jellyfin. Jellyfin will need to be closed and reopened for changes to take effect. + Alle Uhren in Jellyfin ausblenden. Jellyfin muss geschlossen und erneut geöffnet werden, damit die Änderungen wirksam werden. + Settings Menu - Description for option + + + Go to season + Zur Staffel gehen + Continue Watching Popup Menu - Navigate to the Season Page + + + Set Favorite + Favorit festlegen + Button Text - When pressed, sets item as Favorite + + + Level + Niveau + Video profile level + + + Here is your Quick Connect code: + Hier ist Ihr Schnellverbindungscode: + + + Blur images of unwatched episodes. + Bilder von nicht angesehenen Episoden verwischen. + + + Blur Unwatched Episodes + Unangesehene Episoden verwischen + Option Title in user setting screen + + + Only display text subtitles to minimize transcoding. + Nur Text-Untertitel anzeigen, um die Transkodierung zu minimieren. + Description of a setting - should we hide subtitles that might transcode + + + Show What's New popup when Jellyfin is updated to a new version. + Zeige Popup für Neue Funktionen, wenn Jellyfin auf eine neue Version aktualisiert wird. + Settings Menu - Description for option + + + Disabled + Deaktiviert + + + Go to series + Zur Serie gehen + Continue Watching Popup Menu - Navigate to the Series Detail Page + + + There was an error authenticating via Quick Connect. + Bei der Authentifizierung über Quick Connect ist ein Fehler aufgetreten. + + + Return to Top + Zurück zum Anfang + UI -> Media Grid -> Item Title in user setting screen. + + + Max Days Next Up + Maximale Tage bis zum Nächsten + Option Title in user setting screen + From e88356afcfa65301c5ac5b66e1bf5a78e823984d Mon Sep 17 00:00:00 2001 From: Kristopher Roller Date: Sat, 2 Dec 2023 22:19:24 +0000 Subject: [PATCH 64/82] Translated using Weblate (German) Currently translated at 84.9% (232 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/de/ --- locale/de_DE/translations.ts | 100 +++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts index cba1eb2cdd..28604d91dd 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -13929,5 +13929,105 @@ Maximale Tage bis zum Nächsten Option Title in user setting screen + + Movie Library Default View + Standardansicht für Filmbibliothek + Settings Menu - Title for option + + + Default view for Movie Libraries. + Standardansicht für Filmbibliotheken + Settings Menu - Description for option + + + Item Titles + Titel der Elemente + Title of a setting - when should we show the title text of a grid item + + + Select when to show titles. + Wählen Sie aus, wann die Titel angezeigt werden sollen. + Settings Menu - Description for option + + + Always Show + Immer anzeigen + + + Configure the maximum playback bitrate. + Die maximale Wiedergabe-Bitrate konfigurieren. + + + Resumable + Fortsetzbar + + + Show On Hover + Bei Hover anzeigen + + + Artists (Presentation) + Künstler (Präsentation) + + + Album Artists (Presentation) + Album-Künstler (Präsentation) + + + Artists (Grid) + Künstler (Raster) + + + Song + Lied + + + Always Hide + Immer ausblenden + + + Album + Album + + + Albums + Alben + + + Disable Community Rating for Episodes + Gemeinschaftsbewertung für Episoden deaktivieren + + + Songs + Lieder + + + Enable Limit + Limits aktivieren + + + Enable or disable the 'Maximum Bitrate' setting. + Maximale Bitrate' Einstellung aktivieren oder deaktivieren. + + + Biographical information for this person is not currently available. + Biografische Informationen zu dieser Person stehen derzeit nicht zur Verfügung. + + + Bitrate Limit + Bitratenlimit + + + Hide the star and community rating for episodes of a TV show. This is to prevent spoilers of an upcoming good/bad episode. + Die Sterne- und Gemeinschaftsbewertung für Episoden einer TV-Serie ausblenden. Dies dient dazu, Spoiler für eine kommende gute/schlechte Episode zu vermeiden. + + + Album Artists (Grid) + Album-Künstler (Raster) + + + View All + Alle anzeigen + From 685a623607807c2cce60a7b4ada5ec647b97e684 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 2 Dec 2023 18:30:33 -0500 Subject: [PATCH 65/82] Add valid check to contentType Value can be invalid for trailer libraries --- components/home/HomeRows.bs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index a672783dc3..29cb6d9866 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -529,10 +529,12 @@ sub updateLatestItems(msg) imagesize = homeRowItemSizes.WIDE_POSTER - if LCase(node.metadata.contentType) = "movies" - imagesize = homeRowItemSizes.MOVIE_POSTER - else if LCase(node.metadata.contentType) = "music" - imagesize = homeRowItemSizes.MUSIC_ALBUM + if isValid(node.metadata.contentType) + if LCase(node.metadata.contentType) = "movies" + imagesize = homeRowItemSizes.MOVIE_POSTER + else if LCase(node.metadata.contentType) = "music" + imagesize = homeRowItemSizes.MUSIC_ALBUM + end if end if ' remake row using new data From fe0f02bbcc50017e8486b0fad07b91ac4f9e0e75 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 2 Dec 2023 19:31:09 -0500 Subject: [PATCH 66/82] Defensive code for if no custom prefs returned --- source/utils/session.bs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source/utils/session.bs b/source/utils/session.bs index e5604c02db..a468a56054 100644 --- a/source/utils/session.bs +++ b/source/utils/session.bs @@ -223,6 +223,17 @@ namespace session unset_user_setting("display.livetv.landing") end if else + ' User has no custom prefs. Save default home section values. + session.user.SaveUserHomeSections({ + homesection0: "smalllibrarytiles", + homesection1: "resume", + homesection2: "nextup", + homesection3: "latestmedia", + homesection4: "livetv", + homesection5: "none", + homesection6: "none" + }) + unset_user_setting("display.livetv.landing") end if end sub From 687d51892b5c09db8d45ade71e2603fc93e5d39c Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 2 Dec 2023 19:34:46 -0500 Subject: [PATCH 67/82] Set row item size after removing row --- components/home/HomeRows.bs | 1 + 1 file changed, 1 insertion(+) diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index 29cb6d9866..dddaad6cd8 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -158,6 +158,7 @@ sub removeHomeSection(sectionTitleToRemove as string) sectionIndexToRemove = getSectionIndex(sectionTitle) m.top.content.removeChildIndex(sectionIndexToRemove) + setRowItemSize() end sub ' setRowItemSize: Loops through all home sections and sets the correct item sizes per row From 2832799c82097f9a7dc3516353a000a7e96f3d9a Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Sat, 2 Dec 2023 22:10:25 -0500 Subject: [PATCH 68/82] Create short circuit if content loads faster than wait time --- components/home/HomeRows.bs | 51 ++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index dddaad6cd8..894e5e47ee 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -72,6 +72,7 @@ end sub ' processUserSections: Loop through user's chosen home section settings and generate the content for each row ' sub processUserSections() + m.expectedRowCount = 0 loadedSections = 0 ' Add sections in order based on user settings @@ -174,13 +175,21 @@ sub setRowItemSize() end for m.top.rowItemSize = newSizeArray + + ' If we have the expected number of content rows, stop the loading timer and run the complete function + if m.expectedRowCount = homeSections.count() + m.loadingTimer.control = "stop" + loadingTimerComplete() + end if end sub ' loadingTimerComplete: Event handler for when loading wait time has expired ' sub loadingTimerComplete() - ' Show the row counter to prevent flicker - m.top.showRowCounter = [true] + if not m.top.showRowCounter[0] + ' Show the row counter to prevent flicker + m.top.showRowCounter = [true] + end if end sub ' addHomeSection: Adds a new home section to the home rows. @@ -233,6 +242,8 @@ sub createLibraryRow() ' Ensure we have data if not isValidAndNotEmpty(m.libraryData) then return + m.expectedRowCount++ + sectionName = tr("My Media") row = CreateObject("roSGNode", "HomeRow") @@ -271,6 +282,8 @@ sub createLatestInRows() loadLatest.itemsToLoad = "latest" loadLatest.itemId = lib.id + m.expectedRowCount++ + metadata = { "title": lib.name } metadata.Append({ "contentType": lib.json.CollectionType }) loadLatest.metadata = metadata @@ -333,6 +346,7 @@ end function ' createLiveTVRow: Creates a row displaying the live tv now on section ' sub createLiveTVRow() + m.expectedRowCount++ m.LoadOnNowTask.observeField("content", "updateOnNowItems") m.LoadOnNowTask.control = "RUN" end sub @@ -340,6 +354,7 @@ end sub ' createContinueWatchingRow: Creates a row displaying items the user can continue watching ' sub createContinueWatchingRow() + m.expectedRowCount++ ' Load the Continue Watching Data m.LoadContinueWatchingTask.observeField("content", "updateContinueWatchingItems") m.LoadContinueWatchingTask.control = "RUN" @@ -348,6 +363,7 @@ end sub ' createNextUpRow: Creates a row displaying next episodes up to watch ' sub createNextUpRow() + m.expectedRowCount++ sectionName = tr("Next Up") + ">" if not sectionExists(sectionName) @@ -365,6 +381,7 @@ end sub ' createFavoritesRow: Creates a row displaying items from the user's favorites list ' sub createFavoritesRow() + m.expectedRowCount++ ' Load the Favorites Data m.LoadFavoritesTask.observeField("content", "updateFavoritesItems") m.LoadFavoritesTask.control = "RUN" @@ -385,11 +402,15 @@ sub updateFavoritesItems() m.LoadFavoritesTask.unobserveField("content") m.LoadFavoritesTask.content = [] - if itemData = invalid then return + if itemData = invalid + m.expectedRowCount-- + return + end if sectionName = tr("Favorites") if itemData.count() < 1 + m.expectedRowCount-- removeHomeSection(sectionName) return end if @@ -429,11 +450,15 @@ sub updateContinueWatchingItems() m.LoadContinueWatchingTask.unobserveField("content") m.LoadContinueWatchingTask.content = [] - if itemData = invalid then return + if not isValid(itemData) + m.expectedRowCount-- + return + end if sectionName = tr("Continue Watching") if itemData.count() < 1 + m.expectedRowCount-- removeHomeSection(sectionName) return end if @@ -476,11 +501,15 @@ sub updateNextUpItems() m.LoadNextUpTask.content = [] m.LoadNextUpTask.control = "STOP" - if itemData = invalid then return + if itemData = invalid + m.expectedRowCount-- + return + end if sectionName = tr("Next Up") + " >" if itemData.count() < 1 + m.expectedRowCount-- removeHomeSection(sectionName) return end if @@ -519,11 +548,15 @@ sub updateLatestItems(msg) node.unobserveField("content") node.content = [] - if itemData = invalid then return + if itemData = invalid + m.expectedRowCount-- + return + end if sectionName = tr("Latest in") + " " + node.metadata.title + " >" if itemData.count() < 1 + m.expectedRowCount-- removeHomeSection(sectionName) return end if @@ -569,11 +602,15 @@ sub updateOnNowItems() m.LoadOnNowTask.unobserveField("content") m.LoadOnNowTask.content = [] - if itemData = invalid then return + if not isValid(itemData) + m.expectedRowCount-- + return + end if sectionName = tr("On Now") if itemData.count() < 1 + m.expectedRowCount-- removeHomeSection(sectionName) return end if From b0b6f2076aa17c058e6d29db1838cb5299ce1ccd Mon Sep 17 00:00:00 2001 From: Kristopher Roller Date: Sun, 3 Dec 2023 03:00:50 +0000 Subject: [PATCH 69/82] Translated using Weblate (German) Currently translated at 99.6% (272 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/de/ --- locale/de_DE/translations.ts | 223 +++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts index 28604d91dd..f66fd3ee4e 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -14029,5 +14029,228 @@ View All Alle anzeigen + + Disable HEVC + HEVC deaktivieren + User Setting - Setting title + + + Default view for Movie Libraries. + Standardansicht für Film-Bibliotheken. + Settings Menu - Description for option + + + Settings relating to the appearance of Library pages + Einstellungen im Zusammenhang mit dem Erscheinungsbild der Bibliotheksseiten + + + Presentation + Präsentation + Title of an option - name of presentation view + + + Grid + Raster + Title of an option - name of grid view + + + If enabled, the number of unwatched episodes in a series/season will be removed. + Wenn aktiviert, wird die Anzahl der unangesehenen Episoden in einer Serie/Staffel entfernt. + Settings Menu - Description for option + + + Choose your preferred audio codec when transcoding multichannel audio. + Wählen Sie Ihren bevorzugten Audiocodec, wenn Mehrkanal-Audio transcodiert wird. + Settings Menu - Description for option + + + Audio Codec Support + Unterstützung für Audiocodecs + Settings Menu - Title of option + + + Maximum Resolution + Maximale Auflösung + User Setting - Title + + + Only transcoded files + Nur transkodierte Dateien + User Setting - Setting title + + + Remember the currently logged in user and try to log them in again next time you start the Jellyfin app. + Merke dir den aktuell angemeldeten Benutzer und versuche, ihn beim nächsten Start der Jellyfin-App erneut anzumelden. + User Setting - Setting description + + + Use generated splashscreen image as Jellyfin's home background. Jellyfin will need to be closed and reopened for change to take effect. + Verwende das generierte Splashscreen-Bild als Hintergrund für Jellyfin's Startseite. Jellyfin muss geschlossen und erneut geöffnet werden, damit die Änderung wirksam wird. + Description for option in Setting Screen + + + Unable to find any albums or songs belonging to this artist + Es konnten keine Alben oder Lieder dieses Künstlers gefunden werden + Popup message when we find no audio data for an artist + + + Options for TV Shows. + Optionen für TV-Sendungen. + Description for TV Shows user settings. + + + No Chapter Data Found + Keine Kapiteldaten gefunden + Message shown in OSD when no chapter data is returned by the API + + + Media Grid options. + Media Grid options. + + + General + Allgemein + + + Maximum Bitrate + Maximale Bitrate + + + Grid View Settings + Einstellungen für Rasteransicht + + + Settings relating to the appearance of the Home screen and the program in general. + Einstellungen, die sich auf das Erscheinungsbild des Startbildschirms und des Programms im Allgemeinen beziehen. + + + Settings relating to the appearance of pages in TV Libraries. + Einstellungen im Zusammenhang mit dem Erscheinungsbild von Seiten in TV-Bibliotheken. + + + Settings that apply when Grid views are enabled. + Einstellungen, die gelten, wenn Rasteransichten aktiviert sind. + + + Settings relating to the appearance of pages in Movie Libraries. + Einstellungen im Zusammenhang mit dem Erscheinungsbild von Seiten in Film-Bibliotheken. + + + Disable Unwatched Episode Count + Unangesehene Episodenanzahl deaktivieren + Settings Menu - Title for option + + + Next Episode Button Time + Zeit für die Schaltfläche 'Nächste Episode + Settings Menu - Title for option + + + Force all transcodes to use DTS instead of the default EAC3. The device must support DTS for this setting to have an effect. + Erzwingen Sie, dass alle Transcodierungen DTS anstelle von dem Standard EAC3 verwenden. Das Gerät muss DTS unterstützen, damit diese Einstellung wirksam wird. + Settings Menu - Description for option + + + Set the maximum resolution when playing video files on this device. + Legen Sie die maximale Auflösung fest, wenn Videodateien auf diesem Gerät abgespielt werden. + User Setting - Description + + + Auto - Use TV resolution + Auto - Verwende TV-Auflösung + User Setting - Option title + + + Off - Attempt to play all resolutions + Aus - Versuche, alle Auflösungen abzuspielen + User Setting - Option title + + + Value + Wert + User Setting - Setting title + + + Mode + Modus + User Setting - Setting title + + + Configure the maximum resolution when playing video files on this device. + Konfigurieren Sie die maximale Auflösung beim Abspielen von Videodateien auf diesem Gerät. + User Setting - Description + + + Apply max resolution to all files or only transcoded files. + Wenden Sie die maximale Auflösung auf alle Dateien oder nur auf transkodierte Dateien an. + User Setting - Description + + + All files + Alle Dateien + User Setting - Setting title + + + Attempt to prevent playback failures. + Versuch, Wiedergabeausfälle zu verhindern. + User Setting - Setting description + + + Compatibility + Kompatibilität + User Setting - Setting title + + + Global + Global + User Setting - Setting title + + + Disable the HEVC codec on this device. This may improve playback for some devices (ultra). + Deaktivieren Sie den HEVC-Codec auf diesem Gerät. Dies kann die Wiedergabe für einige Geräte (ultra) verbessern. + User Setting - Setting description + + + Remember Me? + Angemeldet bleiben? + User Setting - Setting title + + + Global settings that affect everyone that uses this Roku device. + Globale Einstellungen, die jeden beeinflussen, der dieses Roku-Gerät verwendet. + User Setting - Setting description + + + You can search for Titles, People, Live TV Channels and more + Sie können nach Titeln, Personen, Live-TV-Sendern und mehr suchen + Help text in search results + + + Libraries + Bibliotheken + + + Loading trailer + Trailer wird geladen + Dialog title in Main.brs + + + Set the maximum bitrate in Mbps. Set to 0 to use Roku's specifications. This setting must be enabled to take effect. + Setzen Sie die maximale Bitrate in Mbps. Setzen Sie auf 0, um Rokus Spezifikationen zu verwenden. Diese Einstellung muss aktiviert sein, um wirksam zu werden. + + + Direct playing + Direkte Wiedergabe + + + Set how many seconds before the end of an episode the Next Episode button should appear. Set to 0 to disable. + Festlegen, wie viele Sekunden vor dem Ende einer Episode die Schaltfläche 'Nächste Episode' erscheinen soll. Auf 0 setzen, um zu deaktivieren. + Settings Menu - Description for option + + + The source file is entirely compatible with this client and the session is receiving the file without modifications. + Die Quelldatei ist vollständig kompatibel mit diesem Client, und die Sitzung empfängt die Datei ohne Änderungen. + Direct play info box text in GetPlaybackInfoTask.brs + From edfb8200390ce6a6447d5f31567b2693d6891622 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Mon, 4 Dec 2023 09:21:21 -0500 Subject: [PATCH 70/82] fix lazy loading itemgrid spinner --- components/ItemGrid/ItemGrid.bs | 3 ++- components/ItemGrid/MovieLibraryView.bs | 3 ++- components/ItemGrid/MusicLibraryView.bs | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/components/ItemGrid/ItemGrid.bs b/components/ItemGrid/ItemGrid.bs index c140f23137..c851e30b58 100644 --- a/components/ItemGrid/ItemGrid.bs +++ b/components/ItemGrid/ItemGrid.bs @@ -569,8 +569,9 @@ end sub ' 'Load next set of items sub loadMoreData() - startLoadingSpinner(false) if m.Loading = true then return + + startLoadingSpinner(false) m.Loading = true m.loadItemsTask.startIndex = m.loadedItems m.loadItemsTask.observeField("content", "ItemDataLoaded") diff --git a/components/ItemGrid/MovieLibraryView.bs b/components/ItemGrid/MovieLibraryView.bs index 9fe4940150..b4c5d1304d 100644 --- a/components/ItemGrid/MovieLibraryView.bs +++ b/components/ItemGrid/MovieLibraryView.bs @@ -687,8 +687,9 @@ end sub ' 'Load next set of items sub loadMoreData() - startLoadingSpinner(false) if m.Loading = true then return + + startLoadingSpinner(false) m.Loading = true m.loadItemsTask.startIndex = m.loadedItems m.loadItemsTask.observeField("content", "ItemDataLoaded") diff --git a/components/ItemGrid/MusicLibraryView.bs b/components/ItemGrid/MusicLibraryView.bs index 0ca07b5bff..77d79d62c6 100644 --- a/components/ItemGrid/MusicLibraryView.bs +++ b/components/ItemGrid/MusicLibraryView.bs @@ -108,7 +108,7 @@ end sub 'Load initial set of Data sub loadInitialItems() m.loadItemsTask.control = "stop" - startLoadingSpinner() + startLoadingSpinner(false) if LCase(m.top.parentItem.json.Type) = "collectionfolder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -550,8 +550,9 @@ end sub ' 'Load next set of items sub loadMoreData() - startLoadingSpinner(false) if m.Loading = true then return + + startLoadingSpinner(false) m.Loading = true m.loadItemsTask.startIndex = m.loadedItems m.loadItemsTask.observeField("content", "ItemDataLoaded") From 7e7ac107afcce46ecf3bfa56efb1891d0f263abd Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Mon, 4 Dec 2023 12:18:59 -0500 Subject: [PATCH 71/82] Create expected & processed counts. Hook short circuit to their values Code by cewert --- components/home/HomeRows.bs | 93 ++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 52 deletions(-) diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index 894e5e47ee..b888da3928 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -72,13 +72,33 @@ end sub ' processUserSections: Loop through user's chosen home section settings and generate the content for each row ' sub processUserSections() - m.expectedRowCount = 0 - loadedSections = 0 + m.expectedRowCount = 1 ' the favorites row is hardcoded to always show atm + m.processedRowCount = 0 + + ' calculate expected row count by processing homesections + for i = 0 to 6 + sectionName = LCase(m.global.session.user.settings["homesection" + i.toStr()]) + if sectionName = "latestmedia" + ' expect 1 row per filtered media library + m.filteredLatest = filterNodeArray(m.libraryData, "id", m.global.session.user.configuration.LatestItemsExcludes) + for each latestLibrary in m.filteredLatest + if latestLibrary.collectionType <> "boxsets" and latestLibrary.collectionType <> "livetv" and latestLibrary.json.CollectionType <> "Program" + m.expectedRowCount++ + end if + end for + else if sectionName <> "none" + m.expectedRowCount++ + end if + end for - ' Add sections in order based on user settings + ' Add home sections in order based on user settings + loadedSections = 0 for i = 0 to 6 sectionName = LCase(m.global.session.user.settings["homesection" + i.toStr()]) - sectionLoaded = addHomeSection(sectionName) + sectionLoaded = false + if sectionName <> "none" + sectionLoaded = addHomeSection(sectionName) + end if ' Count how many sections with data are loaded if sectionLoaded then loadedSections++ @@ -173,11 +193,10 @@ sub setRowItemSize() for i = 0 to homeSections.count() - 1 newSizeArray[i] = isValid(homeSections[i].cursorSize) ? homeSections[i].cursorSize : homeRowItemSizes.WIDE_POSTER end for - m.top.rowItemSize = newSizeArray - ' If we have the expected number of content rows, stop the loading timer and run the complete function - if m.expectedRowCount = homeSections.count() + ' If we have processed the expected number of content rows, stop the loading timer and run the complete function + if m.expectedRowCount = m.processedRowCount m.loadingTimer.control = "stop" loadingTimerComplete() end if @@ -233,17 +252,19 @@ function addHomeSection(sectionType as string) as boolean return true end if + ' This section type isn't supported. + ' Count it as processed since we aren't going to do anything else with it + m.processedRowCount++ return false end function ' createLibraryRow: Creates a row displaying the user's libraries ' sub createLibraryRow() + m.processedRowCount++ ' Ensure we have data if not isValidAndNotEmpty(m.libraryData) then return - m.expectedRowCount++ - sectionName = tr("My Media") row = CreateObject("roSGNode", "HomeRow") @@ -275,15 +296,12 @@ sub createLatestInRows() if not isValidAndNotEmpty(m.libraryData) then return ' create a "Latest In" row for each library - filteredLatest = filterNodeArray(m.libraryData, "id", m.global.session.user.configuration.LatestItemsExcludes) - for each lib in filteredLatest + for each lib in m.filteredLatest if lib.collectionType <> "boxsets" and lib.collectionType <> "livetv" and lib.json.CollectionType <> "Program" loadLatest = createObject("roSGNode", "LoadItemsTask") loadLatest.itemsToLoad = "latest" loadLatest.itemId = lib.id - m.expectedRowCount++ - metadata = { "title": lib.name } metadata.Append({ "contentType": lib.json.CollectionType }) loadLatest.metadata = metadata @@ -346,7 +364,6 @@ end function ' createLiveTVRow: Creates a row displaying the live tv now on section ' sub createLiveTVRow() - m.expectedRowCount++ m.LoadOnNowTask.observeField("content", "updateOnNowItems") m.LoadOnNowTask.control = "RUN" end sub @@ -354,7 +371,6 @@ end sub ' createContinueWatchingRow: Creates a row displaying items the user can continue watching ' sub createContinueWatchingRow() - m.expectedRowCount++ ' Load the Continue Watching Data m.LoadContinueWatchingTask.observeField("content", "updateContinueWatchingItems") m.LoadContinueWatchingTask.control = "RUN" @@ -363,7 +379,6 @@ end sub ' createNextUpRow: Creates a row displaying next episodes up to watch ' sub createNextUpRow() - m.expectedRowCount++ sectionName = tr("Next Up") + ">" if not sectionExists(sectionName) @@ -381,7 +396,6 @@ end sub ' createFavoritesRow: Creates a row displaying items from the user's favorites list ' sub createFavoritesRow() - m.expectedRowCount++ ' Load the Favorites Data m.LoadFavoritesTask.observeField("content", "updateFavoritesItems") m.LoadFavoritesTask.control = "RUN" @@ -398,19 +412,14 @@ end sub ' updateFavoritesItems: Processes LoadFavoritesTask content. Removes, Creates, or Updates favorites row as needed ' sub updateFavoritesItems() + m.processedRowCount++ itemData = m.LoadFavoritesTask.content m.LoadFavoritesTask.unobserveField("content") m.LoadFavoritesTask.content = [] - if itemData = invalid - m.expectedRowCount-- - return - end if - sectionName = tr("Favorites") - if itemData.count() < 1 - m.expectedRowCount-- + if not isValidAndNotEmpty(itemData) removeHomeSection(sectionName) return end if @@ -446,19 +455,14 @@ end sub ' updateContinueWatchingItems: Processes LoadContinueWatchingTask content. Removes, Creates, or Updates continue watching row as needed ' sub updateContinueWatchingItems() + m.processedRowCount++ itemData = m.LoadContinueWatchingTask.content m.LoadContinueWatchingTask.unobserveField("content") m.LoadContinueWatchingTask.content = [] - if not isValid(itemData) - m.expectedRowCount-- - return - end if - sectionName = tr("Continue Watching") - if itemData.count() < 1 - m.expectedRowCount-- + if not isValidAndNotEmpty(itemData) removeHomeSection(sectionName) return end if @@ -496,20 +500,15 @@ end sub ' updateNextUpItems: Processes LoadNextUpTask content. Removes, Creates, or Updates next up row as needed ' sub updateNextUpItems() + m.processedRowCount++ itemData = m.LoadNextUpTask.content m.LoadNextUpTask.unobserveField("content") m.LoadNextUpTask.content = [] m.LoadNextUpTask.control = "STOP" - if itemData = invalid - m.expectedRowCount-- - return - end if - sectionName = tr("Next Up") + " >" - if itemData.count() < 1 - m.expectedRowCount-- + if not isValidAndNotEmpty(itemData) removeHomeSection(sectionName) return end if @@ -542,21 +541,16 @@ end sub ' ' @param {dynamic} msg - LoadItemsTask sub updateLatestItems(msg) + m.processedRowCount++ itemData = msg.GetData() node = msg.getRoSGNode() node.unobserveField("content") node.content = [] - if itemData = invalid - m.expectedRowCount-- - return - end if - sectionName = tr("Latest in") + " " + node.metadata.title + " >" - if itemData.count() < 1 - m.expectedRowCount-- + if not isValidAndNotEmpty(itemData) removeHomeSection(sectionName) return end if @@ -598,19 +592,14 @@ end sub ' updateOnNowItems: Processes LoadOnNowTask content. Removes, Creates, or Updates latest in on now row as needed ' sub updateOnNowItems() + m.processedRowCount++ itemData = m.LoadOnNowTask.content m.LoadOnNowTask.unobserveField("content") m.LoadOnNowTask.content = [] - if not isValid(itemData) - m.expectedRowCount-- - return - end if - sectionName = tr("On Now") - if itemData.count() < 1 - m.expectedRowCount-- + if not isValidAndNotEmpty(itemData) removeHomeSection(sectionName) return end if From 1e4a404c5c332212a5af510729801990464e23d0 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Mon, 4 Dec 2023 12:40:07 -0500 Subject: [PATCH 72/82] remove spinner when calling scenemanger.popScene() --- components/data/SceneManager.bs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/data/SceneManager.bs b/components/data/SceneManager.bs index 71f36a2fa0..994443309b 100644 --- a/components/data/SceneManager.bs +++ b/components/data/SceneManager.bs @@ -1,4 +1,5 @@ import "pkg:/source/roku_modules/log/LogMixin.brs" +import "pkg:/source/utils/misc.bs" sub init() m.log = log.Logger("SceneManager") @@ -120,7 +121,7 @@ sub popScene() ' Exit app if the stack is empty after removing group m.scene.exit = true end if - + stopLoadingSpinner() end sub From 5619af75ed6961a17591f6142b5622062cec1e12 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 19:11:49 +0000 Subject: [PATCH 73/82] Update actions/configure-pages action to v4 --- .github/workflows/deploy-api-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-api-docs.yml b/.github/workflows/deploy-api-docs.yml index 92b7eb9bb6..e05c9ed160 100644 --- a/.github/workflows/deploy-api-docs.yml +++ b/.github/workflows/deploy-api-docs.yml @@ -32,7 +32,7 @@ jobs: - name: Checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 - name: Setup Pages - uses: actions/configure-pages@f156874f8191504dae5b037505266ed5dda6c382 # v3 + uses: actions/configure-pages@1f0c5cde4bc74cd7e1254d0cb4de8d49e9068c7d # v4 - name: Upload artifact uses: actions/upload-pages-artifact@a753861a5debcf57bf8b404356158c8e1e33150c # v2 with: From b9f48f483a5664772c5392a3d48fcec80495eea5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 21:49:58 +0000 Subject: [PATCH 74/82] Update actions/deploy-pages action to v3 --- .github/workflows/deploy-api-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-api-docs.yml b/.github/workflows/deploy-api-docs.yml index 92b7eb9bb6..cb1ddef39a 100644 --- a/.github/workflows/deploy-api-docs.yml +++ b/.github/workflows/deploy-api-docs.yml @@ -40,4 +40,4 @@ jobs: path: "docs/api" - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@9dbe3824824f8a1377b8e298bafde1a50ede43e5 # v2 + uses: actions/deploy-pages@77d7344265e1f960dab5c00dbff52287a70b0d4f # v3 From bc86c22bf3de98403e0d15ea614bfaabb422853a Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Mon, 4 Dec 2023 21:50:15 +0000 Subject: [PATCH 75/82] Update API docs --- docs/api/components_ItemGrid_ItemGrid.bs.html | 3 ++- docs/api/components_ItemGrid_MovieLibraryView.bs.html | 3 ++- docs/api/components_ItemGrid_MusicLibraryView.bs.html | 5 +++-- docs/api/components_data_SceneManager.bs.html | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/api/components_ItemGrid_ItemGrid.bs.html b/docs/api/components_ItemGrid_ItemGrid.bs.html index e6abc9e184..44696d8368 100644 --- a/docs/api/components_ItemGrid_ItemGrid.bs.html +++ b/docs/api/components_ItemGrid_ItemGrid.bs.html @@ -571,8 +571,9 @@ ' 'Load next set of items sub loadMoreData() - startLoadingSpinner(false) if m.Loading = true then return + + startLoadingSpinner(false) m.Loading = true m.loadItemsTask.startIndex = m.loadedItems m.loadItemsTask.observeField("content", "ItemDataLoaded") diff --git a/docs/api/components_ItemGrid_MovieLibraryView.bs.html b/docs/api/components_ItemGrid_MovieLibraryView.bs.html index 3b2b481d7d..6b1cac15e0 100644 --- a/docs/api/components_ItemGrid_MovieLibraryView.bs.html +++ b/docs/api/components_ItemGrid_MovieLibraryView.bs.html @@ -689,8 +689,9 @@ ' 'Load next set of items sub loadMoreData() - startLoadingSpinner(false) if m.Loading = true then return + + startLoadingSpinner(false) m.Loading = true m.loadItemsTask.startIndex = m.loadedItems m.loadItemsTask.observeField("content", "ItemDataLoaded") diff --git a/docs/api/components_ItemGrid_MusicLibraryView.bs.html b/docs/api/components_ItemGrid_MusicLibraryView.bs.html index a6e2b2b2bb..c1ceb54230 100644 --- a/docs/api/components_ItemGrid_MusicLibraryView.bs.html +++ b/docs/api/components_ItemGrid_MusicLibraryView.bs.html @@ -110,7 +110,7 @@ 'Load initial set of Data sub loadInitialItems() m.loadItemsTask.control = "stop" - startLoadingSpinner() + startLoadingSpinner(false) if LCase(m.top.parentItem.json.Type) = "collectionfolder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -552,8 +552,9 @@ ' 'Load next set of items sub loadMoreData() - startLoadingSpinner(false) if m.Loading = true then return + + startLoadingSpinner(false) m.Loading = true m.loadItemsTask.startIndex = m.loadedItems m.loadItemsTask.observeField("content", "ItemDataLoaded") diff --git a/docs/api/components_data_SceneManager.bs.html b/docs/api/components_data_SceneManager.bs.html index 16a43dcea8..3833fb0a3a 100644 --- a/docs/api/components_data_SceneManager.bs.html +++ b/docs/api/components_data_SceneManager.bs.html @@ -1,6 +1,7 @@ Source: components/data/SceneManager.bs
On this page

components_data_SceneManager.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
+import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.log = log.Logger("SceneManager")
@@ -122,7 +123,7 @@
         ' Exit app if the stack is empty after removing group
         m.scene.exit = true
     end if
-
+    stopLoadingSpinner()
 end sub
 
 

From 411409f82297411dcf6f65edefe1465f3c030110 Mon Sep 17 00:00:00 2001
From: 1hitsong <3330318+1hitsong@users.noreply.github.com>
Date: Mon, 4 Dec 2023 20:55:35 -0500
Subject: [PATCH 76/82] Version Bump to 2.0.0, Generate What's New

---
 Makefile                    |   2 +-
 manifest                    |   6 +-
 package.json                |   2 +-
 source/static/whatsNew.json | 194 +++++++++++++++++++++++++++++++++++-
 4 files changed, 198 insertions(+), 6 deletions(-)

diff --git a/Makefile b/Makefile
index 46d7285d91..fdef679b8b 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 # If you want to get_images, you'll also need convert from ImageMagick
 ##########################################################################
 
-VERSION := 1.6.6
+VERSION := 2.0.0
 
 ## usage
 
diff --git a/manifest b/manifest
index f47fb83899..e4fe843323 100644
--- a/manifest
+++ b/manifest
@@ -1,9 +1,9 @@
 ## Channel Details
 
 title=Jellyfin
-major_version=1
-minor_version=6
-build_version=6
+major_version=2
+minor_version=0
+build_version=0
 
 ### Main Menu Icons / Channel Poster Artwork
 
diff --git a/package.json b/package.json
index 85429e1f99..4c72b2fffe 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "jellyfin-roku",
   "type": "module",
-  "version": "1.6.6",
+  "version": "2.0.0",
   "description": "Roku app for Jellyfin media server",
   "dependencies": {
     "@rokucommunity/bslib": "0.1.1",
diff --git a/source/static/whatsNew.json b/source/static/whatsNew.json
index cf24cc2ea1..2cf14181a2 100644
--- a/source/static/whatsNew.json
+++ b/source/static/whatsNew.json
@@ -1,6 +1,198 @@
 [
     {
-        "description": "Bug Fix: System screensaver not working",
+        "description": "New Feature: Add support for Music Videos",
+        "author": "cewert"
+    },
+    {
+        "description": "New Feature: Create video OSD with chapter skip, subtitle select, playback info",
+        "author": "1hitsong"
+    },
+    {
+        "description": "New Feature: Allow selection of TV Show versions",
+        "author": "jimdogx"
+    },
+    {
+        "description": "New Feature: Add support for TV show season extra features",
+        "author": "JarodTAerts"
+    },
+    {
+        "description": "New Feature: Infer server url on server select screen",
+        "author": "sevenrats"
+    },
+    {
+        "description": "New Feature: Search honors item access permissions",
+        "author": "matty-r"
+    },
+    {
+        "description": "New Feature: Enable rememberme global setting for current installs who upgrade",
+        "author": "cewert"
+    },
+    {
+        "description": "New Feature: Improve Quick Play support across client",
+        "author": "cewert"
+    },
+    {
+        "description": "New Feature: Add photo support to home screen",
+        "author": "cewert"
+    },
+    {
+        "description": "New Feature: Update device profile when device capabilities change + enable all device events",
+        "author": "cewert"
+    },
+    {
+        "description": "New Feature: Enable support for saving user's credentials, and add \"Change User\" and \"Remember Me?\" options",
+        "author": "cewert"
+    },
+    {
+        "description": "New Feature: Use user's preferred audio language to select default audio track for TV Episodes",
+        "author": "jimdogx"
+    },
+    {
+        "description": "New Feature: Add quickplay support to search results",
+        "author": "cewert"
+    },
+    {
+        "description": "New Feature: Respect Home Section order from web",
+        "author": "1hitsong"
+    },
+    {
+        "description": "New View: Create Album Artists view for music library",
+        "author": "1hitsong"
+    },
+    {
+        "description": "Bug Fix: Rounded corner on unplayed episode count",
+        "author": "photonconvergence"
+    },
+    {
+        "description": "Bug Fix: Fix TV Guide bug that didn't allow going to same channel twice in a row",
+        "author": "jimdogx"
+    },
+    {
+        "description": "Bug Fix: Fix Live TV record button crash",
+        "author": "jimdogx"
+    },
+    {
+        "description": "Bug Fix: Don't show nextEpisode button if trickplay bar is shown",
+        "author": "1hitsong"
+    },
+    {
+        "description": "Bug Fix: Fix episode list bug where OK was triggering quickplay",
+        "author": "cewert"
+    },
+    {
+        "description": "Bug Fix: Improve \"Next Episode\" button show logic",
+        "author": "cewert"
+    },
+    {
+        "description": "Bug Fix: Fix crash if bitrate limit is enabled and empty",
+        "author": "jimdogx"
+    },
+    {
+        "description": "Bug Fix: Fix crash when unplayed strms exist in season",
+        "author": "sevenrats"
+    },
+    {
+        "description": "Bug Fix: Update settings.json to fix double-entry of \"Disable Community Rating for Episodes\"",
+        "author": "alanazar"
+    },
+    {
+        "description": "Bug Fix: Fix crash when viewing Live TV",
+        "author": "jimdogx"
+    },
+    {
+        "description": "Bug Fix: Fix crash when viewing Photo Slideshow or Photo Random",
+        "author": "jimdogx"
+    },
+    {
+        "description": "Bug Fix: Fix long movie options from getting cut off",
+        "author": "Klikini"
+    },
+    {
+        "description": "Bug Fix: Fix community rating not showing on movie detail page",
+        "author": "1hitsong"
+    },
+    {
+        "description": "Bug Fix: Fix default A-Z sorting for movies & music",
+        "author": "1hitsong"
+    },
+    {
+        "description": "Bug Fix: Order boxsets by release date by default",
+        "author": "1hitsong"
+    },
+    {
+        "description": "Bug Fix: Fix unplayedCount bug when applying filters",
+        "author": "ApexArray"
+    },
+    {
+        "description": "Bug Fix: Fix direct play of the AV1 codec",
+        "author": "cewert"
+    },
+    {
+        "description": "Bug Fix: Fix early exit from settings screen when pressing back button",
+        "author": "cewert"
+    },
+    {
+        "description": "Bug Fix: Prevent crash by validating Filter Menu data",
+        "author": "cewert"
+    },
+    {
+        "description": "Bug Fix: Fix several bugs from Roku crash logs",
+        "author": "cewert"
+    },
+    {
+        "description": "Bug Fix: Refactor deviceCapabilities, fix vp9, and make 6 channel videos downmix if possible",
+        "author": "sevenrats"
+    },
+    {
+        "description": "General Improvement: Convert app to use one spinner attached to JFScene + resize spinner",
+        "author": "cewert"
+    },
+    {
+        "description": "General Improvement: Increase font size for unwatched episode count",
+        "author": "cewert"
+    },
+    {
+        "description": "General Improvement: On Home View, use TV Show thumbnail instead of Channel logo",
+        "author": "jimdogx"
+    },
+    {
+        "description": "General Improvement: Remove progressbar delay and speed up animation on home screen",
+        "author": "cewert"
+    },
+    {
+        "description": "General Improvement: Show loading spinner and disable remote during login",
+        "author": "cewert"
+    },
+    {
+        "description": "General Improvement: Copy custom subtitle functionality into new Global Queue Player",
+        "author": "1hitsong"
+    },
+    {
+        "description": "General Improvement: Update settings page UI to create more space for long radio lists",
+        "author": "cewert"
+    },
+    {
+        "description": "General Improvement: Remove Play Random button & functionality",
+        "author": "pau1h"
+    },
+    {
+        "description": "General Improvement: Update api.sessions.get() + add tanscoding info for Direct Streaming",
+        "author": "candry7731"
+    },
+    {
+        "description": "General Improvement: Only create trailer button when needed",
+        "author": "cewert"
+    },
+    {
+        "description": "General Improvement: Update device profile - direct play, transcoding, and codec profiles",
+        "author": "cewert"
+    },
+    {
+        "description": "General Improvement: Wrap alpha menu",
         "author": "1hitsong"
+    },
+    {
+        "description": "For full list of changes, visit our release page: ",
+        "author": "https://github.com/jellyfin/jellyfin-roku/releases"
     }
 ]
\ No newline at end of file

From 49bb0c4fc52bad6280acbd628b22431b84dd0afd Mon Sep 17 00:00:00 2001
From: 1hitsong <3330318+1hitsong@users.noreply.github.com>
Date: Mon, 4 Dec 2023 20:59:46 -0500
Subject: [PATCH 77/82] Reword setting item

---
 source/static/whatsNew.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/static/whatsNew.json b/source/static/whatsNew.json
index 2cf14181a2..10b5ba16b4 100644
--- a/source/static/whatsNew.json
+++ b/source/static/whatsNew.json
@@ -52,7 +52,7 @@
         "author": "cewert"
     },
     {
-        "description": "New Feature: Respect Home Section order from web",
+        "description": "New Setting: Use Web Client's Home Section Arrangement",
         "author": "1hitsong"
     },
     {

From 3abc6cb99565804137c5b5502e50e5bbfb868f4c Mon Sep 17 00:00:00 2001
From: jellyfin-bot 
Date: Tue, 5 Dec 2023 16:56:00 +0000
Subject: [PATCH 78/82] Update API docs

---
 docs/api/components_ButtonGroupHoriz.bs.html  |   4 +-
 docs/api/components_ButtonGroupVert.bs.html   |   4 +-
 docs/api/components_Buttons_JFButtons.bs.html |   4 +-
 .../components_Buttons_SlideOutButton.bs.html |   4 +-
 .../components_Buttons_TextSizeTask.bs.html   |   4 +-
 docs/api/components_Clock.bs.html             |   4 +-
 .../api/components_GetNextEpisodeTask.bs.html |   4 +-
 .../components_GetPlaybackInfoTask.bs.html    |   4 +-
 .../components_GetShuffleEpisodesTask.bs.html |   4 +-
 docs/api/components_IconButton.bs.html        |   4 +-
 docs/api/components_ItemGrid_Alpha.bs.html    |   4 +-
 ...ponents_ItemGrid_FavoriteItemsTask.bs.html |   4 +-
 docs/api/components_ItemGrid_GridItem.bs.html |   4 +-
 .../components_ItemGrid_GridItemSmall.bs.html |   4 +-
 docs/api/components_ItemGrid_ItemGrid.bs.html |   4 +-
 ...omponents_ItemGrid_ItemGridOptions.bs.html |   4 +-
 ...components_ItemGrid_LoadItemsTask2.bs.html |   4 +-
 ...ents_ItemGrid_LoadVideoContentTask.bs.html |   4 +-
 ...mponents_ItemGrid_MovieLibraryView.bs.html |   4 +-
 ...nents_ItemGrid_MusicArtistGridItem.bs.html |   4 +-
 ...mponents_ItemGrid_MusicLibraryView.bs.html |   4 +-
 docs/api/components_JFButton.bs.html          |   4 +-
 docs/api/components_JFGroup.bs.html           |   4 +-
 docs/api/components_JFMessageDialog.bs.html   |   4 +-
 docs/api/components_JFOverhang.bs.html        |   4 +-
 docs/api/components_JFScene.bs.html           |   4 +-
 docs/api/components_JFScreen.bs.html          |   4 +-
 docs/api/components_JFVideo.bs.html           |   4 +-
 docs/api/components_ListPoster.bs.html        |   4 +-
 docs/api/components_OverviewDialog.bs.html    |   4 +-
 docs/api/components_PersonDetails.bs.html     |   4 +-
 docs/api/components_PlaybackDialog.bs.html    |   4 +-
 docs/api/components_PlayedCheckmark.bs.html   |   4 +-
 docs/api/components_PlaystateTask.bs.html     |   4 +-
 docs/api/components_RadioDialog.bs.html       |   4 +-
 docs/api/components_SearchBox.bs.html         |   4 +-
 docs/api/components_Spinner.bs.html           |   4 +-
 docs/api/components_StandardDialog.bs.html    |   4 +-
 docs/api/components_WhatsNewDialog.bs.html    |   4 +-
 docs/api/components_captionTask.bs.html       |   4 +-
 docs/api/components_config_ConfigData.bs.html |   4 +-
 docs/api/components_config_ConfigItem.bs.html |   4 +-
 docs/api/components_config_ConfigList.bs.html |   4 +-
 docs/api/components_config_JFServer.bs.html   |   4 +-
 docs/api/components_config_LoginScene.bs.html |   4 +-
 ...ponents_config_ServerDiscoveryTask.bs.html |   4 +-
 .../components_config_SetServerScreen.bs.html |   4 +-
 docs/api/components_data_AlbumData.bs.html    |   4 +-
 docs/api/components_data_ChannelData.bs.html  |   4 +-
 .../components_data_CollectionData.bs.html    |   4 +-
 docs/api/components_data_FolderData.bs.html   |   4 +-
 .../components_data_GetFiltersTask.bs.html    |   4 +-
 docs/api/components_data_HomeData.bs.html     |   4 +-
 docs/api/components_data_ImageData.bs.html    |   4 +-
 docs/api/components_data_MovieData.bs.html    |   4 +-
 .../components_data_MusicAlbumData.bs.html    |   4 +-
 ...onents_data_MusicAlbumSongListData.bs.html |   4 +-
 .../components_data_MusicArtistData.bs.html   |   4 +-
 .../api/components_data_MusicSongData.bs.html |   4 +-
 .../api/components_data_OptionsButton.bs.html |   4 +-
 docs/api/components_data_OptionsData.bs.html  |   4 +-
 docs/api/components_data_PersonData.bs.html   |   4 +-
 docs/api/components_data_PhotoData.bs.html    |   4 +-
 docs/api/components_data_PlaylistData.bs.html |   4 +-
 .../components_data_PublicUserData.bs.html    |   4 +-
 docs/api/components_data_SceneManager.bs.html |   4 +-
 ...omponents_data_ScheduleProgramData.bs.html |   4 +-
 docs/api/components_data_SearchData.bs.html   |   4 +-
 docs/api/components_data_SeriesData.bs.html   |   4 +-
 docs/api/components_data_TVEpisode.bs.html    |   4 +-
 .../api/components_data_TVEpisodeData.bs.html |   4 +-
 docs/api/components_data_TVSeasonData.bs.html |   4 +-
 docs/api/components_data_UserData.bs.html     |   4 +-
 docs/api/components_data_VideoData.bs.html    |   4 +-
 docs/api/components_extras_ExtrasItem.bs.html |   4 +-
 .../components_extras_ExtrasRowList.bs.html   |   4 +-
 docs/api/components_home_Home.bs.html         |  15 +-
 docs/api/components_home_HomeItem.bs.html     |   9 +-
 docs/api/components_home_HomeRows.bs.html     | 694 ++++++++++--------
 .../api/components_home_LoadItemsTask.bs.html |   4 +-
 ...mponents_keyboards_IntegerKeyboard.bs.html |   4 +-
 ...components_liveTv_LoadChannelsTask.bs.html |   4 +-
 ...ents_liveTv_LoadProgramDetailsTask.bs.html |   4 +-
 .../components_liveTv_LoadSheduleTask.bs.html |   4 +-
 .../components_liveTv_ProgramDetails.bs.html  |   4 +-
 ...omponents_liveTv_RecordProgramTask.bs.html |   4 +-
 docs/api/components_liveTv_schedule.bs.html   |   4 +-
 docs/api/components_login_UserItem.bs.html    |   4 +-
 docs/api/components_login_UserRow.bs.html     |   4 +-
 docs/api/components_login_UserSelect.bs.html  |   4 +-
 .../components_manager_QueueManager.bs.html   |   4 +-
 .../components_manager_ViewCreator.bs.html    |   4 +-
 ...omponents_mediaPlayers_AudioPlayer.bs.html |   4 +-
 ...mponents_movies_AudioTrackListItem.bs.html |   4 +-
 .../components_movies_MovieDetails.bs.html    |   4 +-
 .../components_movies_MovieOptions.bs.html    |   4 +-
 ...mponents_movies_VideoTrackListItem.bs.html |   4 +-
 docs/api/components_music_AlbumGrid.bs.html   |   4 +-
 .../components_music_AlbumTrackList.bs.html   |   4 +-
 docs/api/components_music_AlbumView.bs.html   |   4 +-
 docs/api/components_music_ArtistView.bs.html  |   4 +-
 .../components_music_AudioPlayerView.bs.html  |   4 +-
 ...s_music_LoadScreenSaverTimeoutTask.bs.html |   4 +-
 .../api/components_music_PlaylistView.bs.html |   4 +-
 docs/api/components_music_SongItem.bs.html    |   4 +-
 .../api/components_options_OptionNode.bs.html |   4 +-
 .../components_options_OptionsSlider.bs.html  |   4 +-
 .../components_photos_LoadPhotoTask.bs.html   |   4 +-
 .../components_photos_PhotoDetails.bs.html    |   4 +-
 ...mponents_quickConnect_QuickConnect.bs.html |   4 +-
 ...ts_quickConnect_QuickConnectDialog.bs.html |   4 +-
 .../components_search_SearchResults.bs.html   |   4 +-
 docs/api/components_search_SearchRow.bs.html  |   4 +-
 docs/api/components_search_SearchTask.bs.html |   4 +-
 docs/api/components_section_section.bs.html   |   4 +-
 ...components_section_sectionScroller.bs.html |   4 +-
 docs/api/components_settings_settings.bs.html |   4 +-
 docs/api/components_tasks_PostTask.bs.html    |   4 +-
 .../components_tvshows_TVEpisodeRow.bs.html   |   4 +-
 ...ts_tvshows_TVEpisodeRowWithOptions.bs.html |   4 +-
 .../api/components_tvshows_TVEpisodes.bs.html |   4 +-
 .../components_tvshows_TVListDetails.bs.html  |   4 +-
 .../components_tvshows_TVListOptions.bs.html  |   4 +-
 .../components_tvshows_TVSeasonRow.bs.html    |   4 +-
 ...mponents_tvshows_TVShowDescription.bs.html |   4 +-
 .../components_tvshows_TVShowDetails.bs.html  |   4 +-
 docs/api/components_video_OSD.bs.html         |   4 +-
 .../components_video_VideoPlayerView.bs.html  |   4 +-
 docs/api/data/search.json                     |   2 +-
 docs/api/index.html                           |   2 +-
 docs/api/module-AlbumData.html                |   2 +-
 docs/api/module-AlbumGrid.html                |   2 +-
 docs/api/module-AlbumTrackList.html           |   2 +-
 docs/api/module-AlbumView.html                |   2 +-
 docs/api/module-Alpha.html                    |   2 +-
 docs/api/module-ArtistView.html               |   2 +-
 docs/api/module-AudioPlayer.html              |   2 +-
 docs/api/module-AudioPlayerView.html          |   2 +-
 docs/api/module-AudioTrackListItem.html       |   2 +-
 docs/api/module-ButtonGroupHoriz.html         |   2 +-
 docs/api/module-ButtonGroupVert.html          |   2 +-
 docs/api/module-ChannelData.html              |   2 +-
 docs/api/module-Clock.html                    |   2 +-
 docs/api/module-CollectionData.html           |   2 +-
 docs/api/module-ConfigData.html               |   2 +-
 docs/api/module-ConfigItem.html               |   2 +-
 docs/api/module-ConfigList.html               |   2 +-
 docs/api/module-ExtrasItem.html               |   2 +-
 docs/api/module-ExtrasRowList.html            |   2 +-
 docs/api/module-FavoriteItemsTask.html        |   2 +-
 docs/api/module-FolderData.html               |   2 +-
 docs/api/module-GetFiltersTask.html           |   2 +-
 docs/api/module-GetNextEpisodeTask.html       |   2 +-
 docs/api/module-GetPlaybackInfoTask.html      |   2 +-
 docs/api/module-GetShuffleEpisodesTask.html   |   2 +-
 docs/api/module-GridItem.html                 |   2 +-
 docs/api/module-GridItemSmall.html            |   2 +-
 docs/api/module-Home.html                     |   2 +-
 docs/api/module-HomeData.html                 |   2 +-
 docs/api/module-HomeItem.html                 |   2 +-
 docs/api/module-HomeRowItemSizes.html         |   3 +
 docs/api/module-HomeRows.html                 |   2 +-
 docs/api/module-IconButton.html               |   2 +-
 docs/api/module-Image.html                    |   2 +-
 docs/api/module-ImageData.html                |   2 +-
 docs/api/module-IntegerKeyboard.html          |   2 +-
 docs/api/module-ItemGrid.html                 |   2 +-
 docs/api/module-ItemGridOptions.html          |   2 +-
 docs/api/module-Items.html                    |   2 +-
 docs/api/module-JFButton.html                 |   2 +-
 docs/api/module-JFButtons.html                |   2 +-
 docs/api/module-JFGroup.html                  |   2 +-
 docs/api/module-JFMessageDialog.html          |   2 +-
 docs/api/module-JFOverhang.html               |   2 +-
 docs/api/module-JFScene.html                  |   2 +-
 docs/api/module-JFScreen.html                 |   2 +-
 docs/api/module-JFServer.html                 |   2 +-
 docs/api/module-JFVideo.html                  |   2 +-
 docs/api/module-ListPoster.html               |   2 +-
 docs/api/module-LoadChannelsTask.html         |   2 +-
 docs/api/module-LoadItemsTask.html            |   2 +-
 docs/api/module-LoadItemsTask2.html           |   2 +-
 docs/api/module-LoadPhotoTask.html            |   2 +-
 docs/api/module-LoadProgramDetailsTask.html   |   2 +-
 .../module-LoadScreenSaverTimeoutTask.html    |   2 +-
 docs/api/module-LoadSheduleTask.html          |   2 +-
 docs/api/module-LoadVideoContentTask.html     |   2 +-
 docs/api/module-LoginScene.html               |   2 +-
 docs/api/module-Main.html                     |   2 +-
 docs/api/module-MovieData.html                |   2 +-
 docs/api/module-MovieDetails.html             |   2 +-
 docs/api/module-MovieLibraryView.html         |   2 +-
 docs/api/module-MovieOptions.html             |   2 +-
 docs/api/module-MusicAlbumData.html           |   2 +-
 docs/api/module-MusicAlbumSongListData.html   |   2 +-
 docs/api/module-MusicArtistData.html          |   2 +-
 docs/api/module-MusicArtistGridItem.html      |   2 +-
 docs/api/module-MusicLibraryView.html         |   2 +-
 docs/api/module-MusicSongData.html            |   2 +-
 docs/api/module-OSD.html                      |   2 +-
 docs/api/module-OptionNode.html               |   2 +-
 docs/api/module-OptionsButton.html            |   2 +-
 docs/api/module-OptionsData.html              |   2 +-
 docs/api/module-OptionsSlider.html            |   2 +-
 docs/api/module-OverviewDialog.html           |   2 +-
 docs/api/module-PersonData.html               |   2 +-
 docs/api/module-PersonDetails.html            |   2 +-
 docs/api/module-PhotoData.html                |   2 +-
 docs/api/module-PhotoDetails.html             |   2 +-
 docs/api/module-PlaybackDialog.html           |   2 +-
 docs/api/module-PlayedCheckmark.html          |   2 +-
 docs/api/module-PlaylistData.html             |   2 +-
 docs/api/module-PlaylistView.html             |   2 +-
 docs/api/module-PlaystateTask.html            |   2 +-
 docs/api/module-PostTask.html                 |   2 +-
 docs/api/module-ProgramDetails.html           |   2 +-
 docs/api/module-PublicUserData.html           |   2 +-
 docs/api/module-QueueManager.html             |   2 +-
 docs/api/module-QuickConnect.html             |   2 +-
 docs/api/module-QuickConnectDialog.html       |   2 +-
 docs/api/module-RadioDialog.html              |   2 +-
 docs/api/module-RecordProgramTask.html        |   2 +-
 docs/api/module-SceneManager.html             |   2 +-
 docs/api/module-ScheduleProgramData.html      |   2 +-
 docs/api/module-SearchBox.html                |   2 +-
 docs/api/module-SearchData.html               |   2 +-
 docs/api/module-SearchResults.html            |   2 +-
 docs/api/module-SearchRow.html                |   2 +-
 docs/api/module-SearchTask.html               |   2 +-
 docs/api/module-SeriesData.html               |   2 +-
 docs/api/module-ServerDiscoveryTask.html      |   2 +-
 docs/api/module-SetServerScreen.html          |   2 +-
 docs/api/module-ShowScenes.html               |   2 +-
 docs/api/module-SlideOutButton.html           |   2 +-
 docs/api/module-SongItem.html                 |   2 +-
 docs/api/module-Spinner.html                  |   2 +-
 docs/api/module-StandardDialog.html           |   2 +-
 docs/api/module-Subtitles.html                |   2 +-
 docs/api/module-TVEpisode.html                |   2 +-
 docs/api/module-TVEpisodeData.html            |   2 +-
 docs/api/module-TVEpisodeRow.html             |   2 +-
 docs/api/module-TVEpisodeRowWithOptions.html  |   2 +-
 docs/api/module-TVEpisodes.html               |   2 +-
 docs/api/module-TVListDetails.html            |   2 +-
 docs/api/module-TVListOptions.html            |   2 +-
 docs/api/module-TVSeasonData.html             |   2 +-
 docs/api/module-TVSeasonRow.html              |   2 +-
 docs/api/module-TVShowDescription.html        |   2 +-
 docs/api/module-TVShowDetails.html            |   2 +-
 docs/api/module-TextSizeTask.html             |   2 +-
 docs/api/module-UserData.html                 |   2 +-
 docs/api/module-UserItem.html                 |   2 +-
 docs/api/module-UserLibrary.html              |   2 +-
 docs/api/module-UserRow.html                  |   2 +-
 docs/api/module-UserSelect.html               |   2 +-
 docs/api/module-VideoData.html                |   2 +-
 docs/api/module-VideoPlayer.html              |   2 +-
 docs/api/module-VideoPlayerView.html          |   2 +-
 docs/api/module-VideoTrackListItem.html       |   2 +-
 docs/api/module-ViewCreator.html              |   2 +-
 docs/api/module-WhatsNewDialog.html           |   2 +-
 docs/api/module-baserequest.html              |   2 +-
 docs/api/module-captionTask.html              |   2 +-
 docs/api/module-conditional.html              |   2 +-
 docs/api/module-config.html                   |   2 +-
 docs/api/module-deviceCapabilities.html       |   2 +-
 docs/api/module-globals.html                  |   2 +-
 docs/api/module-homeRowItemSizes_.html        |   3 +
 docs/api/module-migrations.html               |   2 +-
 docs/api/module-misc.html                     |   2 +-
 docs/api/module-quickplay.html                |   2 +-
 docs/api/module-schedule.html                 |   2 +-
 docs/api/module-section.html                  |   2 +-
 docs/api/module-sectionScroller.html          |   2 +-
 docs/api/module-settings.html                 |   2 +-
 docs/api/module-userauth.html                 |   2 +-
 docs/api/source_Main.bs.html                  |   4 +-
 docs/api/source_ShowScenes.bs.html            |   4 +-
 docs/api/source_VideoPlayer.bs.html           |   4 +-
 docs/api/source_api_Image.bs.html             |   4 +-
 docs/api/source_api_Items.bs.html             |   4 +-
 docs/api/source_api_UserLibrary.bs.html       |   4 +-
 docs/api/source_api_baserequest.bs.html       |   4 +-
 docs/api/source_api_userauth.bs.html          |   4 +-
 .../source_constants_HomeRowItemSizes.bs.html |  10 +
 docs/api/source_migrations.bs.html            |  16 +-
 docs/api/source_utils_Subtitles.bs.html       |   4 +-
 docs/api/source_utils_conditional.bs.html     |   4 +-
 docs/api/source_utils_config.bs.html          |   4 +-
 .../source_utils_deviceCapabilities.bs.html   |   4 +-
 docs/api/source_utils_globals.bs.html         |   4 +-
 docs/api/source_utils_misc.bs.html            |   4 +-
 docs/api/source_utils_quickplay.bs.html       |   4 +-
 293 files changed, 861 insertions(+), 741 deletions(-)
 create mode 100644 docs/api/module-HomeRowItemSizes.html
 create mode 100644 docs/api/module-homeRowItemSizes_.html
 create mode 100644 docs/api/source_constants_HomeRowItemSizes.bs.html

diff --git a/docs/api/components_ButtonGroupHoriz.bs.html b/docs/api/components_ButtonGroupHoriz.bs.html
index 988abdac98..614ffa15d9 100644
--- a/docs/api/components_ButtonGroupHoriz.bs.html
+++ b/docs/api/components_ButtonGroupHoriz.bs.html
@@ -1,6 +1,6 @@
 Source: components/ButtonGroupHoriz.bs
On this page

components_ButtonGroupHoriz.bs

sub init()
+    
On this page

components_ButtonGroupHoriz.bs

sub init()
     m.top.layoutDirection = "horiz"
 end sub
 
@@ -25,4 +25,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ButtonGroupVert.bs.html b/docs/api/components_ButtonGroupVert.bs.html index 68cabe4af2..d89e3eff05 100644 --- a/docs/api/components_ButtonGroupVert.bs.html +++ b/docs/api/components_ButtonGroupVert.bs.html @@ -1,6 +1,6 @@ Source: components/ButtonGroupVert.bs
On this page

components_ButtonGroupVert.bs

sub init()
+    
On this page

components_ButtonGroupVert.bs

sub init()
     m.top.layoutDirection = "vert"
     m.top.observeField("focusedChild", "onFocusChanged")
     m.top.observeField("focusButton", "onFocusButtonChanged")
@@ -44,4 +44,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_Buttons_JFButtons.bs.html b/docs/api/components_Buttons_JFButtons.bs.html index 6712bb6502..6bc7eb3fa2 100644 --- a/docs/api/components_Buttons_JFButtons.bs.html +++ b/docs/api/components_Buttons_JFButtons.bs.html @@ -1,6 +1,6 @@ Source: components/Buttons/JFButtons.bs
On this page

components_Buttons_JFButtons.bs

sub init()
+    
On this page

components_Buttons_JFButtons.bs

sub init()
 
     m.top.focusable = true
 
@@ -122,4 +122,4 @@
     end if
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_Buttons_SlideOutButton.bs.html b/docs/api/components_Buttons_SlideOutButton.bs.html index effdc5caf1..55ebc91a28 100644 --- a/docs/api/components_Buttons_SlideOutButton.bs.html +++ b/docs/api/components_Buttons_SlideOutButton.bs.html @@ -1,6 +1,6 @@ Source: components/Buttons/SlideOutButton.bs
On this page

components_Buttons_SlideOutButton.bs

sub init()
+    
On this page

components_Buttons_SlideOutButton.bs

sub init()
     m.buttonBackground = m.top.findNode("buttonBackground")
     m.buttonIcon = m.top.findNode("buttonIcon")
     m.buttonText = m.top.findNode("buttonText")
@@ -100,4 +100,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_Buttons_TextSizeTask.bs.html b/docs/api/components_Buttons_TextSizeTask.bs.html index 6d4879af46..b20be0af82 100644 --- a/docs/api/components_Buttons_TextSizeTask.bs.html +++ b/docs/api/components_Buttons_TextSizeTask.bs.html @@ -1,6 +1,6 @@ Source: components/Buttons/TextSizeTask.bs
On this page

components_Buttons_TextSizeTask.bs

sub init()
+    
On this page

components_Buttons_TextSizeTask.bs

sub init()
     m.top.functionName = "getTextSize"
 end sub
 
@@ -21,4 +21,4 @@
     m.top.width = res
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_Clock.bs.html b/docs/api/components_Clock.bs.html index 57454cc361..9b09988cf5 100644 --- a/docs/api/components_Clock.bs.html +++ b/docs/api/components_Clock.bs.html @@ -1,6 +1,6 @@ Source: components/Clock.bs
On this page

components_Clock.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_Clock.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
 
@@ -39,4 +39,4 @@
     ' Format time as requested
     m.clockTime.text = m.dateTimeObject.asTimeStringLoc(m.format)
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_GetNextEpisodeTask.bs.html b/docs/api/components_GetNextEpisodeTask.bs.html index 3770b61f97..b38ca1ce2b 100644 --- a/docs/api/components_GetNextEpisodeTask.bs.html +++ b/docs/api/components_GetNextEpisodeTask.bs.html @@ -1,6 +1,6 @@ Source: components/GetNextEpisodeTask.bs
On this page

components_GetNextEpisodeTask.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_GetNextEpisodeTask.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/sdk.bs"
 
 sub init()
@@ -16,4 +16,4 @@
 
     m.top.nextEpisodeData = m.nextEpisodeData
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_GetPlaybackInfoTask.bs.html b/docs/api/components_GetPlaybackInfoTask.bs.html index d696722e87..1df0bd1960 100644 --- a/docs/api/components_GetPlaybackInfoTask.bs.html +++ b/docs/api/components_GetPlaybackInfoTask.bs.html @@ -1,6 +1,6 @@ Source: components/GetPlaybackInfoTask.bs
On this page

components_GetPlaybackInfoTask.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_GetPlaybackInfoTask.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/deviceCapabilities.bs"
 import "pkg:/source/api/baserequest.bs"
@@ -170,4 +170,4 @@
         return Str(Fix(bitrate / 1000)) + " Kbps"
     end if
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_GetShuffleEpisodesTask.bs.html b/docs/api/components_GetShuffleEpisodesTask.bs.html index f9f763ef67..ce5b7600b9 100644 --- a/docs/api/components_GetShuffleEpisodesTask.bs.html +++ b/docs/api/components_GetShuffleEpisodesTask.bs.html @@ -1,6 +1,6 @@ Source: components/GetShuffleEpisodesTask.bs
On this page

components_GetShuffleEpisodesTask.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_GetShuffleEpisodesTask.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/sdk.bs"
 
 sub init()
@@ -16,4 +16,4 @@
 
     m.top.data = data
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_IconButton.bs.html b/docs/api/components_IconButton.bs.html index ed4a6eb665..4b060b41a3 100644 --- a/docs/api/components_IconButton.bs.html +++ b/docs/api/components_IconButton.bs.html @@ -1,6 +1,6 @@ Source: components/IconButton.bs
On this page

components_IconButton.bs

sub init()
+    
On this page

components_IconButton.bs

sub init()
     m.buttonBackground = m.top.findNode("buttonBackground")
     m.buttonIcon = m.top.findNode("buttonIcon")
     m.buttonText = m.top.findNode("buttonText")
@@ -81,4 +81,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_Alpha.bs.html b/docs/api/components_ItemGrid_Alpha.bs.html index 529e69f022..adef064f6e 100644 --- a/docs/api/components_ItemGrid_Alpha.bs.html +++ b/docs/api/components_ItemGrid_Alpha.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/Alpha.bs
On this page

components_ItemGrid_Alpha.bs

sub init()
+    
On this page

components_ItemGrid_Alpha.bs

sub init()
     m.top.visible = true
     m.Alphamenu = m.top.findNode("Alphamenu")
     m.Alphamenu.focusable = true
@@ -43,4 +43,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_FavoriteItemsTask.bs.html b/docs/api/components_ItemGrid_FavoriteItemsTask.bs.html index 68ec0fc467..5a93e86b84 100644 --- a/docs/api/components_ItemGrid_FavoriteItemsTask.bs.html +++ b/docs/api/components_ItemGrid_FavoriteItemsTask.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/FavoriteItemsTask.bs
On this page

components_ItemGrid_FavoriteItemsTask.bs

import "pkg:/source/api/UserLibrary.bs"
+    
On this page

components_ItemGrid_FavoriteItemsTask.bs

import "pkg:/source/api/UserLibrary.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -19,4 +19,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_GridItem.bs.html b/docs/api/components_ItemGrid_GridItem.bs.html index 8ddf623fb3..1b2d2eb906 100644 --- a/docs/api/components_ItemGrid_GridItem.bs.html +++ b/docs/api/components_ItemGrid_GridItem.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/GridItem.bs
On this page

components_ItemGrid_GridItem.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_ItemGrid_GridItem.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
 import "pkg:/source/roku_modules/log/LogMixin.brs"
 
@@ -171,4 +171,4 @@
         m.posterText.visible = false
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_GridItemSmall.bs.html b/docs/api/components_ItemGrid_GridItemSmall.bs.html index e49d19d279..8e9616ac54 100644 --- a/docs/api/components_ItemGrid_GridItemSmall.bs.html +++ b/docs/api/components_ItemGrid_GridItemSmall.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/GridItemSmall.bs
On this page

components_ItemGrid_GridItemSmall.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_ItemGrid_GridItemSmall.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -71,4 +71,4 @@
         m.posterText.visible = false
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_ItemGrid.bs.html b/docs/api/components_ItemGrid_ItemGrid.bs.html index 44696d8368..2560acc7a2 100644 --- a/docs/api/components_ItemGrid_ItemGrid.bs.html +++ b/docs/api/components_ItemGrid_ItemGrid.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/ItemGrid.bs
On this page

components_ItemGrid_ItemGrid.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_ItemGrid_ItemGrid.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/deviceCapabilities.bs"
@@ -901,4 +901,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_ItemGridOptions.bs.html b/docs/api/components_ItemGrid_ItemGridOptions.bs.html index 109f06785d..0dc9095202 100644 --- a/docs/api/components_ItemGrid_ItemGridOptions.bs.html +++ b/docs/api/components_ItemGrid_ItemGridOptions.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/ItemGridOptions.bs
On this page

components_ItemGrid_ItemGridOptions.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_ItemGrid_ItemGridOptions.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/roku_modules/log/LogMixin.brs"
 
 sub init()
@@ -388,4 +388,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_LoadItemsTask2.bs.html b/docs/api/components_ItemGrid_LoadItemsTask2.bs.html index 5a992d91bc..c2d481835b 100644 --- a/docs/api/components_ItemGrid_LoadItemsTask2.bs.html +++ b/docs/api/components_ItemGrid_LoadItemsTask2.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/LoadItemsTask2.bs
On this page

components_ItemGrid_LoadItemsTask2.bs

import "pkg:/source/api/Items.bs"
+    
On this page

components_ItemGrid_LoadItemsTask2.bs

import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
@@ -265,4 +265,4 @@
     end if
     m.top.content = results
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html index 46ab3760ac..b70280880c 100644 --- a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html +++ b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/LoadVideoContentTask.bs
On this page

components_ItemGrid_LoadVideoContentTask.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_ItemGrid_LoadVideoContentTask.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/UserLibrary.bs"
 import "pkg:/source/api/baserequest.bs"
@@ -909,4 +909,4 @@
         "zza": "Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki"
     }
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_MovieLibraryView.bs.html b/docs/api/components_ItemGrid_MovieLibraryView.bs.html index 6b1cac15e0..41a50e6b01 100644 --- a/docs/api/components_ItemGrid_MovieLibraryView.bs.html +++ b/docs/api/components_ItemGrid_MovieLibraryView.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/MovieLibraryView.bs
On this page

components_ItemGrid_MovieLibraryView.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_ItemGrid_MovieLibraryView.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/api/Image.bs"
@@ -936,4 +936,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html b/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html index b5d61c9c43..104b5751cf 100644 --- a/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html +++ b/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/MusicArtistGridItem.bs
On this page

components_ItemGrid_MusicArtistGridItem.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_ItemGrid_MusicArtistGridItem.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -83,4 +83,4 @@
         m.backdrop.visible = false
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_MusicLibraryView.bs.html b/docs/api/components_ItemGrid_MusicLibraryView.bs.html index c1ceb54230..ac3235d24a 100644 --- a/docs/api/components_ItemGrid_MusicLibraryView.bs.html +++ b/docs/api/components_ItemGrid_MusicLibraryView.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/MusicLibraryView.bs
On this page

components_ItemGrid_MusicLibraryView.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_ItemGrid_MusicLibraryView.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/api/Image.bs"
@@ -796,4 +796,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFButton.bs.html b/docs/api/components_JFButton.bs.html index 0760c90362..14f835c32e 100644 --- a/docs/api/components_JFButton.bs.html +++ b/docs/api/components_JFButton.bs.html @@ -1,6 +1,6 @@ Source: components/JFButton.bs
On this page

components_JFButton.bs

sub init()
+    
On this page

components_JFButton.bs

sub init()
     m.top.observeFieldScoped("text", "onTextChanged")
     m.top.iconUri = ""
     m.top.focusedIconUri = ""
@@ -24,4 +24,4 @@
         addSpaceAfter = addSpaceAfter = false
     end while
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFGroup.bs.html b/docs/api/components_JFGroup.bs.html index 8357cc217f..dc48d614d7 100644 --- a/docs/api/components_JFGroup.bs.html +++ b/docs/api/components_JFGroup.bs.html @@ -1,6 +1,6 @@ Source: components/JFGroup.bs
On this page

components_JFGroup.bs

sub init()
+    
On this page

components_JFGroup.bs

sub init()
 end sub
 
 function onKeyEvent(key as string, press as boolean) as boolean
@@ -8,4 +8,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFMessageDialog.bs.html b/docs/api/components_JFMessageDialog.bs.html index f2e1bc2a27..05e90a00ea 100644 --- a/docs/api/components_JFMessageDialog.bs.html +++ b/docs/api/components_JFMessageDialog.bs.html @@ -1,6 +1,6 @@ Source: components/JFMessageDialog.bs
On this page

components_JFMessageDialog.bs

sub init()
+    
On this page

components_JFMessageDialog.bs

sub init()
     options = m.top.findNode("optionList")
     options.focusBitmapBlendColor = "0x0cb0e8"
     options.color = "0xffffff"
@@ -73,4 +73,4 @@
 
     m.top.translation = [(1920 - boxWidth) / 2, (1080 - boxHeight) / 2]
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFOverhang.bs.html b/docs/api/components_JFOverhang.bs.html index 34076d55d2..0dc30a3cbc 100644 --- a/docs/api/components_JFOverhang.bs.html +++ b/docs/api/components_JFOverhang.bs.html @@ -1,6 +1,6 @@ Source: components/JFOverhang.bs
On this page

components_JFOverhang.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_JFOverhang.bs

import "pkg:/source/utils/config.bs"
 
 sub init()
     m.top.id = "overhang"
@@ -147,4 +147,4 @@
         m.optionStar.visible = false
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFScene.bs.html b/docs/api/components_JFScene.bs.html index f2c70bda5c..b9a4d951e3 100644 --- a/docs/api/components_JFScene.bs.html +++ b/docs/api/components_JFScene.bs.html @@ -1,6 +1,6 @@ Source: components/JFScene.bs
On this page

components_JFScene.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_JFScene.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.top.backgroundColor = "#262626" '"#101010"
@@ -47,4 +47,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFScreen.bs.html b/docs/api/components_JFScreen.bs.html index 52131aa46b..dbdc69b30a 100644 --- a/docs/api/components_JFScreen.bs.html +++ b/docs/api/components_JFScreen.bs.html @@ -1,6 +1,6 @@ Source: components/JFScreen.bs
On this page

components_JFScreen.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
+    
On this page

components_JFScreen.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
 
 sub init()
     ' initialize the log manager. second param sets log output:
@@ -24,4 +24,4 @@
 sub OnScreenHidden()
 end sub
 
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFVideo.bs.html b/docs/api/components_JFVideo.bs.html index 4d0abd46a6..bf96dc6bf1 100644 --- a/docs/api/components_JFVideo.bs.html +++ b/docs/api/components_JFVideo.bs.html @@ -1,6 +1,6 @@ Source: components/JFVideo.bs
On this page

components_JFVideo.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_JFVideo.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -313,4 +313,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ListPoster.bs.html b/docs/api/components_ListPoster.bs.html index 41eebb2114..998d630970 100644 --- a/docs/api/components_ListPoster.bs.html +++ b/docs/api/components_ListPoster.bs.html @@ -1,6 +1,6 @@ Source: components/ListPoster.bs
On this page

components_ListPoster.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_ListPoster.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
 
 sub init()
@@ -116,4 +116,4 @@
         m.title.visible = false
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_OverviewDialog.bs.html b/docs/api/components_OverviewDialog.bs.html index 827ae19031..4ebb792a2d 100644 --- a/docs/api/components_OverviewDialog.bs.html +++ b/docs/api/components_OverviewDialog.bs.html @@ -1,6 +1,6 @@ Source: components/OverviewDialog.bs
On this page

components_OverviewDialog.bs

sub setTitle()
+    
On this page

components_OverviewDialog.bs

sub setTitle()
     m.top.findNode("titleArea").primaryTitle = m.top.title
 end sub
 
@@ -17,4 +17,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_PersonDetails.bs.html b/docs/api/components_PersonDetails.bs.html index 966128583b..7a3fbf72bb 100644 --- a/docs/api/components_PersonDetails.bs.html +++ b/docs/api/components_PersonDetails.bs.html @@ -1,6 +1,6 @@ Source: components/PersonDetails.bs
On this page

components_PersonDetails.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_PersonDetails.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -174,4 +174,4 @@
     myDate.FromISO8601String(isoDate)
     return myDate.AsDateString("short-month-no-weekday")
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_PlaybackDialog.bs.html b/docs/api/components_PlaybackDialog.bs.html index db57bee1d3..74390d2301 100644 --- a/docs/api/components_PlaybackDialog.bs.html +++ b/docs/api/components_PlaybackDialog.bs.html @@ -1,6 +1,6 @@ Source: components/PlaybackDialog.bs
On this page

components_PlaybackDialog.bs

function onKeyEvent(key as string, press as boolean) as boolean
+    
On this page

components_PlaybackDialog.bs

function onKeyEvent(key as string, press as boolean) as boolean
 
     if key = "OK"
         m.top.close = true
@@ -9,4 +9,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_PlayedCheckmark.bs.html b/docs/api/components_PlayedCheckmark.bs.html index 0062fdf97c..ee11e3d646 100644 --- a/docs/api/components_PlayedCheckmark.bs.html +++ b/docs/api/components_PlayedCheckmark.bs.html @@ -1,7 +1,7 @@ Source: components/PlayedCheckmark.bs
On this page

components_PlayedCheckmark.bs

sub init()
+    
On this page

components_PlayedCheckmark.bs

sub init()
     checkmark = m.top.findNode("checkmark")
     checkmark.font.size = 48
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_PlaystateTask.bs.html b/docs/api/components_PlaystateTask.bs.html index 0e17226a20..9224a858fa 100644 --- a/docs/api/components_PlaystateTask.bs.html +++ b/docs/api/components_PlaystateTask.bs.html @@ -1,6 +1,6 @@ Source: components/PlaystateTask.bs
On this page

components_PlaystateTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_PlaystateTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -54,4 +54,4 @@
     end for
     return FormatJson(new_params)
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_RadioDialog.bs.html b/docs/api/components_RadioDialog.bs.html index 32d6470873..b677f3478d 100644 --- a/docs/api/components_RadioDialog.bs.html +++ b/docs/api/components_RadioDialog.bs.html @@ -1,6 +1,6 @@ Source: components/RadioDialog.bs
On this page

components_RadioDialog.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_RadioDialog.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.contentArea = m.top.findNode("contentArea")
@@ -138,4 +138,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_SearchBox.bs.html b/docs/api/components_SearchBox.bs.html index aa96492f54..142fc1b8f4 100644 --- a/docs/api/components_SearchBox.bs.html +++ b/docs/api/components_SearchBox.bs.html @@ -1,6 +1,6 @@ Source: components/SearchBox.bs
On this page

components_SearchBox.bs

import "pkg:/source/api/Items.bs"
+    
On this page

components_SearchBox.bs

import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/Image.bs"
@@ -33,4 +33,4 @@
         m.searchText.textEditBox.leadingEllipsis = false
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_Spinner.bs.html b/docs/api/components_Spinner.bs.html index 468d57cddf..704a168616 100644 --- a/docs/api/components_Spinner.bs.html +++ b/docs/api/components_Spinner.bs.html @@ -1,9 +1,9 @@ Source: components/Spinner.bs
On this page

components_Spinner.bs

sub init()
+    
On this page

components_Spinner.bs

sub init()
     m.top.poster.uri = "pkg:/images/spinner.png"
     m.top.control = "start"
     m.top.clockwise = true
     m.top.spinInterval = 1
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_StandardDialog.bs.html b/docs/api/components_StandardDialog.bs.html index be2bde972f..e35837e15e 100644 --- a/docs/api/components_StandardDialog.bs.html +++ b/docs/api/components_StandardDialog.bs.html @@ -1,6 +1,6 @@ Source: components/StandardDialog.bs
On this page

components_StandardDialog.bs

sub init()
+    
On this page

components_StandardDialog.bs

sub init()
     m.content = m.top.findNode("content")
     m.top.observeField("contentData", "onContentDataChanged")
 
@@ -36,4 +36,4 @@
         textLine.text = item
     end for
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_WhatsNewDialog.bs.html b/docs/api/components_WhatsNewDialog.bs.html index 95d246e61f..523ebf6e29 100644 --- a/docs/api/components_WhatsNewDialog.bs.html +++ b/docs/api/components_WhatsNewDialog.bs.html @@ -1,6 +1,6 @@ Source: components/WhatsNewDialog.bs
On this page

components_WhatsNewDialog.bs

sub init()
+    
On this page

components_WhatsNewDialog.bs

sub init()
     m.content = m.top.findNode("content")
 
     setPalette()
@@ -46,4 +46,4 @@
 
     m.top.palette = dlgPalette
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_captionTask.bs.html b/docs/api/components_captionTask.bs.html index c9d4e5761d..3c0835115b 100644 --- a/docs/api/components_captionTask.bs.html +++ b/docs/api/components_captionTask.bs.html @@ -1,6 +1,6 @@ Source: components/captionTask.bs
On this page

components_captionTask.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_captionTask.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/baserequest.bs"
 
 sub init()
@@ -150,4 +150,4 @@
     end for
     return entries
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_ConfigData.bs.html b/docs/api/components_config_ConfigData.bs.html index d310d63d08..6bb11b8a91 100644 --- a/docs/api/components_config_ConfigData.bs.html +++ b/docs/api/components_config_ConfigData.bs.html @@ -1,5 +1,5 @@ Source: components/config/ConfigData.bs
On this page

components_config_ConfigData.bs

sub init()
+    
On this page

components_config_ConfigData.bs

sub init()
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_ConfigItem.bs.html b/docs/api/components_config_ConfigItem.bs.html index 9e97ddfe9b..5d891006eb 100644 --- a/docs/api/components_config_ConfigItem.bs.html +++ b/docs/api/components_config_ConfigItem.bs.html @@ -1,6 +1,6 @@ Source: components/config/ConfigItem.bs
On this page

components_config_ConfigItem.bs

sub init()
+    
On this page

components_config_ConfigItem.bs

sub init()
     m.name = m.top.findNode("label")
     m.value = m.top.findNode("value")
 
@@ -37,4 +37,4 @@
     m.value.textColor = color
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_ConfigList.bs.html b/docs/api/components_config_ConfigList.bs.html index 41c024798e..2bb89f952e 100644 --- a/docs/api/components_config_ConfigList.bs.html +++ b/docs/api/components_config_ConfigList.bs.html @@ -1,6 +1,6 @@ Source: components/config/ConfigList.bs
On this page

components_config_ConfigList.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_config_ConfigList.bs

import "pkg:/source/utils/config.bs"
 
 sub init()
     m.top.itemComponentName = "ConfigItem"
@@ -76,4 +76,4 @@
 sub dismiss_dialog()
     m.dialog.close = true
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_JFServer.bs.html b/docs/api/components_config_JFServer.bs.html index f974c1dee1..00100ba0d5 100644 --- a/docs/api/components_config_JFServer.bs.html +++ b/docs/api/components_config_JFServer.bs.html @@ -1,6 +1,6 @@ Source: components/config/JFServer.bs
On this page

components_config_JFServer.bs

sub init() as void
+    
On this page

components_config_JFServer.bs

sub init() as void
     m.poster = m.top.findNode("poster")
     m.name = m.top.findNode("name")
     m.baseUrl = m.top.findNode("baseUrl")
@@ -34,4 +34,4 @@
         child.color = color
     end for
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_LoginScene.bs.html b/docs/api/components_config_LoginScene.bs.html index 653cbd9833..aaac8008d5 100644 --- a/docs/api/components_config_LoginScene.bs.html +++ b/docs/api/components_config_LoginScene.bs.html @@ -1,6 +1,6 @@ Source: components/config/LoginScene.bs
On this page

components_config_LoginScene.bs

sub init()
+    
On this page

components_config_LoginScene.bs

sub init()
     m.top.setFocus(true)
     m.top.optionsAvailable = false
 end sub
@@ -46,4 +46,4 @@
     end if
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_ServerDiscoveryTask.bs.html b/docs/api/components_config_ServerDiscoveryTask.bs.html index d7bf2139df..1598f2355a 100644 --- a/docs/api/components_config_ServerDiscoveryTask.bs.html +++ b/docs/api/components_config_ServerDiscoveryTask.bs.html @@ -1,6 +1,6 @@ Source: components/config/ServerDiscoveryTask.bs
On this page

components_config_ServerDiscoveryTask.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
+    
On this page

components_config_ServerDiscoveryTask.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
 
 '
 ' Task used to discover jellyfin servers on the local network
@@ -171,4 +171,4 @@
         end if
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_SetServerScreen.bs.html b/docs/api/components_config_SetServerScreen.bs.html index ba2fe7683b..28fbf33ed1 100644 --- a/docs/api/components_config_SetServerScreen.bs.html +++ b/docs/api/components_config_SetServerScreen.bs.html @@ -1,6 +1,6 @@ Source: components/config/SetServerScreen.bs
On this page

components_config_SetServerScreen.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
+    
On this page

components_config_SetServerScreen.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -158,4 +158,4 @@
 sub clearErrorMessage()
     m.top.errorMessage = ""
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_AlbumData.bs.html b/docs/api/components_data_AlbumData.bs.html index 928d63ce58..a9c01bdf5e 100644 --- a/docs/api/components_data_AlbumData.bs.html +++ b/docs/api/components_data_AlbumData.bs.html @@ -1,10 +1,10 @@ Source: components/data/AlbumData.bs
On this page

components_data_AlbumData.bs

sub setFields()
+    
On this page

components_data_AlbumData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
     m.top.title = datum.name
 end sub
 
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_ChannelData.bs.html b/docs/api/components_data_ChannelData.bs.html index 57aa93e4ef..4fa16f9751 100644 --- a/docs/api/components_data_ChannelData.bs.html +++ b/docs/api/components_data_ChannelData.bs.html @@ -1,6 +1,6 @@ Source: components/data/ChannelData.bs
On this page

components_data_ChannelData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_ChannelData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -24,4 +24,4 @@
         m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_CollectionData.bs.html b/docs/api/components_data_CollectionData.bs.html index 4ce1fc9560..40d361222a 100644 --- a/docs/api/components_data_CollectionData.bs.html +++ b/docs/api/components_data_CollectionData.bs.html @@ -1,6 +1,6 @@ Source: components/data/CollectionData.bs
On this page

components_data_CollectionData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_CollectionData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -40,4 +40,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_FolderData.bs.html b/docs/api/components_data_FolderData.bs.html index 507e89cb1f..acb42e0cde 100644 --- a/docs/api/components_data_FolderData.bs.html +++ b/docs/api/components_data_FolderData.bs.html @@ -1,6 +1,6 @@ Source: components/data/FolderData.bs
On this page

components_data_FolderData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_FolderData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -33,4 +33,4 @@
 end sub
 
 'TODO Set network Poster image
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_GetFiltersTask.bs.html b/docs/api/components_data_GetFiltersTask.bs.html index bddef49392..523c622a9a 100644 --- a/docs/api/components_data_GetFiltersTask.bs.html +++ b/docs/api/components_data_GetFiltersTask.bs.html @@ -1,6 +1,6 @@ Source: components/data/GetFiltersTask.bs
On this page

components_data_GetFiltersTask.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_data_GetFiltersTask.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/sdk.bs"
 
 sub init()
@@ -11,4 +11,4 @@
     m.filters = api.items.GetFilters(m.top.params)
     m.top.filters = m.filters
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_HomeData.bs.html b/docs/api/components_data_HomeData.bs.html index 1a167cf71f..0e618fd2b2 100644 --- a/docs/api/components_data_HomeData.bs.html +++ b/docs/api/components_data_HomeData.bs.html @@ -1,6 +1,6 @@ Source: components/data/HomeData.bs
On this page

components_data_HomeData.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_data_HomeData.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/Image.bs"
 
@@ -136,4 +136,4 @@
         m.top.posterUrl = m.top.thumbnailURL
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_ImageData.bs.html b/docs/api/components_data_ImageData.bs.html index 7317cea983..b8fe9093f5 100644 --- a/docs/api/components_data_ImageData.bs.html +++ b/docs/api/components_data_ImageData.bs.html @@ -1,10 +1,10 @@ Source: components/data/ImageData.bs
On this page

components_data_ImageData.bs

sub setFields()
+    
On this page

components_data_ImageData.bs

sub setFields()
     json = m.top.json
     m.top.imagetype = json.imagetype
     m.top.size = json.size
     m.top.height = json.height
     m.top.width = json.width
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_MovieData.bs.html b/docs/api/components_data_MovieData.bs.html index a7a646adc5..a2bf6b1546 100644 --- a/docs/api/components_data_MovieData.bs.html +++ b/docs/api/components_data_MovieData.bs.html @@ -1,6 +1,6 @@ Source: components/data/MovieData.bs
On this page

components_data_MovieData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_MovieData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
@@ -80,4 +80,4 @@
         m.top.container = "mp4"
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_MusicAlbumData.bs.html b/docs/api/components_data_MusicAlbumData.bs.html index 8a54f836ec..0fcf048a02 100644 --- a/docs/api/components_data_MusicAlbumData.bs.html +++ b/docs/api/components_data_MusicAlbumData.bs.html @@ -1,6 +1,6 @@ Source: components/data/MusicAlbumData.bs
On this page

components_data_MusicAlbumData.bs

sub setFields()
+    
On this page

components_data_MusicAlbumData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
@@ -15,4 +15,4 @@
         m.top.posterURL = ""
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_MusicAlbumSongListData.bs.html b/docs/api/components_data_MusicAlbumSongListData.bs.html index 5e9e8ca368..702a84814d 100644 --- a/docs/api/components_data_MusicAlbumSongListData.bs.html +++ b/docs/api/components_data_MusicAlbumSongListData.bs.html @@ -1,6 +1,6 @@ Source: components/data/MusicAlbumSongListData.bs
On this page

components_data_MusicAlbumSongListData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_MusicAlbumSongListData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -36,4 +36,4 @@
 
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_MusicArtistData.bs.html b/docs/api/components_data_MusicArtistData.bs.html index af3fe1b02a..8d183814bc 100644 --- a/docs/api/components_data_MusicArtistData.bs.html +++ b/docs/api/components_data_MusicArtistData.bs.html @@ -1,6 +1,6 @@ Source: components/data/MusicArtistData.bs
On this page

components_data_MusicArtistData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_MusicArtistData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -39,4 +39,4 @@
 
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_MusicSongData.bs.html b/docs/api/components_data_MusicSongData.bs.html index 37918e89e2..d3916185a9 100644 --- a/docs/api/components_data_MusicSongData.bs.html +++ b/docs/api/components_data_MusicSongData.bs.html @@ -1,6 +1,6 @@ Source: components/data/MusicSongData.bs
On this page

components_data_MusicSongData.bs

sub setFields()
+    
On this page

components_data_MusicSongData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
@@ -17,4 +17,4 @@
         m.top.posterURL = ""
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_OptionsButton.bs.html b/docs/api/components_data_OptionsButton.bs.html index 77e882f46f..bece1b12b5 100644 --- a/docs/api/components_data_OptionsButton.bs.html +++ b/docs/api/components_data_OptionsButton.bs.html @@ -1,10 +1,10 @@ Source: components/data/OptionsButton.bs
On this page

components_data_OptionsButton.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_data_OptionsButton.bs

import "pkg:/source/utils/config.bs"
 
 sub init()
 end sub
 
 sub press()
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_OptionsData.bs.html b/docs/api/components_data_OptionsData.bs.html index aa2135b576..4f70a6bb6c 100644 --- a/docs/api/components_data_OptionsData.bs.html +++ b/docs/api/components_data_OptionsData.bs.html @@ -1,6 +1,6 @@ Source: components/data/OptionsData.bs
On this page

components_data_OptionsData.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_data_OptionsData.bs

import "pkg:/source/utils/config.bs"
 
 sub init()
     m.top.value_index = 0
@@ -40,4 +40,4 @@
         set_user_setting(m.top.config_key, m.top.value)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_PersonData.bs.html b/docs/api/components_data_PersonData.bs.html index fbdcc05b35..32872aadfa 100644 --- a/docs/api/components_data_PersonData.bs.html +++ b/docs/api/components_data_PersonData.bs.html @@ -1,6 +1,6 @@ Source: components/data/PersonData.bs
On this page

components_data_PersonData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_PersonData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -36,4 +36,4 @@
 
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_PhotoData.bs.html b/docs/api/components_data_PhotoData.bs.html index 414a03e7fc..f8bf403f28 100644 --- a/docs/api/components_data_PhotoData.bs.html +++ b/docs/api/components_data_PhotoData.bs.html @@ -1,6 +1,6 @@ Source: components/data/PhotoData.bs
On this page

components_data_PhotoData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_PhotoData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -38,4 +38,4 @@
 
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_PlaylistData.bs.html b/docs/api/components_data_PlaylistData.bs.html index 9e36d0abbe..2bcbbaf8cb 100644 --- a/docs/api/components_data_PlaylistData.bs.html +++ b/docs/api/components_data_PlaylistData.bs.html @@ -1,6 +1,6 @@ Source: components/data/PlaylistData.bs
On this page

components_data_PlaylistData.bs

sub setFields()
+    
On this page

components_data_PlaylistData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
@@ -15,4 +15,4 @@
         m.top.posterURL = ""
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_PublicUserData.bs.html b/docs/api/components_data_PublicUserData.bs.html index cccd32c153..88b931b417 100644 --- a/docs/api/components_data_PublicUserData.bs.html +++ b/docs/api/components_data_PublicUserData.bs.html @@ -1,5 +1,5 @@ Source: components/data/PublicUserData.bs
On this page

components_data_PublicUserData.bs

sub init()
+    
On this page

components_data_PublicUserData.bs

sub init()
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_SceneManager.bs.html b/docs/api/components_data_SceneManager.bs.html index 3833fb0a3a..066ec948a2 100644 --- a/docs/api/components_data_SceneManager.bs.html +++ b/docs/api/components_data_SceneManager.bs.html @@ -1,6 +1,6 @@ Source: components/data/SceneManager.bs
On this page

components_data_SceneManager.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
+    
On this page

components_data_SceneManager.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
 import "pkg:/source/utils/misc.bs"
 
 sub init()
@@ -355,4 +355,4 @@
 function isDialogOpen() as boolean
     return m.scene.dialog <> invalid
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_ScheduleProgramData.bs.html b/docs/api/components_data_ScheduleProgramData.bs.html index a933bfed32..9c00c482eb 100644 --- a/docs/api/components_data_ScheduleProgramData.bs.html +++ b/docs/api/components_data_ScheduleProgramData.bs.html @@ -1,6 +1,6 @@ Source: components/data/ScheduleProgramData.bs
On this page

components_data_ScheduleProgramData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_ScheduleProgramData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -47,4 +47,4 @@
         end if
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_SearchData.bs.html b/docs/api/components_data_SearchData.bs.html index 2b2c758eba..a6946d7947 100644 --- a/docs/api/components_data_SearchData.bs.html +++ b/docs/api/components_data_SearchData.bs.html @@ -1,6 +1,6 @@ Source: components/data/SearchData.bs
On this page

components_data_SearchData.bs

sub setFields()
+    
On this page

components_data_SearchData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
@@ -15,4 +15,4 @@
         m.top.posterURL = ""
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_SeriesData.bs.html b/docs/api/components_data_SeriesData.bs.html index 1d7d2df815..f805d56bcf 100644 --- a/docs/api/components_data_SeriesData.bs.html +++ b/docs/api/components_data_SeriesData.bs.html @@ -1,6 +1,6 @@ Source: components/data/SeriesData.bs
On this page

components_data_SeriesData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_SeriesData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -53,4 +53,4 @@
 
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_TVEpisode.bs.html b/docs/api/components_data_TVEpisode.bs.html index 8c9e401a84..df95324960 100644 --- a/docs/api/components_data_TVEpisode.bs.html +++ b/docs/api/components_data_TVEpisode.bs.html @@ -1,6 +1,6 @@ Source: components/data/TVEpisode.bs
On this page

components_data_TVEpisode.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_TVEpisode.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -25,4 +25,4 @@
         m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_TVEpisodeData.bs.html b/docs/api/components_data_TVEpisodeData.bs.html index 12fa5692a1..88ba804496 100644 --- a/docs/api/components_data_TVEpisodeData.bs.html +++ b/docs/api/components_data_TVEpisodeData.bs.html @@ -1,6 +1,6 @@ Source: components/data/TVEpisodeData.bs
On this page

components_data_TVEpisodeData.bs

sub setFields()
+    
On this page

components_data_TVEpisodeData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
@@ -18,4 +18,4 @@
         m.top.posterURL = ""
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_TVSeasonData.bs.html b/docs/api/components_data_TVSeasonData.bs.html index 06fae632be..3bac9a9ead 100644 --- a/docs/api/components_data_TVSeasonData.bs.html +++ b/docs/api/components_data_TVSeasonData.bs.html @@ -1,6 +1,6 @@ Source: components/data/TVSeasonData.bs
On this page

components_data_TVSeasonData.bs

sub setFields()
+    
On this page

components_data_TVSeasonData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
@@ -18,4 +18,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_UserData.bs.html b/docs/api/components_data_UserData.bs.html index 6d6c69fba9..4012387715 100644 --- a/docs/api/components_data_UserData.bs.html +++ b/docs/api/components_data_UserData.bs.html @@ -1,6 +1,6 @@ Source: components/data/UserData.bs
On this page

components_data_UserData.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_data_UserData.bs

import "pkg:/source/utils/config.bs"
 
 sub setDataFromJSON()
     json = m.top.json
@@ -58,4 +58,4 @@
 sub setServer(hostname as string)
     m.top.server = hostname
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_VideoData.bs.html b/docs/api/components_data_VideoData.bs.html index e94186535f..c5abc23ecb 100644 --- a/docs/api/components_data_VideoData.bs.html +++ b/docs/api/components_data_VideoData.bs.html @@ -1,6 +1,6 @@ Source: components/data/VideoData.bs
On this page

components_data_VideoData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_VideoData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -25,4 +25,4 @@
         m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_extras_ExtrasItem.bs.html b/docs/api/components_extras_ExtrasItem.bs.html index 0020cf2d2e..e0d1075bba 100644 --- a/docs/api/components_extras_ExtrasItem.bs.html +++ b/docs/api/components_extras_ExtrasItem.bs.html @@ -1,6 +1,6 @@ Source: components/extras/ExtrasItem.bs
On this page

components_extras_ExtrasItem.bs

sub init()
+    
On this page

components_extras_ExtrasItem.bs

sub init()
     m.posterImg = m.top.findNode("posterImg")
     m.name = m.top.findNode("pLabel")
     m.role = m.top.findNode("subTitle")
@@ -37,4 +37,4 @@
         txt2Speech.Say(m.role.text)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_extras_ExtrasRowList.bs.html b/docs/api/components_extras_ExtrasRowList.bs.html index dfbbbe6d50..7f98d3adbc 100644 --- a/docs/api/components_extras_ExtrasRowList.bs.html +++ b/docs/api/components_extras_ExtrasRowList.bs.html @@ -1,6 +1,6 @@ Source: components/extras/ExtrasRowList.bs
On this page

components_extras_ExtrasRowList.bs

sub init()
+    
On this page

components_extras_ExtrasRowList.bs

sub init()
     m.top.visible = true
     updateSize()
     m.top.rowFocusAnimationStyle = "fixedFocus"
@@ -214,4 +214,4 @@
 sub onRowItemFocused()
     m.top.focusedItem = m.top.content.getChild(m.top.rowItemFocused[0]).getChild(m.top.rowItemFocused[1])
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_home_Home.bs.html b/docs/api/components_home_Home.bs.html index fe144c3587..5685a0fd81 100644 --- a/docs/api/components_home_Home.bs.html +++ b/docs/api/components_home_Home.bs.html @@ -1,6 +1,6 @@ Source: components/home/Home.bs
On this page

components_home_Home.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_home_Home.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/deviceCapabilities.bs"
@@ -11,6 +11,10 @@
     m.top.optionsAvailable = true
     m.postTask = createObject("roSGNode", "PostTask")
 
+    m.homeRows = m.top.findNode("homeRows")
+
+    m.fadeInFocusBitmap = m.top.findNode("fadeInFocusBitmap")
+
     if m.global.session.user.settings["ui.home.splashBackground"] = true
         m.backdrop = m.top.findNode("backdrop")
         m.backdrop.uri = buildURL("/Branding/Splashscreen?format=jpg&foregroundLayer=0.15&fillWidth=1280&width=1280&fillHeight=720&height=720&tag=splash")
@@ -18,11 +22,14 @@
 end sub
 
 sub refresh()
-    m.top.findNode("homeRows").callFunc("updateHomeRows")
+    m.homeRows.focusBitmapBlendColor = "0xFFFFFFFF"
+    m.homeRows.callFunc("updateHomeRows")
 end sub
 
 sub loadLibraries()
-    m.top.findNode("homeRows").callFunc("loadLibraries")
+    m.homeRows.focusBitmapBlendColor = "0xFFFFFF00"
+    m.homeRows.callFunc("loadLibraries")
+    m.fadeInFocusBitmap.control = "start"
 end sub
 
 ' JFScreen hook that gets ran as needed.
@@ -54,4 +61,4 @@
     m.postTask.unobserveField("responseCode")
     m.postTask.callFunc("empty")
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_home_HomeItem.bs.html b/docs/api/components_home_HomeItem.bs.html index 82dafde4d3..a43e787c10 100644 --- a/docs/api/components_home_HomeItem.bs.html +++ b/docs/api/components_home_HomeItem.bs.html @@ -1,6 +1,6 @@ Source: components/home/HomeItem.bs
On this page

components_home_HomeItem.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_home_HomeItem.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
@@ -30,6 +30,7 @@
 
 
 sub itemContentChanged()
+    m.unplayedCount.visible = false
     itemData = m.top.itemContent
     if itemData = invalid then return
 
@@ -67,6 +68,10 @@
 
     ' Format the Data based on the type of Home Data
     if itemData.type = "CollectionFolder" or itemData.type = "UserView" or itemData.type = "Channel"
+        m.itemText.font.size = 35
+        m.itemText.height = 64
+        m.itemText.horizAlign = "center"
+        m.itemText.vertAlign = "bottom"
         m.itemText.text = itemData.name
         m.itemPoster.uri = itemData.widePosterURL
         return
@@ -331,4 +336,4 @@
         m.itemIcon.visible = true
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_home_HomeRows.bs.html b/docs/api/components_home_HomeRows.bs.html index 6bfadcf2e5..5bdb709b0a 100644 --- a/docs/api/components_home_HomeRows.bs.html +++ b/docs/api/components_home_HomeRows.bs.html @@ -1,6 +1,9 @@ Source: components/home/HomeRows.bs
On this page

components_home_HomeRows.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_home_HomeRows.bs

import "pkg:/source/utils/misc.bs"
+import "pkg:/source/constants/HomeRowItemSizes.bs"
+
+const LOADING_WAIT_TIME = 2
 
 sub init()
     m.top.itemComponentName = "HomeItem"
@@ -12,11 +15,14 @@
 
     m.top.showRowLabel = [true]
     m.top.rowLabelOffset = [0, 20]
-    m.top.showRowCounter = [true]
+    ' Hide the row counter to prevent flicker. We'll show it once loading timer fires
+    m.top.showRowCounter = [false]
+
+    m.top.content = CreateObject("roSGNode", "ContentNode")
 
-    m.homeSectionIndexes = {
-        count: 0
-    }
+    m.loadingTimer = createObject("roSGNode", "Timer")
+    m.loadingTimer.duration = LOADING_WAIT_TIME
+    m.loadingTimer.observeField("fire", "loadingTimerComplete")
 
     updateSize()
 
@@ -28,7 +34,7 @@
     m.LoadLibrariesTask = createObject("roSGNode", "LoadItemsTask")
     m.LoadLibrariesTask.observeField("content", "onLibrariesLoaded")
 
-    ' set up tesk nodes for other rows
+    ' set up task nodes for other rows
     m.LoadContinueWatchingTask = createObject("roSGNode", "LoadItemsTask")
     m.LoadContinueWatchingTask.itemsToLoad = "continue"
 
@@ -59,139 +65,241 @@
     ' spacing between items in a row
     m.top.rowItemSpacing = [20, 0]
 
+    ' Default size to wide poster, the most used size
+    m.top.rowItemSize = homeRowItemSizes.WIDE_POSTER
+
     m.top.visible = true
 end sub
 
-sub onLibrariesLoaded()
-    ' save data for other functions
-    m.libraryData = m.LoadLibrariesTask.content
-    m.LoadLibrariesTask.unobserveField("content")
-    m.LoadLibrariesTask.content = []
+' processUserSections: Loop through user's chosen home section settings and generate the content for each row
+'
+sub processUserSections()
+    m.expectedRowCount = 1 ' the favorites row is hardcoded to always show atm
+    m.processedRowCount = 0
 
-    content = CreateObject("roSGNode", "ContentNode")
-    sizeArray = []
-    loadedSections = 0
+    ' calculate expected row count by processing homesections
+    for i = 0 to 6
+        sectionName = LCase(m.global.session.user.settings["homesection" + i.toStr()])
+        if sectionName = "latestmedia"
+            ' expect 1 row per filtered media library
+            m.filteredLatest = filterNodeArray(m.libraryData, "id", m.global.session.user.configuration.LatestItemsExcludes)
+            for each latestLibrary in m.filteredLatest
+                if latestLibrary.collectionType <> "boxsets" and latestLibrary.collectionType <> "livetv" and latestLibrary.json.CollectionType <> "Program"
+                    m.expectedRowCount++
+                end if
+            end for
+        else if sectionName <> "none"
+            m.expectedRowCount++
+        end if
+    end for
 
-    ' Add sections in order based on user settings
+    ' Add home sections in order based on user settings
+    loadedSections = 0
     for i = 0 to 6
         sectionName = LCase(m.global.session.user.settings["homesection" + i.toStr()])
-        sectionLoaded = addHomeSection(content, sizeArray, sectionName)
+        sectionLoaded = false
+        if sectionName <> "none"
+            sectionLoaded = addHomeSection(sectionName)
+        end if
 
         ' Count how many sections with data are loaded
         if sectionLoaded then loadedSections++
 
         ' If 2 sections with data are loaded or we're at the end of the web client section data, consider the home view loaded
-        if loadedSections = 2 or i = 6
-            if not m.global.app_loaded
+        if not m.global.app_loaded
+            if loadedSections = 2 or i = 6
                 m.top.signalBeacon("AppLaunchComplete") ' Roku Performance monitoring
                 m.global.app_loaded = true
             end if
         end if
     end for
 
-    ' Favorites isn't an option on Web settings, so we must manually add it for now
-    addHomeSection(content, sizeArray, "favorites")
+    ' Favorites isn't an option in Web settings, so we manually add it to the end for now
+    addHomeSection("favorites")
+
+    ' Start the timer for creating the content rows before we set the cursor size
+    m.loadingTimer.control = "start"
+end sub
+
+' onLibrariesLoaded: Handler when LoadLibrariesTask returns data
+'
+sub onLibrariesLoaded()
+    ' save data for other functions
+    m.libraryData = m.LoadLibrariesTask.content
+    m.LoadLibrariesTask.unobserveField("content")
+    m.LoadLibrariesTask.content = []
 
-    m.top.rowItemSize = sizeArray
-    m.top.content = content
+    processUserSections()
 end sub
 
-' Removes a home section from the home rows
-sub removeHomeSection(sectionType as string)
-    sectionName = LCase(sectionType)
+' getOriginalSectionIndex: Gets the index of a section from user settings and adds count of currently known latest media sections
+'
+' @param {string} sectionName - Name of section we're looking up
+'
+' @return {integer} indicating index of section taking latest media sections into account
+function getOriginalSectionIndex(sectionName as string) as integer
+    searchSectionName = LCase(sectionName).Replace(" ", "")
 
-    removedSectionIndex = m.homeSectionIndexes[sectionName]
+    sectionIndex = 0
+    indexLatestMediaSection = 0
 
-    if not isValid(removedSectionIndex) then return
+    for i = 0 to 6
+        settingSectionName = LCase(m.global.session.user.settings["homesection" + i.toStr()])
+        if settingSectionName = "latestmedia"
+            indexLatestMediaSection = i
+        end if
 
-    for each section in m.homeSectionIndexes
-        if m.homeSectionIndexes[section] > removedSectionIndex
-            m.homeSectionIndexes[section]--
+        if settingSectionName = searchSectionName
+            sectionIndex = i
         end if
     end for
 
-    m.homeSectionIndexes.Delete(sectionName)
+    ' If the latest media section is before the section we're searching for, then we need to account for how many latest media rows there are
+    addLatestMediaSectionCount = (indexLatestMediaSection < sectionIndex)
+
+    if addLatestMediaSectionCount
+        for i = sectionIndex to m.top.content.getChildCount() - 1
+            sectionToTest = m.top.content.getChild(i)
+            if LCase(Left(sectionToTest.title, 6)) = "latest"
+                sectionIndex++
+            end if
+        end for
+    end if
+
+    return sectionIndex
+end function
+
+' removeHomeSection: Removes a home section from the home rows
+'
+' @param {string} sectionToRemove - Title property of section we're removing
+sub removeHomeSection(sectionTitleToRemove as string)
+    if not isValid(sectionTitleToRemove) then return
+
+    sectionTitle = LCase(sectionTitleToRemove).Replace(" ", "")
+    if not sectionExists(sectionTitle) then return
+
+    sectionIndexToRemove = getSectionIndex(sectionTitle)
 
-    m.top.content.removeChildIndex(removedSectionIndex)
+    m.top.content.removeChildIndex(sectionIndexToRemove)
+    setRowItemSize()
+end sub
+
+' setRowItemSize: Loops through all home sections and sets the correct item sizes per row
+'
+sub setRowItemSize()
+    if not isValid(m.top.content) then return
+
+    homeSections = m.top.content.getChildren(-1, 0)
+    newSizeArray = CreateObject("roArray", homeSections.count(), false)
+
+    for i = 0 to homeSections.count() - 1
+        newSizeArray[i] = isValid(homeSections[i].cursorSize) ? homeSections[i].cursorSize : homeRowItemSizes.WIDE_POSTER
+    end for
+    m.top.rowItemSize = newSizeArray
+
+    ' If we have processed the expected number of content rows, stop the loading timer and run the complete function
+    if m.expectedRowCount = m.processedRowCount
+        m.loadingTimer.control = "stop"
+        loadingTimerComplete()
+    end if
+end sub
+
+' loadingTimerComplete: Event handler for when loading wait time has expired
+'
+sub loadingTimerComplete()
+    if not m.top.showRowCounter[0]
+        ' Show the row counter to prevent flicker
+        m.top.showRowCounter = [true]
+    end if
 end sub
 
-' Adds a new home section to the home rows.
-' Returns a boolean indicating whether the section was handled.
-function addHomeSection(content as dynamic, sizeArray as dynamic, sectionName as string) as boolean
+' addHomeSection: Adds a new home section to the home rows.
+'
+' @param {string} sectionType - Type of section to add
+' @return {boolean} indicating if the section was handled
+function addHomeSection(sectionType as string) as boolean
     ' Poster size library items
-    if sectionName = "livetv"
-        createLiveTVRow(content, sizeArray)
+    if sectionType = "livetv"
+        createLiveTVRow()
         return true
     end if
 
     ' Poster size library items
-    if sectionName = "smalllibrarytiles"
-        createLibraryRow(content, sizeArray)
+    if sectionType = "smalllibrarytiles"
+        createLibraryRow()
         return true
     end if
 
     ' Continue Watching items
-    if sectionName = "resume"
-        createContinueWatchingRow(content, sizeArray)
+    if sectionType = "resume"
+        createContinueWatchingRow()
         return true
     end if
 
     ' Next Up items
-    if sectionName = "nextup"
-        createNextUpRow(content, sizeArray)
+    if sectionType = "nextup"
+        createNextUpRow()
         return true
     end if
 
     ' Latest items in each library
-    if sectionName = "latestmedia"
-        createLatestInRows(content, sizeArray)
+    if sectionType = "latestmedia"
+        createLatestInRows()
         return true
     end if
 
     ' Favorite Items
-    if sectionName = "favorites"
-        createFavoritesRow(content, sizeArray)
+    if sectionType = "favorites"
+        createFavoritesRow()
         return true
     end if
 
+    ' This section type isn't supported.
+    ' Count it as processed since we aren't going to do anything else with it
+    m.processedRowCount++
     return false
 end function
 
-' Create a row displaying the user's libraries
-sub createLibraryRow(content as dynamic, sizeArray as dynamic)
+' createLibraryRow: Creates a row displaying the user's libraries
+'
+sub createLibraryRow()
+    m.processedRowCount++
     ' Ensure we have data
     if not isValidAndNotEmpty(m.libraryData) then return
 
-    mediaRow = content.CreateChild("HomeRow")
-    mediaRow.title = tr("My Media")
+    sectionName = tr("My Media")
 
-    m.homeSectionIndexes.AddReplace("library", m.homeSectionIndexes.count)
-    m.homeSectionIndexes.count++
-
-    sizeArray.push([464, 331])
+    row = CreateObject("roSGNode", "HomeRow")
+    row.title = sectionName
+    row.imageWidth = homeRowItemSizes.WIDE_POSTER[0]
+    row.cursorSize = homeRowItemSizes.WIDE_POSTER
 
     filteredMedia = filterNodeArray(m.libraryData, "id", m.global.session.user.configuration.MyMediaExcludes)
     for each item in filteredMedia
-        mediaRow.appendChild(item)
+        row.appendChild(item)
     end for
+
+    ' Row already exists, replace it with new content
+    if sectionExists(sectionName)
+        m.top.content.replaceChild(row, getSectionIndex(sectionName))
+        setRowItemSize()
+        return
+    end if
+
+    ' Row does not exist, insert it into the home view
+    m.top.content.insertChild(row, getOriginalSectionIndex("smalllibrarytiles"))
+    setRowItemSize()
 end sub
 
-' Create a row displaying latest items in each of the user's libraries
-sub createLatestInRows(content as dynamic, sizeArray as dynamic)
+' createLatestInRows: Creates a row displaying latest items in each of the user's libraries
+'
+sub createLatestInRows()
     ' Ensure we have data
     if not isValidAndNotEmpty(m.libraryData) then return
 
     ' create a "Latest In" row for each library
-    filteredLatest = filterNodeArray(m.libraryData, "id", m.global.session.user.configuration.LatestItemsExcludes)
-    for each lib in filteredLatest
+    for each lib in m.filteredLatest
         if lib.collectionType <> "boxsets" and lib.collectionType <> "livetv" and lib.json.CollectionType <> "Program"
-            latestInRow = content.CreateChild("HomeRow")
-            latestInRow.title = tr("Latest in") + " " + lib.name + " >"
-
-            m.homeSectionIndexes.AddReplace("latestin" + LCase(lib.name).Replace(" ", ""), m.homeSectionIndexes.count)
-            m.homeSectionIndexes.count++
-            sizeArray.Push([464, 331])
-
             loadLatest = createObject("roSGNode", "LoadItemsTask")
             loadLatest.itemsToLoad = "latest"
             loadLatest.itemId = lib.id
@@ -206,149 +314,168 @@
     end for
 end sub
 
-' Create a row displaying the live tv now on section
-sub createLiveTVRow(content as dynamic, sizeArray as dynamic)
-    contentRow = content.CreateChild("HomeRow")
-    contentRow.title = tr("On Now")
-    m.homeSectionIndexes.AddReplace("livetv", m.homeSectionIndexes.count)
-    m.homeSectionIndexes.count++
-    sizeArray.push([464, 331])
+' sectionExists: Checks if passed section exists in home row content
+'
+' @param {string} sectionTitle - Title of section we're checking for
+'
+' @return {boolean} indicating if the section currently exists in the home row content
+function sectionExists(sectionTitle as string) as boolean
+    if not isValid(sectionTitle) then return false
+    if not isValid(m.top.content) then return false
 
+    searchSectionTitle = LCase(sectionTitle).Replace(" ", "")
+
+    homeSections = m.top.content.getChildren(-1, 0)
+
+    for each section in homeSections
+        if LCase(section.title).Replace(" ", "") = searchSectionTitle
+            return true
+        end if
+    end for
+
+    return false
+end function
+
+' getSectionIndex: Returns index of requested section in home row content
+'
+' @param {string} sectionTitle - Title of section we're checking for
+'
+' @return {integer} indicating index of request section
+function getSectionIndex(sectionTitle as string) as integer
+    if not isValid(sectionTitle) then return false
+    if not isValid(m.top.content) then return false
+
+    searchSectionTitle = LCase(sectionTitle).Replace(" ", "")
+
+    homeSections = m.top.content.getChildren(-1, 0)
+
+    sectionIndex = homeSections.count()
+    i = 0
+
+    for each section in homeSections
+        if LCase(section.title).Replace(" ", "") = searchSectionTitle
+            sectionIndex = i
+            exit for
+        end if
+        i++
+    end for
+
+    return sectionIndex
+end function
+
+' createLiveTVRow: Creates a row displaying the live tv now on section
+'
+sub createLiveTVRow()
     m.LoadOnNowTask.observeField("content", "updateOnNowItems")
     m.LoadOnNowTask.control = "RUN"
 end sub
 
-' Create a row displaying items the user can continue watching
-sub createContinueWatchingRow(content as dynamic, sizeArray as dynamic)
-    continueWatchingRow = content.CreateChild("HomeRow")
-    continueWatchingRow.title = tr("Continue Watching")
-    m.homeSectionIndexes.AddReplace("resume", m.homeSectionIndexes.count)
-    m.homeSectionIndexes.count++
-    sizeArray.push([464, 331])
-
+' createContinueWatchingRow: Creates a row displaying items the user can continue watching
+'
+sub createContinueWatchingRow()
     ' Load the Continue Watching Data
     m.LoadContinueWatchingTask.observeField("content", "updateContinueWatchingItems")
     m.LoadContinueWatchingTask.control = "RUN"
 end sub
 
-' Create a row displaying next episodes up to watch
-sub createNextUpRow(content as dynamic, sizeArray as dynamic)
-    nextUpRow = content.CreateChild("HomeRow")
-    nextUpRow.title = tr("Next Up >")
-    m.homeSectionIndexes.AddReplace("nextup", m.homeSectionIndexes.count)
-    m.homeSectionIndexes.count++
-    sizeArray.push([464, 331])
+' createNextUpRow: Creates a row displaying next episodes up to watch
+'
+sub createNextUpRow()
+    sectionName = tr("Next Up") + ">"
+
+    if not sectionExists(sectionName)
+        nextUpRow = m.top.content.CreateChild("HomeRow")
+        nextUpRow.title = sectionName
+        nextUpRow.imageWidth = homeRowItemSizes.WIDE_POSTER[0]
+        nextUpRow.cursorSize = homeRowItemSizes.WIDE_POSTER
+    end if
 
     ' Load the Next Up Data
     m.LoadNextUpTask.observeField("content", "updateNextUpItems")
     m.LoadNextUpTask.control = "RUN"
 end sub
 
-' Create a row displaying items from the user's favorites list
-sub createFavoritesRow(content as dynamic, sizeArray as dynamic)
-    favoritesRow = content.CreateChild("HomeRow")
-    favoritesRow.title = tr("Favorites")
-    sizeArray.Push([464, 331])
-
-    m.homeSectionIndexes.AddReplace("favorites", m.homeSectionIndexes.count)
-    m.homeSectionIndexes.count++
-
+' createFavoritesRow: Creates a row displaying items from the user's favorites list
+'
+sub createFavoritesRow()
     ' Load the Favorites Data
     m.LoadFavoritesTask.observeField("content", "updateFavoritesItems")
     m.LoadFavoritesTask.control = "RUN"
 end sub
 
-' Update home row data
+' updateHomeRows: Update function exposed to outside components
+'
 sub updateHomeRows()
-    ' If resume section exists, reload row's data
-    if m.homeSectionIndexes.doesExist("resume")
-        m.LoadContinueWatchingTask.observeField("content", "updateContinueWatchingItems")
-        m.LoadContinueWatchingTask.control = "RUN"
-    end if
-
-    ' If next up section exists, reload row's data
-    if m.homeSectionIndexes.doesExist("nextup")
-        m.LoadNextUpTask.observeField("content", "updateNextUpItems")
-        m.LoadNextUpTask.control = "RUN"
-    end if
-
-    ' If favorites section exists, reload row's data
-    if m.homeSectionIndexes.doesExist("favorites")
-        m.LoadFavoritesTask.observeField("content", "updateFavoritesItems")
-        m.LoadFavoritesTask.control = "RUN"
-    end if
-
-    ' If live tv's on now section exists, reload row's data
-    if m.homeSectionIndexes.doesExist("livetv")
-        m.LoadOnNowTask.observeField("content", "updateOnNowItems")
-        m.LoadOnNowTask.control = "RUN"
-    end if
-
-    ' If latest in library section exists, reload row's data
-    hasLatestHomeSection = false
-
-    for each section in m.homeSectionIndexes
-        if LCase(Left(section, 6)) = "latest"
-            hasLatestHomeSection = true
-            exit for
-        end if
-    end for
-
-    if hasLatestHomeSection
-        updateLatestInRows()
-    end if
+    ' Hide the row counter to prevent flicker. We'll show it once loading timer fires
+    m.top.showRowCounter = [false]
+    processUserSections()
 end sub
 
+' updateFavoritesItems: Processes LoadFavoritesTask content. Removes, Creates, or Updates favorites row as needed
+'
 sub updateFavoritesItems()
+    m.processedRowCount++
     itemData = m.LoadFavoritesTask.content
     m.LoadFavoritesTask.unobserveField("content")
     m.LoadFavoritesTask.content = []
 
-    if itemData = invalid then return
-
-    rowIndex = m.homeSectionIndexes.favorites
+    sectionName = tr("Favorites")
 
-    if itemData.count() < 1
-        removeHomeSection("favorites")
+    if not isValidAndNotEmpty(itemData)
+        removeHomeSection(sectionName)
         return
-    else
-        ' remake row using the new data
-        row = CreateObject("roSGNode", "HomeRow")
-        row.title = tr("Favorites")
+    end if
 
-        for each item in itemData
-            usePoster = true
+    ' remake row using the new data
+    row = CreateObject("roSGNode", "HomeRow")
+    row.title = sectionName
+    row.imageWidth = homeRowItemSizes.WIDE_POSTER[0]
+    row.cursorSize = homeRowItemSizes.WIDE_POSTER
 
-            if lcase(item.type) = "episode" or lcase(item.type) = "audio" or lcase(item.type) = "musicartist"
-                usePoster = false
-            end if
+    for each item in itemData
+        usePoster = true
 
-            item.usePoster = usePoster
-            item.imageWidth = row.imageWidth
-            row.appendChild(item)
-        end for
+        if lcase(item.type) = "episode" or lcase(item.type) = "audio" or lcase(item.type) = "musicartist"
+            usePoster = false
+        end if
 
-        ' replace the old row
-        m.top.content.replaceChild(row, rowIndex)
+        item.usePoster = usePoster
+        item.imageWidth = row.imageWidth
+        row.appendChild(item)
+    end for
 
+    if sectionExists(sectionName)
+        m.top.content.replaceChild(row, getSectionIndex(sectionName))
+        setRowItemSize()
+        return
     end if
+
+    m.top.content.insertChild(row, getSectionIndex(sectionName))
+    setRowItemSize()
 end sub
 
+' updateContinueWatchingItems: Processes LoadContinueWatchingTask content. Removes, Creates, or Updates continue watching row as needed
+'
 sub updateContinueWatchingItems()
+    m.processedRowCount++
     itemData = m.LoadContinueWatchingTask.content
     m.LoadContinueWatchingTask.unobserveField("content")
     m.LoadContinueWatchingTask.content = []
 
-    if itemData = invalid then return
+    sectionName = tr("Continue Watching")
 
-    if itemData.count() < 1
-        removeHomeSection("resume")
+    if not isValidAndNotEmpty(itemData)
+        removeHomeSection(sectionName)
         return
     end if
 
+    sectionName = tr("Continue Watching")
+
     ' remake row using the new data
     row = CreateObject("roSGNode", "HomeRow")
-    row.title = tr("Continue Watching")
+    row.title = sectionName
+    row.imageWidth = homeRowItemSizes.WIDE_POSTER[0]
+    row.cursorSize = homeRowItemSizes.WIDE_POSTER
 
     for each item in itemData
         if isValid(item.json) and isValid(item.json.UserData) and isValid(item.json.UserData.PlayedPercentage)
@@ -360,198 +487,161 @@
         row.appendChild(item)
     end for
 
-    ' replace the old row
-    m.top.content.replaceChild(row, m.homeSectionIndexes.resume)
+    ' Row already exists, replace it with new content
+    if sectionExists(sectionName)
+        m.top.content.replaceChild(row, getSectionIndex(sectionName))
+        setRowItemSize()
+        return
+    end if
+
+    ' Row does not exist, insert it into the home view
+    m.top.content.insertChild(row, getOriginalSectionIndex("resume"))
+    setRowItemSize()
 end sub
 
+' updateNextUpItems: Processes LoadNextUpTask content. Removes, Creates, or Updates next up row as needed
+'
 sub updateNextUpItems()
+    m.processedRowCount++
     itemData = m.LoadNextUpTask.content
     m.LoadNextUpTask.unobserveField("content")
     m.LoadNextUpTask.content = []
+    m.LoadNextUpTask.control = "STOP"
 
-    if itemData = invalid then return
+    sectionName = tr("Next Up") + " >"
 
-    if itemData.count() < 1
-        removeHomeSection("nextup")
+    if not isValidAndNotEmpty(itemData)
+        removeHomeSection(sectionName)
         return
-    else
-        ' remake row using the new data
-        row = CreateObject("roSGNode", "HomeRow")
-        row.title = tr("Next Up") + " >"
-        for each item in itemData
-            item.usePoster = row.usePoster
-            item.imageWidth = row.imageWidth
-            row.appendChild(item)
-        end for
-
-        ' replace the old row
-        m.top.content.replaceChild(row, m.homeSectionIndexes.nextup)
     end if
-end sub
 
-' Iterate over user's libraries and update data for each Latest In section
-sub updateLatestInRows()
-    ' Ensure we have data
-    if not isValidAndNotEmpty(m.libraryData) then return
+    ' remake row using the new data
+    row = CreateObject("roSGNode", "HomeRow")
+    row.title = tr("Next Up") + " >"
+    row.imageWidth = homeRowItemSizes.WIDE_POSTER[0]
+    row.cursorSize = homeRowItemSizes.WIDE_POSTER
 
-    ' Load new data for each library
-    filteredLatest = filterNodeArray(m.libraryData, "id", m.global.session.user.configuration.LatestItemsExcludes)
-    for each lib in filteredLatest
-        if lib.collectionType <> "boxsets" and lib.collectionType <> "livetv" and lib.json.CollectionType <> "Program"
-            loadLatest = createObject("roSGNode", "LoadItemsTask")
-            loadLatest.itemsToLoad = "latest"
-            loadLatest.itemId = lib.id
+    for each item in itemData
+        item.usePoster = row.usePoster
+        item.imageWidth = row.imageWidth
+        row.appendChild(item)
+    end for
 
-            metadata = {
-                "title": lib.name,
-                "contentType": lib.json.CollectionType
-            }
+    ' Row already exists, replace it with new content
+    if sectionExists(sectionName)
+        m.top.content.replaceChild(row, getSectionIndex(sectionName))
+        setRowItemSize()
+        return
+    end if
 
-            loadLatest.metadata = metadata
-            loadLatest.observeField("content", "updateLatestItems")
-            loadLatest.control = "RUN"
-        end if
-    end for
+    ' Row does not exist, insert it into the home view
+    m.top.content.insertChild(row, getSectionIndex(sectionName))
+    setRowItemSize()
 end sub
 
+' updateLatestItems: Processes LoadItemsTask content. Removes, Creates, or Updates latest in {library} row as needed
+'
+' @param {dynamic} msg - LoadItemsTask
 sub updateLatestItems(msg)
+    m.processedRowCount++
     itemData = msg.GetData()
 
     node = msg.getRoSGNode()
     node.unobserveField("content")
     node.content = []
 
-    if itemData = invalid then return
+    sectionName = tr("Latest in") + " " + node.metadata.title + " >"
 
-    sectionName = "latestin" + LCase(node.metadata.title).Replace(" ", "")
-
-    if itemData.count() < 1
+    if not isValidAndNotEmpty(itemData)
         removeHomeSection(sectionName)
         return
-    else
-        ' remake row using new data
-        row = CreateObject("roSGNode", "HomeRow")
-        row.title = tr("Latest in") + " " + node.metadata.title + " >"
-        row.usePoster = true
-        ' Handle specific types with different item widths
-        if node.metadata.contentType = "movies"
-            row.imageWidth = 180
-            itemSize = [188, 331]
-        else if node.metadata.contentType = "music"
-            row.imageWidth = 261
-            itemSize = [261, 331]
-        else
-            row.imageWidth = 464
-            itemSize = [464, 331]
-        end if
-
-        for each item in itemData
-            item.usePoster = row.usePoster
-            item.imageWidth = row.imageWidth
-            row.appendChild(item)
-        end for
+    end if
 
-        rowIndex = m.homeSectionIndexes[sectionName]
+    imagesize = homeRowItemSizes.WIDE_POSTER
 
-        ' Replace the old row
-        if isValid(rowIndex)
-            updateSizeArray(itemSize, rowIndex, "replace")
-            m.top.content.replaceChild(row, rowIndex)
-            return
+    if isValid(node.metadata.contentType)
+        if LCase(node.metadata.contentType) = "movies"
+            imagesize = homeRowItemSizes.MOVIE_POSTER
+        else if LCase(node.metadata.contentType) = "music"
+            imagesize = homeRowItemSizes.MUSIC_ALBUM
         end if
+    end if
 
-        ' Determine highest index of a Lastest In section so we can append the new section after it
-        highestLatestHomeSectionIndex = 0
-
-        for each section in m.homeSectionIndexes
-            if LCase(Left(section, 6)) = "latest"
-                if m.homeSectionIndexes[section] > highestLatestHomeSectionIndex
-                    highestLatestHomeSectionIndex = m.homeSectionIndexes[section]
-                end if
-            end if
-        end for
-
-        ' We have data for a section that doesn't currently exist
-        rowIndex = highestLatestHomeSectionIndex + 1
-
-        ' Advance all the indexes greater than or equal than our new row
-        for each section in m.homeSectionIndexes
-            if m.homeSectionIndexes[section] >= rowIndex
-                m.homeSectionIndexes[section]++
-            end if
-        end for
-
-        m.homeSectionIndexes.AddReplace(sectionName, rowIndex)
+    ' remake row using new data
+    row = CreateObject("roSGNode", "HomeRow")
+    row.title = sectionName
+    row.imageWidth = imagesize[0]
+    row.cursorSize = imagesize
+    row.usePoster = true
 
-        m.top.content.insertChild(row, rowIndex)
-        updateSizeArray(itemSize, rowIndex)
+    for each item in itemData
+        item.usePoster = row.usePoster
+        item.imageWidth = row.imageWidth
+        row.appendChild(item)
+    end for
 
+    if sectionExists(sectionName)
+        ' Row already exists, replace it with new content
+        m.top.content.replaceChild(row, getSectionIndex(sectionName))
+        setRowItemSize()
         return
     end if
+
+    m.top.content.insertChild(row, getOriginalSectionIndex("latestmedia"))
+    setRowItemSize()
 end sub
 
+' updateOnNowItems: Processes LoadOnNowTask content. Removes, Creates, or Updates latest in on now row as needed
+'
 sub updateOnNowItems()
+    m.processedRowCount++
     itemData = m.LoadOnNowTask.content
     m.LoadOnNowTask.unobserveField("content")
     m.LoadOnNowTask.content = []
 
-    if itemData = invalid then return
+    sectionName = tr("On Now")
 
-    if itemData.count() < 1
-        removeHomeSection("livetv")
+    if not isValidAndNotEmpty(itemData)
+        removeHomeSection(sectionName)
         return
-    else
-        ' remake row using the new data
-        row = CreateObject("roSGNode", "HomeRow")
-        row.title = tr("On Now")
-        itemSize = [464, 331]
-        row.imageWidth = 464
-        for each item in itemData
-            row.usePoster = false
-            if (not isValid(item.thumbnailURL) or item.thumbnailURL = "") and isValid(item.json) and isValid(item.json.imageURL)
-                item.thumbnailURL = item.json.imageURL
-                row.usePoster = true
-                row.imageWidth = 180
-                itemSize = [188, 331]
-            end if
-            item.usePoster = row.usePoster
-            item.imageWidth = row.imageWidth
-            row.appendChild(item)
-        end for
-
-        ' replace the old row
-        updateSizeArray(itemSize, m.homeSectionIndexes.livetv, "replace")
-        m.top.content.replaceChild(row, m.homeSectionIndexes.livetv)
-
     end if
-end sub
 
-sub updateSizeArray(rowItemSize, rowIndex = invalid, action = "insert")
-    sizeArray = m.top.rowItemSize
-    ' append by default
-    if rowIndex = invalid
-        rowIndex = sizeArray.count()
-    end if
+    ' remake row using the new data
+    row = CreateObject("roSGNode", "HomeRow")
+    row.title = tr("On Now")
+    row.imageWidth = homeRowItemSizes.WIDE_POSTER[0]
+    row.cursorSize = homeRowItemSizes.WIDE_POSTER
 
-    newSizeArray = []
-    for i = 0 to sizeArray.count()
-        if rowIndex = i
-            if action = "replace"
-                newSizeArray.Push(rowItemSize)
-            else if action = "insert"
-                newSizeArray.Push(rowItemSize)
-                if isValid(sizeArray[i])
-                    newSizeArray.Push(sizeArray[i])
-                end if
-            end if
-        else if isValid(sizeArray[i])
-            newSizeArray.Push(sizeArray[i])
+    for each item in itemData
+        row.usePoster = false
+
+        if (not isValid(item.thumbnailURL) or item.thumbnailURL = "") and isValid(item.json) and isValid(item.json.imageURL)
+            item.thumbnailURL = item.json.imageURL
+            row.usePoster = true
+            row.imageWidth = homeRowItemSizes.MOVIE_POSTER[0]
+            row.cursorSize = homeRowItemSizes.MOVIE_POSTER
         end if
+
+        item.usePoster = row.usePoster
+        item.imageWidth = row.imageWidth
+        row.appendChild(item)
     end for
-    m.top.rowItemSize = newSizeArray
+
+    ' Row already exists, replace it with new content
+    if sectionExists(sectionName)
+        m.top.content.replaceChild(row, getSectionIndex(sectionName))
+        setRowItemSize()
+        return
+    end if
+
+    ' Row does not exist, insert it into the home view
+    m.top.content.insertChild(row, getOriginalSectionIndex("livetv"))
+    setRowItemSize()
 end sub
 
 sub itemSelected()
+    m.selectedRowItem = m.top.rowItemSelected
+
     m.top.selectedItem = m.top.content.getChild(m.top.rowItemSelected[0]).getChild(m.top.rowItemSelected[1])
 
     'Prevent the selected item event from double firing
@@ -592,4 +682,4 @@
     end for
     return newNodeArray
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_home_LoadItemsTask.bs.html b/docs/api/components_home_LoadItemsTask.bs.html index c13f929438..31c62a3907 100644 --- a/docs/api/components_home_LoadItemsTask.bs.html +++ b/docs/api/components_home_LoadItemsTask.bs.html @@ -1,6 +1,6 @@ Source: components/home/LoadItemsTask.bs
On this page

components_home_LoadItemsTask.bs

import "pkg:/source/api/Items.bs"
+    
On this page

components_home_LoadItemsTask.bs

import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
@@ -268,4 +268,4 @@
         end for
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_keyboards_IntegerKeyboard.bs.html b/docs/api/components_keyboards_IntegerKeyboard.bs.html index 2945e9715f..0406542787 100644 --- a/docs/api/components_keyboards_IntegerKeyboard.bs.html +++ b/docs/api/components_keyboards_IntegerKeyboard.bs.html @@ -1,6 +1,6 @@ Source: components/keyboards/IntegerKeyboard.bs
On this page

components_keyboards_IntegerKeyboard.bs

sub init()
+    
On this page

components_keyboards_IntegerKeyboard.bs

sub init()
     m.top.keyGrid.keyDefinitionUri = "pkg:/components/keyboards/IntegerKeyboardKDF.json"
 end sub
 
@@ -81,4 +81,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_LoadChannelsTask.bs.html b/docs/api/components_liveTv_LoadChannelsTask.bs.html index e760520cbd..23f1421fa2 100644 --- a/docs/api/components_liveTv_LoadChannelsTask.bs.html +++ b/docs/api/components_liveTv_LoadChannelsTask.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/LoadChannelsTask.bs
On this page

components_liveTv_LoadChannelsTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_liveTv_LoadChannelsTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -72,4 +72,4 @@
     end for
     m.top.channels = results
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_LoadProgramDetailsTask.bs.html b/docs/api/components_liveTv_LoadProgramDetailsTask.bs.html index 03f5b33828..7d1518f655 100644 --- a/docs/api/components_liveTv_LoadProgramDetailsTask.bs.html +++ b/docs/api/components_liveTv_LoadProgramDetailsTask.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/LoadProgramDetailsTask.bs
On this page

components_liveTv_LoadProgramDetailsTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_liveTv_LoadProgramDetailsTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -44,4 +44,4 @@
     m.top.programDetails = program
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_LoadSheduleTask.bs.html b/docs/api/components_liveTv_LoadSheduleTask.bs.html index f966ce515a..ccea01dc11 100644 --- a/docs/api/components_liveTv_LoadSheduleTask.bs.html +++ b/docs/api/components_liveTv_LoadSheduleTask.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/LoadSheduleTask.bs
On this page

components_liveTv_LoadSheduleTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_liveTv_LoadSheduleTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -50,4 +50,4 @@
     m.top.schedule = results
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_ProgramDetails.bs.html b/docs/api/components_liveTv_ProgramDetails.bs.html index a95c6744ab..8bbb925bec 100644 --- a/docs/api/components_liveTv_ProgramDetails.bs.html +++ b/docs/api/components_liveTv_ProgramDetails.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/ProgramDetails.bs
On this page

components_liveTv_ProgramDetails.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_liveTv_ProgramDetails.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -374,4 +374,4 @@
     return false
 end function
 
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_RecordProgramTask.bs.html b/docs/api/components_liveTv_RecordProgramTask.bs.html index a4d7a9a192..6f8b1051e6 100644 --- a/docs/api/components_liveTv_RecordProgramTask.bs.html +++ b/docs/api/components_liveTv_RecordProgramTask.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/RecordProgramTask.bs
On this page

components_liveTv_RecordProgramTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_liveTv_RecordProgramTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/roku_modules/log/LogMixin.brs"
 
@@ -60,4 +60,4 @@
 
     m.top.recordOperationDone = true
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_schedule.bs.html b/docs/api/components_liveTv_schedule.bs.html index 0160dde405..86ef65ef42 100644 --- a/docs/api/components_liveTv_schedule.bs.html +++ b/docs/api/components_liveTv_schedule.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/schedule.bs
On this page

components_liveTv_schedule.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_liveTv_schedule.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.EPGLaunchCompleteSignaled = false
@@ -305,4 +305,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_login_UserItem.bs.html b/docs/api/components_login_UserItem.bs.html index 105f08d9f6..37c7060b32 100644 --- a/docs/api/components_login_UserItem.bs.html +++ b/docs/api/components_login_UserItem.bs.html @@ -1,6 +1,6 @@ Source: components/login/UserItem.bs
On this page

components_login_UserItem.bs

sub init()
+    
On this page

components_login_UserItem.bs

sub init()
 end sub
 
 sub itemContentChanged()
@@ -17,4 +17,4 @@
     end if
     profileName.text = itemData.name
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_login_UserRow.bs.html b/docs/api/components_login_UserRow.bs.html index b5ad787041..3b2424a7d6 100644 --- a/docs/api/components_login_UserRow.bs.html +++ b/docs/api/components_login_UserRow.bs.html @@ -1,6 +1,6 @@ Source: components/login/UserRow.bs
On this page

components_login_UserRow.bs

sub init()
+    
On this page

components_login_UserRow.bs

sub init()
     m.top.itemComponentName = "UserItem"
     m.top.content = SetData()
     m.top.observeField("itemSelected", "SetUser")
@@ -53,4 +53,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_login_UserSelect.bs.html b/docs/api/components_login_UserSelect.bs.html index d8a7eac556..c9e5ea2b8f 100644 --- a/docs/api/components_login_UserSelect.bs.html +++ b/docs/api/components_login_UserSelect.bs.html @@ -1,6 +1,6 @@ Source: components/login/UserSelect.bs
On this page

components_login_UserSelect.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_login_UserSelect.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.top.optionsAvailable = false
@@ -44,4 +44,4 @@
     end if
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_manager_QueueManager.bs.html b/docs/api/components_manager_QueueManager.bs.html index 41a0d94b4d..730bba854c 100644 --- a/docs/api/components_manager_QueueManager.bs.html +++ b/docs/api/components_manager_QueueManager.bs.html @@ -1,6 +1,6 @@ Source: components/manager/QueueManager.bs
On this page

components_manager_QueueManager.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_manager_QueueManager.bs

import "pkg:/source/utils/misc.bs"
 import "ViewCreator.bs"
 import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/baserequest.bs"
@@ -260,4 +260,4 @@
 
     return ""
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_manager_ViewCreator.bs.html b/docs/api/components_manager_ViewCreator.bs.html index 0999fc3660..f0c1a24013 100644 --- a/docs/api/components_manager_ViewCreator.bs.html +++ b/docs/api/components_manager_ViewCreator.bs.html @@ -1,6 +1,6 @@ Source: components/manager/ViewCreator.bs
On this page

components_manager_ViewCreator.bs

' Play Audio
+    
On this page

components_manager_ViewCreator.bs

' Play Audio
 sub CreateAudioPlayerView()
     m.view = CreateObject("roSGNode", "AudioPlayerView")
     m.view.observeField("state", "onStateChange")
@@ -188,4 +188,4 @@
     end for
     return -1
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_mediaPlayers_AudioPlayer.bs.html b/docs/api/components_mediaPlayers_AudioPlayer.bs.html index bb63248a0e..1f8085caa6 100644 --- a/docs/api/components_mediaPlayers_AudioPlayer.bs.html +++ b/docs/api/components_mediaPlayers_AudioPlayer.bs.html @@ -1,6 +1,6 @@ Source: components/mediaPlayers/AudioPlayer.bs
On this page

components_mediaPlayers_AudioPlayer.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_mediaPlayers_AudioPlayer.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.playReported = false
@@ -43,4 +43,4 @@
     playstateTask.setFields({ status: state, params: params })
     playstateTask.control = "RUN"
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_movies_AudioTrackListItem.bs.html b/docs/api/components_movies_AudioTrackListItem.bs.html index b71d3f49cb..bf69bfd343 100644 --- a/docs/api/components_movies_AudioTrackListItem.bs.html +++ b/docs/api/components_movies_AudioTrackListItem.bs.html @@ -1,6 +1,6 @@ Source: components/movies/AudioTrackListItem.bs
On this page

components_movies_AudioTrackListItem.bs

sub init()
+    
On this page

components_movies_AudioTrackListItem.bs

sub init()
     m.title = m.top.findNode("title")
     m.description = m.top.findNode("description")
     m.selectedIcon = m.top.findNode("selectedIcon")
@@ -33,4 +33,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_movies_MovieDetails.bs.html b/docs/api/components_movies_MovieDetails.bs.html index 5984250937..e9f35d7cf7 100644 --- a/docs/api/components_movies_MovieDetails.bs.html +++ b/docs/api/components_movies_MovieDetails.bs.html @@ -1,6 +1,6 @@ Source: components/movies/MovieDetails.bs
On this page

components_movies_MovieDetails.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_movies_MovieDetails.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -394,4 +394,4 @@
     end if
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_movies_MovieOptions.bs.html b/docs/api/components_movies_MovieOptions.bs.html index 9c2a480429..dd4d1e09e0 100644 --- a/docs/api/components_movies_MovieOptions.bs.html +++ b/docs/api/components_movies_MovieOptions.bs.html @@ -1,6 +1,6 @@ Source: components/movies/MovieOptions.bs
On this page

components_movies_MovieOptions.bs

sub init()
+    
On this page

components_movies_MovieOptions.bs

sub init()
 
     m.buttons = m.top.findNode("buttons")
     m.buttons.buttons = [tr("Video"), tr("Audio")]
@@ -155,4 +155,4 @@
     return false
 
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_movies_VideoTrackListItem.bs.html b/docs/api/components_movies_VideoTrackListItem.bs.html index 44833b0ee4..b7ba017dd1 100644 --- a/docs/api/components_movies_VideoTrackListItem.bs.html +++ b/docs/api/components_movies_VideoTrackListItem.bs.html @@ -1,6 +1,6 @@ Source: components/movies/VideoTrackListItem.bs
On this page

components_movies_VideoTrackListItem.bs

sub init()
+    
On this page

components_movies_VideoTrackListItem.bs

sub init()
     m.title = m.top.findNode("title")
     m.description = m.top.findNode("description")
     m.selectedIcon = m.top.findNode("selectedIcon")
@@ -33,4 +33,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_AlbumGrid.bs.html b/docs/api/components_music_AlbumGrid.bs.html index 904edd5a27..34ae2019b0 100644 --- a/docs/api/components_music_AlbumGrid.bs.html +++ b/docs/api/components_music_AlbumGrid.bs.html @@ -1,6 +1,6 @@ Source: components/music/AlbumGrid.bs
On this page

components_music_AlbumGrid.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_music_AlbumGrid.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     getData()
@@ -69,4 +69,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_AlbumTrackList.bs.html b/docs/api/components_music_AlbumTrackList.bs.html index 44c0a2d26a..1ddcd3345e 100644 --- a/docs/api/components_music_AlbumTrackList.bs.html +++ b/docs/api/components_music_AlbumTrackList.bs.html @@ -1,6 +1,6 @@ Source: components/music/AlbumTrackList.bs
On this page

components_music_AlbumTrackList.bs

sub init()
+    
On this page

components_music_AlbumTrackList.bs

sub init()
     m.top.content = getData()
     m.top.setfocus(true)
 end sub
@@ -25,4 +25,4 @@
 
     return data
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_AlbumView.bs.html b/docs/api/components_music_AlbumView.bs.html index 57710835ee..fe87ff39b7 100644 --- a/docs/api/components_music_AlbumView.bs.html +++ b/docs/api/components_music_AlbumView.bs.html @@ -1,6 +1,6 @@ Source: components/music/AlbumView.bs
On this page

components_music_AlbumView.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_music_AlbumView.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.top.optionsAvailable = false
@@ -169,4 +169,4 @@
     m.songList.unobservefield("doneLoading")
     stopLoadingSpinner()
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_ArtistView.bs.html b/docs/api/components_music_ArtistView.bs.html index 71e0cb1b1c..0123c2d137 100644 --- a/docs/api/components_music_ArtistView.bs.html +++ b/docs/api/components_music_ArtistView.bs.html @@ -1,6 +1,6 @@ Source: components/music/ArtistView.bs
On this page

components_music_ArtistView.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_music_ArtistView.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.top.optionsAvailable = false
@@ -334,4 +334,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_AudioPlayerView.bs.html b/docs/api/components_music_AudioPlayerView.bs.html index f93374fe70..875805348a 100644 --- a/docs/api/components_music_AudioPlayerView.bs.html +++ b/docs/api/components_music_AudioPlayerView.bs.html @@ -1,6 +1,6 @@ Source: components/music/AudioPlayerView.bs
On this page

components_music_AudioPlayerView.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_music_AudioPlayerView.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
@@ -599,4 +599,4 @@
     WriteAsciiFile("tmp:/scene.temp", "")
     MoveFile("tmp:/scene.temp", "tmp:/scene")
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_LoadScreenSaverTimeoutTask.bs.html b/docs/api/components_music_LoadScreenSaverTimeoutTask.bs.html index 6105f71d41..78cd11cc6f 100644 --- a/docs/api/components_music_LoadScreenSaverTimeoutTask.bs.html +++ b/docs/api/components_music_LoadScreenSaverTimeoutTask.bs.html @@ -1,6 +1,6 @@ Source: components/music/LoadScreenSaverTimeoutTask.bs
On this page

components_music_LoadScreenSaverTimeoutTask.bs

sub init()
+    
On this page

components_music_LoadScreenSaverTimeoutTask.bs

sub init()
     m.top.functionName = "getScreensaverTimeout"
 end sub
 
@@ -8,4 +8,4 @@
     appinfo = CreateObject("roAppManager")
     m.top.content = appinfo.GetScreensaverTimeout() * 60
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_PlaylistView.bs.html b/docs/api/components_music_PlaylistView.bs.html index da5406d3db..35111a51a0 100644 --- a/docs/api/components_music_PlaylistView.bs.html +++ b/docs/api/components_music_PlaylistView.bs.html @@ -1,6 +1,6 @@ Source: components/music/PlaylistView.bs
On this page

components_music_PlaylistView.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_music_PlaylistView.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.top.optionsAvailable = false
@@ -160,4 +160,4 @@
     m.songList.unobservefield("doneLoading")
     stopLoadingSpinner()
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_SongItem.bs.html b/docs/api/components_music_SongItem.bs.html index a5b3adb175..4e575928f7 100644 --- a/docs/api/components_music_SongItem.bs.html +++ b/docs/api/components_music_SongItem.bs.html @@ -1,6 +1,6 @@ Source: components/music/SongItem.bs
On this page

components_music_SongItem.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_music_SongItem.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.itemText = m.top.findNode("itemText")
@@ -31,4 +31,4 @@
     m.trackNumber.color = color
     m.tracklength.color = color
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_options_OptionNode.bs.html b/docs/api/components_options_OptionNode.bs.html index 55352a7392..3b51862de5 100644 --- a/docs/api/components_options_OptionNode.bs.html +++ b/docs/api/components_options_OptionNode.bs.html @@ -1,5 +1,5 @@ Source: components/options/OptionNode.bs
On this page

components_options_OptionNode.bs

sub init()
+    
On this page

components_options_OptionNode.bs

sub init()
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_options_OptionsSlider.bs.html b/docs/api/components_options_OptionsSlider.bs.html index 87e0b40264..a0ffc9fbc5 100644 --- a/docs/api/components_options_OptionsSlider.bs.html +++ b/docs/api/components_options_OptionsSlider.bs.html @@ -1,6 +1,6 @@ Source: components/options/OptionsSlider.bs
On this page

components_options_OptionsSlider.bs

sub init()
+    
On this page

components_options_OptionsSlider.bs

sub init()
     m.top.visible = false
 
     panel = m.top.findNode("panel")
@@ -41,4 +41,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_photos_LoadPhotoTask.bs.html b/docs/api/components_photos_LoadPhotoTask.bs.html index be758eded5..b770004777 100644 --- a/docs/api/components_photos_LoadPhotoTask.bs.html +++ b/docs/api/components_photos_LoadPhotoTask.bs.html @@ -1,6 +1,6 @@ Source: components/photos/LoadPhotoTask.bs
On this page

components_photos_LoadPhotoTask.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_photos_LoadPhotoTask.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/misc.bs"
@@ -28,4 +28,4 @@
 
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_photos_PhotoDetails.bs.html b/docs/api/components_photos_PhotoDetails.bs.html index 1b3035bfe2..1bb379d4c7 100644 --- a/docs/api/components_photos_PhotoDetails.bs.html +++ b/docs/api/components_photos_PhotoDetails.bs.html @@ -1,6 +1,6 @@ Source: components/photos/PhotoDetails.bs
On this page

components_photos_PhotoDetails.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_photos_PhotoDetails.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -177,4 +177,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_quickConnect_QuickConnect.bs.html b/docs/api/components_quickConnect_QuickConnect.bs.html index 4c5d0b284c..95fa473a77 100644 --- a/docs/api/components_quickConnect_QuickConnect.bs.html +++ b/docs/api/components_quickConnect_QuickConnect.bs.html @@ -1,6 +1,6 @@ Source: components/quickConnect/QuickConnect.bs
On this page

components_quickConnect_QuickConnect.bs

import "pkg:/source/api/userauth.bs"
+    
On this page

components_quickConnect_QuickConnect.bs

import "pkg:/source/api/userauth.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -17,4 +17,4 @@
         m.top.authenticated = -1
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_quickConnect_QuickConnectDialog.bs.html b/docs/api/components_quickConnect_QuickConnectDialog.bs.html index 4639db4609..2629125c2b 100644 --- a/docs/api/components_quickConnect_QuickConnectDialog.bs.html +++ b/docs/api/components_quickConnect_QuickConnectDialog.bs.html @@ -1,6 +1,6 @@ Source: components/quickConnect/QuickConnectDialog.bs
On this page

components_quickConnect_QuickConnectDialog.bs

import "pkg:/source/api/userauth.bs"
+    
On this page

components_quickConnect_QuickConnectDialog.bs

import "pkg:/source/api/userauth.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/session.bs"
@@ -71,4 +71,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_search_SearchResults.bs.html b/docs/api/components_search_SearchResults.bs.html index f2dd5a1664..8d267d3dc0 100644 --- a/docs/api/components_search_SearchResults.bs.html +++ b/docs/api/components_search_SearchResults.bs.html @@ -1,6 +1,6 @@ Source: components/search/SearchResults.bs
On this page

components_search_SearchResults.bs

import "pkg:/source/api/Items.bs"
+    
On this page

components_search_SearchResults.bs

import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/Image.bs"
@@ -84,4 +84,4 @@
     return false
 
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_search_SearchRow.bs.html b/docs/api/components_search_SearchRow.bs.html index 3b19135455..18a9daf672 100644 --- a/docs/api/components_search_SearchRow.bs.html +++ b/docs/api/components_search_SearchRow.bs.html @@ -1,6 +1,6 @@ Source: components/search/SearchRow.bs
On this page

components_search_SearchRow.bs

import "pkg:/source/api/Items.bs"
+    
On this page

components_search_SearchRow.bs

import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/Image.bs"
@@ -94,4 +94,4 @@
         end if
     end for
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_search_SearchTask.bs.html b/docs/api/components_search_SearchTask.bs.html index b8455a8096..fe96ecb98d 100644 --- a/docs/api/components_search_SearchTask.bs.html +++ b/docs/api/components_search_SearchTask.bs.html @@ -1,6 +1,6 @@ Source: components/search/SearchTask.bs
On this page

components_search_SearchTask.bs

import "pkg:/source/api/Items.bs"
+    
On this page

components_search_SearchTask.bs

import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/Image.bs"
@@ -15,4 +15,4 @@
         m.top.results = searchMedia(m.top.query)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_section_section.bs.html b/docs/api/components_section_section.bs.html index bc1a8cd661..63bf8f97cb 100644 --- a/docs/api/components_section_section.bs.html +++ b/docs/api/components_section_section.bs.html @@ -1,6 +1,6 @@ Source: components/section/section.bs
On this page

components_section_section.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_section_section.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.showFromBottomAnimation = m.top.findNode("showFromBottomAnimation")
@@ -97,4 +97,4 @@
         end if
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_section_sectionScroller.bs.html b/docs/api/components_section_sectionScroller.bs.html index a94f6f04db..7b9c724748 100644 --- a/docs/api/components_section_sectionScroller.bs.html +++ b/docs/api/components_section_sectionScroller.bs.html @@ -1,6 +1,6 @@ Source: components/section/sectionScroller.bs
On this page

components_section_sectionScroller.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_section_sectionScroller.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.previouslyDisplayedSection = 0
@@ -60,4 +60,4 @@
 
     m.previouslyDisplayedSection = m.top.displayedIndex
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_settings_settings.bs.html b/docs/api/components_settings_settings.bs.html index f834f21360..0abda18e42 100644 --- a/docs/api/components_settings_settings.bs.html +++ b/docs/api/components_settings_settings.bs.html @@ -1,6 +1,6 @@ Source: components/settings/settings.bs
On this page

components_settings_settings.bs

import "pkg:/source/utils/config.bs"
+    
On this page

components_settings_settings.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
 import "pkg:/source/roku_modules/log/LogMixin.brs"
 ' post device profile
@@ -254,4 +254,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tasks_PostTask.bs.html b/docs/api/components_tasks_PostTask.bs.html index 574e203a2e..096b7673c9 100644 --- a/docs/api/components_tasks_PostTask.bs.html +++ b/docs/api/components_tasks_PostTask.bs.html @@ -1,6 +1,6 @@ Source: components/tasks/PostTask.bs
On this page

components_tasks_PostTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_tasks_PostTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/misc.bs"
 
 sub init()
@@ -79,4 +79,4 @@
     m.top.responseHeaders = {}
     m.top.failureReason = ""
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVEpisodeRow.bs.html b/docs/api/components_tvshows_TVEpisodeRow.bs.html index 74c13311ba..45d7864578 100644 --- a/docs/api/components_tvshows_TVEpisodeRow.bs.html +++ b/docs/api/components_tvshows_TVEpisodeRow.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVEpisodeRow.bs
On this page

components_tvshows_TVEpisodeRow.bs

sub init()
+    
On this page

components_tvshows_TVEpisodeRow.bs

sub init()
     m.top.itemComponentName = "TVListDetails"
     m.top.content = setData()
 
@@ -62,4 +62,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html b/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html index 6737780cdd..131d80e4fb 100644 --- a/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html +++ b/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVEpisodeRowWithOptions.bs
On this page

components_tvshows_TVEpisodeRowWithOptions.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_tvshows_TVEpisodeRowWithOptions.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.rows = m.top.findNode("tvEpisodeRow")
@@ -123,4 +123,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVEpisodes.bs.html b/docs/api/components_tvshows_TVEpisodes.bs.html index 7e256f98fb..66db331ed1 100644 --- a/docs/api/components_tvshows_TVEpisodes.bs.html +++ b/docs/api/components_tvshows_TVEpisodes.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVEpisodes.bs
On this page

components_tvshows_TVEpisodes.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_tvshows_TVEpisodes.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
@@ -135,4 +135,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVListDetails.bs.html b/docs/api/components_tvshows_TVListDetails.bs.html index 0b198ebe0b..d029507f80 100644 --- a/docs/api/components_tvshows_TVListDetails.bs.html +++ b/docs/api/components_tvshows_TVListDetails.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVListDetails.bs
On this page

components_tvshows_TVListDetails.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_tvshows_TVListDetails.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -191,4 +191,4 @@
         end if
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVListOptions.bs.html b/docs/api/components_tvshows_TVListOptions.bs.html index 98d2834b73..ae42a862bd 100644 --- a/docs/api/components_tvshows_TVListOptions.bs.html +++ b/docs/api/components_tvshows_TVListOptions.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVListOptions.bs
On this page

components_tvshows_TVListOptions.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_tvshows_TVListOptions.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
 
@@ -154,4 +154,4 @@
     return false
 
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVSeasonRow.bs.html b/docs/api/components_tvshows_TVSeasonRow.bs.html index 8158c7212d..4c537c573c 100644 --- a/docs/api/components_tvshows_TVSeasonRow.bs.html +++ b/docs/api/components_tvshows_TVSeasonRow.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVSeasonRow.bs
On this page

components_tvshows_TVSeasonRow.bs

sub init()
+    
On this page

components_tvshows_TVSeasonRow.bs

sub init()
     m.top.itemComponentName = "ListPoster"
     m.top.content = getData()
 
@@ -48,4 +48,4 @@
     m.top.content = data
     return data
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVShowDescription.bs.html b/docs/api/components_tvshows_TVShowDescription.bs.html index 3f589ab089..bdaf5aebcf 100644 --- a/docs/api/components_tvshows_TVShowDescription.bs.html +++ b/docs/api/components_tvshows_TVShowDescription.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVShowDescription.bs
On this page

components_tvshows_TVShowDescription.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_tvshows_TVShowDescription.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     buttons = m.top.findNode("buttons")
@@ -132,4 +132,4 @@
     end if
 end function
 
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVShowDetails.bs.html b/docs/api/components_tvshows_TVShowDetails.bs.html index 7a6770f8fc..c75d0d3cb9 100644 --- a/docs/api/components_tvshows_TVShowDetails.bs.html +++ b/docs/api/components_tvshows_TVShowDetails.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVShowDetails.bs
On this page

components_tvshows_TVShowDetails.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_tvshows_TVShowDetails.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -244,4 +244,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_video_OSD.bs.html b/docs/api/components_video_OSD.bs.html index 2e82129b23..3271e113cc 100644 --- a/docs/api/components_video_OSD.bs.html +++ b/docs/api/components_video_OSD.bs.html @@ -1,6 +1,6 @@ Source: components/video/OSD.bs
On this page

components_video_OSD.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_video_OSD.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.videoControls = m.top.findNode("videoControls")
@@ -245,4 +245,4 @@
     m.top.action = "hide"
     return true
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_video_VideoPlayerView.bs.html b/docs/api/components_video_VideoPlayerView.bs.html index 10031de0fa..29d8bd3757 100644 --- a/docs/api/components_video_VideoPlayerView.bs.html +++ b/docs/api/components_video_VideoPlayerView.bs.html @@ -1,6 +1,6 @@ Source: components/video/VideoPlayerView.bs
On this page

components_video_VideoPlayerView.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_video_VideoPlayerView.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -696,4 +696,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/data/search.json b/docs/api/data/search.json index 2b650d6c3c..7c14b1f570 100644 --- a/docs/api/data/search.json +++ b/docs/api/data/search.json @@ -1 +1 @@ -{"list":[{"title":"module:AlbumData","link":"AlbumData"},{"title":"module:AlbumData.setFields","link":"setFields"},{"title":"module:AlbumGrid","link":"AlbumGrid"},{"title":"module:AlbumGrid.getData","link":"getData"},{"title":"module:AlbumGrid.init","link":"init"},{"title":"module:AlbumGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumTrackList","link":"AlbumTrackList"},{"title":"module:AlbumTrackList.getData","link":"getData"},{"title":"module:AlbumTrackList.init","link":"init"},{"title":"module:AlbumView","link":"AlbumView"},{"title":"module:AlbumView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:AlbumView.createDialogPallete","link":"createDialogPallete"},{"title":"module:AlbumView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:AlbumView.init","link":"init"},{"title":"module:AlbumView.onDoneLoading","link":"onDoneLoading"},{"title":"module:AlbumView.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:AlbumView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AlbumView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AlbumView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AlbumView.setupMainNode","link":"setupMainNode"},{"title":"module:Alpha","link":"Alpha"},{"title":"module:Alpha.init","link":"init"},{"title":"module:Alpha.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView","link":"ArtistView"},{"title":"module:ArtistView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:ArtistView.OnScreenShown","link":"OnScreenShown"},{"title":"module:ArtistView.artistOverviewChanged","link":"artistOverviewChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:ArtistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:ArtistView.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:ArtistView.init","link":"init"},{"title":"module:ArtistView.onAlbumsData","link":"onAlbumsData"},{"title":"module:ArtistView.onAlbumsEscape","link":"onAlbumsEscape"},{"title":"module:ArtistView.onAppearsOnData","link":"onAppearsOnData"},{"title":"module:ArtistView.onAppearsOnEscape","link":"onAppearsOnEscape"},{"title":"module:ArtistView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:ArtistView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:ArtistView.onEllipsisChanged","link":"onEllipsisChanged"},{"title":"module:ArtistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView.onSectionNavigationEscape","link":"onSectionNavigationEscape"},{"title":"module:ArtistView.onSectionNavigationSelected","link":"onSectionNavigationSelected"},{"title":"module:ArtistView.onSectionScrollerChange","link":"onSectionScrollerChange"},{"title":"module:ArtistView.pageContentChanged","link":"pageContentChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:ArtistView.setPosterImage","link":"setPosterImage"},{"title":"module:ArtistView.setScreenTitle","link":"setScreenTitle"},{"title":"module:ArtistView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:ArtistView.setupMainNode","link":"setupMainNode"},{"title":"module:AudioPlayer","link":"AudioPlayer"},{"title":"module:AudioPlayer.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:AudioPlayer.audioStateChanged","link":"audioStateChanged","description":"

State Change Event Handler

"},{"title":"module:AudioPlayer.init","link":"init"},{"title":"module:AudioPlayerView","link":"AudioPlayerView"},{"title":"module:AudioPlayerView.LoadNextSong","link":"LoadNextSong"},{"title":"module:AudioPlayerView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:AudioPlayerView.audioPositionChanged","link":"audioPositionChanged"},{"title":"module:AudioPlayerView.audioStateChanged","link":"audioStateChanged"},{"title":"module:AudioPlayerView.bufferPositionChanged","link":"bufferPositionChanged"},{"title":"module:AudioPlayerView.endScreenSaver","link":"endScreenSaver"},{"title":"module:AudioPlayerView.findCurrentSongIndex","link":"findCurrentSongIndex"},{"title":"module:AudioPlayerView.init","link":"init"},{"title":"module:AudioPlayerView.loadButtons","link":"loadButtons","description":"

If we have more and 1 song to play, fade in the next and previous controls

"},{"title":"module:AudioPlayerView.loopClicked","link":"loopClicked"},{"title":"module:AudioPlayerView.nextClicked","link":"nextClicked"},{"title":"module:AudioPlayerView.onAudioStreamLoaded","link":"onAudioStreamLoaded"},{"title":"module:AudioPlayerView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:AudioPlayerView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:AudioPlayerView.onKeyEvent","link":"onKeyEvent","description":"

Process key press events

"},{"title":"module:AudioPlayerView.onMetaDataLoaded","link":"onMetaDataLoaded"},{"title":"module:AudioPlayerView.onScreensaverTimeoutLoaded","link":"onScreensaverTimeoutLoaded"},{"title":"module:AudioPlayerView.pageContentChanged","link":"pageContentChanged","description":"

Update values on screen when page content changes

"},{"title":"module:AudioPlayerView.playAction","link":"playAction"},{"title":"module:AudioPlayerView.previousClicked","link":"previousClicked"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.screenSaverActive","link":"screenSaverActive"},{"title":"module:AudioPlayerView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:AudioPlayerView.setLoopButtonImage","link":"setLoopButtonImage"},{"title":"module:AudioPlayerView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AudioPlayerView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AudioPlayerView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AudioPlayerView.setShuffleIconState","link":"setShuffleIconState"},{"title":"module:AudioPlayerView.setTrackNumberDisplay","link":"setTrackNumberDisplay"},{"title":"module:AudioPlayerView.setupAnimationTasks","link":"setupAnimationTasks"},{"title":"module:AudioPlayerView.setupAudioNode","link":"setupAudioNode","description":"

Creates audio node used to play song(s)

"},{"title":"module:AudioPlayerView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:AudioPlayerView.setupDataTasks","link":"setupDataTasks","description":"

Creates tasks to gather data needed to render Scene and play song

"},{"title":"module:AudioPlayerView.setupInfoNodes","link":"setupInfoNodes"},{"title":"module:AudioPlayerView.setupScreenSaver","link":"setupScreenSaver"},{"title":"module:AudioPlayerView.shuffleClicked","link":"shuffleClicked"},{"title":"module:AudioPlayerView.startScreenSaver","link":"startScreenSaver"},{"title":"module:AudioPlayerView.toggleShuffleEnabled","link":"toggleShuffleEnabled"},{"title":"module:AudioTrackListItem","link":"AudioTrackListItem"},{"title":"module:AudioTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:AudioTrackListItem.init","link":"init"},{"title":"module:AudioTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ButtonGroupHoriz","link":"ButtonGroupHoriz"},{"title":"module:ButtonGroupHoriz.init","link":"init"},{"title":"module:ButtonGroupHoriz.onKeyEvent","link":"onKeyEvent"},{"title":"module:ButtonGroupVert","link":"ButtonGroupVert"},{"title":"module:ButtonGroupVert.init","link":"init"},{"title":"module:ButtonGroupVert.onFocusButtonChanged","link":"onFocusButtonChanged"},{"title":"module:ButtonGroupVert.onFocusChanged","link":"onFocusChanged"},{"title":"module:ButtonGroupVert.onKeyEvent","link":"onKeyEvent"},{"title":"module:ChannelData","link":"ChannelData"},{"title":"module:ChannelData.setFields","link":"setFields"},{"title":"module:ChannelData.setPoster","link":"setPoster"},{"title":"module:Clock","link":"Clock"},{"title":"module:Clock.init","link":"init"},{"title":"module:Clock.onCurrentTimeTimerFire","link":"onCurrentTimeTimerFire","description":"

onCurrentTimeTimerFire: Code that runs every time the currentTimeTimer fires

"},{"title":"module:CollectionData","link":"CollectionData"},{"title":"module:CollectionData.setFields","link":"setFields"},{"title":"module:CollectionData.setPoster","link":"setPoster"},{"title":"module:ConfigData","link":"ConfigData"},{"title":"module:ConfigData.init","link":"init"},{"title":"module:ConfigItem","link":"ConfigItem"},{"title":"module:ConfigItem.init","link":"init"},{"title":"module:ConfigItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ConfigItem.setColors","link":"setColors"},{"title":"module:ConfigList","link":"ConfigList"},{"title":"module:ConfigList.configListShowDialog","link":"configListShowDialog"},{"title":"module:ConfigList.dismiss_dialog","link":"dismiss_dialog"},{"title":"module:ConfigList.init","link":"init"},{"title":"module:ConfigList.onDialogButton","link":"onDialogButton"},{"title":"module:ConfigList.onItemSelected","link":"onItemSelected"},{"title":"module:ConfigList.setData","link":"setData"},{"title":"module:ExtrasItem","link":"ExtrasItem"},{"title":"module:ExtrasItem.focusChanged","link":"focusChanged"},{"title":"module:ExtrasItem.init","link":"init"},{"title":"module:ExtrasItem.showContent","link":"showContent"},{"title":"module:ExtrasRowList","link":"ExtrasRowList"},{"title":"module:ExtrasRowList.addRowSize","link":"addRowSize"},{"title":"module:ExtrasRowList.buildRow","link":"buildRow"},{"title":"module:ExtrasRowList.init","link":"init"},{"title":"module:ExtrasRowList.loadParts","link":"loadParts"},{"title":"module:ExtrasRowList.loadPersonVideos","link":"loadPersonVideos"},{"title":"module:ExtrasRowList.onAdditionalPartsLoaded","link":"onAdditionalPartsLoaded"},{"title":"module:ExtrasRowList.onLikeThisLoaded","link":"onLikeThisLoaded"},{"title":"module:ExtrasRowList.onMoviesLoaded","link":"onMoviesLoaded"},{"title":"module:ExtrasRowList.onPeopleLoaded","link":"onPeopleLoaded"},{"title":"module:ExtrasRowList.onRowItemFocused","link":"onRowItemFocused"},{"title":"module:ExtrasRowList.onRowItemSelected","link":"onRowItemSelected"},{"title":"module:ExtrasRowList.onSeriesLoaded","link":"onSeriesLoaded"},{"title":"module:ExtrasRowList.onShowsLoaded","link":"onShowsLoaded"},{"title":"module:ExtrasRowList.onSpecialFeaturesLoaded","link":"onSpecialFeaturesLoaded"},{"title":"module:ExtrasRowList.updateSize","link":"updateSize"},{"title":"module:FavoriteItemsTask","link":"FavoriteItemsTask"},{"title":"module:FavoriteItemsTask.init","link":"init"},{"title":"module:FavoriteItemsTask.setFavoriteStatus","link":"setFavoriteStatus"},{"title":"module:FolderData","link":"FolderData"},{"title":"module:FolderData.setFields","link":"setFields"},{"title":"module:FolderData.setPoster","link":"setPoster"},{"title":"module:GetFiltersTask","link":"GetFiltersTask"},{"title":"module:GetFiltersTask.getFiltersTask","link":"getFiltersTask"},{"title":"module:GetFiltersTask.init","link":"init"},{"title":"module:GetNextEpisodeTask","link":"GetNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.getNextEpisodeTask","link":"getNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.init","link":"init"},{"title":"module:GetPlaybackInfoTask","link":"GetPlaybackInfoTask"},{"title":"module:GetPlaybackInfoTask.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:GetPlaybackInfoTask.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:GetPlaybackInfoTask.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:GetPlaybackInfoTask.getPlaybackInfoTask","link":"getPlaybackInfoTask","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:GetPlaybackInfoTask.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:GetPlaybackInfoTask.init","link":"init"},{"title":"module:GetShuffleEpisodesTask","link":"GetShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.getShuffleEpisodesTask","link":"getShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.init","link":"init"},{"title":"module:GridItem","link":"GridItem"},{"title":"module:GridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:GridItem.focusChanging","link":"focusChanging","description":"

Use FocusPercent to animate scaling of Poser Image

"},{"title":"module:GridItem.init","link":"init"},{"title":"module:GridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:GridItemSmall","link":"GridItemSmall"},{"title":"module:GridItemSmall.focusChanged","link":"focusChanged"},{"title":"module:GridItemSmall.init","link":"init"},{"title":"module:GridItemSmall.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItemSmall.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:Home","link":"Home"},{"title":"module:Home.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook that gets ran as needed.\nUsed to update the focus, the state of the data, and tells the server about the device profile

"},{"title":"module:Home.init","link":"init"},{"title":"module:Home.loadLibraries","link":"loadLibraries"},{"title":"module:Home.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:Home.refresh","link":"refresh"},{"title":"module:HomeData","link":"HomeData"},{"title":"module:HomeData.setData","link":"setData"},{"title":"module:HomeItem","link":"HomeItem"},{"title":"module:HomeItem.drawProgressBar","link":"drawProgressBar","description":"

Draws and animates item progress bar

"},{"title":"module:HomeItem.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:HomeItem.init","link":"init"},{"title":"module:HomeItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:HomeItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and icon when poster loaded

"},{"title":"module:HomeRows","link":"HomeRows"},{"title":"module:HomeRows.addHomeSection","link":"addHomeSection","description":"

Adds a new home section to the home rows.\nReturns a boolean indicating whether the section was handled.

"},{"title":"module:HomeRows.createContinueWatchingRow","link":"createContinueWatchingRow","description":"

Create a row displaying items the user can continue watching

"},{"title":"module:HomeRows.createFavoritesRow","link":"createFavoritesRow","description":"

Create a row displaying items from the user's favorites list

"},{"title":"module:HomeRows.createLatestInRows","link":"createLatestInRows","description":"

Create a row displaying latest items in each of the user's libraries

"},{"title":"module:HomeRows.createLibraryRow","link":"createLibraryRow","description":"

Create a row displaying the user's libraries

"},{"title":"module:HomeRows.createLiveTVRow","link":"createLiveTVRow","description":"

Create a row displaying the live tv now on section

"},{"title":"module:HomeRows.createNextUpRow","link":"createNextUpRow","description":"

Create a row displaying next episodes up to watch

"},{"title":"module:HomeRows.filterNodeArray","link":"filterNodeArray"},{"title":"module:HomeRows.init","link":"init"},{"title":"module:HomeRows.itemSelected","link":"itemSelected"},{"title":"module:HomeRows.loadLibraries","link":"loadLibraries"},{"title":"module:HomeRows.onKeyEvent","link":"onKeyEvent"},{"title":"module:HomeRows.onLibrariesLoaded","link":"onLibrariesLoaded"},{"title":"module:HomeRows.removeHomeSection","link":"removeHomeSection","description":"

Removes a home section from the home rows

"},{"title":"module:HomeRows.updateContinueWatchingItems","link":"updateContinueWatchingItems"},{"title":"module:HomeRows.updateFavoritesItems","link":"updateFavoritesItems"},{"title":"module:HomeRows.updateHomeRows","link":"updateHomeRows","description":"

Update home row data

"},{"title":"module:HomeRows.updateLatestInRows","link":"updateLatestInRows","description":"

Iterate over user's libraries and update data for each Latest In section

"},{"title":"module:HomeRows.updateLatestItems","link":"updateLatestItems"},{"title":"module:HomeRows.updateNextUpItems","link":"updateNextUpItems"},{"title":"module:HomeRows.updateOnNowItems","link":"updateOnNowItems"},{"title":"module:HomeRows.updateSize","link":"updateSize"},{"title":"module:HomeRows.updateSizeArray","link":"updateSizeArray"},{"title":"module:IconButton","link":"IconButton"},{"title":"module:IconButton.init","link":"init"},{"title":"module:IconButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:IconButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:IconButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:IconButton.onIconChanged","link":"onIconChanged"},{"title":"module:IconButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:IconButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:IconButton.onTextChanged","link":"onTextChanged"},{"title":"module:IconButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:IconButton.setIconSize","link":"setIconSize"},{"title":"module:Image","link":"Image"},{"title":"module:Image.ImageURL","link":"ImageURL"},{"title":"module:Image.ItemImages","link":"ItemImages"},{"title":"module:Image.PosterImage","link":"PosterImage"},{"title":"module:Image.UserImageURL","link":"UserImageURL"},{"title":"module:ImageData","link":"ImageData"},{"title":"module:ImageData.setFields","link":"setFields"},{"title":"module:IntegerKeyboard","link":"IntegerKeyboard"},{"title":"module:IntegerKeyboard.init","link":"init"},{"title":"module:IntegerKeyboard.keySelected","link":"keySelected"},{"title":"module:IntegerKeyboard.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid","link":"ItemGrid"},{"title":"module:ItemGrid.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:ItemGrid.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:ItemGrid.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:ItemGrid.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:ItemGrid.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:ItemGrid.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:ItemGrid.init","link":"init"},{"title":"module:ItemGrid.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:ItemGrid.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:ItemGrid.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:ItemGrid.onChannelFocused","link":"onChannelFocused"},{"title":"module:ItemGrid.onChannelSelected","link":"onChannelSelected"},{"title":"module:ItemGrid.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:ItemGrid.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:ItemGrid.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:ItemGrid.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:ItemGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:ItemGrid.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:ItemGrid.setBoxsetsOptions","link":"setBoxsetsOptions","description":"

Set Boxset view, sort, and filter options

"},{"title":"module:ItemGrid.setDefaultOptions","link":"setDefaultOptions","description":"

Set Default view, sort, and filter options

"},{"title":"module:ItemGrid.setLiveTvOptions","link":"setLiveTvOptions","description":"

Set Live TV view, sort, and filter options

"},{"title":"module:ItemGrid.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:ItemGrid.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:ItemGrid.setPhotoAlbumOptions","link":"setPhotoAlbumOptions","description":"

Set Photo Album view, sort, and filter options

"},{"title":"module:ItemGrid.setTvShowsOptions","link":"setTvShowsOptions","description":"

Set TV Show view, sort, and filter options

"},{"title":"module:ItemGrid.showTVGuide","link":"showTVGuide"},{"title":"module:ItemGrid.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:ItemGrid.updateTitle","link":"updateTitle"},{"title":"module:ItemGridOptions","link":"ItemGridOptions"},{"title":"module:ItemGridOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:ItemGridOptions.hideChecklist","link":"hideChecklist"},{"title":"module:ItemGridOptions.init","link":"init"},{"title":"module:ItemGridOptions.isFilterMenuDataValid","link":"isFilterMenuDataValid","description":"

Check if data for Filter Menu is valid

"},{"title":"module:ItemGridOptions.onFilterFocusChange","link":"onFilterFocusChange"},{"title":"module:ItemGridOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGridOptions.optionsSet","link":"optionsSet"},{"title":"module:ItemGridOptions.saveFavoriteItemSelected","link":"saveFavoriteItemSelected"},{"title":"module:ItemGridOptions.setHeartColor","link":"setHeartColor"},{"title":"module:ItemGridOptions.showChecklist","link":"showChecklist"},{"title":"module:ItemGridOptions.toggleFavorite","link":"toggleFavorite"},{"title":"module:Items","link":"Items"},{"title":"module:Items.AppearsOnList","link":"AppearsOnList","description":"

Get list of albums an artist appears on

"},{"title":"module:Items.ArtistOverview","link":"ArtistOverview","description":"

Music Artist Data

"},{"title":"module:Items.AudioItem","link":"AudioItem","description":"

Get Songs that are on an Album

"},{"title":"module:Items.AudioStream","link":"AudioStream"},{"title":"module:Items.BackdropImage","link":"BackdropImage"},{"title":"module:Items.CreateArtistMix","link":"CreateArtistMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.CreateInstantMix","link":"CreateInstantMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.GetIntroVideos","link":"GetIntroVideos","description":"

Get Intro Videos for an item

"},{"title":"module:Items.GetSongsByArtist","link":"GetSongsByArtist","description":"

Get list of songs belonging to an artist

"},{"title":"module:Items.ItemGetPlaybackInfo","link":"ItemGetPlaybackInfo"},{"title":"module:Items.ItemMetaData","link":"ItemMetaData","description":"

MetaData about an item

"},{"title":"module:Items.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:Items.MusicAlbumList","link":"MusicAlbumList","description":"

Get list of albums belonging to an artist

"},{"title":"module:Items.MusicSongList","link":"MusicSongList","description":"

Get Songs that are on an Album

"},{"title":"module:Items.PlaylistItemList","link":"PlaylistItemList","description":"

Get Items that are under the provided item

"},{"title":"module:Items.TVEpisodeShuffleList","link":"TVEpisodeShuffleList"},{"title":"module:Items.TVEpisodes","link":"TVEpisodes","description":"

Returns a list of TV Shows for a given TV Show and season\nAccepts strings for the TV Show Id and the season Id

"},{"title":"module:Items.TVSeasonExtras","link":"TVSeasonExtras","description":"

Returns a list of extra features for a TV Show season\nAccepts a string that is a TV Show season id

"},{"title":"module:Items.TVSeasons","link":"TVSeasons","description":"

Seasons for a TV Show

"},{"title":"module:Items.searchMedia","link":"searchMedia","description":"

Search across all libraries

"},{"title":"module:Items.useTranscodeAudioStream","link":"useTranscodeAudioStream"},{"title":"module:JFButton","link":"JFButton"},{"title":"module:JFButton.init","link":"init"},{"title":"module:JFButton.onTextChanged","link":"onTextChanged","description":"

Whenever the text changes, pad both sides with whitespace so we can center the button text

"},{"title":"module:JFButtons","link":"JFButtons"},{"title":"module:JFButtons.focusChanged","link":"focusChanged","description":"

Change opacity of the highlighted menu item based on focus

"},{"title":"module:JFButtons.highlightSelected","link":"highlightSelected","description":"

Highlight selected menu option

"},{"title":"module:JFButtons.init","link":"init"},{"title":"module:JFButtons.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFButtons.renderChanged","link":"renderChanged","description":"

When options are fully displayed, set focus and selected option

"},{"title":"module:JFButtons.selectedIndexChanged","link":"selectedIndexChanged","description":"

When Selected Index set, ensure it is the one Focused

"},{"title":"module:JFButtons.showButtons","link":"showButtons"},{"title":"module:JFButtons.updateButtons","link":"updateButtons"},{"title":"module:JFGroup","link":"JFGroup"},{"title":"module:JFGroup.init","link":"init"},{"title":"module:JFGroup.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog","link":"JFMessageDialog"},{"title":"module:JFMessageDialog.init","link":"init"},{"title":"module:JFMessageDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog.redraw","link":"redraw"},{"title":"module:JFMessageDialog.updateMessage","link":"updateMessage"},{"title":"module:JFMessageDialog.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang","link":"JFOverhang"},{"title":"module:JFOverhang.init","link":"init"},{"title":"module:JFOverhang.onVisibleChange","link":"onVisibleChange"},{"title":"module:JFOverhang.resetTime","link":"resetTime"},{"title":"module:JFOverhang.setClockVisibility","link":"setClockVisibility"},{"title":"module:JFOverhang.setRightSeperatorVisibility","link":"setRightSeperatorVisibility"},{"title":"module:JFOverhang.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang.updateTime","link":"updateTime"},{"title":"module:JFOverhang.updateTimeDisplay","link":"updateTimeDisplay"},{"title":"module:JFOverhang.updateTitle","link":"updateTitle"},{"title":"module:JFOverhang.updateUser","link":"updateUser"},{"title":"module:JFScene","link":"JFScene"},{"title":"module:JFScene.disableRemoteChanged","link":"disableRemoteChanged","description":"

Triggered when the disableRemote boolean component field is changed

"},{"title":"module:JFScene.init","link":"init"},{"title":"module:JFScene.isLoadingChanged","link":"isLoadingChanged","description":"

Triggered when the isLoading boolean component field is changed

"},{"title":"module:JFScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFScreen","link":"JFScreen"},{"title":"module:JFScreen.OnScreenHidden","link":"OnScreenHidden","description":"

Function called when the screen is hidden by the screen manager\nIt is expected that screens override this function if required,\nto handle focus any actions required on the screen being hidden

"},{"title":"module:JFScreen.OnScreenShown","link":"OnScreenShown","description":"

Function called when the screen is displayed by the screen manager\nIt is expected that screens override this function to handle focus\nmanagmenet and any other actions required on screen shown

"},{"title":"module:JFScreen.init","link":"init"},{"title":"module:JFServer","link":"JFServer"},{"title":"module:JFServer.init","link":"init"},{"title":"module:JFServer.itemContentChanged","link":"itemContentChanged"},{"title":"module:JFServer.onFocusPercentChange","link":"onFocusPercentChange"},{"title":"module:JFServer.setTextColor","link":"setTextColor"},{"title":"module:JFVideo","link":"JFVideo"},{"title":"module:JFVideo.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:JFVideo.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:JFVideo.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:JFVideo.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:JFVideo.init","link":"init"},{"title":"module:JFVideo.loadCaption","link":"loadCaption"},{"title":"module:JFVideo.onAllowCaptionsChange","link":"onAllowCaptionsChange"},{"title":"module:JFVideo.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:JFVideo.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFVideo.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:JFVideo.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:JFVideo.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:JFVideo.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:JFVideo.toggleCaption","link":"toggleCaption"},{"title":"module:JFVideo.updateCaption","link":"updateCaption"},{"title":"module:JFVideo.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:ListPoster","link":"ListPoster"},{"title":"module:ListPoster.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:ListPoster.init","link":"init"},{"title":"module:ListPoster.itemContentChanged","link":"itemContentChanged"},{"title":"module:ListPoster.updateSize","link":"updateSize"},{"title":"module:LoadChannelsTask","link":"LoadChannelsTask"},{"title":"module:LoadChannelsTask.init","link":"init"},{"title":"module:LoadChannelsTask.loadChannels","link":"loadChannels"},{"title":"module:LoadItemsTask","link":"LoadItemsTask"},{"title":"module:LoadItemsTask.getPersonVideos","link":"getPersonVideos"},{"title":"module:LoadItemsTask.init","link":"init"},{"title":"module:LoadItemsTask.loadItems","link":"loadItems"},{"title":"module:LoadItemsTask2","link":"LoadItemsTask2"},{"title":"module:LoadItemsTask2.init","link":"init"},{"title":"module:LoadItemsTask2.loadItems","link":"loadItems"},{"title":"module:LoadPhotoTask","link":"LoadPhotoTask"},{"title":"module:LoadPhotoTask.init","link":"init"},{"title":"module:LoadPhotoTask.loadItems","link":"loadItems"},{"title":"module:LoadProgramDetailsTask","link":"LoadProgramDetailsTask"},{"title":"module:LoadProgramDetailsTask.init","link":"init"},{"title":"module:LoadProgramDetailsTask.loadProgramDetails","link":"loadProgramDetails"},{"title":"module:LoadScreenSaverTimeoutTask","link":"LoadScreenSaverTimeoutTask"},{"title":"module:LoadScreenSaverTimeoutTask.getScreensaverTimeout","link":"getScreensaverTimeout"},{"title":"module:LoadScreenSaverTimeoutTask.init","link":"init"},{"title":"module:LoadSheduleTask","link":"LoadSheduleTask"},{"title":"module:LoadSheduleTask.init","link":"init"},{"title":"module:LoadSheduleTask.loadSchedule","link":"loadSchedule"},{"title":"module:LoadVideoContentTask","link":"LoadVideoContentTask"},{"title":"module:LoadVideoContentTask.FindPreferredAudioStream","link":"FindPreferredAudioStream"},{"title":"module:LoadVideoContentTask.LoadItems_AddVideoContent","link":"LoadItems_AddVideoContent"},{"title":"module:LoadVideoContentTask.LoadItems_VideoPlayer","link":"LoadItems_VideoPlayer"},{"title":"module:LoadVideoContentTask.addNextEpisodesToQueue","link":"addNextEpisodesToQueue","description":"

Add next episodes to the playback queue

"},{"title":"module:LoadVideoContentTask.addSubtitlesToVideo","link":"addSubtitlesToVideo"},{"title":"module:LoadVideoContentTask.addVideoContentURL","link":"addVideoContentURL"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"title":"module:LoadVideoContentTask.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:LoadVideoContentTask.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:LoadVideoContentTask.init","link":"init"},{"title":"module:LoadVideoContentTask.loadItems","link":"loadItems"},{"title":"module:LoadVideoContentTask.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:LoginScene","link":"LoginScene"},{"title":"module:LoginScene.init","link":"init"},{"title":"module:LoginScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:Main","link":"Main"},{"title":"module:Main.Main","link":"Main"},{"title":"module:MovieData","link":"MovieData"},{"title":"module:MovieData.setContainer","link":"setContainer"},{"title":"module:MovieData.setFields","link":"setFields"},{"title":"module:MovieData.setPoster","link":"setPoster"},{"title":"module:MovieDetails","link":"MovieDetails"},{"title":"module:MovieDetails.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieDetails.SetDefaultAudioTrack","link":"SetDefaultAudioTrack"},{"title":"module:MovieDetails.SetUpAudioOptions","link":"SetUpAudioOptions"},{"title":"module:MovieDetails.SetUpVideoOptions","link":"SetUpVideoOptions"},{"title":"module:MovieDetails.audioOptionsClosed","link":"audioOptionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieDetails.getEndTime","link":"getEndTime"},{"title":"module:MovieDetails.getRuntime","link":"getRuntime"},{"title":"module:MovieDetails.init","link":"init"},{"title":"module:MovieDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:MovieDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieDetails.round","link":"round"},{"title":"module:MovieDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:MovieDetails.setFieldText","link":"setFieldText"},{"title":"module:MovieDetails.setWatchedColor","link":"setWatchedColor"},{"title":"module:MovieDetails.trailerAvailableChanged","link":"trailerAvailableChanged"},{"title":"module:MovieDetails.videoOptionsClosed","link":"videoOptionsClosed","description":"

Check if options were updated and if any reloding is needed...

"},{"title":"module:MovieLibraryView","link":"MovieLibraryView"},{"title":"module:MovieLibraryView.FilterDataLoaded","link":"FilterDataLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MovieLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MovieLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MovieLibraryView.SetName","link":"SetName","description":"

Set Selected Movie Name

"},{"title":"module:MovieLibraryView.SetOfficialRating","link":"SetOfficialRating","description":"

Set Selected Movie OfficialRating

"},{"title":"module:MovieLibraryView.SetOverview","link":"SetOverview","description":"

Set Selected Movie Overview

"},{"title":"module:MovieLibraryView.SetProductionYear","link":"SetProductionYear","description":"

Set Selected Movie ProductionYear

"},{"title":"module:MovieLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MovieLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MovieLibraryView.getRuntime","link":"getRuntime"},{"title":"module:MovieLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MovieLibraryView.init","link":"init"},{"title":"module:MovieLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MovieLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MovieLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MovieLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MovieLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MovieLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MovieLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MovieLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MovieLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MovieLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieLibraryView.round","link":"round"},{"title":"module:MovieLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MovieLibraryView.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:MovieLibraryView.setSelectedOptions","link":"setSelectedOptions","description":"

Data to display when options button selected

"},{"title":"module:MovieLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MovieLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MovieOptions","link":"MovieOptions"},{"title":"module:MovieOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:MovieOptions.init","link":"init"},{"title":"module:MovieOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieOptions.optionsSet","link":"optionsSet"},{"title":"module:MusicAlbumData","link":"MusicAlbumData"},{"title":"module:MusicAlbumData.setFields","link":"setFields"},{"title":"module:MusicAlbumData.setPoster","link":"setPoster"},{"title":"module:MusicAlbumSongListData","link":"MusicAlbumSongListData"},{"title":"module:MusicAlbumSongListData.setFields","link":"setFields"},{"title":"module:MusicAlbumSongListData.setPoster","link":"setPoster"},{"title":"module:MusicArtistData","link":"MusicArtistData"},{"title":"module:MusicArtistData.setFields","link":"setFields"},{"title":"module:MusicArtistData.setPoster","link":"setPoster"},{"title":"module:MusicArtistGridItem","link":"MusicArtistGridItem"},{"title":"module:MusicArtistGridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:MusicArtistGridItem.init","link":"init"},{"title":"module:MusicArtistGridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:MusicArtistGridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:MusicLibraryView","link":"MusicLibraryView"},{"title":"module:MusicLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MusicLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MusicLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MusicLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MusicLibraryView.SetAlbumCount","link":"SetAlbumCount","description":"

Set Selected Artist Album Count

"},{"title":"module:MusicLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MusicLibraryView.SetGenres","link":"SetGenres","description":"

Set Selected Artist Genres

"},{"title":"module:MusicLibraryView.SetName","link":"SetName","description":"

Set Selected Artist Name

"},{"title":"module:MusicLibraryView.SetSongCount","link":"SetSongCount","description":"

Set Selected Artist Song Count

"},{"title":"module:MusicLibraryView.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:MusicLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MusicLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MusicLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MusicLibraryView.init","link":"init"},{"title":"module:MusicLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MusicLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MusicLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MusicLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MusicLibraryView.onGenreItemFocused","link":"onGenreItemFocused","description":"

Genre Item Focused

"},{"title":"module:MusicLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MusicLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MusicLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MusicLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MusicLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MusicLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MusicLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MusicLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MusicLibraryView.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:MusicLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MusicLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MusicSongData","link":"MusicSongData"},{"title":"module:MusicSongData.setFields","link":"setFields"},{"title":"module:MusicSongData.setPoster","link":"setPoster"},{"title":"module:OSD","link":"OSD"},{"title":"module:OSD.inactiveCheck","link":"inactiveCheck","description":"

inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.

"},{"title":"module:OSD.init","link":"init"},{"title":"module:OSD.onButtonSelected","link":"onButtonSelected","description":"

onButtonSelected: Handler for selection of buttons from the menu.

"},{"title":"module:OSD.onFocusChanged","link":"onFocusChanged","description":"

onFocusChanged: Handler for changes to the focus of this menu.

"},{"title":"module:OSD.onItemTitleTextChanged","link":"onItemTitleTextChanged","description":"

onItemTitleTextChanged: Handler for changes to m.top.itemTitleText param.

"},{"title":"module:OSD.onKeyEvent","link":"onKeyEvent"},{"title":"module:OSD.onPlaybackStateChanged","link":"onPlaybackStateChanged","description":"

onPlaybackStateChanged: Handler for changes to m.top.playbackState param

"},{"title":"module:OSD.onProgressPercentageChanged","link":"onProgressPercentageChanged","description":"

onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param

"},{"title":"module:OSD.onVisibleChanged","link":"onVisibleChanged","description":"

onVisibleChanged: Handler for changes to the visibility of this menu.

"},{"title":"module:OSD.resetFocusToDefaultButton","link":"resetFocusToDefaultButton","description":"

resetFocusToDefaultButton: Reset focus back to the default button

"},{"title":"module:OptionNode","link":"OptionNode"},{"title":"module:OptionNode.init","link":"init"},{"title":"module:OptionsButton","link":"OptionsButton"},{"title":"module:OptionsButton.init","link":"init"},{"title":"module:OptionsButton.press","link":"press"},{"title":"module:OptionsData","link":"OptionsData"},{"title":"module:OptionsData.init","link":"init"},{"title":"module:OptionsData.press","link":"press"},{"title":"module:OptionsData.update_title","link":"update_title"},{"title":"module:OptionsSlider","link":"OptionsSlider"},{"title":"module:OptionsSlider.init","link":"init"},{"title":"module:OptionsSlider.onKeyEvent","link":"onKeyEvent"},{"title":"module:OptionsSlider.setFields","link":"setFields"},{"title":"module:OverviewDialog","link":"OverviewDialog"},{"title":"module:OverviewDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:OverviewDialog.setOverview","link":"setOverview"},{"title":"module:OverviewDialog.setTitle","link":"setTitle"},{"title":"module:PersonData","link":"PersonData"},{"title":"module:PersonData.setFields","link":"setFields"},{"title":"module:PersonData.setPoster","link":"setPoster"},{"title":"module:PersonDetails","link":"PersonDetails"},{"title":"module:PersonDetails.createDialogPallete","link":"createDialogPallete"},{"title":"module:PersonDetails.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PersonDetails.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:PersonDetails.init","link":"init"},{"title":"module:PersonDetails.loadPerson","link":"loadPerson"},{"title":"module:PersonDetails.onButtonGroupEscaped","link":"onButtonGroupEscaped"},{"title":"module:PersonDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PersonDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:PersonDetails.shortDate","link":"shortDate"},{"title":"module:PhotoData","link":"PhotoData"},{"title":"module:PhotoData.setFields","link":"setFields"},{"title":"module:PhotoData.setPoster","link":"setPoster"},{"title":"module:PhotoDetails","link":"PhotoDetails"},{"title":"module:PhotoDetails.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook.\nUsed to ensure tasks are stopped

"},{"title":"module:PhotoDetails.init","link":"init"},{"title":"module:PhotoDetails.isRandomChanged","link":"isRandomChanged","description":"

isRandom component field has changed

"},{"title":"module:PhotoDetails.isSlideshowChanged","link":"isSlideshowChanged","description":"

isSlideshow component field has changed

"},{"title":"module:PhotoDetails.isValidToContinue","link":"isValidToContinue"},{"title":"module:PhotoDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:PhotoDetails.nextSlide","link":"nextSlide"},{"title":"module:PhotoDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PhotoDetails.onPhotoLoaded","link":"onPhotoLoaded"},{"title":"module:PhotoDetails.statusUpdate","link":"statusUpdate"},{"title":"module:PlaybackDialog","link":"PlaybackDialog"},{"title":"module:PlaybackDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlayedCheckmark","link":"PlayedCheckmark"},{"title":"module:PlayedCheckmark.init","link":"init"},{"title":"module:PlaylistData","link":"PlaylistData"},{"title":"module:PlaylistData.setFields","link":"setFields"},{"title":"module:PlaylistData.setPoster","link":"setPoster"},{"title":"module:PlaylistView","link":"PlaylistView"},{"title":"module:PlaylistView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:PlaylistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:PlaylistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PlaylistView.init","link":"init"},{"title":"module:PlaylistView.onDoneLoading","link":"onDoneLoading"},{"title":"module:PlaylistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlaylistView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:PlaylistView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:PlaylistView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:PlaylistView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:PlaylistView.setupMainNode","link":"setupMainNode"},{"title":"module:PlaystateTask","link":"PlaystateTask"},{"title":"module:PlaystateTask.PlaystateDefaults","link":"PlaystateDefaults"},{"title":"module:PlaystateTask.PlaystateUpdate","link":"PlaystateUpdate"},{"title":"module:PlaystateTask.init","link":"init"},{"title":"module:PostTask","link":"PostTask"},{"title":"module:PostTask.asyncPost","link":"asyncPost","description":"

Post data and wait for response code

"},{"title":"module:PostTask.empty","link":"empty","description":"

Revert PostTask to default state

"},{"title":"module:PostTask.init","link":"init"},{"title":"module:PostTask.postItems","link":"postItems","description":"

Main function for PostTask.\nPosts either an array of data\nor a string of data to an API endpoint.\nSaves the response information

"},{"title":"module:ProgramDetails","link":"ProgramDetails"},{"title":"module:ProgramDetails.channelUpdated","link":"channelUpdated"},{"title":"module:ProgramDetails.focusChanged","link":"focusChanged","description":"

Show view channel button when item has Focus

"},{"title":"module:ProgramDetails.getDurationStringFromSeconds","link":"getDurationStringFromSeconds","description":"

Get program duration string (e.g. 1h 20m)

"},{"title":"module:ProgramDetails.getRelativeDayName","link":"getRelativeDayName","description":"

Get relative date name for a date (yesterday, today, tomorrow, or otherwise weekday name )

"},{"title":"module:ProgramDetails.init","link":"init"},{"title":"module:ProgramDetails.onAnimationComplete","link":"onAnimationComplete"},{"title":"module:ProgramDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:ProgramDetails.programUpdated","link":"programUpdated"},{"title":"module:ProgramDetails.setupLabels","link":"setupLabels","description":"

Set up Live and Repeat label sizes

"},{"title":"module:ProgramDetails.updateLabels","link":"updateLabels"},{"title":"module:PublicUserData","link":"PublicUserData"},{"title":"module:PublicUserData.init","link":"init"},{"title":"module:QueueManager","link":"QueueManager"},{"title":"module:QueueManager.clear","link":"clear","description":"

Clear all content from play queue

"},{"title":"module:QueueManager.clearHold","link":"clearHold","description":"

Clear all hold content

"},{"title":"module:QueueManager.deleteAtIndex","link":"deleteAtIndex","description":"

Delete item from play queue at passed index

"},{"title":"module:QueueManager.getCount","link":"getCount","description":"

Return the number of items in the play queue

"},{"title":"module:QueueManager.getCurrentItem","link":"getCurrentItem","description":"

Return the item currently in focus from the play queue

"},{"title":"module:QueueManager.getHold","link":"getHold","description":"

Return the items in the hold

"},{"title":"module:QueueManager.getIsShuffled","link":"getIsShuffled","description":"

Return whether or not shuffle is enabled

"},{"title":"module:QueueManager.getItemByIndex","link":"getItemByIndex","description":"

Return the item in the passed index from the play queue

"},{"title":"module:QueueManager.getItemType","link":"getItemType"},{"title":"module:QueueManager.getPosition","link":"getPosition","description":"

Returns current playback position within the queue

"},{"title":"module:QueueManager.getQueue","link":"getQueue","description":"

Return the current play queue

"},{"title":"module:QueueManager.getQueueTypes","link":"getQueueTypes","description":"

Return the types of items in current play queue

"},{"title":"module:QueueManager.getQueueUniqueTypes","link":"getQueueUniqueTypes","description":"

Return the unique types of items in current play queue

"},{"title":"module:QueueManager.getUnshuffledQueue","link":"getUnshuffledQueue","description":"

Return original, unshuffled queue

"},{"title":"module:QueueManager.hold","link":"hold","description":"

Hold an item

"},{"title":"module:QueueManager.init","link":"init"},{"title":"module:QueueManager.isPrerollActive","link":"isPrerollActive","description":"

Return isPrerollActive status

"},{"title":"module:QueueManager.moveBack","link":"moveBack","description":"

Move queue position back one

"},{"title":"module:QueueManager.moveForward","link":"moveForward","description":"

Move queue position ahead one

"},{"title":"module:QueueManager.peek","link":"peek","description":"

Return item at end of play queue without removing

"},{"title":"module:QueueManager.playQueue","link":"playQueue","description":"

Play items in queue

"},{"title":"module:QueueManager.pop","link":"pop","description":"

Remove item at end of play queue

"},{"title":"module:QueueManager.push","link":"push","description":"

Push new items to the play queue

"},{"title":"module:QueueManager.resetQueueItemOrder","link":"resetQueueItemOrder","description":"

Reset queue items back to original, unshuffled order

"},{"title":"module:QueueManager.resetShuffle","link":"resetShuffle","description":"

Reset shuffle to off state

"},{"title":"module:QueueManager.set","link":"set","description":"

Replace play queue with passed array

"},{"title":"module:QueueManager.setPosition","link":"setPosition","description":"

Set the queue position

"},{"title":"module:QueueManager.setPrerollStatus","link":"setPrerollStatus","description":"

Set prerollActive status

"},{"title":"module:QueueManager.setTopStartingPoint","link":"setTopStartingPoint","description":"

Set starting point for top item in the queue

"},{"title":"module:QueueManager.shuffleQueueItems","link":"shuffleQueueItems","description":"

Save a copy of the original queue and randomize order of queue items

"},{"title":"module:QueueManager.toggleShuffle","link":"toggleShuffle","description":"

Toggle shuffleEnabled state

"},{"title":"module:QueueManager.top","link":"top","description":"

Return the fitst item in the play queue

"},{"title":"module:QuickConnect","link":"QuickConnect"},{"title":"module:QuickConnect.init","link":"init"},{"title":"module:QuickConnect.monitorQuickConnect","link":"monitorQuickConnect"},{"title":"module:QuickConnectDialog","link":"QuickConnectDialog"},{"title":"module:QuickConnectDialog.OnAuthenticated","link":"OnAuthenticated"},{"title":"module:QuickConnectDialog.init","link":"init"},{"title":"module:QuickConnectDialog.onButtonSelected","link":"onButtonSelected"},{"title":"module:QuickConnectDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:QuickConnectDialog.quickConnectClosed","link":"quickConnectClosed"},{"title":"module:QuickConnectDialog.quickConnectStatus","link":"quickConnectStatus"},{"title":"module:RadioDialog","link":"RadioDialog"},{"title":"module:RadioDialog.init","link":"init"},{"title":"module:RadioDialog.moveScrollBar","link":"moveScrollBar","description":"

Move the popup's scroll bar

"},{"title":"module:RadioDialog.onButtonSelected","link":"onButtonSelected","description":"

Event handler for when user selected a button

"},{"title":"module:RadioDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:RadioDialog.onItemFocused","link":"onItemFocused","description":"

Event handler for when user's cursor highlights an option in the option list

"},{"title":"module:RadioDialog.onItemSelected","link":"onItemSelected","description":"

Once user selected an item, move cursor down to OK button

"},{"title":"module:RadioDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:RadioDialog.onScrollBarFocus","link":"onScrollBarFocus","description":"

If somehow the scrollbar gains focus, set focus back to the option list

"},{"title":"module:RecordProgramTask","link":"RecordProgramTask"},{"title":"module:RecordProgramTask.RecordOrCancelProgram","link":"RecordOrCancelProgram"},{"title":"module:RecordProgramTask.init","link":"init"},{"title":"module:SceneManager","link":"SceneManager"},{"title":"module:SceneManager.clearPreviousScene","link":"clearPreviousScene","description":"

Clear previous scene from group stack

"},{"title":"module:SceneManager.clearScenes","link":"clearScenes","description":"

Clear all content from group stack

"},{"title":"module:SceneManager.deleteSceneAtIndex","link":"deleteSceneAtIndex","description":"

Delete scene from group stack at passed index

"},{"title":"module:SceneManager.dismissDialog","link":"dismissDialog","description":"

Close currently displayed dialog

"},{"title":"module:SceneManager.getActiveScene","link":"getActiveScene","description":"

Return group at top of stack without removing

"},{"title":"module:SceneManager.init","link":"init"},{"title":"module:SceneManager.isDialogOpen","link":"isDialogOpen","description":"

Returns bool indicating if dialog is currently displayed

"},{"title":"module:SceneManager.optionClosed","link":"optionClosed","description":"

Return button the user selected

"},{"title":"module:SceneManager.optionDialog","link":"optionDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.optionSelected","link":"optionSelected","description":"

Return button the user selected

"},{"title":"module:SceneManager.popScene","link":"popScene","description":"

Remove the current group and load the last group from the stack

"},{"title":"module:SceneManager.pushScene","link":"pushScene","description":"

Push a new group onto the stack, replacing the existing group on the screen

"},{"title":"module:SceneManager.radioDialog","link":"radioDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.registerOverhangData","link":"registerOverhangData","description":"

Register observers for overhang data

"},{"title":"module:SceneManager.resetTime","link":"resetTime","description":"

Reset time

"},{"title":"module:SceneManager.settings","link":"settings","description":"

Display user/device settings screen

"},{"title":"module:SceneManager.standardDialog","link":"standardDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.unregisterOverhangData","link":"unregisterOverhangData","description":"

Remove observers for overhang data

"},{"title":"module:SceneManager.updateOptions","link":"updateOptions","description":"

Update options availability

"},{"title":"module:SceneManager.updateOverhangTitle","link":"updateOverhangTitle","description":"

Update overhang title

"},{"title":"module:SceneManager.updateOverhangVisible","link":"updateOverhangVisible","description":"

Update whether the overhang is visible or not

"},{"title":"module:SceneManager.updateUser","link":"updateUser","description":"

Update username in overhang

"},{"title":"module:SceneManager.userMessage","link":"userMessage","description":"

Display dialog to user with an OK button

"},{"title":"module:ScheduleProgramData","link":"ScheduleProgramData"},{"title":"module:ScheduleProgramData.setFields","link":"setFields"},{"title":"module:ScheduleProgramData.setPoster","link":"setPoster"},{"title":"module:SearchBox","link":"SearchBox"},{"title":"module:SearchBox.init","link":"init"},{"title":"module:SearchBox.searchMedias","link":"searchMedias"},{"title":"module:SearchData","link":"SearchData"},{"title":"module:SearchData.setFields","link":"setFields"},{"title":"module:SearchData.setPoster","link":"setPoster"},{"title":"module:SearchResults","link":"SearchResults"},{"title":"module:SearchResults.init","link":"init"},{"title":"module:SearchResults.loadResults","link":"loadResults"},{"title":"module:SearchResults.onKeyEvent","link":"onKeyEvent"},{"title":"module:SearchResults.searchMedias","link":"searchMedias"},{"title":"module:SearchRow","link":"SearchRow"},{"title":"module:SearchRow.addRow","link":"addRow"},{"title":"module:SearchRow.getData","link":"getData"},{"title":"module:SearchRow.init","link":"init"},{"title":"module:SearchRow.updateSize","link":"updateSize"},{"title":"module:SearchTask","link":"SearchTask"},{"title":"module:SearchTask.init","link":"init"},{"title":"module:SearchTask.search","link":"search"},{"title":"module:SeriesData","link":"SeriesData"},{"title":"module:SeriesData.setFields","link":"setFields"},{"title":"module:SeriesData.setPoster","link":"setPoster"},{"title":"module:ServerDiscoveryTask","link":"ServerDiscoveryTask"},{"title":"module:ServerDiscoveryTask.AddServer","link":"AddServer"},{"title":"module:ServerDiscoveryTask.ProcessClientDiscoveryResponse","link":"ProcessClientDiscoveryResponse"},{"title":"module:ServerDiscoveryTask.ProcessSSDPResponse","link":"ProcessSSDPResponse"},{"title":"module:ServerDiscoveryTask.SendClientDiscoveryBroadcast","link":"SendClientDiscoveryBroadcast"},{"title":"module:ServerDiscoveryTask.SendSSDPBroadcast","link":"SendSSDPBroadcast"},{"title":"module:ServerDiscoveryTask.execute","link":"execute"},{"title":"module:ServerDiscoveryTask.init","link":"init","description":"

Task used to discover jellyfin servers on the local network

"},{"title":"module:SetServerScreen","link":"SetServerScreen"},{"title":"module:SetServerScreen.ScanForServers","link":"ScanForServers"},{"title":"module:SetServerScreen.ScanForServersComplete","link":"ScanForServersComplete"},{"title":"module:SetServerScreen.ShowKeyboard","link":"ShowKeyboard"},{"title":"module:SetServerScreen.clearErrorMessage","link":"clearErrorMessage"},{"title":"module:SetServerScreen.init","link":"init"},{"title":"module:SetServerScreen.onDialogButton","link":"onDialogButton"},{"title":"module:SetServerScreen.onKeyEvent","link":"onKeyEvent"},{"title":"module:ShowScenes","link":"ShowScenes"},{"title":"module:ShowScenes.CreateAlbumView","link":"CreateAlbumView","description":"

Shows details on selected album. Description text, image, and list of available songs

"},{"title":"module:ShowScenes.CreateArtistView","link":"CreateArtistView","description":"

Shows details on selected artist. Bio, image, and list of available albums

"},{"title":"module:ShowScenes.CreateHomeGroup","link":"CreateHomeGroup"},{"title":"module:ShowScenes.CreateItemGrid","link":"CreateItemGrid"},{"title":"module:ShowScenes.CreateMovieDetailsGroup","link":"CreateMovieDetailsGroup"},{"title":"module:ShowScenes.CreateMovieLibraryView","link":"CreateMovieLibraryView"},{"title":"module:ShowScenes.CreateMusicLibraryView","link":"CreateMusicLibraryView"},{"title":"module:ShowScenes.CreatePersonView","link":"CreatePersonView"},{"title":"module:ShowScenes.CreatePlaylistView","link":"CreatePlaylistView","description":"

Shows details on selected playlist. Description text, image, and list of available items

"},{"title":"module:ShowScenes.CreateSearchPage","link":"CreateSearchPage"},{"title":"module:ShowScenes.CreateSeasonDetailsGroup","link":"CreateSeasonDetailsGroup"},{"title":"module:ShowScenes.CreateSeasonDetailsGroupByID","link":"CreateSeasonDetailsGroupByID"},{"title":"module:ShowScenes.CreateSeriesDetailsGroup","link":"CreateSeriesDetailsGroup"},{"title":"module:ShowScenes.CreateServerGroup","link":"CreateServerGroup"},{"title":"module:ShowScenes.CreateSigninGroup","link":"CreateSigninGroup"},{"title":"module:ShowScenes.CreateUserSelectGroup","link":"CreateUserSelectGroup"},{"title":"module:ShowScenes.CreateVideoPlayerGroup","link":"CreateVideoPlayerGroup"},{"title":"module:ShowScenes.DeleteFromServerList","link":"DeleteFromServerList"},{"title":"module:ShowScenes.LoginFlow","link":"LoginFlow"},{"title":"module:ShowScenes.SaveServerList","link":"SaveServerList"},{"title":"module:ShowScenes.SendPerformanceBeacon","link":"SendPerformanceBeacon","description":"

Roku Performance monitoring

"},{"title":"module:ShowScenes.playbackOptionDialog","link":"playbackOptionDialog","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:SlideOutButton","link":"SlideOutButton"},{"title":"module:SlideOutButton.init","link":"init"},{"title":"module:SlideOutButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:SlideOutButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:SlideOutButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:SlideOutButton.onHighlightChanged","link":"onHighlightChanged"},{"title":"module:SlideOutButton.onIconChanged","link":"onIconChanged"},{"title":"module:SlideOutButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:SlideOutButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:SlideOutButton.onTextChanged","link":"onTextChanged"},{"title":"module:SlideOutButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:SlideOutButton.setIconSize","link":"setIconSize"},{"title":"module:SongItem","link":"SongItem"},{"title":"module:SongItem.focusChanged","link":"focusChanged"},{"title":"module:SongItem.init","link":"init"},{"title":"module:SongItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:Spinner","link":"Spinner"},{"title":"module:Spinner.init","link":"init"},{"title":"module:StandardDialog","link":"StandardDialog"},{"title":"module:StandardDialog.init","link":"init"},{"title":"module:StandardDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:Subtitles","link":"Subtitles"},{"title":"module:Subtitles.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:Subtitles.changeSubtitleDuringPlayback","link":"changeSubtitleDuringPlayback"},{"title":"module:Subtitles.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

Identify the default subtitle track\nif "requires_text" is true, only return a track if it is textual\nThis allows forcing text subs, since roku requires transcoding of non-text subs\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.defaultSubtitleTrackFromVid","link":"defaultSubtitleTrackFromVid","description":"

Identify the default subtitle track for a given video id\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:Subtitles.getSubtitleSelIdxFromSubIdx","link":"getSubtitleSelIdxFromSubIdx","description":"

The subtitle index on the server differs from the index we track locally\nThis function converts the former into the latter

"},{"title":"module:Subtitles.selectSubtitleTrack","link":"selectSubtitleTrack"},{"title":"module:Subtitles.selectSubtitleTrackDialog","link":"selectSubtitleTrackDialog","description":"

Present Dialog to user to select subtitle track

"},{"title":"module:Subtitles.setupSubtitle","link":"setupSubtitle","description":"

Given a set of subtitles, and a subtitle index (the index on the server, not in the list provided)\nthis will set all relevant settings for roku (mainly closed captions) and return the index of the\nsubtitle track specified, but indexed based on the provided list of subtitles

"},{"title":"module:Subtitles.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:Subtitles.turnoffSubtitles","link":"turnoffSubtitles"},{"title":"module:TVEpisode","link":"TVEpisode"},{"title":"module:TVEpisode.setFields","link":"setFields"},{"title":"module:TVEpisode.setPoster","link":"setPoster"},{"title":"module:TVEpisodeData","link":"TVEpisodeData"},{"title":"module:TVEpisodeData.setFields","link":"setFields"},{"title":"module:TVEpisodeData.setPoster","link":"setPoster"},{"title":"module:TVEpisodeRow","link":"TVEpisodeRow"},{"title":"module:TVEpisodeRow.init","link":"init"},{"title":"module:TVEpisodeRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRow.setData","link":"setData"},{"title":"module:TVEpisodeRow.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRow.updateSize","link":"updateSize"},{"title":"module:TVEpisodeRowWithOptions","link":"TVEpisodeRowWithOptions"},{"title":"module:TVEpisodeRowWithOptions.SetUpAudioOptions","link":"SetUpAudioOptions","description":"

List of audio tracks to choose from

"},{"title":"module:TVEpisodeRowWithOptions.SetUpVideoOptions","link":"SetUpVideoOptions","description":"

List of video versions to choose from

"},{"title":"module:TVEpisodeRowWithOptions.audioOptionsClosed","link":"audioOptionsClosed"},{"title":"module:TVEpisodeRowWithOptions.init","link":"init"},{"title":"module:TVEpisodeRowWithOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRowWithOptions.rowsDoneLoading","link":"rowsDoneLoading"},{"title":"module:TVEpisodeRowWithOptions.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRowWithOptions.videoOptionsClosed","link":"videoOptionsClosed"},{"title":"module:TVEpisodes","link":"TVEpisodes"},{"title":"module:TVEpisodes.getFocusedItem","link":"getFocusedItem","description":"

get the currently focused item

"},{"title":"module:TVEpisodes.init","link":"init"},{"title":"module:TVEpisodes.onKeyEvent","link":"onKeyEvent","description":"

Handle navigation input from the remote and act on it

"},{"title":"module:TVEpisodes.setExtraButtonVisibility","link":"setExtraButtonVisibility","description":"

Updates the visibility of the Extras button based on if this season has any extra features

"},{"title":"module:TVEpisodes.setSeasonLoading","link":"setSeasonLoading"},{"title":"module:TVEpisodes.updateSeason","link":"updateSeason"},{"title":"module:TVListDetails","link":"TVListDetails"},{"title":"module:TVListDetails.DisplayAudioAvailable","link":"DisplayAudioAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one audio track to choose from

"},{"title":"module:TVListDetails.DisplayVideoAvailable","link":"DisplayVideoAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one video version to choose from

"},{"title":"module:TVListDetails.SetupAudioDisplay","link":"SetupAudioDisplay","description":"

Display current audio_codec and check if there is more than one audio track to choose from...

"},{"title":"module:TVListDetails.focusChanged","link":"focusChanged"},{"title":"module:TVListDetails.getEndTime","link":"getEndTime"},{"title":"module:TVListDetails.getRuntime","link":"getRuntime"},{"title":"module:TVListDetails.init","link":"init"},{"title":"module:TVListDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVListOptions","link":"TVListOptions"},{"title":"module:TVListOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:TVListOptions.init","link":"init"},{"title":"module:TVListOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVListOptions.optionsSet","link":"optionsSet"},{"title":"module:TVSeasonData","link":"TVSeasonData"},{"title":"module:TVSeasonData.setFields","link":"setFields"},{"title":"module:TVSeasonData.setPoster","link":"setPoster"},{"title":"module:TVSeasonRow","link":"TVSeasonRow"},{"title":"module:TVSeasonRow.getData","link":"getData"},{"title":"module:TVSeasonRow.init","link":"init"},{"title":"module:TVSeasonRow.updateSize","link":"updateSize"},{"title":"module:TVShowDescription","link":"TVShowDescription"},{"title":"module:TVShowDescription.getEndTime","link":"getEndTime"},{"title":"module:TVShowDescription.getHistory","link":"getHistory"},{"title":"module:TVShowDescription.getRuntime","link":"getRuntime"},{"title":"module:TVShowDescription.init","link":"init"},{"title":"module:TVShowDescription.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDescription.round","link":"round"},{"title":"module:TVShowDescription.setFieldText","link":"setFieldText"},{"title":"module:TVShowDetails","link":"TVShowDetails"},{"title":"module:TVShowDetails.getEndTime","link":"getEndTime"},{"title":"module:TVShowDetails.getHistory","link":"getHistory"},{"title":"module:TVShowDetails.getRuntime","link":"getRuntime"},{"title":"module:TVShowDetails.init","link":"init"},{"title":"module:TVShowDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVShowDetails.onShuffleEpisodeDataLoaded","link":"onShuffleEpisodeDataLoaded"},{"title":"module:TVShowDetails.round","link":"round"},{"title":"module:TVShowDetails.setFieldText","link":"setFieldText"},{"title":"module:TextSizeTask","link":"TextSizeTask"},{"title":"module:TextSizeTask.getTextSize","link":"getTextSize"},{"title":"module:TextSizeTask.init","link":"init"},{"title":"module:UserData","link":"UserData"},{"title":"module:UserData.getPreference","link":"getPreference"},{"title":"module:UserData.loadFromJSON","link":"loadFromJSON"},{"title":"module:UserData.loadFromRegistry","link":"loadFromRegistry"},{"title":"module:UserData.removeFromRegistry","link":"removeFromRegistry"},{"title":"module:UserData.saveToRegistry","link":"saveToRegistry"},{"title":"module:UserData.setDataFromJSON","link":"setDataFromJSON"},{"title":"module:UserData.setPreference","link":"setPreference"},{"title":"module:UserData.setServer","link":"setServer"},{"title":"module:UserItem","link":"UserItem"},{"title":"module:UserItem.init","link":"init"},{"title":"module:UserItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserLibrary","link":"UserLibrary"},{"title":"module:UserLibrary.MarkItemFavorite","link":"MarkItemFavorite"},{"title":"module:UserLibrary.MarkItemWatched","link":"MarkItemWatched"},{"title":"module:UserLibrary.UnmarkItemFavorite","link":"UnmarkItemFavorite"},{"title":"module:UserLibrary.UnmarkItemWatched","link":"UnmarkItemWatched"},{"title":"module:UserRow","link":"UserRow"},{"title":"module:UserRow.init","link":"init"},{"title":"module:UserRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserRow.setData","link":"setData"},{"title":"module:UserRow.setUser","link":"setUser"},{"title":"module:UserRow.updateSize","link":"updateSize"},{"title":"module:UserSelect","link":"UserSelect"},{"title":"module:UserSelect.init","link":"init"},{"title":"module:UserSelect.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserSelect.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserSelect.redraw","link":"redraw"},{"title":"module:VideoData","link":"VideoData"},{"title":"module:VideoData.setFields","link":"setFields"},{"title":"module:VideoData.setPoster","link":"setPoster"},{"title":"module:VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.AddVideoContent","link":"AddVideoContent"},{"title":"module:VideoPlayer.GetPlaybackInfo","link":"GetPlaybackInfo","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:VideoPlayer.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:VideoPlayer.PlayIntroVideo","link":"PlayIntroVideo"},{"title":"module:VideoPlayer.VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.autoPlayNextEpisode","link":"autoPlayNextEpisode"},{"title":"module:VideoPlayer.directPlaySupported","link":"directPlaySupported"},{"title":"module:VideoPlayer.getAudioFormat","link":"getAudioFormat"},{"title":"module:VideoPlayer.getAudioInfo","link":"getAudioInfo"},{"title":"module:VideoPlayer.getContainerType","link":"getContainerType"},{"title":"module:VideoPlayer.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:VideoPlayer.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:VideoPlayer.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:VideoPlayer.startPlayBackOver","link":"startPlayBackOver","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:VideoPlayerView","link":"VideoPlayerView"},{"title":"module:VideoPlayerView.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:VideoPlayerView.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:VideoPlayerView.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:VideoPlayerView.getCurrentChapterIndex","link":"getCurrentChapterIndex","description":"

getCurrentChapterIndex: Finds current chapter index

"},{"title":"module:VideoPlayerView.handleChapterListAction","link":"handleChapterListAction","description":"

handleChapterListAction: Handles action to show chapter list

"},{"title":"module:VideoPlayerView.handleChapterSkipAction","link":"handleChapterSkipAction","description":"

handleChapterSkipAction: Handles user command to skip chapters in playing video

"},{"title":"module:VideoPlayerView.handleHideAction","link":"handleHideAction","description":"

handleHideAction: Handles action to hide OSD menu

"},{"title":"module:VideoPlayerView.handleShowSubtitleMenuAction","link":"handleShowSubtitleMenuAction","description":"

handleShowSubtitleMenuAction: Handles action to show subtitle selection menu

"},{"title":"module:VideoPlayerView.handleShowVideoInfoPopupAction","link":"handleShowVideoInfoPopupAction","description":"

handleShowVideoInfoPopupAction: Handles action to show video info popup

"},{"title":"module:VideoPlayerView.handleVideoPlayPauseAction","link":"handleVideoPlayPauseAction","description":"

handleVideoPlayPauseAction: Handles action to either play or pause the video content

"},{"title":"module:VideoPlayerView.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:VideoPlayerView.init","link":"init"},{"title":"module:VideoPlayerView.loadCaption","link":"loadCaption","description":"

Set caption url to server subtitle track

"},{"title":"module:VideoPlayerView.onAllowCaptionsChange","link":"onAllowCaptionsChange","description":"

Only setup caption items if captions are allowed

"},{"title":"module:VideoPlayerView.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:VideoPlayerView.onKeyEvent","link":"onKeyEvent"},{"title":"module:VideoPlayerView.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:VideoPlayerView.onOSDAction","link":"onOSDAction","description":"

onOSDAction: Process action events from OSD to their respective handlers

"},{"title":"module:VideoPlayerView.onPlaybackErrorButtonSelected","link":"onPlaybackErrorButtonSelected"},{"title":"module:VideoPlayerView.onPlaybackErrorDialogClosed","link":"onPlaybackErrorDialogClosed"},{"title":"module:VideoPlayerView.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onSubtitleChange","link":"onSubtitleChange","description":"

Event handler for when selectedSubtitle changes

"},{"title":"module:VideoPlayerView.onVideoContentLoaded","link":"onVideoContentLoaded"},{"title":"module:VideoPlayerView.populateChapterMenu","link":"populateChapterMenu","description":"

populateChapterMenu: ' Parse chapter data from API and appeand to chapter list menu

"},{"title":"module:VideoPlayerView.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:VideoPlayerView.showPlaybackErrorDialog","link":"showPlaybackErrorDialog"},{"title":"module:VideoPlayerView.stateAllowsOSD","link":"stateAllowsOSD","description":"

stateAllowsOSD: Check if current video state allows showing the OSD

"},{"title":"module:VideoPlayerView.toggleCaption","link":"toggleCaption","description":"

Toggles visibility of custom subtitles and sets captionTask's player state

"},{"title":"module:VideoPlayerView.updateCaption","link":"updateCaption","description":"

Removes old subtitle lines and adds new subtitle lines

"},{"title":"module:VideoPlayerView.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:VideoTrackListItem","link":"VideoTrackListItem"},{"title":"module:VideoTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:VideoTrackListItem.init","link":"init"},{"title":"module:VideoTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ViewCreator","link":"ViewCreator"},{"title":"module:ViewCreator.CreateAudioPlayerView","link":"CreateAudioPlayerView","description":"

Play Audio

"},{"title":"module:ViewCreator.CreateVideoPlayerView","link":"CreateVideoPlayerView","description":"

Play Video

"},{"title":"module:ViewCreator.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:ViewCreator.onPlaybackInfoLoaded","link":"onPlaybackInfoLoaded","description":"

The playback info task has returned data

"},{"title":"module:ViewCreator.onSelectPlaybackInfoPressed","link":"onSelectPlaybackInfoPressed","description":"

User requested playback info

"},{"title":"module:ViewCreator.onSelectSubtitlePressed","link":"onSelectSubtitlePressed","description":"

User requested subtitle selection popup

"},{"title":"module:ViewCreator.onSelectionMade","link":"onSelectionMade","description":"

User has selected something from the radioDialog popup

"},{"title":"module:ViewCreator.onStateChange","link":"onStateChange","description":"

Playback state change event handlers

"},{"title":"module:ViewCreator.processSubtitleSelection","link":"processSubtitleSelection"},{"title":"module:WhatsNewDialog","link":"WhatsNewDialog"},{"title":"module:WhatsNewDialog.init","link":"init"},{"title":"module:WhatsNewDialog.setPalette","link":"setPalette"},{"title":"module:baserequest","link":"baserequest"},{"title":"module:baserequest.APIRequest","link":"APIRequest"},{"title":"module:baserequest.authRequest","link":"authRequest","description":"

Takes and returns a roUrlTransfer object after adding a Jellyfin "Authorization" header

"},{"title":"module:baserequest.buildAuthHeader","link":"buildAuthHeader","description":"

Returns a string containing the "Authorization" header payload

"},{"title":"module:baserequest.buildParams","link":"buildParams","description":"

Functions for making requests to the API

"},{"title":"module:baserequest.buildURL","link":"buildURL"},{"title":"module:baserequest.deleteVoid","link":"deleteVoid"},{"title":"module:baserequest.getJson","link":"getJson"},{"title":"module:baserequest.getString","link":"getString"},{"title":"module:baserequest.getVoid","link":"getVoid"},{"title":"module:baserequest.get_url","link":"get_url"},{"title":"module:baserequest.headVoid","link":"headVoid"},{"title":"module:baserequest.postJson","link":"postJson"},{"title":"module:baserequest.postString","link":"postString"},{"title":"module:baserequest.postVoid","link":"postVoid"},{"title":"module:baserequest.setCertificateAuthority","link":"setCertificateAuthority","description":"

sets the certificate authority by file path on the passed node

"},{"title":"module:captionTask","link":"captionTask"},{"title":"module:captionTask.fetchCaption","link":"fetchCaption"},{"title":"module:captionTask.init","link":"init"},{"title":"module:captionTask.isTime","link":"isTime"},{"title":"module:captionTask.newLayoutGroup","link":"newLayoutGroup"},{"title":"module:captionTask.newRect","link":"newRect"},{"title":"module:captionTask.newlabel","link":"newlabel"},{"title":"module:captionTask.parseVTT","link":"parseVTT"},{"title":"module:captionTask.setFont","link":"setFont"},{"title":"module:captionTask.toMs","link":"toMs"},{"title":"module:captionTask.updateCaption","link":"updateCaption"},{"title":"module:conditional","link":"conditional"},{"title":"module:conditional.printRegistry","link":"printRegistry","description":"

Print out all of the registry contents to the debug log

"},{"title":"module:config","link":"config"},{"title":"module:config.GetConfigTree","link":"GetConfigTree","description":"

Read config tree from json config file and return

"},{"title":"module:config.RegistryReadAll","link":"RegistryReadAll","description":"

Return all data found inside a registry section

"},{"title":"module:config.findConfigTreeKey","link":"findConfigTreeKey","description":"

Recursivly search the config tree for entry with settingname equal to key

"},{"title":"module:config.getRegistrySections","link":"getRegistrySections","description":"

Return an array of all the registry section keys

"},{"title":"module:config.getSavedUsers","link":"getSavedUsers","description":"

Returns an array of saved users from the registry\nthat belong to the active server

"},{"title":"module:config.get_setting","link":"get_setting","description":"

"Jellyfin" registry accessors for the default global settings

"},{"title":"module:config.get_user_setting","link":"get_user_setting","description":"

User registry accessors for the currently active user

"},{"title":"module:config.registry_delete","link":"registry_delete"},{"title":"module:config.registry_read","link":"registry_read","description":"

Generic registry accessors

"},{"title":"module:config.registry_write","link":"registry_write"},{"title":"module:config.set_setting","link":"set_setting"},{"title":"module:config.set_user_setting","link":"set_user_setting"},{"title":"module:config.unset_setting","link":"unset_setting"},{"title":"module:config.unset_user_setting","link":"unset_user_setting"},{"title":"module:deviceCapabilities","link":"deviceCapabilities"},{"title":"module:deviceCapabilities.GetBitRateLimit","link":"GetBitRateLimit"},{"title":"module:deviceCapabilities.GetDirectPlayProfiles","link":"GetDirectPlayProfiles"},{"title":"module:deviceCapabilities.getCodecProfiles","link":"getCodecProfiles"},{"title":"module:deviceCapabilities.getContainerProfiles","link":"getContainerProfiles"},{"title":"module:deviceCapabilities.getDeviceCapabilities","link":"getDeviceCapabilities","description":"

Returns the Device Capabilities for Roku.\nAlso prints out the device profile for debugging

"},{"title":"module:deviceCapabilities.getDeviceProfile","link":"getDeviceProfile"},{"title":"module:deviceCapabilities.getMaxHeightArray","link":"getMaxHeightArray"},{"title":"module:deviceCapabilities.getMaxWidthArray","link":"getMaxWidthArray"},{"title":"module:deviceCapabilities.getSubtitleProfiles","link":"getSubtitleProfiles"},{"title":"module:deviceCapabilities.getTranscodingProfiles","link":"getTranscodingProfiles"},{"title":"module:deviceCapabilities.printDeviceProfile","link":"printDeviceProfile","description":"

Print out the deviceProfile for debugging

"},{"title":"module:deviceCapabilities.removeDecimals","link":"removeDecimals","description":"

Remove all decimals from a string

"},{"title":"module:deviceCapabilities.setPreferredCodec","link":"setPreferredCodec","description":"

Takes and returns a comma delimited string of codecs.\nMoves the preferred codec to the front of the string

"},{"title":"module:deviceCapabilities.updateProfileArray","link":"updateProfileArray","description":"

Recieves and returns an assArray of supported profiles and levels for each video codec

"},{"title":"module:globals","link":"globals"},{"title":"module:globals.SaveAppToGlobal","link":"SaveAppToGlobal","description":"

Save information from roAppInfo to m.global.app

"},{"title":"module:globals.SaveDeviceToGlobal","link":"SaveDeviceToGlobal","description":"

Save information from roDeviceInfo to m.global.device

"},{"title":"module:globals.setConstants","link":"setConstants","description":"

Set global constants

"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.runGlobalMigrations","link":"runGlobalMigrations","description":"

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

"},{"title":"module:migrations.runRegistryUserMigrations","link":"runRegistryUserMigrations"},{"title":"module:misc","link":"misc"},{"title":"module:misc.AssocArrayEqual","link":"AssocArrayEqual"},{"title":"module:misc.arrayHasValue","link":"arrayHasValue","description":"

Check if a specific value is inside of an array

"},{"title":"module:misc.div_ceiling","link":"div_ceiling"},{"title":"module:misc.findNodeBySubtype","link":"findNodeBySubtype"},{"title":"module:misc.formatTime","link":"formatTime","description":"

Format time as 12 or 24 hour format based on system clock setting

"},{"title":"module:misc.getButton","link":"getButton"},{"title":"module:misc.getMinutes","link":"getMinutes","description":"

Converts ticks to minutes

"},{"title":"module:misc.getMsgPicker","link":"getMsgPicker"},{"title":"module:misc.get_dialog_result","link":"get_dialog_result","description":"

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

"},{"title":"module:misc.inArray","link":"inArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:misc.inferServerUrl","link":"inferServerUrl","description":"

take an incomplete url string and use it to make educated guesses about\nthe complete url. then tests these guesses to see if it can find a jf server\nreturns the url of the server it found, or an empty string

"},{"title":"module:misc.isJellyfinServer","link":"isJellyfinServer","description":"

accepts the raw json string of /system/info/public and returns\na boolean indicating if ProductName is "Jellyfin Server"

"},{"title":"module:misc.isLocalhost","link":"isLocalhost","description":"

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

"},{"title":"module:misc.isNodeEvent","link":"isNodeEvent"},{"title":"module:misc.isValid","link":"isValid","description":"

Returns whether or not passed value is valid

"},{"title":"module:misc.isValidAndNotEmpty","link":"isValidAndNotEmpty","description":"

Returns whether or not passed value is valid and not empty\nAccepts a string, or any countable type (arrays and lists)

"},{"title":"module:misc.lastFocusedChild","link":"lastFocusedChild"},{"title":"module:misc.leftPad","link":"leftPad"},{"title":"module:misc.message_dialog","link":"message_dialog"},{"title":"module:misc.option_dialog","link":"option_dialog"},{"title":"module:misc.parseUrl","link":"parseUrl","description":"

Returns an array from a url = [ url, proto, host, port, subdir+params ]\nIf port or subdir are not found, an empty string will be added to the array\nProto must be declared or array will be empty

"},{"title":"module:misc.roundNumber","link":"roundNumber","description":"

Rounds number to nearest integer

"},{"title":"module:misc.secondsToHuman","link":"secondsToHuman"},{"title":"module:misc.setFieldTextValue","link":"setFieldTextValue"},{"title":"module:misc.show_dialog","link":"show_dialog"},{"title":"module:misc.shuffleArray","link":"shuffleArray","description":"

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

"},{"title":"module:misc.startLoadingSpinner","link":"startLoadingSpinner","description":"

startLoadingSpinner: Start a loading spinner and attach it to the main JFScene.\nDisplays an invisible ProgressDialog node by default to disable keypresses while loading.

"},{"title":"module:misc.stopLoadingSpinner","link":"stopLoadingSpinner"},{"title":"module:misc.ticksToHuman","link":"ticksToHuman"},{"title":"module:misc.toString","link":"toString"},{"title":"module:misc.urlCandidates","link":"urlCandidates","description":"

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates\nfor the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated\nfull urls.

"},{"title":"module:misc.versionChecker","link":"versionChecker","description":"

Returns whether or not a version number (e.g. 10.7.7) is greater or equal\nto some minimum version allowed (e.g. 10.8.0)

"},{"title":"module:quickplay","link":"quickplay"},{"title":"module:quickplay.album","link":"album","description":"

A music album.\nPlay the entire album starting with track 1.

"},{"title":"module:quickplay.artist","link":"artist","description":"

A music artist.\nShuffle play all songs by artist.

"},{"title":"module:quickplay.audio","link":"audio","description":"

A single audio file.

"},{"title":"module:quickplay.boxset","link":"boxset","description":"

A boxset.\nPlay all items inside.

"},{"title":"module:quickplay.collectionFolder","link":"collectionFolder","description":"

Quick Play A CollectionFolder.\nShuffle play the items inside\nwith some differences based on collectionType.

"},{"title":"module:quickplay.folder","link":"folder","description":"

Quick Play A folder.\nShuffle play all items found

"},{"title":"module:quickplay.multipleSeries","link":"multipleSeries","description":"

More than one TV Show Series.\nShuffle play all watched episodes

"},{"title":"module:quickplay.musicVideo","link":"musicVideo","description":"

A single music video file.

"},{"title":"module:quickplay.person","link":"person","description":"

Quick Play A Person.\nShuffle play all videos found

"},{"title":"module:quickplay.photo","link":"photo","description":"

A single photo.

"},{"title":"module:quickplay.photoAlbum","link":"photoAlbum","description":"

A photo album.

"},{"title":"module:quickplay.playlist","link":"playlist","description":"

Quick Play A Playlist.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.program","link":"program","description":"

Quick Play A Live Program

"},{"title":"module:quickplay.pushToQueue","link":"pushToQueue","description":"

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

"},{"title":"module:quickplay.season","link":"season","description":"

A TV Show Season.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.series","link":"series","description":"

A TV Show Series.\nPlay the first unwatched episode.\nIf none, shuffle play the whole series.

"},{"title":"module:quickplay.tvChannel","link":"tvChannel","description":"

Quick Play A TVChannel

"},{"title":"module:quickplay.userView","link":"userView","description":"

Quick Play A UserView.\nPlay logic depends on "collectionType".

"},{"title":"module:quickplay.video","link":"video","description":"

A single video file.

"},{"title":"module:quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"},{"title":"module:schedule","link":"schedule"},{"title":"module:schedule.channelFilterSet","link":"channelFilterSet"},{"title":"module:schedule.channelsearchTermSet","link":"channelsearchTermSet","description":"

Voice Search set

"},{"title":"module:schedule.focusProgramDetails","link":"focusProgramDetails","description":"

Move the TV Guide Grid down or up depending whether details are selected

"},{"title":"module:schedule.init","link":"init"},{"title":"module:schedule.onChannelsLoaded","link":"onChannelsLoaded","description":"

Initial list of channels loaded

"},{"title":"module:schedule.onGridScrolled","link":"onGridScrolled","description":"

As user scrolls grid, check if more data requries to be loaded

"},{"title":"module:schedule.onKeyEvent","link":"onKeyEvent"},{"title":"module:schedule.onProgramDetailsLoaded","link":"onProgramDetailsLoaded","description":"

Update the Program Details with full information

"},{"title":"module:schedule.onProgramFocused","link":"onProgramFocused"},{"title":"module:schedule.onProgramSelected","link":"onProgramSelected"},{"title":"module:schedule.onRecordChannelSelected","link":"onRecordChannelSelected","description":"

Handle user selecting "Record Channel" from Program Details

"},{"title":"module:schedule.onRecordOperationDone","link":"onRecordOperationDone"},{"title":"module:schedule.onRecordSeriesChannelSelected","link":"onRecordSeriesChannelSelected","description":"

Handle user selecting "Record Series" from Program Details

"},{"title":"module:schedule.onScheduleLoaded","link":"onScheduleLoaded","description":"

When LoadScheduleTask completes (initial or more data) and we have a schedule to display

"},{"title":"module:schedule.onWatchChannelSelected","link":"onWatchChannelSelected","description":"

Handle user selecting "Watch Channel" from Program Details

"},{"title":"module:section","link":"section"},{"title":"module:section.init","link":"init"},{"title":"module:section.onFocusChange","link":"onFocusChange"},{"title":"module:section.onIDChange","link":"onIDChange"},{"title":"module:section.onTranslationChange","link":"onTranslationChange"},{"title":"module:section.scrollDownToOnDeck","link":"scrollDownToOnDeck"},{"title":"module:section.scrollOffBottom","link":"scrollOffBottom"},{"title":"module:section.scrollOffOnDeck","link":"scrollOffOnDeck"},{"title":"module:section.scrollOffTop","link":"scrollOffTop"},{"title":"module:section.scrollUpToOnDeck","link":"scrollUpToOnDeck"},{"title":"module:section.showFromBottom","link":"showFromBottom"},{"title":"module:section.showFromTop","link":"showFromTop"},{"title":"module:sectionScroller","link":"sectionScroller"},{"title":"module:sectionScroller.displayedIndexChanged","link":"displayedIndexChanged"},{"title":"module:sectionScroller.init","link":"init"},{"title":"module:sectionScroller.onFocusChange","link":"onFocusChange"},{"title":"module:settings","link":"settings"},{"title":"module:settings.LoadMenu","link":"LoadMenu"},{"title":"module:settings.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook that gets ran as needed.\nAssumes settings were changed and they affect the device profile.\nPosts a new device profile to the server using the task thread

"},{"title":"module:settings.boolSettingChanged","link":"boolSettingChanged"},{"title":"module:settings.init","link":"init"},{"title":"module:settings.isFormInFocus","link":"isFormInFocus","description":"

Returns true if any of the data entry forms are in focus

"},{"title":"module:settings.onKeyEvent","link":"onKeyEvent"},{"title":"module:settings.onKeyGridEscape","link":"onKeyGridEscape"},{"title":"module:settings.onKeyGridSubmit","link":"onKeyGridSubmit"},{"title":"module:settings.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:settings.radioSettingChanged","link":"radioSettingChanged"},{"title":"module:settings.settingFocused","link":"settingFocused"},{"title":"module:settings.settingSelected","link":"settingSelected"},{"title":"module:userauth","link":"userauth"},{"title":"module:userauth.AboutMe","link":"AboutMe"},{"title":"module:userauth.AuthenticateViaQuickConnect","link":"AuthenticateViaQuickConnect"},{"title":"module:userauth.AvailableUsers","link":"AvailableUsers"},{"title":"module:userauth.GetPublicUsers","link":"GetPublicUsers"},{"title":"module:userauth.LoadUserAbilities","link":"LoadUserAbilities"},{"title":"module:userauth.ServerInfo","link":"ServerInfo"},{"title":"module:userauth.SignOut","link":"SignOut"},{"title":"module:userauth.checkQuickConnect","link":"checkQuickConnect"},{"title":"module:userauth.get_token","link":"get_token"},{"title":"module:userauth.initQuickConnect","link":"initQuickConnect"}]} \ No newline at end of file +{"list":[{"title":"module:AlbumData","link":"AlbumData"},{"title":"module:AlbumData.setFields","link":"setFields"},{"title":"module:AlbumGrid","link":"AlbumGrid"},{"title":"module:AlbumGrid.getData","link":"getData"},{"title":"module:AlbumGrid.init","link":"init"},{"title":"module:AlbumGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumTrackList","link":"AlbumTrackList"},{"title":"module:AlbumTrackList.getData","link":"getData"},{"title":"module:AlbumTrackList.init","link":"init"},{"title":"module:AlbumView","link":"AlbumView"},{"title":"module:AlbumView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:AlbumView.createDialogPallete","link":"createDialogPallete"},{"title":"module:AlbumView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:AlbumView.init","link":"init"},{"title":"module:AlbumView.onDoneLoading","link":"onDoneLoading"},{"title":"module:AlbumView.onKeyEvent","link":"onKeyEvent"},{"title":"module:AlbumView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:AlbumView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AlbumView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AlbumView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AlbumView.setupMainNode","link":"setupMainNode"},{"title":"module:Alpha","link":"Alpha"},{"title":"module:Alpha.init","link":"init"},{"title":"module:Alpha.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView","link":"ArtistView"},{"title":"module:ArtistView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:ArtistView.OnScreenShown","link":"OnScreenShown"},{"title":"module:ArtistView.artistOverviewChanged","link":"artistOverviewChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:ArtistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:ArtistView.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:ArtistView.init","link":"init"},{"title":"module:ArtistView.onAlbumsData","link":"onAlbumsData"},{"title":"module:ArtistView.onAlbumsEscape","link":"onAlbumsEscape"},{"title":"module:ArtistView.onAppearsOnData","link":"onAppearsOnData"},{"title":"module:ArtistView.onAppearsOnEscape","link":"onAppearsOnEscape"},{"title":"module:ArtistView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:ArtistView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:ArtistView.onEllipsisChanged","link":"onEllipsisChanged"},{"title":"module:ArtistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:ArtistView.onSectionNavigationEscape","link":"onSectionNavigationEscape"},{"title":"module:ArtistView.onSectionNavigationSelected","link":"onSectionNavigationSelected"},{"title":"module:ArtistView.onSectionScrollerChange","link":"onSectionScrollerChange"},{"title":"module:ArtistView.pageContentChanged","link":"pageContentChanged","description":"

Event fired when page data is loaded

"},{"title":"module:ArtistView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:ArtistView.setPosterImage","link":"setPosterImage"},{"title":"module:ArtistView.setScreenTitle","link":"setScreenTitle"},{"title":"module:ArtistView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:ArtistView.setupMainNode","link":"setupMainNode"},{"title":"module:AudioPlayer","link":"AudioPlayer"},{"title":"module:AudioPlayer.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:AudioPlayer.audioStateChanged","link":"audioStateChanged","description":"

State Change Event Handler

"},{"title":"module:AudioPlayer.init","link":"init"},{"title":"module:AudioPlayerView","link":"AudioPlayerView"},{"title":"module:AudioPlayerView.LoadNextSong","link":"LoadNextSong"},{"title":"module:AudioPlayerView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:AudioPlayerView.audioPositionChanged","link":"audioPositionChanged"},{"title":"module:AudioPlayerView.audioStateChanged","link":"audioStateChanged"},{"title":"module:AudioPlayerView.bufferPositionChanged","link":"bufferPositionChanged"},{"title":"module:AudioPlayerView.endScreenSaver","link":"endScreenSaver"},{"title":"module:AudioPlayerView.findCurrentSongIndex","link":"findCurrentSongIndex"},{"title":"module:AudioPlayerView.init","link":"init"},{"title":"module:AudioPlayerView.loadButtons","link":"loadButtons","description":"

If we have more and 1 song to play, fade in the next and previous controls

"},{"title":"module:AudioPlayerView.loopClicked","link":"loopClicked"},{"title":"module:AudioPlayerView.nextClicked","link":"nextClicked"},{"title":"module:AudioPlayerView.onAudioStreamLoaded","link":"onAudioStreamLoaded"},{"title":"module:AudioPlayerView.onBackdropImageLoaded","link":"onBackdropImageLoaded"},{"title":"module:AudioPlayerView.onButtonSelectedChange","link":"onButtonSelectedChange","description":"

Event handler when user selected a different playback button

"},{"title":"module:AudioPlayerView.onKeyEvent","link":"onKeyEvent","description":"

Process key press events

"},{"title":"module:AudioPlayerView.onMetaDataLoaded","link":"onMetaDataLoaded"},{"title":"module:AudioPlayerView.onScreensaverTimeoutLoaded","link":"onScreensaverTimeoutLoaded"},{"title":"module:AudioPlayerView.pageContentChanged","link":"pageContentChanged","description":"

Update values on screen when page content changes

"},{"title":"module:AudioPlayerView.playAction","link":"playAction"},{"title":"module:AudioPlayerView.previousClicked","link":"previousClicked"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.screenSaverActive","link":"screenSaverActive"},{"title":"module:AudioPlayerView.setBackdropImage","link":"setBackdropImage","description":"

Add backdrop image to screen

"},{"title":"module:AudioPlayerView.setLoopButtonImage","link":"setLoopButtonImage"},{"title":"module:AudioPlayerView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:AudioPlayerView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:AudioPlayerView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:AudioPlayerView.setShuffleIconState","link":"setShuffleIconState"},{"title":"module:AudioPlayerView.setTrackNumberDisplay","link":"setTrackNumberDisplay"},{"title":"module:AudioPlayerView.setupAnimationTasks","link":"setupAnimationTasks"},{"title":"module:AudioPlayerView.setupAudioNode","link":"setupAudioNode","description":"

Creates audio node used to play song(s)

"},{"title":"module:AudioPlayerView.setupButtons","link":"setupButtons","description":"

Setup playback buttons, default to Play button selected

"},{"title":"module:AudioPlayerView.setupDataTasks","link":"setupDataTasks","description":"

Creates tasks to gather data needed to render Scene and play song

"},{"title":"module:AudioPlayerView.setupInfoNodes","link":"setupInfoNodes"},{"title":"module:AudioPlayerView.setupScreenSaver","link":"setupScreenSaver"},{"title":"module:AudioPlayerView.shuffleClicked","link":"shuffleClicked"},{"title":"module:AudioPlayerView.startScreenSaver","link":"startScreenSaver"},{"title":"module:AudioPlayerView.toggleShuffleEnabled","link":"toggleShuffleEnabled"},{"title":"module:AudioTrackListItem","link":"AudioTrackListItem"},{"title":"module:AudioTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:AudioTrackListItem.init","link":"init"},{"title":"module:AudioTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ButtonGroupHoriz","link":"ButtonGroupHoriz"},{"title":"module:ButtonGroupHoriz.init","link":"init"},{"title":"module:ButtonGroupHoriz.onKeyEvent","link":"onKeyEvent"},{"title":"module:ButtonGroupVert","link":"ButtonGroupVert"},{"title":"module:ButtonGroupVert.init","link":"init"},{"title":"module:ButtonGroupVert.onFocusButtonChanged","link":"onFocusButtonChanged"},{"title":"module:ButtonGroupVert.onFocusChanged","link":"onFocusChanged"},{"title":"module:ButtonGroupVert.onKeyEvent","link":"onKeyEvent"},{"title":"module:ChannelData","link":"ChannelData"},{"title":"module:ChannelData.setFields","link":"setFields"},{"title":"module:ChannelData.setPoster","link":"setPoster"},{"title":"module:Clock","link":"Clock"},{"title":"module:Clock.init","link":"init"},{"title":"module:Clock.onCurrentTimeTimerFire","link":"onCurrentTimeTimerFire","description":"

onCurrentTimeTimerFire: Code that runs every time the currentTimeTimer fires

"},{"title":"module:CollectionData","link":"CollectionData"},{"title":"module:CollectionData.setFields","link":"setFields"},{"title":"module:CollectionData.setPoster","link":"setPoster"},{"title":"module:ConfigData","link":"ConfigData"},{"title":"module:ConfigData.init","link":"init"},{"title":"module:ConfigItem","link":"ConfigItem"},{"title":"module:ConfigItem.init","link":"init"},{"title":"module:ConfigItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ConfigItem.setColors","link":"setColors"},{"title":"module:ConfigList","link":"ConfigList"},{"title":"module:ConfigList.configListShowDialog","link":"configListShowDialog"},{"title":"module:ConfigList.dismiss_dialog","link":"dismiss_dialog"},{"title":"module:ConfigList.init","link":"init"},{"title":"module:ConfigList.onDialogButton","link":"onDialogButton"},{"title":"module:ConfigList.onItemSelected","link":"onItemSelected"},{"title":"module:ConfigList.setData","link":"setData"},{"title":"module:ExtrasItem","link":"ExtrasItem"},{"title":"module:ExtrasItem.focusChanged","link":"focusChanged"},{"title":"module:ExtrasItem.init","link":"init"},{"title":"module:ExtrasItem.showContent","link":"showContent"},{"title":"module:ExtrasRowList","link":"ExtrasRowList"},{"title":"module:ExtrasRowList.addRowSize","link":"addRowSize"},{"title":"module:ExtrasRowList.buildRow","link":"buildRow"},{"title":"module:ExtrasRowList.init","link":"init"},{"title":"module:ExtrasRowList.loadParts","link":"loadParts"},{"title":"module:ExtrasRowList.loadPersonVideos","link":"loadPersonVideos"},{"title":"module:ExtrasRowList.onAdditionalPartsLoaded","link":"onAdditionalPartsLoaded"},{"title":"module:ExtrasRowList.onLikeThisLoaded","link":"onLikeThisLoaded"},{"title":"module:ExtrasRowList.onMoviesLoaded","link":"onMoviesLoaded"},{"title":"module:ExtrasRowList.onPeopleLoaded","link":"onPeopleLoaded"},{"title":"module:ExtrasRowList.onRowItemFocused","link":"onRowItemFocused"},{"title":"module:ExtrasRowList.onRowItemSelected","link":"onRowItemSelected"},{"title":"module:ExtrasRowList.onSeriesLoaded","link":"onSeriesLoaded"},{"title":"module:ExtrasRowList.onShowsLoaded","link":"onShowsLoaded"},{"title":"module:ExtrasRowList.onSpecialFeaturesLoaded","link":"onSpecialFeaturesLoaded"},{"title":"module:ExtrasRowList.updateSize","link":"updateSize"},{"title":"module:FavoriteItemsTask","link":"FavoriteItemsTask"},{"title":"module:FavoriteItemsTask.init","link":"init"},{"title":"module:FavoriteItemsTask.setFavoriteStatus","link":"setFavoriteStatus"},{"title":"module:FolderData","link":"FolderData"},{"title":"module:FolderData.setFields","link":"setFields"},{"title":"module:FolderData.setPoster","link":"setPoster"},{"title":"module:GetFiltersTask","link":"GetFiltersTask"},{"title":"module:GetFiltersTask.getFiltersTask","link":"getFiltersTask"},{"title":"module:GetFiltersTask.init","link":"init"},{"title":"module:GetNextEpisodeTask","link":"GetNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.getNextEpisodeTask","link":"getNextEpisodeTask"},{"title":"module:GetNextEpisodeTask.init","link":"init"},{"title":"module:GetPlaybackInfoTask","link":"GetPlaybackInfoTask"},{"title":"module:GetPlaybackInfoTask.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:GetPlaybackInfoTask.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:GetPlaybackInfoTask.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:GetPlaybackInfoTask.getPlaybackInfoTask","link":"getPlaybackInfoTask","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:GetPlaybackInfoTask.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:GetPlaybackInfoTask.init","link":"init"},{"title":"module:GetShuffleEpisodesTask","link":"GetShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.getShuffleEpisodesTask","link":"getShuffleEpisodesTask"},{"title":"module:GetShuffleEpisodesTask.init","link":"init"},{"title":"module:GridItem","link":"GridItem"},{"title":"module:GridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:GridItem.focusChanging","link":"focusChanging","description":"

Use FocusPercent to animate scaling of Poser Image

"},{"title":"module:GridItem.init","link":"init"},{"title":"module:GridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:GridItemSmall","link":"GridItemSmall"},{"title":"module:GridItemSmall.focusChanged","link":"focusChanged"},{"title":"module:GridItemSmall.init","link":"init"},{"title":"module:GridItemSmall.itemContentChanged","link":"itemContentChanged"},{"title":"module:GridItemSmall.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:Home","link":"Home"},{"title":"module:Home.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook that gets ran as needed.\nUsed to update the focus, the state of the data, and tells the server about the device profile

"},{"title":"module:Home.init","link":"init"},{"title":"module:Home.loadLibraries","link":"loadLibraries"},{"title":"module:Home.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:Home.refresh","link":"refresh"},{"title":"module:HomeData","link":"HomeData"},{"title":"module:HomeData.setData","link":"setData"},{"title":"module:HomeItem","link":"HomeItem"},{"title":"module:HomeItem.drawProgressBar","link":"drawProgressBar","description":"

Draws and animates item progress bar

"},{"title":"module:HomeItem.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:HomeItem.init","link":"init"},{"title":"module:HomeItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:HomeItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and icon when poster loaded

"},{"title":"module:HomeRowItemSizes","link":"HomeRowItemSizes"},{"title":"module:HomeRows","link":"HomeRows"},{"title":"module:HomeRows.addHomeSection","link":"addHomeSection","description":"

addHomeSection: Adds a new home section to the home rows.

"},{"title":"module:HomeRows.createContinueWatchingRow","link":"createContinueWatchingRow","description":"

createContinueWatchingRow: Creates a row displaying items the user can continue watching

"},{"title":"module:HomeRows.createFavoritesRow","link":"createFavoritesRow","description":"

createFavoritesRow: Creates a row displaying items from the user's favorites list

"},{"title":"module:HomeRows.createLatestInRows","link":"createLatestInRows","description":"

createLatestInRows: Creates a row displaying latest items in each of the user's libraries

"},{"title":"module:HomeRows.createLibraryRow","link":"createLibraryRow","description":"

createLibraryRow: Creates a row displaying the user's libraries

"},{"title":"module:HomeRows.createLiveTVRow","link":"createLiveTVRow","description":"

createLiveTVRow: Creates a row displaying the live tv now on section

"},{"title":"module:HomeRows.createNextUpRow","link":"createNextUpRow","description":"

createNextUpRow: Creates a row displaying next episodes up to watch

"},{"title":"module:HomeRows.filterNodeArray","link":"filterNodeArray"},{"title":"module:HomeRows.getOriginalSectionIndex","link":"getOriginalSectionIndex","description":"

getOriginalSectionIndex: Gets the index of a section from user settings and adds count of currently known latest media sections

"},{"title":"module:HomeRows.getSectionIndex","link":"getSectionIndex","description":"

getSectionIndex: Returns index of requested section in home row content

"},{"title":"module:HomeRows.init","link":"init"},{"title":"module:HomeRows.itemSelected","link":"itemSelected"},{"title":"module:HomeRows.loadLibraries","link":"loadLibraries"},{"title":"module:HomeRows.loadingTimerComplete","link":"loadingTimerComplete","description":"

loadingTimerComplete: Event handler for when loading wait time has expired

"},{"title":"module:HomeRows.onKeyEvent","link":"onKeyEvent"},{"title":"module:HomeRows.onLibrariesLoaded","link":"onLibrariesLoaded","description":"

onLibrariesLoaded: Handler when LoadLibrariesTask returns data

"},{"title":"module:HomeRows.processUserSections","link":"processUserSections","description":"

processUserSections: Loop through user's chosen home section settings and generate the content for each row

"},{"title":"module:HomeRows.removeHomeSection","link":"removeHomeSection","description":"

removeHomeSection: Removes a home section from the home rows

"},{"title":"module:HomeRows.sectionExists","link":"sectionExists","description":"

sectionExists: Checks if passed section exists in home row content

"},{"title":"module:HomeRows.setRowItemSize","link":"setRowItemSize","description":"

setRowItemSize: Loops through all home sections and sets the correct item sizes per row

"},{"title":"module:HomeRows.updateContinueWatchingItems","link":"updateContinueWatchingItems","description":"

updateContinueWatchingItems: Processes LoadContinueWatchingTask content. Removes, Creates, or Updates continue watching row as needed

"},{"title":"module:HomeRows.updateFavoritesItems","link":"updateFavoritesItems","description":"

updateFavoritesItems: Processes LoadFavoritesTask content. Removes, Creates, or Updates favorites row as needed

"},{"title":"module:HomeRows.updateHomeRows","link":"updateHomeRows","description":"

updateHomeRows: Update function exposed to outside components

"},{"title":"module:HomeRows.updateLatestItems","link":"updateLatestItems","description":"

updateLatestItems: Processes LoadItemsTask content. Removes, Creates, or Updates latest in {library} row as needed

"},{"title":"module:HomeRows.updateNextUpItems","link":"updateNextUpItems","description":"

updateNextUpItems: Processes LoadNextUpTask content. Removes, Creates, or Updates next up row as needed

"},{"title":"module:HomeRows.updateOnNowItems","link":"updateOnNowItems","description":"

updateOnNowItems: Processes LoadOnNowTask content. Removes, Creates, or Updates latest in on now row as needed

"},{"title":"module:HomeRows.updateSize","link":"updateSize"},{"title":"module:IconButton","link":"IconButton"},{"title":"module:IconButton.init","link":"init"},{"title":"module:IconButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:IconButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:IconButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:IconButton.onIconChanged","link":"onIconChanged"},{"title":"module:IconButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:IconButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:IconButton.onTextChanged","link":"onTextChanged"},{"title":"module:IconButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:IconButton.setIconSize","link":"setIconSize"},{"title":"module:Image","link":"Image"},{"title":"module:Image.ImageURL","link":"ImageURL"},{"title":"module:Image.ItemImages","link":"ItemImages"},{"title":"module:Image.PosterImage","link":"PosterImage"},{"title":"module:Image.UserImageURL","link":"UserImageURL"},{"title":"module:ImageData","link":"ImageData"},{"title":"module:ImageData.setFields","link":"setFields"},{"title":"module:IntegerKeyboard","link":"IntegerKeyboard"},{"title":"module:IntegerKeyboard.init","link":"init"},{"title":"module:IntegerKeyboard.keySelected","link":"keySelected"},{"title":"module:IntegerKeyboard.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid","link":"ItemGrid"},{"title":"module:ItemGrid.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:ItemGrid.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:ItemGrid.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:ItemGrid.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:ItemGrid.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:ItemGrid.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:ItemGrid.init","link":"init"},{"title":"module:ItemGrid.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:ItemGrid.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:ItemGrid.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:ItemGrid.onChannelFocused","link":"onChannelFocused"},{"title":"module:ItemGrid.onChannelSelected","link":"onChannelSelected"},{"title":"module:ItemGrid.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:ItemGrid.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:ItemGrid.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:ItemGrid.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:ItemGrid.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGrid.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:ItemGrid.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:ItemGrid.setBoxsetsOptions","link":"setBoxsetsOptions","description":"

Set Boxset view, sort, and filter options

"},{"title":"module:ItemGrid.setDefaultOptions","link":"setDefaultOptions","description":"

Set Default view, sort, and filter options

"},{"title":"module:ItemGrid.setLiveTvOptions","link":"setLiveTvOptions","description":"

Set Live TV view, sort, and filter options

"},{"title":"module:ItemGrid.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:ItemGrid.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:ItemGrid.setPhotoAlbumOptions","link":"setPhotoAlbumOptions","description":"

Set Photo Album view, sort, and filter options

"},{"title":"module:ItemGrid.setTvShowsOptions","link":"setTvShowsOptions","description":"

Set TV Show view, sort, and filter options

"},{"title":"module:ItemGrid.showTVGuide","link":"showTVGuide"},{"title":"module:ItemGrid.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:ItemGrid.updateTitle","link":"updateTitle"},{"title":"module:ItemGridOptions","link":"ItemGridOptions"},{"title":"module:ItemGridOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:ItemGridOptions.hideChecklist","link":"hideChecklist"},{"title":"module:ItemGridOptions.init","link":"init"},{"title":"module:ItemGridOptions.isFilterMenuDataValid","link":"isFilterMenuDataValid","description":"

Check if data for Filter Menu is valid

"},{"title":"module:ItemGridOptions.onFilterFocusChange","link":"onFilterFocusChange"},{"title":"module:ItemGridOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:ItemGridOptions.optionsSet","link":"optionsSet"},{"title":"module:ItemGridOptions.saveFavoriteItemSelected","link":"saveFavoriteItemSelected"},{"title":"module:ItemGridOptions.setHeartColor","link":"setHeartColor"},{"title":"module:ItemGridOptions.showChecklist","link":"showChecklist"},{"title":"module:ItemGridOptions.toggleFavorite","link":"toggleFavorite"},{"title":"module:Items","link":"Items"},{"title":"module:Items.AppearsOnList","link":"AppearsOnList","description":"

Get list of albums an artist appears on

"},{"title":"module:Items.ArtistOverview","link":"ArtistOverview","description":"

Music Artist Data

"},{"title":"module:Items.AudioItem","link":"AudioItem","description":"

Get Songs that are on an Album

"},{"title":"module:Items.AudioStream","link":"AudioStream"},{"title":"module:Items.BackdropImage","link":"BackdropImage"},{"title":"module:Items.CreateArtistMix","link":"CreateArtistMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.CreateInstantMix","link":"CreateInstantMix","description":"

Get Instant Mix based on item

"},{"title":"module:Items.GetIntroVideos","link":"GetIntroVideos","description":"

Get Intro Videos for an item

"},{"title":"module:Items.GetSongsByArtist","link":"GetSongsByArtist","description":"

Get list of songs belonging to an artist

"},{"title":"module:Items.ItemGetPlaybackInfo","link":"ItemGetPlaybackInfo"},{"title":"module:Items.ItemMetaData","link":"ItemMetaData","description":"

MetaData about an item

"},{"title":"module:Items.ItemPostPlaybackInfo","link":"ItemPostPlaybackInfo"},{"title":"module:Items.MusicAlbumList","link":"MusicAlbumList","description":"

Get list of albums belonging to an artist

"},{"title":"module:Items.MusicSongList","link":"MusicSongList","description":"

Get Songs that are on an Album

"},{"title":"module:Items.PlaylistItemList","link":"PlaylistItemList","description":"

Get Items that are under the provided item

"},{"title":"module:Items.TVEpisodeShuffleList","link":"TVEpisodeShuffleList"},{"title":"module:Items.TVEpisodes","link":"TVEpisodes","description":"

Returns a list of TV Shows for a given TV Show and season\nAccepts strings for the TV Show Id and the season Id

"},{"title":"module:Items.TVSeasonExtras","link":"TVSeasonExtras","description":"

Returns a list of extra features for a TV Show season\nAccepts a string that is a TV Show season id

"},{"title":"module:Items.TVSeasons","link":"TVSeasons","description":"

Seasons for a TV Show

"},{"title":"module:Items.searchMedia","link":"searchMedia","description":"

Search across all libraries

"},{"title":"module:Items.useTranscodeAudioStream","link":"useTranscodeAudioStream"},{"title":"module:JFButton","link":"JFButton"},{"title":"module:JFButton.init","link":"init"},{"title":"module:JFButton.onTextChanged","link":"onTextChanged","description":"

Whenever the text changes, pad both sides with whitespace so we can center the button text

"},{"title":"module:JFButtons","link":"JFButtons"},{"title":"module:JFButtons.focusChanged","link":"focusChanged","description":"

Change opacity of the highlighted menu item based on focus

"},{"title":"module:JFButtons.highlightSelected","link":"highlightSelected","description":"

Highlight selected menu option

"},{"title":"module:JFButtons.init","link":"init"},{"title":"module:JFButtons.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFButtons.renderChanged","link":"renderChanged","description":"

When options are fully displayed, set focus and selected option

"},{"title":"module:JFButtons.selectedIndexChanged","link":"selectedIndexChanged","description":"

When Selected Index set, ensure it is the one Focused

"},{"title":"module:JFButtons.showButtons","link":"showButtons"},{"title":"module:JFButtons.updateButtons","link":"updateButtons"},{"title":"module:JFGroup","link":"JFGroup"},{"title":"module:JFGroup.init","link":"init"},{"title":"module:JFGroup.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog","link":"JFMessageDialog"},{"title":"module:JFMessageDialog.init","link":"init"},{"title":"module:JFMessageDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFMessageDialog.redraw","link":"redraw"},{"title":"module:JFMessageDialog.updateMessage","link":"updateMessage"},{"title":"module:JFMessageDialog.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang","link":"JFOverhang"},{"title":"module:JFOverhang.init","link":"init"},{"title":"module:JFOverhang.onVisibleChange","link":"onVisibleChange"},{"title":"module:JFOverhang.resetTime","link":"resetTime"},{"title":"module:JFOverhang.setClockVisibility","link":"setClockVisibility"},{"title":"module:JFOverhang.setRightSeperatorVisibility","link":"setRightSeperatorVisibility"},{"title":"module:JFOverhang.updateOptions","link":"updateOptions"},{"title":"module:JFOverhang.updateTime","link":"updateTime"},{"title":"module:JFOverhang.updateTimeDisplay","link":"updateTimeDisplay"},{"title":"module:JFOverhang.updateTitle","link":"updateTitle"},{"title":"module:JFOverhang.updateUser","link":"updateUser"},{"title":"module:JFScene","link":"JFScene"},{"title":"module:JFScene.disableRemoteChanged","link":"disableRemoteChanged","description":"

Triggered when the disableRemote boolean component field is changed

"},{"title":"module:JFScene.init","link":"init"},{"title":"module:JFScene.isLoadingChanged","link":"isLoadingChanged","description":"

Triggered when the isLoading boolean component field is changed

"},{"title":"module:JFScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFScreen","link":"JFScreen"},{"title":"module:JFScreen.OnScreenHidden","link":"OnScreenHidden","description":"

Function called when the screen is hidden by the screen manager\nIt is expected that screens override this function if required,\nto handle focus any actions required on the screen being hidden

"},{"title":"module:JFScreen.OnScreenShown","link":"OnScreenShown","description":"

Function called when the screen is displayed by the screen manager\nIt is expected that screens override this function to handle focus\nmanagmenet and any other actions required on screen shown

"},{"title":"module:JFScreen.init","link":"init"},{"title":"module:JFServer","link":"JFServer"},{"title":"module:JFServer.init","link":"init"},{"title":"module:JFServer.itemContentChanged","link":"itemContentChanged"},{"title":"module:JFServer.onFocusPercentChange","link":"onFocusPercentChange"},{"title":"module:JFServer.setTextColor","link":"setTextColor"},{"title":"module:JFVideo","link":"JFVideo"},{"title":"module:JFVideo.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:JFVideo.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:JFVideo.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:JFVideo.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:JFVideo.init","link":"init"},{"title":"module:JFVideo.loadCaption","link":"loadCaption"},{"title":"module:JFVideo.onAllowCaptionsChange","link":"onAllowCaptionsChange"},{"title":"module:JFVideo.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:JFVideo.onKeyEvent","link":"onKeyEvent"},{"title":"module:JFVideo.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:JFVideo.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:JFVideo.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:JFVideo.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:JFVideo.toggleCaption","link":"toggleCaption"},{"title":"module:JFVideo.updateCaption","link":"updateCaption"},{"title":"module:JFVideo.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:ListPoster","link":"ListPoster"},{"title":"module:ListPoster.focusChanged","link":"focusChanged","description":"

Enable title scrolling based on item Focus

"},{"title":"module:ListPoster.init","link":"init"},{"title":"module:ListPoster.itemContentChanged","link":"itemContentChanged"},{"title":"module:ListPoster.updateSize","link":"updateSize"},{"title":"module:LoadChannelsTask","link":"LoadChannelsTask"},{"title":"module:LoadChannelsTask.init","link":"init"},{"title":"module:LoadChannelsTask.loadChannels","link":"loadChannels"},{"title":"module:LoadItemsTask","link":"LoadItemsTask"},{"title":"module:LoadItemsTask.getPersonVideos","link":"getPersonVideos"},{"title":"module:LoadItemsTask.init","link":"init"},{"title":"module:LoadItemsTask.loadItems","link":"loadItems"},{"title":"module:LoadItemsTask2","link":"LoadItemsTask2"},{"title":"module:LoadItemsTask2.init","link":"init"},{"title":"module:LoadItemsTask2.loadItems","link":"loadItems"},{"title":"module:LoadPhotoTask","link":"LoadPhotoTask"},{"title":"module:LoadPhotoTask.init","link":"init"},{"title":"module:LoadPhotoTask.loadItems","link":"loadItems"},{"title":"module:LoadProgramDetailsTask","link":"LoadProgramDetailsTask"},{"title":"module:LoadProgramDetailsTask.init","link":"init"},{"title":"module:LoadProgramDetailsTask.loadProgramDetails","link":"loadProgramDetails"},{"title":"module:LoadScreenSaverTimeoutTask","link":"LoadScreenSaverTimeoutTask"},{"title":"module:LoadScreenSaverTimeoutTask.getScreensaverTimeout","link":"getScreensaverTimeout"},{"title":"module:LoadScreenSaverTimeoutTask.init","link":"init"},{"title":"module:LoadSheduleTask","link":"LoadSheduleTask"},{"title":"module:LoadSheduleTask.init","link":"init"},{"title":"module:LoadSheduleTask.loadSchedule","link":"loadSchedule"},{"title":"module:LoadVideoContentTask","link":"LoadVideoContentTask"},{"title":"module:LoadVideoContentTask.FindPreferredAudioStream","link":"FindPreferredAudioStream"},{"title":"module:LoadVideoContentTask.LoadItems_AddVideoContent","link":"LoadItems_AddVideoContent"},{"title":"module:LoadVideoContentTask.LoadItems_VideoPlayer","link":"LoadItems_VideoPlayer"},{"title":"module:LoadVideoContentTask.addNextEpisodesToQueue","link":"addNextEpisodesToQueue","description":"

Add next episodes to the playback queue

"},{"title":"module:LoadVideoContentTask.addSubtitlesToVideo","link":"addSubtitlesToVideo"},{"title":"module:LoadVideoContentTask.addVideoContentURL","link":"addVideoContentURL"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"title":"module:LoadVideoContentTask.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:LoadVideoContentTask.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:LoadVideoContentTask.init","link":"init"},{"title":"module:LoadVideoContentTask.loadItems","link":"loadItems"},{"title":"module:LoadVideoContentTask.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:LoginScene","link":"LoginScene"},{"title":"module:LoginScene.init","link":"init"},{"title":"module:LoginScene.onKeyEvent","link":"onKeyEvent"},{"title":"module:Main","link":"Main"},{"title":"module:Main.Main","link":"Main"},{"title":"module:MovieData","link":"MovieData"},{"title":"module:MovieData.setContainer","link":"setContainer"},{"title":"module:MovieData.setFields","link":"setFields"},{"title":"module:MovieData.setPoster","link":"setPoster"},{"title":"module:MovieDetails","link":"MovieDetails"},{"title":"module:MovieDetails.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieDetails.SetDefaultAudioTrack","link":"SetDefaultAudioTrack"},{"title":"module:MovieDetails.SetUpAudioOptions","link":"SetUpAudioOptions"},{"title":"module:MovieDetails.SetUpVideoOptions","link":"SetUpVideoOptions"},{"title":"module:MovieDetails.audioOptionsClosed","link":"audioOptionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieDetails.getEndTime","link":"getEndTime"},{"title":"module:MovieDetails.getRuntime","link":"getRuntime"},{"title":"module:MovieDetails.init","link":"init"},{"title":"module:MovieDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:MovieDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieDetails.round","link":"round"},{"title":"module:MovieDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:MovieDetails.setFieldText","link":"setFieldText"},{"title":"module:MovieDetails.setWatchedColor","link":"setWatchedColor"},{"title":"module:MovieDetails.trailerAvailableChanged","link":"trailerAvailableChanged"},{"title":"module:MovieDetails.videoOptionsClosed","link":"videoOptionsClosed","description":"

Check if options were updated and if any reloding is needed...

"},{"title":"module:MovieLibraryView","link":"MovieLibraryView"},{"title":"module:MovieLibraryView.FilterDataLoaded","link":"FilterDataLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MovieLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MovieLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MovieLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MovieLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MovieLibraryView.SetName","link":"SetName","description":"

Set Selected Movie Name

"},{"title":"module:MovieLibraryView.SetOfficialRating","link":"SetOfficialRating","description":"

Set Selected Movie OfficialRating

"},{"title":"module:MovieLibraryView.SetOverview","link":"SetOverview","description":"

Set Selected Movie Overview

"},{"title":"module:MovieLibraryView.SetProductionYear","link":"SetProductionYear","description":"

Set Selected Movie ProductionYear

"},{"title":"module:MovieLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MovieLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MovieLibraryView.getRuntime","link":"getRuntime"},{"title":"module:MovieLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MovieLibraryView.init","link":"init"},{"title":"module:MovieLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MovieLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MovieLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MovieLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MovieLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MovieLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MovieLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MovieLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MovieLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MovieLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MovieLibraryView.round","link":"round"},{"title":"module:MovieLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MovieLibraryView.setMoviesOptions","link":"setMoviesOptions","description":"

Set Movies view, sort, and filter options

"},{"title":"module:MovieLibraryView.setSelectedOptions","link":"setSelectedOptions","description":"

Data to display when options button selected

"},{"title":"module:MovieLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MovieLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MovieOptions","link":"MovieOptions"},{"title":"module:MovieOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:MovieOptions.init","link":"init"},{"title":"module:MovieOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:MovieOptions.optionsSet","link":"optionsSet"},{"title":"module:MusicAlbumData","link":"MusicAlbumData"},{"title":"module:MusicAlbumData.setFields","link":"setFields"},{"title":"module:MusicAlbumData.setPoster","link":"setPoster"},{"title":"module:MusicAlbumSongListData","link":"MusicAlbumSongListData"},{"title":"module:MusicAlbumSongListData.setFields","link":"setFields"},{"title":"module:MusicAlbumSongListData.setPoster","link":"setPoster"},{"title":"module:MusicArtistData","link":"MusicArtistData"},{"title":"module:MusicArtistData.setFields","link":"setFields"},{"title":"module:MusicArtistData.setPoster","link":"setPoster"},{"title":"module:MusicArtistGridItem","link":"MusicArtistGridItem"},{"title":"module:MusicArtistGridItem.focusChanged","link":"focusChanged","description":"

Display or hide title Visibility on focus change

"},{"title":"module:MusicArtistGridItem.init","link":"init"},{"title":"module:MusicArtistGridItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:MusicArtistGridItem.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

Hide backdrop and text when poster loaded

"},{"title":"module:MusicLibraryView","link":"MusicLibraryView"},{"title":"module:MusicLibraryView.ItemDataLoaded","link":"ItemDataLoaded","description":"

Handle loaded data, and add to Grid

"},{"title":"module:MusicLibraryView.LogoImageLoaded","link":"LogoImageLoaded","description":"

Logo Image Loaded Event Handler

"},{"title":"module:MusicLibraryView.OnScreenHidden","link":"OnScreenHidden"},{"title":"module:MusicLibraryView.OnScreenShown","link":"OnScreenShown"},{"title":"module:MusicLibraryView.SetAlbumCount","link":"SetAlbumCount","description":"

Set Selected Artist Album Count

"},{"title":"module:MusicLibraryView.SetBackground","link":"SetBackground","description":"

Set Background Image

"},{"title":"module:MusicLibraryView.SetGenres","link":"SetGenres","description":"

Set Selected Artist Genres

"},{"title":"module:MusicLibraryView.SetName","link":"SetName","description":"

Set Selected Artist Name

"},{"title":"module:MusicLibraryView.SetSongCount","link":"SetSongCount","description":"

Set Selected Artist Song Count

"},{"title":"module:MusicLibraryView.SetUpOptions","link":"SetUpOptions","description":"

Data to display when options button selected

"},{"title":"module:MusicLibraryView.getCollectionType","link":"getCollectionType","description":"

Return parent collection type

"},{"title":"module:MusicLibraryView.getItemFocused","link":"getItemFocused","description":"

Returns Focused Item

"},{"title":"module:MusicLibraryView.inStringArray","link":"inStringArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:MusicLibraryView.init","link":"init"},{"title":"module:MusicLibraryView.loadInitialItems","link":"loadInitialItems","description":"

Load initial set of Data

"},{"title":"module:MusicLibraryView.loadMoreData","link":"loadMoreData","description":"

Load next set of items

"},{"title":"module:MusicLibraryView.newBGLoaded","link":"newBGLoaded","description":"

When Image Loading Status changes

"},{"title":"module:MusicLibraryView.onChannelSelected","link":"onChannelSelected"},{"title":"module:MusicLibraryView.onGenreItemFocused","link":"onGenreItemFocused","description":"

Genre Item Focused

"},{"title":"module:MusicLibraryView.onGenreItemSelected","link":"onGenreItemSelected","description":"

Genre Item Selected

"},{"title":"module:MusicLibraryView.onItemFocused","link":"onItemFocused","description":"

Handle new item being focused

"},{"title":"module:MusicLibraryView.onItemSelected","link":"onItemSelected","description":"

Item Selected

"},{"title":"module:MusicLibraryView.onItemalphaSelected","link":"onItemalphaSelected"},{"title":"module:MusicLibraryView.onKeyEvent","link":"onKeyEvent"},{"title":"module:MusicLibraryView.onvoiceFilter","link":"onvoiceFilter"},{"title":"module:MusicLibraryView.optionsClosed","link":"optionsClosed","description":"

Check if options updated and any reloading required

"},{"title":"module:MusicLibraryView.setFieldText","link":"setFieldText"},{"title":"module:MusicLibraryView.setMusicOptions","link":"setMusicOptions","description":"

Set Music view, sort, and filter options

"},{"title":"module:MusicLibraryView.setupNodes","link":"setupNodes"},{"title":"module:MusicLibraryView.swapDone","link":"swapDone","description":"

Swap Complete

"},{"title":"module:MusicSongData","link":"MusicSongData"},{"title":"module:MusicSongData.setFields","link":"setFields"},{"title":"module:MusicSongData.setPoster","link":"setPoster"},{"title":"module:OSD","link":"OSD"},{"title":"module:OSD.inactiveCheck","link":"inactiveCheck","description":"

inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.

"},{"title":"module:OSD.init","link":"init"},{"title":"module:OSD.onButtonSelected","link":"onButtonSelected","description":"

onButtonSelected: Handler for selection of buttons from the menu.

"},{"title":"module:OSD.onFocusChanged","link":"onFocusChanged","description":"

onFocusChanged: Handler for changes to the focus of this menu.

"},{"title":"module:OSD.onItemTitleTextChanged","link":"onItemTitleTextChanged","description":"

onItemTitleTextChanged: Handler for changes to m.top.itemTitleText param.

"},{"title":"module:OSD.onKeyEvent","link":"onKeyEvent"},{"title":"module:OSD.onPlaybackStateChanged","link":"onPlaybackStateChanged","description":"

onPlaybackStateChanged: Handler for changes to m.top.playbackState param

"},{"title":"module:OSD.onProgressPercentageChanged","link":"onProgressPercentageChanged","description":"

onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param

"},{"title":"module:OSD.onVisibleChanged","link":"onVisibleChanged","description":"

onVisibleChanged: Handler for changes to the visibility of this menu.

"},{"title":"module:OSD.resetFocusToDefaultButton","link":"resetFocusToDefaultButton","description":"

resetFocusToDefaultButton: Reset focus back to the default button

"},{"title":"module:OptionNode","link":"OptionNode"},{"title":"module:OptionNode.init","link":"init"},{"title":"module:OptionsButton","link":"OptionsButton"},{"title":"module:OptionsButton.init","link":"init"},{"title":"module:OptionsButton.press","link":"press"},{"title":"module:OptionsData","link":"OptionsData"},{"title":"module:OptionsData.init","link":"init"},{"title":"module:OptionsData.press","link":"press"},{"title":"module:OptionsData.update_title","link":"update_title"},{"title":"module:OptionsSlider","link":"OptionsSlider"},{"title":"module:OptionsSlider.init","link":"init"},{"title":"module:OptionsSlider.onKeyEvent","link":"onKeyEvent"},{"title":"module:OptionsSlider.setFields","link":"setFields"},{"title":"module:OverviewDialog","link":"OverviewDialog"},{"title":"module:OverviewDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:OverviewDialog.setOverview","link":"setOverview"},{"title":"module:OverviewDialog.setTitle","link":"setTitle"},{"title":"module:PersonData","link":"PersonData"},{"title":"module:PersonData.setFields","link":"setFields"},{"title":"module:PersonData.setPoster","link":"setPoster"},{"title":"module:PersonDetails","link":"PersonDetails"},{"title":"module:PersonDetails.createDialogPallete","link":"createDialogPallete"},{"title":"module:PersonDetails.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PersonDetails.dscrShowFocus","link":"dscrShowFocus"},{"title":"module:PersonDetails.init","link":"init"},{"title":"module:PersonDetails.loadPerson","link":"loadPerson"},{"title":"module:PersonDetails.onButtonGroupEscaped","link":"onButtonGroupEscaped"},{"title":"module:PersonDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PersonDetails.setFavoriteColor","link":"setFavoriteColor"},{"title":"module:PersonDetails.shortDate","link":"shortDate"},{"title":"module:PhotoData","link":"PhotoData"},{"title":"module:PhotoData.setFields","link":"setFields"},{"title":"module:PhotoData.setPoster","link":"setPoster"},{"title":"module:PhotoDetails","link":"PhotoDetails"},{"title":"module:PhotoDetails.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook.\nUsed to ensure tasks are stopped

"},{"title":"module:PhotoDetails.init","link":"init"},{"title":"module:PhotoDetails.isRandomChanged","link":"isRandomChanged","description":"

isRandom component field has changed

"},{"title":"module:PhotoDetails.isSlideshowChanged","link":"isSlideshowChanged","description":"

isSlideshow component field has changed

"},{"title":"module:PhotoDetails.isValidToContinue","link":"isValidToContinue"},{"title":"module:PhotoDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:PhotoDetails.nextSlide","link":"nextSlide"},{"title":"module:PhotoDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:PhotoDetails.onPhotoLoaded","link":"onPhotoLoaded"},{"title":"module:PhotoDetails.statusUpdate","link":"statusUpdate"},{"title":"module:PlaybackDialog","link":"PlaybackDialog"},{"title":"module:PlaybackDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlayedCheckmark","link":"PlayedCheckmark"},{"title":"module:PlayedCheckmark.init","link":"init"},{"title":"module:PlaylistData","link":"PlaylistData"},{"title":"module:PlaylistData.setFields","link":"setFields"},{"title":"module:PlaylistData.setPoster","link":"setPoster"},{"title":"module:PlaylistView","link":"PlaylistView"},{"title":"module:PlaylistView.adjustScreenForNoOverview","link":"adjustScreenForNoOverview","description":"

Adjust scene by removing overview node and showing more songs

"},{"title":"module:PlaylistView.createDialogPallete","link":"createDialogPallete"},{"title":"module:PlaylistView.createFullDscrDlg","link":"createFullDscrDlg"},{"title":"module:PlaylistView.init","link":"init"},{"title":"module:PlaylistView.onDoneLoading","link":"onDoneLoading"},{"title":"module:PlaylistView.onKeyEvent","link":"onKeyEvent"},{"title":"module:PlaylistView.pageContentChanged","link":"pageContentChanged","description":"

Set values for displayed values on screen

"},{"title":"module:PlaylistView.setOnScreenTextValues","link":"setOnScreenTextValues","description":"

Populate on screen text variables

"},{"title":"module:PlaylistView.setPosterImage","link":"setPosterImage","description":"

Set poster image on screen

"},{"title":"module:PlaylistView.setScreenTitle","link":"setScreenTitle","description":"

Set screen's title text

"},{"title":"module:PlaylistView.setupMainNode","link":"setupMainNode"},{"title":"module:PlaystateTask","link":"PlaystateTask"},{"title":"module:PlaystateTask.PlaystateDefaults","link":"PlaystateDefaults"},{"title":"module:PlaystateTask.PlaystateUpdate","link":"PlaystateUpdate"},{"title":"module:PlaystateTask.init","link":"init"},{"title":"module:PostTask","link":"PostTask"},{"title":"module:PostTask.asyncPost","link":"asyncPost","description":"

Post data and wait for response code

"},{"title":"module:PostTask.empty","link":"empty","description":"

Revert PostTask to default state

"},{"title":"module:PostTask.init","link":"init"},{"title":"module:PostTask.postItems","link":"postItems","description":"

Main function for PostTask.\nPosts either an array of data\nor a string of data to an API endpoint.\nSaves the response information

"},{"title":"module:ProgramDetails","link":"ProgramDetails"},{"title":"module:ProgramDetails.channelUpdated","link":"channelUpdated"},{"title":"module:ProgramDetails.focusChanged","link":"focusChanged","description":"

Show view channel button when item has Focus

"},{"title":"module:ProgramDetails.getDurationStringFromSeconds","link":"getDurationStringFromSeconds","description":"

Get program duration string (e.g. 1h 20m)

"},{"title":"module:ProgramDetails.getRelativeDayName","link":"getRelativeDayName","description":"

Get relative date name for a date (yesterday, today, tomorrow, or otherwise weekday name )

"},{"title":"module:ProgramDetails.init","link":"init"},{"title":"module:ProgramDetails.onAnimationComplete","link":"onAnimationComplete"},{"title":"module:ProgramDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:ProgramDetails.programUpdated","link":"programUpdated"},{"title":"module:ProgramDetails.setupLabels","link":"setupLabels","description":"

Set up Live and Repeat label sizes

"},{"title":"module:ProgramDetails.updateLabels","link":"updateLabels"},{"title":"module:PublicUserData","link":"PublicUserData"},{"title":"module:PublicUserData.init","link":"init"},{"title":"module:QueueManager","link":"QueueManager"},{"title":"module:QueueManager.clear","link":"clear","description":"

Clear all content from play queue

"},{"title":"module:QueueManager.clearHold","link":"clearHold","description":"

Clear all hold content

"},{"title":"module:QueueManager.deleteAtIndex","link":"deleteAtIndex","description":"

Delete item from play queue at passed index

"},{"title":"module:QueueManager.getCount","link":"getCount","description":"

Return the number of items in the play queue

"},{"title":"module:QueueManager.getCurrentItem","link":"getCurrentItem","description":"

Return the item currently in focus from the play queue

"},{"title":"module:QueueManager.getHold","link":"getHold","description":"

Return the items in the hold

"},{"title":"module:QueueManager.getIsShuffled","link":"getIsShuffled","description":"

Return whether or not shuffle is enabled

"},{"title":"module:QueueManager.getItemByIndex","link":"getItemByIndex","description":"

Return the item in the passed index from the play queue

"},{"title":"module:QueueManager.getItemType","link":"getItemType"},{"title":"module:QueueManager.getPosition","link":"getPosition","description":"

Returns current playback position within the queue

"},{"title":"module:QueueManager.getQueue","link":"getQueue","description":"

Return the current play queue

"},{"title":"module:QueueManager.getQueueTypes","link":"getQueueTypes","description":"

Return the types of items in current play queue

"},{"title":"module:QueueManager.getQueueUniqueTypes","link":"getQueueUniqueTypes","description":"

Return the unique types of items in current play queue

"},{"title":"module:QueueManager.getUnshuffledQueue","link":"getUnshuffledQueue","description":"

Return original, unshuffled queue

"},{"title":"module:QueueManager.hold","link":"hold","description":"

Hold an item

"},{"title":"module:QueueManager.init","link":"init"},{"title":"module:QueueManager.isPrerollActive","link":"isPrerollActive","description":"

Return isPrerollActive status

"},{"title":"module:QueueManager.moveBack","link":"moveBack","description":"

Move queue position back one

"},{"title":"module:QueueManager.moveForward","link":"moveForward","description":"

Move queue position ahead one

"},{"title":"module:QueueManager.peek","link":"peek","description":"

Return item at end of play queue without removing

"},{"title":"module:QueueManager.playQueue","link":"playQueue","description":"

Play items in queue

"},{"title":"module:QueueManager.pop","link":"pop","description":"

Remove item at end of play queue

"},{"title":"module:QueueManager.push","link":"push","description":"

Push new items to the play queue

"},{"title":"module:QueueManager.resetQueueItemOrder","link":"resetQueueItemOrder","description":"

Reset queue items back to original, unshuffled order

"},{"title":"module:QueueManager.resetShuffle","link":"resetShuffle","description":"

Reset shuffle to off state

"},{"title":"module:QueueManager.set","link":"set","description":"

Replace play queue with passed array

"},{"title":"module:QueueManager.setPosition","link":"setPosition","description":"

Set the queue position

"},{"title":"module:QueueManager.setPrerollStatus","link":"setPrerollStatus","description":"

Set prerollActive status

"},{"title":"module:QueueManager.setTopStartingPoint","link":"setTopStartingPoint","description":"

Set starting point for top item in the queue

"},{"title":"module:QueueManager.shuffleQueueItems","link":"shuffleQueueItems","description":"

Save a copy of the original queue and randomize order of queue items

"},{"title":"module:QueueManager.toggleShuffle","link":"toggleShuffle","description":"

Toggle shuffleEnabled state

"},{"title":"module:QueueManager.top","link":"top","description":"

Return the fitst item in the play queue

"},{"title":"module:QuickConnect","link":"QuickConnect"},{"title":"module:QuickConnect.init","link":"init"},{"title":"module:QuickConnect.monitorQuickConnect","link":"monitorQuickConnect"},{"title":"module:QuickConnectDialog","link":"QuickConnectDialog"},{"title":"module:QuickConnectDialog.OnAuthenticated","link":"OnAuthenticated"},{"title":"module:QuickConnectDialog.init","link":"init"},{"title":"module:QuickConnectDialog.onButtonSelected","link":"onButtonSelected"},{"title":"module:QuickConnectDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:QuickConnectDialog.quickConnectClosed","link":"quickConnectClosed"},{"title":"module:QuickConnectDialog.quickConnectStatus","link":"quickConnectStatus"},{"title":"module:RadioDialog","link":"RadioDialog"},{"title":"module:RadioDialog.init","link":"init"},{"title":"module:RadioDialog.moveScrollBar","link":"moveScrollBar","description":"

Move the popup's scroll bar

"},{"title":"module:RadioDialog.onButtonSelected","link":"onButtonSelected","description":"

Event handler for when user selected a button

"},{"title":"module:RadioDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:RadioDialog.onItemFocused","link":"onItemFocused","description":"

Event handler for when user's cursor highlights an option in the option list

"},{"title":"module:RadioDialog.onItemSelected","link":"onItemSelected","description":"

Once user selected an item, move cursor down to OK button

"},{"title":"module:RadioDialog.onKeyEvent","link":"onKeyEvent"},{"title":"module:RadioDialog.onScrollBarFocus","link":"onScrollBarFocus","description":"

If somehow the scrollbar gains focus, set focus back to the option list

"},{"title":"module:RecordProgramTask","link":"RecordProgramTask"},{"title":"module:RecordProgramTask.RecordOrCancelProgram","link":"RecordOrCancelProgram"},{"title":"module:RecordProgramTask.init","link":"init"},{"title":"module:SceneManager","link":"SceneManager"},{"title":"module:SceneManager.clearPreviousScene","link":"clearPreviousScene","description":"

Clear previous scene from group stack

"},{"title":"module:SceneManager.clearScenes","link":"clearScenes","description":"

Clear all content from group stack

"},{"title":"module:SceneManager.deleteSceneAtIndex","link":"deleteSceneAtIndex","description":"

Delete scene from group stack at passed index

"},{"title":"module:SceneManager.dismissDialog","link":"dismissDialog","description":"

Close currently displayed dialog

"},{"title":"module:SceneManager.getActiveScene","link":"getActiveScene","description":"

Return group at top of stack without removing

"},{"title":"module:SceneManager.init","link":"init"},{"title":"module:SceneManager.isDialogOpen","link":"isDialogOpen","description":"

Returns bool indicating if dialog is currently displayed

"},{"title":"module:SceneManager.optionClosed","link":"optionClosed","description":"

Return button the user selected

"},{"title":"module:SceneManager.optionDialog","link":"optionDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.optionSelected","link":"optionSelected","description":"

Return button the user selected

"},{"title":"module:SceneManager.popScene","link":"popScene","description":"

Remove the current group and load the last group from the stack

"},{"title":"module:SceneManager.pushScene","link":"pushScene","description":"

Push a new group onto the stack, replacing the existing group on the screen

"},{"title":"module:SceneManager.radioDialog","link":"radioDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.registerOverhangData","link":"registerOverhangData","description":"

Register observers for overhang data

"},{"title":"module:SceneManager.resetTime","link":"resetTime","description":"

Reset time

"},{"title":"module:SceneManager.settings","link":"settings","description":"

Display user/device settings screen

"},{"title":"module:SceneManager.standardDialog","link":"standardDialog","description":"

Display dialog to user with an OK button

"},{"title":"module:SceneManager.unregisterOverhangData","link":"unregisterOverhangData","description":"

Remove observers for overhang data

"},{"title":"module:SceneManager.updateOptions","link":"updateOptions","description":"

Update options availability

"},{"title":"module:SceneManager.updateOverhangTitle","link":"updateOverhangTitle","description":"

Update overhang title

"},{"title":"module:SceneManager.updateOverhangVisible","link":"updateOverhangVisible","description":"

Update whether the overhang is visible or not

"},{"title":"module:SceneManager.updateUser","link":"updateUser","description":"

Update username in overhang

"},{"title":"module:SceneManager.userMessage","link":"userMessage","description":"

Display dialog to user with an OK button

"},{"title":"module:ScheduleProgramData","link":"ScheduleProgramData"},{"title":"module:ScheduleProgramData.setFields","link":"setFields"},{"title":"module:ScheduleProgramData.setPoster","link":"setPoster"},{"title":"module:SearchBox","link":"SearchBox"},{"title":"module:SearchBox.init","link":"init"},{"title":"module:SearchBox.searchMedias","link":"searchMedias"},{"title":"module:SearchData","link":"SearchData"},{"title":"module:SearchData.setFields","link":"setFields"},{"title":"module:SearchData.setPoster","link":"setPoster"},{"title":"module:SearchResults","link":"SearchResults"},{"title":"module:SearchResults.init","link":"init"},{"title":"module:SearchResults.loadResults","link":"loadResults"},{"title":"module:SearchResults.onKeyEvent","link":"onKeyEvent"},{"title":"module:SearchResults.searchMedias","link":"searchMedias"},{"title":"module:SearchRow","link":"SearchRow"},{"title":"module:SearchRow.addRow","link":"addRow"},{"title":"module:SearchRow.getData","link":"getData"},{"title":"module:SearchRow.init","link":"init"},{"title":"module:SearchRow.updateSize","link":"updateSize"},{"title":"module:SearchTask","link":"SearchTask"},{"title":"module:SearchTask.init","link":"init"},{"title":"module:SearchTask.search","link":"search"},{"title":"module:SeriesData","link":"SeriesData"},{"title":"module:SeriesData.setFields","link":"setFields"},{"title":"module:SeriesData.setPoster","link":"setPoster"},{"title":"module:ServerDiscoveryTask","link":"ServerDiscoveryTask"},{"title":"module:ServerDiscoveryTask.AddServer","link":"AddServer"},{"title":"module:ServerDiscoveryTask.ProcessClientDiscoveryResponse","link":"ProcessClientDiscoveryResponse"},{"title":"module:ServerDiscoveryTask.ProcessSSDPResponse","link":"ProcessSSDPResponse"},{"title":"module:ServerDiscoveryTask.SendClientDiscoveryBroadcast","link":"SendClientDiscoveryBroadcast"},{"title":"module:ServerDiscoveryTask.SendSSDPBroadcast","link":"SendSSDPBroadcast"},{"title":"module:ServerDiscoveryTask.execute","link":"execute"},{"title":"module:ServerDiscoveryTask.init","link":"init","description":"

Task used to discover jellyfin servers on the local network

"},{"title":"module:SetServerScreen","link":"SetServerScreen"},{"title":"module:SetServerScreen.ScanForServers","link":"ScanForServers"},{"title":"module:SetServerScreen.ScanForServersComplete","link":"ScanForServersComplete"},{"title":"module:SetServerScreen.ShowKeyboard","link":"ShowKeyboard"},{"title":"module:SetServerScreen.clearErrorMessage","link":"clearErrorMessage"},{"title":"module:SetServerScreen.init","link":"init"},{"title":"module:SetServerScreen.onDialogButton","link":"onDialogButton"},{"title":"module:SetServerScreen.onKeyEvent","link":"onKeyEvent"},{"title":"module:ShowScenes","link":"ShowScenes"},{"title":"module:ShowScenes.CreateAlbumView","link":"CreateAlbumView","description":"

Shows details on selected album. Description text, image, and list of available songs

"},{"title":"module:ShowScenes.CreateArtistView","link":"CreateArtistView","description":"

Shows details on selected artist. Bio, image, and list of available albums

"},{"title":"module:ShowScenes.CreateHomeGroup","link":"CreateHomeGroup"},{"title":"module:ShowScenes.CreateItemGrid","link":"CreateItemGrid"},{"title":"module:ShowScenes.CreateMovieDetailsGroup","link":"CreateMovieDetailsGroup"},{"title":"module:ShowScenes.CreateMovieLibraryView","link":"CreateMovieLibraryView"},{"title":"module:ShowScenes.CreateMusicLibraryView","link":"CreateMusicLibraryView"},{"title":"module:ShowScenes.CreatePersonView","link":"CreatePersonView"},{"title":"module:ShowScenes.CreatePlaylistView","link":"CreatePlaylistView","description":"

Shows details on selected playlist. Description text, image, and list of available items

"},{"title":"module:ShowScenes.CreateSearchPage","link":"CreateSearchPage"},{"title":"module:ShowScenes.CreateSeasonDetailsGroup","link":"CreateSeasonDetailsGroup"},{"title":"module:ShowScenes.CreateSeasonDetailsGroupByID","link":"CreateSeasonDetailsGroupByID"},{"title":"module:ShowScenes.CreateSeriesDetailsGroup","link":"CreateSeriesDetailsGroup"},{"title":"module:ShowScenes.CreateServerGroup","link":"CreateServerGroup"},{"title":"module:ShowScenes.CreateSigninGroup","link":"CreateSigninGroup"},{"title":"module:ShowScenes.CreateUserSelectGroup","link":"CreateUserSelectGroup"},{"title":"module:ShowScenes.CreateVideoPlayerGroup","link":"CreateVideoPlayerGroup"},{"title":"module:ShowScenes.DeleteFromServerList","link":"DeleteFromServerList"},{"title":"module:ShowScenes.LoginFlow","link":"LoginFlow"},{"title":"module:ShowScenes.SaveServerList","link":"SaveServerList"},{"title":"module:ShowScenes.SendPerformanceBeacon","link":"SendPerformanceBeacon","description":"

Roku Performance monitoring

"},{"title":"module:ShowScenes.playbackOptionDialog","link":"playbackOptionDialog","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:SlideOutButton","link":"SlideOutButton"},{"title":"module:SlideOutButton.init","link":"init"},{"title":"module:SlideOutButton.onBackgroundChanged","link":"onBackgroundChanged"},{"title":"module:SlideOutButton.onFocusChanged","link":"onFocusChanged"},{"title":"module:SlideOutButton.onHeightChanged","link":"onHeightChanged"},{"title":"module:SlideOutButton.onHighlightChanged","link":"onHighlightChanged"},{"title":"module:SlideOutButton.onIconChanged","link":"onIconChanged"},{"title":"module:SlideOutButton.onKeyEvent","link":"onKeyEvent"},{"title":"module:SlideOutButton.onPaddingChanged","link":"onPaddingChanged"},{"title":"module:SlideOutButton.onTextChanged","link":"onTextChanged"},{"title":"module:SlideOutButton.onWidthChanged","link":"onWidthChanged"},{"title":"module:SlideOutButton.setIconSize","link":"setIconSize"},{"title":"module:SongItem","link":"SongItem"},{"title":"module:SongItem.focusChanged","link":"focusChanged"},{"title":"module:SongItem.init","link":"init"},{"title":"module:SongItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:Spinner","link":"Spinner"},{"title":"module:Spinner.init","link":"init"},{"title":"module:StandardDialog","link":"StandardDialog"},{"title":"module:StandardDialog.init","link":"init"},{"title":"module:StandardDialog.onContentDataChanged","link":"onContentDataChanged"},{"title":"module:Subtitles","link":"Subtitles"},{"title":"module:Subtitles.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:Subtitles.changeSubtitleDuringPlayback","link":"changeSubtitleDuringPlayback"},{"title":"module:Subtitles.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

Identify the default subtitle track\nif "requires_text" is true, only return a track if it is textual\nThis allows forcing text subs, since roku requires transcoding of non-text subs\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.defaultSubtitleTrackFromVid","link":"defaultSubtitleTrackFromVid","description":"

Identify the default subtitle track for a given video id\nreturns the server-side track index for the appriate subtitle

"},{"title":"module:Subtitles.getSubtitleLanguages","link":"getSubtitleLanguages"},{"title":"module:Subtitles.getSubtitleSelIdxFromSubIdx","link":"getSubtitleSelIdxFromSubIdx","description":"

The subtitle index on the server differs from the index we track locally\nThis function converts the former into the latter

"},{"title":"module:Subtitles.selectSubtitleTrack","link":"selectSubtitleTrack"},{"title":"module:Subtitles.selectSubtitleTrackDialog","link":"selectSubtitleTrackDialog","description":"

Present Dialog to user to select subtitle track

"},{"title":"module:Subtitles.setupSubtitle","link":"setupSubtitle","description":"

Given a set of subtitles, and a subtitle index (the index on the server, not in the list provided)\nthis will set all relevant settings for roku (mainly closed captions) and return the index of the\nsubtitle track specified, but indexed based on the provided list of subtitles

"},{"title":"module:Subtitles.sortSubtitles","link":"sortSubtitles","description":"

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

"},{"title":"module:Subtitles.turnoffSubtitles","link":"turnoffSubtitles"},{"title":"module:TVEpisode","link":"TVEpisode"},{"title":"module:TVEpisode.setFields","link":"setFields"},{"title":"module:TVEpisode.setPoster","link":"setPoster"},{"title":"module:TVEpisodeData","link":"TVEpisodeData"},{"title":"module:TVEpisodeData.setFields","link":"setFields"},{"title":"module:TVEpisodeData.setPoster","link":"setPoster"},{"title":"module:TVEpisodeRow","link":"TVEpisodeRow"},{"title":"module:TVEpisodeRow.init","link":"init"},{"title":"module:TVEpisodeRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRow.setData","link":"setData"},{"title":"module:TVEpisodeRow.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRow.updateSize","link":"updateSize"},{"title":"module:TVEpisodeRowWithOptions","link":"TVEpisodeRowWithOptions"},{"title":"module:TVEpisodeRowWithOptions.SetUpAudioOptions","link":"SetUpAudioOptions","description":"

List of audio tracks to choose from

"},{"title":"module:TVEpisodeRowWithOptions.SetUpVideoOptions","link":"SetUpVideoOptions","description":"

List of video versions to choose from

"},{"title":"module:TVEpisodeRowWithOptions.audioOptionsClosed","link":"audioOptionsClosed"},{"title":"module:TVEpisodeRowWithOptions.init","link":"init"},{"title":"module:TVEpisodeRowWithOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVEpisodeRowWithOptions.rowsDoneLoading","link":"rowsDoneLoading"},{"title":"module:TVEpisodeRowWithOptions.setupRows","link":"setupRows"},{"title":"module:TVEpisodeRowWithOptions.videoOptionsClosed","link":"videoOptionsClosed"},{"title":"module:TVEpisodes","link":"TVEpisodes"},{"title":"module:TVEpisodes.getFocusedItem","link":"getFocusedItem","description":"

get the currently focused item

"},{"title":"module:TVEpisodes.init","link":"init"},{"title":"module:TVEpisodes.onKeyEvent","link":"onKeyEvent","description":"

Handle navigation input from the remote and act on it

"},{"title":"module:TVEpisodes.setExtraButtonVisibility","link":"setExtraButtonVisibility","description":"

Updates the visibility of the Extras button based on if this season has any extra features

"},{"title":"module:TVEpisodes.setSeasonLoading","link":"setSeasonLoading"},{"title":"module:TVEpisodes.updateSeason","link":"updateSeason"},{"title":"module:TVListDetails","link":"TVListDetails"},{"title":"module:TVListDetails.DisplayAudioAvailable","link":"DisplayAudioAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one audio track to choose from

"},{"title":"module:TVListDetails.DisplayVideoAvailable","link":"DisplayVideoAvailable","description":"

Adds "+N" (e.g. +1) if there is more than one video version to choose from

"},{"title":"module:TVListDetails.SetupAudioDisplay","link":"SetupAudioDisplay","description":"

Display current audio_codec and check if there is more than one audio track to choose from...

"},{"title":"module:TVListDetails.focusChanged","link":"focusChanged"},{"title":"module:TVListDetails.getEndTime","link":"getEndTime"},{"title":"module:TVListDetails.getRuntime","link":"getRuntime"},{"title":"module:TVListDetails.init","link":"init"},{"title":"module:TVListDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVListOptions","link":"TVListOptions"},{"title":"module:TVListOptions.buttonFocusChanged","link":"buttonFocusChanged","description":"

Switch menu shown when button focus changes

"},{"title":"module:TVListOptions.init","link":"init"},{"title":"module:TVListOptions.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVListOptions.optionsSet","link":"optionsSet"},{"title":"module:TVSeasonData","link":"TVSeasonData"},{"title":"module:TVSeasonData.setFields","link":"setFields"},{"title":"module:TVSeasonData.setPoster","link":"setPoster"},{"title":"module:TVSeasonRow","link":"TVSeasonRow"},{"title":"module:TVSeasonRow.getData","link":"getData"},{"title":"module:TVSeasonRow.init","link":"init"},{"title":"module:TVSeasonRow.updateSize","link":"updateSize"},{"title":"module:TVShowDescription","link":"TVShowDescription"},{"title":"module:TVShowDescription.getEndTime","link":"getEndTime"},{"title":"module:TVShowDescription.getHistory","link":"getHistory"},{"title":"module:TVShowDescription.getRuntime","link":"getRuntime"},{"title":"module:TVShowDescription.init","link":"init"},{"title":"module:TVShowDescription.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDescription.round","link":"round"},{"title":"module:TVShowDescription.setFieldText","link":"setFieldText"},{"title":"module:TVShowDetails","link":"TVShowDetails"},{"title":"module:TVShowDetails.getEndTime","link":"getEndTime"},{"title":"module:TVShowDetails.getHistory","link":"getHistory"},{"title":"module:TVShowDetails.getRuntime","link":"getRuntime"},{"title":"module:TVShowDetails.init","link":"init"},{"title":"module:TVShowDetails.itemContentChanged","link":"itemContentChanged"},{"title":"module:TVShowDetails.onKeyEvent","link":"onKeyEvent"},{"title":"module:TVShowDetails.onShuffleEpisodeDataLoaded","link":"onShuffleEpisodeDataLoaded"},{"title":"module:TVShowDetails.round","link":"round"},{"title":"module:TVShowDetails.setFieldText","link":"setFieldText"},{"title":"module:TextSizeTask","link":"TextSizeTask"},{"title":"module:TextSizeTask.getTextSize","link":"getTextSize"},{"title":"module:TextSizeTask.init","link":"init"},{"title":"module:UserData","link":"UserData"},{"title":"module:UserData.getPreference","link":"getPreference"},{"title":"module:UserData.loadFromJSON","link":"loadFromJSON"},{"title":"module:UserData.loadFromRegistry","link":"loadFromRegistry"},{"title":"module:UserData.removeFromRegistry","link":"removeFromRegistry"},{"title":"module:UserData.saveToRegistry","link":"saveToRegistry"},{"title":"module:UserData.setDataFromJSON","link":"setDataFromJSON"},{"title":"module:UserData.setPreference","link":"setPreference"},{"title":"module:UserData.setServer","link":"setServer"},{"title":"module:UserItem","link":"UserItem"},{"title":"module:UserItem.init","link":"init"},{"title":"module:UserItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserLibrary","link":"UserLibrary"},{"title":"module:UserLibrary.MarkItemFavorite","link":"MarkItemFavorite"},{"title":"module:UserLibrary.MarkItemWatched","link":"MarkItemWatched"},{"title":"module:UserLibrary.UnmarkItemFavorite","link":"UnmarkItemFavorite"},{"title":"module:UserLibrary.UnmarkItemWatched","link":"UnmarkItemWatched"},{"title":"module:UserRow","link":"UserRow"},{"title":"module:UserRow.init","link":"init"},{"title":"module:UserRow.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserRow.setData","link":"setData"},{"title":"module:UserRow.setUser","link":"setUser"},{"title":"module:UserRow.updateSize","link":"updateSize"},{"title":"module:UserSelect","link":"UserSelect"},{"title":"module:UserSelect.init","link":"init"},{"title":"module:UserSelect.itemContentChanged","link":"itemContentChanged"},{"title":"module:UserSelect.onKeyEvent","link":"onKeyEvent"},{"title":"module:UserSelect.redraw","link":"redraw"},{"title":"module:VideoData","link":"VideoData"},{"title":"module:VideoData.setFields","link":"setFields"},{"title":"module:VideoData.setPoster","link":"setPoster"},{"title":"module:VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.AddVideoContent","link":"AddVideoContent"},{"title":"module:VideoPlayer.GetPlaybackInfo","link":"GetPlaybackInfo","description":"

Returns an array of playback info to be displayed during playback.\nIn the future, with a custom playback info view, we can return an associated array.

"},{"title":"module:VideoPlayer.GetTranscodingStats","link":"GetTranscodingStats"},{"title":"module:VideoPlayer.PlayIntroVideo","link":"PlayIntroVideo"},{"title":"module:VideoPlayer.VideoPlayer","link":"VideoPlayer"},{"title":"module:VideoPlayer.autoPlayNextEpisode","link":"autoPlayNextEpisode"},{"title":"module:VideoPlayer.directPlaySupported","link":"directPlaySupported"},{"title":"module:VideoPlayer.getAudioFormat","link":"getAudioFormat"},{"title":"module:VideoPlayer.getAudioInfo","link":"getAudioInfo"},{"title":"module:VideoPlayer.getContainerType","link":"getContainerType"},{"title":"module:VideoPlayer.getDisplayBitrate","link":"getDisplayBitrate"},{"title":"module:VideoPlayer.getTranscodeReasons","link":"getTranscodeReasons","description":"

Extract array of Transcode Reasons from the content URL

"},{"title":"module:VideoPlayer.havePlaybackInfo","link":"havePlaybackInfo"},{"title":"module:VideoPlayer.startPlayBackOver","link":"startPlayBackOver","description":"

Opens dialog asking user if they want to resume video or start playback over only on the home screen

"},{"title":"module:VideoPlayerView","link":"VideoPlayerView"},{"title":"module:VideoPlayerView.ReportPlayback","link":"ReportPlayback","description":"

Report playback to server

"},{"title":"module:VideoPlayerView.bufferCheck","link":"bufferCheck","description":"

Check the the buffering has not hung

"},{"title":"module:VideoPlayerView.checkTimeToDisplayNextEpisode","link":"checkTimeToDisplayNextEpisode","description":"

Checks if we need to display the Next Episode button

"},{"title":"module:VideoPlayerView.getCurrentChapterIndex","link":"getCurrentChapterIndex","description":"

getCurrentChapterIndex: Finds current chapter index

"},{"title":"module:VideoPlayerView.handleChapterListAction","link":"handleChapterListAction","description":"

handleChapterListAction: Handles action to show chapter list

"},{"title":"module:VideoPlayerView.handleChapterSkipAction","link":"handleChapterSkipAction","description":"

handleChapterSkipAction: Handles user command to skip chapters in playing video

"},{"title":"module:VideoPlayerView.handleHideAction","link":"handleHideAction","description":"

handleHideAction: Handles action to hide OSD menu

"},{"title":"module:VideoPlayerView.handleShowSubtitleMenuAction","link":"handleShowSubtitleMenuAction","description":"

handleShowSubtitleMenuAction: Handles action to show subtitle selection menu

"},{"title":"module:VideoPlayerView.handleShowVideoInfoPopupAction","link":"handleShowVideoInfoPopupAction","description":"

handleShowVideoInfoPopupAction: Handles action to show video info popup

"},{"title":"module:VideoPlayerView.handleVideoPlayPauseAction","link":"handleVideoPlayPauseAction","description":"

handleVideoPlayPauseAction: Handles action to either play or pause the video content

"},{"title":"module:VideoPlayerView.hideNextEpisodeButton","link":"hideNextEpisodeButton","description":"

Runs hide Next Episode button animation and sets focus back to video

"},{"title":"module:VideoPlayerView.init","link":"init"},{"title":"module:VideoPlayerView.loadCaption","link":"loadCaption","description":"

Set caption url to server subtitle track

"},{"title":"module:VideoPlayerView.onAllowCaptionsChange","link":"onAllowCaptionsChange","description":"

Only setup caption items if captions are allowed

"},{"title":"module:VideoPlayerView.onContentChange","link":"onContentChange","description":"

Event handler for when video content field changes

"},{"title":"module:VideoPlayerView.onKeyEvent","link":"onKeyEvent"},{"title":"module:VideoPlayerView.onNextEpisodeDataLoaded","link":"onNextEpisodeDataLoaded"},{"title":"module:VideoPlayerView.onOSDAction","link":"onOSDAction","description":"

onOSDAction: Process action events from OSD to their respective handlers

"},{"title":"module:VideoPlayerView.onPlaybackErrorButtonSelected","link":"onPlaybackErrorButtonSelected"},{"title":"module:VideoPlayerView.onPlaybackErrorDialogClosed","link":"onPlaybackErrorDialogClosed"},{"title":"module:VideoPlayerView.onPositionChanged","link":"onPositionChanged","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onState","link":"onState","description":"

When Video Player state changes

"},{"title":"module:VideoPlayerView.onSubtitleChange","link":"onSubtitleChange","description":"

Event handler for when selectedSubtitle changes

"},{"title":"module:VideoPlayerView.onVideoContentLoaded","link":"onVideoContentLoaded"},{"title":"module:VideoPlayerView.populateChapterMenu","link":"populateChapterMenu","description":"

populateChapterMenu: ' Parse chapter data from API and appeand to chapter list menu

"},{"title":"module:VideoPlayerView.showNextEpisodeButton","link":"showNextEpisodeButton","description":"

Runs Next Episode button animation and sets focus to button

"},{"title":"module:VideoPlayerView.showPlaybackErrorDialog","link":"showPlaybackErrorDialog"},{"title":"module:VideoPlayerView.stateAllowsOSD","link":"stateAllowsOSD","description":"

stateAllowsOSD: Check if current video state allows showing the OSD

"},{"title":"module:VideoPlayerView.toggleCaption","link":"toggleCaption","description":"

Toggles visibility of custom subtitles and sets captionTask's player state

"},{"title":"module:VideoPlayerView.updateCaption","link":"updateCaption","description":"

Removes old subtitle lines and adds new subtitle lines

"},{"title":"module:VideoPlayerView.updateCount","link":"updateCount","description":"

Update count down text

"},{"title":"module:VideoTrackListItem","link":"VideoTrackListItem"},{"title":"module:VideoTrackListItem.focusChanged","link":"focusChanged","description":"

Scroll description if focused

"},{"title":"module:VideoTrackListItem.init","link":"init"},{"title":"module:VideoTrackListItem.itemContentChanged","link":"itemContentChanged"},{"title":"module:ViewCreator","link":"ViewCreator"},{"title":"module:ViewCreator.CreateAudioPlayerView","link":"CreateAudioPlayerView","description":"

Play Audio

"},{"title":"module:ViewCreator.CreateVideoPlayerView","link":"CreateVideoPlayerView","description":"

Play Video

"},{"title":"module:ViewCreator.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

Roku translates the info provided in subtitleTracks into availableSubtitleTracks\nIncluding ignoring tracks, if they are not understood, thus making indexing unpredictable.\nThis function translates between our internel selected subtitle index\nand the corresponding index in availableSubtitleTracks.

"},{"title":"module:ViewCreator.onPlaybackInfoLoaded","link":"onPlaybackInfoLoaded","description":"

The playback info task has returned data

"},{"title":"module:ViewCreator.onSelectPlaybackInfoPressed","link":"onSelectPlaybackInfoPressed","description":"

User requested playback info

"},{"title":"module:ViewCreator.onSelectSubtitlePressed","link":"onSelectSubtitlePressed","description":"

User requested subtitle selection popup

"},{"title":"module:ViewCreator.onSelectionMade","link":"onSelectionMade","description":"

User has selected something from the radioDialog popup

"},{"title":"module:ViewCreator.onStateChange","link":"onStateChange","description":"

Playback state change event handlers

"},{"title":"module:ViewCreator.processSubtitleSelection","link":"processSubtitleSelection"},{"title":"module:WhatsNewDialog","link":"WhatsNewDialog"},{"title":"module:WhatsNewDialog.init","link":"init"},{"title":"module:WhatsNewDialog.setPalette","link":"setPalette"},{"title":"module:baserequest","link":"baserequest"},{"title":"module:baserequest.APIRequest","link":"APIRequest"},{"title":"module:baserequest.authRequest","link":"authRequest","description":"

Takes and returns a roUrlTransfer object after adding a Jellyfin "Authorization" header

"},{"title":"module:baserequest.buildAuthHeader","link":"buildAuthHeader","description":"

Returns a string containing the "Authorization" header payload

"},{"title":"module:baserequest.buildParams","link":"buildParams","description":"

Functions for making requests to the API

"},{"title":"module:baserequest.buildURL","link":"buildURL"},{"title":"module:baserequest.deleteVoid","link":"deleteVoid"},{"title":"module:baserequest.getJson","link":"getJson"},{"title":"module:baserequest.getString","link":"getString"},{"title":"module:baserequest.getVoid","link":"getVoid"},{"title":"module:baserequest.get_url","link":"get_url"},{"title":"module:baserequest.headVoid","link":"headVoid"},{"title":"module:baserequest.postJson","link":"postJson"},{"title":"module:baserequest.postString","link":"postString"},{"title":"module:baserequest.postVoid","link":"postVoid"},{"title":"module:baserequest.setCertificateAuthority","link":"setCertificateAuthority","description":"

sets the certificate authority by file path on the passed node

"},{"title":"module:captionTask","link":"captionTask"},{"title":"module:captionTask.fetchCaption","link":"fetchCaption"},{"title":"module:captionTask.init","link":"init"},{"title":"module:captionTask.isTime","link":"isTime"},{"title":"module:captionTask.newLayoutGroup","link":"newLayoutGroup"},{"title":"module:captionTask.newRect","link":"newRect"},{"title":"module:captionTask.newlabel","link":"newlabel"},{"title":"module:captionTask.parseVTT","link":"parseVTT"},{"title":"module:captionTask.setFont","link":"setFont"},{"title":"module:captionTask.toMs","link":"toMs"},{"title":"module:captionTask.updateCaption","link":"updateCaption"},{"title":"module:conditional","link":"conditional"},{"title":"module:conditional.printRegistry","link":"printRegistry","description":"

Print out all of the registry contents to the debug log

"},{"title":"module:config","link":"config"},{"title":"module:config.GetConfigTree","link":"GetConfigTree","description":"

Read config tree from json config file and return

"},{"title":"module:config.RegistryReadAll","link":"RegistryReadAll","description":"

Return all data found inside a registry section

"},{"title":"module:config.findConfigTreeKey","link":"findConfigTreeKey","description":"

Recursivly search the config tree for entry with settingname equal to key

"},{"title":"module:config.getRegistrySections","link":"getRegistrySections","description":"

Return an array of all the registry section keys

"},{"title":"module:config.getSavedUsers","link":"getSavedUsers","description":"

Returns an array of saved users from the registry\nthat belong to the active server

"},{"title":"module:config.get_setting","link":"get_setting","description":"

"Jellyfin" registry accessors for the default global settings

"},{"title":"module:config.get_user_setting","link":"get_user_setting","description":"

User registry accessors for the currently active user

"},{"title":"module:config.registry_delete","link":"registry_delete"},{"title":"module:config.registry_read","link":"registry_read","description":"

Generic registry accessors

"},{"title":"module:config.registry_write","link":"registry_write"},{"title":"module:config.set_setting","link":"set_setting"},{"title":"module:config.set_user_setting","link":"set_user_setting"},{"title":"module:config.unset_setting","link":"unset_setting"},{"title":"module:config.unset_user_setting","link":"unset_user_setting"},{"title":"module:deviceCapabilities","link":"deviceCapabilities"},{"title":"module:deviceCapabilities.GetBitRateLimit","link":"GetBitRateLimit"},{"title":"module:deviceCapabilities.GetDirectPlayProfiles","link":"GetDirectPlayProfiles"},{"title":"module:deviceCapabilities.getCodecProfiles","link":"getCodecProfiles"},{"title":"module:deviceCapabilities.getContainerProfiles","link":"getContainerProfiles"},{"title":"module:deviceCapabilities.getDeviceCapabilities","link":"getDeviceCapabilities","description":"

Returns the Device Capabilities for Roku.\nAlso prints out the device profile for debugging

"},{"title":"module:deviceCapabilities.getDeviceProfile","link":"getDeviceProfile"},{"title":"module:deviceCapabilities.getMaxHeightArray","link":"getMaxHeightArray"},{"title":"module:deviceCapabilities.getMaxWidthArray","link":"getMaxWidthArray"},{"title":"module:deviceCapabilities.getSubtitleProfiles","link":"getSubtitleProfiles"},{"title":"module:deviceCapabilities.getTranscodingProfiles","link":"getTranscodingProfiles"},{"title":"module:deviceCapabilities.printDeviceProfile","link":"printDeviceProfile","description":"

Print out the deviceProfile for debugging

"},{"title":"module:deviceCapabilities.removeDecimals","link":"removeDecimals","description":"

Remove all decimals from a string

"},{"title":"module:deviceCapabilities.setPreferredCodec","link":"setPreferredCodec","description":"

Takes and returns a comma delimited string of codecs.\nMoves the preferred codec to the front of the string

"},{"title":"module:deviceCapabilities.updateProfileArray","link":"updateProfileArray","description":"

Recieves and returns an assArray of supported profiles and levels for each video codec

"},{"title":"module:globals","link":"globals"},{"title":"module:globals.SaveAppToGlobal","link":"SaveAppToGlobal","description":"

Save information from roAppInfo to m.global.app

"},{"title":"module:globals.SaveDeviceToGlobal","link":"SaveDeviceToGlobal","description":"

Save information from roDeviceInfo to m.global.device

"},{"title":"module:globals.setConstants","link":"setConstants","description":"

Set global constants

"},{"title":"module:homeRowItemSizes","link":"homeRowItemSizes"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.runGlobalMigrations","link":"runGlobalMigrations","description":"

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

"},{"title":"module:migrations.runRegistryUserMigrations","link":"runRegistryUserMigrations"},{"title":"module:misc","link":"misc"},{"title":"module:misc.AssocArrayEqual","link":"AssocArrayEqual"},{"title":"module:misc.arrayHasValue","link":"arrayHasValue","description":"

Check if a specific value is inside of an array

"},{"title":"module:misc.div_ceiling","link":"div_ceiling"},{"title":"module:misc.findNodeBySubtype","link":"findNodeBySubtype"},{"title":"module:misc.formatTime","link":"formatTime","description":"

Format time as 12 or 24 hour format based on system clock setting

"},{"title":"module:misc.getButton","link":"getButton"},{"title":"module:misc.getMinutes","link":"getMinutes","description":"

Converts ticks to minutes

"},{"title":"module:misc.getMsgPicker","link":"getMsgPicker"},{"title":"module:misc.get_dialog_result","link":"get_dialog_result","description":"

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

"},{"title":"module:misc.inArray","link":"inArray","description":"

Search string array for search value. Return if it's found

"},{"title":"module:misc.inferServerUrl","link":"inferServerUrl","description":"

take an incomplete url string and use it to make educated guesses about\nthe complete url. then tests these guesses to see if it can find a jf server\nreturns the url of the server it found, or an empty string

"},{"title":"module:misc.isJellyfinServer","link":"isJellyfinServer","description":"

accepts the raw json string of /system/info/public and returns\na boolean indicating if ProductName is "Jellyfin Server"

"},{"title":"module:misc.isLocalhost","link":"isLocalhost","description":"

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

"},{"title":"module:misc.isNodeEvent","link":"isNodeEvent"},{"title":"module:misc.isValid","link":"isValid","description":"

Returns whether or not passed value is valid

"},{"title":"module:misc.isValidAndNotEmpty","link":"isValidAndNotEmpty","description":"

Returns whether or not passed value is valid and not empty\nAccepts a string, or any countable type (arrays and lists)

"},{"title":"module:misc.lastFocusedChild","link":"lastFocusedChild"},{"title":"module:misc.leftPad","link":"leftPad"},{"title":"module:misc.message_dialog","link":"message_dialog"},{"title":"module:misc.option_dialog","link":"option_dialog"},{"title":"module:misc.parseUrl","link":"parseUrl","description":"

Returns an array from a url = [ url, proto, host, port, subdir+params ]\nIf port or subdir are not found, an empty string will be added to the array\nProto must be declared or array will be empty

"},{"title":"module:misc.roundNumber","link":"roundNumber","description":"

Rounds number to nearest integer

"},{"title":"module:misc.secondsToHuman","link":"secondsToHuman"},{"title":"module:misc.setFieldTextValue","link":"setFieldTextValue"},{"title":"module:misc.show_dialog","link":"show_dialog"},{"title":"module:misc.shuffleArray","link":"shuffleArray","description":"

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

"},{"title":"module:misc.startLoadingSpinner","link":"startLoadingSpinner","description":"

startLoadingSpinner: Start a loading spinner and attach it to the main JFScene.\nDisplays an invisible ProgressDialog node by default to disable keypresses while loading.

"},{"title":"module:misc.stopLoadingSpinner","link":"stopLoadingSpinner"},{"title":"module:misc.ticksToHuman","link":"ticksToHuman"},{"title":"module:misc.toString","link":"toString"},{"title":"module:misc.urlCandidates","link":"urlCandidates","description":"

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates\nfor the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated\nfull urls.

"},{"title":"module:misc.versionChecker","link":"versionChecker","description":"

Returns whether or not a version number (e.g. 10.7.7) is greater or equal\nto some minimum version allowed (e.g. 10.8.0)

"},{"title":"module:quickplay","link":"quickplay"},{"title":"module:quickplay.album","link":"album","description":"

A music album.\nPlay the entire album starting with track 1.

"},{"title":"module:quickplay.artist","link":"artist","description":"

A music artist.\nShuffle play all songs by artist.

"},{"title":"module:quickplay.audio","link":"audio","description":"

A single audio file.

"},{"title":"module:quickplay.boxset","link":"boxset","description":"

A boxset.\nPlay all items inside.

"},{"title":"module:quickplay.collectionFolder","link":"collectionFolder","description":"

Quick Play A CollectionFolder.\nShuffle play the items inside\nwith some differences based on collectionType.

"},{"title":"module:quickplay.folder","link":"folder","description":"

Quick Play A folder.\nShuffle play all items found

"},{"title":"module:quickplay.multipleSeries","link":"multipleSeries","description":"

More than one TV Show Series.\nShuffle play all watched episodes

"},{"title":"module:quickplay.musicVideo","link":"musicVideo","description":"

A single music video file.

"},{"title":"module:quickplay.person","link":"person","description":"

Quick Play A Person.\nShuffle play all videos found

"},{"title":"module:quickplay.photo","link":"photo","description":"

A single photo.

"},{"title":"module:quickplay.photoAlbum","link":"photoAlbum","description":"

A photo album.

"},{"title":"module:quickplay.playlist","link":"playlist","description":"

Quick Play A Playlist.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.program","link":"program","description":"

Quick Play A Live Program

"},{"title":"module:quickplay.pushToQueue","link":"pushToQueue","description":"

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

"},{"title":"module:quickplay.season","link":"season","description":"

A TV Show Season.\nPlay the first unwatched episode.\nIf none, play the whole season starting with episode 1.

"},{"title":"module:quickplay.series","link":"series","description":"

A TV Show Series.\nPlay the first unwatched episode.\nIf none, shuffle play the whole series.

"},{"title":"module:quickplay.tvChannel","link":"tvChannel","description":"

Quick Play A TVChannel

"},{"title":"module:quickplay.userView","link":"userView","description":"

Quick Play A UserView.\nPlay logic depends on "collectionType".

"},{"title":"module:quickplay.video","link":"video","description":"

A single video file.

"},{"title":"module:quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"},{"title":"module:schedule","link":"schedule"},{"title":"module:schedule.channelFilterSet","link":"channelFilterSet"},{"title":"module:schedule.channelsearchTermSet","link":"channelsearchTermSet","description":"

Voice Search set

"},{"title":"module:schedule.focusProgramDetails","link":"focusProgramDetails","description":"

Move the TV Guide Grid down or up depending whether details are selected

"},{"title":"module:schedule.init","link":"init"},{"title":"module:schedule.onChannelsLoaded","link":"onChannelsLoaded","description":"

Initial list of channels loaded

"},{"title":"module:schedule.onGridScrolled","link":"onGridScrolled","description":"

As user scrolls grid, check if more data requries to be loaded

"},{"title":"module:schedule.onKeyEvent","link":"onKeyEvent"},{"title":"module:schedule.onProgramDetailsLoaded","link":"onProgramDetailsLoaded","description":"

Update the Program Details with full information

"},{"title":"module:schedule.onProgramFocused","link":"onProgramFocused"},{"title":"module:schedule.onProgramSelected","link":"onProgramSelected"},{"title":"module:schedule.onRecordChannelSelected","link":"onRecordChannelSelected","description":"

Handle user selecting "Record Channel" from Program Details

"},{"title":"module:schedule.onRecordOperationDone","link":"onRecordOperationDone"},{"title":"module:schedule.onRecordSeriesChannelSelected","link":"onRecordSeriesChannelSelected","description":"

Handle user selecting "Record Series" from Program Details

"},{"title":"module:schedule.onScheduleLoaded","link":"onScheduleLoaded","description":"

When LoadScheduleTask completes (initial or more data) and we have a schedule to display

"},{"title":"module:schedule.onWatchChannelSelected","link":"onWatchChannelSelected","description":"

Handle user selecting "Watch Channel" from Program Details

"},{"title":"module:section","link":"section"},{"title":"module:section.init","link":"init"},{"title":"module:section.onFocusChange","link":"onFocusChange"},{"title":"module:section.onIDChange","link":"onIDChange"},{"title":"module:section.onTranslationChange","link":"onTranslationChange"},{"title":"module:section.scrollDownToOnDeck","link":"scrollDownToOnDeck"},{"title":"module:section.scrollOffBottom","link":"scrollOffBottom"},{"title":"module:section.scrollOffOnDeck","link":"scrollOffOnDeck"},{"title":"module:section.scrollOffTop","link":"scrollOffTop"},{"title":"module:section.scrollUpToOnDeck","link":"scrollUpToOnDeck"},{"title":"module:section.showFromBottom","link":"showFromBottom"},{"title":"module:section.showFromTop","link":"showFromTop"},{"title":"module:sectionScroller","link":"sectionScroller"},{"title":"module:sectionScroller.displayedIndexChanged","link":"displayedIndexChanged"},{"title":"module:sectionScroller.init","link":"init"},{"title":"module:sectionScroller.onFocusChange","link":"onFocusChange"},{"title":"module:settings","link":"settings"},{"title":"module:settings.LoadMenu","link":"LoadMenu"},{"title":"module:settings.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook that gets ran as needed.\nAssumes settings were changed and they affect the device profile.\nPosts a new device profile to the server using the task thread

"},{"title":"module:settings.boolSettingChanged","link":"boolSettingChanged"},{"title":"module:settings.init","link":"init"},{"title":"module:settings.isFormInFocus","link":"isFormInFocus","description":"

Returns true if any of the data entry forms are in focus

"},{"title":"module:settings.onKeyEvent","link":"onKeyEvent"},{"title":"module:settings.onKeyGridEscape","link":"onKeyGridEscape"},{"title":"module:settings.onKeyGridSubmit","link":"onKeyGridSubmit"},{"title":"module:settings.postFinished","link":"postFinished","description":"

Triggered by m.postTask after completing a post.\nEmpty the task data when finished.

"},{"title":"module:settings.radioSettingChanged","link":"radioSettingChanged"},{"title":"module:settings.settingFocused","link":"settingFocused"},{"title":"module:settings.settingSelected","link":"settingSelected"},{"title":"module:userauth","link":"userauth"},{"title":"module:userauth.AboutMe","link":"AboutMe"},{"title":"module:userauth.AuthenticateViaQuickConnect","link":"AuthenticateViaQuickConnect"},{"title":"module:userauth.AvailableUsers","link":"AvailableUsers"},{"title":"module:userauth.GetPublicUsers","link":"GetPublicUsers"},{"title":"module:userauth.LoadUserAbilities","link":"LoadUserAbilities"},{"title":"module:userauth.ServerInfo","link":"ServerInfo"},{"title":"module:userauth.SignOut","link":"SignOut"},{"title":"module:userauth.checkQuickConnect","link":"checkQuickConnect"},{"title":"module:userauth.get_token","link":"get_token"},{"title":"module:userauth.initQuickConnect","link":"initQuickConnect"}]} \ No newline at end of file diff --git a/docs/api/index.html b/docs/api/index.html index ea1a778b03..e8f2e26b92 100644 --- a/docs/api/index.html +++ b/docs/api/index.html @@ -1,3 +1,3 @@ jellyfin-roku Code Documentation
On this page

Welcome

Use the Modules dropdown or the search feature to find functions and files to inspect

Known Issues

  • BrighterScript namespaces:
    • Duplicate function names will prevent the entire file from being parsed by JSDoc i.e. having namespace.red.Delete() and namespace.blue.Delete()
  • The line numbers listed for functions are incorrect.
  • The syntax highlighter treats all source files as JavaScript.
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Welcome

Use the Modules dropdown or the search feature to find functions and files to inspect

Known Issues

  • BrighterScript namespaces:
    • Duplicate function names will prevent the entire file from being parsed by JSDoc i.e. having namespace.red.Delete() and namespace.blue.Delete()
  • The line numbers listed for functions are incorrect.
  • The syntax highlighter treats all source files as JavaScript.
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-AlbumData.html b/docs/api/module-AlbumData.html index f418c5e591..7620533228 100644 --- a/docs/api/module-AlbumData.html +++ b/docs/api/module-AlbumData.html @@ -1,3 +1,3 @@ Module: AlbumData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-AlbumGrid.html b/docs/api/module-AlbumGrid.html index b9e5cf842a..14b96c4a9d 100644 --- a/docs/api/module-AlbumGrid.html +++ b/docs/api/module-AlbumGrid.html @@ -1,3 +1,3 @@ Module: AlbumGrid
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-AlbumTrackList.html b/docs/api/module-AlbumTrackList.html index bad4089941..37faaaacab 100644 --- a/docs/api/module-AlbumTrackList.html +++ b/docs/api/module-AlbumTrackList.html @@ -1,3 +1,3 @@ Module: AlbumTrackList
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-AlbumView.html b/docs/api/module-AlbumView.html index bc8e69280e..2b8d6eba43 100644 --- a/docs/api/module-AlbumView.html +++ b/docs/api/module-AlbumView.html @@ -1,3 +1,3 @@ Module: AlbumView
On this page

Methods

(static) adjustScreenForNoOverview() → {void}

Adjust scene by removing overview node and showing more songs

Returns:
Type: 
void

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDoneLoading() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) pageContentChanged() → {void}

Set values for displayed values on screen

Returns:
Type: 
void

(static) setOnScreenTextValues(json) → {void}

Populate on screen text variables

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Set poster image on screen

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Set screen's title text

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setupMainNode() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) adjustScreenForNoOverview() → {void}

Adjust scene by removing overview node and showing more songs

Returns:
Type: 
void

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDoneLoading() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) pageContentChanged() → {void}

Set values for displayed values on screen

Returns:
Type: 
void

(static) setOnScreenTextValues(json) → {void}

Populate on screen text variables

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Set poster image on screen

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Set screen's title text

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setupMainNode() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-Alpha.html b/docs/api/module-Alpha.html index 81f81b5d5c..280448a5bb 100644 --- a/docs/api/module-Alpha.html +++ b/docs/api/module-Alpha.html @@ -1,3 +1,3 @@ Module: Alpha
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ArtistView.html b/docs/api/module-ArtistView.html index f87641e008..78bb68ce68 100644 --- a/docs/api/module-ArtistView.html +++ b/docs/api/module-ArtistView.html @@ -1,3 +1,3 @@ Module: ArtistView
On this page

Methods

(static) OnScreenHidden() → {void}

Returns:
Type: 
void

(static) OnScreenShown() → {void}

Returns:
Type: 
void

(static) artistOverviewChanged() → {void}

Event fired when page data is loaded

Returns:
Type: 
void

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) dscrShowFocus() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onAlbumsData() → {void}

Returns:
Type: 
void

(static) onAlbumsEscape() → {void}

Returns:
Type: 
void

(static) onAppearsOnData() → {void}

Returns:
Type: 
void

(static) onAppearsOnEscape() → {void}

Returns:
Type: 
void

(static) onBackdropImageLoaded() → {void}

Returns:
Type: 
void

(static) onButtonSelectedChange() → {void}

Event handler when user selected a different playback button

Returns:
Type: 
void

(static) onEllipsisChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onSectionNavigationEscape() → {void}

Returns:
Type: 
void

(static) onSectionNavigationSelected() → {void}

Returns:
Type: 
void

(static) onSectionScrollerChange() → {void}

Returns:
Type: 
void

(static) pageContentChanged() → {void}

Event fired when page data is loaded

Returns:
Type: 
void

(static) setBackdropImage(data) → {void}

Add backdrop image to screen

Parameters:
NameTypeDescription
datadynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setupButtons() → {void}

Setup playback buttons, default to Play button selected

Returns:
Type: 
void

(static) setupMainNode() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) OnScreenHidden() → {void}

Returns:
Type: 
void

(static) OnScreenShown() → {void}

Returns:
Type: 
void

(static) artistOverviewChanged() → {void}

Event fired when page data is loaded

Returns:
Type: 
void

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) dscrShowFocus() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onAlbumsData() → {void}

Returns:
Type: 
void

(static) onAlbumsEscape() → {void}

Returns:
Type: 
void

(static) onAppearsOnData() → {void}

Returns:
Type: 
void

(static) onAppearsOnEscape() → {void}

Returns:
Type: 
void

(static) onBackdropImageLoaded() → {void}

Returns:
Type: 
void

(static) onButtonSelectedChange() → {void}

Event handler when user selected a different playback button

Returns:
Type: 
void

(static) onEllipsisChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onSectionNavigationEscape() → {void}

Returns:
Type: 
void

(static) onSectionNavigationSelected() → {void}

Returns:
Type: 
void

(static) onSectionScrollerChange() → {void}

Returns:
Type: 
void

(static) pageContentChanged() → {void}

Event fired when page data is loaded

Returns:
Type: 
void

(static) setBackdropImage(data) → {void}

Add backdrop image to screen

Parameters:
NameTypeDescription
datadynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setupButtons() → {void}

Setup playback buttons, default to Play button selected

Returns:
Type: 
void

(static) setupMainNode() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-AudioPlayer.html b/docs/api/module-AudioPlayer.html index 999f0a1946..fa318ee732 100644 --- a/docs/api/module-AudioPlayer.html +++ b/docs/api/module-AudioPlayer.html @@ -1,3 +1,3 @@ Module: AudioPlayer
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-AudioPlayerView.html b/docs/api/module-AudioPlayerView.html index dd3556beea..18ea01a989 100644 --- a/docs/api/module-AudioPlayerView.html +++ b/docs/api/module-AudioPlayerView.html @@ -1,3 +1,3 @@ Module: AudioPlayerView
On this page

Methods

(static) LoadNextSong() → {void}

Returns:
Type: 
void

(static) OnScreenHidden() → {void}

Returns:
Type: 
void

(static) audioPositionChanged() → {void}

Returns:
Type: 
void

(static) audioStateChanged() → {void}

Returns:
Type: 
void

(static) bufferPositionChanged() → {void}

Returns:
Type: 
void

(static) endScreenSaver() → {void}

Returns:
Type: 
void

(static) findCurrentSongIndex(songList) → {integer}

Parameters:
NameTypeDescription
songListdynamic
Returns:
Type: 
integer

(static) init() → {void}

Returns:
Type: 
void

(static) loadButtons() → {void}

If we have more and 1 song to play, fade in the next and previous controls

Returns:
Type: 
void

(static) loopClicked() → {boolean}

Returns:
Type: 
boolean

(static) nextClicked() → {boolean}

Returns:
Type: 
boolean

(static) onAudioStreamLoaded() → {void}

Returns:
Type: 
void

(static) onBackdropImageLoaded() → {void}

Returns:
Type: 
void

(static) onButtonSelectedChange() → {void}

Event handler when user selected a different playback button

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Process key press events

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onMetaDataLoaded() → {void}

Returns:
Type: 
void

(static) onScreensaverTimeoutLoaded() → {void}

Returns:
Type: 
void

(static) pageContentChanged() → {void}

Update values on screen when page content changes

Returns:
Type: 
void

(static) playAction() → {boolean}

Returns:
Type: 
boolean

(static) previousClicked() → {boolean}

Returns:
Type: 
boolean

(static) resetLoopModeToDefault() → {void}

Returns:
Type: 
void

(static) screenSaverActive() → {boolean}

Returns:
Type: 
boolean

(static) setBackdropImage(data) → {void}

Add backdrop image to screen

Parameters:
NameTypeDescription
datadynamic
Returns:
Type: 
void

(static) setLoopButtonImage() → {void}

Returns:
Type: 
void

(static) setOnScreenTextValues(json) → {void}

Populate on screen text variables

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Set poster image on screen

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Set screen's title text

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setShuffleIconState() → {void}

Returns:
Type: 
void

(static) setTrackNumberDisplay() → {void}

Returns:
Type: 
void

(static) setupAnimationTasks() → {void}

Returns:
Type: 
void

(static) setupAudioNode() → {void}

Creates audio node used to play song(s)

Returns:
Type: 
void

(static) setupButtons() → {void}

Setup playback buttons, default to Play button selected

Returns:
Type: 
void

(static) setupDataTasks() → {void}

Creates tasks to gather data needed to render Scene and play song

Returns:
Type: 
void

(static) setupInfoNodes() → {void}

Returns:
Type: 
void

(static) setupScreenSaver() → {void}

Returns:
Type: 
void

(static) shuffleClicked() → {boolean}

Returns:
Type: 
boolean

(static) startScreenSaver() → {void}

Returns:
Type: 
void

(static) toggleShuffleEnabled() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) LoadNextSong() → {void}

Returns:
Type: 
void

(static) OnScreenHidden() → {void}

Returns:
Type: 
void

(static) audioPositionChanged() → {void}

Returns:
Type: 
void

(static) audioStateChanged() → {void}

Returns:
Type: 
void

(static) bufferPositionChanged() → {void}

Returns:
Type: 
void

(static) endScreenSaver() → {void}

Returns:
Type: 
void

(static) findCurrentSongIndex(songList) → {integer}

Parameters:
NameTypeDescription
songListdynamic
Returns:
Type: 
integer

(static) init() → {void}

Returns:
Type: 
void

(static) loadButtons() → {void}

If we have more and 1 song to play, fade in the next and previous controls

Returns:
Type: 
void

(static) loopClicked() → {boolean}

Returns:
Type: 
boolean

(static) nextClicked() → {boolean}

Returns:
Type: 
boolean

(static) onAudioStreamLoaded() → {void}

Returns:
Type: 
void

(static) onBackdropImageLoaded() → {void}

Returns:
Type: 
void

(static) onButtonSelectedChange() → {void}

Event handler when user selected a different playback button

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Process key press events

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onMetaDataLoaded() → {void}

Returns:
Type: 
void

(static) onScreensaverTimeoutLoaded() → {void}

Returns:
Type: 
void

(static) pageContentChanged() → {void}

Update values on screen when page content changes

Returns:
Type: 
void

(static) playAction() → {boolean}

Returns:
Type: 
boolean

(static) previousClicked() → {boolean}

Returns:
Type: 
boolean

(static) resetLoopModeToDefault() → {void}

Returns:
Type: 
void

(static) screenSaverActive() → {boolean}

Returns:
Type: 
boolean

(static) setBackdropImage(data) → {void}

Add backdrop image to screen

Parameters:
NameTypeDescription
datadynamic
Returns:
Type: 
void

(static) setLoopButtonImage() → {void}

Returns:
Type: 
void

(static) setOnScreenTextValues(json) → {void}

Populate on screen text variables

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Set poster image on screen

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Set screen's title text

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setShuffleIconState() → {void}

Returns:
Type: 
void

(static) setTrackNumberDisplay() → {void}

Returns:
Type: 
void

(static) setupAnimationTasks() → {void}

Returns:
Type: 
void

(static) setupAudioNode() → {void}

Creates audio node used to play song(s)

Returns:
Type: 
void

(static) setupButtons() → {void}

Setup playback buttons, default to Play button selected

Returns:
Type: 
void

(static) setupDataTasks() → {void}

Creates tasks to gather data needed to render Scene and play song

Returns:
Type: 
void

(static) setupInfoNodes() → {void}

Returns:
Type: 
void

(static) setupScreenSaver() → {void}

Returns:
Type: 
void

(static) shuffleClicked() → {boolean}

Returns:
Type: 
boolean

(static) startScreenSaver() → {void}

Returns:
Type: 
void

(static) toggleShuffleEnabled() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-AudioTrackListItem.html b/docs/api/module-AudioTrackListItem.html index 1fb67f803c..18323f9f52 100644 --- a/docs/api/module-AudioTrackListItem.html +++ b/docs/api/module-AudioTrackListItem.html @@ -1,3 +1,3 @@ Module: AudioTrackListItem
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ButtonGroupHoriz.html b/docs/api/module-ButtonGroupHoriz.html index f6aa0265aa..46ab223a79 100644 --- a/docs/api/module-ButtonGroupHoriz.html +++ b/docs/api/module-ButtonGroupHoriz.html @@ -1,3 +1,3 @@ Module: ButtonGroupHoriz
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ButtonGroupVert.html b/docs/api/module-ButtonGroupVert.html index 2ac57db55c..37b4969b17 100644 --- a/docs/api/module-ButtonGroupVert.html +++ b/docs/api/module-ButtonGroupVert.html @@ -1,3 +1,3 @@ Module: ButtonGroupVert
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onFocusButtonChanged() → {void}

Returns:
Type: 
void

(static) onFocusChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onFocusButtonChanged() → {void}

Returns:
Type: 
void

(static) onFocusChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ChannelData.html b/docs/api/module-ChannelData.html index 135cacaf3e..b2bad74363 100644 --- a/docs/api/module-ChannelData.html +++ b/docs/api/module-ChannelData.html @@ -1,3 +1,3 @@ Module: ChannelData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-Clock.html b/docs/api/module-Clock.html index bb09810f4e..94e0171579 100644 --- a/docs/api/module-Clock.html +++ b/docs/api/module-Clock.html @@ -1,3 +1,3 @@ Module: Clock
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-CollectionData.html b/docs/api/module-CollectionData.html index 00aa162251..bc5dbb4f68 100644 --- a/docs/api/module-CollectionData.html +++ b/docs/api/module-CollectionData.html @@ -1,3 +1,3 @@ Module: CollectionData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ConfigData.html b/docs/api/module-ConfigData.html index c5221a56ba..5594b50561 100644 --- a/docs/api/module-ConfigData.html +++ b/docs/api/module-ConfigData.html @@ -1,3 +1,3 @@ Module: ConfigData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ConfigItem.html b/docs/api/module-ConfigItem.html index cb269a24f9..c51b56ae3f 100644 --- a/docs/api/module-ConfigItem.html +++ b/docs/api/module-ConfigItem.html @@ -1,3 +1,3 @@ Module: ConfigItem
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ConfigList.html b/docs/api/module-ConfigList.html index 59b5d6ee5c..aabeb22770 100644 --- a/docs/api/module-ConfigList.html +++ b/docs/api/module-ConfigList.html @@ -1,3 +1,3 @@ Module: ConfigList
On this page

Methods

(static) configListShowDialog(configField) → {void}

Parameters:
NameTypeDescription
configFielddynamic
Returns:
Type: 
void

(static) dismiss_dialog() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDialogButton() → {dynamic}

Returns:
Type: 
dynamic

(static) onItemSelected() → {void}

Returns:
Type: 
void

(static) setData() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) configListShowDialog(configField) → {void}

Parameters:
NameTypeDescription
configFielddynamic
Returns:
Type: 
void

(static) dismiss_dialog() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDialogButton() → {dynamic}

Returns:
Type: 
dynamic

(static) onItemSelected() → {void}

Returns:
Type: 
void

(static) setData() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ExtrasItem.html b/docs/api/module-ExtrasItem.html index 4e19330fbc..414a61bb86 100644 --- a/docs/api/module-ExtrasItem.html +++ b/docs/api/module-ExtrasItem.html @@ -1,3 +1,3 @@ Module: ExtrasItem
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ExtrasRowList.html b/docs/api/module-ExtrasRowList.html index 91ca10dcdb..84f6b9d37f 100644 --- a/docs/api/module-ExtrasRowList.html +++ b/docs/api/module-ExtrasRowList.html @@ -1,3 +1,3 @@ Module: ExtrasRowList
On this page

Methods

(static) addRowSize(newRow) → {void}

Parameters:
NameTypeDescription
newRowdynamic
Returns:
Type: 
void

(static) buildRow(rowTitle, items, imgWdthopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
rowTitlestring
itemsdynamic
imgWdthdynamic<optional>
0
Returns:
Type: 
dynamic

(static) init() → {void}

Returns:
Type: 
void

(static) loadParts(data) → {void}

Parameters:
NameTypeDescription
dataobject
Returns:
Type: 
void

(static) loadPersonVideos(personId) → {void}

Parameters:
NameTypeDescription
personIddynamic
Returns:
Type: 
void

(static) onAdditionalPartsLoaded() → {void}

Returns:
Type: 
void

(static) onLikeThisLoaded() → {void}

Returns:
Type: 
void

(static) onMoviesLoaded() → {void}

Returns:
Type: 
void

(static) onPeopleLoaded() → {void}

Returns:
Type: 
void

(static) onRowItemFocused() → {void}

Returns:
Type: 
void

(static) onRowItemSelected() → {void}

Returns:
Type: 
void

(static) onSeriesLoaded() → {void}

Returns:
Type: 
void

(static) onShowsLoaded() → {void}

Returns:
Type: 
void

(static) onSpecialFeaturesLoaded() → {dynamic}

Returns:
Type: 
dynamic

(static) updateSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) addRowSize(newRow) → {void}

Parameters:
NameTypeDescription
newRowdynamic
Returns:
Type: 
void

(static) buildRow(rowTitle, items, imgWdthopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
rowTitlestring
itemsdynamic
imgWdthdynamic<optional>
0
Returns:
Type: 
dynamic

(static) init() → {void}

Returns:
Type: 
void

(static) loadParts(data) → {void}

Parameters:
NameTypeDescription
dataobject
Returns:
Type: 
void

(static) loadPersonVideos(personId) → {void}

Parameters:
NameTypeDescription
personIddynamic
Returns:
Type: 
void

(static) onAdditionalPartsLoaded() → {void}

Returns:
Type: 
void

(static) onLikeThisLoaded() → {void}

Returns:
Type: 
void

(static) onMoviesLoaded() → {void}

Returns:
Type: 
void

(static) onPeopleLoaded() → {void}

Returns:
Type: 
void

(static) onRowItemFocused() → {void}

Returns:
Type: 
void

(static) onRowItemSelected() → {void}

Returns:
Type: 
void

(static) onSeriesLoaded() → {void}

Returns:
Type: 
void

(static) onShowsLoaded() → {void}

Returns:
Type: 
void

(static) onSpecialFeaturesLoaded() → {dynamic}

Returns:
Type: 
dynamic

(static) updateSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-FavoriteItemsTask.html b/docs/api/module-FavoriteItemsTask.html index 00d4e1c207..53e149c0e3 100644 --- a/docs/api/module-FavoriteItemsTask.html +++ b/docs/api/module-FavoriteItemsTask.html @@ -1,3 +1,3 @@ Module: FavoriteItemsTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-FolderData.html b/docs/api/module-FolderData.html index f2249bc340..6617b29412 100644 --- a/docs/api/module-FolderData.html +++ b/docs/api/module-FolderData.html @@ -1,3 +1,3 @@ Module: FolderData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-GetFiltersTask.html b/docs/api/module-GetFiltersTask.html index c581e57283..1b33f48e67 100644 --- a/docs/api/module-GetFiltersTask.html +++ b/docs/api/module-GetFiltersTask.html @@ -1,3 +1,3 @@ Module: GetFiltersTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-GetNextEpisodeTask.html b/docs/api/module-GetNextEpisodeTask.html index 089d2c95cd..2072739570 100644 --- a/docs/api/module-GetNextEpisodeTask.html +++ b/docs/api/module-GetNextEpisodeTask.html @@ -1,3 +1,3 @@ Module: GetNextEpisodeTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-GetPlaybackInfoTask.html b/docs/api/module-GetPlaybackInfoTask.html index 931cad0105..5fddc7e746 100644 --- a/docs/api/module-GetPlaybackInfoTask.html +++ b/docs/api/module-GetPlaybackInfoTask.html @@ -1,3 +1,3 @@ Module: GetPlaybackInfoTask
On this page

Methods

(static) GetTranscodingStats(deviceSession) → {dynamic}

Parameters:
NameTypeDescription
deviceSessiondynamic
Returns:
Type: 
dynamic

(static) ItemPostPlaybackInfo(id, mediaSourceIdopt, audioTrackIndexopt, startTimeTicksopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
mediaSourceIdstring<optional>
""
audioTrackIndexinteger<optional>
-1
startTimeTickslonginteger<optional>
0
Returns:
Type: 
dynamic

(static) getDisplayBitrate(bitrate) → {dynamic}

Parameters:
NameTypeDescription
bitratedynamic
Returns:
Type: 
dynamic

(static) getPlaybackInfoTask() → {void}

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.

Returns:
Type: 
void

(static) havePlaybackInfo() → {dynamic}

Returns:
Type: 
dynamic

(static) init() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) GetTranscodingStats(deviceSession) → {dynamic}

Parameters:
NameTypeDescription
deviceSessiondynamic
Returns:
Type: 
dynamic

(static) ItemPostPlaybackInfo(id, mediaSourceIdopt, audioTrackIndexopt, startTimeTicksopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
mediaSourceIdstring<optional>
""
audioTrackIndexinteger<optional>
-1
startTimeTickslonginteger<optional>
0
Returns:
Type: 
dynamic

(static) getDisplayBitrate(bitrate) → {dynamic}

Parameters:
NameTypeDescription
bitratedynamic
Returns:
Type: 
dynamic

(static) getPlaybackInfoTask() → {void}

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.

Returns:
Type: 
void

(static) havePlaybackInfo() → {dynamic}

Returns:
Type: 
dynamic

(static) init() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-GetShuffleEpisodesTask.html b/docs/api/module-GetShuffleEpisodesTask.html index 6a12b3e741..168d10b031 100644 --- a/docs/api/module-GetShuffleEpisodesTask.html +++ b/docs/api/module-GetShuffleEpisodesTask.html @@ -1,3 +1,3 @@ Module: GetShuffleEpisodesTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-GridItem.html b/docs/api/module-GridItem.html index 51867585a0..82cbabd89c 100644 --- a/docs/api/module-GridItem.html +++ b/docs/api/module-GridItem.html @@ -1,3 +1,3 @@ Module: GridItem
On this page

Methods

(static) focusChanged() → {void}

Display or hide title Visibility on focus change

Returns:
Type: 
void

(static) focusChanging() → {void}

Use FocusPercent to animate scaling of Poser Image

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onPosterLoadStatusChanged() → {void}

Hide backdrop and text when poster loaded

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) focusChanged() → {void}

Display or hide title Visibility on focus change

Returns:
Type: 
void

(static) focusChanging() → {void}

Use FocusPercent to animate scaling of Poser Image

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onPosterLoadStatusChanged() → {void}

Hide backdrop and text when poster loaded

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-GridItemSmall.html b/docs/api/module-GridItemSmall.html index 953325cfee..089a27ec0c 100644 --- a/docs/api/module-GridItemSmall.html +++ b/docs/api/module-GridItemSmall.html @@ -1,3 +1,3 @@ Module: GridItemSmall
On this page

Methods

(static) focusChanged() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onPosterLoadStatusChanged() → {void}

Hide backdrop and text when poster loaded

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) focusChanged() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onPosterLoadStatusChanged() → {void}

Hide backdrop and text when poster loaded

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-Home.html b/docs/api/module-Home.html index 38391c07d3..2dc22c34dd 100644 --- a/docs/api/module-Home.html +++ b/docs/api/module-Home.html @@ -1,3 +1,3 @@ Module: Home
On this page

Methods

(static) OnScreenShown() → {void}

JFScreen hook that gets ran as needed. Used to update the focus, the state of the data, and tells the server about the device profile

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) loadLibraries() → {void}

Returns:
Type: 
void

(static) postFinished() → {void}

Triggered by m.postTask after completing a post. Empty the task data when finished.

Returns:
Type: 
void

(static) refresh() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) OnScreenShown() → {void}

JFScreen hook that gets ran as needed. Used to update the focus, the state of the data, and tells the server about the device profile

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) loadLibraries() → {void}

Returns:
Type: 
void

(static) postFinished() → {void}

Triggered by m.postTask after completing a post. Empty the task data when finished.

Returns:
Type: 
void

(static) refresh() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-HomeData.html b/docs/api/module-HomeData.html index 859a7c8b1a..9d4ac7a418 100644 --- a/docs/api/module-HomeData.html +++ b/docs/api/module-HomeData.html @@ -1,3 +1,3 @@ Module: HomeData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-HomeItem.html b/docs/api/module-HomeItem.html index 9f8ad7cd79..a1abc8ed55 100644 --- a/docs/api/module-HomeItem.html +++ b/docs/api/module-HomeItem.html @@ -1,3 +1,3 @@ Module: HomeItem
On this page

Methods

(static) drawProgressBar(itemData) → {void}

Draws and animates item progress bar

Parameters:
NameTypeDescription
itemDatadynamic
Returns:
Type: 
void

(static) focusChanged() → {void}

Enable title scrolling based on item Focus

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onPosterLoadStatusChanged() → {void}

Hide backdrop and icon when poster loaded

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) drawProgressBar(itemData) → {void}

Draws and animates item progress bar

Parameters:
NameTypeDescription
itemDatadynamic
Returns:
Type: 
void

(static) focusChanged() → {void}

Enable title scrolling based on item Focus

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onPosterLoadStatusChanged() → {void}

Hide backdrop and icon when poster loaded

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-HomeRowItemSizes.html b/docs/api/module-HomeRowItemSizes.html new file mode 100644 index 0000000000..142d31c539 --- /dev/null +++ b/docs/api/module-HomeRowItemSizes.html @@ -0,0 +1,3 @@ +Module: HomeRowItemSizes
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-HomeRows.html b/docs/api/module-HomeRows.html index 04d1d16d1a..58fa1a1826 100644 --- a/docs/api/module-HomeRows.html +++ b/docs/api/module-HomeRows.html @@ -1,3 +1,3 @@ Module: HomeRows
On this page

Methods

(static) addHomeSection(content, sizeArray, sectionName) → {boolean}

Adds a new home section to the home rows. Returns a boolean indicating whether the section was handled.

Parameters:
NameTypeDescription
contentdynamic
sizeArraydynamic
sectionNamestring
Returns:
Type: 
boolean

(static) createContinueWatchingRow(content, sizeArray) → {void}

Create a row displaying items the user can continue watching

Parameters:
NameTypeDescription
contentdynamic
sizeArraydynamic
Returns:
Type: 
void

(static) createFavoritesRow(content, sizeArray) → {void}

Create a row displaying items from the user's favorites list

Parameters:
NameTypeDescription
contentdynamic
sizeArraydynamic
Returns:
Type: 
void

(static) createLatestInRows(content, sizeArray) → {void}

Create a row displaying latest items in each of the user's libraries

Parameters:
NameTypeDescription
contentdynamic
sizeArraydynamic
Returns:
Type: 
void

(static) createLibraryRow(content, sizeArray) → {void}

Create a row displaying the user's libraries

Parameters:
NameTypeDescription
contentdynamic
sizeArraydynamic
Returns:
Type: 
void

(static) createLiveTVRow(content, sizeArray) → {void}

Create a row displaying the live tv now on section

Parameters:
NameTypeDescription
contentdynamic
sizeArraydynamic
Returns:
Type: 
void

(static) createNextUpRow(content, sizeArray) → {void}

Create a row displaying next episodes up to watch

Parameters:
NameTypeDescription
contentdynamic
sizeArraydynamic
Returns:
Type: 
void

(static) filterNodeArray(nodeArray, nodeKey, excludeArray) → {object}

Parameters:
NameTypeDescription
nodeArrayobject
nodeKeystring
excludeArrayobject
Returns:
Type: 
object

(static) init() → {void}

Returns:
Type: 
void

(static) itemSelected() → {void}

Returns:
Type: 
void

(static) loadLibraries() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onLibrariesLoaded() → {void}

Returns:
Type: 
void

(static) removeHomeSection(sectionType) → {void}

Removes a home section from the home rows

Parameters:
NameTypeDescription
sectionTypestring
Returns:
Type: 
void

(static) updateContinueWatchingItems() → {void}

Returns:
Type: 
void

(static) updateFavoritesItems() → {void}

Returns:
Type: 
void

(static) updateHomeRows() → {void}

Update home row data

Returns:
Type: 
void

(static) updateLatestInRows() → {void}

Iterate over user's libraries and update data for each Latest In section

Returns:
Type: 
void

(static) updateLatestItems(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) updateNextUpItems() → {void}

Returns:
Type: 
void

(static) updateOnNowItems() → {void}

Returns:
Type: 
void

(static) updateSize() → {void}

Returns:
Type: 
void

(static) updateSizeArray(rowItemSize, rowIndexopt, actionopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
rowItemSizedynamic
rowIndexdynamic<optional>
invalid
actiondynamic<optional>
"insert"
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) addHomeSection(sectionType) → {boolean}

addHomeSection: Adds a new home section to the home rows.

Parameters:
NameTypeDescription
sectionTypestring

Type of section to add

Returns:
  • indicating if the section was handled
Type: 
boolean

(static) createContinueWatchingRow() → {void}

createContinueWatchingRow: Creates a row displaying items the user can continue watching

Returns:
Type: 
void

(static) createFavoritesRow() → {void}

createFavoritesRow: Creates a row displaying items from the user's favorites list

Returns:
Type: 
void

(static) createLatestInRows() → {void}

createLatestInRows: Creates a row displaying latest items in each of the user's libraries

Returns:
Type: 
void

(static) createLibraryRow() → {void}

createLibraryRow: Creates a row displaying the user's libraries

Returns:
Type: 
void

(static) createLiveTVRow() → {void}

createLiveTVRow: Creates a row displaying the live tv now on section

Returns:
Type: 
void

(static) createNextUpRow() → {void}

createNextUpRow: Creates a row displaying next episodes up to watch

Returns:
Type: 
void

(static) filterNodeArray(nodeArray, nodeKey, excludeArray) → {object}

Parameters:
NameTypeDescription
nodeArrayobject
nodeKeystring
excludeArrayobject
Returns:
Type: 
object

(static) getOriginalSectionIndex(sectionName) → {integer}

getOriginalSectionIndex: Gets the index of a section from user settings and adds count of currently known latest media sections

Parameters:
NameTypeDescription
sectionNamestring

Name of section we're looking up

Returns:
  • indicating index of section taking latest media sections into account
Type: 
integer

(static) getSectionIndex(sectionTitle) → {integer}

getSectionIndex: Returns index of requested section in home row content

Parameters:
NameTypeDescription
sectionTitlestring

Title of section we're checking for

Returns:
  • indicating index of request section
Type: 
integer

(static) init() → {void}

Returns:
Type: 
void

(static) itemSelected() → {void}

Returns:
Type: 
void

(static) loadLibraries() → {void}

Returns:
Type: 
void

(static) loadingTimerComplete() → {void}

loadingTimerComplete: Event handler for when loading wait time has expired

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onLibrariesLoaded() → {void}

onLibrariesLoaded: Handler when LoadLibrariesTask returns data

Returns:
Type: 
void

(static) processUserSections() → {void}

processUserSections: Loop through user's chosen home section settings and generate the content for each row

Returns:
Type: 
void

(static) removeHomeSection(sectionToRemove, sectionTitleToRemove) → {void}

removeHomeSection: Removes a home section from the home rows

Parameters:
NameTypeDescription
sectionToRemovestring

Title property of section we're removing

sectionTitleToRemovestring
Returns:
Type: 
void

(static) sectionExists(sectionTitle) → {boolean}

sectionExists: Checks if passed section exists in home row content

Parameters:
NameTypeDescription
sectionTitlestring

Title of section we're checking for

Returns:
  • indicating if the section currently exists in the home row content
Type: 
boolean

(static) setRowItemSize() → {void}

setRowItemSize: Loops through all home sections and sets the correct item sizes per row

Returns:
Type: 
void

(static) updateContinueWatchingItems() → {void}

updateContinueWatchingItems: Processes LoadContinueWatchingTask content. Removes, Creates, or Updates continue watching row as needed

Returns:
Type: 
void

(static) updateFavoritesItems() → {void}

updateFavoritesItems: Processes LoadFavoritesTask content. Removes, Creates, or Updates favorites row as needed

Returns:
Type: 
void

(static) updateHomeRows() → {void}

updateHomeRows: Update function exposed to outside components

Returns:
Type: 
void

(static) updateLatestItems(msg) → {void}

updateLatestItems: Processes LoadItemsTask content. Removes, Creates, or Updates latest in {library} row as needed

Parameters:
NameTypeDescription
msgdynamic

LoadItemsTask

Returns:
Type: 
void

(static) updateNextUpItems() → {void}

updateNextUpItems: Processes LoadNextUpTask content. Removes, Creates, or Updates next up row as needed

Returns:
Type: 
void

(static) updateOnNowItems() → {void}

updateOnNowItems: Processes LoadOnNowTask content. Removes, Creates, or Updates latest in on now row as needed

Returns:
Type: 
void

(static) updateSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-IconButton.html b/docs/api/module-IconButton.html index 79650379f4..3e2d42d915 100644 --- a/docs/api/module-IconButton.html +++ b/docs/api/module-IconButton.html @@ -1,3 +1,3 @@ Module: IconButton
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onBackgroundChanged() → {void}

Returns:
Type: 
void

(static) onFocusChanged() → {void}

Returns:
Type: 
void

(static) onHeightChanged() → {void}

Returns:
Type: 
void

(static) onIconChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onPaddingChanged() → {void}

Returns:
Type: 
void

(static) onTextChanged() → {void}

Returns:
Type: 
void

(static) onWidthChanged() → {void}

Returns:
Type: 
void

(static) setIconSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onBackgroundChanged() → {void}

Returns:
Type: 
void

(static) onFocusChanged() → {void}

Returns:
Type: 
void

(static) onHeightChanged() → {void}

Returns:
Type: 
void

(static) onIconChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onPaddingChanged() → {void}

Returns:
Type: 
void

(static) onTextChanged() → {void}

Returns:
Type: 
void

(static) onWidthChanged() → {void}

Returns:
Type: 
void

(static) setIconSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-Image.html b/docs/api/module-Image.html index 1464f370ed..6031fc21e6 100644 --- a/docs/api/module-Image.html +++ b/docs/api/module-Image.html @@ -1,3 +1,3 @@ Module: Image
On this page

Methods

(static) ImageURL(id, versionopt, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
iddynamic
versiondynamic<optional>
"Primary"
paramsdynamic<optional>
{}
Returns:
Type: 
dynamic

(static) ItemImages(idopt, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring<optional>
""
paramsobject<optional>
{}
Returns:
Type: 
dynamic

(static) PosterImage(id, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
paramsobject<optional>
{}
Returns:
Type: 
dynamic

(static) UserImageURL(id, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
iddynamic
paramsdynamic<optional>
{}
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) ImageURL(id, versionopt, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
iddynamic
versiondynamic<optional>
"Primary"
paramsdynamic<optional>
{}
Returns:
Type: 
dynamic

(static) ItemImages(idopt, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring<optional>
""
paramsobject<optional>
{}
Returns:
Type: 
dynamic

(static) PosterImage(id, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
paramsobject<optional>
{}
Returns:
Type: 
dynamic

(static) UserImageURL(id, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
iddynamic
paramsdynamic<optional>
{}
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ImageData.html b/docs/api/module-ImageData.html index 16900ffe6e..8fd62ee042 100644 --- a/docs/api/module-ImageData.html +++ b/docs/api/module-ImageData.html @@ -1,3 +1,3 @@ Module: ImageData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-IntegerKeyboard.html b/docs/api/module-IntegerKeyboard.html index ae39e33cef..170a000e07 100644 --- a/docs/api/module-IntegerKeyboard.html +++ b/docs/api/module-IntegerKeyboard.html @@ -1,3 +1,3 @@ Module: IntegerKeyboard
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ItemGrid.html b/docs/api/module-ItemGrid.html index a90237f911..b09c062568 100644 --- a/docs/api/module-ItemGrid.html +++ b/docs/api/module-ItemGrid.html @@ -1,3 +1,3 @@ Module: ItemGrid
On this page

Methods

(static) ItemDataLoaded(msg) → {void}

Handle loaded data, and add to Grid

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) SetBackground(backgroundUri) → {void}

Set Background Image

Parameters:
NameTypeDescription
backgroundUristring
Returns:
Type: 
void

(static) SetUpOptions() → {void}

Data to display when options button selected

Returns:
Type: 
void

(static) getCollectionType() → {string}

Return parent collection type

Returns:
Type: 
string

(static) getItemFocused() → {dynamic}

Returns Focused Item

Returns:
Type: 
dynamic

(static) inStringArray(array, searchValue) → {boolean}

Search string array for search value. Return if it's found

Parameters:
NameTypeDescription
arraydynamic
searchValuedynamic
Returns:
Type: 
boolean

(static) init() → {void}

Returns:
Type: 
void

(static) loadInitialItems() → {void}

Load initial set of Data

Returns:
Type: 
void

(static) loadMoreData() → {void}

Load next set of items

Returns:
Type: 
void

(static) newBGLoaded() → {void}

When Image Loading Status changes

Returns:
Type: 
void

(static) onChannelFocused(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onChannelSelected(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onGenreItemSelected() → {void}

Genre Item Selected

Returns:
Type: 
void

(static) onItemFocused() → {void}

Handle new item being focused

Returns:
Type: 
void

(static) onItemSelected() → {void}

Item Selected

Returns:
Type: 
void

(static) onItemalphaSelected() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onvoiceFilter() → {void}

Returns:
Type: 
void

(static) optionsClosed() → {void}

Check if options updated and any reloading required

Returns:
Type: 
void

(static) setBoxsetsOptions(options) → {void}

Set Boxset view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setDefaultOptions(options) → {void}

Set Default view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setLiveTvOptions(options) → {void}

Set Live TV view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setMoviesOptions(options) → {void}

Set Movies view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setMusicOptions(options) → {void}

Set Music view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setPhotoAlbumOptions(options) → {void}

Set Photo Album view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setTvShowsOptions(options) → {void}

Set TV Show view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) showTVGuide() → {void}

Returns:
Type: 
void

(static) swapDone() → {void}

Swap Complete

Returns:
Type: 
void

(static) updateTitle() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) ItemDataLoaded(msg) → {void}

Handle loaded data, and add to Grid

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) SetBackground(backgroundUri) → {void}

Set Background Image

Parameters:
NameTypeDescription
backgroundUristring
Returns:
Type: 
void

(static) SetUpOptions() → {void}

Data to display when options button selected

Returns:
Type: 
void

(static) getCollectionType() → {string}

Return parent collection type

Returns:
Type: 
string

(static) getItemFocused() → {dynamic}

Returns Focused Item

Returns:
Type: 
dynamic

(static) inStringArray(array, searchValue) → {boolean}

Search string array for search value. Return if it's found

Parameters:
NameTypeDescription
arraydynamic
searchValuedynamic
Returns:
Type: 
boolean

(static) init() → {void}

Returns:
Type: 
void

(static) loadInitialItems() → {void}

Load initial set of Data

Returns:
Type: 
void

(static) loadMoreData() → {void}

Load next set of items

Returns:
Type: 
void

(static) newBGLoaded() → {void}

When Image Loading Status changes

Returns:
Type: 
void

(static) onChannelFocused(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onChannelSelected(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onGenreItemSelected() → {void}

Genre Item Selected

Returns:
Type: 
void

(static) onItemFocused() → {void}

Handle new item being focused

Returns:
Type: 
void

(static) onItemSelected() → {void}

Item Selected

Returns:
Type: 
void

(static) onItemalphaSelected() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onvoiceFilter() → {void}

Returns:
Type: 
void

(static) optionsClosed() → {void}

Check if options updated and any reloading required

Returns:
Type: 
void

(static) setBoxsetsOptions(options) → {void}

Set Boxset view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setDefaultOptions(options) → {void}

Set Default view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setLiveTvOptions(options) → {void}

Set Live TV view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setMoviesOptions(options) → {void}

Set Movies view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setMusicOptions(options) → {void}

Set Music view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setPhotoAlbumOptions(options) → {void}

Set Photo Album view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setTvShowsOptions(options) → {void}

Set TV Show view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) showTVGuide() → {void}

Returns:
Type: 
void

(static) swapDone() → {void}

Swap Complete

Returns:
Type: 
void

(static) updateTitle() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ItemGridOptions.html b/docs/api/module-ItemGridOptions.html index 2a25741c3e..5fee59000e 100644 --- a/docs/api/module-ItemGridOptions.html +++ b/docs/api/module-ItemGridOptions.html @@ -1,3 +1,3 @@ Module: ItemGridOptions
On this page

Methods

(static) buttonFocusChanged() → {void}

Switch menu shown when button focus changes

Returns:
Type: 
void

(static) hideChecklist() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isFilterMenuDataValid() → {boolean}

Check if data for Filter Menu is valid

Returns:
Type: 
boolean

(static) onFilterFocusChange() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) optionsSet() → {void}

Returns:
Type: 
void

(static) saveFavoriteItemSelected(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) setHeartColor(color) → {void}

Parameters:
NameTypeDescription
colorstring
Returns:
Type: 
void

(static) showChecklist() → {void}

Returns:
Type: 
void

(static) toggleFavorite() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) buttonFocusChanged() → {void}

Switch menu shown when button focus changes

Returns:
Type: 
void

(static) hideChecklist() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isFilterMenuDataValid() → {boolean}

Check if data for Filter Menu is valid

Returns:
Type: 
boolean

(static) onFilterFocusChange() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) optionsSet() → {void}

Returns:
Type: 
void

(static) saveFavoriteItemSelected(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) setHeartColor(color) → {void}

Parameters:
NameTypeDescription
colorstring
Returns:
Type: 
void

(static) showChecklist() → {void}

Returns:
Type: 
void

(static) toggleFavorite() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-Items.html b/docs/api/module-Items.html index 109285c22d..b891738423 100644 --- a/docs/api/module-Items.html +++ b/docs/api/module-Items.html @@ -1,3 +1,3 @@ Module: Items
On this page

Methods

(static) AppearsOnList(id) → {dynamic}

Get list of albums an artist appears on

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) ArtistOverview(name) → {dynamic}

Music Artist Data

Parameters:
NameTypeDescription
namestring
Returns:
Type: 
dynamic

(static) AudioItem(id) → {dynamic}

Get Songs that are on an Album

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) AudioStream(id) → {dynamic}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) BackdropImage(id) → {dynamic}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) CreateArtistMix(id) → {dynamic}

Get Instant Mix based on item

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) CreateInstantMix(id) → {dynamic}

Get Instant Mix based on item

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) GetIntroVideos(id) → {dynamic}

Get Intro Videos for an item

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) GetSongsByArtist(id, paramsopt) → {dynamic}

Get list of songs belonging to an artist

Parameters:
NameTypeAttributesDefaultDescription
idstring
paramsobject<optional>
{}
Returns:
Type: 
dynamic

(static) ItemGetPlaybackInfo(id, startTimeTicksopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
startTimeTickslonginteger<optional>
0
Returns:
Type: 
dynamic

(static) ItemMetaData(id) → {dynamic}

MetaData about an item

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) ItemPostPlaybackInfo(id, mediaSourceIdopt, audioTrackIndexopt, subtitleTrackIndexopt, startTimeTicksopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
mediaSourceIdstring<optional>
""
audioTrackIndexinteger<optional>
-1
subtitleTrackIndexinteger<optional>
-1
startTimeTickslonginteger<optional>
0
Returns:
Type: 
dynamic

(static) MusicAlbumList(id) → {dynamic}

Get list of albums belonging to an artist

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) MusicSongList(id) → {dynamic}

Get Songs that are on an Album

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) PlaylistItemList(id) → {dynamic}

Get Items that are under the provided item

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) TVEpisodeShuffleList(show_id) → {dynamic}

Parameters:
NameTypeDescription
show_idstring
Returns:
Type: 
dynamic

(static) TVEpisodes(showId, seasonId) → {dynamic}

Returns a list of TV Shows for a given TV Show and season Accepts strings for the TV Show Id and the season Id

Parameters:
NameTypeDescription
showIdstring
seasonIdstring
Returns:
Type: 
dynamic

(static) TVSeasonExtras(seasonId) → {dynamic}

Returns a list of extra features for a TV Show season Accepts a string that is a TV Show season id

Parameters:
NameTypeDescription
seasonIdstring
Returns:
Type: 
dynamic

(static) TVSeasons(id) → {dynamic}

Seasons for a TV Show

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) searchMedia(query) → {dynamic}

Search across all libraries

Parameters:
NameTypeDescription
querystring
Returns:
Type: 
dynamic

(static) useTranscodeAudioStream(playbackInfo) → {dynamic}

Parameters:
NameTypeDescription
playbackInfodynamic
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) AppearsOnList(id) → {dynamic}

Get list of albums an artist appears on

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) ArtistOverview(name) → {dynamic}

Music Artist Data

Parameters:
NameTypeDescription
namestring
Returns:
Type: 
dynamic

(static) AudioItem(id) → {dynamic}

Get Songs that are on an Album

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) AudioStream(id) → {dynamic}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) BackdropImage(id) → {dynamic}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) CreateArtistMix(id) → {dynamic}

Get Instant Mix based on item

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) CreateInstantMix(id) → {dynamic}

Get Instant Mix based on item

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) GetIntroVideos(id) → {dynamic}

Get Intro Videos for an item

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) GetSongsByArtist(id, paramsopt) → {dynamic}

Get list of songs belonging to an artist

Parameters:
NameTypeAttributesDefaultDescription
idstring
paramsobject<optional>
{}
Returns:
Type: 
dynamic

(static) ItemGetPlaybackInfo(id, startTimeTicksopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
startTimeTickslonginteger<optional>
0
Returns:
Type: 
dynamic

(static) ItemMetaData(id) → {dynamic}

MetaData about an item

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) ItemPostPlaybackInfo(id, mediaSourceIdopt, audioTrackIndexopt, subtitleTrackIndexopt, startTimeTicksopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
mediaSourceIdstring<optional>
""
audioTrackIndexinteger<optional>
-1
subtitleTrackIndexinteger<optional>
-1
startTimeTickslonginteger<optional>
0
Returns:
Type: 
dynamic

(static) MusicAlbumList(id) → {dynamic}

Get list of albums belonging to an artist

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) MusicSongList(id) → {dynamic}

Get Songs that are on an Album

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) PlaylistItemList(id) → {dynamic}

Get Items that are under the provided item

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) TVEpisodeShuffleList(show_id) → {dynamic}

Parameters:
NameTypeDescription
show_idstring
Returns:
Type: 
dynamic

(static) TVEpisodes(showId, seasonId) → {dynamic}

Returns a list of TV Shows for a given TV Show and season Accepts strings for the TV Show Id and the season Id

Parameters:
NameTypeDescription
showIdstring
seasonIdstring
Returns:
Type: 
dynamic

(static) TVSeasonExtras(seasonId) → {dynamic}

Returns a list of extra features for a TV Show season Accepts a string that is a TV Show season id

Parameters:
NameTypeDescription
seasonIdstring
Returns:
Type: 
dynamic

(static) TVSeasons(id) → {dynamic}

Seasons for a TV Show

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) searchMedia(query) → {dynamic}

Search across all libraries

Parameters:
NameTypeDescription
querystring
Returns:
Type: 
dynamic

(static) useTranscodeAudioStream(playbackInfo) → {dynamic}

Parameters:
NameTypeDescription
playbackInfodynamic
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-JFButton.html b/docs/api/module-JFButton.html index 00716002fe..271fc6bb89 100644 --- a/docs/api/module-JFButton.html +++ b/docs/api/module-JFButton.html @@ -1,3 +1,3 @@ Module: JFButton
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-JFButtons.html b/docs/api/module-JFButtons.html index 23e19b6f02..58e022f775 100644 --- a/docs/api/module-JFButtons.html +++ b/docs/api/module-JFButtons.html @@ -1,3 +1,3 @@ Module: JFButtons
On this page

Methods

(static) focusChanged() → {void}

Change opacity of the highlighted menu item based on focus

Returns:
Type: 
void

(static) highlightSelected(index, animateopt) → {void}

Highlight selected menu option

Parameters:
NameTypeAttributesDefaultDescription
indexinteger
animatedynamic<optional>
true
Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) renderChanged() → {void}

When options are fully displayed, set focus and selected option

Returns:
Type: 
void

(static) selectedIndexChanged() → {void}

When Selected Index set, ensure it is the one Focused

Returns:
Type: 
void

(static) showButtons() → {void}

Returns:
Type: 
void

(static) updateButtons() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) focusChanged() → {void}

Change opacity of the highlighted menu item based on focus

Returns:
Type: 
void

(static) highlightSelected(index, animateopt) → {void}

Highlight selected menu option

Parameters:
NameTypeAttributesDefaultDescription
indexinteger
animatedynamic<optional>
true
Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) renderChanged() → {void}

When options are fully displayed, set focus and selected option

Returns:
Type: 
void

(static) selectedIndexChanged() → {void}

When Selected Index set, ensure it is the one Focused

Returns:
Type: 
void

(static) showButtons() → {void}

Returns:
Type: 
void

(static) updateButtons() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-JFGroup.html b/docs/api/module-JFGroup.html index 433ff8aeef..cf656e9cdb 100644 --- a/docs/api/module-JFGroup.html +++ b/docs/api/module-JFGroup.html @@ -1,3 +1,3 @@ Module: JFGroup
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-JFMessageDialog.html b/docs/api/module-JFMessageDialog.html index ff32d3b8f9..9d3497b275 100644 --- a/docs/api/module-JFMessageDialog.html +++ b/docs/api/module-JFMessageDialog.html @@ -1,3 +1,3 @@ Module: JFMessageDialog
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) redraw() → {void}

Returns:
Type: 
void

(static) updateMessage() → {void}

Returns:
Type: 
void

(static) updateOptions() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) redraw() → {void}

Returns:
Type: 
void

(static) updateMessage() → {void}

Returns:
Type: 
void

(static) updateOptions() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-JFOverhang.html b/docs/api/module-JFOverhang.html index 56e608ef82..6ce57322b0 100644 --- a/docs/api/module-JFOverhang.html +++ b/docs/api/module-JFOverhang.html @@ -1,3 +1,3 @@ Module: JFOverhang
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onVisibleChange() → {void}

Returns:
Type: 
void

(static) resetTime() → {void}

Returns:
Type: 
void

(static) setClockVisibility() → {void}

Returns:
Type: 
void

(static) setRightSeperatorVisibility() → {void}

Returns:
Type: 
void

(static) updateOptions() → {void}

Returns:
Type: 
void

(static) updateTime() → {void}

Returns:
Type: 
void

(static) updateTimeDisplay() → {void}

Returns:
Type: 
void

(static) updateTitle() → {void}

Returns:
Type: 
void

(static) updateUser() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onVisibleChange() → {void}

Returns:
Type: 
void

(static) resetTime() → {void}

Returns:
Type: 
void

(static) setClockVisibility() → {void}

Returns:
Type: 
void

(static) setRightSeperatorVisibility() → {void}

Returns:
Type: 
void

(static) updateOptions() → {void}

Returns:
Type: 
void

(static) updateTime() → {void}

Returns:
Type: 
void

(static) updateTimeDisplay() → {void}

Returns:
Type: 
void

(static) updateTitle() → {void}

Returns:
Type: 
void

(static) updateUser() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-JFScene.html b/docs/api/module-JFScene.html index c7c3cd9026..722aae41fa 100644 --- a/docs/api/module-JFScene.html +++ b/docs/api/module-JFScene.html @@ -1,3 +1,3 @@ Module: JFScene
On this page

Methods

(static) disableRemoteChanged() → {void}

Triggered when the disableRemote boolean component field is changed

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isLoadingChanged() → {void}

Triggered when the isLoading boolean component field is changed

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) disableRemoteChanged() → {void}

Triggered when the disableRemote boolean component field is changed

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isLoadingChanged() → {void}

Triggered when the isLoading boolean component field is changed

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-JFScreen.html b/docs/api/module-JFScreen.html index fd49186d02..79c17a25df 100644 --- a/docs/api/module-JFScreen.html +++ b/docs/api/module-JFScreen.html @@ -1,3 +1,3 @@ Module: JFScreen
On this page

Methods

(static) OnScreenHidden() → {void}

Function called when the screen is hidden by the screen manager It is expected that screens override this function if required, to handle focus any actions required on the screen being hidden

Returns:
Type: 
void

(static) OnScreenShown() → {void}

Function called when the screen is displayed by the screen manager It is expected that screens override this function to handle focus managmenet and any other actions required on screen shown

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) OnScreenHidden() → {void}

Function called when the screen is hidden by the screen manager It is expected that screens override this function if required, to handle focus any actions required on the screen being hidden

Returns:
Type: 
void

(static) OnScreenShown() → {void}

Function called when the screen is displayed by the screen manager It is expected that screens override this function to handle focus managmenet and any other actions required on screen shown

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-JFServer.html b/docs/api/module-JFServer.html index 955cd6fca8..6d1b53b537 100644 --- a/docs/api/module-JFServer.html +++ b/docs/api/module-JFServer.html @@ -1,3 +1,3 @@ Module: JFServer
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onFocusPercentChange(event) → {void}

Parameters:
NameTypeDescription
eventdynamic
Returns:
Type: 
void

(static) setTextColor(percentFocused) → {void}

Parameters:
NameTypeDescription
percentFocuseddynamic
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onFocusPercentChange(event) → {void}

Parameters:
NameTypeDescription
eventdynamic
Returns:
Type: 
void

(static) setTextColor(percentFocused) → {void}

Parameters:
NameTypeDescription
percentFocuseddynamic
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-JFVideo.html b/docs/api/module-JFVideo.html index d9d3192126..c09448416a 100644 --- a/docs/api/module-JFVideo.html +++ b/docs/api/module-JFVideo.html @@ -1,3 +1,3 @@ Module: JFVideo
On this page

Methods

(static) ReportPlayback(stateopt) → {void}

Report playback to server

Parameters:
NameTypeAttributesDefaultDescription
statestring<optional>
"update"
Returns:
Type: 
void

(static) bufferCheck(msg) → {void}

Check the the buffering has not hung

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) checkTimeToDisplayNextEpisode() → {void}

Checks if we need to display the Next Episode button

Returns:
Type: 
void

(static) hideNextEpisodeButton() → {void}

Runs hide Next Episode button animation and sets focus back to video

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) loadCaption() → {void}

Returns:
Type: 
void

(static) onAllowCaptionsChange() → {void}

Returns:
Type: 
void

(static) onContentChange() → {void}

Event handler for when video content field changes

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onNextEpisodeDataLoaded() → {void}

Returns:
Type: 
void

(static) onPositionChanged() → {void}

When Video Player state changes

Returns:
Type: 
void

(static) onState(msg) → {void}

When Video Player state changes

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) showNextEpisodeButton() → {void}

Runs Next Episode button animation and sets focus to button

Returns:
Type: 
void

(static) toggleCaption() → {void}

Returns:
Type: 
void

(static) updateCaption() → {void}

Returns:
Type: 
void

(static) updateCount() → {void}

Update count down text

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) ReportPlayback(stateopt) → {void}

Report playback to server

Parameters:
NameTypeAttributesDefaultDescription
statestring<optional>
"update"
Returns:
Type: 
void

(static) bufferCheck(msg) → {void}

Check the the buffering has not hung

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) checkTimeToDisplayNextEpisode() → {void}

Checks if we need to display the Next Episode button

Returns:
Type: 
void

(static) hideNextEpisodeButton() → {void}

Runs hide Next Episode button animation and sets focus back to video

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) loadCaption() → {void}

Returns:
Type: 
void

(static) onAllowCaptionsChange() → {void}

Returns:
Type: 
void

(static) onContentChange() → {void}

Event handler for when video content field changes

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onNextEpisodeDataLoaded() → {void}

Returns:
Type: 
void

(static) onPositionChanged() → {void}

When Video Player state changes

Returns:
Type: 
void

(static) onState(msg) → {void}

When Video Player state changes

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) showNextEpisodeButton() → {void}

Runs Next Episode button animation and sets focus to button

Returns:
Type: 
void

(static) toggleCaption() → {void}

Returns:
Type: 
void

(static) updateCaption() → {void}

Returns:
Type: 
void

(static) updateCount() → {void}

Update count down text

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ListPoster.html b/docs/api/module-ListPoster.html index ac66c88f05..63aeb1f261 100644 --- a/docs/api/module-ListPoster.html +++ b/docs/api/module-ListPoster.html @@ -1,3 +1,3 @@ Module: ListPoster
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-LoadChannelsTask.html b/docs/api/module-LoadChannelsTask.html index 23612136d3..e04d9f40eb 100644 --- a/docs/api/module-LoadChannelsTask.html +++ b/docs/api/module-LoadChannelsTask.html @@ -1,3 +1,3 @@ Module: LoadChannelsTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-LoadItemsTask.html b/docs/api/module-LoadItemsTask.html index 1a80cdf3f6..498c58cfab 100644 --- a/docs/api/module-LoadItemsTask.html +++ b/docs/api/module-LoadItemsTask.html @@ -1,3 +1,3 @@ Module: LoadItemsTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-LoadItemsTask2.html b/docs/api/module-LoadItemsTask2.html index 768c7ade5e..d19c3be1f1 100644 --- a/docs/api/module-LoadItemsTask2.html +++ b/docs/api/module-LoadItemsTask2.html @@ -1,3 +1,3 @@ Module: LoadItemsTask2
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-LoadPhotoTask.html b/docs/api/module-LoadPhotoTask.html index 97db891ed2..0e46c43d95 100644 --- a/docs/api/module-LoadPhotoTask.html +++ b/docs/api/module-LoadPhotoTask.html @@ -1,3 +1,3 @@ Module: LoadPhotoTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-LoadProgramDetailsTask.html b/docs/api/module-LoadProgramDetailsTask.html index 822c17a4d0..9e6c17517b 100644 --- a/docs/api/module-LoadProgramDetailsTask.html +++ b/docs/api/module-LoadProgramDetailsTask.html @@ -1,3 +1,3 @@ Module: LoadProgramDetailsTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-LoadScreenSaverTimeoutTask.html b/docs/api/module-LoadScreenSaverTimeoutTask.html index f7348130eb..ef8d85f3b4 100644 --- a/docs/api/module-LoadScreenSaverTimeoutTask.html +++ b/docs/api/module-LoadScreenSaverTimeoutTask.html @@ -1,3 +1,3 @@ Module: LoadScreenSaverTimeoutTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-LoadSheduleTask.html b/docs/api/module-LoadSheduleTask.html index f7928b5267..41a329dffa 100644 --- a/docs/api/module-LoadSheduleTask.html +++ b/docs/api/module-LoadSheduleTask.html @@ -1,3 +1,3 @@ Module: LoadSheduleTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-LoadVideoContentTask.html b/docs/api/module-LoadVideoContentTask.html index 410c0bd550..92b142c06a 100644 --- a/docs/api/module-LoadVideoContentTask.html +++ b/docs/api/module-LoadVideoContentTask.html @@ -1,3 +1,3 @@ Module: LoadVideoContentTask
On this page

Methods

(static) FindPreferredAudioStream(streams) → {integer}

Parameters:
NameTypeDescription
streamsdynamic
Returns:
Type: 
integer

(static) LoadItems_AddVideoContent(video, mediaSourceId, audio_stream_idxopt, subtitle_idxopt, forceTranscodingopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
videoobject
mediaSourceIddynamic
audio_stream_idxinteger<optional>
1
subtitle_idxinteger<optional>
-1
forceTranscodingboolean<optional>
false
Returns:
Type: 
void

(static) LoadItems_VideoPlayer(id, mediaSourceIdopt, audio_stream_idxopt, subtitle_idxopt, forceTranscodingopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
mediaSourceIddynamic<optional>
invalid
audio_stream_idxinteger<optional>
1
subtitle_idxinteger<optional>
-1
forceTranscodingboolean<optional>
false
Returns:
Type: 
dynamic

(static) addNextEpisodesToQueue(showID) → {void}

Add next episodes to the playback queue

Parameters:
NameTypeDescription
showIDdynamic
Returns:
Type: 
void

(static) addSubtitlesToVideo(video, meta) → {void}

Parameters:
NameTypeDescription
videodynamic
metadynamic
Returns:
Type: 
void

(static) addVideoContentURL(video, mediaSourceId, audio_stream_idx, fully_external) → {void}

Parameters:
NameTypeDescription
videodynamic
mediaSourceIddynamic
audio_stream_idxdynamic
fully_externaldynamic
Returns:
Type: 
void

(static) directPlaySupported(meta) → {boolean}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
boolean

(static) getContainerType(meta) → {string}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
string

(static) getSubtitleLanguages() → {dynamic}

Returns:
Type: 
dynamic

(static) getTranscodeReasons(url) → {object}

Extract array of Transcode Reasons from the content URL

Parameters:
NameTypeDescription
urlstring
Returns:
  • Array of Strings
Type: 
object

(static) init() → {void}

Returns:
Type: 
void

(static) loadItems() → {void}

Returns:
Type: 
void

(static) sortSubtitles(id, MediaStreams) → {dynamic}

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

Parameters:
NameTypeDescription
idstring
MediaStreamsdynamic
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) FindPreferredAudioStream(streams) → {integer}

Parameters:
NameTypeDescription
streamsdynamic
Returns:
Type: 
integer

(static) LoadItems_AddVideoContent(video, mediaSourceId, audio_stream_idxopt, subtitle_idxopt, forceTranscodingopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
videoobject
mediaSourceIddynamic
audio_stream_idxinteger<optional>
1
subtitle_idxinteger<optional>
-1
forceTranscodingboolean<optional>
false
Returns:
Type: 
void

(static) LoadItems_VideoPlayer(id, mediaSourceIdopt, audio_stream_idxopt, subtitle_idxopt, forceTranscodingopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
mediaSourceIddynamic<optional>
invalid
audio_stream_idxinteger<optional>
1
subtitle_idxinteger<optional>
-1
forceTranscodingboolean<optional>
false
Returns:
Type: 
dynamic

(static) addNextEpisodesToQueue(showID) → {void}

Add next episodes to the playback queue

Parameters:
NameTypeDescription
showIDdynamic
Returns:
Type: 
void

(static) addSubtitlesToVideo(video, meta) → {void}

Parameters:
NameTypeDescription
videodynamic
metadynamic
Returns:
Type: 
void

(static) addVideoContentURL(video, mediaSourceId, audio_stream_idx, fully_external) → {void}

Parameters:
NameTypeDescription
videodynamic
mediaSourceIddynamic
audio_stream_idxdynamic
fully_externaldynamic
Returns:
Type: 
void

(static) directPlaySupported(meta) → {boolean}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
boolean

(static) getContainerType(meta) → {string}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
string

(static) getSubtitleLanguages() → {dynamic}

Returns:
Type: 
dynamic

(static) getTranscodeReasons(url) → {object}

Extract array of Transcode Reasons from the content URL

Parameters:
NameTypeDescription
urlstring
Returns:
  • Array of Strings
Type: 
object

(static) init() → {void}

Returns:
Type: 
void

(static) loadItems() → {void}

Returns:
Type: 
void

(static) sortSubtitles(id, MediaStreams) → {dynamic}

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

Parameters:
NameTypeDescription
idstring
MediaStreamsdynamic
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-LoginScene.html b/docs/api/module-LoginScene.html index 9f40e9b942..a9afaafe81 100644 --- a/docs/api/module-LoginScene.html +++ b/docs/api/module-LoginScene.html @@ -1,3 +1,3 @@ Module: LoginScene
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-Main.html b/docs/api/module-Main.html index f462d895d9..9643ed8454 100644 --- a/docs/api/module-Main.html +++ b/docs/api/module-Main.html @@ -1,3 +1,3 @@ Module: Main
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-MovieData.html b/docs/api/module-MovieData.html index 198b886e76..460058aaa3 100644 --- a/docs/api/module-MovieData.html +++ b/docs/api/module-MovieData.html @@ -1,3 +1,3 @@ Module: MovieData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-MovieDetails.html b/docs/api/module-MovieDetails.html index 0bbfd04c92..56f2489953 100644 --- a/docs/api/module-MovieDetails.html +++ b/docs/api/module-MovieDetails.html @@ -1,3 +1,3 @@ Module: MovieDetails
On this page

Methods

(static) OnScreenShown() → {void}

Returns:
Type: 
void

(static) SetDefaultAudioTrack(itemData) → {void}

Parameters:
NameTypeDescription
itemDatadynamic
Returns:
Type: 
void

(static) SetUpAudioOptions(streams) → {void}

Parameters:
NameTypeDescription
streamsdynamic
Returns:
Type: 
void

(static) SetUpVideoOptions(streams) → {void}

Parameters:
NameTypeDescription
streamsdynamic
Returns:
Type: 
void

(static) audioOptionsClosed() → {void}

Check if options updated and any reloading required

Returns:
Type: 
void

(static) getEndTime() → {string}

Returns:
Type: 
string

(static) getRuntime() → {integer}

Returns:
Type: 
integer

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) round(f) → {integer}

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) setFavoriteColor() → {void}

Returns:
Type: 
void

(static) setFieldText(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void

(static) setWatchedColor() → {void}

Returns:
Type: 
void

(static) trailerAvailableChanged() → {void}

Returns:
Type: 
void

(static) videoOptionsClosed() → {void}

Check if options were updated and if any reloding is needed...

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) OnScreenShown() → {void}

Returns:
Type: 
void

(static) SetDefaultAudioTrack(itemData) → {void}

Parameters:
NameTypeDescription
itemDatadynamic
Returns:
Type: 
void

(static) SetUpAudioOptions(streams) → {void}

Parameters:
NameTypeDescription
streamsdynamic
Returns:
Type: 
void

(static) SetUpVideoOptions(streams) → {void}

Parameters:
NameTypeDescription
streamsdynamic
Returns:
Type: 
void

(static) audioOptionsClosed() → {void}

Check if options updated and any reloading required

Returns:
Type: 
void

(static) getEndTime() → {string}

Returns:
Type: 
string

(static) getRuntime() → {integer}

Returns:
Type: 
integer

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) round(f) → {integer}

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) setFavoriteColor() → {void}

Returns:
Type: 
void

(static) setFieldText(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void

(static) setWatchedColor() → {void}

Returns:
Type: 
void

(static) trailerAvailableChanged() → {void}

Returns:
Type: 
void

(static) videoOptionsClosed() → {void}

Check if options were updated and if any reloding is needed...

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-MovieLibraryView.html b/docs/api/module-MovieLibraryView.html index d6c29b22c6..7f69b3c69d 100644 --- a/docs/api/module-MovieLibraryView.html +++ b/docs/api/module-MovieLibraryView.html @@ -1,3 +1,3 @@ Module: MovieLibraryView
On this page

Methods

(static) FilterDataLoaded(msg) → {void}

Logo Image Loaded Event Handler

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) ItemDataLoaded(msg) → {void}

Handle loaded data, and add to Grid

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) LogoImageLoaded(msg) → {void}

Logo Image Loaded Event Handler

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) OnScreenHidden() → {void}

Returns:
Type: 
void

(static) OnScreenShown() → {void}

Returns:
Type: 
void

(static) SetBackground(backgroundUri) → {void}

Set Background Image

Parameters:
NameTypeDescription
backgroundUristring
Returns:
Type: 
void

(static) SetName(movieName) → {void}

Set Selected Movie Name

Parameters:
NameTypeDescription
movieNamestring
Returns:
Type: 
void

(static) SetOfficialRating(movieOfficialRating) → {void}

Set Selected Movie OfficialRating

Parameters:
NameTypeDescription
movieOfficialRatingstring
Returns:
Type: 
void

(static) SetOverview(movieOverview) → {void}

Set Selected Movie Overview

Parameters:
NameTypeDescription
movieOverviewstring
Returns:
Type: 
void

(static) SetProductionYear(movieProductionYear) → {void}

Set Selected Movie ProductionYear

Parameters:
NameTypeDescription
movieProductionYeardynamic
Returns:
Type: 
void

(static) getCollectionType() → {string}

Return parent collection type

Returns:
Type: 
string

(static) getItemFocused() → {dynamic}

Returns Focused Item

Returns:
Type: 
dynamic

(static) getRuntime(runTimeTicks) → {integer}

Parameters:
NameTypeDescription
runTimeTicksdynamic
Returns:
Type: 
integer

(static) inStringArray(array, searchValue) → {boolean}

Search string array for search value. Return if it's found

Parameters:
NameTypeDescription
arraydynamic
searchValuedynamic
Returns:
Type: 
boolean

(static) init() → {void}

Returns:
Type: 
void

(static) loadInitialItems() → {void}

Load initial set of Data

Returns:
Type: 
void

(static) loadMoreData() → {void}

Load next set of items

Returns:
Type: 
void

(static) newBGLoaded() → {void}

When Image Loading Status changes

Returns:
Type: 
void

(static) onChannelSelected(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onGenreItemSelected() → {void}

Genre Item Selected

Returns:
Type: 
void

(static) onItemFocused() → {void}

Handle new item being focused

Returns:
Type: 
void

(static) onItemSelected() → {void}

Item Selected

Returns:
Type: 
void

(static) onItemalphaSelected() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onvoiceFilter() → {void}

Returns:
Type: 
void

(static) optionsClosed() → {void}

Check if options updated and any reloading required

Returns:
Type: 
void

(static) round(f) → {integer}

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) setFieldText(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void

(static) setMoviesOptions(options) → {void}

Set Movies view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setSelectedOptions(options) → {void}

Data to display when options button selected

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setupNodes() → {void}

Returns:
Type: 
void

(static) swapDone() → {void}

Swap Complete

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) FilterDataLoaded(msg) → {void}

Logo Image Loaded Event Handler

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) ItemDataLoaded(msg) → {void}

Handle loaded data, and add to Grid

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) LogoImageLoaded(msg) → {void}

Logo Image Loaded Event Handler

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) OnScreenHidden() → {void}

Returns:
Type: 
void

(static) OnScreenShown() → {void}

Returns:
Type: 
void

(static) SetBackground(backgroundUri) → {void}

Set Background Image

Parameters:
NameTypeDescription
backgroundUristring
Returns:
Type: 
void

(static) SetName(movieName) → {void}

Set Selected Movie Name

Parameters:
NameTypeDescription
movieNamestring
Returns:
Type: 
void

(static) SetOfficialRating(movieOfficialRating) → {void}

Set Selected Movie OfficialRating

Parameters:
NameTypeDescription
movieOfficialRatingstring
Returns:
Type: 
void

(static) SetOverview(movieOverview) → {void}

Set Selected Movie Overview

Parameters:
NameTypeDescription
movieOverviewstring
Returns:
Type: 
void

(static) SetProductionYear(movieProductionYear) → {void}

Set Selected Movie ProductionYear

Parameters:
NameTypeDescription
movieProductionYeardynamic
Returns:
Type: 
void

(static) getCollectionType() → {string}

Return parent collection type

Returns:
Type: 
string

(static) getItemFocused() → {dynamic}

Returns Focused Item

Returns:
Type: 
dynamic

(static) getRuntime(runTimeTicks) → {integer}

Parameters:
NameTypeDescription
runTimeTicksdynamic
Returns:
Type: 
integer

(static) inStringArray(array, searchValue) → {boolean}

Search string array for search value. Return if it's found

Parameters:
NameTypeDescription
arraydynamic
searchValuedynamic
Returns:
Type: 
boolean

(static) init() → {void}

Returns:
Type: 
void

(static) loadInitialItems() → {void}

Load initial set of Data

Returns:
Type: 
void

(static) loadMoreData() → {void}

Load next set of items

Returns:
Type: 
void

(static) newBGLoaded() → {void}

When Image Loading Status changes

Returns:
Type: 
void

(static) onChannelSelected(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onGenreItemSelected() → {void}

Genre Item Selected

Returns:
Type: 
void

(static) onItemFocused() → {void}

Handle new item being focused

Returns:
Type: 
void

(static) onItemSelected() → {void}

Item Selected

Returns:
Type: 
void

(static) onItemalphaSelected() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onvoiceFilter() → {void}

Returns:
Type: 
void

(static) optionsClosed() → {void}

Check if options updated and any reloading required

Returns:
Type: 
void

(static) round(f) → {integer}

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) setFieldText(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void

(static) setMoviesOptions(options) → {void}

Set Movies view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setSelectedOptions(options) → {void}

Data to display when options button selected

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setupNodes() → {void}

Returns:
Type: 
void

(static) swapDone() → {void}

Swap Complete

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-MovieOptions.html b/docs/api/module-MovieOptions.html index 5659bc269c..7305b2e7d4 100644 --- a/docs/api/module-MovieOptions.html +++ b/docs/api/module-MovieOptions.html @@ -1,3 +1,3 @@ Module: MovieOptions
On this page

Methods

(static) buttonFocusChanged() → {void}

Switch menu shown when button focus changes

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) optionsSet() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) buttonFocusChanged() → {void}

Switch menu shown when button focus changes

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) optionsSet() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-MusicAlbumData.html b/docs/api/module-MusicAlbumData.html index 80118d139c..2e953f4755 100644 --- a/docs/api/module-MusicAlbumData.html +++ b/docs/api/module-MusicAlbumData.html @@ -1,3 +1,3 @@ Module: MusicAlbumData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-MusicAlbumSongListData.html b/docs/api/module-MusicAlbumSongListData.html index 7108b009f6..9dded77411 100644 --- a/docs/api/module-MusicAlbumSongListData.html +++ b/docs/api/module-MusicAlbumSongListData.html @@ -1,3 +1,3 @@ Module: MusicAlbumSongListData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-MusicArtistData.html b/docs/api/module-MusicArtistData.html index 3fd67792e9..8255a1e893 100644 --- a/docs/api/module-MusicArtistData.html +++ b/docs/api/module-MusicArtistData.html @@ -1,3 +1,3 @@ Module: MusicArtistData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-MusicArtistGridItem.html b/docs/api/module-MusicArtistGridItem.html index 94a3271fdf..af14799ac3 100644 --- a/docs/api/module-MusicArtistGridItem.html +++ b/docs/api/module-MusicArtistGridItem.html @@ -1,3 +1,3 @@ Module: MusicArtistGridItem
On this page

Methods

(static) focusChanged() → {void}

Display or hide title Visibility on focus change

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onPosterLoadStatusChanged() → {void}

Hide backdrop and text when poster loaded

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) focusChanged() → {void}

Display or hide title Visibility on focus change

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onPosterLoadStatusChanged() → {void}

Hide backdrop and text when poster loaded

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-MusicLibraryView.html b/docs/api/module-MusicLibraryView.html index 3cb97463a5..a9b170e862 100644 --- a/docs/api/module-MusicLibraryView.html +++ b/docs/api/module-MusicLibraryView.html @@ -1,3 +1,3 @@ Module: MusicLibraryView
On this page

Methods

(static) ItemDataLoaded(msg) → {void}

Handle loaded data, and add to Grid

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) LogoImageLoaded(msg) → {void}

Logo Image Loaded Event Handler

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) OnScreenHidden() → {void}

Returns:
Type: 
void

(static) OnScreenShown() → {void}

Returns:
Type: 
void

(static) SetAlbumCount(totalCount) → {void}

Set Selected Artist Album Count

Parameters:
NameTypeDescription
totalCountdynamic
Returns:
Type: 
void

(static) SetBackground(backgroundUri) → {void}

Set Background Image

Parameters:
NameTypeDescription
backgroundUristring
Returns:
Type: 
void

(static) SetGenres(artistGenres) → {void}

Set Selected Artist Genres

Parameters:
NameTypeDescription
artistGenresdynamic
Returns:
Type: 
void

(static) SetName(artistName) → {void}

Set Selected Artist Name

Parameters:
NameTypeDescription
artistNamestring
Returns:
Type: 
void

(static) SetSongCount(totalCount) → {void}

Set Selected Artist Song Count

Parameters:
NameTypeDescription
totalCountdynamic
Returns:
Type: 
void

(static) SetUpOptions() → {void}

Data to display when options button selected

Returns:
Type: 
void

(static) getCollectionType() → {string}

Return parent collection type

Returns:
Type: 
string

(static) getItemFocused() → {dynamic}

Returns Focused Item

Returns:
Type: 
dynamic

(static) inStringArray(array, searchValue) → {boolean}

Search string array for search value. Return if it's found

Parameters:
NameTypeDescription
arraydynamic
searchValuedynamic
Returns:
Type: 
boolean

(static) init() → {void}

Returns:
Type: 
void

(static) loadInitialItems() → {void}

Load initial set of Data

Returns:
Type: 
void

(static) loadMoreData() → {void}

Load next set of items

Returns:
Type: 
void

(static) newBGLoaded() → {void}

When Image Loading Status changes

Returns:
Type: 
void

(static) onChannelSelected(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onGenreItemFocused() → {void}

Genre Item Focused

Returns:
Type: 
void

(static) onGenreItemSelected() → {void}

Genre Item Selected

Returns:
Type: 
void

(static) onItemFocused() → {void}

Handle new item being focused

Returns:
Type: 
void

(static) onItemSelected() → {void}

Item Selected

Returns:
Type: 
void

(static) onItemalphaSelected() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onvoiceFilter() → {void}

Returns:
Type: 
void

(static) optionsClosed() → {void}

Check if options updated and any reloading required

Returns:
Type: 
void

(static) setFieldText(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void

(static) setMusicOptions(options) → {void}

Set Music view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setupNodes() → {void}

Returns:
Type: 
void

(static) swapDone() → {void}

Swap Complete

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) ItemDataLoaded(msg) → {void}

Handle loaded data, and add to Grid

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) LogoImageLoaded(msg) → {void}

Logo Image Loaded Event Handler

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) OnScreenHidden() → {void}

Returns:
Type: 
void

(static) OnScreenShown() → {void}

Returns:
Type: 
void

(static) SetAlbumCount(totalCount) → {void}

Set Selected Artist Album Count

Parameters:
NameTypeDescription
totalCountdynamic
Returns:
Type: 
void

(static) SetBackground(backgroundUri) → {void}

Set Background Image

Parameters:
NameTypeDescription
backgroundUristring
Returns:
Type: 
void

(static) SetGenres(artistGenres) → {void}

Set Selected Artist Genres

Parameters:
NameTypeDescription
artistGenresdynamic
Returns:
Type: 
void

(static) SetName(artistName) → {void}

Set Selected Artist Name

Parameters:
NameTypeDescription
artistNamestring
Returns:
Type: 
void

(static) SetSongCount(totalCount) → {void}

Set Selected Artist Song Count

Parameters:
NameTypeDescription
totalCountdynamic
Returns:
Type: 
void

(static) SetUpOptions() → {void}

Data to display when options button selected

Returns:
Type: 
void

(static) getCollectionType() → {string}

Return parent collection type

Returns:
Type: 
string

(static) getItemFocused() → {dynamic}

Returns Focused Item

Returns:
Type: 
dynamic

(static) inStringArray(array, searchValue) → {boolean}

Search string array for search value. Return if it's found

Parameters:
NameTypeDescription
arraydynamic
searchValuedynamic
Returns:
Type: 
boolean

(static) init() → {void}

Returns:
Type: 
void

(static) loadInitialItems() → {void}

Load initial set of Data

Returns:
Type: 
void

(static) loadMoreData() → {void}

Load next set of items

Returns:
Type: 
void

(static) newBGLoaded() → {void}

When Image Loading Status changes

Returns:
Type: 
void

(static) onChannelSelected(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onGenreItemFocused() → {void}

Genre Item Focused

Returns:
Type: 
void

(static) onGenreItemSelected() → {void}

Genre Item Selected

Returns:
Type: 
void

(static) onItemFocused() → {void}

Handle new item being focused

Returns:
Type: 
void

(static) onItemSelected() → {void}

Item Selected

Returns:
Type: 
void

(static) onItemalphaSelected() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onvoiceFilter() → {void}

Returns:
Type: 
void

(static) optionsClosed() → {void}

Check if options updated and any reloading required

Returns:
Type: 
void

(static) setFieldText(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void

(static) setMusicOptions(options) → {void}

Set Music view, sort, and filter options

Parameters:
NameTypeDescription
optionsdynamic
Returns:
Type: 
void

(static) setupNodes() → {void}

Returns:
Type: 
void

(static) swapDone() → {void}

Swap Complete

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-MusicSongData.html b/docs/api/module-MusicSongData.html index f75fac765a..f53cacd92b 100644 --- a/docs/api/module-MusicSongData.html +++ b/docs/api/module-MusicSongData.html @@ -1,3 +1,3 @@ Module: MusicSongData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-OSD.html b/docs/api/module-OSD.html index 32286f6e82..ff3323742e 100644 --- a/docs/api/module-OSD.html +++ b/docs/api/module-OSD.html @@ -1,3 +1,3 @@ Module: OSD
On this page

Methods

(static) inactiveCheck() → {void}

inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onButtonSelected() → {void}

onButtonSelected: Handler for selection of buttons from the menu.

Returns:
Type: 
void

(static) onFocusChanged() → {void}

onFocusChanged: Handler for changes to the focus of this menu.

Returns:
Type: 
void

(static) onItemTitleTextChanged() → {void}

onItemTitleTextChanged: Handler for changes to m.top.itemTitleText param.

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onPlaybackStateChanged() → {void}

onPlaybackStateChanged: Handler for changes to m.top.playbackState param

Returns:
Type: 
void

(static) onProgressPercentageChanged() → {void}

onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param

Returns:
Type: 
void

(static) onVisibleChanged() → {void}

onVisibleChanged: Handler for changes to the visibility of this menu.

Returns:
Type: 
void

(static) resetFocusToDefaultButton() → {void}

resetFocusToDefaultButton: Reset focus back to the default button

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) inactiveCheck() → {void}

inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onButtonSelected() → {void}

onButtonSelected: Handler for selection of buttons from the menu.

Returns:
Type: 
void

(static) onFocusChanged() → {void}

onFocusChanged: Handler for changes to the focus of this menu.

Returns:
Type: 
void

(static) onItemTitleTextChanged() → {void}

onItemTitleTextChanged: Handler for changes to m.top.itemTitleText param.

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onPlaybackStateChanged() → {void}

onPlaybackStateChanged: Handler for changes to m.top.playbackState param

Returns:
Type: 
void

(static) onProgressPercentageChanged() → {void}

onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param

Returns:
Type: 
void

(static) onVisibleChanged() → {void}

onVisibleChanged: Handler for changes to the visibility of this menu.

Returns:
Type: 
void

(static) resetFocusToDefaultButton() → {void}

resetFocusToDefaultButton: Reset focus back to the default button

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-OptionNode.html b/docs/api/module-OptionNode.html index dc2dfce6c3..f93b1c4732 100644 --- a/docs/api/module-OptionNode.html +++ b/docs/api/module-OptionNode.html @@ -1,3 +1,3 @@ Module: OptionNode
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-OptionsButton.html b/docs/api/module-OptionsButton.html index f1335bb156..cf906b1e07 100644 --- a/docs/api/module-OptionsButton.html +++ b/docs/api/module-OptionsButton.html @@ -1,3 +1,3 @@ Module: OptionsButton
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-OptionsData.html b/docs/api/module-OptionsData.html index 5f214662dc..04bb354e2f 100644 --- a/docs/api/module-OptionsData.html +++ b/docs/api/module-OptionsData.html @@ -1,3 +1,3 @@ Module: OptionsData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-OptionsSlider.html b/docs/api/module-OptionsSlider.html index ce9da8f6d7..32d2bf4ac3 100644 --- a/docs/api/module-OptionsSlider.html +++ b/docs/api/module-OptionsSlider.html @@ -1,3 +1,3 @@ Module: OptionsSlider
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-OverviewDialog.html b/docs/api/module-OverviewDialog.html index 772a8860ab..2859acd2dc 100644 --- a/docs/api/module-OverviewDialog.html +++ b/docs/api/module-OverviewDialog.html @@ -1,3 +1,3 @@ Module: OverviewDialog
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PersonData.html b/docs/api/module-PersonData.html index 174c77696b..08c4535506 100644 --- a/docs/api/module-PersonData.html +++ b/docs/api/module-PersonData.html @@ -1,3 +1,3 @@ Module: PersonData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PersonDetails.html b/docs/api/module-PersonDetails.html index aacd3cedd6..596e2144ba 100644 --- a/docs/api/module-PersonDetails.html +++ b/docs/api/module-PersonDetails.html @@ -1,3 +1,3 @@ Module: PersonDetails
On this page

Methods

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) dscrShowFocus() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) loadPerson() → {void}

Returns:
Type: 
void

(static) onButtonGroupEscaped() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) setFavoriteColor() → {void}

Returns:
Type: 
void

(static) shortDate(isoDate) → {string}

Parameters:
NameTypeDescription
isoDatedynamic
Returns:
Type: 
string
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) dscrShowFocus() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) loadPerson() → {void}

Returns:
Type: 
void

(static) onButtonGroupEscaped() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) setFavoriteColor() → {void}

Returns:
Type: 
void

(static) shortDate(isoDate) → {string}

Parameters:
NameTypeDescription
isoDatedynamic
Returns:
Type: 
string
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PhotoData.html b/docs/api/module-PhotoData.html index 927617aae9..bd70d4ebe8 100644 --- a/docs/api/module-PhotoData.html +++ b/docs/api/module-PhotoData.html @@ -1,3 +1,3 @@ Module: PhotoData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PhotoDetails.html b/docs/api/module-PhotoDetails.html index 66cbe9dd60..5d062e097a 100644 --- a/docs/api/module-PhotoDetails.html +++ b/docs/api/module-PhotoDetails.html @@ -1,3 +1,3 @@ Module: PhotoDetails
On this page

Methods

(static) OnScreenHidden() → {void}

JFScreen hook. Used to ensure tasks are stopped

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isRandomChanged() → {void}

isRandom component field has changed

Returns:
Type: 
void

(static) isSlideshowChanged() → {void}

isSlideshow component field has changed

Returns:
Type: 
void

(static) isValidToContinue(index) → {dynamic}

Parameters:
NameTypeDescription
indexinteger
Returns:
Type: 
dynamic

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) nextSlide() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onPhotoLoaded() → {void}

Returns:
Type: 
void

(static) statusUpdate() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) OnScreenHidden() → {void}

JFScreen hook. Used to ensure tasks are stopped

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isRandomChanged() → {void}

isRandom component field has changed

Returns:
Type: 
void

(static) isSlideshowChanged() → {void}

isSlideshow component field has changed

Returns:
Type: 
void

(static) isValidToContinue(index) → {dynamic}

Parameters:
NameTypeDescription
indexinteger
Returns:
Type: 
dynamic

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) nextSlide() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onPhotoLoaded() → {void}

Returns:
Type: 
void

(static) statusUpdate() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PlaybackDialog.html b/docs/api/module-PlaybackDialog.html index b97e255b76..4cbedc4f2d 100644 --- a/docs/api/module-PlaybackDialog.html +++ b/docs/api/module-PlaybackDialog.html @@ -1,3 +1,3 @@ Module: PlaybackDialog
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PlayedCheckmark.html b/docs/api/module-PlayedCheckmark.html index 604d790d20..b3daa0781b 100644 --- a/docs/api/module-PlayedCheckmark.html +++ b/docs/api/module-PlayedCheckmark.html @@ -1,3 +1,3 @@ Module: PlayedCheckmark
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PlaylistData.html b/docs/api/module-PlaylistData.html index 101469da5b..b19f647d85 100644 --- a/docs/api/module-PlaylistData.html +++ b/docs/api/module-PlaylistData.html @@ -1,3 +1,3 @@ Module: PlaylistData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PlaylistView.html b/docs/api/module-PlaylistView.html index 4a2ce07a8b..b7c2e06cfa 100644 --- a/docs/api/module-PlaylistView.html +++ b/docs/api/module-PlaylistView.html @@ -1,3 +1,3 @@ Module: PlaylistView
On this page

Methods

(static) adjustScreenForNoOverview() → {void}

Adjust scene by removing overview node and showing more songs

Returns:
Type: 
void

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDoneLoading() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) pageContentChanged() → {void}

Set values for displayed values on screen

Returns:
Type: 
void

(static) setOnScreenTextValues(json) → {void}

Populate on screen text variables

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Set poster image on screen

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Set screen's title text

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setupMainNode() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) adjustScreenForNoOverview() → {void}

Adjust scene by removing overview node and showing more songs

Returns:
Type: 
void

(static) createDialogPallete() → {void}

Returns:
Type: 
void

(static) createFullDscrDlg() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDoneLoading() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) pageContentChanged() → {void}

Set values for displayed values on screen

Returns:
Type: 
void

(static) setOnScreenTextValues(json) → {void}

Populate on screen text variables

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setPosterImage(posterURL) → {void}

Set poster image on screen

Parameters:
NameTypeDescription
posterURLdynamic
Returns:
Type: 
void

(static) setScreenTitle(json) → {void}

Set screen's title text

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) setupMainNode() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PlaystateTask.html b/docs/api/module-PlaystateTask.html index 68db69f720..5d11351a49 100644 --- a/docs/api/module-PlaystateTask.html +++ b/docs/api/module-PlaystateTask.html @@ -1,3 +1,3 @@ Module: PlaystateTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PostTask.html b/docs/api/module-PostTask.html index 09194a18d0..dc80ae7bda 100644 --- a/docs/api/module-PostTask.html +++ b/docs/api/module-PostTask.html @@ -1,3 +1,3 @@ Module: PostTask
On this page

Methods

(static) asyncPost(req, dataopt) → {integer}

Post data and wait for response code

Parameters:
NameTypeAttributesDefaultDescription
reqdynamic
datastring<optional>
""
Returns:
Type: 
integer

(static) empty() → {void}

Revert PostTask to default state

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) postItems() → {void}

Main function for PostTask. Posts either an array of data or a string of data to an API endpoint. Saves the response information

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) asyncPost(req, dataopt) → {integer}

Post data and wait for response code

Parameters:
NameTypeAttributesDefaultDescription
reqdynamic
datastring<optional>
""
Returns:
Type: 
integer

(static) empty() → {void}

Revert PostTask to default state

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) postItems() → {void}

Main function for PostTask. Posts either an array of data or a string of data to an API endpoint. Saves the response information

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ProgramDetails.html b/docs/api/module-ProgramDetails.html index 04e94a7dda..36f3053d8c 100644 --- a/docs/api/module-ProgramDetails.html +++ b/docs/api/module-ProgramDetails.html @@ -1,3 +1,3 @@ Module: ProgramDetails
On this page

Methods

(static) channelUpdated() → {void}

Returns:
Type: 
void

(static) focusChanged() → {void}

Show view channel button when item has Focus

Returns:
Type: 
void

(static) getDurationStringFromSeconds(seconds) → {string}

Get program duration string (e.g. 1h 20m)

Parameters:
NameTypeDescription
secondsdynamic
Returns:
Type: 
string

(static) getRelativeDayName(date) → {string}

Get relative date name for a date (yesterday, today, tomorrow, or otherwise weekday name )

Parameters:
NameTypeDescription
datedynamic
Returns:
Type: 
string

(static) init() → {void}

Returns:
Type: 
void

(static) onAnimationComplete() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) programUpdated() → {void}

Returns:
Type: 
void

(static) setupLabels() → {void}

Set up Live and Repeat label sizes

Returns:
Type: 
void

(static) updateLabels(recordTextopt, recordSeriesTextopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
recordTextdynamic<optional>
"Record"
recordSeriesTextdynamic<optional>
"Record Series"
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) channelUpdated() → {void}

Returns:
Type: 
void

(static) focusChanged() → {void}

Show view channel button when item has Focus

Returns:
Type: 
void

(static) getDurationStringFromSeconds(seconds) → {string}

Get program duration string (e.g. 1h 20m)

Parameters:
NameTypeDescription
secondsdynamic
Returns:
Type: 
string

(static) getRelativeDayName(date) → {string}

Get relative date name for a date (yesterday, today, tomorrow, or otherwise weekday name )

Parameters:
NameTypeDescription
datedynamic
Returns:
Type: 
string

(static) init() → {void}

Returns:
Type: 
void

(static) onAnimationComplete() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) programUpdated() → {void}

Returns:
Type: 
void

(static) setupLabels() → {void}

Set up Live and Repeat label sizes

Returns:
Type: 
void

(static) updateLabels(recordTextopt, recordSeriesTextopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
recordTextdynamic<optional>
"Record"
recordSeriesTextdynamic<optional>
"Record Series"
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-PublicUserData.html b/docs/api/module-PublicUserData.html index 40cc5abd68..8776d03131 100644 --- a/docs/api/module-PublicUserData.html +++ b/docs/api/module-PublicUserData.html @@ -1,3 +1,3 @@ Module: PublicUserData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-QueueManager.html b/docs/api/module-QueueManager.html index 0835daa4d9..dd0eb6389a 100644 --- a/docs/api/module-QueueManager.html +++ b/docs/api/module-QueueManager.html @@ -1,3 +1,3 @@ Module: QueueManager
On this page

Methods

(static) clear() → {void}

Clear all content from play queue

Returns:
Type: 
void

(static) clearHold() → {void}

Clear all hold content

Returns:
Type: 
void

(static) deleteAtIndex(index) → {void}

Delete item from play queue at passed index

Parameters:
NameTypeDescription
indexdynamic
Returns:
Type: 
void

(static) getCount() → {dynamic}

Return the number of items in the play queue

Returns:
Type: 
dynamic

(static) getCurrentItem() → {dynamic}

Return the item currently in focus from the play queue

Returns:
Type: 
dynamic

(static) getHold() → {dynamic}

Return the items in the hold

Returns:
Type: 
dynamic

(static) getIsShuffled() → {dynamic}

Return whether or not shuffle is enabled

Returns:
Type: 
dynamic

(static) getItemByIndex(index) → {dynamic}

Return the item in the passed index from the play queue

Parameters:
NameTypeDescription
indexdynamic
Returns:
Type: 
dynamic

(static) getItemType(item) → {string}

Parameters:
NameTypeDescription
itemdynamic
Returns:
Type: 
string

(static) getPosition() → {dynamic}

Returns current playback position within the queue

Returns:
Type: 
dynamic

(static) getQueue() → {dynamic}

Return the current play queue

Returns:
Type: 
dynamic

(static) getQueueTypes() → {dynamic}

Return the types of items in current play queue

Returns:
Type: 
dynamic

(static) getQueueUniqueTypes() → {dynamic}

Return the unique types of items in current play queue

Returns:
Type: 
dynamic

(static) getUnshuffledQueue() → {dynamic}

Return original, unshuffled queue

Returns:
Type: 
dynamic

(static) hold(newItem) → {void}

Hold an item

Parameters:
NameTypeDescription
newItemdynamic
Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isPrerollActive() → {boolean}

Return isPrerollActive status

Returns:
Type: 
boolean

(static) moveBack() → {void}

Move queue position back one

Returns:
Type: 
void

(static) moveForward() → {void}

Move queue position ahead one

Returns:
Type: 
void

(static) peek() → {dynamic}

Return item at end of play queue without removing

Returns:
Type: 
dynamic

(static) playQueue() → {void}

Play items in queue

Returns:
Type: 
void

(static) pop() → {void}

Remove item at end of play queue

Returns:
Type: 
void

(static) push(newItem) → {void}

Push new items to the play queue

Parameters:
NameTypeDescription
newItemdynamic
Returns:
Type: 
void

(static) resetQueueItemOrder() → {void}

Reset queue items back to original, unshuffled order

Returns:
Type: 
void

(static) resetShuffle() → {void}

Reset shuffle to off state

Returns:
Type: 
void

(static) set(items) → {void}

Replace play queue with passed array

Parameters:
NameTypeDescription
itemsdynamic
Returns:
Type: 
void

(static) setPosition(newPosition) → {void}

Set the queue position

Parameters:
NameTypeDescription
newPositiondynamic
Returns:
Type: 
void

(static) setPrerollStatus(newStatus) → {void}

Set prerollActive status

Parameters:
NameTypeDescription
newStatusboolean
Returns:
Type: 
void

(static) setTopStartingPoint(positionTicks) → {void}

Set starting point for top item in the queue

Parameters:
NameTypeDescription
positionTicksdynamic
Returns:
Type: 
void

(static) shuffleQueueItems() → {void}

Save a copy of the original queue and randomize order of queue items

Returns:
Type: 
void

(static) toggleShuffle() → {void}

Toggle shuffleEnabled state

Returns:
Type: 
void

(static) top() → {dynamic}

Return the fitst item in the play queue

Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) clear() → {void}

Clear all content from play queue

Returns:
Type: 
void

(static) clearHold() → {void}

Clear all hold content

Returns:
Type: 
void

(static) deleteAtIndex(index) → {void}

Delete item from play queue at passed index

Parameters:
NameTypeDescription
indexdynamic
Returns:
Type: 
void

(static) getCount() → {dynamic}

Return the number of items in the play queue

Returns:
Type: 
dynamic

(static) getCurrentItem() → {dynamic}

Return the item currently in focus from the play queue

Returns:
Type: 
dynamic

(static) getHold() → {dynamic}

Return the items in the hold

Returns:
Type: 
dynamic

(static) getIsShuffled() → {dynamic}

Return whether or not shuffle is enabled

Returns:
Type: 
dynamic

(static) getItemByIndex(index) → {dynamic}

Return the item in the passed index from the play queue

Parameters:
NameTypeDescription
indexdynamic
Returns:
Type: 
dynamic

(static) getItemType(item) → {string}

Parameters:
NameTypeDescription
itemdynamic
Returns:
Type: 
string

(static) getPosition() → {dynamic}

Returns current playback position within the queue

Returns:
Type: 
dynamic

(static) getQueue() → {dynamic}

Return the current play queue

Returns:
Type: 
dynamic

(static) getQueueTypes() → {dynamic}

Return the types of items in current play queue

Returns:
Type: 
dynamic

(static) getQueueUniqueTypes() → {dynamic}

Return the unique types of items in current play queue

Returns:
Type: 
dynamic

(static) getUnshuffledQueue() → {dynamic}

Return original, unshuffled queue

Returns:
Type: 
dynamic

(static) hold(newItem) → {void}

Hold an item

Parameters:
NameTypeDescription
newItemdynamic
Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isPrerollActive() → {boolean}

Return isPrerollActive status

Returns:
Type: 
boolean

(static) moveBack() → {void}

Move queue position back one

Returns:
Type: 
void

(static) moveForward() → {void}

Move queue position ahead one

Returns:
Type: 
void

(static) peek() → {dynamic}

Return item at end of play queue without removing

Returns:
Type: 
dynamic

(static) playQueue() → {void}

Play items in queue

Returns:
Type: 
void

(static) pop() → {void}

Remove item at end of play queue

Returns:
Type: 
void

(static) push(newItem) → {void}

Push new items to the play queue

Parameters:
NameTypeDescription
newItemdynamic
Returns:
Type: 
void

(static) resetQueueItemOrder() → {void}

Reset queue items back to original, unshuffled order

Returns:
Type: 
void

(static) resetShuffle() → {void}

Reset shuffle to off state

Returns:
Type: 
void

(static) set(items) → {void}

Replace play queue with passed array

Parameters:
NameTypeDescription
itemsdynamic
Returns:
Type: 
void

(static) setPosition(newPosition) → {void}

Set the queue position

Parameters:
NameTypeDescription
newPositiondynamic
Returns:
Type: 
void

(static) setPrerollStatus(newStatus) → {void}

Set prerollActive status

Parameters:
NameTypeDescription
newStatusboolean
Returns:
Type: 
void

(static) setTopStartingPoint(positionTicks) → {void}

Set starting point for top item in the queue

Parameters:
NameTypeDescription
positionTicksdynamic
Returns:
Type: 
void

(static) shuffleQueueItems() → {void}

Save a copy of the original queue and randomize order of queue items

Returns:
Type: 
void

(static) toggleShuffle() → {void}

Toggle shuffleEnabled state

Returns:
Type: 
void

(static) top() → {dynamic}

Return the fitst item in the play queue

Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-QuickConnect.html b/docs/api/module-QuickConnect.html index 67bbc4df8b..d907ef7b5a 100644 --- a/docs/api/module-QuickConnect.html +++ b/docs/api/module-QuickConnect.html @@ -1,3 +1,3 @@ Module: QuickConnect
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-QuickConnectDialog.html b/docs/api/module-QuickConnectDialog.html index 4f9bf61a90..2835845f3a 100644 --- a/docs/api/module-QuickConnectDialog.html +++ b/docs/api/module-QuickConnectDialog.html @@ -1,3 +1,3 @@ Module: QuickConnectDialog
On this page

Methods

(static) OnAuthenticated() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onButtonSelected() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) quickConnectClosed() → {void}

Returns:
Type: 
void

(static) quickConnectStatus() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) OnAuthenticated() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onButtonSelected() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) quickConnectClosed() → {void}

Returns:
Type: 
void

(static) quickConnectStatus() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-RadioDialog.html b/docs/api/module-RadioDialog.html index bf8a766a3c..6075be0d13 100644 --- a/docs/api/module-RadioDialog.html +++ b/docs/api/module-RadioDialog.html @@ -1,3 +1,3 @@ Module: RadioDialog
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) moveScrollBar() → {void}

Move the popup's scroll bar

Returns:
Type: 
void

(static) onButtonSelected() → {void}

Event handler for when user selected a button

Returns:
Type: 
void

(static) onContentDataChanged() → {void}

Returns:
Type: 
void

(static) onItemFocused() → {void}

Event handler for when user's cursor highlights an option in the option list

Returns:
Type: 
void

(static) onItemSelected() → {void}

Once user selected an item, move cursor down to OK button

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onScrollBarFocus() → {void}

If somehow the scrollbar gains focus, set focus back to the option list

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) moveScrollBar() → {void}

Move the popup's scroll bar

Returns:
Type: 
void

(static) onButtonSelected() → {void}

Event handler for when user selected a button

Returns:
Type: 
void

(static) onContentDataChanged() → {void}

Returns:
Type: 
void

(static) onItemFocused() → {void}

Event handler for when user's cursor highlights an option in the option list

Returns:
Type: 
void

(static) onItemSelected() → {void}

Once user selected an item, move cursor down to OK button

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onScrollBarFocus() → {void}

If somehow the scrollbar gains focus, set focus back to the option list

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-RecordProgramTask.html b/docs/api/module-RecordProgramTask.html index 205f5fd273..c2d8e80d0d 100644 --- a/docs/api/module-RecordProgramTask.html +++ b/docs/api/module-RecordProgramTask.html @@ -1,3 +1,3 @@ Module: RecordProgramTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-SceneManager.html b/docs/api/module-SceneManager.html index 8141f58fd0..b7a4a8a973 100644 --- a/docs/api/module-SceneManager.html +++ b/docs/api/module-SceneManager.html @@ -1,3 +1,3 @@ Module: SceneManager
On this page

Methods

(static) clearPreviousScene() → {void}

Clear previous scene from group stack

Returns:
Type: 
void

(static) clearScenes() → {void}

Clear all content from group stack

Returns:
Type: 
void

(static) deleteSceneAtIndex(indexopt) → {void}

Delete scene from group stack at passed index

Parameters:
NameTypeAttributesDefaultDescription
indexdynamic<optional>
1
Returns:
Type: 
void

(static) dismissDialog() → {void}

Close currently displayed dialog

Returns:
Type: 
void

(static) getActiveScene() → {object}

Return group at top of stack without removing

Returns:
Type: 
object

(static) init() → {void}

Returns:
Type: 
void

(static) isDialogOpen() → {boolean}

Returns bool indicating if dialog is currently displayed

Returns:
Type: 
boolean

(static) optionClosed() → {void}

Return button the user selected

Returns:
Type: 
void

(static) optionDialog(title, message, buttons) → {void}

Display dialog to user with an OK button

Parameters:
NameTypeDescription
titledynamic
messagedynamic
buttonsdynamic
Returns:
Type: 
void

(static) optionSelected() → {void}

Return button the user selected

Returns:
Type: 
void

(static) popScene() → {void}

Remove the current group and load the last group from the stack

Returns:
Type: 
void

(static) pushScene(newGroup) → {void}

Push a new group onto the stack, replacing the existing group on the screen

Parameters:
NameTypeDescription
newGroupdynamic
Returns:
Type: 
void

(static) radioDialog(title, message) → {void}

Display dialog to user with an OK button

Parameters:
NameTypeDescription
titledynamic
messagedynamic
Returns:
Type: 
void

(static) registerOverhangData(group) → {void}

Register observers for overhang data

Parameters:
NameTypeDescription
groupdynamic
Returns:
Type: 
void

(static) resetTime() → {void}

Reset time

Returns:
Type: 
void

(static) settings() → {void}

Display user/device settings screen

Returns:
Type: 
void

(static) standardDialog(title, message) → {void}

Display dialog to user with an OK button

Parameters:
NameTypeDescription
titledynamic
messagedynamic
Returns:
Type: 
void

(static) unregisterOverhangData(group) → {void}

Remove observers for overhang data

Parameters:
NameTypeDescription
groupdynamic
Returns:
Type: 
void

(static) updateOptions(msg) → {void}

Update options availability

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) updateOverhangTitle(msg) → {void}

Update overhang title

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) updateOverhangVisible(msg) → {void}

Update whether the overhang is visible or not

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) updateUser() → {void}

Update username in overhang

Returns:
Type: 
void

(static) userMessage(title, message) → {void}

Display dialog to user with an OK button

Parameters:
NameTypeDescription
titlestring
messagestring
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) clearPreviousScene() → {void}

Clear previous scene from group stack

Returns:
Type: 
void

(static) clearScenes() → {void}

Clear all content from group stack

Returns:
Type: 
void

(static) deleteSceneAtIndex(indexopt) → {void}

Delete scene from group stack at passed index

Parameters:
NameTypeAttributesDefaultDescription
indexdynamic<optional>
1
Returns:
Type: 
void

(static) dismissDialog() → {void}

Close currently displayed dialog

Returns:
Type: 
void

(static) getActiveScene() → {object}

Return group at top of stack without removing

Returns:
Type: 
object

(static) init() → {void}

Returns:
Type: 
void

(static) isDialogOpen() → {boolean}

Returns bool indicating if dialog is currently displayed

Returns:
Type: 
boolean

(static) optionClosed() → {void}

Return button the user selected

Returns:
Type: 
void

(static) optionDialog(title, message, buttons) → {void}

Display dialog to user with an OK button

Parameters:
NameTypeDescription
titledynamic
messagedynamic
buttonsdynamic
Returns:
Type: 
void

(static) optionSelected() → {void}

Return button the user selected

Returns:
Type: 
void

(static) popScene() → {void}

Remove the current group and load the last group from the stack

Returns:
Type: 
void

(static) pushScene(newGroup) → {void}

Push a new group onto the stack, replacing the existing group on the screen

Parameters:
NameTypeDescription
newGroupdynamic
Returns:
Type: 
void

(static) radioDialog(title, message) → {void}

Display dialog to user with an OK button

Parameters:
NameTypeDescription
titledynamic
messagedynamic
Returns:
Type: 
void

(static) registerOverhangData(group) → {void}

Register observers for overhang data

Parameters:
NameTypeDescription
groupdynamic
Returns:
Type: 
void

(static) resetTime() → {void}

Reset time

Returns:
Type: 
void

(static) settings() → {void}

Display user/device settings screen

Returns:
Type: 
void

(static) standardDialog(title, message) → {void}

Display dialog to user with an OK button

Parameters:
NameTypeDescription
titledynamic
messagedynamic
Returns:
Type: 
void

(static) unregisterOverhangData(group) → {void}

Remove observers for overhang data

Parameters:
NameTypeDescription
groupdynamic
Returns:
Type: 
void

(static) updateOptions(msg) → {void}

Update options availability

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) updateOverhangTitle(msg) → {void}

Update overhang title

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) updateOverhangVisible(msg) → {void}

Update whether the overhang is visible or not

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) updateUser() → {void}

Update username in overhang

Returns:
Type: 
void

(static) userMessage(title, message) → {void}

Display dialog to user with an OK button

Parameters:
NameTypeDescription
titlestring
messagestring
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ScheduleProgramData.html b/docs/api/module-ScheduleProgramData.html index 521ff15589..986adab758 100644 --- a/docs/api/module-ScheduleProgramData.html +++ b/docs/api/module-ScheduleProgramData.html @@ -1,3 +1,3 @@ Module: ScheduleProgramData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-SearchBox.html b/docs/api/module-SearchBox.html index bfded948c0..ad7abb89f6 100644 --- a/docs/api/module-SearchBox.html +++ b/docs/api/module-SearchBox.html @@ -1,3 +1,3 @@ Module: SearchBox
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-SearchData.html b/docs/api/module-SearchData.html index ad76f37e09..4de86e3217 100644 --- a/docs/api/module-SearchData.html +++ b/docs/api/module-SearchData.html @@ -1,3 +1,3 @@ Module: SearchData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-SearchResults.html b/docs/api/module-SearchResults.html index 68e66c20e9..6cc851cc09 100644 --- a/docs/api/module-SearchResults.html +++ b/docs/api/module-SearchResults.html @@ -1,3 +1,3 @@ Module: SearchResults
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) loadResults() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) searchMedias() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) loadResults() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) searchMedias() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-SearchRow.html b/docs/api/module-SearchRow.html index ca2e895e38..2035e15f57 100644 --- a/docs/api/module-SearchRow.html +++ b/docs/api/module-SearchRow.html @@ -1,3 +1,3 @@ Module: SearchRow
On this page

Methods

(static) addRow(data, title, type_filter) → {void}

Parameters:
NameTypeDescription
datadynamic
titledynamic
type_filterdynamic
Returns:
Type: 
void

(static) getData() → {dynamic}

Returns:
Type: 
dynamic

(static) init() → {void}

Returns:
Type: 
void

(static) updateSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) addRow(data, title, type_filter) → {void}

Parameters:
NameTypeDescription
datadynamic
titledynamic
type_filterdynamic
Returns:
Type: 
void

(static) getData() → {dynamic}

Returns:
Type: 
dynamic

(static) init() → {void}

Returns:
Type: 
void

(static) updateSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-SearchTask.html b/docs/api/module-SearchTask.html index b04f92d4c9..48a8d692ff 100644 --- a/docs/api/module-SearchTask.html +++ b/docs/api/module-SearchTask.html @@ -1,3 +1,3 @@ Module: SearchTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-SeriesData.html b/docs/api/module-SeriesData.html index 38682e6022..5471d078c6 100644 --- a/docs/api/module-SeriesData.html +++ b/docs/api/module-SeriesData.html @@ -1,3 +1,3 @@ Module: SeriesData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ServerDiscoveryTask.html b/docs/api/module-ServerDiscoveryTask.html index 7980bb8691..82dc4c9c7f 100644 --- a/docs/api/module-ServerDiscoveryTask.html +++ b/docs/api/module-ServerDiscoveryTask.html @@ -1,3 +1,3 @@ Module: ServerDiscoveryTask
On this page

Methods

(static) AddServer(server) → {void}

Parameters:
NameTypeDescription
serverdynamic
Returns:
Type: 
void

(static) ProcessClientDiscoveryResponse(message) → {void}

Parameters:
NameTypeDescription
messagedynamic
Returns:
Type: 
void

(static) ProcessSSDPResponse(message) → {void}

Parameters:
NameTypeDescription
messagedynamic
Returns:
Type: 
void

(static) SendClientDiscoveryBroadcast() → {void}

Returns:
Type: 
void

(static) SendSSDPBroadcast() → {void}

Returns:
Type: 
void

(static) execute() → {void}

Returns:
Type: 
void

(static) init() → {void}

Task used to discover jellyfin servers on the local network

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) AddServer(server) → {void}

Parameters:
NameTypeDescription
serverdynamic
Returns:
Type: 
void

(static) ProcessClientDiscoveryResponse(message) → {void}

Parameters:
NameTypeDescription
messagedynamic
Returns:
Type: 
void

(static) ProcessSSDPResponse(message) → {void}

Parameters:
NameTypeDescription
messagedynamic
Returns:
Type: 
void

(static) SendClientDiscoveryBroadcast() → {void}

Returns:
Type: 
void

(static) SendSSDPBroadcast() → {void}

Returns:
Type: 
void

(static) execute() → {void}

Returns:
Type: 
void

(static) init() → {void}

Task used to discover jellyfin servers on the local network

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-SetServerScreen.html b/docs/api/module-SetServerScreen.html index 003ad41144..f65203cbac 100644 --- a/docs/api/module-SetServerScreen.html +++ b/docs/api/module-SetServerScreen.html @@ -1,3 +1,3 @@ Module: SetServerScreen
On this page

Methods

(static) ScanForServers() → {void}

Returns:
Type: 
void

(static) ScanForServersComplete(event) → {void}

Parameters:
NameTypeDescription
eventdynamic
Returns:
Type: 
void

(static) ShowKeyboard() → {void}

Returns:
Type: 
void

(static) clearErrorMessage() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDialogButton() → {dynamic}

Returns:
Type: 
dynamic

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) ScanForServers() → {void}

Returns:
Type: 
void

(static) ScanForServersComplete(event) → {void}

Parameters:
NameTypeDescription
eventdynamic
Returns:
Type: 
void

(static) ShowKeyboard() → {void}

Returns:
Type: 
void

(static) clearErrorMessage() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onDialogButton() → {dynamic}

Returns:
Type: 
dynamic

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ShowScenes.html b/docs/api/module-ShowScenes.html index 6b3cfe30c4..d70680c02c 100644 --- a/docs/api/module-ShowScenes.html +++ b/docs/api/module-ShowScenes.html @@ -1,3 +1,3 @@ Module: ShowScenes
On this page

Methods

(static) CreateAlbumView(album) → {dynamic}

Shows details on selected album. Description text, image, and list of available songs

Parameters:
NameTypeDescription
albumobject
Returns:
Type: 
dynamic

(static) CreateArtistView(artist) → {dynamic}

Shows details on selected artist. Bio, image, and list of available albums

Parameters:
NameTypeDescription
artistobject
Returns:
Type: 
dynamic

(static) CreateHomeGroup() → {dynamic}

Returns:
Type: 
dynamic

(static) CreateItemGrid(libraryItem) → {dynamic}

Parameters:
NameTypeDescription
libraryItemobject
Returns:
Type: 
dynamic

(static) CreateMovieDetailsGroup(movie) → {dynamic}

Parameters:
NameTypeDescription
movieobject
Returns:
Type: 
dynamic

(static) CreateMovieLibraryView(libraryItem) → {dynamic}

Parameters:
NameTypeDescription
libraryItemobject
Returns:
Type: 
dynamic

(static) CreateMusicLibraryView(libraryItem) → {dynamic}

Parameters:
NameTypeDescription
libraryItemobject
Returns:
Type: 
dynamic

(static) CreatePersonView(personData) → {dynamic}

Parameters:
NameTypeDescription
personDataobject
Returns:
Type: 
dynamic

(static) CreatePlaylistView(playlist) → {dynamic}

Shows details on selected playlist. Description text, image, and list of available items

Parameters:
NameTypeDescription
playlistobject
Returns:
Type: 
dynamic

(static) CreateSearchPage() → {dynamic}

Returns:
Type: 
dynamic

(static) CreateSeasonDetailsGroup(series, season) → {dynamic}

Parameters:
NameTypeDescription
seriesobject
seasonobject
Returns:
Type: 
dynamic

(static) CreateSeasonDetailsGroupByID(seriesID, seasonID) → {dynamic}

Parameters:
NameTypeDescription
seriesIDstring
seasonIDstring
Returns:
Type: 
dynamic

(static) CreateSeriesDetailsGroup(seriesID) → {dynamic}

Parameters:
NameTypeDescription
seriesIDstring
Returns:
Type: 
dynamic

(static) CreateServerGroup() → {dynamic}

Returns:
Type: 
dynamic

(static) CreateSigninGroup(useropt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
userdynamic<optional>
""
Returns:
Type: 
dynamic

(static) CreateUserSelectGroup(usersopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
usersdynamic<optional>
[]
Returns:
Type: 
dynamic

(static) CreateVideoPlayerGroup(video_id, mediaSourceIdopt, audio_stream_idxopt, forceTranscodingopt, showIntroopt, allowResumeDialogopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
video_idstring
mediaSourceIddynamic<optional>
invalid
audio_stream_idxinteger<optional>
1
forceTranscodingboolean<optional>
false
showIntroboolean<optional>
true
allowResumeDialogboolean<optional>
true
Returns:
Type: 
dynamic

(static) DeleteFromServerList(urlToDelete) → {void}

Parameters:
NameTypeDescription
urlToDeletedynamic
Returns:
Type: 
void

(static) LoginFlow() → {dynamic}

Returns:
Type: 
dynamic

(static) SaveServerList() → {void}

Returns:
Type: 
void

(static) SendPerformanceBeacon(signalName) → {void}

Roku Performance monitoring

Parameters:
NameTypeDescription
signalNamestring
Returns:
Type: 
void

(static) playbackOptionDialog(time, meta) → {void}

Opens dialog asking user if they want to resume video or start playback over only on the home screen

Parameters:
NameTypeDescription
timelonginteger
metaobject
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) CreateAlbumView(album) → {dynamic}

Shows details on selected album. Description text, image, and list of available songs

Parameters:
NameTypeDescription
albumobject
Returns:
Type: 
dynamic

(static) CreateArtistView(artist) → {dynamic}

Shows details on selected artist. Bio, image, and list of available albums

Parameters:
NameTypeDescription
artistobject
Returns:
Type: 
dynamic

(static) CreateHomeGroup() → {dynamic}

Returns:
Type: 
dynamic

(static) CreateItemGrid(libraryItem) → {dynamic}

Parameters:
NameTypeDescription
libraryItemobject
Returns:
Type: 
dynamic

(static) CreateMovieDetailsGroup(movie) → {dynamic}

Parameters:
NameTypeDescription
movieobject
Returns:
Type: 
dynamic

(static) CreateMovieLibraryView(libraryItem) → {dynamic}

Parameters:
NameTypeDescription
libraryItemobject
Returns:
Type: 
dynamic

(static) CreateMusicLibraryView(libraryItem) → {dynamic}

Parameters:
NameTypeDescription
libraryItemobject
Returns:
Type: 
dynamic

(static) CreatePersonView(personData) → {dynamic}

Parameters:
NameTypeDescription
personDataobject
Returns:
Type: 
dynamic

(static) CreatePlaylistView(playlist) → {dynamic}

Shows details on selected playlist. Description text, image, and list of available items

Parameters:
NameTypeDescription
playlistobject
Returns:
Type: 
dynamic

(static) CreateSearchPage() → {dynamic}

Returns:
Type: 
dynamic

(static) CreateSeasonDetailsGroup(series, season) → {dynamic}

Parameters:
NameTypeDescription
seriesobject
seasonobject
Returns:
Type: 
dynamic

(static) CreateSeasonDetailsGroupByID(seriesID, seasonID) → {dynamic}

Parameters:
NameTypeDescription
seriesIDstring
seasonIDstring
Returns:
Type: 
dynamic

(static) CreateSeriesDetailsGroup(seriesID) → {dynamic}

Parameters:
NameTypeDescription
seriesIDstring
Returns:
Type: 
dynamic

(static) CreateServerGroup() → {dynamic}

Returns:
Type: 
dynamic

(static) CreateSigninGroup(useropt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
userdynamic<optional>
""
Returns:
Type: 
dynamic

(static) CreateUserSelectGroup(usersopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
usersdynamic<optional>
[]
Returns:
Type: 
dynamic

(static) CreateVideoPlayerGroup(video_id, mediaSourceIdopt, audio_stream_idxopt, forceTranscodingopt, showIntroopt, allowResumeDialogopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
video_idstring
mediaSourceIddynamic<optional>
invalid
audio_stream_idxinteger<optional>
1
forceTranscodingboolean<optional>
false
showIntroboolean<optional>
true
allowResumeDialogboolean<optional>
true
Returns:
Type: 
dynamic

(static) DeleteFromServerList(urlToDelete) → {void}

Parameters:
NameTypeDescription
urlToDeletedynamic
Returns:
Type: 
void

(static) LoginFlow() → {dynamic}

Returns:
Type: 
dynamic

(static) SaveServerList() → {void}

Returns:
Type: 
void

(static) SendPerformanceBeacon(signalName) → {void}

Roku Performance monitoring

Parameters:
NameTypeDescription
signalNamestring
Returns:
Type: 
void

(static) playbackOptionDialog(time, meta) → {void}

Opens dialog asking user if they want to resume video or start playback over only on the home screen

Parameters:
NameTypeDescription
timelonginteger
metaobject
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-SlideOutButton.html b/docs/api/module-SlideOutButton.html index 9584434c7f..5c95354f83 100644 --- a/docs/api/module-SlideOutButton.html +++ b/docs/api/module-SlideOutButton.html @@ -1,3 +1,3 @@ Module: SlideOutButton
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onBackgroundChanged() → {void}

Returns:
Type: 
void

(static) onFocusChanged() → {void}

Returns:
Type: 
void

(static) onHeightChanged() → {void}

Returns:
Type: 
void

(static) onHighlightChanged() → {void}

Returns:
Type: 
void

(static) onIconChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onPaddingChanged() → {void}

Returns:
Type: 
void

(static) onTextChanged() → {void}

Returns:
Type: 
void

(static) onWidthChanged() → {void}

Returns:
Type: 
void

(static) setIconSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onBackgroundChanged() → {void}

Returns:
Type: 
void

(static) onFocusChanged() → {void}

Returns:
Type: 
void

(static) onHeightChanged() → {void}

Returns:
Type: 
void

(static) onHighlightChanged() → {void}

Returns:
Type: 
void

(static) onIconChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onPaddingChanged() → {void}

Returns:
Type: 
void

(static) onTextChanged() → {void}

Returns:
Type: 
void

(static) onWidthChanged() → {void}

Returns:
Type: 
void

(static) setIconSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-SongItem.html b/docs/api/module-SongItem.html index fd45f5a5ee..afc1569983 100644 --- a/docs/api/module-SongItem.html +++ b/docs/api/module-SongItem.html @@ -1,3 +1,3 @@ Module: SongItem
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-Spinner.html b/docs/api/module-Spinner.html index 84b3bda77c..6e8722ee0b 100644 --- a/docs/api/module-Spinner.html +++ b/docs/api/module-Spinner.html @@ -1,3 +1,3 @@ Module: Spinner
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-StandardDialog.html b/docs/api/module-StandardDialog.html index 8a1bb34878..51e04b8f65 100644 --- a/docs/api/module-StandardDialog.html +++ b/docs/api/module-StandardDialog.html @@ -1,3 +1,3 @@ Module: StandardDialog
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-Subtitles.html b/docs/api/module-Subtitles.html index 47ba1340ec..4b47b7377e 100644 --- a/docs/api/module-Subtitles.html +++ b/docs/api/module-Subtitles.html @@ -1,3 +1,3 @@ Module: Subtitles
On this page

Methods

(static) availSubtitleTrackIdx(video, sub_idx) → {integer}

Roku translates the info provided in subtitleTracks into availableSubtitleTracks Including ignoring tracks, if they are not understood, thus making indexing unpredictable. This function translates between our internel selected subtitle index and the corresponding index in availableSubtitleTracks.

Parameters:
NameTypeDescription
videodynamic
sub_idxdynamic
Returns:
Type: 
integer

(static) changeSubtitleDuringPlayback(newid) → {void}

Parameters:
NameTypeDescription
newiddynamic
Returns:
Type: 
void

(static) defaultSubtitleTrack(sorted_subtitles, require_textopt) → {integer}

Identify the default subtitle track if "requires_text" is true, only return a track if it is textual This allows forcing text subs, since roku requires transcoding of non-text subs returns the server-side track index for the appriate subtitle

Parameters:
NameTypeAttributesDefaultDescription
sorted_subtitlesdynamic
require_textdynamic<optional>
false
Returns:
Type: 
integer

(static) defaultSubtitleTrackFromVid(video_id) → {integer}

Identify the default subtitle track for a given video id returns the server-side track index for the appriate subtitle

Parameters:
NameTypeDescription
video_iddynamic
Returns:
Type: 
integer

(static) getSubtitleLanguages() → {dynamic}

Returns:
Type: 
dynamic

(static) getSubtitleSelIdxFromSubIdx(subtitles, sub_idx) → {integer}

The subtitle index on the server differs from the index we track locally This function converts the former into the latter

Parameters:
NameTypeDescription
subtitlesdynamic
sub_idxdynamic
Returns:
Type: 
integer

(static) selectSubtitleTrack(tracks, currentopt) → {integer}

Parameters:
NameTypeAttributesDefaultDescription
tracksdynamic
currentdynamic<optional>
-1
Returns:
Type: 
integer

(static) selectSubtitleTrackDialog(tracks, currentTrackopt) → {dynamic}

Present Dialog to user to select subtitle track

Parameters:
NameTypeAttributesDefaultDescription
tracksdynamic
currentTrackdynamic<optional>
-1
Returns:
Type: 
dynamic

(static) setupSubtitle(video, subtitles, subtitle_idxopt) → {integer}

Given a set of subtitles, and a subtitle index (the index on the server, not in the list provided) this will set all relevant settings for roku (mainly closed captions) and return the index of the subtitle track specified, but indexed based on the provided list of subtitles

Parameters:
NameTypeAttributesDefaultDescription
videodynamic
subtitlesdynamic
subtitle_idxdynamic<optional>
-1
Returns:
Type: 
integer

(static) sortSubtitles(id, MediaStreams) → {dynamic}

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

Parameters:
NameTypeDescription
idstring
MediaStreamsdynamic
Returns:
Type: 
dynamic

(static) turnoffSubtitles() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) availSubtitleTrackIdx(video, sub_idx) → {integer}

Roku translates the info provided in subtitleTracks into availableSubtitleTracks Including ignoring tracks, if they are not understood, thus making indexing unpredictable. This function translates between our internel selected subtitle index and the corresponding index in availableSubtitleTracks.

Parameters:
NameTypeDescription
videodynamic
sub_idxdynamic
Returns:
Type: 
integer

(static) changeSubtitleDuringPlayback(newid) → {void}

Parameters:
NameTypeDescription
newiddynamic
Returns:
Type: 
void

(static) defaultSubtitleTrack(sorted_subtitles, require_textopt) → {integer}

Identify the default subtitle track if "requires_text" is true, only return a track if it is textual This allows forcing text subs, since roku requires transcoding of non-text subs returns the server-side track index for the appriate subtitle

Parameters:
NameTypeAttributesDefaultDescription
sorted_subtitlesdynamic
require_textdynamic<optional>
false
Returns:
Type: 
integer

(static) defaultSubtitleTrackFromVid(video_id) → {integer}

Identify the default subtitle track for a given video id returns the server-side track index for the appriate subtitle

Parameters:
NameTypeDescription
video_iddynamic
Returns:
Type: 
integer

(static) getSubtitleLanguages() → {dynamic}

Returns:
Type: 
dynamic

(static) getSubtitleSelIdxFromSubIdx(subtitles, sub_idx) → {integer}

The subtitle index on the server differs from the index we track locally This function converts the former into the latter

Parameters:
NameTypeDescription
subtitlesdynamic
sub_idxdynamic
Returns:
Type: 
integer

(static) selectSubtitleTrack(tracks, currentopt) → {integer}

Parameters:
NameTypeAttributesDefaultDescription
tracksdynamic
currentdynamic<optional>
-1
Returns:
Type: 
integer

(static) selectSubtitleTrackDialog(tracks, currentTrackopt) → {dynamic}

Present Dialog to user to select subtitle track

Parameters:
NameTypeAttributesDefaultDescription
tracksdynamic
currentTrackdynamic<optional>
-1
Returns:
Type: 
dynamic

(static) setupSubtitle(video, subtitles, subtitle_idxopt) → {integer}

Given a set of subtitles, and a subtitle index (the index on the server, not in the list provided) this will set all relevant settings for roku (mainly closed captions) and return the index of the subtitle track specified, but indexed based on the provided list of subtitles

Parameters:
NameTypeAttributesDefaultDescription
videodynamic
subtitlesdynamic
subtitle_idxdynamic<optional>
-1
Returns:
Type: 
integer

(static) sortSubtitles(id, MediaStreams) → {dynamic}

Checks available subtitle tracks and puts subtitles in forced, default, and non-default/forced but preferred language at the top

Parameters:
NameTypeDescription
idstring
MediaStreamsdynamic
Returns:
Type: 
dynamic

(static) turnoffSubtitles() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TVEpisode.html b/docs/api/module-TVEpisode.html index 2279a19a20..8198053c5f 100644 --- a/docs/api/module-TVEpisode.html +++ b/docs/api/module-TVEpisode.html @@ -1,3 +1,3 @@ Module: TVEpisode
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TVEpisodeData.html b/docs/api/module-TVEpisodeData.html index a990ce9ea5..a009d0bbcb 100644 --- a/docs/api/module-TVEpisodeData.html +++ b/docs/api/module-TVEpisodeData.html @@ -1,3 +1,3 @@ Module: TVEpisodeData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TVEpisodeRow.html b/docs/api/module-TVEpisodeRow.html index 7294ef0a04..2ec223a951 100644 --- a/docs/api/module-TVEpisodeRow.html +++ b/docs/api/module-TVEpisodeRow.html @@ -1,3 +1,3 @@ Module: TVEpisodeRow
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) setData() → {dynamic}

Returns:
Type: 
dynamic

(static) setupRows() → {void}

Returns:
Type: 
void

(static) updateSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) setData() → {dynamic}

Returns:
Type: 
dynamic

(static) setupRows() → {void}

Returns:
Type: 
void

(static) updateSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TVEpisodeRowWithOptions.html b/docs/api/module-TVEpisodeRowWithOptions.html index 434d4e738e..cf1917cca4 100644 --- a/docs/api/module-TVEpisodeRowWithOptions.html +++ b/docs/api/module-TVEpisodeRowWithOptions.html @@ -1,3 +1,3 @@ Module: TVEpisodeRowWithOptions
On this page

Methods

(static) SetUpAudioOptions(streams) → {void}

List of audio tracks to choose from

Parameters:
NameTypeDescription
streamsobject
Returns:
Type: 
void

(static) SetUpVideoOptions(streams) → {void}

List of video versions to choose from

Parameters:
NameTypeDescription
streamsobject
Returns:
Type: 
void

(static) audioOptionsClosed() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) rowsDoneLoading() → {void}

Returns:
Type: 
void

(static) setupRows() → {void}

Returns:
Type: 
void

(static) videoOptionsClosed() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) SetUpAudioOptions(streams) → {void}

List of audio tracks to choose from

Parameters:
NameTypeDescription
streamsobject
Returns:
Type: 
void

(static) SetUpVideoOptions(streams) → {void}

List of video versions to choose from

Parameters:
NameTypeDescription
streamsobject
Returns:
Type: 
void

(static) audioOptionsClosed() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) rowsDoneLoading() → {void}

Returns:
Type: 
void

(static) setupRows() → {void}

Returns:
Type: 
void

(static) videoOptionsClosed() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TVEpisodes.html b/docs/api/module-TVEpisodes.html index e37f67e379..bdc2c85605 100644 --- a/docs/api/module-TVEpisodes.html +++ b/docs/api/module-TVEpisodes.html @@ -1,3 +1,3 @@ Module: TVEpisodes
On this page

Methods

(static) getFocusedItem() → {dynamic}

get the currently focused item

Returns:
Type: 
dynamic

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Handle navigation input from the remote and act on it

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) setExtraButtonVisibility() → {void}

Updates the visibility of the Extras button based on if this season has any extra features

Returns:
Type: 
void

(static) setSeasonLoading() → {void}

Returns:
Type: 
void

(static) updateSeason() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) getFocusedItem() → {dynamic}

get the currently focused item

Returns:
Type: 
dynamic

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Handle navigation input from the remote and act on it

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) setExtraButtonVisibility() → {void}

Updates the visibility of the Extras button based on if this season has any extra features

Returns:
Type: 
void

(static) setSeasonLoading() → {void}

Returns:
Type: 
void

(static) updateSeason() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TVListDetails.html b/docs/api/module-TVListDetails.html index 00ee77ba83..d3605863e1 100644 --- a/docs/api/module-TVListDetails.html +++ b/docs/api/module-TVListDetails.html @@ -1,3 +1,3 @@ Module: TVListDetails
On this page

Methods

(static) DisplayAudioAvailable(streams) → {void}

Adds "+N" (e.g. +1) if there is more than one audio track to choose from

Parameters:
NameTypeDescription
streamsobject
Returns:
Type: 
void

(static) DisplayVideoAvailable(streams) → {void}

Adds "+N" (e.g. +1) if there is more than one video version to choose from

Parameters:
NameTypeDescription
streamsobject
Returns:
Type: 
void

(static) SetupAudioDisplay(mediaStreams, selectedAudioStreamIndex) → {void}

Display current audio_codec and check if there is more than one audio track to choose from...

Parameters:
NameTypeDescription
mediaStreamsobject
selectedAudioStreamIndexinteger
Returns:
Type: 
void

(static) focusChanged() → {void}

Returns:
Type: 
void

(static) getEndTime() → {string}

Returns:
Type: 
string

(static) getRuntime() → {integer}

Returns:
Type: 
integer

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) DisplayAudioAvailable(streams) → {void}

Adds "+N" (e.g. +1) if there is more than one audio track to choose from

Parameters:
NameTypeDescription
streamsobject
Returns:
Type: 
void

(static) DisplayVideoAvailable(streams) → {void}

Adds "+N" (e.g. +1) if there is more than one video version to choose from

Parameters:
NameTypeDescription
streamsobject
Returns:
Type: 
void

(static) SetupAudioDisplay(mediaStreams, selectedAudioStreamIndex) → {void}

Display current audio_codec and check if there is more than one audio track to choose from...

Parameters:
NameTypeDescription
mediaStreamsobject
selectedAudioStreamIndexinteger
Returns:
Type: 
void

(static) focusChanged() → {void}

Returns:
Type: 
void

(static) getEndTime() → {string}

Returns:
Type: 
string

(static) getRuntime() → {integer}

Returns:
Type: 
integer

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TVListOptions.html b/docs/api/module-TVListOptions.html index e879572019..4d169d4d10 100644 --- a/docs/api/module-TVListOptions.html +++ b/docs/api/module-TVListOptions.html @@ -1,3 +1,3 @@ Module: TVListOptions
On this page

Methods

(static) buttonFocusChanged() → {void}

Switch menu shown when button focus changes

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) optionsSet() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) buttonFocusChanged() → {void}

Switch menu shown when button focus changes

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) optionsSet() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TVSeasonData.html b/docs/api/module-TVSeasonData.html index ded2161e05..31f2bb8c91 100644 --- a/docs/api/module-TVSeasonData.html +++ b/docs/api/module-TVSeasonData.html @@ -1,3 +1,3 @@ Module: TVSeasonData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TVSeasonRow.html b/docs/api/module-TVSeasonRow.html index 3cfb0a57cd..8139ebcd90 100644 --- a/docs/api/module-TVSeasonRow.html +++ b/docs/api/module-TVSeasonRow.html @@ -1,3 +1,3 @@ Module: TVSeasonRow
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TVShowDescription.html b/docs/api/module-TVShowDescription.html index 16cd629abe..21c2c3ebc3 100644 --- a/docs/api/module-TVShowDescription.html +++ b/docs/api/module-TVShowDescription.html @@ -1,3 +1,3 @@ Module: TVShowDescription
On this page

Methods

(static) getEndTime() → {string}

Returns:
Type: 
string

(static) getHistory() → {string}

Returns:
Type: 
string

(static) getRuntime() → {integer}

Returns:
Type: 
integer

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) round(f) → {integer}

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) setFieldText(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) getEndTime() → {string}

Returns:
Type: 
string

(static) getHistory() → {string}

Returns:
Type: 
string

(static) getRuntime() → {integer}

Returns:
Type: 
integer

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) round(f) → {integer}

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) setFieldText(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TVShowDetails.html b/docs/api/module-TVShowDetails.html index 646aed1d47..bc00f9e1b3 100644 --- a/docs/api/module-TVShowDetails.html +++ b/docs/api/module-TVShowDetails.html @@ -1,3 +1,3 @@ Module: TVShowDetails
On this page

Methods

(static) getEndTime() → {string}

Returns:
Type: 
string

(static) getHistory() → {string}

Returns:
Type: 
string

(static) getRuntime() → {integer}

Returns:
Type: 
integer

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onShuffleEpisodeDataLoaded() → {void}

Returns:
Type: 
void

(static) round(f) → {integer}

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) setFieldText(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) getEndTime() → {string}

Returns:
Type: 
string

(static) getHistory() → {string}

Returns:
Type: 
string

(static) getRuntime() → {integer}

Returns:
Type: 
integer

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onShuffleEpisodeDataLoaded() → {void}

Returns:
Type: 
void

(static) round(f) → {integer}

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) setFieldText(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-TextSizeTask.html b/docs/api/module-TextSizeTask.html index 2d39728edd..5d0ec98d82 100644 --- a/docs/api/module-TextSizeTask.html +++ b/docs/api/module-TextSizeTask.html @@ -1,3 +1,3 @@ Module: TextSizeTask
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-UserData.html b/docs/api/module-UserData.html index f26972ea08..bb9c9720ee 100644 --- a/docs/api/module-UserData.html +++ b/docs/api/module-UserData.html @@ -1,3 +1,3 @@ Module: UserData
On this page

Methods

(static) getPreference(key) → {dynamic}

Parameters:
NameTypeDescription
keystring
Returns:
Type: 
dynamic

(static) loadFromJSON(json) → {void}

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) loadFromRegistry(id) → {void}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
void

(static) removeFromRegistry() → {void}

Returns:
Type: 
void

(static) saveToRegistry() → {void}

Returns:
Type: 
void

(static) setDataFromJSON() → {void}

Returns:
Type: 
void

(static) setPreference(key, value) → {dynamic}

Parameters:
NameTypeDescription
keystring
valuestring
Returns:
Type: 
dynamic

(static) setServer(hostname) → {void}

Parameters:
NameTypeDescription
hostnamestring
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) getPreference(key) → {dynamic}

Parameters:
NameTypeDescription
keystring
Returns:
Type: 
dynamic

(static) loadFromJSON(json) → {void}

Parameters:
NameTypeDescription
jsondynamic
Returns:
Type: 
void

(static) loadFromRegistry(id) → {void}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
void

(static) removeFromRegistry() → {void}

Returns:
Type: 
void

(static) saveToRegistry() → {void}

Returns:
Type: 
void

(static) setDataFromJSON() → {void}

Returns:
Type: 
void

(static) setPreference(key, value) → {dynamic}

Parameters:
NameTypeDescription
keystring
valuestring
Returns:
Type: 
dynamic

(static) setServer(hostname) → {void}

Parameters:
NameTypeDescription
hostnamestring
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-UserItem.html b/docs/api/module-UserItem.html index 815943b0be..f0e7e4afc8 100644 --- a/docs/api/module-UserItem.html +++ b/docs/api/module-UserItem.html @@ -1,3 +1,3 @@ Module: UserItem
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-UserLibrary.html b/docs/api/module-UserLibrary.html index c3f847125b..d8efcccbf6 100644 --- a/docs/api/module-UserLibrary.html +++ b/docs/api/module-UserLibrary.html @@ -1,3 +1,3 @@ Module: UserLibrary
On this page

Methods

(static) MarkItemFavorite(id) → {dynamic}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) MarkItemWatched(id) → {void}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
void

(static) UnmarkItemFavorite(id) → {dynamic}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) UnmarkItemWatched(id) → {dynamic}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) MarkItemFavorite(id) → {dynamic}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) MarkItemWatched(id) → {void}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
void

(static) UnmarkItemFavorite(id) → {dynamic}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(static) UnmarkItemWatched(id) → {dynamic}

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-UserRow.html b/docs/api/module-UserRow.html index d5b31d5d96..11f64102b8 100644 --- a/docs/api/module-UserRow.html +++ b/docs/api/module-UserRow.html @@ -1,3 +1,3 @@ Module: UserRow
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) setData() → {dynamic}

Returns:
Type: 
dynamic

(static) setUser() → {void}

Returns:
Type: 
void

(static) updateSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) setData() → {dynamic}

Returns:
Type: 
dynamic

(static) setUser() → {void}

Returns:
Type: 
void

(static) updateSize() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-UserSelect.html b/docs/api/module-UserSelect.html index edfcd2f1f8..c5369ab429 100644 --- a/docs/api/module-UserSelect.html +++ b/docs/api/module-UserSelect.html @@ -1,3 +1,3 @@ Module: UserSelect
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-VideoData.html b/docs/api/module-VideoData.html index ab9f13f7da..16b006b014 100644 --- a/docs/api/module-VideoData.html +++ b/docs/api/module-VideoData.html @@ -1,3 +1,3 @@ Module: VideoData
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-VideoPlayer.html b/docs/api/module-VideoPlayer.html index c2f5021ad4..93e310269f 100644 --- a/docs/api/module-VideoPlayer.html +++ b/docs/api/module-VideoPlayer.html @@ -1,3 +1,3 @@ Module: VideoPlayer
On this page

Methods

(static) AddVideoContent(video, mediaSourceId, audio_stream_idxopt, subtitle_idxopt, playbackPositionopt, forceTranscodingopt, showIntroopt, allowResumeDialogopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
videoobject
mediaSourceIddynamic
audio_stream_idxinteger<optional>
1
subtitle_idxinteger<optional>
-1
playbackPositioninteger<optional>
-1
forceTranscodingboolean<optional>
false
showIntroboolean<optional>
true
allowResumeDialogboolean<optional>
true
Returns:
Type: 
void

(static) GetPlaybackInfo() → {dynamic}

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.

Returns:
Type: 
dynamic

(static) GetTranscodingStats(deviceSession) → {dynamic}

Parameters:
NameTypeDescription
deviceSessiondynamic
Returns:
Type: 
dynamic

(static) PlayIntroVideo(video_id, audio_stream_idx) → {boolean}

Parameters:
NameTypeDescription
video_iddynamic
audio_stream_idxdynamic
Returns:
Type: 
boolean

(static) VideoPlayer(id, mediaSourceIdopt, audio_stream_idxopt, subtitle_idxopt, forceTranscodingopt, showIntroopt, allowResumeDialogopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
mediaSourceIddynamic<optional>
invalid
audio_stream_idxinteger<optional>
1
subtitle_idxinteger<optional>
-1
forceTranscodingboolean<optional>
false
showIntroboolean<optional>
true
allowResumeDialogboolean<optional>
true
Returns:
Type: 
dynamic

(static) autoPlayNextEpisode(videoID, showID) → {void}

Parameters:
NameTypeDescription
videoIDstring
showIDstring
Returns:
Type: 
void

(static) directPlaySupported(meta) → {boolean}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
boolean

(static) getAudioFormat(meta) → {string}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
string

(static) getAudioInfo(meta) → {object}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
object

(static) getContainerType(meta) → {string}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
string

(static) getDisplayBitrate(bitrate) → {dynamic}

Parameters:
NameTypeDescription
bitratedynamic
Returns:
Type: 
dynamic

(static) getTranscodeReasons(url) → {object}

Extract array of Transcode Reasons from the content URL

Parameters:
NameTypeDescription
urlstring
Returns:
  • Array of Strings
Type: 
object

(static) havePlaybackInfo() → {dynamic}

Returns:
Type: 
dynamic

(static) startPlayBackOver(time) → {integer}

Opens dialog asking user if they want to resume video or start playback over only on the home screen

Parameters:
NameTypeDescription
timelonginteger
Returns:
Type: 
integer
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) AddVideoContent(video, mediaSourceId, audio_stream_idxopt, subtitle_idxopt, playbackPositionopt, forceTranscodingopt, showIntroopt, allowResumeDialogopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
videoobject
mediaSourceIddynamic
audio_stream_idxinteger<optional>
1
subtitle_idxinteger<optional>
-1
playbackPositioninteger<optional>
-1
forceTranscodingboolean<optional>
false
showIntroboolean<optional>
true
allowResumeDialogboolean<optional>
true
Returns:
Type: 
void

(static) GetPlaybackInfo() → {dynamic}

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.

Returns:
Type: 
dynamic

(static) GetTranscodingStats(deviceSession) → {dynamic}

Parameters:
NameTypeDescription
deviceSessiondynamic
Returns:
Type: 
dynamic

(static) PlayIntroVideo(video_id, audio_stream_idx) → {boolean}

Parameters:
NameTypeDescription
video_iddynamic
audio_stream_idxdynamic
Returns:
Type: 
boolean

(static) VideoPlayer(id, mediaSourceIdopt, audio_stream_idxopt, subtitle_idxopt, forceTranscodingopt, showIntroopt, allowResumeDialogopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
mediaSourceIddynamic<optional>
invalid
audio_stream_idxinteger<optional>
1
subtitle_idxinteger<optional>
-1
forceTranscodingboolean<optional>
false
showIntroboolean<optional>
true
allowResumeDialogboolean<optional>
true
Returns:
Type: 
dynamic

(static) autoPlayNextEpisode(videoID, showID) → {void}

Parameters:
NameTypeDescription
videoIDstring
showIDstring
Returns:
Type: 
void

(static) directPlaySupported(meta) → {boolean}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
boolean

(static) getAudioFormat(meta) → {string}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
string

(static) getAudioInfo(meta) → {object}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
object

(static) getContainerType(meta) → {string}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
string

(static) getDisplayBitrate(bitrate) → {dynamic}

Parameters:
NameTypeDescription
bitratedynamic
Returns:
Type: 
dynamic

(static) getTranscodeReasons(url) → {object}

Extract array of Transcode Reasons from the content URL

Parameters:
NameTypeDescription
urlstring
Returns:
  • Array of Strings
Type: 
object

(static) havePlaybackInfo() → {dynamic}

Returns:
Type: 
dynamic

(static) startPlayBackOver(time) → {integer}

Opens dialog asking user if they want to resume video or start playback over only on the home screen

Parameters:
NameTypeDescription
timelonginteger
Returns:
Type: 
integer
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-VideoPlayerView.html b/docs/api/module-VideoPlayerView.html index b2c1482c34..21ce5aa54c 100644 --- a/docs/api/module-VideoPlayerView.html +++ b/docs/api/module-VideoPlayerView.html @@ -1,3 +1,3 @@ Module: VideoPlayerView
On this page

Methods

(static) ReportPlayback(stateopt) → {void}

Report playback to server

Parameters:
NameTypeAttributesDefaultDescription
statestring<optional>
"update"
Returns:
Type: 
void

(static) bufferCheck(msg) → {void}

Check the the buffering has not hung

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) checkTimeToDisplayNextEpisode() → {void}

Checks if we need to display the Next Episode button

Returns:
Type: 
void

(static) getCurrentChapterIndex() → {integer}

getCurrentChapterIndex: Finds current chapter index

Returns:
  • indicating index of current chapter within chapter data or 0 if chapter lookup fails
Type: 
integer

(static) handleChapterListAction() → {void}

handleChapterListAction: Handles action to show chapter list

Returns:
Type: 
void

(static) handleChapterSkipAction(action) → {void}

handleChapterSkipAction: Handles user command to skip chapters in playing video

Parameters:
NameTypeDescription
actionstring
Returns:
Type: 
void

(static) handleHideAction(resume) → {void}

handleHideAction: Handles action to hide OSD menu

Parameters:
NameTypeDescription
resumeboolean

controls whether or not to resume video playback when sub is called

Returns:
Type: 
void

(static) handleShowSubtitleMenuAction() → {void}

handleShowSubtitleMenuAction: Handles action to show subtitle selection menu

Returns:
Type: 
void

(static) handleShowVideoInfoPopupAction() → {void}

handleShowVideoInfoPopupAction: Handles action to show video info popup

Returns:
Type: 
void

(static) handleVideoPlayPauseAction() → {void}

handleVideoPlayPauseAction: Handles action to either play or pause the video content

Returns:
Type: 
void

(static) hideNextEpisodeButton() → {void}

Runs hide Next Episode button animation and sets focus back to video

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) loadCaption() → {void}

Set caption url to server subtitle track

Returns:
Type: 
void

(static) onAllowCaptionsChange() → {void}

Only setup caption items if captions are allowed

Returns:
Type: 
void

(static) onContentChange() → {void}

Event handler for when video content field changes

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onNextEpisodeDataLoaded() → {void}

Returns:
Type: 
void

(static) onOSDAction() → {void}

onOSDAction: Process action events from OSD to their respective handlers

Returns:
Type: 
void

(static) onPlaybackErrorButtonSelected(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onPlaybackErrorDialogClosed(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onPositionChanged() → {void}

When Video Player state changes

Returns:
Type: 
void

(static) onState(msg) → {void}

When Video Player state changes

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onSubtitleChange() → {void}

Event handler for when selectedSubtitle changes

Returns:
Type: 
void

(static) onVideoContentLoaded() → {void}

Returns:
Type: 
void

(static) populateChapterMenu() → {void}

populateChapterMenu: ' Parse chapter data from API and appeand to chapter list menu

Returns:
Type: 
void

(static) showNextEpisodeButton() → {void}

Runs Next Episode button animation and sets focus to button

Returns:
Type: 
void

(static) showPlaybackErrorDialog(errorMessage) → {void}

Parameters:
NameTypeDescription
errorMessagestring
Returns:
Type: 
void

(static) stateAllowsOSD() → {boolean}

stateAllowsOSD: Check if current video state allows showing the OSD

Returns:
  • indicating if video state allows the OSD to show
Type: 
boolean

(static) toggleCaption() → {void}

Toggles visibility of custom subtitles and sets captionTask's player state

Returns:
Type: 
void

(static) updateCaption() → {void}

Removes old subtitle lines and adds new subtitle lines

Returns:
Type: 
void

(static) updateCount() → {void}

Update count down text

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) ReportPlayback(stateopt) → {void}

Report playback to server

Parameters:
NameTypeAttributesDefaultDescription
statestring<optional>
"update"
Returns:
Type: 
void

(static) bufferCheck(msg) → {void}

Check the the buffering has not hung

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) checkTimeToDisplayNextEpisode() → {void}

Checks if we need to display the Next Episode button

Returns:
Type: 
void

(static) getCurrentChapterIndex() → {integer}

getCurrentChapterIndex: Finds current chapter index

Returns:
  • indicating index of current chapter within chapter data or 0 if chapter lookup fails
Type: 
integer

(static) handleChapterListAction() → {void}

handleChapterListAction: Handles action to show chapter list

Returns:
Type: 
void

(static) handleChapterSkipAction(action) → {void}

handleChapterSkipAction: Handles user command to skip chapters in playing video

Parameters:
NameTypeDescription
actionstring
Returns:
Type: 
void

(static) handleHideAction(resume) → {void}

handleHideAction: Handles action to hide OSD menu

Parameters:
NameTypeDescription
resumeboolean

controls whether or not to resume video playback when sub is called

Returns:
Type: 
void

(static) handleShowSubtitleMenuAction() → {void}

handleShowSubtitleMenuAction: Handles action to show subtitle selection menu

Returns:
Type: 
void

(static) handleShowVideoInfoPopupAction() → {void}

handleShowVideoInfoPopupAction: Handles action to show video info popup

Returns:
Type: 
void

(static) handleVideoPlayPauseAction() → {void}

handleVideoPlayPauseAction: Handles action to either play or pause the video content

Returns:
Type: 
void

(static) hideNextEpisodeButton() → {void}

Runs hide Next Episode button animation and sets focus back to video

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) loadCaption() → {void}

Set caption url to server subtitle track

Returns:
Type: 
void

(static) onAllowCaptionsChange() → {void}

Only setup caption items if captions are allowed

Returns:
Type: 
void

(static) onContentChange() → {void}

Event handler for when video content field changes

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onNextEpisodeDataLoaded() → {void}

Returns:
Type: 
void

(static) onOSDAction() → {void}

onOSDAction: Process action events from OSD to their respective handlers

Returns:
Type: 
void

(static) onPlaybackErrorButtonSelected(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onPlaybackErrorDialogClosed(msg) → {void}

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onPositionChanged() → {void}

When Video Player state changes

Returns:
Type: 
void

(static) onState(msg) → {void}

When Video Player state changes

Parameters:
NameTypeDescription
msgdynamic
Returns:
Type: 
void

(static) onSubtitleChange() → {void}

Event handler for when selectedSubtitle changes

Returns:
Type: 
void

(static) onVideoContentLoaded() → {void}

Returns:
Type: 
void

(static) populateChapterMenu() → {void}

populateChapterMenu: ' Parse chapter data from API and appeand to chapter list menu

Returns:
Type: 
void

(static) showNextEpisodeButton() → {void}

Runs Next Episode button animation and sets focus to button

Returns:
Type: 
void

(static) showPlaybackErrorDialog(errorMessage) → {void}

Parameters:
NameTypeDescription
errorMessagestring
Returns:
Type: 
void

(static) stateAllowsOSD() → {boolean}

stateAllowsOSD: Check if current video state allows showing the OSD

Returns:
  • indicating if video state allows the OSD to show
Type: 
boolean

(static) toggleCaption() → {void}

Toggles visibility of custom subtitles and sets captionTask's player state

Returns:
Type: 
void

(static) updateCaption() → {void}

Removes old subtitle lines and adds new subtitle lines

Returns:
Type: 
void

(static) updateCount() → {void}

Update count down text

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-VideoTrackListItem.html b/docs/api/module-VideoTrackListItem.html index d7578503b4..66d23390d8 100644 --- a/docs/api/module-VideoTrackListItem.html +++ b/docs/api/module-VideoTrackListItem.html @@ -1,3 +1,3 @@ Module: VideoTrackListItem
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-ViewCreator.html b/docs/api/module-ViewCreator.html index 8c054e9680..83bcfd44c9 100644 --- a/docs/api/module-ViewCreator.html +++ b/docs/api/module-ViewCreator.html @@ -1,3 +1,3 @@ Module: ViewCreator
On this page

Methods

(static) CreateAudioPlayerView() → {void}

Play Audio

Returns:
Type: 
void

(static) CreateVideoPlayerView() → {void}

Play Video

Returns:
Type: 
void

(static) availSubtitleTrackIdx(tracknameToFind) → {integer}

Roku translates the info provided in subtitleTracks into availableSubtitleTracks Including ignoring tracks, if they are not understood, thus making indexing unpredictable. This function translates between our internel selected subtitle index and the corresponding index in availableSubtitleTracks.

Parameters:
NameTypeDescription
tracknameToFindstring
Returns:
Type: 
integer

(static) onPlaybackInfoLoaded() → {void}

The playback info task has returned data

Returns:
Type: 
void

(static) onSelectPlaybackInfoPressed() → {void}

User requested playback info

Returns:
Type: 
void

(static) onSelectSubtitlePressed() → {void}

User requested subtitle selection popup

Returns:
Type: 
void

(static) onSelectionMade() → {void}

User has selected something from the radioDialog popup

Returns:
Type: 
void

(static) onStateChange() → {void}

Playback state change event handlers

Returns:
Type: 
void

(static) processSubtitleSelection() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) CreateAudioPlayerView() → {void}

Play Audio

Returns:
Type: 
void

(static) CreateVideoPlayerView() → {void}

Play Video

Returns:
Type: 
void

(static) availSubtitleTrackIdx(tracknameToFind) → {integer}

Roku translates the info provided in subtitleTracks into availableSubtitleTracks Including ignoring tracks, if they are not understood, thus making indexing unpredictable. This function translates between our internel selected subtitle index and the corresponding index in availableSubtitleTracks.

Parameters:
NameTypeDescription
tracknameToFindstring
Returns:
Type: 
integer

(static) onPlaybackInfoLoaded() → {void}

The playback info task has returned data

Returns:
Type: 
void

(static) onSelectPlaybackInfoPressed() → {void}

User requested playback info

Returns:
Type: 
void

(static) onSelectSubtitlePressed() → {void}

User requested subtitle selection popup

Returns:
Type: 
void

(static) onSelectionMade() → {void}

User has selected something from the radioDialog popup

Returns:
Type: 
void

(static) onStateChange() → {void}

Playback state change event handlers

Returns:
Type: 
void

(static) processSubtitleSelection() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-WhatsNewDialog.html b/docs/api/module-WhatsNewDialog.html index b00405e52b..d199178784 100644 --- a/docs/api/module-WhatsNewDialog.html +++ b/docs/api/module-WhatsNewDialog.html @@ -1,3 +1,3 @@ Module: WhatsNewDialog
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-baserequest.html b/docs/api/module-baserequest.html index 8621a5e81b..cd70c00a67 100644 --- a/docs/api/module-baserequest.html +++ b/docs/api/module-baserequest.html @@ -1,3 +1,3 @@ Module: baserequest
On this page

Methods

(static) APIRequest(url, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
urlstring
paramsobject<optional>
{}
Returns:
Type: 
dynamic

(static) authRequest(req) → {object}

Takes and returns a roUrlTransfer object after adding a Jellyfin "Authorization" header

Parameters:
NameTypeDescription
reqobject
Returns:
Type: 
object

(static) buildAuthHeader() → {string}

Returns a string containing the "Authorization" header payload

Returns:
Type: 
string

(static) buildParams(paramsopt) → {string}

Functions for making requests to the API

Parameters:
NameTypeAttributesDefaultDescription
paramsobject<optional>
{}
Returns:
Type: 
string

(static) buildURL(path, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
pathstring
paramsobject<optional>
{}
Returns:
Type: 
dynamic

(static) deleteVoid(req) → {dynamic}

Parameters:
NameTypeDescription
reqdynamic
Returns:
Type: 
dynamic

(static) getJson(req) → {dynamic}

Parameters:
NameTypeDescription
reqdynamic
Returns:
Type: 
dynamic

(static) getString(req) → {dynamic}

Parameters:
NameTypeDescription
reqdynamic
Returns:
Type: 
dynamic

(static) getVoid(req) → {boolean}

Parameters:
NameTypeDescription
reqdynamic
Returns:
Type: 
boolean

(static) get_url() → {dynamic}

Returns:
Type: 
dynamic

(static) headVoid(req) → {boolean}

Parameters:
NameTypeDescription
reqdynamic
Returns:
Type: 
boolean

(static) postJson(req, dataopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
reqdynamic
datastring<optional>
""
Returns:
Type: 
dynamic

(static) postString(req, dataopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
reqdynamic
datastring<optional>
""
Returns:
Type: 
dynamic

(static) postVoid(req, dataopt) → {boolean}

Parameters:
NameTypeAttributesDefaultDescription
reqdynamic
datastring<optional>
""
Returns:
Type: 
boolean

(static) setCertificateAuthority(request) → {void}

sets the certificate authority by file path on the passed node

Parameters:
NameTypeDescription
requestobject
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) APIRequest(url, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
urlstring
paramsobject<optional>
{}
Returns:
Type: 
dynamic

(static) authRequest(req) → {object}

Takes and returns a roUrlTransfer object after adding a Jellyfin "Authorization" header

Parameters:
NameTypeDescription
reqobject
Returns:
Type: 
object

(static) buildAuthHeader() → {string}

Returns a string containing the "Authorization" header payload

Returns:
Type: 
string

(static) buildParams(paramsopt) → {string}

Functions for making requests to the API

Parameters:
NameTypeAttributesDefaultDescription
paramsobject<optional>
{}
Returns:
Type: 
string

(static) buildURL(path, paramsopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
pathstring
paramsobject<optional>
{}
Returns:
Type: 
dynamic

(static) deleteVoid(req) → {dynamic}

Parameters:
NameTypeDescription
reqdynamic
Returns:
Type: 
dynamic

(static) getJson(req) → {dynamic}

Parameters:
NameTypeDescription
reqdynamic
Returns:
Type: 
dynamic

(static) getString(req) → {dynamic}

Parameters:
NameTypeDescription
reqdynamic
Returns:
Type: 
dynamic

(static) getVoid(req) → {boolean}

Parameters:
NameTypeDescription
reqdynamic
Returns:
Type: 
boolean

(static) get_url() → {dynamic}

Returns:
Type: 
dynamic

(static) headVoid(req) → {boolean}

Parameters:
NameTypeDescription
reqdynamic
Returns:
Type: 
boolean

(static) postJson(req, dataopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
reqdynamic
datastring<optional>
""
Returns:
Type: 
dynamic

(static) postString(req, dataopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
reqdynamic
datastring<optional>
""
Returns:
Type: 
dynamic

(static) postVoid(req, dataopt) → {boolean}

Parameters:
NameTypeAttributesDefaultDescription
reqdynamic
datastring<optional>
""
Returns:
Type: 
boolean

(static) setCertificateAuthority(request) → {void}

sets the certificate authority by file path on the passed node

Parameters:
NameTypeDescription
requestobject
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-captionTask.html b/docs/api/module-captionTask.html index f3579909bc..e6fc9df69d 100644 --- a/docs/api/module-captionTask.html +++ b/docs/api/module-captionTask.html @@ -1,3 +1,3 @@ Module: captionTask
On this page

Methods

(static) fetchCaption() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isTime(text) → {dynamic}

Parameters:
NameTypeDescription
textdynamic
Returns:
Type: 
dynamic

(static) newLayoutGroup(labels) → {dynamic}

Parameters:
NameTypeDescription
labelsdynamic
Returns:
Type: 
dynamic

(static) newRect(lg) → {dynamic}

Parameters:
NameTypeDescription
lgdynamic
Returns:
Type: 
dynamic

(static) newlabel(txt) → {dynamic}

Parameters:
NameTypeDescription
txtdynamic
Returns:
Type: 
dynamic

(static) parseVTT(lines) → {dynamic}

Parameters:
NameTypeDescription
linesdynamic
Returns:
Type: 
dynamic

(static) setFont() → {void}

Returns:
Type: 
void

(static) toMs(t) → {dynamic}

Parameters:
NameTypeDescription
tdynamic
Returns:
Type: 
dynamic

(static) updateCaption() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) fetchCaption() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isTime(text) → {dynamic}

Parameters:
NameTypeDescription
textdynamic
Returns:
Type: 
dynamic

(static) newLayoutGroup(labels) → {dynamic}

Parameters:
NameTypeDescription
labelsdynamic
Returns:
Type: 
dynamic

(static) newRect(lg) → {dynamic}

Parameters:
NameTypeDescription
lgdynamic
Returns:
Type: 
dynamic

(static) newlabel(txt) → {dynamic}

Parameters:
NameTypeDescription
txtdynamic
Returns:
Type: 
dynamic

(static) parseVTT(lines) → {dynamic}

Parameters:
NameTypeDescription
linesdynamic
Returns:
Type: 
dynamic

(static) setFont() → {void}

Returns:
Type: 
void

(static) toMs(t) → {dynamic}

Parameters:
NameTypeDescription
tdynamic
Returns:
Type: 
dynamic

(static) updateCaption() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-conditional.html b/docs/api/module-conditional.html index ee51955946..a1673ad0a3 100644 --- a/docs/api/module-conditional.html +++ b/docs/api/module-conditional.html @@ -1,3 +1,3 @@ Module: conditional
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-config.html b/docs/api/module-config.html index 2804447a62..adafe9b683 100644 --- a/docs/api/module-config.html +++ b/docs/api/module-config.html @@ -1,3 +1,3 @@ Module: config
On this page

Methods

(static) GetConfigTree() → {dynamic}

Read config tree from json config file and return

Returns:
Type: 
dynamic

(static) RegistryReadAll(section) → {dynamic}

Return all data found inside a registry section

Parameters:
NameTypeDescription
sectionstring
Returns:
Type: 
dynamic

(static) findConfigTreeKey(key, tree) → {dynamic}

Recursivly search the config tree for entry with settingname equal to key

Parameters:
NameTypeDescription
keystring
treedynamic
Returns:
Type: 
dynamic

(static) getRegistrySections() → {object}

Return an array of all the registry section keys

Returns:
Type: 
object

(static) getSavedUsers() → {object}

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

Returns:
Type: 
object

(static) get_setting(key, defaultValueopt) → {dynamic}

"Jellyfin" registry accessors for the default global settings

Parameters:
NameTypeAttributesDefaultDescription
keydynamic
defaultValuedynamic<optional>
invalid
Returns:
Type: 
dynamic

(static) get_user_setting(key) → {dynamic}

User registry accessors for the currently active user

Parameters:
NameTypeDescription
keystring
Returns:
Type: 
dynamic

(static) registry_delete(key, sectionopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
keydynamic
sectiondynamic<optional>
invalid
Returns:
Type: 
void

(static) registry_read(key, sectionopt) → {dynamic}

Generic registry accessors

Parameters:
NameTypeAttributesDefaultDescription
keydynamic
sectiondynamic<optional>
invalid
Returns:
Type: 
dynamic

(static) registry_write(key, value, sectionopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
keydynamic
valuedynamic
sectiondynamic<optional>
invalid
Returns:
Type: 
void

(static) set_setting(key, value) → {void}

Parameters:
NameTypeDescription
keydynamic
valuedynamic
Returns:
Type: 
void

(static) set_user_setting(key, value) → {void}

Parameters:
NameTypeDescription
keystring
valuedynamic
Returns:
Type: 
void

(static) unset_setting(key) → {void}

Parameters:
NameTypeDescription
keydynamic
Returns:
Type: 
void

(static) unset_user_setting(key) → {void}

Parameters:
NameTypeDescription
keystring
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) GetConfigTree() → {dynamic}

Read config tree from json config file and return

Returns:
Type: 
dynamic

(static) RegistryReadAll(section) → {dynamic}

Return all data found inside a registry section

Parameters:
NameTypeDescription
sectionstring
Returns:
Type: 
dynamic

(static) findConfigTreeKey(key, tree) → {dynamic}

Recursivly search the config tree for entry with settingname equal to key

Parameters:
NameTypeDescription
keystring
treedynamic
Returns:
Type: 
dynamic

(static) getRegistrySections() → {object}

Return an array of all the registry section keys

Returns:
Type: 
object

(static) getSavedUsers() → {object}

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

Returns:
Type: 
object

(static) get_setting(key, defaultValueopt) → {dynamic}

"Jellyfin" registry accessors for the default global settings

Parameters:
NameTypeAttributesDefaultDescription
keydynamic
defaultValuedynamic<optional>
invalid
Returns:
Type: 
dynamic

(static) get_user_setting(key) → {dynamic}

User registry accessors for the currently active user

Parameters:
NameTypeDescription
keystring
Returns:
Type: 
dynamic

(static) registry_delete(key, sectionopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
keydynamic
sectiondynamic<optional>
invalid
Returns:
Type: 
void

(static) registry_read(key, sectionopt) → {dynamic}

Generic registry accessors

Parameters:
NameTypeAttributesDefaultDescription
keydynamic
sectiondynamic<optional>
invalid
Returns:
Type: 
dynamic

(static) registry_write(key, value, sectionopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
keydynamic
valuedynamic
sectiondynamic<optional>
invalid
Returns:
Type: 
void

(static) set_setting(key, value) → {void}

Parameters:
NameTypeDescription
keydynamic
valuedynamic
Returns:
Type: 
void

(static) set_user_setting(key, value) → {void}

Parameters:
NameTypeDescription
keystring
valuedynamic
Returns:
Type: 
void

(static) unset_setting(key) → {void}

Parameters:
NameTypeDescription
keydynamic
Returns:
Type: 
void

(static) unset_user_setting(key) → {void}

Parameters:
NameTypeDescription
keystring
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-deviceCapabilities.html b/docs/api/module-deviceCapabilities.html index 2b07548328..d4c9705a46 100644 --- a/docs/api/module-deviceCapabilities.html +++ b/docs/api/module-deviceCapabilities.html @@ -1,3 +1,3 @@ Module: deviceCapabilities
On this page

Methods

(static) GetBitRateLimit(codec) → {object}

Parameters:
NameTypeDescription
codecstring
Returns:
Type: 
object

(static) GetDirectPlayProfiles() → {object}

Returns:
Type: 
object

(static) getCodecProfiles() → {object}

Returns:
Type: 
object

(static) getContainerProfiles() → {object}

Returns:
Type: 
object

(static) getDeviceCapabilities() → {object}

Returns the Device Capabilities for Roku. Also prints out the device profile for debugging

Returns:
Type: 
object

(static) getDeviceProfile() → {object}

Returns:
Type: 
object

(static) getMaxHeightArray() → {object}

Returns:
Type: 
object

(static) getMaxWidthArray() → {object}

Returns:
Type: 
object

(static) getSubtitleProfiles() → {object}

Returns:
Type: 
object

(static) getTranscodingProfiles() → {object}

Returns:
Type: 
object

(static) printDeviceProfile(profile) → {void}

Print out the deviceProfile for debugging

Parameters:
NameTypeDescription
profileobject
Returns:
Type: 
void

(static) removeDecimals(value) → {string}

Remove all decimals from a string

Parameters:
NameTypeDescription
valuestring
Returns:
Type: 
string

(static) setPreferredCodec(codecString, preferredCodec) → {string}

Takes and returns a comma delimited string of codecs. Moves the preferred codec to the front of the string

Parameters:
NameTypeDescription
codecStringstring
preferredCodecstring
Returns:
Type: 
string

(static) updateProfileArray(profileArray, videoCodec, videoProfile, profileLevelopt) → {object}

Recieves and returns an assArray of supported profiles and levels for each video codec

Parameters:
NameTypeAttributesDefaultDescription
profileArrayobject
videoCodecstring
videoProfilestring
profileLevelstring<optional>
""
Returns:
Type: 
object
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) GetBitRateLimit(codec) → {object}

Parameters:
NameTypeDescription
codecstring
Returns:
Type: 
object

(static) GetDirectPlayProfiles() → {object}

Returns:
Type: 
object

(static) getCodecProfiles() → {object}

Returns:
Type: 
object

(static) getContainerProfiles() → {object}

Returns:
Type: 
object

(static) getDeviceCapabilities() → {object}

Returns the Device Capabilities for Roku. Also prints out the device profile for debugging

Returns:
Type: 
object

(static) getDeviceProfile() → {object}

Returns:
Type: 
object

(static) getMaxHeightArray() → {object}

Returns:
Type: 
object

(static) getMaxWidthArray() → {object}

Returns:
Type: 
object

(static) getSubtitleProfiles() → {object}

Returns:
Type: 
object

(static) getTranscodingProfiles() → {object}

Returns:
Type: 
object

(static) printDeviceProfile(profile) → {void}

Print out the deviceProfile for debugging

Parameters:
NameTypeDescription
profileobject
Returns:
Type: 
void

(static) removeDecimals(value) → {string}

Remove all decimals from a string

Parameters:
NameTypeDescription
valuestring
Returns:
Type: 
string

(static) setPreferredCodec(codecString, preferredCodec) → {string}

Takes and returns a comma delimited string of codecs. Moves the preferred codec to the front of the string

Parameters:
NameTypeDescription
codecStringstring
preferredCodecstring
Returns:
Type: 
string

(static) updateProfileArray(profileArray, videoCodec, videoProfile, profileLevelopt) → {object}

Recieves and returns an assArray of supported profiles and levels for each video codec

Parameters:
NameTypeAttributesDefaultDescription
profileArrayobject
videoCodecstring
videoProfilestring
profileLevelstring<optional>
""
Returns:
Type: 
object
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-globals.html b/docs/api/module-globals.html index 7fb4d71995..21880914f6 100644 --- a/docs/api/module-globals.html +++ b/docs/api/module-globals.html @@ -1,3 +1,3 @@ Module: globals
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-homeRowItemSizes_.html b/docs/api/module-homeRowItemSizes_.html new file mode 100644 index 0000000000..98f8063b7f --- /dev/null +++ b/docs/api/module-homeRowItemSizes_.html @@ -0,0 +1,3 @@ +Module: homeRowItemSizes
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-migrations.html b/docs/api/module-migrations.html index fbd757c580..5ef17c7685 100644 --- a/docs/api/module-migrations.html +++ b/docs/api/module-migrations.html @@ -1,3 +1,3 @@ Module: migrations
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-misc.html b/docs/api/module-misc.html index 2b26202e53..90edcdbb9b 100644 --- a/docs/api/module-misc.html +++ b/docs/api/module-misc.html @@ -1,3 +1,3 @@ Module: misc
On this page

Methods

(static) AssocArrayEqual(Array1, Array2) → {boolean}

Parameters:
NameTypeDescription
Array1object
Array2object
Returns:
Type: 
boolean

(static) arrayHasValue(arr, value) → {boolean}

Check if a specific value is inside of an array

Parameters:
NameTypeDescription
arrobject
valuedynamic
Returns:
Type: 
boolean

(static) div_ceiling(a, b) → {integer}

Parameters:
NameTypeDescription
ainteger
binteger
Returns:
Type: 
integer

(static) findNodeBySubtype(node, subtype) → {dynamic}

Parameters:
NameTypeDescription
nodedynamic
subtypedynamic
Returns:
Type: 
dynamic

(static) formatTime(time) → {string}

Format time as 12 or 24 hour format based on system clock setting

Parameters:
NameTypeDescription
timedynamic
Returns:
Type: 
string

(static) getButton(msg, subnodeopt) → {object}

Parameters:
NameTypeAttributesDefaultDescription
msgdynamic
subnodestring<optional>
"buttons"
Returns:
Type: 
object

(static) getMinutes(ticks) → {integer}

Converts ticks to minutes

Parameters:
NameTypeDescription
ticksdynamic
Returns:
Type: 
integer

(static) getMsgPicker(msg, subnodeopt) → {object}

Parameters:
NameTypeAttributesDefaultDescription
msgdynamic
subnodestring<optional>
""
Returns:
Type: 
object

(static) get_dialog_result(dialog, port) → {dynamic}

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

Parameters:
NameTypeDescription
dialogdynamic
portdynamic
Returns:
Type: 
dynamic

(static) inArray(haystack, needle) → {boolean}

Search string array for search value. Return if it's found

Parameters:
NameTypeDescription
haystackdynamic
needledynamic
Returns:
Type: 
boolean

(static) inferServerUrl(url) → {string}

take an incomplete url string and use it to make educated guesses about the complete url. then tests these guesses to see if it can find a jf server returns the url of the server it found, or an empty string

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
string

(static) isJellyfinServer(systemInfo) → {boolean}

accepts the raw json string of /system/info/public and returns a boolean indicating if ProductName is "Jellyfin Server"

Parameters:
NameTypeDescription
systemInfoobject
Returns:
Type: 
boolean

(static) isLocalhost(url) → {boolean}

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
boolean

(static) isNodeEvent(msg, field) → {boolean}

Parameters:
NameTypeDescription
msgdynamic
fieldstring
Returns:
Type: 
boolean

(static) isValid(input) → {boolean}

Returns whether or not passed value is valid

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
boolean

(static) isValidAndNotEmpty(input) → {boolean}

Returns whether or not passed value is valid and not empty Accepts a string, or any countable type (arrays and lists)

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
boolean

(static) lastFocusedChild(obj) → {object}

Parameters:
NameTypeDescription
objobject
Returns:
Type: 
object

(static) leftPad(base, fill, length) → {string}

Parameters:
NameTypeDescription
basestring
fillstring
lengthinteger
Returns:
Type: 
string

(static) message_dialog(messageopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
messagestring<optional>
""
Returns:
Type: 
dynamic

(static) option_dialog(options, messageopt, defaultSelectionopt) → {integer}

Parameters:
NameTypeAttributesDefaultDescription
optionsdynamic
messagedynamic<optional>
""
defaultSelectiondynamic<optional>
0
Returns:
Type: 
integer

(static) parseUrl(url) → {object}

Returns an array from a url = [ url, proto, host, port, subdir+params ] If port or subdir are not found, an empty string will be added to the array Proto must be declared or array will be empty

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
object

(static) roundNumber(f) → {integer}

Rounds number to nearest integer

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) secondsToHuman(totalSeconds, addLeadingMinuteZero) → {string}

Parameters:
NameTypeDescription
totalSecondsinteger
addLeadingMinuteZeroboolean
Returns:
Type: 
string

(static) setFieldTextValue(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void

(static) show_dialog(message, optionsopt, defaultSelectionopt) → {integer}

Parameters:
NameTypeAttributesDefaultDescription
messagestring
optionsdynamic<optional>
[]
defaultSelectiondynamic<optional>
0
Returns:
Type: 
integer

(static) shuffleArray(array) → {object}

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

Parameters:
NameTypeDescription
arrayobject
Returns:
Type: 
object

(static) startLoadingSpinner(disableRemoteopt) → {void}

startLoadingSpinner: Start a loading spinner and attach it to the main JFScene. Displays an invisible ProgressDialog node by default to disable keypresses while loading.

Parameters:
NameTypeAttributesDefaultDescription
disableRemoteboolean<optional>
true
Returns:
Type: 
void

(static) stopLoadingSpinner() → {void}

Returns:
Type: 
void

(static) ticksToHuman(ticks) → {string}

Parameters:
NameTypeDescription
tickslonginteger
Returns:
Type: 
string

(static) toString(input) → {string}

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
string

(static) urlCandidates(input) → {dynamic}

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates for the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated full urls.

Parameters:
NameTypeDescription
inputstring
Returns:
Type: 
dynamic

(static) versionChecker(versionToCheck, minVersionAccepted) → {dynamic}

Returns whether or not a version number (e.g. 10.7.7) is greater or equal to some minimum version allowed (e.g. 10.8.0)

Parameters:
NameTypeDescription
versionToCheckstring
minVersionAcceptedstring
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) AssocArrayEqual(Array1, Array2) → {boolean}

Parameters:
NameTypeDescription
Array1object
Array2object
Returns:
Type: 
boolean

(static) arrayHasValue(arr, value) → {boolean}

Check if a specific value is inside of an array

Parameters:
NameTypeDescription
arrobject
valuedynamic
Returns:
Type: 
boolean

(static) div_ceiling(a, b) → {integer}

Parameters:
NameTypeDescription
ainteger
binteger
Returns:
Type: 
integer

(static) findNodeBySubtype(node, subtype) → {dynamic}

Parameters:
NameTypeDescription
nodedynamic
subtypedynamic
Returns:
Type: 
dynamic

(static) formatTime(time) → {string}

Format time as 12 or 24 hour format based on system clock setting

Parameters:
NameTypeDescription
timedynamic
Returns:
Type: 
string

(static) getButton(msg, subnodeopt) → {object}

Parameters:
NameTypeAttributesDefaultDescription
msgdynamic
subnodestring<optional>
"buttons"
Returns:
Type: 
object

(static) getMinutes(ticks) → {integer}

Converts ticks to minutes

Parameters:
NameTypeDescription
ticksdynamic
Returns:
Type: 
integer

(static) getMsgPicker(msg, subnodeopt) → {object}

Parameters:
NameTypeAttributesDefaultDescription
msgdynamic
subnodestring<optional>
""
Returns:
Type: 
object

(static) get_dialog_result(dialog, port) → {dynamic}

Returns the item selected or -1 on backpress or other unhandled closure of dialog.

Parameters:
NameTypeDescription
dialogdynamic
portdynamic
Returns:
Type: 
dynamic

(static) inArray(haystack, needle) → {boolean}

Search string array for search value. Return if it's found

Parameters:
NameTypeDescription
haystackdynamic
needledynamic
Returns:
Type: 
boolean

(static) inferServerUrl(url) → {string}

take an incomplete url string and use it to make educated guesses about the complete url. then tests these guesses to see if it can find a jf server returns the url of the server it found, or an empty string

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
string

(static) isJellyfinServer(systemInfo) → {boolean}

accepts the raw json string of /system/info/public and returns a boolean indicating if ProductName is "Jellyfin Server"

Parameters:
NameTypeDescription
systemInfoobject
Returns:
Type: 
boolean

(static) isLocalhost(url) → {boolean}

Returns true if the string is a loopback, such as 'localhost' or '127.0.0.1'

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
boolean

(static) isNodeEvent(msg, field) → {boolean}

Parameters:
NameTypeDescription
msgdynamic
fieldstring
Returns:
Type: 
boolean

(static) isValid(input) → {boolean}

Returns whether or not passed value is valid

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
boolean

(static) isValidAndNotEmpty(input) → {boolean}

Returns whether or not passed value is valid and not empty Accepts a string, or any countable type (arrays and lists)

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
boolean

(static) lastFocusedChild(obj) → {object}

Parameters:
NameTypeDescription
objobject
Returns:
Type: 
object

(static) leftPad(base, fill, length) → {string}

Parameters:
NameTypeDescription
basestring
fillstring
lengthinteger
Returns:
Type: 
string

(static) message_dialog(messageopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
messagestring<optional>
""
Returns:
Type: 
dynamic

(static) option_dialog(options, messageopt, defaultSelectionopt) → {integer}

Parameters:
NameTypeAttributesDefaultDescription
optionsdynamic
messagedynamic<optional>
""
defaultSelectiondynamic<optional>
0
Returns:
Type: 
integer

(static) parseUrl(url) → {object}

Returns an array from a url = [ url, proto, host, port, subdir+params ] If port or subdir are not found, an empty string will be added to the array Proto must be declared or array will be empty

Parameters:
NameTypeDescription
urlstring
Returns:
Type: 
object

(static) roundNumber(f) → {integer}

Rounds number to nearest integer

Parameters:
NameTypeDescription
ffloat
Returns:
Type: 
integer

(static) secondsToHuman(totalSeconds, addLeadingMinuteZero) → {string}

Parameters:
NameTypeDescription
totalSecondsinteger
addLeadingMinuteZeroboolean
Returns:
Type: 
string

(static) setFieldTextValue(field, value) → {void}

Parameters:
NameTypeDescription
fielddynamic
valuedynamic
Returns:
Type: 
void

(static) show_dialog(message, optionsopt, defaultSelectionopt) → {integer}

Parameters:
NameTypeAttributesDefaultDescription
messagestring
optionsdynamic<optional>
[]
defaultSelectiondynamic<optional>
0
Returns:
Type: 
integer

(static) shuffleArray(array) → {object}

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

Parameters:
NameTypeDescription
arrayobject
Returns:
Type: 
object

(static) startLoadingSpinner(disableRemoteopt) → {void}

startLoadingSpinner: Start a loading spinner and attach it to the main JFScene. Displays an invisible ProgressDialog node by default to disable keypresses while loading.

Parameters:
NameTypeAttributesDefaultDescription
disableRemoteboolean<optional>
true
Returns:
Type: 
void

(static) stopLoadingSpinner() → {void}

Returns:
Type: 
void

(static) ticksToHuman(ticks) → {string}

Parameters:
NameTypeDescription
tickslonginteger
Returns:
Type: 
string

(static) toString(input) → {string}

Parameters:
NameTypeDescription
inputdynamic
Returns:
Type: 
string

(static) urlCandidates(input) → {dynamic}

this is the "educated guess" logic for inferServerUrl that generates a list of complete url's as candidates for the tests in inferServerUrl. takes an incomplete url as an arg and returns a list of extrapolated full urls.

Parameters:
NameTypeDescription
inputstring
Returns:
Type: 
dynamic

(static) versionChecker(versionToCheck, minVersionAccepted) → {dynamic}

Returns whether or not a version number (e.g. 10.7.7) is greater or equal to some minimum version allowed (e.g. 10.8.0)

Parameters:
NameTypeDescription
versionToCheckstring
minVersionAcceptedstring
Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-quickplay.html b/docs/api/module-quickplay.html index 9c45c44de9..4c6322c99d 100644 --- a/docs/api/module-quickplay.html +++ b/docs/api/module-quickplay.html @@ -1,3 +1,3 @@ Module: quickplay
On this page

Methods

(static) album(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) artist(itemNode) → {void}

A music artist. Shuffle play all songs by artist.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) audio(itemNode) → {void}

A single audio file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) boxset(itemNode) → {void}

A boxset. Play all items inside.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) collectionFolder(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) folder(itemNode) → {void}

Quick Play A folder. Shuffle play all items found

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) multipleSeries(itemNodes) → {void}

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

Parameters:
NameTypeDescription
itemNodesobject
Returns:
Type: 
void

(static) musicVideo(itemNode) → {void}

A single music video file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) person(itemNode) → {void}

Quick Play A Person. Shuffle play all videos found

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) photo(itemNode) → {void}

A single photo.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) photoAlbum(itemNode) → {void}

A photo album.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) playlist(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) program(itemNode) → {void}

Quick Play A Live Program

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) pushToQueue(queueArray, shufflePlayopt) → {void}

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

Parameters:
NameTypeAttributesDefaultDescription
queueArrayobject
shufflePlayboolean<optional>
false
Returns:
Type: 
void

(static) season(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) series(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) tvChannel(itemNode) → {void}

Quick Play A TVChannel

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) userView(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) video(itemNode) → {void}

A single video file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) videoContainer(itemNode) → {void}

A container with some kind of videos inside of it

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) album(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) artist(itemNode) → {void}

A music artist. Shuffle play all songs by artist.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) audio(itemNode) → {void}

A single audio file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) boxset(itemNode) → {void}

A boxset. Play all items inside.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) collectionFolder(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) folder(itemNode) → {void}

Quick Play A folder. Shuffle play all items found

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) multipleSeries(itemNodes) → {void}

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

Parameters:
NameTypeDescription
itemNodesobject
Returns:
Type: 
void

(static) musicVideo(itemNode) → {void}

A single music video file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) person(itemNode) → {void}

Quick Play A Person. Shuffle play all videos found

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) photo(itemNode) → {void}

A single photo.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) photoAlbum(itemNode) → {void}

A photo album.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) playlist(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) program(itemNode) → {void}

Quick Play A Live Program

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) pushToQueue(queueArray, shufflePlayopt) → {void}

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

Parameters:
NameTypeAttributesDefaultDescription
queueArrayobject
shufflePlayboolean<optional>
false
Returns:
Type: 
void

(static) season(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) series(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) tvChannel(itemNode) → {void}

Quick Play A TVChannel

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) userView(itemNode) → {void}

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

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) video(itemNode) → {void}

A single video file.

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void

(static) videoContainer(itemNode) → {void}

A container with some kind of videos inside of it

Parameters:
NameTypeDescription
itemNodeobject
Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-schedule.html b/docs/api/module-schedule.html index aad523c3e3..a0f416ca74 100644 --- a/docs/api/module-schedule.html +++ b/docs/api/module-schedule.html @@ -1,3 +1,3 @@ Module: schedule
On this page

Methods

(static) channelFilterSet() → {void}

Returns:
Type: 
void

(static) channelsearchTermSet() → {void}

Voice Search set

Returns:
Type: 
void

(static) focusProgramDetails(setFocused) → {void}

Move the TV Guide Grid down or up depending whether details are selected

Parameters:
NameTypeDescription
setFocuseddynamic
Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onChannelsLoaded() → {void}

Initial list of channels loaded

Returns:
Type: 
void

(static) onGridScrolled() → {void}

As user scrolls grid, check if more data requries to be loaded

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onProgramDetailsLoaded() → {void}

Update the Program Details with full information

Returns:
Type: 
void

(static) onProgramFocused() → {void}

Returns:
Type: 
void

(static) onProgramSelected() → {void}

Returns:
Type: 
void

(static) onRecordChannelSelected() → {void}

Handle user selecting "Record Channel" from Program Details

Returns:
Type: 
void

(static) onRecordOperationDone() → {void}

Returns:
Type: 
void

(static) onRecordSeriesChannelSelected() → {void}

Handle user selecting "Record Series" from Program Details

Returns:
Type: 
void

(static) onScheduleLoaded() → {void}

When LoadScheduleTask completes (initial or more data) and we have a schedule to display

Returns:
Type: 
void

(static) onWatchChannelSelected() → {void}

Handle user selecting "Watch Channel" from Program Details

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) channelFilterSet() → {void}

Returns:
Type: 
void

(static) channelsearchTermSet() → {void}

Voice Search set

Returns:
Type: 
void

(static) focusProgramDetails(setFocused) → {void}

Move the TV Guide Grid down or up depending whether details are selected

Parameters:
NameTypeDescription
setFocuseddynamic
Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) onChannelsLoaded() → {void}

Initial list of channels loaded

Returns:
Type: 
void

(static) onGridScrolled() → {void}

As user scrolls grid, check if more data requries to be loaded

Returns:
Type: 
void

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onProgramDetailsLoaded() → {void}

Update the Program Details with full information

Returns:
Type: 
void

(static) onProgramFocused() → {void}

Returns:
Type: 
void

(static) onProgramSelected() → {void}

Returns:
Type: 
void

(static) onRecordChannelSelected() → {void}

Handle user selecting "Record Channel" from Program Details

Returns:
Type: 
void

(static) onRecordOperationDone() → {void}

Returns:
Type: 
void

(static) onRecordSeriesChannelSelected() → {void}

Handle user selecting "Record Series" from Program Details

Returns:
Type: 
void

(static) onScheduleLoaded() → {void}

When LoadScheduleTask completes (initial or more data) and we have a schedule to display

Returns:
Type: 
void

(static) onWatchChannelSelected() → {void}

Handle user selecting "Watch Channel" from Program Details

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-section.html b/docs/api/module-section.html index 7f330e4c07..ba2882ee66 100644 --- a/docs/api/module-section.html +++ b/docs/api/module-section.html @@ -1,3 +1,3 @@ Module: section
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onFocusChange() → {void}

Returns:
Type: 
void

(static) onIDChange() → {void}

Returns:
Type: 
void

(static) onTranslationChange() → {void}

Returns:
Type: 
void

(static) scrollDownToOnDeck() → {void}

Returns:
Type: 
void

(static) scrollOffBottom() → {void}

Returns:
Type: 
void

(static) scrollOffOnDeck() → {void}

Returns:
Type: 
void

(static) scrollOffTop() → {void}

Returns:
Type: 
void

(static) scrollUpToOnDeck() → {void}

Returns:
Type: 
void

(static) showFromBottom() → {void}

Returns:
Type: 
void

(static) showFromTop() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) init() → {void}

Returns:
Type: 
void

(static) onFocusChange() → {void}

Returns:
Type: 
void

(static) onIDChange() → {void}

Returns:
Type: 
void

(static) onTranslationChange() → {void}

Returns:
Type: 
void

(static) scrollDownToOnDeck() → {void}

Returns:
Type: 
void

(static) scrollOffBottom() → {void}

Returns:
Type: 
void

(static) scrollOffOnDeck() → {void}

Returns:
Type: 
void

(static) scrollOffTop() → {void}

Returns:
Type: 
void

(static) scrollUpToOnDeck() → {void}

Returns:
Type: 
void

(static) showFromBottom() → {void}

Returns:
Type: 
void

(static) showFromTop() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-sectionScroller.html b/docs/api/module-sectionScroller.html index 75c3de2204..f8816a3024 100644 --- a/docs/api/module-sectionScroller.html +++ b/docs/api/module-sectionScroller.html @@ -1,3 +1,3 @@ Module: sectionScroller
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-settings.html b/docs/api/module-settings.html index 133d6a9e42..9f636b5812 100644 --- a/docs/api/module-settings.html +++ b/docs/api/module-settings.html @@ -1,3 +1,3 @@ Module: settings
On this page

Methods

(static) LoadMenu(configSection) → {void}

Parameters:
NameTypeDescription
configSectiondynamic
Returns:
Type: 
void

(static) OnScreenHidden() → {void}

JFScreen hook that gets ran as needed. Assumes settings were changed and they affect the device profile. Posts a new device profile to the server using the task thread

Returns:
Type: 
void

(static) boolSettingChanged() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isFormInFocus() → {boolean}

Returns true if any of the data entry forms are in focus

Returns:
Type: 
boolean

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onKeyGridEscape() → {void}

Returns:
Type: 
void

(static) onKeyGridSubmit() → {void}

Returns:
Type: 
void

(static) postFinished() → {void}

Triggered by m.postTask after completing a post. Empty the task data when finished.

Returns:
Type: 
void

(static) radioSettingChanged() → {void}

Returns:
Type: 
void

(static) settingFocused() → {void}

Returns:
Type: 
void

(static) settingSelected() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) LoadMenu(configSection) → {void}

Parameters:
NameTypeDescription
configSectiondynamic
Returns:
Type: 
void

(static) OnScreenHidden() → {void}

JFScreen hook that gets ran as needed. Assumes settings were changed and they affect the device profile. Posts a new device profile to the server using the task thread

Returns:
Type: 
void

(static) boolSettingChanged() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) isFormInFocus() → {boolean}

Returns true if any of the data entry forms are in focus

Returns:
Type: 
boolean

(static) onKeyEvent(key, press) → {boolean}

Parameters:
NameTypeDescription
keystring
pressboolean
Returns:
Type: 
boolean

(static) onKeyGridEscape() → {void}

Returns:
Type: 
void

(static) onKeyGridSubmit() → {void}

Returns:
Type: 
void

(static) postFinished() → {void}

Triggered by m.postTask after completing a post. Empty the task data when finished.

Returns:
Type: 
void

(static) radioSettingChanged() → {void}

Returns:
Type: 
void

(static) settingFocused() → {void}

Returns:
Type: 
void

(static) settingSelected() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/module-userauth.html b/docs/api/module-userauth.html index ad064748b6..2a78566b5c 100644 --- a/docs/api/module-userauth.html +++ b/docs/api/module-userauth.html @@ -1,3 +1,3 @@ Module: userauth
On this page

Methods

(static) AboutMe(idopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring<optional>
""
Returns:
Type: 
dynamic

(static) AuthenticateViaQuickConnect(secret) → {dynamic}

Parameters:
NameTypeDescription
secretdynamic
Returns:
Type: 
dynamic

(static) AvailableUsers() → {dynamic}

Returns:
Type: 
dynamic

(static) GetPublicUsers() → {dynamic}

Returns:
Type: 
dynamic

(static) LoadUserAbilities() → {void}

Returns:
Type: 
void

(static) ServerInfo() → {dynamic}

Returns:
Type: 
dynamic

(static) SignOut(deleteSavedEntryopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
deleteSavedEntryboolean<optional>
true
Returns:
Type: 
void

(static) checkQuickConnect(secret) → {dynamic}

Parameters:
NameTypeDescription
secretdynamic
Returns:
Type: 
dynamic

(static) get_token(user, password) → {dynamic}

Parameters:
NameTypeDescription
userstring
passwordstring
Returns:
Type: 
dynamic

(static) initQuickConnect() → {dynamic}

Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) AboutMe(idopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring<optional>
""
Returns:
Type: 
dynamic

(static) AuthenticateViaQuickConnect(secret) → {dynamic}

Parameters:
NameTypeDescription
secretdynamic
Returns:
Type: 
dynamic

(static) AvailableUsers() → {dynamic}

Returns:
Type: 
dynamic

(static) GetPublicUsers() → {dynamic}

Returns:
Type: 
dynamic

(static) LoadUserAbilities() → {void}

Returns:
Type: 
void

(static) ServerInfo() → {dynamic}

Returns:
Type: 
dynamic

(static) SignOut(deleteSavedEntryopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
deleteSavedEntryboolean<optional>
true
Returns:
Type: 
void

(static) checkQuickConnect(secret) → {dynamic}

Parameters:
NameTypeDescription
secretdynamic
Returns:
Type: 
dynamic

(static) get_token(user, password) → {dynamic}

Parameters:
NameTypeDescription
userstring
passwordstring
Returns:
Type: 
dynamic

(static) initQuickConnect() → {dynamic}

Returns:
Type: 
dynamic
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_Main.bs.html b/docs/api/source_Main.bs.html index ea2540a00b..c338c4f216 100644 --- a/docs/api/source_Main.bs.html +++ b/docs/api/source_Main.bs.html @@ -1,6 +1,6 @@ Source: source/Main.bs
On this page

source_Main.bs

sub Main (args as dynamic) as void
+    
On this page

source_Main.bs

sub Main (args as dynamic) as void
     printRegistry()
     ' The main function that runs when the application is launched.
     m.screen = CreateObject("roSGScreen")
@@ -792,4 +792,4 @@
     end while
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_ShowScenes.bs.html b/docs/api/source_ShowScenes.bs.html index 58c3c0a338..34a0f65fdb 100644 --- a/docs/api/source_ShowScenes.bs.html +++ b/docs/api/source_ShowScenes.bs.html @@ -1,6 +1,6 @@ Source: source/ShowScenes.bs
On this page

source_ShowScenes.bs

function LoginFlow()
+    
On this page

source_ShowScenes.bs

function LoginFlow()
     'Collect Jellyfin server and user information
     start_login:
 
@@ -937,4 +937,4 @@
     stopLoadingSpinner()
     m.global.sceneManager.callFunc("optionDialog", tr("Playback Options"), [], resumeData)
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_VideoPlayer.bs.html b/docs/api/source_VideoPlayer.bs.html index 5410a29a2f..7157aadaa2 100644 --- a/docs/api/source_VideoPlayer.bs.html +++ b/docs/api/source_VideoPlayer.bs.html @@ -1,6 +1,6 @@ Source: source/VideoPlayer.bs
On this page

source_VideoPlayer.bs

function VideoPlayer(id as string, mediaSourceId = invalid as dynamic, audio_stream_idx = 1 as integer, subtitle_idx = -1 as integer, forceTranscoding = false as boolean, showIntro = true as boolean, allowResumeDialog = true as boolean) as dynamic
+    
On this page

source_VideoPlayer.bs

function VideoPlayer(id as string, mediaSourceId = invalid as dynamic, audio_stream_idx = 1 as integer, subtitle_idx = -1 as integer, forceTranscoding = false as boolean, showIntro = true as boolean, allowResumeDialog = true as boolean) as dynamic
     ' Get video controls and UI
     video = CreateObject("roSGNode", "JFVideo")
     video.id = id
@@ -598,4 +598,4 @@
         return Str(Fix(bitrate / 1000)) + " Kbps"
     end if
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_api_Image.bs.html b/docs/api/source_api_Image.bs.html index 872d9ed7cc..0d6a170fb3 100644 --- a/docs/api/source_api_Image.bs.html +++ b/docs/api/source_api_Image.bs.html @@ -1,6 +1,6 @@ Source: source/api/Image.bs
On this page

source_api_Image.bs

function ItemImages(id = "" as string, params = {} as object)
+    
On this page

source_api_Image.bs

function ItemImages(id = "" as string, params = {} as object)
     ' This seems to cause crazy core dumps
     ' if there is a conflict between on disk images, and library.db
     resp = APIRequest(Substitute("Items/{0}/Images", id))
@@ -71,4 +71,4 @@
     url = Substitute("Users/{0}/Images/Primary", id)
     return buildURL(url, params)
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_api_Items.bs.html b/docs/api/source_api_Items.bs.html index 7621621e37..ce100291e8 100644 --- a/docs/api/source_api_Items.bs.html +++ b/docs/api/source_api_Items.bs.html @@ -1,6 +1,6 @@ Source: source/api/Items.bs
On this page

source_api_Items.bs

import "pkg:/source/api/sdk.bs"
+    
On this page

source_api_Items.bs

import "pkg:/source/api/sdk.bs"
 
 function ItemGetPlaybackInfo(id as string, startTimeTicks = 0 as longinteger)
     params = {
@@ -499,4 +499,4 @@
 
     return data
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_api_UserLibrary.bs.html b/docs/api/source_api_UserLibrary.bs.html index 1c77a240c0..79d681ba8c 100644 --- a/docs/api/source_api_UserLibrary.bs.html +++ b/docs/api/source_api_UserLibrary.bs.html @@ -1,6 +1,6 @@ Source: source/api/UserLibrary.bs
On this page

source_api_UserLibrary.bs

function MarkItemFavorite(id as string)
+    
On this page

source_api_UserLibrary.bs

function MarkItemFavorite(id as string)
     url = Substitute("Users/{0}/FavoriteItems/{1}", m.global.session.user.id, id)
     resp = APIRequest(url)
     return postJson(resp)
@@ -27,4 +27,4 @@
     resp.setRequest("DELETE")
     return getJson(resp)
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_api_baserequest.bs.html b/docs/api/source_api_baserequest.bs.html index e2e30e216c..cffd4fc958 100644 --- a/docs/api/source_api_baserequest.bs.html +++ b/docs/api/source_api_baserequest.bs.html @@ -1,6 +1,6 @@ Source: source/api/baserequest.bs
On this page

source_api_baserequest.bs

' Functions for making requests to the API
+    
On this page

source_api_baserequest.bs

' Functions for making requests to the API
 function buildParams(params = {} as object) as string
     ' Take an object of parameters and construct the URL query
 
@@ -221,4 +221,4 @@
 
     return auth
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_api_userauth.bs.html b/docs/api/source_api_userauth.bs.html index 6cd2488cf8..7168c9f8f8 100644 --- a/docs/api/source_api_userauth.bs.html +++ b/docs/api/source_api_userauth.bs.html @@ -1,6 +1,6 @@ Source: source/api/userauth.bs
On this page

source_api_userauth.bs

' needed for SignOut() and ServerInfo()
+    
On this page

source_api_userauth.bs

' needed for SignOut() and ServerInfo()
 import "pkg:/source/utils/session.bs"
 import "pkg:/source/utils/misc.bs"
 
@@ -171,4 +171,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_constants_HomeRowItemSizes.bs.html b/docs/api/source_constants_HomeRowItemSizes.bs.html new file mode 100644 index 0000000000..fde6c5beb6 --- /dev/null +++ b/docs/api/source_constants_HomeRowItemSizes.bs.html @@ -0,0 +1,10 @@ +Source: source/constants/HomeRowItemSizes.bs
On this page

source_constants_HomeRowItemSizes.bs

' @fileoverview Constants for rowItemSize on the home view
+
+namespace homeRowItemSizes
+    const WIDE_POSTER = [464, 331]
+    const MOVIE_POSTER = [180, 331]
+    const MUSIC_ALBUM = [261, 331]
+end namespace
+
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_migrations.bs.html b/docs/api/source_migrations.bs.html index e41682f0fa..0342811c94 100644 --- a/docs/api/source_migrations.bs.html +++ b/docs/api/source_migrations.bs.html @@ -1,6 +1,6 @@ Source: source/migrations.bs
On this page

source_migrations.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

source_migrations.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/conditional.bs"
 
 ' @fileoverview Functions that update the registry based on the last run version and the currently running version
@@ -81,17 +81,19 @@
                 m.wasMigrated = true
                 print `Running Registry Migration for ${CLIENT_VERSION_REQUIRING_BASE_MIGRATION} for userid: ${section}`
 
+                ' If this is an existing user, set the useWebSectionArrangement setting to false
+                ' This way the home view for upgrading users is not changed without them opting in
+                if not hasUserVersion
+                    print "useWebSectionArrangement set to false"
+                    registry_write("ui.home.useWebSectionArrangement", "false", section)
+                end if
+
                 ' 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
-
-            ' update lastRunVersion if needed
-            if hasUserVersion and lastRunVersion <> m.global.app.version
-                registry_write("LastRunVersion", m.global.app.version, section)
-            end if
         end if
     end for
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_Subtitles.bs.html b/docs/api/source_utils_Subtitles.bs.html index f9aefcd451..97c2e508a4 100644 --- a/docs/api/source_utils_Subtitles.bs.html +++ b/docs/api/source_utils_Subtitles.bs.html @@ -1,6 +1,6 @@ Source: source/utils/Subtitles.bs
On this page

source_utils_Subtitles.bs

' Roku translates the info provided in subtitleTracks into availableSubtitleTracks
+    
On this page

source_utils_Subtitles.bs

' Roku translates the info provided in subtitleTracks into availableSubtitleTracks
 ' Including ignoring tracks, if they are not understood, thus making indexing unpredictable.
 ' This function translates between our internel selected subtitle index
 ' and the corresponding index in availableSubtitleTracks.
@@ -732,4 +732,4 @@
         "zza": "Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki"
     }
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_conditional.bs.html b/docs/api/source_utils_conditional.bs.html index 7c678efec5..552f18f5ea 100644 --- a/docs/api/source_utils_conditional.bs.html +++ b/docs/api/source_utils_conditional.bs.html @@ -1,6 +1,6 @@ Source: source/utils/conditional.bs
On this page

source_utils_conditional.bs

' @fileoverview Conditional functions that depend on 'bs_const' values specified in the manifest file
+    
On this page

source_utils_conditional.bs

' @fileoverview Conditional functions that depend on 'bs_const' values specified in the manifest file
 
 ' Print out all of the registry contents to the debug log
 sub printRegistry()
@@ -16,4 +16,4 @@
         end for
     #end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_config.bs.html b/docs/api/source_utils_config.bs.html index 7a4c315c7f..a756d3d91c 100644 --- a/docs/api/source_utils_config.bs.html +++ b/docs/api/source_utils_config.bs.html @@ -1,6 +1,6 @@ Source: source/utils/config.bs
On this page

source_utils_config.bs

' needed for set_user_setting() and unset_user_setting()
+    
On this page

source_utils_config.bs

' needed for set_user_setting() and unset_user_setting()
 import "pkg:/source/utils/session.bs"
 
 ' Read config tree from json config file and return
@@ -136,4 +136,4 @@
 
     return savedServerUsers
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_deviceCapabilities.bs.html b/docs/api/source_utils_deviceCapabilities.bs.html index 559d31cc7a..00e52b29e0 100644 --- a/docs/api/source_utils_deviceCapabilities.bs.html +++ b/docs/api/source_utils_deviceCapabilities.bs.html @@ -1,6 +1,6 @@ Source: source/utils/deviceCapabilities.bs
On this page

source_utils_deviceCapabilities.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

source_utils_deviceCapabilities.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/api/baserequest.bs"
 
 ' Returns the Device Capabilities for Roku.
@@ -1107,4 +1107,4 @@
         return newCodecString
     end if
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_globals.bs.html b/docs/api/source_utils_globals.bs.html index 5200e705ee..5633334df1 100644 --- a/docs/api/source_utils_globals.bs.html +++ b/docs/api/source_utils_globals.bs.html @@ -1,6 +1,6 @@ Source: source/utils/globals.bs
On this page

source_utils_globals.bs

' Set global constants
+    
On this page

source_utils_globals.bs

' Set global constants
 sub setConstants()
     globals = m.screen.getGlobalNode()
 
@@ -132,4 +132,4 @@
         }
     })
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_misc.bs.html b/docs/api/source_utils_misc.bs.html index 87cf8b006d..1df070193a 100644 --- a/docs/api/source_utils_misc.bs.html +++ b/docs/api/source_utils_misc.bs.html @@ -1,6 +1,6 @@ Source: source/utils/misc.bs
On this page

source_utils_misc.bs

import "pkg:/source/utils/config.bs"
+    
On this page

source_utils_misc.bs

import "pkg:/source/utils/config.bs"
 
 function isNodeEvent(msg, field as string) as boolean
     return type(msg) = "roSGNodeEvent" and msg.getField() = field
@@ -509,4 +509,4 @@
     end for
     return array
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_quickplay.bs.html b/docs/api/source_utils_quickplay.bs.html index 8047163702..13998302e1 100644 --- a/docs/api/source_utils_quickplay.bs.html +++ b/docs/api/source_utils_quickplay.bs.html @@ -1,6 +1,6 @@ Source: source/utils/quickplay.bs
On this page

source_utils_quickplay.bs

' All of the Quick Play logic seperated by media type
+    
On this page

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.
@@ -721,4 +721,4 @@
     end sub
 
 end namespace
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file From 27bdc51d772468807c27630b23410dfd265bb4ee Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:02:21 +0000 Subject: [PATCH 79/82] Update dependency roku-deploy to v3.11.1 --- package-lock.json | 48 ++++------------------------------------------- package.json | 2 +- 2 files changed, 5 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1b46d73f80..49a5b144f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "jshint": "2.13.6", "markdownlint-cli2": "0.11.0", "rimraf": "5.0.5", - "roku-deploy": "3.10.5", + "roku-deploy": "3.11.1", "roku-log-bsc-plugin": "0.8.1", "rooibos-roku": "5.8.0", "ropm": "0.10.20", @@ -1093,44 +1093,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/brighterscript/node_modules/roku-deploy": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.11.1.tgz", - "integrity": "sha512-ri3eJKGyPMexI+pwvBQxpi6I7I3z9670yOidTcVEohpbYhXpnaIHnKdLb2l87kuC+iTtIEsElgmx3fyEdI5Cjg==", - "dependencies": { - "chalk": "^2.4.2", - "dateformat": "^3.0.3", - "dayjs": "^1.11.0", - "fast-glob": "^3.2.12", - "fs-extra": "^7.0.1", - "is-glob": "^4.0.3", - "jsonc-parser": "^2.3.0", - "jszip": "^3.6.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.4", - "moment": "^2.29.1", - "parse-ms": "^2.1.0", - "postman-request": "^2.88.1-postman.32", - "temp-dir": "^2.0.0", - "xml2js": "^0.5.0" - }, - "bin": { - "roku-deploy": "dist/cli.js" - } - }, - "node_modules/brighterscript/node_modules/roku-deploy/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "node_modules/brighterscript/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -5065,10 +5027,9 @@ } }, "node_modules/roku-deploy": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.10.5.tgz", - "integrity": "sha512-acSi9LKKE8cC1mXul2wNiw7++dxNEWJJCVBS9FJQY7LYaYQ4kQVnWuptjrZ5W8Mu8xhvhytdMVZZhoMCTUoKvQ==", - "dev": true, + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.11.1.tgz", + "integrity": "sha512-ri3eJKGyPMexI+pwvBQxpi6I7I3z9670yOidTcVEohpbYhXpnaIHnKdLb2l87kuC+iTtIEsElgmx3fyEdI5Cjg==", "dependencies": { "chalk": "^2.4.2", "dateformat": "^3.0.3", @@ -5094,7 +5055,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", diff --git a/package.json b/package.json index 9c65a459ce..1b225e2c8b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "jshint": "2.13.6", "markdownlint-cli2": "0.11.0", "rimraf": "5.0.5", - "roku-deploy": "3.10.5", + "roku-deploy": "3.11.1", "roku-log-bsc-plugin": "0.8.1", "rooibos-roku": "5.8.0", "ropm": "0.10.20", From f851b050136ae5a215814f191c1b461cfa07907a Mon Sep 17 00:00:00 2001 From: mqndo Date: Tue, 5 Dec 2023 16:11:39 +0000 Subject: [PATCH 80/82] Translated using Weblate (Spanish) Currently translated at 17.2% (47 of 273 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/es/ --- locale/es_ES/translations.ts | 38 ++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/locale/es_ES/translations.ts b/locale/es_ES/translations.ts index 6eb8540ce7..c154d0f2e7 100644 --- a/locale/es_ES/translations.ts +++ b/locale/es_ES/translations.ts @@ -7135,5 +7135,43 @@ Habilita o deshabilita la Reproducción Directa para codificadores opcionales Settings Menu - Title for settings group related to codec support + + Extras + Extras + + + Episodes + Episodios + + + Save Credentials? + ¿Guardar credenciales? + + + Container + Envase + Video streaming container + + + Change Server + Cambiar de servidor + + + On Now + Ahora + + + Error Retrieving Content + Error al recuperar contenido + Dialog title when unable to load Content from Server + + + Sign Out + Desconectar + + + Delete Saved + Eliminar guardado + From 656210562420d3765aff05276ea7c0686b617b6b Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:00:45 -0500 Subject: [PATCH 81/82] Rewording and adjustments based on review --- source/static/whatsNew.json | 64 ++++++++++++++----------------------- 1 file changed, 24 insertions(+), 40 deletions(-) diff --git a/source/static/whatsNew.json b/source/static/whatsNew.json index 10b5ba16b4..ed0d8aaafd 100644 --- a/source/static/whatsNew.json +++ b/source/static/whatsNew.json @@ -1,10 +1,10 @@ [ { - "description": "New Feature: Add support for Music Videos", + "description": "New Setting: Remember Me setting allowing users to toggle client auto-login", "author": "cewert" }, { - "description": "New Feature: Create video OSD with chapter skip, subtitle select, playback info", + "description": "New Setting: Use Web Client's Home Section Arrangement", "author": "1hitsong" }, { @@ -16,25 +16,29 @@ "author": "JarodTAerts" }, { - "description": "New Feature: Infer server url on server select screen", + "description": "New Feature: When connecting to a server, automatically attempt connection using default protocols and ports if not specified", "author": "sevenrats" }, { - "description": "New Feature: Search honors item access permissions", + "description": "New Feature: Fixed permissions when using search", "author": "matty-r" }, { - "description": "New Feature: Enable rememberme global setting for current installs who upgrade", - "author": "cewert" + "description": "New Feature: Create video OSD with chapter skip, subtitle select, playback info - Press up, down, ok, or pause while video is playing", + "author": "1hitsong" }, { - "description": "New Feature: Improve Quick Play support across client", + "description": "New Feature: Add support for Music Videos", "author": "cewert" }, { "description": "New Feature: Add photo support to home screen", "author": "cewert" }, + { + "description": "New Feature: Add quickplay support to entire app - Press play on your remote while highlighting something", + "author": "cewert" + }, { "description": "New Feature: Update device profile when device capabilities change + enable all device events", "author": "cewert" @@ -48,13 +52,9 @@ "author": "jimdogx" }, { - "description": "New Feature: Add quickplay support to search results", + "description": "New Feature: Remove AV1 direct play setting and instead auto-detect device support", "author": "cewert" }, - { - "description": "New Setting: Use Web Client's Home Section Arrangement", - "author": "1hitsong" - }, { "description": "New View: Create Album Artists view for music library", "author": "1hitsong" @@ -75,10 +75,6 @@ "description": "Bug Fix: Don't show nextEpisode button if trickplay bar is shown", "author": "1hitsong" }, - { - "description": "Bug Fix: Fix episode list bug where OK was triggering quickplay", - "author": "cewert" - }, { "description": "Bug Fix: Improve \"Next Episode\" button show logic", "author": "cewert" @@ -99,10 +95,6 @@ "description": "Bug Fix: Fix crash when viewing Live TV", "author": "jimdogx" }, - { - "description": "Bug Fix: Fix crash when viewing Photo Slideshow or Photo Random", - "author": "jimdogx" - }, { "description": "Bug Fix: Fix long movie options from getting cut off", "author": "Klikini" @@ -123,28 +115,20 @@ "description": "Bug Fix: Fix unplayedCount bug when applying filters", "author": "ApexArray" }, - { - "description": "Bug Fix: Fix direct play of the AV1 codec", - "author": "cewert" - }, - { - "description": "Bug Fix: Fix early exit from settings screen when pressing back button", - "author": "cewert" - }, { "description": "Bug Fix: Prevent crash by validating Filter Menu data", "author": "cewert" }, { - "description": "Bug Fix: Fix several bugs from Roku crash logs", + "description": "Bug Fix: Fixed several bugs that could crash the app based on Roku crash logs", "author": "cewert" }, { - "description": "Bug Fix: Refactor deviceCapabilities, fix vp9, and make 6 channel videos downmix if possible", - "author": "sevenrats" + "description": "Bug Fix: Fix VP9 codec support and downmix 6 channel videos if possible to allow direct play with stereo setups", + "author": "cewert" }, { - "description": "General Improvement: Convert app to use one spinner attached to JFScene + resize spinner", + "description": "General Improvement: Convert app to use one spinner and resize for consistency", "author": "cewert" }, { @@ -159,10 +143,6 @@ "description": "General Improvement: Remove progressbar delay and speed up animation on home screen", "author": "cewert" }, - { - "description": "General Improvement: Show loading spinner and disable remote during login", - "author": "cewert" - }, { "description": "General Improvement: Copy custom subtitle functionality into new Global Queue Player", "author": "1hitsong" @@ -171,10 +151,6 @@ "description": "General Improvement: Update settings page UI to create more space for long radio lists", "author": "cewert" }, - { - "description": "General Improvement: Remove Play Random button & functionality", - "author": "pau1h" - }, { "description": "General Improvement: Update api.sessions.get() + add tanscoding info for Direct Streaming", "author": "candry7731" @@ -191,6 +167,14 @@ "description": "General Improvement: Wrap alpha menu", "author": "1hitsong" }, + { + "description": "Code Cleanup: Create new code for device audio support", + "author": "sevenrats" + }, + { + "description": "Code Cleanup: Remove Play Random button & functionality", + "author": "pau1h" + }, { "description": "For full list of changes, visit our release page: ", "author": "https://github.com/jellyfin/jellyfin-roku/releases" From e2ada913575041742bb0dae80116c73e2ff335f7 Mon Sep 17 00:00:00 2001 From: 1hitsong <3330318+1hitsong@users.noreply.github.com> Date: Tue, 5 Dec 2023 15:30:04 -0500 Subject: [PATCH 82/82] Rename to global setting --- source/static/whatsNew.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/static/whatsNew.json b/source/static/whatsNew.json index ed0d8aaafd..ebe5b135bf 100644 --- a/source/static/whatsNew.json +++ b/source/static/whatsNew.json @@ -1,6 +1,6 @@ [ { - "description": "New Setting: Remember Me setting allowing users to toggle client auto-login", + "description": "New Global Setting: Remember Me setting allowing users to toggle client auto-login", "author": "cewert" }, {