From 376aa94ed472a5b714203a58dd42c9250fd14adb Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Thu, 25 Jul 2024 21:49:09 -0400 Subject: [PATCH 001/141] add vscode debug launch option to deploy already built app from staging dir --- .vscode/launch.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 482f3d16..59566402 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -2,9 +2,9 @@ "version": "0.2.0", "configurations": [ { + "name": "Build and Deploy", "type": "brightscript", "request": "launch", - "name": "Jellyfin Debug", "rootDir": "${workspaceFolder}/build/staging", "preLaunchTask": "build-dev", "stopOnEntry": false, @@ -18,6 +18,22 @@ //WARNING: don't edit this value. Instead, set "brightscript.debug.password": "YOUR_PASSWORD_HERE" in your vscode user settings //"password": "${promptForPassword}", }, + { + "name": "Deploy", + "type": "brightscript", + "request": "launch", + "rootDir": "${workspaceFolder}/build/staging", + "stopOnEntry": false, + // To enable RALE: + // set "brightscript.debug.raleTrackerTaskFileLocation": "/absolute/path/to/rale/TrackerTask.xml" in your vscode user settings + // set the below field to true + "injectRaleTrackerTask": false, + "injectRdbOnDeviceComponent": true, + //WARNING: don't edit this value. Instead, set "brightscript.debug.host": "YOUR_HOST_HERE" in your vscode user settings + //"host": "${promptForHost}", + //WARNING: don't edit this value. Instead, set "brightscript.debug.password": "YOUR_PASSWORD_HERE" in your vscode user settings + //"password": "${promptForPassword}", + }, { "name": "Run tests", "type": "brightscript", From 96591865e4e6d9a6a23622480e5bff2a4b398210 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 30 Jul 2024 21:27:46 -0400 Subject: [PATCH 002/141] add `Play Next Episode Automatically` user setting --- components/ItemGrid/LoadVideoContentTask.bs | 6 +++--- components/JFVideo.bs | 12 +++++++----- components/video/VideoPlayerView.bs | 12 +++++++----- locale/en_US/translations.ts | 15 +++++++++++++++ settings/settings.json | 21 +++++++++++++++++++++ source/VideoPlayer.bs | 6 +++--- 6 files changed, 56 insertions(+), 16 deletions(-) diff --git a/components/ItemGrid/LoadVideoContentTask.bs b/components/ItemGrid/LoadVideoContentTask.bs index 83cb4b0d..ff28efe3 100644 --- a/components/ItemGrid/LoadVideoContentTask.bs +++ b/components/ItemGrid/LoadVideoContentTask.bs @@ -119,9 +119,9 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s video.logoImage = api.items.GetImageURL(logoLookupID, "logo", 0, { "maxHeight": 65, "maxWidth": 300, "quality": "90" }) end if - user = AboutMe() - if user.Configuration.EnableNextEpisodeAutoPlay - if LCase(m.top.itemType) = "episode" + if LCase(m.top.itemType) = "episode" + userSession = m.global.session.user + if userSession.settings["playback.playnextepisode"] = "enabled" or userSession.settings["playback.playnextepisode"] = "webclient" and userSession.Configuration.EnableNextEpisodeAutoPlay addNextEpisodesToQueue(video.showID) end if end if diff --git a/components/JFVideo.bs b/components/JFVideo.bs index f4dfb74e..5be3d853 100644 --- a/components/JFVideo.bs +++ b/components/JFVideo.bs @@ -92,12 +92,14 @@ end sub sub showNextEpisodeButton() 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? + if m.nextEpisodeButton.opacity <> 0 then return + userSession = m.global.session.user + if userSession.settings["playback.playnextepisode"] = "disabled" then return + if userSession.settings["playback.playnextepisode"] = "webclient" and not userSession.Configuration.EnableNextEpisodeAutoPlay then return - if m.nextEpisodeButton.opacity = 0 and m.global.session.user.configuration.EnableNextEpisodeAutoPlay - m.nextEpisodeButton.visible = true - m.showNextEpisodeButtonAnimation.control = "start" - m.nextEpisodeButton.setFocus(true) - end if + m.nextEpisodeButton.visible = true + m.showNextEpisodeButtonAnimation.control = "start" + m.nextEpisodeButton.setFocus(true) end sub ' diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index 56f230ee..be0d32be 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -517,12 +517,14 @@ sub showNextEpisodeButton() if m.osd.visible then return 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? + if m.nextEpisodeButton.opacity <> 0 then return + userSession = m.global.session.user + if userSession.settings["playback.playnextepisode"] = "disabled" then return + if userSession.settings["playback.playnextepisode"] = "webclient" and not userSession.Configuration.EnableNextEpisodeAutoPlay then return - if m.nextEpisodeButton.opacity = 0 and m.global.session.user.configuration.EnableNextEpisodeAutoPlay - m.nextEpisodeButton.visible = true - m.showNextEpisodeButtonAnimation.control = "start" - m.nextEpisodeButton.setFocus(true) - end if + m.nextEpisodeButton.visible = true + m.showNextEpisodeButtonAnimation.control = "start" + m.nextEpisodeButton.setFocus(true) end sub ' diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts index fe5666d2..6d33ead8 100644 --- a/locale/en_US/translations.ts +++ b/locale/en_US/translations.ts @@ -1286,5 +1286,20 @@ Show already watched episodes in 'Next Up' sections. User Setting - Setting description + + Play Next Episode Automatically + Play Next Episode Automatically + User Setting - Setting title + + + When finished playing a single episode, play the next one automatically. + When finished playing a single episode, play the next one automatically. + User Setting - Setting description + + + Use Web Client Setting + Use Web Client Setting + User Setting - Setting option title + diff --git a/settings/settings.json b/settings/settings.json index 6f5e15c0..48a7da06 100644 --- a/settings/settings.json +++ b/settings/settings.json @@ -174,6 +174,27 @@ "type": "integer", "default": "30" }, + { + "title": "Play Next Episode Automatically", + "description": "When finished playing a single episode, play the next one automatically.", + "settingName": "playback.playnextepisode", + "type": "radio", + "default": "webclient", + "options": [ + { + "title": "Use Web Client Setting", + "id": "webclient" + }, + { + "title": "Enabled", + "id": "enabled" + }, + { + "title": "Disabled", + "id": "disabled" + } + ] + }, { "title": "Preferred Audio Codec", "description": "Use the selected audio codec for transcodes. If the device or stream does not support it, a fallback codec will be used.", diff --git a/source/VideoPlayer.bs b/source/VideoPlayer.bs index 1c4f7e75..d034b78e 100644 --- a/source/VideoPlayer.bs +++ b/source/VideoPlayer.bs @@ -435,11 +435,11 @@ function getAudioInfo(meta as object) as object end function sub autoPlayNextEpisode(videoID as string, showID as string) - ' use web client setting - if m.global.session.user.configuration.EnableNextEpisodeAutoPlay + userSession = m.global.session.user + if userSession.settings["playback.playnextepisode"] = "enabled" or userSession.settings["playback.playnextepisode"] = "webclient" and userSession.Configuration.EnableNextEpisodeAutoPlay ' query API for next episode ID url = Substitute("Shows/{0}/Episodes", showID) - urlParams = { "UserId": m.global.session.user.id } + urlParams = { "UserId": userSession.id } urlParams.Append({ "StartItemId": videoID }) urlParams.Append({ "Limit": 2 }) resp = APIRequest(url, urlParams) From e90a66dc67c1aac028ea00c618253fa7ccbf4b33 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 30 Jul 2024 21:54:49 -0400 Subject: [PATCH 003/141] only show whats new popup and update lastRunVersion on prod --- source/Main.bs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/source/Main.bs b/source/Main.bs index a2e27b29..2847d658 100644 --- a/source/Main.bs +++ b/source/Main.bs @@ -72,15 +72,18 @@ sub Main (args as dynamic) as void end if end if - ' has the current user ran this version before? - usersLastRunVersion = m.global.session.user.settings.lastRunVersion - if not isValid(usersLastRunVersion) or not versionChecker(m.global.session.user.settings.lastRunVersion, m.global.app.version) - set_user_setting("LastRunVersion", m.global.app.version) - ' show what's new popup - if m.global.session.user.settings["load.allowwhatsnew"] - dialog = createObject("roSGNode", "WhatsNewDialog") - m.scene.dialog = dialog - m.scene.dialog.observeField("buttonSelected", m.port) + ' only show whats new popup and update lastRunVersion on prod + if not m.global.app.isDev + ' has the current user ran this version before? + usersLastRunVersion = m.global.session.user.settings.lastRunVersion + if not isValid(usersLastRunVersion) or not versionChecker(m.global.session.user.settings.lastRunVersion, m.global.app.version) + set_user_setting("LastRunVersion", m.global.app.version) + ' show what's new popup + if m.global.session.user.settings["load.allowwhatsnew"] + dialog = createObject("roSGNode", "WhatsNewDialog") + m.scene.dialog = dialog + m.scene.dialog.observeField("buttonSelected", m.port) + end if end if end if From d2c60e13646079210209141032a5fd3412fe7dd2 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 3 Aug 2024 22:01:58 -0400 Subject: [PATCH 004/141] remove backdrop when alpha menu is active and add a bunch of debug logging --- components/ItemGrid/ItemGrid.bs | 42 +++++++++++++++++++++++++++---- components/ItemGrid/ItemGrid.xml | 2 +- images/1px-262626.png | Bin 0 -> 70 bytes 3 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 images/1px-262626.png diff --git a/components/ItemGrid/ItemGrid.bs b/components/ItemGrid/ItemGrid.bs index 16840b77..b67b2178 100644 --- a/components/ItemGrid/ItemGrid.bs +++ b/components/ItemGrid/ItemGrid.bs @@ -6,6 +6,7 @@ import "pkg:/source/roku_modules/log/LogMixin.brs" sub init() m.log = log.Logger("ItemGrid") + m.log.debug("start init()") m.options = m.top.findNode("options") m.showItemCount = m.global.session.user.settings["itemgrid.showItemCount"] @@ -70,6 +71,7 @@ sub init() m.resetGrid = m.global.session.user.settings["itemgrid.reset"] m.top.gridTitles = m.global.session.user.settings["itemgrid.gridTitles"] + m.log.debug("end init()") end sub 'Genre Item Selected @@ -79,6 +81,7 @@ end sub 'Load initial set of Data sub loadInitialItems() + m.log.debug("start loadInitialItems()") m.loadItemsTask.control = "stop" startLoadingSpinner() @@ -227,6 +230,7 @@ sub loadInitialItems() startLoadingSpinner(false) m.loadItemsTask.control = "RUN" SetUpOptions() + m.log.debug("end loadInitialItems()") end sub ' Set Movies view, sort, and filter options @@ -438,6 +442,7 @@ end sub 'Handle loaded data, and add to Grid sub ItemDataLoaded(msg) + m.log.debug("start ItemDataLoaded()") itemData = msg.GetData() m.loadItemsTask.unobserveField("content") m.loadItemsTask.content = [] @@ -494,22 +499,28 @@ sub ItemDataLoaded(msg) end if stopLoadingSpinner() + m.log.debug("end ItemDataLoaded()") end sub 'Set Background Image sub SetBackground(backgroundUri as string) - + m.log.debug("start SetBackground()", backgroundUri, m.swapAnimation.state, m.newBackdrop.loadStatus) 'If a new image is being loaded, or transitioned to, store URL to load next - if m.swapAnimation.state <> "stopped" or m.newBackdrop.loadStatus = "loading" - m.queuedBGUri = backgroundUri - return + if not m.top.alphaActive + if m.swapAnimation.state <> "stopped" or m.newBackdrop.loadStatus = "loading" + m.log.debug("caching new background URI") + m.queuedBGUri = backgroundUri + return + end if end if m.newBackdrop.uri = backgroundUri + m.log.debug("end SetBackground()") end sub 'Handle new item being focused sub onItemFocused() + m.log.debug("start onItemFocused()", m.itemGrid.currFocusRow, m.itemGrid.itemFocused) focusedRow = m.itemGrid.currFocusRow @@ -518,7 +529,7 @@ sub onItemFocused() updateTitle() ' If no selected item, set background to parent backdrop - if itemInt = -1 + if itemInt = -1 or focusedRow = -1 return end if @@ -531,6 +542,7 @@ sub onItemFocused() if focusedRow >= m.loadedRows - 5 and m.loadeditems < m.loadItemsTask.totalRecordCount loadMoreData() end if + m.log.debug("end onItemFocused()") end sub 'When Image Loading Status changes @@ -551,6 +563,7 @@ sub swapDone() 'If there is another one to load if m.newBackdrop.uri <> m.queuedBGUri and m.queuedBGUri <> "" + m.log.debug("Loading queued backdrop image", m.queuedBGUri) SetBackground(m.queuedBGUri) m.queuedBGUri = "" end if @@ -559,6 +572,7 @@ end sub 'Load next set of items sub loadMoreData() + m.log.debug("start loadMoreData()") if m.Loading = true then return startLoadingSpinner(false) @@ -566,6 +580,7 @@ sub loadMoreData() m.loadItemsTask.startIndex = m.loadedItems m.loadItemsTask.observeField("content", "ItemDataLoaded") m.loadItemsTask.control = "RUN" + m.log.debug("end loadMoreData()") end sub 'Item Selected @@ -760,6 +775,20 @@ function getItemFocused() return invalid end function +sub alphaActiveChanged() + m.log.debug("start alphaActiveChanged()", m.top.alphaActive) + + if m.top.alphaActive + ' fade into an empty backdrop + m.swapAnimation.state = "stop" + m.queuedBGUri = "" + ' use a 1px image because we can't use the animation to fade into a blank uri string + SetBackground("pkg:/images/1px-262626.png") + end if + + m.log.debug("end alphaActiveChanged()") +end sub + function onKeyEvent(key as string, press as boolean) as boolean if not press then return false @@ -826,11 +855,14 @@ function onKeyEvent(key as string, press as boolean) as boolean return true end if else if key = "left" and topGrp.isinFocusChain() + m.log.debug("Now entering alpha menu") m.top.alphaActive = true topGrp.setFocus(false) m.alphaMenu.setFocus(true) + return true else if key = "right" and m.alpha.isinFocusChain() + m.log.debug("Now leaving alpha menu") m.top.alphaActive = false m.alphaMenu.setFocus(false) topGrp.setFocus(true) diff --git a/components/ItemGrid/ItemGrid.xml b/components/ItemGrid/ItemGrid.xml index bea6a14a..74b8665c 100644 --- a/components/ItemGrid/ItemGrid.xml +++ b/components/ItemGrid/ItemGrid.xml @@ -33,7 +33,7 @@ - + diff --git a/images/1px-262626.png b/images/1px-262626.png new file mode 100644 index 0000000000000000000000000000000000000000..5122799ac5ca75c2acfd3beba2690000ebe72b6e GIT binary patch literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}1TpU9 Date: Sun, 4 Aug 2024 21:38:38 +0000 Subject: [PATCH 005/141] Bump build version --- Makefile | 2 +- manifest | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index bd07230e..b22a6d4d 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # If you want to get_images, you'll also need convert from ImageMagick ########################################################################## -VERSION := 2.1.4 +VERSION := 2.1.5 ## usage diff --git a/manifest b/manifest index 6dac4b71..47de6e80 100644 --- a/manifest +++ b/manifest @@ -3,7 +3,7 @@ title=Jellyfin major_version=2 minor_version=1 -build_version=4 +build_version=5 ### Main Menu Icons / Channel Poster Artwork diff --git a/package-lock.json b/package-lock.json index 4c36e918..63f2aa01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jellyfin-roku", - "version": "2.1.4", + "version": "2.1.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "jellyfin-roku", - "version": "2.1.4", + "version": "2.1.5", "hasInstallScript": true, "license": "GPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 73ac8517..6ff6fed7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jellyfin-roku", "type": "module", - "version": "2.1.4", + "version": "2.1.5", "description": "Roku app for Jellyfin media server", "dependencies": { "@rokucommunity/bslib": "0.1.1", From 3dff7957ce3e4448c860a657696420bdfc90e8b1 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sun, 4 Aug 2024 23:59:58 -0400 Subject: [PATCH 006/141] fix crash caused by renaming variable --- components/ItemGrid/GridItem.bs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ItemGrid/GridItem.bs b/components/ItemGrid/GridItem.bs index c59df9c8..b98ddcc6 100644 --- a/components/ItemGrid/GridItem.bs +++ b/components/ItemGrid/GridItem.bs @@ -116,7 +116,7 @@ sub itemContentChanged() m.itemText.text = itemData.Title end if ' Adjust to wide posters for "View All Next Up" - if m.topParent.overhangTitle = tr("View All Next Up") + if m.itemGrid.overhangTitle = tr("View All Next Up") m.posterMask.maskUri = "" m.itemPoster.height = 300 From 7afacd71e70bae6a46f2754a150b143b90724e9e Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Mon, 5 Aug 2024 14:12:48 -0400 Subject: [PATCH 007/141] fix bad merge --- locale/en_US/translations.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts index fcabd895..410ea54e 100644 --- a/locale/en_US/translations.ts +++ b/locale/en_US/translations.ts @@ -1294,6 +1294,9 @@ When finished playing a single episode, play the next one automatically. When finished playing a single episode, play the next one automatically. + User Setting - Setting description + + Episode Images Next Up Episode Images Next Up User Setting - Setting title From 6eca2fef293a49299efe18da0cd662cd322d7833 Mon Sep 17 00:00:00 2001 From: Justin Date: Tue, 6 Aug 2024 14:46:28 +0000 Subject: [PATCH 008/141] Translated using Weblate (German) Currently translated at 100.0% (289 of 289 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 90fa1cfc..309154ed 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -1313,6 +1313,31 @@ Weiter oben alle anzeigen Title for viewing all episodes available in the Next Up section + + Episode Images Next Up + Bilder der nächsten Episode + User Setting - Setting title + + + Use Web Client Setting + Web Client-Einstellung verwenden + User Setting - Setting option title + + + What type of images to use for Episodes shown in the 'Next Up' and 'Continue Watching' sections. + Welche Art von Bildern soll für die Episoden in den Abschnitten "Weiter" und "Weiterschauen" verwendet werden. + User Setting - Setting description + + + Use Episode Image + Episodenbild verwenden + User Setting - Setting option title + + + Use Show Image + Serienbild verwenden + User Setting - Setting option title + From 9db65147935103406ce839e1b1926426387e9aaf Mon Sep 17 00:00:00 2001 From: KMoney00 Date: Thu, 8 Aug 2024 23:17:20 -0700 Subject: [PATCH 009/141] Fix: Add Played Indicator to Series --- components/data/HomeData.bs | 1 + 1 file changed, 1 insertion(+) diff --git a/components/data/HomeData.bs b/components/data/HomeData.bs index 01b00be2..648cdc8e 100644 --- a/components/data/HomeData.bs +++ b/components/data/HomeData.bs @@ -60,6 +60,7 @@ sub setData() end if else if datum.type = "Series" + m.top.isWatched = datum.UserData.Played imgParams = { "maxHeight": 261 } imgParams.Append({ "maxWidth": 464 }) From 03c3e2c5b211cda39bde1c2c1bf3614ed96a65a7 Mon Sep 17 00:00:00 2001 From: Hernan Martinez Date: Fri, 9 Aug 2024 11:09:27 +0000 Subject: [PATCH 010/141] Translated using Weblate (Spanish (Latin America)) Currently translated at 15.9% (46 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/es_419/ --- locale/es_419/translations.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/locale/es_419/translations.ts b/locale/es_419/translations.ts index 743b32a1..ca8d9ead 100644 --- a/locale/es_419/translations.ts +++ b/locale/es_419/translations.ts @@ -188,6 +188,24 @@ Save Credentials? ¿Guardar credenciales? + + Episodes + Episodios + + + Error Retrieving Content + Error al recibir el contenido + Dialog title when unable to load Content from Server + + + Error During Playback + Error durante la reproducción + Dialog title when error occurs during playback + + + Extras + Extras + From c742b7c9b654139a4f7932fa9fb71d845de24b66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei-Alexandru=20Bleor=C8=9Bu?= Date: Tue, 13 Aug 2024 23:24:28 +0000 Subject: [PATCH 011/141] Translated using Weblate (Romanian) Currently translated at 18.6% (54 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/ro/ --- locale/ro/translations.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/locale/ro/translations.ts b/locale/ro/translations.ts index 962af444..3fc2ea51 100644 --- a/locale/ro/translations.ts +++ b/locale/ro/translations.ts @@ -215,6 +215,32 @@ A apărut o eroare la preluarea datelor pentru acest articol de pe server. Dialog detail when unable to load Content from Server + + Error loading Channel Data + A apărut o eroare în timpul încărcării datelor canalului + + + Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc) + NO_ITEMS + Acest %1 nu conține articole + + + Loading Channel Data + Se încarcă datele canalului + + + IMDB_RATING + Recenzie IMDb + + + Unable to load Channel Data from the server + Nu se pot încărca datele canalului de pe server + + + Name or Title field of media item + TITLE + Nume + From a8b4632248c97c605f36e926224b0facb7095e83 Mon Sep 17 00:00:00 2001 From: Andi Chandler Date: Fri, 16 Aug 2024 15:42:17 +0000 Subject: [PATCH 012/141] Translated using Weblate (English (United Kingdom)) Currently translated at 100.0% (289 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/en_GB/ --- locale/en_GB/translations.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/locale/en_GB/translations.ts b/locale/en_GB/translations.ts index 08ccb70d..00dcae40 100644 --- a/locale/en_GB/translations.ts +++ b/locale/en_GB/translations.ts @@ -1284,6 +1284,36 @@ Show already watched episodes in 'Next Up' sections. User Setting - Setting description + + View All Next Up + View All Next Up + Title for viewing all episodes available in the Next Up section + + + Episode Images Next Up + Episode Images Next Up + User Setting - Setting title + + + What type of images to use for Episodes shown in the 'Next Up' and 'Continue Watching' sections. + What type of images to use for Episodes shown in the 'Next Up' and 'Continue Watching' sections. + User Setting - Setting description + + + Use Web Client Setting + Use Web Client Setting + User Setting - Setting option title + + + Use Episode Image + Use Episode Image + User Setting - Setting option title + + + Use Show Image + Use Show Image + User Setting - Setting option title + From 62107fd4eaa84ed6824993b96f5c263ed55ae774 Mon Sep 17 00:00:00 2001 From: Jakub Balda Date: Tue, 20 Aug 2024 11:05:17 +0000 Subject: [PATCH 013/141] Translated using Weblate (Czech) Currently translated at 97.9% (283 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/cs/ --- locale/cs/translations.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/cs/translations.ts b/locale/cs/translations.ts index 4d81effa..7edf5e83 100644 --- a/locale/cs/translations.ts +++ b/locale/cs/translations.ts @@ -14,7 +14,7 @@ Connect to Server - Připojit se k serveru + Připojit k serveru Ends at %1 @@ -34,7 +34,7 @@ Login attempt failed. - Pokus o přihlášení selhal. + Přihlášení selhalo. OK @@ -74,7 +74,7 @@ Watched - Shlédnuté + Zhlédnuto Change Server @@ -114,7 +114,7 @@ Enter a username - Zadejte jméno + Zadejte přihlašovací jméno Enter a password @@ -269,7 +269,7 @@ Extras - Doplňky + Doplňky (if meant to be used like in settings), Extra (if meant for like series/movies, extras episodes) Episodes From 1c73c7e37b6101487edbe066ceba16de38d5516d Mon Sep 17 00:00:00 2001 From: Ovidiu Popa Date: Fri, 23 Aug 2024 10:03:46 +0000 Subject: [PATCH 014/141] Translated using Weblate (Romanian) Currently translated at 30.1% (87 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/ro/ --- locale/ro/translations.ts | 148 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/locale/ro/translations.ts b/locale/ro/translations.ts index 3fc2ea51..b93a3b9f 100644 --- a/locale/ro/translations.ts +++ b/locale/ro/translations.ts @@ -241,6 +241,154 @@ TITLE Nume + + Title of Tab for options to sort library content + TAB_SORT + Sortează + + + Title of Tab for options to filter library content + TAB_FILTER + Filtrează + + + Shows + Seriale + + + An error was encountered while playing this item. + A intervenit o eroare în timpul redării elementului. + Dialog detail when error occurs during playback + + + DATE_ADDED + Data adaugării + + + Born + Născut + + + Cancel Series Recording + Anulează înregistrarea serialului + + + Enter the server name or IP address + Introduceți numele sau adresa IP a serverului + Title of KeyboardDialog when manually entering a server URL + + + PLAY_COUNT + Număr de redări + + + Movies + Filme + + + DATE_PLAYED + Data redării + + + CRITIC_RATING + Evaluarea criticilor + + + RUNTIME + Durată + + + Title of Tab for switching "views" when looking at a library + TAB_VIEW + VIzualizează + + + RELEASE_DATE + Data lansării + + + Died + Decedat + + + Go to episode + Du-te la episod + Continue Watching Popup Menu - Navigate to the Episode Detail Page + + + Channels + Canale + Menu option for showing Live TV Channel List + + + Close + Închide + + + Pick a Jellyfin server from the local network + Selectați un server Jellyfin din rețeaua locală: + Instructions on initial app launch when the user is asked to pick a server from a list + + + ...or enter server URL manually: + Dacă nu vă apare niciun server în lista de deasupra, puteți introduce manual adresa URL a serverului: + Instructions on initial app launch when the user is asked to manually enter a server URL + + + Version + Versiune + + + Codec Support + Setări codec + Settings Menu - Title for settings group related to codec support + + + MPEG-2 + MPEG-2 + Name of codec used in settings menu + + + MPEG-4 + MPEG-4 + Name of codec used in settings menu + + + User Interface + Interfață utilizator + Title for User Interface section in user setting screen. + + + Go to season + Du-te la pagina sezonului + Continue Watching Popup Menu - Navigate to the Season Page + + + %1 of %2 + %1 din %2 + Item position and count. %1 = current item. %2 = total number of items + + + Networks + Rețele + + + Quick Connect + Conectare rapidă + + + There was an error authenticating via Quick Connect. + A intervenit o eroare în timpul autentificării cu Quick Connect. + + + OFFICIAL_RATING + Clasificare vârstă + + + Playback + Redare + Title for Playback section in user setting screen. + From 7d430ba064fde1445ed3ee85b442be445ceaa2c1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Aug 2024 19:58:34 +0000 Subject: [PATCH 015/141] Update dependency @rokucommunity/bslint to v0.8.24 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ac33d1b..22c6b467 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "log": "npm:roku-log@0.11.1" }, "devDependencies": { - "@rokucommunity/bslint": "0.8.22", + "@rokucommunity/bslint": "0.8.24", "brighterscript": "0.67.5", "brighterscript-jsdocs-plugin": "0.6.0", "clean-jsdoc-theme": "4.3.0", @@ -315,9 +315,9 @@ "integrity": "sha512-2ox6EUL+UTtccTbD4dbVjZK3QHa0PHCqpoKMF8lZz9ayzzEP3iVPF8KZR6hOi6bxsIcbGXVjqmtCVkpC4P9SrA==" }, "node_modules/@rokucommunity/bslint": { - "version": "0.8.22", - "resolved": "https://registry.npmjs.org/@rokucommunity/bslint/-/bslint-0.8.22.tgz", - "integrity": "sha512-ulHGouWoIUuJ7lMRpTGWGjM9lcI/9tfas4hrXifDePZfga65DsBvnDh1aLgHp79X1SUtpV/QpWR3ymKCwlG0Yw==", + "version": "0.8.24", + "resolved": "https://registry.npmjs.org/@rokucommunity/bslint/-/bslint-0.8.24.tgz", + "integrity": "sha512-1EbA6VeW3QC2QQ/Tqf9qTTcCdZ2ZP9q7H9ZvkeN9gzWYiXFSpJo9AnS41LzEsjRKUtC95UXxIhNhIt4Y+x5szg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 5d4d64a1..bceae598 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "log": "npm:roku-log@0.11.1" }, "devDependencies": { - "@rokucommunity/bslint": "0.8.22", + "@rokucommunity/bslint": "0.8.24", "brighterscript": "0.67.5", "brighterscript-jsdocs-plugin": "0.6.0", "clean-jsdoc-theme": "4.3.0", From c00389bac852094f068d824f48a0a23106f05da2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 21:29:41 +0000 Subject: [PATCH 016/141] Update dependency brighterscript-jsdocs-plugin to v0.7.3 --- package-lock.json | 259 ++-------------------------------------------- package.json | 2 +- 2 files changed, 9 insertions(+), 252 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ac33d1b..baebe0a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "devDependencies": { "@rokucommunity/bslint": "0.8.22", "brighterscript": "0.67.5", - "brighterscript-jsdocs-plugin": "0.6.0", + "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", "jsdoc": "4.0.3", "jshint": "2.13.6", @@ -514,6 +514,7 @@ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", "dev": true, + "peer": true, "dependencies": { "@types/linkify-it": "*", "@types/mdurl": "*" @@ -994,197 +995,14 @@ } }, "node_modules/brighterscript-jsdocs-plugin": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/brighterscript-jsdocs-plugin/-/brighterscript-jsdocs-plugin-0.6.0.tgz", - "integrity": "sha512-MQLe6k/hKh0UAQPqabuRua3x9z/G91Oh/Avhu7ebNr86Vu8TkEaq6YxUlwzkngIwr82q5yYtKkGoKI8VXfok8A==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/brighterscript-jsdocs-plugin/-/brighterscript-jsdocs-plugin-0.7.3.tgz", + "integrity": "sha512-qQ14NkeH7sPzgqHkn88IMcpa7hevILLvPx+LieFqFjDeTlHD0xRJsmGjLzzpOT9e7jw4nOAo9mKoR4laEbRXWw==", "dev": true, + "license": "ISC", "dependencies": { - "brighterscript": "^0.42.0", - "jsdoc": "^3.6.7" - } - }, - "node_modules/brighterscript-jsdocs-plugin/node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/brighterscript-jsdocs-plugin/node_modules/brighterscript": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.42.0.tgz", - "integrity": "sha512-GuyutlnhB5gbUOxpljXWAzJvXeb9vVCitj4iKpeyf+bj2cLVEfZJ41DWxGIGIqK3mXbE42GYA+7SuhyJ7pIJCQ==", - "dev": true, - "dependencies": { - "@rokucommunity/bslib": "^0.1.1", - "@xml-tools/parser": "^1.0.7", - "array-flat-polyfill": "^1.0.1", - "chalk": "^2.4.2", - "chevrotain": "^7.0.1", - "chokidar": "^3.5.1", - "clear": "^0.1.0", - "cross-platform-clear-console": "^2.3.0", - "debounce-promise": "^3.1.0", - "eventemitter3": "^4.0.0", - "file-url": "^3.0.0", - "fs-extra": "^7.0.1", - "glob": "^7.1.6", - "jsonc-parser": "^2.3.0", - "long": "^3.2.0", - "luxon": "^1.8.3", - "minimatch": "^3.0.4", - "moment": "^2.23.0", - "p-settle": "^2.1.0", - "parse-ms": "^2.1.0", - "roku-deploy": "^3.5.0", - "serialize-error": "^7.0.1", - "source-map": "^0.7.3", - "vscode-languageserver": "7.0.0", - "vscode-languageserver-protocol": "3.16.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-uri": "^2.1.1", - "xml2js": "^0.4.19", - "yargs": "^16.2.0" - }, - "bin": { - "bsc": "dist/cli.js" - } - }, - "node_modules/brighterscript-jsdocs-plugin/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/brighterscript-jsdocs-plugin/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brighterscript-jsdocs-plugin/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==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/brighterscript-jsdocs-plugin/node_modules/jsdoc": { - "version": "3.6.11", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz", - "integrity": "sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.9.4", - "@types/markdown-it": "^12.2.3", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "taffydb": "2.6.2", - "underscore": "~1.13.2" - }, - "bin": { - "jsdoc": "jsdoc.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/brighterscript-jsdocs-plugin/node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dev": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/brighterscript-jsdocs-plugin/node_modules/luxon": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz", - "integrity": "sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/brighterscript-jsdocs-plugin/node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/brighterscript-jsdocs-plugin/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/brighterscript-jsdocs-plugin/node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/brighterscript-jsdocs-plugin/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" + "brighterscript": "^0.67.4", + "jsdoc": "^4.0.3" } }, "node_modules/brighterscript/node_modules/fs-extra": { @@ -3373,12 +3191,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -5833,12 +5645,6 @@ "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", "dev": true }, - "node_modules/taffydb": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==", - "dev": true - }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -5929,12 +5735,6 @@ "node": ">=8" } }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, "node_modules/undent": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/undent/-/undent-0.1.0.tgz", @@ -6316,54 +6116,11 @@ "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", "dev": true }, - "node_modules/vscode-jsonrpc": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", - "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", - "dev": true, - "engines": { - "node": ">=8.0.0 || >=10.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", - "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", - "dev": true, - "dependencies": { - "vscode-languageserver-protocol": "3.16.0" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", - "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", - "dev": true, - "dependencies": { - "vscode-jsonrpc": "6.0.0", - "vscode-languageserver-types": "3.16.0" - } - }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==" }, - "node_modules/vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", - "dev": true - }, - "node_modules/vscode-uri": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", - "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==", - "dev": true - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 5d4d64a1..866da2d5 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "devDependencies": { "@rokucommunity/bslint": "0.8.22", "brighterscript": "0.67.5", - "brighterscript-jsdocs-plugin": "0.6.0", + "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", "jsdoc": "4.0.3", "jshint": "2.13.6", From accfd546e88bdd0ee3bdda8cc0d929e2d400fe71 Mon Sep 17 00:00:00 2001 From: David Casanova Date: Fri, 30 Aug 2024 20:41:58 +0000 Subject: [PATCH 017/141] Translated using Weblate (Spanish) Currently translated at 89.9% (260 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/es/ --- locale/es_ES/translations.ts | 133 +++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/locale/es_ES/translations.ts b/locale/es_ES/translations.ts index b277be7c..a952401c 100644 --- a/locale/es_ES/translations.ts +++ b/locale/es_ES/translations.ts @@ -1131,6 +1131,139 @@ Resumable Renaudar + + Loading trailer + Cargando trailer + Dialog title in Main.brs + + + Maximum Bitrate + Tasa de Bits Máxima + + + Always Hide + Siempre Ocultar + + + Album Artists (Presentation) + Artístas del Álbum (Presentación) + + + Biographical information for this person is not currently available. + La información biográfica de esta persona no está disponible por el momento. + + + Libraries + Bibliotecas + + + Settings relating to the appearance of pages in TV Libraries. + Configuraciones relacionadas con la apariencia de las páginas en las Bibliotecas de TV. + + + Songs + Canciones + + + Albums + Álbumes + + + Album Artists (Grid) + Artistas del Álbum (Cuadrícula) + + + Album + Álbum + + + Hide the star and community rating for episodes of a TV show. This is to prevent spoilers of an upcoming good/bad episode. + Ocultar el rating de estrellas y comunidad para los episodios de una serie de TV. Esto evita spoilers de un buen/mal episodio. + + + Enable or disable the 'Maximum Bitrate' setting. + Habilitar o deshabilitar la configuración de 'Tasa Máxima de Bits'. + + + Presentation + Presentación + Title of an option - name of presentation view + + + Settings relating to the appearance of Library pages + Configuraciones relacionadas con la apariencia de las páginas de la Biblioteca + + + Grid View Settings + Configuraciones de la Vista en Cuadrícula + + + Settings that apply when Grid views are enabled. + Configuraciones que aplican cuando el modo de Cuadrícula es habilitado. + + + Settings relating to the appearance of pages in Movie Libraries. + Configuraciones relacionadas con la apariencia de las páginas en las Bibliotecas de Películas. + + + Grid + Cuadrícula + Title of an option - name of grid view + + + If enabled, the number of unwatched episodes in a series/season will be removed. + Si está habilitado, se eliminará la cantidad de episodios no vistos de una serie/temporada. + Settings Menu - Description for option + + + Configure the maximum playback bitrate. + Configurar la tasa de bits máxima para la reproducción. + + + Bitrate Limit + Límite de Tasa de Bits + + + Artists (Presentation) + Artistas (Presentación) + + + Disable Community Rating for Episodes + Deshabilitar Ratings de la Comunidad para los Episodios + + + Artists (Grid) + Artistas (Cuadrícula) + + + Song + Canción + + + View All + Ver Todo + + + Enable Limit + Habilitar Límite + + + Set the maximum bitrate in Mbps. Set to 0 to use Roku's specifications. This setting must be enabled to take effect. + Establecer la tasa de bits máxima en Mbps. Establecela en 0 para utilizar las especificaciones de Roku. Esta configuración debe estar habilitada para que surta efecto. + + + General + General + + + Disable Unwatched Episode Count + Deshabilitar Cuenta de Episodios No Vistos + Settings Menu - Title for option + + + Settings relating to the appearance of the Home screen and the program in general. + Configuraciones relacionada con la apariencia de la pantalla de Inicio y el programa en general. + From 4e872f42936e02ca2134933dc1b3186d219c14e9 Mon Sep 17 00:00:00 2001 From: uxdesignerhector Date: Sun, 1 Sep 2024 13:19:50 +0000 Subject: [PATCH 018/141] Translated using Weblate (Spanish) Currently translated at 100.0% (289 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/es/ --- locale/es_ES/translations.ts | 138 ++++++++++++++++++++++++++++++++++- 1 file changed, 136 insertions(+), 2 deletions(-) diff --git a/locale/es_ES/translations.ts b/locale/es_ES/translations.ts index a952401c..9c72ce11 100644 --- a/locale/es_ES/translations.ts +++ b/locale/es_ES/translations.ts @@ -836,7 +836,7 @@ Hides tagline text on details pages. - Ocultar texto de las etiquetas en las páginas de detalles. + Ocultar texto de las etiquetas en las páginas de detalles. 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). @@ -845,7 +845,7 @@ Go directly to the episode list if a TV series has only one season. - Ir directamente a la lista de episodios si la serie tiene solo una temporada. + Ir directamente a la lista de episodios si la serie tiene solo una temporada. Settings Menu - Description for option @@ -1264,6 +1264,140 @@ Settings relating to the appearance of the Home screen and the program in general. Configuraciones relacionada con la apariencia de la pantalla de Inicio y el programa en general. + + Use Web Client Setting + Utilizar los ajustes del cliente web + User Setting - Setting option title + + + Use Episode Image + Usar imagen de episodio + User Setting - Setting option title + + + Use Show Image + Usar mostrar imagen + User Setting - Setting option title + + + Use system settings + Utilizar ajustes del sistema + User Setting - Option title + + + Mode + Modo + User Setting - Setting title + + + Preferred Audio Codec + Codec de Audio Preferido + Settings Menu - Title of option + + + Use the selected audio codec for transcodes. If the device or stream does not support it, a fallback codec will be used. + Usar el codec de audio seleccionado para las transcodificaciones. Si el dispositivo o la transmisión no lo soporta, un codec de reserva será utilizado. + Settings Menu - Description for option + + + The source file is entirely compatible with this client and the session is receiving the file without modifications. + El archivo origen es completamente compatible con este cliente y la sesión está recibiendo el archivo sin modificaciones. + Direct play info box text in GetPlaybackInfoTask.brs + + + Set the maximum resolution when playing video files on this device. + Establece la resolución máxima cuando se reproduzcan videos en este dispositivo. + User Setting - Description + + + Apply max resolution to all files or only transcoded files. + Aplicar la resolución máxima a todos los archivos o solo a los archivos transcodificados. + User Setting - Description + + + Welcome to version + Bienvenido a la versión + WhatsNewDialog title - Welcome to version 2.0.0 + + + To view a complete list of changes visit + Para ver una lista completa de los cambios visita + WhatsNewDialog body text preceding the changelog URL + + + Community and Critical Ratings + Calificaciones comunitarias y críticas + User Setting - Setting title + + + Ratings for how good a movie is + Calificaciones de lo buena que es una película + User Setting - Setting description + + + Episode Images Next Up + Episodio Imágenes A Continuación + User Setting - Setting title + + + Show already watched episodes in 'Next Up' sections. + Mostrar episodios ya visualizados en la seccion 'A Continuación'. + User Setting - Setting description + + + View All Next Up + Ver Todo A Continuación + Title for viewing all episodes available in the Next Up section + + + Rewatching Next Up + Volviendo a ver 'A Continuación' + User Setting - Setting title + + + What type of images to use for Episodes shown in the 'Next Up' and 'Continue Watching' sections. + Que tipo de imágenes utilizar para los Episodios mostrados en la secciones 'A continuación' y 'Seguir Viendo'. + User Setting - Setting description + + + Next Episode Button Time + Tiempo Botón Siguiente Episodio + Settings Menu - Title for option + + + Auto - Use TV resolution + Auto - Utilizar la resolución de la TV + User Setting - Option title + + + Set how many seconds before the end of an episode the Next Episode button should appear. Set to 0 to disable. + Establecer cuantos segundos antes de finalizar un episodio el botón de Siguiente Episodio debe aparecer. El valor 0 deshabilita está opción. + Settings Menu - Description for option + + + Maximum Resolution + Resolución máxima + User Setting - Title + + + Off - Attempt to play all resolutions + Apagado - Intentar reproducir todas la resoluciones + User Setting - Option title + + + Value + Valor + User Setting - Setting title + + + Configure the maximum resolution when playing video files on this device. + Configurar la resolución máxima cuando se reproduzcan archivos de videos en este dispositivo. + User Setting - Description + + + Direct playing + Reprodución directa + From ad9441ec28bc8f9b3242ec52eff0d31f0f433704 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 16:23:44 +0000 Subject: [PATCH 019/141] Update actions/upload-artifact digest to 5076954 --- .github/workflows/build-dev.yml | 2 +- .github/workflows/build-prod.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml index b92387ff..7c8b9310 100644 --- a/.github/workflows/build-dev.yml +++ b/.github/workflows/build-dev.yml @@ -21,7 +21,7 @@ jobs: run: npm run ropm - name: Build app run: npm run build - - uses: actions/upload-artifact@89ef406dd8d7e03cfd12d9e0a4a378f454709029 # v4 + - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4 with: name: Jellyfin-Roku-dev-${{ github.sha }} path: ${{ github.workspace }}/build/staging diff --git a/.github/workflows/build-prod.yml b/.github/workflows/build-prod.yml index fc5f4c6c..a5a733df 100644 --- a/.github/workflows/build-prod.yml +++ b/.github/workflows/build-prod.yml @@ -23,7 +23,7 @@ jobs: run: npm run ropm - name: Build app for production run: npm run build-prod - - uses: actions/upload-artifact@89ef406dd8d7e03cfd12d9e0a4a378f454709029 # v4 + - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4 with: name: Jellyfin-Roku-v${{ env.newManVersion }}-${{ github.sha }} path: ${{ github.workspace }}/build/staging From 18e9795876fc1fe76da8d2efee293e8c0f73272a Mon Sep 17 00:00:00 2001 From: MattiaPell Date: Thu, 5 Sep 2024 08:54:08 +0000 Subject: [PATCH 020/141] Translated using Weblate (Italian) Currently translated at 97.2% (281 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/it/ --- locale/it_IT/translations.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/locale/it_IT/translations.ts b/locale/it_IT/translations.ts index deaa4e7a..c7f3002b 100644 --- a/locale/it_IT/translations.ts +++ b/locale/it_IT/translations.ts @@ -1283,6 +1283,21 @@ Valutazioni sulla qualità di un film User Setting - Setting description + + Welcome to version + Benvenuto alla versione + WhatsNewDialog title - Welcome to version 2.0.0 + + + To view a complete list of changes visit + Per vedere una lista competa dei cambiamenti visita + WhatsNewDialog body text preceding the changelog URL + + + Community and Critical Ratings + Voti della Community e della Critica + User Setting - Setting title + From 5fba9f86d74ff911fe2161e346ce908f136ccc61 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Sep 2024 05:04:27 +0000 Subject: [PATCH 021/141] Update dependency markdownlint-cli2 to v0.14.0 --- package-lock.json | 72 +++++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ac33d1b..632878c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "clean-jsdoc-theme": "4.3.0", "jsdoc": "4.0.3", "jshint": "2.13.6", - "markdownlint-cli2": "0.13.0", + "markdownlint-cli2": "0.14.0", "rimraf": "6.0.1", "roku-deploy": "3.12.1", "roku-log-bsc-plugin": "0.8.1", @@ -3088,13 +3088,14 @@ "dev": true }, "node_modules/markdownlint": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.34.0.tgz", - "integrity": "sha512-qwGyuyKwjkEMOJ10XN6OTKNOVYvOIi35RNvDLNxTof5s8UmyGHlCdpngRHoRGNvQVGuxO3BJ7uNSgdeX166WXw==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.35.0.tgz", + "integrity": "sha512-wgp8yesWjFBL7bycA3hxwHRdsZGJhjhyP1dSxKVKrza0EPFYtn+mHtkVy6dvP1kGSjovyG5B8yNP6Frj0UFUJg==", "dev": true, + "license": "MIT", "dependencies": { "markdown-it": "14.1.0", - "markdownlint-micromark": "0.1.9" + "markdownlint-micromark": "0.1.10" }, "engines": { "node": ">=18" @@ -3104,17 +3105,18 @@ } }, "node_modules/markdownlint-cli2": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.13.0.tgz", - "integrity": "sha512-Pg4nF7HlopU97ZXtrcVISWp3bdsuc5M0zXyLp2/sJv2zEMlInrau0ZKK482fQURzVezJzWBpNmu4u6vGAhij+g==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.14.0.tgz", + "integrity": "sha512-2cqdWy56frU2FTpbuGb83mEWWYuUIYv6xS8RVEoUAuKNw/hXPar2UYGpuzUhlFMngE8Omaz4RBH52MzfRbGshw==", "dev": true, + "license": "MIT", "dependencies": { - "globby": "14.0.1", + "globby": "14.0.2", "js-yaml": "4.1.0", - "jsonc-parser": "3.2.1", - "markdownlint": "0.34.0", - "markdownlint-cli2-formatter-default": "0.0.4", - "micromatch": "4.0.5" + "jsonc-parser": "3.3.1", + "markdownlint": "0.35.0", + "markdownlint-cli2-formatter-default": "0.0.5", + "micromatch": "4.0.8" }, "bin": { "markdownlint-cli2": "markdownlint-cli2.js" @@ -3127,19 +3129,24 @@ } }, "node_modules/markdownlint-cli2-formatter-default": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.4.tgz", - "integrity": "sha512-xm2rM0E+sWgjpPn1EesPXx5hIyrN2ddUnUwnbCsD/ONxYtw3PX6LydvdH6dciWAoFDpwzbHM1TO7uHfcMd6IYg==", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.5.tgz", + "integrity": "sha512-4XKTwQ5m1+Txo2kuQ3Jgpo/KmnG+X90dWt4acufg6HVGadTUG5hzHF/wssp9b5MBYOMCnZ9RMPaU//uHsszF8Q==", "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + }, "peerDependencies": { "markdownlint-cli2": ">=0.0.4" } }, "node_modules/markdownlint-cli2/node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.2", @@ -3160,6 +3167,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3168,16 +3176,18 @@ } }, "node_modules/markdownlint-cli2/node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3186,10 +3196,11 @@ } }, "node_modules/markdownlint-micromark": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.9.tgz", - "integrity": "sha512-5hVs/DzAFa8XqYosbEAEg6ok6MF2smDj89ztn9pKkCtdKHVdPQuGMH7frFfYL9mLkvfFe4pTyAMffLbjf3/EyA==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.10.tgz", + "integrity": "sha512-no5ZfdqAdWGxftCLlySHSgddEjyW4kui4z7amQcGsSKfYC5v/ou+8mIQVyg9KQMeEZLNtz9OPDTj7nnTnoR4FQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -3846,11 +3857,12 @@ ] }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { diff --git a/package.json b/package.json index 5d4d64a1..a67bcdd0 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "clean-jsdoc-theme": "4.3.0", "jsdoc": "4.0.3", "jshint": "2.13.6", - "markdownlint-cli2": "0.13.0", + "markdownlint-cli2": "0.14.0", "rimraf": "6.0.1", "roku-deploy": "3.12.1", "roku-log-bsc-plugin": "0.8.1", From 64e5193ca329926c217f5e72b183c1089e4b2b7e Mon Sep 17 00:00:00 2001 From: fabriciodeuner Date: Sat, 7 Sep 2024 17:25:46 +0000 Subject: [PATCH 022/141] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (289 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/pt_BR/ --- locale/pt_BR/translations.ts | 52 +++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/locale/pt_BR/translations.ts b/locale/pt_BR/translations.ts index 5f2e1ca2..37c2d3dd 100644 --- a/locale/pt_BR/translations.ts +++ b/locale/pt_BR/translations.ts @@ -625,7 +625,7 @@ WxH - WxH + largura x altura Video width x height @@ -1303,6 +1303,56 @@ Cast & Crew Elenco & Equipe + + Episode Images Next Up + Imagens de episódio em Próximos + User Setting - Setting title + + + Use Web Client Setting + Usar configuração de cliente web + User Setting - Setting option title + + + Welcome to version + Bme-vindo à versão + WhatsNewDialog title - Welcome to version 2.0.0 + + + To view a complete list of changes visit + Para uma lista completa das mudanças visite + WhatsNewDialog body text preceding the changelog URL + + + View All Next Up + Ver todos Próximos + Title for viewing all episodes available in the Next Up section + + + Rewatching Next Up + Reassitir Próximos + User Setting - Setting title + + + Show already watched episodes in 'Next Up' sections. + Mostrar episódios já assistidos nas seções "Próximos". + User Setting - Setting description + + + What type of images to use for Episodes shown in the 'Next Up' and 'Continue Watching' sections. + Que tipo de imagens usar para os episódios exibidos nas seções "Próximo" e "Continuar assistindo". + User Setting - Setting description + + + Use Episode Image + Usar imagem do episódio + User Setting - Setting option title + + + Use Show Image + Usar imagem da série + User Setting - Setting option title + From fbd9ce14a501120110b1818b69c972e133097997 Mon Sep 17 00:00:00 2001 From: Federico Abella Date: Sun, 8 Sep 2024 23:50:17 +0000 Subject: [PATCH 023/141] Translated using Weblate (Spanish (Argentina)) Currently translated at 14.8% (43 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/es_AR/ --- locale/es_AR/translations.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/locale/es_AR/translations.ts b/locale/es_AR/translations.ts index d22ce4df..cec19fd3 100644 --- a/locale/es_AR/translations.ts +++ b/locale/es_AR/translations.ts @@ -180,6 +180,18 @@ Server Servidor + + Delete Saved + Borrar Guardado + + + On Now + Ahora + + + Save Credentials? + ¿Guardar Credenciales? + From ca6600ede15cd91539e8cf40e198548761d9c112 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 17:23:04 +0000 Subject: [PATCH 024/141] Update actions/setup-java digest to 2dfa201 --- .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 5fd3cfc3..5a9a8c8f 100644 --- a/.github/workflows/roku-analysis.yml +++ b/.github/workflows/roku-analysis.yml @@ -28,7 +28,7 @@ jobs: if: env.BRANCH_NAME == 'master' run: npm run build-prod - name: Setup Java - uses: actions/setup-java@6a0805fcefea3d4657a47ac4c165951e33482018 # v4 + uses: actions/setup-java@2dfa2011c5b2a0f1489bf9e433881c92c1631f88 # v4 with: distribution: "temurin" java-version: "21" From 7513f5b41c4ab5f2a63ed21519b270a0fd5857c9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2024 16:11:46 +0000 Subject: [PATCH 025/141] Update dependency rooibos-roku to v5.13.0 --- package-lock.json | 15 ++++++++++----- package.json | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ac33d1b..d232d7f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "rimraf": "6.0.1", "roku-deploy": "3.12.1", "roku-log-bsc-plugin": "0.8.1", - "rooibos-roku": "5.12.0", + "rooibos-roku": "5.13.0", "ropm": "0.10.25", "spellchecker-cli": "6.2.0", "undent": "0.1.0" @@ -5262,10 +5262,11 @@ "dev": true }, "node_modules/rooibos-roku": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/rooibos-roku/-/rooibos-roku-5.12.0.tgz", - "integrity": "sha512-fJofEoaD2fNGK7zurdwSBVIQQAbc0jo0Q8TKbJbip0FGPt+inMerFhsWyp7dgXiUaw4mX+S95g74NgHbll9O/g==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/rooibos-roku/-/rooibos-roku-5.13.0.tgz", + "integrity": "sha512-tp+hlAtYVnzF3ZMatSmodGl990+pzKg0uwSqM8dyFBNn0Ob5PdUGFRv0oQKg3m7FYCjnglIQxiL97VpiT4rOMg==", "dev": true, + "license": "ISC", "dependencies": { "source-map": "^0.7.3", "undent": "^0.1.0", @@ -5278,6 +5279,7 @@ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz", "integrity": "sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0 || >=10.0.0" } @@ -5287,6 +5289,7 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz", "integrity": "sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==", "dev": true, + "license": "MIT", "dependencies": { "vscode-languageserver-protocol": "^3.15.3" }, @@ -5299,6 +5302,7 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz", "integrity": "sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==", "dev": true, + "license": "MIT", "dependencies": { "vscode-jsonrpc": "^5.0.1", "vscode-languageserver-types": "3.15.1" @@ -5308,7 +5312,8 @@ "version": "3.15.1", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz", "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ropm": { "version": "0.10.25", diff --git a/package.json b/package.json index 5d4d64a1..9026ce63 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "rimraf": "6.0.1", "roku-deploy": "3.12.1", "roku-log-bsc-plugin": "0.8.1", - "rooibos-roku": "5.12.0", + "rooibos-roku": "5.13.0", "ropm": "0.10.25", "spellchecker-cli": "6.2.0", "undent": "0.1.0" From b1265995db2186f00590c0f35547e762bb3768ac Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 14 Sep 2024 13:23:04 +0000 Subject: [PATCH 026/141] Update dependency brighterscript to v0.67.6 --- package-lock.json | 94 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62a62440..ef21ded5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@rokucommunity/bslint": "0.8.24", - "brighterscript": "0.67.5", + "brighterscript": "0.67.6", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", "jsdoc": "4.0.3", @@ -849,9 +849,9 @@ } }, "node_modules/brighterscript": { - "version": "0.67.5", - "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.67.5.tgz", - "integrity": "sha512-OUJ5xLymzKXir8/RdWKamRIYbcqFy2JgqSp6eu2F+wdlCp3rlKCrP83pjEJ9kuqwJCo/V2pjTUcilcNBLkvuIg==", + "version": "0.67.6", + "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.67.6.tgz", + "integrity": "sha512-MsqPOTJSzvVaOY4R5aykdg9jqesBPZbIXZZvmBKHI5DYwBWtY9SMDe2G+AwTwQ3q8KJvmsPQ6Yw/UbL8tReizQ==", "license": "MIT", "dependencies": { "@rokucommunity/bslib": "^0.1.1", @@ -1019,49 +1019,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/brighterscript/node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/brighterscript/node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/brighterscript/node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/brighterscript/node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" - }, - "node_modules/brighterscript/node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "license": "MIT" - }, "node_modules/brighterscript/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -6116,11 +6073,54 @@ "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", "dev": true }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==" }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 487cbc32..d24ca0e2 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "devDependencies": { "@rokucommunity/bslint": "0.8.24", - "brighterscript": "0.67.5", + "brighterscript": "0.67.6", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", "jsdoc": "4.0.3", From ef20f038d88250a4c71a83677d506c3717165b42 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Sat, 14 Sep 2024 13:23:10 +0000 Subject: [PATCH 027/141] 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 ++-- docs/api/components_Buttons_SlideOutButton.bs.html | 4 ++-- docs/api/components_Buttons_TextSizeTask.bs.html | 4 ++-- docs/api/components_Clock.bs.html | 4 ++-- docs/api/components_GetNextEpisodeTask.bs.html | 4 ++-- docs/api/components_GetPlaybackInfoTask.bs.html | 4 ++-- docs/api/components_GetShuffleEpisodesTask.bs.html | 4 ++-- docs/api/components_IconButton.bs.html | 4 ++-- docs/api/components_ItemGrid_Alpha.bs.html | 4 ++-- docs/api/components_ItemGrid_FavoriteItemsTask.bs.html | 4 ++-- docs/api/components_ItemGrid_GridItem.bs.html | 4 ++-- docs/api/components_ItemGrid_GridItemSmall.bs.html | 4 ++-- docs/api/components_ItemGrid_ItemGrid.bs.html | 4 ++-- docs/api/components_ItemGrid_ItemGridOptions.bs.html | 4 ++-- docs/api/components_ItemGrid_LoadItemsTask2.bs.html | 4 ++-- .../components_ItemGrid_LoadVideoContentTask.bs.html | 4 ++-- docs/api/components_ItemGrid_MovieLibraryView.bs.html | 4 ++-- .../components_ItemGrid_MusicArtistGridItem.bs.html | 4 ++-- docs/api/components_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 ++-- docs/api/components_config_ServerDiscoveryTask.bs.html | 4 ++-- docs/api/components_config_SetServerScreen.bs.html | 4 ++-- docs/api/components_data_AlbumData.bs.html | 4 ++-- docs/api/components_data_ChannelData.bs.html | 4 ++-- docs/api/components_data_CollectionData.bs.html | 4 ++-- docs/api/components_data_FolderData.bs.html | 4 ++-- docs/api/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_JFContentItem.bs.html | 4 ++-- docs/api/components_data_MovieData.bs.html | 4 ++-- docs/api/components_data_MusicAlbumData.bs.html | 4 ++-- .../api/components_data_MusicAlbumSongListData.bs.html | 4 ++-- docs/api/components_data_MusicArtistData.bs.html | 4 ++-- docs/api/components_data_MusicSongData.bs.html | 4 ++-- docs/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 ++-- docs/api/components_data_PublicUserData.bs.html | 4 ++-- docs/api/components_data_RecordingData.bs.html | 4 ++-- docs/api/components_data_SceneManager.bs.html | 4 ++-- docs/api/components_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 ++-- docs/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 ++-- docs/api/components_extras_ExtrasRowList.bs.html | 4 ++-- docs/api/components_home_Home.bs.html | 4 ++-- docs/api/components_home_HomeItem.bs.html | 4 ++-- docs/api/components_home_HomeRows.bs.html | 4 ++-- docs/api/components_home_LoadItemsTask.bs.html | 4 ++-- docs/api/components_keyboards_IntegerKeyboard.bs.html | 4 ++-- docs/api/components_liveTv_LoadChannelsTask.bs.html | 4 ++-- .../components_liveTv_LoadProgramDetailsTask.bs.html | 4 ++-- docs/api/components_liveTv_LoadSheduleTask.bs.html | 4 ++-- docs/api/components_liveTv_ProgramDetails.bs.html | 4 ++-- docs/api/components_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 ++-- docs/api/components_manager_QueueManager.bs.html | 4 ++-- docs/api/components_manager_ViewCreator.bs.html | 4 ++-- docs/api/components_mediaPlayers_AudioPlayer.bs.html | 4 ++-- docs/api/components_movies_AudioTrackListItem.bs.html | 4 ++-- docs/api/components_movies_MovieDetails.bs.html | 4 ++-- docs/api/components_movies_MovieOptions.bs.html | 4 ++-- docs/api/components_movies_VideoTrackListItem.bs.html | 4 ++-- docs/api/components_music_AlbumGrid.bs.html | 4 ++-- docs/api/components_music_AlbumTrackList.bs.html | 4 ++-- docs/api/components_music_AlbumView.bs.html | 4 ++-- docs/api/components_music_ArtistView.bs.html | 4 ++-- docs/api/components_music_AudioPlayerView.bs.html | 4 ++-- ...components_music_LoadScreenSaverTimeoutTask.bs.html | 4 ++-- docs/api/components_music_PlaylistView.bs.html | 4 ++-- docs/api/components_music_SongItem.bs.html | 4 ++-- docs/api/components_options_OptionNode.bs.html | 4 ++-- docs/api/components_options_OptionsSlider.bs.html | 4 ++-- docs/api/components_photos_LoadPhotoTask.bs.html | 4 ++-- docs/api/components_photos_PhotoDetails.bs.html | 4 ++-- docs/api/components_quickConnect_QuickConnect.bs.html | 4 ++-- .../components_quickConnect_QuickConnectDialog.bs.html | 4 ++-- docs/api/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 ++-- docs/api/components_section_sectionScroller.bs.html | 4 ++-- docs/api/components_settings_settings.bs.html | 4 ++-- docs/api/components_tasks_PostTask.bs.html | 4 ++-- docs/api/components_tvshows_TVEpisodeRow.bs.html | 4 ++-- .../components_tvshows_TVEpisodeRowWithOptions.bs.html | 4 ++-- docs/api/components_tvshows_TVEpisodes.bs.html | 4 ++-- docs/api/components_tvshows_TVListDetails.bs.html | 4 ++-- docs/api/components_tvshows_TVListOptions.bs.html | 4 ++-- docs/api/components_tvshows_TVSeasonRow.bs.html | 4 ++-- docs/api/components_tvshows_TVShowDescription.bs.html | 4 ++-- docs/api/components_tvshows_TVShowDetails.bs.html | 4 ++-- docs/api/components_video_OSD.bs.html | 4 ++-- docs/api/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-JFContentItem.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 +- docs/api/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-RecordingData.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/quickplay.html | 3 +++ 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 ++-- docs/api/source_constants_HomeRowItemSizes.bs.html | 10 ---------- docs/api/source_migrations.bs.html | 4 ++-- docs/api/source_utils_Subtitles.bs.html | 4 ++-- docs/api/source_utils_conditional.bs.html | 4 ++-- docs/api/source_utils_config.bs.html | 4 ++-- docs/api/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 ++-- 298 files changed, 443 insertions(+), 456 deletions(-) delete mode 100644 docs/api/module-HomeRowItemSizes.html delete mode 100644 docs/api/module-homeRowItemSizes_.html create mode 100644 docs/api/quickplay.html delete 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 e0a8c8bb..d02d484c 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 ee5a49f1..b4f3d1b9 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 8c3224d4..8e5b116e 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
     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 22a58524..54bb803a 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 7cbd6231..c15dba8c 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 @@ sub getTextSize()
     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 590abdad..80833e4a 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"
 
 ' @fileoverview Clock component to display current time formatted based on user's chosen 12 or 24 hour setting
 
@@ -105,4 +105,4 @@ function format24HourTime() as string
 
     return `${displayedHour}:${displayedMinute}`
 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_GetNextEpisodeTask.bs.html b/docs/api/components_GetNextEpisodeTask.bs.html index f5d6a0e3..4f0b7c06 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 @@ sub getNextEpisodeTask()
 
     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 a5b10a58..5af67510 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 @@ function getDisplayBitrate(bitrate)
         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 b0b09f42..d7148bd3 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 @@ sub getShuffleEpisodesTask()
 
     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 49c1ed30..14a105f1 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 69fac532..cf7fbc3f 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.setFocus(false)
 
     m.alphaText = m.top.findNode("alphaText")
@@ -46,4 +46,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 9c95470d..47ef5b7a 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 @@ sub setFavoriteStatus()
     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 a55eada6..ad1d3b9c 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"
 
@@ -205,4 +205,4 @@ sub onPosterLoadStatusChanged()
         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 ad5b17bf..b2e7187a 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()
@@ -76,4 +76,4 @@ sub onPosterLoadStatusChanged()
         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 910bc48d..8ca27056 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"
@@ -908,4 +908,4 @@ sub updateTitle()
     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 ba843e0d..b9e3473d 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()
@@ -390,4 +390,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 a0953bc3..781fcf3f 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"
@@ -306,4 +306,4 @@ sub loadItems()
     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 c2d990ef..b6e603c0 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"
@@ -601,4 +601,4 @@ function FindPreferredAudioStream(streams as dynamic) as integer
 
     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_ItemGrid_MovieLibraryView.bs.html b/docs/api/components_ItemGrid_MovieLibraryView.bs.html index 2326fd8b..4cb66371 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"
@@ -962,4 +962,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 72a6cd9a..c9078211 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 @@ sub onPosterLoadStatusChanged()
         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 dbce3cf1..3d6ba65f 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"
@@ -825,4 +825,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 81d93c17..2855e9cc 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 @@ sub onTextChanged()
         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 eb08bac5..09d22a26 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 4cdfcf1d..bbab69a3 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 @@ sub redraw()
 
     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 a72ffc6a..d432e42f 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"
@@ -161,4 +161,4 @@ sub isLogoVisibleChange()
         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_JFScene.bs.html b/docs/api/components_JFScene.bs.html index 93543c60..19811264 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 88f0eade..a09cfe3c 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 @@ end sub
 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 36578b13..ba66dfd1 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 3aca097e..36555868 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()
@@ -130,4 +130,4 @@ sub focusChanged()
         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 6d8700cf..a4d1e06d 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 8d8ab69e..f1fa24bd 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 @@ function shortDate(isoDate) as string
     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 4e16e68d..df9e5cf6 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 4cc5a847..da1dd744 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 7436c0df..82447325 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 @@ function PlaystateDefaults(params = {} as object)
     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 b731bc40..d3f20eb5 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")
@@ -139,4 +139,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 b557f4c7..602e1d1c 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 @@ sub searchMedias()
         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 8e378844..734089ed 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 9caf0b92..3f37ada4 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")
 
@@ -41,4 +41,4 @@ sub onContentDataChanged()
         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 6066d561..88bc37ff 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()
@@ -45,4 +45,4 @@ sub setPalette()
 
     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 554b63ae..78b00a9c 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 @@ function parseVTT(lines)
     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 8fa9a292..58500f24 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 0a8ef85d..d147fbe2 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 @@ sub setColors()
     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 54d0e1fd..3051d90d 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 @@ end sub
 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 12106207..5d1bdfe0 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 @@ sub setTextColor(percentFocused)
         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 68354361..c9783970 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

import "pkg:/source/utils/misc.bs"
+    
On this page

components_config_LoginScene.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.top.setFocus(true)
@@ -58,4 +58,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
     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 e5736307..83d7645f 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 @@ sub ProcessSSDPResponse(message)
         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 08e6e99d..76388153 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()
@@ -169,4 +169,4 @@ sub OnScreenShown()
         overhang.title = ""
     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_AlbumData.bs.html b/docs/api/components_data_AlbumData.bs.html index e950344b..a0e8c02d 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 2b6d6a1a..9ee19420 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 @@ sub setPoster()
         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 03f85de0..eb3f127c 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 @@ sub setPoster()
     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 eb5a576c..b57d6e4b 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 @@ sub setPoster()
 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 c8747408..2d8f4f52 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 @@ sub getFiltersTask()
     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 699f7e46..c1908f57 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"
 
@@ -138,4 +138,4 @@ sub setData()
         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 7be8f697..8dd37a61 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_JFContentItem.bs.html b/docs/api/components_data_JFContentItem.bs.html index 2e918a0f..1aa858f7 100644 --- a/docs/api/components_data_JFContentItem.bs.html +++ b/docs/api/components_data_JFContentItem.bs.html @@ -1,8 +1,8 @@ Source: components/data/JFContentItem.bs
On this page

components_data_JFContentItem.bs

' Called whenever m.top.json changes.
+    
On this page

components_data_JFContentItem.bs

' Called whenever m.top.json changes.
 ' It is expected that each node that extends JFContentItem will override this function
 sub setFields()
 
 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 6da7a2a5..9d51114c 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"
@@ -81,4 +81,4 @@ sub setContainer()
         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 11c4bdc2..3de60168 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 @@ sub setPoster()
         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 dc3a57a8..5d73163c 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 @@ sub setPoster()
 
     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 e450b05d..fc2eccd6 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 @@ sub setPoster()
 
     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 123a9a8c..26e8af2b 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 @@ sub setPoster()
         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 26d6eef5..b959c17f 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 d11c882c..315ac202 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 @@ sub press()
         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 fdd38e98..718239c3 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 @@ sub setPoster()
 
     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 abedba58..4508b18e 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 @@ sub setPoster()
 
     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 1cde8ef4..abed05ae 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 @@ sub setPoster()
         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 26ac2361..eba30231 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_RecordingData.bs.html b/docs/api/components_data_RecordingData.bs.html index 7327dab8..76c0bbea 100644 --- a/docs/api/components_data_RecordingData.bs.html +++ b/docs/api/components_data_RecordingData.bs.html @@ -1,6 +1,6 @@ Source: components/data/RecordingData.bs
On this page

components_data_RecordingData.bs

import "pkg:/source/utils/misc.bs"
+    
On this page

components_data_RecordingData.bs

import "pkg:/source/utils/misc.bs"
 
 sub setFields()
     datum = m.top.json
@@ -20,4 +20,4 @@ sub setPoster()
         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_SceneManager.bs.html b/docs/api/components_data_SceneManager.bs.html index f34f2d57..02b73aba 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()
@@ -347,4 +347,4 @@ end sub
 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 f0b7a6b1..c2b83c2a 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 @@ sub setPoster()
         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 877255da..e7595be9 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 @@ sub setPoster()
         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 f1783f7f..0fb6eb60 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 @@ sub setPoster()
 
     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 f5e962c5..7b4818b5 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 @@ sub setPoster()
         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 b395bf3f..3d903185 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

import "pkg:/source/utils/misc.bs"
+    
On this page

components_data_TVEpisodeData.bs

import "pkg:/source/utils/misc.bs"
 
 sub setFields()
     if not isValid(m.top.json) then return
@@ -21,4 +21,4 @@ sub setPoster()
         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 161c972f..42e61149 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 @@ sub setPoster()
     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 e9a1c2ab..5a47e234 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 @@ end function
 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 f8ce7594..5ddbca55 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 @@ sub setPoster()
         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 455e5a17..9a27482f 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

import "pkg:/source/utils/misc.bs"
+    
On this page

components_extras_ExtrasItem.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     initPosterImg()
@@ -56,4 +56,4 @@ sub focusChanged()
         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 dfcd9e4b..fbdbafae 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

import "pkg:/source/utils/misc.bs"
+    
On this page

components_extras_ExtrasRowList.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.top.visible = true
@@ -227,4 +227,4 @@ end sub
 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 07949b61..c799f62a 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"
@@ -79,4 +79,4 @@ sub postFinished()
     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 6d4e4dbd..81297322 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"
@@ -374,4 +374,4 @@ sub onPosterLoadStatusChanged()
         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 18936c2a..56c4041f 100644 --- a/docs/api/components_home_HomeRows.bs.html +++ b/docs/api/components_home_HomeRows.bs.html @@ -1,6 +1,6 @@ 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
@@ -728,4 +728,4 @@ function filterNodeArray(nodeArray as object, nodeKey as string, excludeArray as
     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 d64999ac..adc69bf3 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"
@@ -301,4 +301,4 @@ sub getPersonVideos(videoType, dest, dimens)
         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 a4be2ceb..2e0b375d 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 @@ function keySelected(key as string) as boolean
 
     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 fe86b725..0bcd0c87 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 @@ sub loadChannels()
     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 1eab2918..14d865fe 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 @@ sub loadProgramDetails()
     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 20dea311..5a40cec8 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 @@ sub loadSchedule()
     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 401ece8b..958f9ba0 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
     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 b1e3457b..88b1a921 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 @@ sub RecordOrCancelProgram()
 
     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 ed5695ac..bfbb8429 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 692dd5d3..361d605c 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 @@ sub itemContentChanged()
     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 cb88b393..2ddfa3de 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 1b6ca0d0..c9c8fb15 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
@@ -54,4 +54,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
     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 8aae093a..43dcb7d2 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"
@@ -275,4 +275,4 @@ function getItemType(item) as string
 
     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 0c4125b6..cb6d2471 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")
@@ -254,4 +254,4 @@ function availSubtitleTrackIdx(tracknameToFind as string) as integer
     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 c628a4ee..a7b64e78 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 @@ sub ReportPlayback(state as string)
     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 16dc79c3..96eb75c3 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 @@ sub focusChanged()
     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 f1105f1c..51de14bd 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()
@@ -442,4 +442,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
     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 eaa61ca8..9f71c685 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
     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 5cb6656f..ecd95353 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 @@ sub focusChanged()
     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 d3f5096a..9dded0c6 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 4b6312ff..70b90b61 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 @@ function getData()
 
     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 34de3b95..175d46d2 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
@@ -170,4 +170,4 @@ sub onDoneLoading()
     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 d46187f2..f50c47b8 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
@@ -335,4 +335,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 7b62bda5..08ac4b59 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"
@@ -824,4 +824,4 @@ sub OnScreenHidden()
     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 d27470df..858496d4 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 @@ sub getScreensaverTimeout()
     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 c9cb02e2..e34620b7 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
@@ -161,4 +161,4 @@ sub onDoneLoading()
     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 e54241dc..a6a19f6c 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 @@ sub focusChanged()
     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 4bc48e8f..19c69726 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 4623df71..f8b95b59 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 9217bf60..bce63d9a 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 @@ sub loadItems()
 
 
 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 59e42bfa..4d8061cb 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 @@ function isValidToContinue(index as integer)
 
     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 661257e9..bd3b77b1 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"
 
@@ -25,4 +25,4 @@ sub monitorQuickConnect()
 
     m.top.authenticated = -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_quickConnect_QuickConnectDialog.bs.html b/docs/api/components_quickConnect_QuickConnectDialog.bs.html index 9943c8e6..93ab9724 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"
@@ -63,4 +63,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 fd21736d..7513c62a 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
     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 82f7e698..66fafd64 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 @@ sub addRow(data, title, type_filter)
         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 e8fd1f20..513cdb92 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 @@ sub search()
         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 d5ff994f..6020ee9e 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 @@ sub onFocusChange()
         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 cbbc5c14..f291c214 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 @@ sub displayedIndexChanged()
 
     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 e5956349..c5f73fd1 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 6db28d79..81e846f2 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 @@ sub empty()
     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 f04425a9..9fdd2e86 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 f57ce36c..e29cf369 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 a403a9ca..53be5200 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"
@@ -153,4 +153,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 dcc68453..6d2a974b 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()
@@ -199,4 +199,4 @@ sub focusChanged()
         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 a0e91331..6c2818a7 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 @@ function onKeyEvent(key as string, press as boolean) as boolean
     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 b3043733..41963439 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 @@ function getData()
     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 9c9eca29..c6d445d1 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 @@ function round(f as float) as integer
     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 64dc717d..787afe4c 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()
@@ -256,4 +256,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 83d0daf0..1be0385a 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"
 
 const LOGO_RIGHT_PADDING = 30
 const OPTIONCONTROLS_TOP_PADDING = 50
@@ -341,4 +341,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
     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 553070eb..32849f64 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()
@@ -852,4 +852,4 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     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 c503c8c3..f2ec65cb 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.exitScrubMode","link":"exitScrubMode","description":"

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

"},{"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.moveSeekbarThumb","link":"moveSeekbarThumb","description":"

moveSeekbarThumb: Positions the thumb on the seekbar

"},{"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.processScrubAction","link":"processScrubAction","description":"

processScrubAction: Handles +/- seeking for the audio trickplay bar

"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.resetSeekbarThumb","link":"resetSeekbarThumb","description":"

resetSeekbarThumb: Resets the thumb to the playing position

"},{"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.setSelectedButtonState","link":"setSelectedButtonState","description":"

setSelectedButtonState: Changes the icon state url for the currently selected button

"},{"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.format12HourTime","link":"format12HourTime","description":"

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

"},{"title":"module:Clock.format24HourTime","link":"format24HourTime","description":"

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

"},{"title":"module:Clock.formatTimeAsString","link":"formatTimeAsString","description":"

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour 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.initName","link":"initName"},{"title":"module:ExtrasItem.initPosterImg","link":"initPosterImg"},{"title":"module:ExtrasItem.initRole","link":"initRole"},{"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.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook called when the screen is hidden by the screen manager

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

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.initBackdrop","link":"initBackdrop"},{"title":"module:HomeItem.initItemPoster","link":"initItemPoster"},{"title":"module:HomeItem.initItemText","link":"initItemText"},{"title":"module:HomeItem.initItemTextExtra","link":"initItemTextExtra"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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:JFContentItem","link":"JFContentItem"},{"title":"module:JFContentItem.setFields","link":"setFields","description":"

Called whenever m.top.json changes.\nIt is expected that each node that extends JFContentItem will override this function

"},{"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.isLogoVisibleChange","link":"isLogoVisibleChange","description":"

component boolean field isLogoVisibleChange has changed value

"},{"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.addAudioStreamsToVideo","link":"addAudioStreamsToVideo","description":"

addAudioStreamsToVideo: Add audio stream data to video

"},{"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.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

defaultSubtitleTrack:

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

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook.

"},{"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","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.onMoviePosterSwapAnimationStateChange","link":"onMoviePosterSwapAnimationStateChange","description":"

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

"},{"title":"module:MovieDetails.onNewPosterImageURIChange","link":"onNewPosterImageURIChange","description":"

onNewPosterImageURIChange: Handler for newPosterImageURI param change

"},{"title":"module:MovieDetails.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.moveOptionControls","link":"moveOptionControls","description":"

moveOptionControls: Moves option controls node based on passed pixel values

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

onButtonSelected: Handler for selection of buttons from the menu.

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

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

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

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

"},{"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.onLogoImageChanged","link":"onLogoImageChanged","description":"

onLogoImageChanged: Handler for changes to m.top.logoImage param.

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

onLogoLoadStatusChanged: Handler for changes to logo image's status.

"},{"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.onSeasonNumberChanged","link":"onSeasonNumberChanged","description":"

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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","description":"

getItemType: Returns the media type of the passed item

"},{"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:RecordingData","link":"RecordingData"},{"title":"module:RecordingData.setFields","link":"setFields"},{"title":"module:RecordingData.setPoster","link":"setPoster"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

"},{"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.handleItemSkipAction","link":"handleItemSkipAction","description":"

handleItemSkipAction: Handles user command to skip items

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

handleShowAudioMenuAction: Handles action to show audio selection 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.onAudioIndexChange","link":"onAudioIndexChange","description":"

Event handler for when audioIndex changes

"},{"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.onSelectAudioPressed","link":"onSelectAudioPressed","description":"

onSelectAudioPressed: Display audio selection dialog

"},{"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.processAudioSelection","link":"processAudioSelection","description":"

processAudioSelection: Audio track selection handler

"},{"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.createLogoPoster","link":"createLogoPoster","description":"

Create and return a Jellyfin logo poster node

"},{"title":"module:misc.createOverhangUser","link":"createOverhangUser"},{"title":"module:misc.createSeperator","link":"createSeperator","description":"

Create and return a rectangle node used as a seperator in the overhang

"},{"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.isAllValid","link":"isAllValid","description":"

Returns whether or not all items in passed array are valid

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

isChainValid: Returns whether or not all the properties in the passed property chain are valid.\nStops evaluating at first found false value

"},{"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.toBoolean","link":"toBoolean","description":"

convert value to boolean and return value

"},{"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.exitScrubMode","link":"exitScrubMode","description":"

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

"},{"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.moveSeekbarThumb","link":"moveSeekbarThumb","description":"

moveSeekbarThumb: Positions the thumb on the seekbar

"},{"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.processScrubAction","link":"processScrubAction","description":"

processScrubAction: Handles +/- seeking for the audio trickplay bar

"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.resetSeekbarThumb","link":"resetSeekbarThumb","description":"

resetSeekbarThumb: Resets the thumb to the playing position

"},{"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.setSelectedButtonState","link":"setSelectedButtonState","description":"

setSelectedButtonState: Changes the icon state url for the currently selected button

"},{"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.ClockFormat","link":"ClockFormat","description":"

Possible clock formats

"},{"title":"module:Clock.ClockFormat.h12","link":"h12"},{"title":"module:Clock.ClockFormat.h24","link":"h24"},{"title":"module:Clock.format12HourTime","link":"format12HourTime","description":"

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

"},{"title":"module:Clock.format24HourTime","link":"format24HourTime","description":"

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

"},{"title":"module:Clock.formatTimeAsString","link":"formatTimeAsString","description":"

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour 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.initName","link":"initName"},{"title":"module:ExtrasItem.initPosterImg","link":"initPosterImg"},{"title":"module:ExtrasItem.initRole","link":"initRole"},{"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.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook called when the screen is hidden by the screen manager

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

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.initBackdrop","link":"initBackdrop"},{"title":"module:HomeItem.initItemPoster","link":"initItemPoster"},{"title":"module:HomeItem.initItemText","link":"initItemText"},{"title":"module:HomeItem.initItemTextExtra","link":"initItemTextExtra"},{"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.LOADING_WAIT_TIME","link":"LOADING_WAIT_TIME"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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:JFContentItem","link":"JFContentItem"},{"title":"module:JFContentItem.setFields","link":"setFields","description":"

Called whenever m.top.json changes.\nIt is expected that each node that extends JFContentItem will override this function

"},{"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.isLogoVisibleChange","link":"isLogoVisibleChange","description":"

component boolean field isLogoVisibleChange has changed value

"},{"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.SubtitleSelection","link":"SubtitleSelection"},{"title":"module:LoadVideoContentTask.SubtitleSelection.none","link":"none"},{"title":"module:LoadVideoContentTask.SubtitleSelection.notset","link":"notset"},{"title":"module:LoadVideoContentTask.addAudioStreamsToVideo","link":"addAudioStreamsToVideo","description":"

addAudioStreamsToVideo: Add audio stream data to video

"},{"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.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

defaultSubtitleTrack:

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

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook.

"},{"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","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.onMoviePosterSwapAnimationStateChange","link":"onMoviePosterSwapAnimationStateChange","description":"

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

"},{"title":"module:MovieDetails.onNewPosterImageURIChange","link":"onNewPosterImageURIChange","description":"

onNewPosterImageURIChange: Handler for newPosterImageURI param change

"},{"title":"module:MovieDetails.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.LOGO_RIGHT_PADDING","link":"LOGO_RIGHT_PADDING"},{"title":"module:OSD.OPTIONCONTROLS_TOP_PADDING","link":"OPTIONCONTROLS_TOP_PADDING"},{"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.moveOptionControls","link":"moveOptionControls","description":"

moveOptionControls: Moves option controls node based on passed pixel values

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

onButtonSelected: Handler for selection of buttons from the menu.

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

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

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

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

"},{"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.onLogoImageChanged","link":"onLogoImageChanged","description":"

onLogoImageChanged: Handler for changes to m.top.logoImage param.

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

onLogoLoadStatusChanged: Handler for changes to logo image's status.

"},{"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.onSeasonNumberChanged","link":"onSeasonNumberChanged","description":"

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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","description":"

getItemType: Returns the media type of the passed item

"},{"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:RecordingData","link":"RecordingData"},{"title":"module:RecordingData.setFields","link":"setFields"},{"title":"module:RecordingData.setPoster","link":"setPoster"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

"},{"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.handleItemSkipAction","link":"handleItemSkipAction","description":"

handleItemSkipAction: Handles user command to skip items

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

handleShowAudioMenuAction: Handles action to show audio selection 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.onAudioIndexChange","link":"onAudioIndexChange","description":"

Event handler for when audioIndex changes

"},{"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"},{"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.onSelectAudioPressed","link":"onSelectAudioPressed","description":"

onSelectAudioPressed: Display audio selection dialog

"},{"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.processAudioSelection","link":"processAudioSelection","description":"

processAudioSelection: Audio track selection handler

"},{"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"},{"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"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.CLIENT_VERSION_REQUIRING_BASE_MIGRATION","link":"CLIENT_VERSION_REQUIRING_BASE_MIGRATION"},{"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.createLogoPoster","link":"createLogoPoster","description":"

Create and return a Jellyfin logo poster node

"},{"title":"module:misc.createOverhangUser","link":"createOverhangUser"},{"title":"module:misc.createSeperator","link":"createSeperator","description":"

Create and return a rectangle node used as a seperator in the overhang

"},{"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.isAllValid","link":"isAllValid","description":"

Returns whether or not all items in passed array are valid

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

isChainValid: Returns whether or not all the properties in the passed property chain are valid.\nStops evaluating at first found false value

"},{"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.toBoolean","link":"toBoolean","description":"

convert value to boolean and return value

"},{"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: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"},{"title":"quickplay","link":"quickplay"},{"title":"quickplay.album","link":"album","description":"

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

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

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

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

A single audio file.

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

A boxset.\nPlay all items inside.

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

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

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

Quick Play A folder.\nShuffle play all items found

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

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

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

A single music video file.

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

Quick Play A Person.\nShuffle play all videos found

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

A single photo.

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

A photo album.

"},{"title":"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":"quickplay.program","link":"program","description":"

Quick Play A Live Program

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

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

"},{"title":"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":"quickplay.series","link":"series","description":"

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

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

Quick Play A TVChannel

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

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

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

A single video file.

"},{"title":"quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"}]} \ No newline at end of file diff --git a/docs/api/index.html b/docs/api/index.html index b9e7daa8..d7e974de 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 1fecafaf..18b7617c 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 66cdfa60..c54933d7 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 c8d87f29..8e405840 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 93ab0bd8..e9ff7bc2 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 28b5ea91..76a2da81 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 10972b81..0351b896 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 d75b8f12..d8cf7300 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 14d645e5..c0978831 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) exitScrubMode() → {void}

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

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) moveSeekbarThumb(playPositionBarWidth) → {void}

moveSeekbarThumb: Positions the thumb on the seekbar

Parameters:
NameTypeDescription
playPositionBarWidthfloat

width of the play position bar

Returns:
Type: 
void

(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) processScrubAction(seekStep) → {void}

processScrubAction: Handles +/- seeking for the audio trickplay bar

Parameters:
NameTypeDescription
seekStepinteger

seconds to move the trickplay position (negative values allowed)

Returns:
Type: 
void

(static) resetLoopModeToDefault() → {void}

Returns:
Type: 
void

(static) resetSeekbarThumb() → {void}

resetSeekbarThumb: Resets the thumb to the playing position

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) setSelectedButtonState(oldState, newState) → {void}

setSelectedButtonState: Changes the icon state url for the currently selected button

Parameters:
NameTypeDescription
oldStatestring

current state to replace in icon url

newStatestring

state to replace {oldState} with in icon url

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) exitScrubMode() → {void}

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

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) moveSeekbarThumb(playPositionBarWidth) → {void}

moveSeekbarThumb: Positions the thumb on the seekbar

Parameters:
NameTypeDescription
playPositionBarWidthfloat

width of the play position bar

Returns:
Type: 
void

(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) processScrubAction(seekStep) → {void}

processScrubAction: Handles +/- seeking for the audio trickplay bar

Parameters:
NameTypeDescription
seekStepinteger

seconds to move the trickplay position (negative values allowed)

Returns:
Type: 
void

(static) resetLoopModeToDefault() → {void}

Returns:
Type: 
void

(static) resetSeekbarThumb() → {void}

resetSeekbarThumb: Resets the thumb to the playing position

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) setSelectedButtonState(oldState, newState) → {void}

setSelectedButtonState: Changes the icon state url for the currently selected button

Parameters:
NameTypeDescription
oldStatestring

current state to replace in icon url

newStatestring

state to replace {oldState} with in icon url

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 de3cb556..04f77eae 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 83379aeb..b51a80ed 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 f0d9cbf7..0bf16b69 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 bcda30d4..c218730a 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 f69ece51..519e96d9 100644 --- a/docs/api/module-Clock.html +++ b/docs/api/module-Clock.html @@ -1,3 +1,3 @@ Module: Clock
On this page

Methods

(static) format12HourTime() → {string}

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

Returns:
  • current time formatted for a 12 hour clock
Type: 
string

(static) format24HourTime() → {string}

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

Returns:
  • current time formatted for a 24 hour clock
Type: 
string

(static) formatTimeAsString() → {string}

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour clock

Returns:
  • current time formatted for either a 12 hour or 24 hour clock
Type: 
string

(static) init() → {void}

Returns:
Type: 
void

(static) onCurrentTimeTimerFire() → {void}

onCurrentTimeTimerFire: Code that runs every time the currentTimeTimer fires

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Members

(static, readonly) ClockFormat

Possible clock formats

Properties
NameTypeDescription
h12
h24

Methods

(static) format12HourTime() → {string}

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

Returns:

current time formatted for a 12 hour clock

Type: 
string

(static) format24HourTime() → {string}

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

Returns:

current time formatted for a 24 hour clock

Type: 
string

(static) formatTimeAsString() → {string}

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour clock

Returns:

current time formatted for either a 12 hour or 24 hour clock

Type: 
string

(static) init() → {void}

Returns:
Type: 
void

(static) onCurrentTimeTimerFire() → {void}

onCurrentTimeTimerFire: Code that runs every time the currentTimeTimer fires

Returns:
Type: 
void
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 30d47ad4..9e08788b 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 3ba281eb..069f3518 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 28a7577b..a3e4b57a 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 c681ead3..3e643587 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 d8eb9509..adb8f5dd 100644 --- a/docs/api/module-ExtrasItem.html +++ b/docs/api/module-ExtrasItem.html @@ -1,3 +1,3 @@ Module: ExtrasItem
On this page

Methods

(static) focusChanged() → {void}

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) initName() → {void}

Returns:
Type: 
void

(static) initPosterImg() → {void}

Returns:
Type: 
void

(static) initRole() → {void}

Returns:
Type: 
void

(static) showContent() → {void}

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) initName() → {void}

Returns:
Type: 
void

(static) initPosterImg() → {void}

Returns:
Type: 
void

(static) initRole() → {void}

Returns:
Type: 
void

(static) showContent() → {void}

Returns:
Type: 
void
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 49a22d12..787fc87b 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 b6b5b222..37a67f4f 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 5aeda83a..be2e6190 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 d29b5f24..df3b4f2f 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 e70ce718..b4675564 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 588ebe72..12d4e499 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 46470719..16b64eb3 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 0067ea5e..81429ee3 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 713bcf80..33c91c5f 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 d31644cc..c5f96779 100644 --- a/docs/api/module-Home.html +++ b/docs/api/module-Home.html @@ -1,3 +1,3 @@ Module: Home
On this page

Methods

(static) OnScreenHidden() → {void}

JFScreen hook called when the screen is hidden by the screen manager

Returns:
Type: 
void

(static) OnScreenShown() → {void}

JFScreen hook called when the screen is displayed by the screen manager

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) OnScreenHidden() → {void}

JFScreen hook called when the screen is hidden by the screen manager

Returns:
Type: 
void

(static) OnScreenShown() → {void}

JFScreen hook called when the screen is displayed by the screen manager

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 6c8da242..bd2f5535 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 f8e670a2..01981b79 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) initBackdrop() → {void}

Returns:
Type: 
void

(static) initItemPoster() → {void}

Returns:
Type: 
void

(static) initItemText() → {void}

Returns:
Type: 
void

(static) initItemTextExtra() → {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) initBackdrop() → {void}

Returns:
Type: 
void

(static) initItemPoster() → {void}

Returns:
Type: 
void

(static) initItemText() → {void}

Returns:
Type: 
void

(static) initItemTextExtra() → {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 deleted file mode 100644 index 26fd5084..00000000 --- a/docs/api/module-HomeRowItemSizes.html +++ /dev/null @@ -1,3 +0,0 @@ -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 71cd183a..f1b6aee0 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(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 +
On this page

Members

(static, constant) LOADING_WAIT_TIME

Default Value
  • 2

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 4daac990..9836f6c7 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 cf4079be..8489ecda 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 96f8190b..5a06b272 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 d3577a00..03275100 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 ac0d2750..2f79659e 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) alphaSelectedChanged() → {void}

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) 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) alphaSelectedChanged() → {void}

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) 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 3584ea85..fd14ee38 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 d019d5f9..ab686b7f 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 6072fc62..f7787ee3 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 6a5fa720..a296ccf9 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-JFContentItem.html b/docs/api/module-JFContentItem.html index cad24de6..3999be4e 100644 --- a/docs/api/module-JFContentItem.html +++ b/docs/api/module-JFContentItem.html @@ -1,3 +1,3 @@ Module: JFContentItem
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-JFGroup.html b/docs/api/module-JFGroup.html index a197addd..404add5d 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 30b793ac..22e4c58e 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 c52279cc..44c4fe2a 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) isLogoVisibleChange() → {void}

component boolean field isLogoVisibleChange has changed value

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) isLogoVisibleChange() → {void}

component boolean field isLogoVisibleChange has changed value

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 58876ea8..18ebb154 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 061aef13..b9c44743 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 b992736e..65ca340b 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 001c49c3..bcf6e783 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 ae5e2b64..4283d7d3 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 e756ad32..3f91a273 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 89042474..0fe82327 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 4586af1b..3dd802e5 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 8bad2870..7939d25f 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 20535c3c..7ad43fe2 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 a46f1ddf..73b6451a 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 0679cbc9..743033ac 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 a3938885..fabbf269 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, forceTranscodingopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
videoobject
mediaSourceIddynamic
audio_stream_idxinteger<optional>
1
forceTranscodingboolean<optional>
false
Returns:
Type: 
void

(static) LoadItems_VideoPlayer(id, mediaSourceIdopt, audio_stream_idxopt, forceTranscodingopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
mediaSourceIddynamic<optional>
invalid
audio_stream_idxinteger<optional>
1
forceTranscodingboolean<optional>
false
Returns:
Type: 
dynamic

(static) addAudioStreamsToVideo(video) → {void}

addAudioStreamsToVideo: Add audio stream data to video

Parameters:
NameTypeDescription
videodynamic

component to add fullAudioData to

Returns:
Type: 
void

(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) defaultSubtitleTrack(sortedSubtitles, selectedAudioLanguage, requireTextopt) → {integer}

defaultSubtitleTrack:

Parameters:
NameTypeAttributesDefaultDescription
sortedSubtitlesdynamic

array of subtitles sorted by type and language

selectedAudioLanguagestring

language for selected audio track

requireTextboolean<optional>
false

indicates if only text subtitles should be considered

Returns:
  • indicating the default track's server-side index. Defaults to {SubtitleSelection.none} is one is not found
Type: 
integer

(static) defaultSubtitleTrackFromVid(videoID) → {integer}

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

Parameters:
NameTypeDescription
videoIDdynamic

id of video user is playing

Returns:
  • indicating the default track's server-side index. Defaults to {SubtitleSelection.none} is one is not found
Type: 
integer

(static) directPlaySupported(meta) → {boolean}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
boolean

(static) getContainerType(meta) → {string}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
string

(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

Members

(static, readonly) SubtitleSelection

Properties
NameTypeDescription
notset
none

Methods

(static) FindPreferredAudioStream(streams) → {integer}

Parameters:
NameTypeDescription
streamsdynamic
Returns:
Type: 
integer

(static) LoadItems_AddVideoContent(video, mediaSourceId, audio_stream_idxopt, forceTranscodingopt) → {void}

Parameters:
NameTypeAttributesDefaultDescription
videoobject
mediaSourceIddynamic
audio_stream_idxinteger<optional>
1
forceTranscodingboolean<optional>
false
Returns:
Type: 
void

(static) LoadItems_VideoPlayer(id, mediaSourceIdopt, audio_stream_idxopt, forceTranscodingopt) → {dynamic}

Parameters:
NameTypeAttributesDefaultDescription
idstring
mediaSourceIddynamic<optional>
invalid
audio_stream_idxinteger<optional>
1
forceTranscodingboolean<optional>
false
Returns:
Type: 
dynamic

(static) addAudioStreamsToVideo(video) → {void}

addAudioStreamsToVideo: Add audio stream data to video

Parameters:
NameTypeDescription
videodynamic

component to add fullAudioData to

Returns:
Type: 
void

(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) defaultSubtitleTrack(sortedSubtitles, selectedAudioLanguage, requireTextopt) → {integer}

defaultSubtitleTrack:

Parameters:
NameTypeAttributesDefaultDescription
sortedSubtitlesdynamic

array of subtitles sorted by type and language

selectedAudioLanguagestring

language for selected audio track

requireTextboolean<optional>
false

indicates if only text subtitles should be considered

Returns:

indicating the default track's server-side index. Defaults to {SubtitleSelection.none} is one is not found

Type: 
integer

(static) defaultSubtitleTrackFromVid(videoID) → {integer}

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

Parameters:
NameTypeDescription
videoIDdynamic

id of video user is playing

Returns:

indicating the default track's server-side index. Defaults to {SubtitleSelection.none} is one is not found

Type: 
integer

(static) directPlaySupported(meta) → {boolean}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
boolean

(static) getContainerType(meta) → {string}

Parameters:
NameTypeDescription
metaobject
Returns:
Type: 
string

(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 90293524..84ccdafd 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 7ff2856e..2e37f712 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 36de83ae..4bb9559a 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 bc8bde2e..477aedc3 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}

OnScreenShown: Callback function when view is presented on screen

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) onMoviePosterSwapAnimationStateChange() → {void}

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

Returns:
Type: 
void

(static) onNewPosterImageURIChange() → {void}

onNewPosterImageURIChange: Handler for newPosterImageURI param change

Returns:
Type: 
void

(static) onPosterLoadStatusChanged() → {void}

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

Returns:
Type: 
void

(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}

OnScreenShown: Callback function when view is presented on screen

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) onMoviePosterSwapAnimationStateChange() → {void}

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

Returns:
Type: 
void

(static) onNewPosterImageURIChange() → {void}

onNewPosterImageURIChange: Handler for newPosterImageURI param change

Returns:
Type: 
void

(static) onPosterLoadStatusChanged() → {void}

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

Returns:
Type: 
void

(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 ea3dcad3..f8446002 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) alphaSelectedChanged() → {void}

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) 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) alphaSelectedChanged() → {void}

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) 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 fc14ed56..0892ba44 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 02125e25..06bbd1c0 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 f9818865..c0a6f991 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 9b6df577..cf835254 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 7180b3e5..e6daacf7 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 1550de87..a152d0de 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) alphaSelectedChanged() → {void}

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) 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) alphaSelectedChanged() → {void}

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) 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 9ee611b6..57ae02ae 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 f63e735a..47092af8 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) moveOptionControls(horizontalPixels, verticalPixels) → {void}

moveOptionControls: Moves option controls node based on passed pixel values

Parameters:
NameTypeDescription
horizontalPixelsinteger

Number of horizontal pixels to move option controls

verticalPixelsinteger

Number of vertical pixels to move option controls

Returns:
Type: 
void

(static) onButtonSelected() → {void}

onButtonSelected: Handler for selection of buttons from the menu.

Returns:
Type: 
void

(static) onEpisodeNumberChanged() → {void}

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

Returns:
Type: 
void

(static) onEpisodeNumberEndChanged() → {void}

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

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) onLogoImageChanged() → {void}

onLogoImageChanged: Handler for changes to m.top.logoImage param.

Returns:
Type: 
void

(static) onLogoLoadStatusChanged(event) → {void}

onLogoLoadStatusChanged: Handler for changes to logo image's status.

Parameters:
NameTypeDescription
eventdynamic

field change event

Returns:
Type: 
void

(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) onSeasonNumberChanged() → {void}

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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

Members

(static, constant) LOGO_RIGHT_PADDING

Default Value
  • 30

(static, constant) OPTIONCONTROLS_TOP_PADDING

Default Value
  • 50

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) moveOptionControls(horizontalPixels, verticalPixels) → {void}

moveOptionControls: Moves option controls node based on passed pixel values

Parameters:
NameTypeDescription
horizontalPixelsinteger

Number of horizontal pixels to move option controls

verticalPixelsinteger

Number of vertical pixels to move option controls

Returns:
Type: 
void

(static) onButtonSelected() → {void}

onButtonSelected: Handler for selection of buttons from the menu.

Returns:
Type: 
void

(static) onEpisodeNumberChanged() → {void}

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

Returns:
Type: 
void

(static) onEpisodeNumberEndChanged() → {void}

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

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) onLogoImageChanged() → {void}

onLogoImageChanged: Handler for changes to m.top.logoImage param.

Returns:
Type: 
void

(static) onLogoLoadStatusChanged(event) → {void}

onLogoLoadStatusChanged: Handler for changes to logo image's status.

Parameters:
NameTypeDescription
eventdynamic

field change event

Returns:
Type: 
void

(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) onSeasonNumberChanged() → {void}

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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 437b1e22..8d243d46 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 42fe3f9d..a418cdb9 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 1d92634f..cb7e15e5 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 1eb18b2d..2bc7f3ae 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 f88b0d8f..4e146bd6 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 2a93df21..130eb883 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 0b839042..e47200b1 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 047131c9..5e3d6d10 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 04500ab7..085a48e1 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 cb2b4461..1ca7b313 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 0c12812f..30582e47 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 e24298f4..1caba517 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 d6cc0920..81095ed6 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 fcde92ea..f0d5395b 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 e48663cf..5615dba4 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 6d6a11a2..8734ca55 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 b305cb0f..350ed533 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 b8f68a1e..fe393957 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}

getItemType: Returns the media type of the passed item

Parameters:
NameTypeDescription
itemdynamic

Item to evaluate

Returns:
  • indicating type of media item is
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}

getItemType: Returns the media type of the passed item

Parameters:
NameTypeDescription
itemdynamic

Item to evaluate

Returns:

indicating type of media item is

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 03ce388a..86745161 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 698cde1b..46738f02 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 e0e424f9..d92190c3 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 87177847..9d2c7bac 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-RecordingData.html b/docs/api/module-RecordingData.html index b27e77d0..5badc180 100644 --- a/docs/api/module-RecordingData.html +++ b/docs/api/module-RecordingData.html @@ -1,3 +1,3 @@ Module: RecordingData
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 27bac9ce..ac64778e 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 8afd39a1..b362bf09 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 a3526a81..ee1d4863 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 3edfb869..6c516b94 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 377be22e..18d4f1ae 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 8ea3b1ab..a2c8417e 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 6f675df2..850a52d3 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 47b0ed2e..4c9a550a 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 a81be0d4..2e69e9e5 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 5b69b6c6..3a70d45c 100644 --- a/docs/api/module-SetServerScreen.html +++ b/docs/api/module-SetServerScreen.html @@ -1,3 +1,3 @@ Module: SetServerScreen
On this page

Methods

(static) OnScreenShown() → {void}

JFScreen hook called when the screen is displayed by the screen manager

Returns:
Type: 
void

(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) OnScreenShown() → {void}

JFScreen hook called when the screen is displayed by the screen manager

Returns:
Type: 
void

(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 979fc92a..c16803e7 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 8a8a09c9..178375de 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 3b4290d6..41bb90dc 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 471b7587..432de973 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 b025a847..eb11dcf2 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 aa16d3a5..5044b9ac 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 faab6775..9ed6b619 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 3361f722..e7003b8a 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 714fe833..f86f8e6b 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 c0a90cc3..57816b38 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 babbb2d9..89788dc1 100644 --- a/docs/api/module-TVEpisodes.html +++ b/docs/api/module-TVEpisodes.html @@ -1,3 +1,3 @@ Module: TVEpisodes
On this page

Methods

(static) OnScreenShown() → {void}

OnScreenShown: Callback function when view is presented on screen

Returns:
Type: 
void

(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) OnScreenShown() → {void}

OnScreenShown: Callback function when view is presented on screen

Returns:
Type: 
void

(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 9f7fadfc..373fe338 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 ff4d13af..949807a8 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 90371661..56a7ed99 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 f4356bd8..ba4847fe 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 87e46052..e63ec2ad 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 9bac97b0..583d0f39 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 aec692a1..f09d4d8c 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 7333f2ea..680bb982 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 16fe626c..853a2d35 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 13bb1e22..18acc968 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 fbbabcc8..b1af13c9 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 c5f49c2f..b41663f4 100644 --- a/docs/api/module-UserSelect.html +++ b/docs/api/module-UserSelect.html @@ -1,3 +1,3 @@ Module: UserSelect
On this page

Methods

(static) OnScreenShown() → {void}

JFScreen hook called when the screen is displayed by the screen manager

Returns:
Type: 
void

(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) redraw() → {void}

Returns:
Type: 
void
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

Methods

(static) OnScreenShown() → {void}

JFScreen hook called when the screen is displayed by the screen manager

Returns:
Type: 
void

(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) redraw() → {void}

Returns:
Type: 
void
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 7148e6bd..44a1e057 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 c0415640..9802a4d9 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 a2fd1bc7..5a4e705a 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) availSubtitleTrackIdx(tracknameToFind) → {integer}

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

Parameters:
NameTypeDescription
tracknameToFindstring

TrackName for subtitle we're looking to match

Returns:
  • indicating Roku's index for requested subtitle track. Returns -1 if not found
Type: 
integer

(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) handleItemSkipAction(action) → {void}

handleItemSkipAction: Handles user command to skip items

Parameters:
NameTypeDescription
actionstring

skip action to take

Returns:
Type: 
void

(static) handleShowAudioMenuAction() → {void}

handleShowAudioMenuAction: Handles action to show audio selection menu

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) onAudioIndexChange() → {void}

Event handler for when audioIndex changes

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) availSubtitleTrackIdx(tracknameToFind) → {integer}

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

Parameters:
NameTypeDescription
tracknameToFindstring

TrackName for subtitle we're looking to match

Returns:

indicating Roku's index for requested subtitle track. Returns -1 if not found

Type: 
integer

(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) handleItemSkipAction(action) → {void}

handleItemSkipAction: Handles user command to skip items

Parameters:
NameTypeDescription
actionstring

skip action to take

Returns:
Type: 
void

(static) handleShowAudioMenuAction() → {void}

handleShowAudioMenuAction: Handles action to show audio selection menu

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) onAudioIndexChange() → {void}

Event handler for when audioIndex changes

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 874e486b..da926977 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 f5752bd1..7356d910 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) onSelectAudioPressed() → {void}

onSelectAudioPressed: Display audio selection dialog

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) processAudioSelection() → {void}

processAudioSelection: Audio track selection handler

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}

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) onSelectAudioPressed() → {void}

onSelectAudioPressed: Display audio selection dialog

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) processAudioSelection() → {void}

processAudioSelection: Audio track selection handler

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 08914107..d3e398d0 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 361ccb2f..a3293097 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}

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 95800352..127196b6 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 d59b3e0f..f47d4cb9 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 06c12cde..2a14ec86 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 d37948fe..8b63532f 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 c45c7e1a..1a6682b2 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 deleted file mode 100644 index 6e357e79..00000000 --- a/docs/api/module-homeRowItemSizes_.html +++ /dev/null @@ -1,3 +0,0 @@ -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 615fc3d1..cc247b74 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 491ab462..6eef4113 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) createLogoPoster() → {dynamic}

Create and return a Jellyfin logo poster node

Returns:
Type: 
dynamic

(static) createOverhangUser() → {dynamic}

Returns:
Type: 
dynamic

(static) createSeperator(id) → {dynamic}

Create and return a rectangle node used as a seperator in the overhang

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(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) isAllValid(input) → {boolean}

Returns whether or not all items in passed array are valid

Parameters:
NameTypeDescription
inputobject
Returns:
Type: 
boolean

(static) isChainValid(root, propertyPath) → {boolean}

isChainValid: Returns whether or not all the properties in the passed property chain are valid. Stops evaluating at first found false value

Parameters:
NameTypeDescription
rootdynamic

high-level object to test property chain against

propertyPathstring

chain of properties under root object to test

Returns:
  • indicating if all properties in chain are valid
Type: 
boolean

(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) toBoolean(value) → {dynamic}

convert value to boolean and return value

Parameters:
NameTypeDescription
valuedynamic
Returns:
Type: 
dynamic

(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) createLogoPoster() → {dynamic}

Create and return a Jellyfin logo poster node

Returns:
Type: 
dynamic

(static) createOverhangUser() → {dynamic}

Returns:
Type: 
dynamic

(static) createSeperator(id) → {dynamic}

Create and return a rectangle node used as a seperator in the overhang

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(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) isAllValid(input) → {boolean}

Returns whether or not all items in passed array are valid

Parameters:
NameTypeDescription
inputobject
Returns:
Type: 
boolean

(static) isChainValid(root, propertyPath) → {boolean}

isChainValid: Returns whether or not all the properties in the passed property chain are valid. Stops evaluating at first found false value

Parameters:
NameTypeDescription
rootdynamic

high-level object to test property chain against

propertyPathstring

chain of properties under root object to test

Returns:

indicating if all properties in chain are valid

Type: 
boolean

(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) toBoolean(value) → {dynamic}

convert value to boolean and return value

Parameters:
NameTypeDescription
valuedynamic
Returns:
Type: 
dynamic

(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 9abd1282..38d7c1df 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
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 646521d8..eaebbb65 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 7e3ed929..88b42671 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 0a8eb692..c8d40c20 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 550774f8..bb19fd01 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 176252d9..3642cdb8 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/quickplay.html b/docs/api/quickplay.html new file mode 100644 index 00000000..39f2ec13 --- /dev/null +++ b/docs/api/quickplay.html @@ -0,0 +1,3 @@ +Namespace: quickplay
On this page

quickplay

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_Main.bs.html b/docs/api/source_Main.bs.html index c1dc450e..6f0cc7f9 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")
@@ -868,4 +868,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 d1c00386..94a4966c 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:
 
@@ -939,4 +939,4 @@ sub playbackOptionDialog(time as longinteger, meta as object)
     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 46283278..e8a01749 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 @@ function getDisplayBitrate(bitrate)
         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 c78c9bcc..2e281b2b 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 @@ function UserImageURL(id, params = {})
     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 c5e886fe..4c2525e5 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 = {
@@ -503,4 +503,4 @@ function TVEpisodeShuffleList(show_id as string)
 
     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 da3f8e4b..c4bfb89c 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 @@ function UnmarkItemWatched(id as string)
     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 4e19334a..22e6e70e 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 @@ function buildAuthHeader() as string
 
     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 62ca2ad6..4a14e50f 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 @@ function AuthenticateViaQuickConnect(secret)
 
     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 deleted file mode 100644 index a832ca59..00000000 --- a/docs/api/source_constants_HomeRowItemSizes.bs.html +++ /dev/null @@ -1,10 +0,0 @@ -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 35416fa2..090cc193 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
@@ -98,4 +98,4 @@ sub runRegistryUserMigrations()
         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 5c6754a4..6384c560 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 @@ function getSubtitleLanguages()
         "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 36bd6b54..224569e8 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 @@ sub printRegistry()
         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 91512cd7..28567343 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 @@ function getSavedUsers() as object
 
     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 523c1b40..d07f522a 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.
@@ -1071,4 +1071,4 @@ function setPreferredCodec(codecString as string, preferredCodec as string) as s
         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 d1402437..47888785 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 @@ sub SaveDeviceToGlobal()
         }
     })
 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 e9263298..3e9ccd60 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
@@ -601,4 +601,4 @@ function toBoolean(value as dynamic) as dynamic
         return value
     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_quickplay.bs.html b/docs/api/source_utils_quickplay.bs.html index 3052f6c8..a2912c46 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 @@ namespace quickplay
     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 5c6839448fc8bfcf8d0b3a60f5105ba2476b66bc Mon Sep 17 00:00:00 2001 From: sand14 Date: Sun, 15 Sep 2024 00:29:42 +0000 Subject: [PATCH 028/141] Translated using Weblate (Romanian) Currently translated at 44.2% (128 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/ro/ --- locale/ro/translations.ts | 194 +++++++++++++++++++++++++++++++++++++- 1 file changed, 193 insertions(+), 1 deletion(-) diff --git a/locale/ro/translations.ts b/locale/ro/translations.ts index b93a3b9f..77c37c84 100644 --- a/locale/ro/translations.ts +++ b/locale/ro/translations.ts @@ -26,7 +26,7 @@ Favorite - Favorite + Favorit Loading... @@ -389,6 +389,198 @@ Redare Title for Playback section in user setting screen. + + Connecting to Server + Se conectează la server + Message to display to user while client is attempting to connect to the server + + + More Like This + Mai Multe Ca Acesta + + + Special Features + Caracteristici Speciale + + + Started at + A Început la + (Past Tense) For defining time when a program started today (e.g. Started at 08:00) + + + Live + În direct + If TV Show is being broadcast live (not pre-recorded) + + + Enabled + Activat + + + Age + Vârstă + + + Cast & Crew + Distribuţie & Echipă + + + Additional Parts + Părţi Adiţionale + Additional parts of a video + + + Press 'OK' to Close + Apăsați 'OK' pentru a închide + + + TV Shows + Seriale TV + + + tomorrow + mâine + Next day + + + Media Grid options. + Opțiuni Grilă Media. + + + today + astăzi + Current day + + + yesterday + ieri + Previous day + + + Sunday + duminică + Day of Week + + + Monday + Luni + Day of Week + + + Tuesday + Marți + Day of Week + + + Wednesday + Miercuri + Day of Week + + + Friday + Vineri + Day of Week + + + Saturday + Sâmbătă + Day of Week + + + Started + A început + (Past Tense) For defining a day and time when a program started (e.g. Started Wednesday, 08:00) + + + Starts at + Începe la + (Future Tense) For defining time when a program will start today (e.g. Starts at 08:00) + + + Starts + Începe + (Future Tense) For defining a day and time when a program will start (e.g. Starts Wednesday, 08:00) + + + Ended at + S-a terminat la + (Past Tense) For defining time when a program will ended (e.g. Ended at 08:00) + + + Ends at + Se termină la + (Past Tense) For defining a day and time when a program ended (e.g. Ended Wednesday, 08:00) + + + Repeat + Redifuzare + If TV Shows has previously been broadcasted + + + TV Guide + Ghid TV + Menu option for showing Live TV Guide / Schedule + + + View Channel + Vezi Canal + + + Record + Înregistrează + + + Record Series + Înregistrează Serial + + + Cancel Recording + Anulează înregistrarea + + + Not found + Nu a fost găsit + Title of message box when the requested content is not found on the server + + + The requested content does not exist on the server + Conținutul cerut nu există pe server + Content of message box when the requested content is not found on the server + + + Error Getting Playback Information + Eroare la Primirea Informației despre conținutul selectat + Dialog Title: Received error from server when trying to get information about the selected item for playback + + + An error was encountered while playing this item. Server did not provide required transcoding data. + O eroare a fost întâlnită în timpul redării acestui element. Serverul nu a furnizat datele de transcodare necesare. + Content of message box when trying to play an item which requires transcoding, and the server did not provide transcode url + + + Disabled + Dezactivat + + + Media Grid + Grilă media + UI -> Media Grid section in user setting screen. + + + Item Count + Număr Elemente + UI -> Media Grid -> Item Count in user setting screen. + + + Thursday + Joi + Day of Week + + + Unknown + Necunoscut + Title for a cast member for which we have no information for +
From 7499ba2830358cb53b0741d3fb94ef40470f6d24 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 19 Sep 2024 17:01:28 +0000 Subject: [PATCH 029/141] Update actions/setup-node digest to 0a44ba7 --- .github/workflows/build-dev.yml | 2 +- .github/workflows/build-prod.yml | 2 +- .github/workflows/roku-analysis.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml index 7c8b9310..46f97c29 100644 --- a/.github/workflows/build-dev.yml +++ b/.github/workflows/build-dev.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 - - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 + - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4 with: node-version: "lts/*" cache: "npm" diff --git a/.github/workflows/build-prod.yml b/.github/workflows/build-prod.yml index a5a733df..d482f30d 100644 --- a/.github/workflows/build-prod.yml +++ b/.github/workflows/build-prod.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 - - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 + - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4 with: node-version: "lts/*" cache: "npm" diff --git a/.github/workflows/roku-analysis.yml b/.github/workflows/roku-analysis.yml index 5a9a8c8f..11b7fb99 100644 --- a/.github/workflows/roku-analysis.yml +++ b/.github/workflows/roku-analysis.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 - - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 + - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4 with: node-version: "lts/*" cache: "npm" From d6f8958918f535308dc24a8ce23e77f7cdc08705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Fri, 20 Sep 2024 07:33:00 +0000 Subject: [PATCH 030/141] Translated using Weblate (Czech) Currently translated at 100.0% (289 of 289 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/cs/ --- locale/cs/translations.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/locale/cs/translations.ts b/locale/cs/translations.ts index 7edf5e83..b12c2086 100644 --- a/locale/cs/translations.ts +++ b/locale/cs/translations.ts @@ -1300,6 +1300,30 @@ Pro zobrazení úplného seznamu změn navštivte WhatsNewDialog body text preceding the changelog URL + + View All Next Up + Zobrazit všechny další díly + + + Episode Images Next Up + Obrázky dílů v sekci Další díly + + + What type of images to use for Episodes shown in the 'Next Up' and 'Continue Watching' sections. + Jaký typ obrázků se má zobrazovat u dílů v sekcích "Další díly" a "Pokračovat ve sledování". + + + Use Web Client Setting + Použít nastavení webového klienta + + + Use Episode Image + Použít obrázek dílu + + + Use Show Image + Použít obrázek seriálu + From 4355e68372c6b72ec9578fd6f335f380dc11d6f4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 15:48:06 +0000 Subject: [PATCH 031/141] Update actions/setup-java digest to b36c23c --- .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 5a9a8c8f..56b81d65 100644 --- a/.github/workflows/roku-analysis.yml +++ b/.github/workflows/roku-analysis.yml @@ -28,7 +28,7 @@ jobs: if: env.BRANCH_NAME == 'master' run: npm run build-prod - name: Setup Java - uses: actions/setup-java@2dfa2011c5b2a0f1489bf9e433881c92c1631f88 # v4 + uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4 with: distribution: "temurin" java-version: "21" From 3694f0a64aaef85a3fe659de893ac063e00361f4 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Wed, 25 Sep 2024 16:06:39 +0000 Subject: [PATCH 032/141] Update API docs --- docs/api/components_ItemGrid_GridItem.bs.html | 2 +- .../components_ItemGrid_LoadVideoContentTask.bs.html | 5 +++-- docs/api/components_JFVideo.bs.html | 12 +++++++----- docs/api/components_data_HomeData.bs.html | 1 + docs/api/components_video_VideoPlayerView.bs.html | 12 +++++++----- docs/api/source_VideoPlayer.bs.html | 6 +++--- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/docs/api/components_ItemGrid_GridItem.bs.html b/docs/api/components_ItemGrid_GridItem.bs.html index ad1d3b9c..4e2e3bc2 100644 --- a/docs/api/components_ItemGrid_GridItem.bs.html +++ b/docs/api/components_ItemGrid_GridItem.bs.html @@ -118,7 +118,7 @@ sub itemContentChanged() m.itemText.text = itemData.Title end if ' Adjust to wide posters for "View All Next Up" - if m.topParent.overhangTitle = tr("View All Next Up") + if m.itemGrid.overhangTitle = tr("View All Next Up") m.posterMask.maskUri = "" m.itemPoster.height = 300 diff --git a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html index b6e603c0..5734487d 100644 --- a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html +++ b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html @@ -120,8 +120,9 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s video.logoImage = api.items.GetImageURL(logoLookupID, "logo", 0, { "maxHeight": 65, "maxWidth": 300, "quality": "90" }) end if - if m.global.session.user.Configuration.EnableNextEpisodeAutoPlay - if LCase(m.top.itemType) = "episode" + if LCase(m.top.itemType) = "episode" + userSession = m.global.session.user + if userSession.settings["playback.playnextepisode"] = "enabled" or userSession.settings["playback.playnextepisode"] = "webclient" and userSession.Configuration.EnableNextEpisodeAutoPlay addNextEpisodesToQueue(video.showID) end if end if diff --git a/docs/api/components_JFVideo.bs.html b/docs/api/components_JFVideo.bs.html index ba66dfd1..0d4421bd 100644 --- a/docs/api/components_JFVideo.bs.html +++ b/docs/api/components_JFVideo.bs.html @@ -94,12 +94,14 @@ end sub sub showNextEpisodeButton() 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? + if m.nextEpisodeButton.opacity <> 0 then return + userSession = m.global.session.user + if userSession.settings["playback.playnextepisode"] = "disabled" then return + if userSession.settings["playback.playnextepisode"] = "webclient" and not userSession.Configuration.EnableNextEpisodeAutoPlay then return - if m.nextEpisodeButton.opacity = 0 and m.global.session.user.configuration.EnableNextEpisodeAutoPlay - m.nextEpisodeButton.visible = true - m.showNextEpisodeButtonAnimation.control = "start" - m.nextEpisodeButton.setFocus(true) - end if + m.nextEpisodeButton.visible = true + m.showNextEpisodeButtonAnimation.control = "start" + m.nextEpisodeButton.setFocus(true) end sub ' diff --git a/docs/api/components_data_HomeData.bs.html b/docs/api/components_data_HomeData.bs.html index c1908f57..d9c08f3d 100644 --- a/docs/api/components_data_HomeData.bs.html +++ b/docs/api/components_data_HomeData.bs.html @@ -62,6 +62,7 @@ sub setData() end if else if datum.type = "Series" + m.top.isWatched = datum.UserData.Played imgParams = { "maxHeight": 261 } imgParams.Append({ "maxWidth": 464 }) diff --git a/docs/api/components_video_VideoPlayerView.bs.html b/docs/api/components_video_VideoPlayerView.bs.html index 32849f64..452a2ef3 100644 --- a/docs/api/components_video_VideoPlayerView.bs.html +++ b/docs/api/components_video_VideoPlayerView.bs.html @@ -519,12 +519,14 @@ sub showNextEpisodeButton() if m.osd.visible then return 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? + if m.nextEpisodeButton.opacity <> 0 then return + userSession = m.global.session.user + if userSession.settings["playback.playnextepisode"] = "disabled" then return + if userSession.settings["playback.playnextepisode"] = "webclient" and not userSession.Configuration.EnableNextEpisodeAutoPlay then return - if m.nextEpisodeButton.opacity = 0 and m.global.session.user.configuration.EnableNextEpisodeAutoPlay - m.nextEpisodeButton.visible = true - m.showNextEpisodeButtonAnimation.control = "start" - m.nextEpisodeButton.setFocus(true) - end if + m.nextEpisodeButton.visible = true + m.showNextEpisodeButtonAnimation.control = "start" + m.nextEpisodeButton.setFocus(true) end sub ' diff --git a/docs/api/source_VideoPlayer.bs.html b/docs/api/source_VideoPlayer.bs.html index e8a01749..aefeca7a 100644 --- a/docs/api/source_VideoPlayer.bs.html +++ b/docs/api/source_VideoPlayer.bs.html @@ -437,11 +437,11 @@ function getAudioInfo(meta as object) as object end function sub autoPlayNextEpisode(videoID as string, showID as string) - ' use web client setting - if m.global.session.user.configuration.EnableNextEpisodeAutoPlay + userSession = m.global.session.user + if userSession.settings["playback.playnextepisode"] = "enabled" or userSession.settings["playback.playnextepisode"] = "webclient" and userSession.Configuration.EnableNextEpisodeAutoPlay ' query API for next episode ID url = Substitute("Shows/{0}/Episodes", showID) - urlParams = { "UserId": m.global.session.user.id } + urlParams = { "UserId": userSession.id } urlParams.Append({ "StartItemId": videoID }) urlParams.Append({ "Limit": 2 }) resp = APIRequest(url, urlParams) From 9e5ae3aa1f4685049736fc74de1b3cb5e0d6bd76 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Wed, 25 Sep 2024 13:14:20 -0400 Subject: [PATCH 033/141] stop trying to direct play AAC profile "main" --- source/utils/deviceCapabilities.bs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/source/utils/deviceCapabilities.bs b/source/utils/deviceCapabilities.bs index 3dd234dc..05bec80b 100644 --- a/source/utils/deviceCapabilities.bs +++ b/source/utils/deviceCapabilities.bs @@ -440,7 +440,26 @@ function getCodecProfiles() as object if di.CanDecodeAudio({ Codec: audioCodec, ChCnt: audioChannel }).Result channelSupportFound = true for each codecType in ["VideoAudio", "Audio"] - if audioCodec = "opus" and codecType = "Audio" + if audioCodec = "aac" + codecProfiles.push({ + "Type": codecType, + "Codec": audioCodec, + "Conditions": [ + { + "Condition": "NotEquals", + "Property": "AudioProfile", + "Value": "Main", + "IsRequired": true + }, + { + "Condition": "LessThanEqual", + "Property": "AudioChannels", + "Value": audioChannel, + "IsRequired": true + } + ] + }) + else if audioCodec = "opus" and codecType = "Audio" ' opus audio files not supported by roku else codecProfiles.push({ From 864bb5682ce89defa2f9d9de7bfa607ceba28640 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 22:02:26 +0000 Subject: [PATCH 034/141] Update dependency brighterscript to v0.67.7 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 93738826..436d8b49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@rokucommunity/bslint": "0.8.24", - "brighterscript": "0.67.6", + "brighterscript": "0.67.7", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", "jsdoc": "4.0.3", @@ -849,9 +849,9 @@ } }, "node_modules/brighterscript": { - "version": "0.67.6", - "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.67.6.tgz", - "integrity": "sha512-MsqPOTJSzvVaOY4R5aykdg9jqesBPZbIXZZvmBKHI5DYwBWtY9SMDe2G+AwTwQ3q8KJvmsPQ6Yw/UbL8tReizQ==", + "version": "0.67.7", + "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.67.7.tgz", + "integrity": "sha512-KvHM3U4AVu3cOprwmWCOjg8Z7eMkehEJJeDp2PABVnT4GcqwOxtObOUITDJiJ5EuPSsmBlCzt1v3eTywyy7hTw==", "license": "MIT", "dependencies": { "@rokucommunity/bslib": "^0.1.1", diff --git a/package.json b/package.json index 97cdce0e..175d5fe3 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "devDependencies": { "@rokucommunity/bslint": "0.8.24", - "brighterscript": "0.67.6", + "brighterscript": "0.67.7", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", "jsdoc": "4.0.3", From a24df3dfebaed0156e4bf78aed43f603fc480596 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Thu, 26 Sep 2024 11:18:11 -0400 Subject: [PATCH 035/141] wait until we have data from itemGrid to set itemText visibility --- components/ItemGrid/GridItem.bs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/ItemGrid/GridItem.bs b/components/ItemGrid/GridItem.bs index 5dae0e13..248f4302 100644 --- a/components/ItemGrid/GridItem.bs +++ b/components/ItemGrid/GridItem.bs @@ -20,9 +20,6 @@ sub init() m.checkmark.width = 90 m.checkmark.height = 60 - m.itemText.translation = [0, m.itemPoster.height + 7] - m.itemText.visible = m.gridTitles = "showalways" - ' Add some padding space when Item Titles are always showing if m.itemText.visible then m.itemText.maxWidth = 250 @@ -38,6 +35,9 @@ sub init() end if end if + m.itemText.translation = [0, m.itemPoster.height + 7] + m.itemText.visible = m.gridTitles = "showalways" + end sub sub itemContentChanged() From d0d1be0c7dfd50baf5e54c03bef2d5a5ed5e9ce6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 22:26:23 +0000 Subject: [PATCH 036/141] Update dependency brighterscript-formatter to v1.7.5 --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 436d8b49..054ac8da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "license": "GPL-2.0", "dependencies": { "@rokucommunity/bslib": "0.1.1", - "brighterscript-formatter": "1.7.4", + "brighterscript-formatter": "1.7.5", "log": "npm:roku-log@0.11.1" }, "devDependencies": { @@ -893,12 +893,12 @@ } }, "node_modules/brighterscript-formatter": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/brighterscript-formatter/-/brighterscript-formatter-1.7.4.tgz", - "integrity": "sha512-a9RWMbCADBHLwaVirf5NuXPxZaRSraSf3Zm8/ecf5qx51gEU4DbwqpLE+d4ncnHn2/Y5M3mf0fJeQGfWlqo6Kg==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/brighterscript-formatter/-/brighterscript-formatter-1.7.5.tgz", + "integrity": "sha512-TIo1BdzHfhd07aFcikEMHyeLhrZqbVNOKF/v03DX3n/33FXhsstR3PhhVjJUxFsoeawO6dRhzGUGDh/EegJ5Iw==", "license": "MIT", "dependencies": { - "brighterscript": "^0.67.4", + "brighterscript": "^0.67.7", "glob-all": "^3.3.0", "jsonc-parser": "^3.0.0", "source-map": "^0.7.3", diff --git a/package.json b/package.json index 175d5fe3..e20f335e 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "description": "Roku app for Jellyfin media server", "dependencies": { "@rokucommunity/bslib": "0.1.1", - "brighterscript-formatter": "1.7.4", + "brighterscript-formatter": "1.7.5", "log": "npm:roku-log@0.11.1" }, "devDependencies": { From 67ac8c42e9ee96ead86e58fd51277f3720319f21 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:56:02 +0000 Subject: [PATCH 037/141] Update dependency @rokucommunity/bslint to v0.8.25 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 054ac8da..b274281b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "log": "npm:roku-log@0.11.1" }, "devDependencies": { - "@rokucommunity/bslint": "0.8.24", + "@rokucommunity/bslint": "0.8.25", "brighterscript": "0.67.7", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", @@ -315,9 +315,9 @@ "integrity": "sha512-2ox6EUL+UTtccTbD4dbVjZK3QHa0PHCqpoKMF8lZz9ayzzEP3iVPF8KZR6hOi6bxsIcbGXVjqmtCVkpC4P9SrA==" }, "node_modules/@rokucommunity/bslint": { - "version": "0.8.24", - "resolved": "https://registry.npmjs.org/@rokucommunity/bslint/-/bslint-0.8.24.tgz", - "integrity": "sha512-1EbA6VeW3QC2QQ/Tqf9qTTcCdZ2ZP9q7H9ZvkeN9gzWYiXFSpJo9AnS41LzEsjRKUtC95UXxIhNhIt4Y+x5szg==", + "version": "0.8.25", + "resolved": "https://registry.npmjs.org/@rokucommunity/bslint/-/bslint-0.8.25.tgz", + "integrity": "sha512-qQ9o5khnyF80K/2FnpnUFHfz28sW1B5UOsBiCjqAjhtTBKWzhkIQP8CrIIWej2nGy7+UlmA4slODZkinCsJv+w==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index e20f335e..5deb5c45 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "log": "npm:roku-log@0.11.1" }, "devDependencies": { - "@rokucommunity/bslint": "0.8.24", + "@rokucommunity/bslint": "0.8.25", "brighterscript": "0.67.7", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", From 9e137cd501f28837771650fa476e611f1316919f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:56:10 +0000 Subject: [PATCH 038/141] Update dependency ropm to v0.10.26 --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 054ac8da..ff0f196f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "roku-deploy": "3.12.1", "roku-log-bsc-plugin": "0.8.1", "rooibos-roku": "5.13.0", - "ropm": "0.10.25", + "ropm": "0.10.26", "spellchecker-cli": "6.2.0", "undent": "0.1.0" } @@ -5097,15 +5097,15 @@ "license": "MIT" }, "node_modules/ropm": { - "version": "0.10.25", - "resolved": "https://registry.npmjs.org/ropm/-/ropm-0.10.25.tgz", - "integrity": "sha512-8Lk62oU7zam4whLBQF3eEyg7yzOad5wulpwzK90DwSKzXGbPM67aZTMKBcOxH2AbMvps68UbGPWVMzeSCATNSg==", + "version": "0.10.26", + "resolved": "https://registry.npmjs.org/ropm/-/ropm-0.10.26.tgz", + "integrity": "sha512-NvWbT7OpQQNyp6ISxU8mvVXhHxA7vgxN+7Cg8xq5BudnlAfKT8JCLhPxA5tcC152thhOxtljSpdXs5wkzU4xVw==", "dev": true, "license": "MIT", "dependencies": { "@xml-tools/ast": "^5.0.5", "@xml-tools/parser": "1.0.10", - "brighterscript": "^0.67.5", + "brighterscript": "^0.67.7", "del": "6.0.0", "fs-extra": "9.1.0", "glob-all": "3.2.1", diff --git a/package.json b/package.json index e20f335e..c4c9e4f5 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "roku-deploy": "3.12.1", "roku-log-bsc-plugin": "0.8.1", "rooibos-roku": "5.13.0", - "ropm": "0.10.25", + "ropm": "0.10.26", "spellchecker-cli": "6.2.0", "undent": "0.1.0" }, From 065f81cf6cabf7f3ca9fe3cc66a703c5cea9bd28 Mon Sep 17 00:00:00 2001 From: Jimi Date: Fri, 20 Sep 2024 19:28:04 -0600 Subject: [PATCH 039/141] Add missing field --- components/data/ChannelData.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/components/data/ChannelData.xml b/components/data/ChannelData.xml index b7a2feb5..2d0667b5 100644 --- a/components/data/ChannelData.xml +++ b/components/data/ChannelData.xml @@ -1,6 +1,7 @@ + From f399d699d315336240c8474edbd44dfc0341e89e Mon Sep 17 00:00:00 2001 From: Jimi Date: Fri, 27 Sep 2024 09:12:10 -0600 Subject: [PATCH 040/141] Allow for remux of LiveTV --- source/api/Items.bs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/source/api/Items.bs b/source/api/Items.bs index 6b5db4ea..f4262dc2 100644 --- a/source/api/Items.bs +++ b/source/api/Items.bs @@ -26,7 +26,17 @@ function ItemPostPlaybackInfo(id as string, mediaSourceId = "" as string, audioT "SubtitleStreamIndex": subtitleTrackIndex } - if mediaSourceId <> "" then params.MediaSourceId = mediaSourceId + ' Note: Jellyfin v10.9+ now remuxs LiveTV and does not allow DirectPlay anymore. + ' Because of this, we need to tell the server "EnableDirectPlay = false" so that we receive the + ' transcoding URL (which is just a remux and not a transcode; unless it is) + ' The web handles this by disabling EnableDirectPlay on a Retry, but we don't currently Retry a Live + ' TV stream, thus we just turn it off on the first try here. + if mediaSourceId <> "" + params.MediaSourceId = mediaSourceId + else + ' No mediaSourceId? Must be LiveTV... + params.EnableDirectPlay = false + end if if audioTrackIndex > -1 then params.AudioStreamIndex = audioTrackIndex From c459a317366ea06843dd2e679c6ddaf7d61a95fe Mon Sep 17 00:00:00 2001 From: Bronley Plumb Date: Sat, 28 Sep 2024 00:14:11 -0400 Subject: [PATCH 041/141] Prevent type mismatch crash --- source/api/sdk.bs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/api/sdk.bs b/source/api/sdk.bs index c115b840..b591b825 100644 --- a/source/api/sdk.bs +++ b/source/api/sdk.bs @@ -1207,7 +1207,7 @@ namespace api ' Moves a playlist item. function Move(playlistid as string, itemid as string, newindex as integer) - req = APIRequest(Substitute("/playlists/{0}/items/{1}/move/{2}", playlistid, itemid, newindex)) + req = APIRequest(Substitute("/playlists/{0}/items/{1}/move/{2}", playlistid, itemid, newindex.ToStr())) return postVoid(req) end function end namespace @@ -2099,7 +2099,7 @@ namespace api ' Gets an HLS subtitle playlist. function GetHLSSubtitlePlaylistURL(id as string, streamindex as integer, mediasourceid as string, params = {} as object) - return buildURL(Substitute("/videos/{0}/{1}/subtitles/{2}/subtitles.m3u8", id, streamindex, mediasourceid), params) + return buildURL(Substitute("/videos/{0}/{1}/subtitles/{2}/subtitles.m3u8", id, streamindex.ToStr(), mediasourceid), params) end function ' Upload an external subtitle file. @@ -2115,13 +2115,13 @@ namespace api ' Gets subtitles in a specified format. function GetSubtitlesWithStartPosition(routeitemid as string, routemediasourceid as string, routeindex as integer, routestartpositionticks as integer, routeformat as string, params = {} as object) ' We maxed out params for substitute() so we must manually add the routeformat value - return buildURL(Substitute("/videos/{0}/{1}/subtitles/{2}/{3}/stream." + routeformat, routeitemid, routemediasourceid, routeindex, routestartpositionticks), params) + return buildURL(Substitute("/videos/{0}/{1}/subtitles/{2}/{3}/stream." + routeformat, routeitemid, routemediasourceid, routeindex.ToStr(), routestartpositionticks.ToStr()), params) end function ' Gets subtitles in a specified format. function GetSubtitles(routeitemid as string, routemediasourceid as string, routeindex as integer, routestartpositionticks as integer, routeformat as string, params = {} as object) ' We maxed out params for substitute() so we must manually add the routeformat value - return buildURL(Substitute("/videos/{0}/{1}/subtitles/{2}/{3}/stream." + routeformat, routeitemid, routemediasourceid, routeindex, routestartpositionticks), params) + return buildURL(Substitute("/videos/{0}/{1}/subtitles/{2}/{3}/stream." + routeformat, routeitemid, routemediasourceid, routeindex.ToStr(), routestartpositionticks.ToStr()), params) end function end namespace From 2b732985fc922f1df5a4e5c8cd30b5efd70d65ea Mon Sep 17 00:00:00 2001 From: Bronley Plumb Date: Sat, 28 Sep 2024 00:30:39 -0400 Subject: [PATCH 042/141] Fix incorrect data type being passed to `OverviewDialog.Overview` --- components/music/AlbumView.bs | 2 +- components/music/ArtistView.bs | 2 +- components/music/PlaylistView.bs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/music/AlbumView.bs b/components/music/AlbumView.bs index 57af3274..67436da9 100644 --- a/components/music/AlbumView.bs +++ b/components/music/AlbumView.bs @@ -136,7 +136,7 @@ sub createFullDscrDlg() dlg.Title = tr("Press 'Back' to Close") dlg.width = 1290 dlg.palette = m.dlgPalette - dlg.overview = [m.dscr.text] + dlg.overview = m.dscr.text m.fullDscrDlg = dlg m.top.getScene().dialog = dlg border = createObject("roSGNode", "Poster") diff --git a/components/music/ArtistView.bs b/components/music/ArtistView.bs index 995b803b..3ad015e8 100644 --- a/components/music/ArtistView.bs +++ b/components/music/ArtistView.bs @@ -223,7 +223,7 @@ sub createFullDscrDlg() dlg.Title = tr("Press 'Back' to Close") dlg.width = 1290 dlg.palette = m.dlgPalette - dlg.overview = [m.dscr.text] + dlg.overview = m.dscr.text m.fullDscrDlg = dlg m.top.getScene().dialog = dlg border = createObject("roSGNode", "Poster") diff --git a/components/music/PlaylistView.bs b/components/music/PlaylistView.bs index 23863875..3d658804 100644 --- a/components/music/PlaylistView.bs +++ b/components/music/PlaylistView.bs @@ -127,7 +127,7 @@ sub createFullDscrDlg() dlg.Title = tr("Press 'Back' to Close") dlg.width = 1290 dlg.palette = m.dlgPalette - dlg.overview = [m.dscr.text] + dlg.overview = m.dscr.text m.fullDscrDlg = dlg m.top.getScene().dialog = dlg border = createObject("roSGNode", "Poster") From 7b581ad430ceb018d2091d29d3679d9851068c20 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Sat, 28 Sep 2024 13:22:15 +0000 Subject: [PATCH 043/141] Update API docs --- docs/api/components_music_AlbumView.bs.html | 2 +- docs/api/components_music_ArtistView.bs.html | 2 +- docs/api/components_music_PlaylistView.bs.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/api/components_music_AlbumView.bs.html b/docs/api/components_music_AlbumView.bs.html index 175d46d2..2a236cfb 100644 --- a/docs/api/components_music_AlbumView.bs.html +++ b/docs/api/components_music_AlbumView.bs.html @@ -138,7 +138,7 @@ sub createFullDscrDlg() dlg.Title = tr("Press 'Back' to Close") dlg.width = 1290 dlg.palette = m.dlgPalette - dlg.overview = [m.dscr.text] + dlg.overview = m.dscr.text m.fullDscrDlg = dlg m.top.getScene().dialog = dlg border = createObject("roSGNode", "Poster") diff --git a/docs/api/components_music_ArtistView.bs.html b/docs/api/components_music_ArtistView.bs.html index f50c47b8..d20929d3 100644 --- a/docs/api/components_music_ArtistView.bs.html +++ b/docs/api/components_music_ArtistView.bs.html @@ -225,7 +225,7 @@ sub createFullDscrDlg() dlg.Title = tr("Press 'Back' to Close") dlg.width = 1290 dlg.palette = m.dlgPalette - dlg.overview = [m.dscr.text] + dlg.overview = m.dscr.text m.fullDscrDlg = dlg m.top.getScene().dialog = dlg border = createObject("roSGNode", "Poster") diff --git a/docs/api/components_music_PlaylistView.bs.html b/docs/api/components_music_PlaylistView.bs.html index e34620b7..db055411 100644 --- a/docs/api/components_music_PlaylistView.bs.html +++ b/docs/api/components_music_PlaylistView.bs.html @@ -129,7 +129,7 @@ sub createFullDscrDlg() dlg.Title = tr("Press 'Back' to Close") dlg.width = 1290 dlg.palette = m.dlgPalette - dlg.overview = [m.dscr.text] + dlg.overview = m.dscr.text m.fullDscrDlg = dlg m.top.getScene().dialog = dlg border = createObject("roSGNode", "Poster") From 1cb0eb9e1b9cfd24588cde92afac990f60d8bb47 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 28 Sep 2024 13:20:27 -0400 Subject: [PATCH 044/141] report "finished" video state to server --- components/PlaystateTask.bs | 2 +- components/video/VideoPlayerView.bs | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/components/PlaystateTask.bs b/components/PlaystateTask.bs index fc06ae3e..556ab52f 100644 --- a/components/PlaystateTask.bs +++ b/components/PlaystateTask.bs @@ -8,7 +8,7 @@ end sub sub PlaystateUpdate() if m.top.status = "start" url = "Sessions/Playing" - else if m.top.status = "stop" + else if m.top.status = "stop" or m.top.status = "finished" url = "Sessions/Playing/Stopped" else if m.top.status = "update" url = "Sessions/Playing/Progress" diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index 56f230ee..a9b708d7 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -1,7 +1,9 @@ import "pkg:/source/utils/misc.bs" import "pkg:/source/utils/config.bs" +import "pkg:/source/roku_modules/log/LogMixin.brs" sub init() + m.log = log.Logger("VideoPlayerView") ' Hide the overhang on init to prevent showing 2 clocks m.top.getScene().findNode("overhang").visible = false m.currentItem = m.global.queueManager.callFunc("getCurrentItem") @@ -600,6 +602,7 @@ end sub ' ' When Video Player state changes sub onState(msg) + m.log.debug("start onState()", m.top.state) if isValid(m.captionTask) m.captionTask.playerState = m.top.state + m.top.globalCaptionMode end if @@ -649,16 +652,22 @@ sub onState(msg) m.playbackTimer.control = "stop" ReportPlayback("stop") m.playReported = false + else if m.top.state = "finished" + m.playbackTimer.control = "stop" + ReportPlayback("finished") + m.top.control = "stop" + m.top.backPressed = true ' exit video player end if - + m.log.debug("end onState()", m.top.state) end sub ' ' Report playback to server sub ReportPlayback(state = "update" as string) - if m.top.position = invalid then return + m.log.debug("start ReportPlayback()", state, int(m.top.position)) + params = { "ItemId": m.top.id, "PlaySessionId": m.top.PlaySessionId, @@ -677,6 +686,8 @@ sub ReportPlayback(state = "update" as string) playstateTask = m.global.playstateTask playstateTask.setFields({ status: state, params: params }) playstateTask.control = "RUN" + + m.log.debug("end ReportPlayback()", state, int(m.top.position)) end sub ' From 16eb0a601ad7267f1c2734c236c66639fae83acc Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 28 Sep 2024 14:56:26 -0400 Subject: [PATCH 045/141] change api endpoint --- components/PlaystateTask.bs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/PlaystateTask.bs b/components/PlaystateTask.bs index 556ab52f..ff8d8f5e 100644 --- a/components/PlaystateTask.bs +++ b/components/PlaystateTask.bs @@ -8,9 +8,9 @@ end sub sub PlaystateUpdate() if m.top.status = "start" url = "Sessions/Playing" - else if m.top.status = "stop" or m.top.status = "finished" + else if m.top.status = "stop" url = "Sessions/Playing/Stopped" - else if m.top.status = "update" + else if m.top.status = "update" or m.top.status = "finished" url = "Sessions/Playing/Progress" else ' Unknown State From ecba5333acd01ace88f1ef2148b0f12c0cbe2c80 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 28 Sep 2024 14:57:07 -0400 Subject: [PATCH 046/141] don't manually stop and exit player when state = finished --- components/video/VideoPlayerView.bs | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index a9b708d7..c3588448 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -655,8 +655,6 @@ sub onState(msg) else if m.top.state = "finished" m.playbackTimer.control = "stop" ReportPlayback("finished") - m.top.control = "stop" - m.top.backPressed = true ' exit video player end if m.log.debug("end onState()", m.top.state) end sub From b6a65e63ef3e457b026b7c01984c1d5a888b303a Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 28 Sep 2024 15:34:24 -0400 Subject: [PATCH 047/141] update server when starting in buffered state --- components/video/VideoPlayerView.bs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index c3588448..b3ebc0f2 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -611,11 +611,18 @@ sub onState(msg) m.osd.playbackState = m.top.state ' When buffering, start timer to monitor buffering process - if m.top.state = "buffering" and m.bufferCheckTimer <> invalid + if m.top.state = "buffering" + ' start buffer timer + if isValid(m.bufferCheckTimer) + m.bufferCheckTimer.control = "start" + m.bufferCheckTimer.ObserveField("fire", "bufferCheck") + end if - ' start timer - m.bufferCheckTimer.control = "start" - m.bufferCheckTimer.ObserveField("fire", "bufferCheck") + ' update server if needed + if not m.playReported + m.playReported = true + ReportPlayback("start") + end if else if m.top.state = "error" if not m.playReported and m.top.transcodeAvailable m.top.retryWithTranscoding = true ' If playback was not reported, retry with transcoding From 4fd7d42039cea05e89eec7cf90a0cf1ab5cb575d Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 28 Sep 2024 17:08:39 -0400 Subject: [PATCH 048/141] add debugging for video errors --- components/video/VideoPlayerView.bs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index b3ebc0f2..53a2cf11 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -624,6 +624,10 @@ sub onState(msg) ReportPlayback("start") end if else if m.top.state = "error" + m.log.error(m.top.errorCode, m.top.errorMsg, m.top.errorStr, m.top.errorCode) + + print m.top.errorInfo + if not m.playReported and m.top.transcodeAvailable m.top.retryWithTranscoding = true ' If playback was not reported, retry with transcoding else From 5e35ffa49f6b2fb8e04d878f9c807c1fec4b3185 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 28 Sep 2024 17:12:26 -0400 Subject: [PATCH 049/141] force exit from video player when finished to set TV back to SDR --- components/video/VideoPlayerView.bs | 1 + 1 file changed, 1 insertion(+) diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index 53a2cf11..bf6026db 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -666,6 +666,7 @@ sub onState(msg) else if m.top.state = "finished" m.playbackTimer.control = "stop" ReportPlayback("finished") + m.top.backPressed = true ' force exit from video player to set TV back to SDR end if m.log.debug("end onState()", m.top.state) end sub From d23a77e572df8c02fe23c89fe8b3e2f383575c1c Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 28 Sep 2024 19:40:14 -0400 Subject: [PATCH 050/141] fix api endpoint for finished state --- components/PlaystateTask.bs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/PlaystateTask.bs b/components/PlaystateTask.bs index ff8d8f5e..556ab52f 100644 --- a/components/PlaystateTask.bs +++ b/components/PlaystateTask.bs @@ -8,9 +8,9 @@ end sub sub PlaystateUpdate() if m.top.status = "start" url = "Sessions/Playing" - else if m.top.status = "stop" + else if m.top.status = "stop" or m.top.status = "finished" url = "Sessions/Playing/Stopped" - else if m.top.status = "update" or m.top.status = "finished" + else if m.top.status = "update" url = "Sessions/Playing/Progress" else ' Unknown State From c90645777a1785f0dc90a5a53a0ae0f27c7fb341 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sun, 29 Sep 2024 10:57:49 -0400 Subject: [PATCH 051/141] log unhandled state and remove unused var --- components/video/VideoPlayerView.bs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index bf6026db..5850bbd9 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -637,7 +637,6 @@ sub onState(msg) ' Stop playback and exit player m.top.control = "stop" - m.top.backPressed = true else if m.top.state = "playing" ' Check if next episode is available @@ -666,7 +665,8 @@ sub onState(msg) else if m.top.state = "finished" m.playbackTimer.control = "stop" ReportPlayback("finished") - m.top.backPressed = true ' force exit from video player to set TV back to SDR + else + m.log.warning("Unhandled state", m.top.state, m.playReported, m.playFinished) end if m.log.debug("end onState()", m.top.state) end sub @@ -723,7 +723,6 @@ sub bufferCheck(msg) ' Stop playback and exit player m.top.control = "stop" - m.top.backPressed = true end if end if From 3a7882ea8b702aa5a7ca52d4f178606a95fd5689 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Sun, 29 Sep 2024 15:32:36 +0000 Subject: [PATCH 052/141] Update API docs --- docs/api/components_ItemGrid_GridItem.bs.html | 6 +-- docs/api/components_ItemGrid_ItemGrid.bs.html | 42 ++++++++++++++++--- docs/api/components_PlaystateTask.bs.html | 2 +- .../components_video_VideoPlayerView.bs.html | 36 ++++++++++++---- docs/api/data/search.json | 2 +- docs/api/module-ItemGrid.html | 2 +- docs/api/source_api_Items.bs.html | 12 +++++- .../source_utils_deviceCapabilities.bs.html | 21 +++++++++- 8 files changed, 102 insertions(+), 21 deletions(-) diff --git a/docs/api/components_ItemGrid_GridItem.bs.html b/docs/api/components_ItemGrid_GridItem.bs.html index 4e2e3bc2..643d47c7 100644 --- a/docs/api/components_ItemGrid_GridItem.bs.html +++ b/docs/api/components_ItemGrid_GridItem.bs.html @@ -22,9 +22,6 @@ sub init() m.checkmark.width = 90 m.checkmark.height = 60 - m.itemText.translation = [0, m.itemPoster.height + 7] - m.itemText.visible = m.gridTitles = "showalways" - ' Add some padding space when Item Titles are always showing if m.itemText.visible then m.itemText.maxWidth = 250 @@ -40,6 +37,9 @@ sub init() end if end if + m.itemText.translation = [0, m.itemPoster.height + 7] + m.itemText.visible = m.gridTitles = "showalways" + end sub sub itemContentChanged() diff --git a/docs/api/components_ItemGrid_ItemGrid.bs.html b/docs/api/components_ItemGrid_ItemGrid.bs.html index 8ca27056..e5846f98 100644 --- a/docs/api/components_ItemGrid_ItemGrid.bs.html +++ b/docs/api/components_ItemGrid_ItemGrid.bs.html @@ -8,6 +8,7 @@ import "pkg:/source/roku_modules/log/LogMixin.brs" sub init() m.log = log.Logger("ItemGrid") + m.log.debug("start init()") m.options = m.top.findNode("options") m.showItemCount = m.global.session.user.settings["itemgrid.showItemCount"] @@ -72,6 +73,7 @@ sub init() m.resetGrid = m.global.session.user.settings["itemgrid.reset"] m.top.gridTitles = m.global.session.user.settings["itemgrid.gridTitles"] + m.log.debug("end init()") end sub 'Genre Item Selected @@ -81,6 +83,7 @@ end sub 'Load initial set of Data sub loadInitialItems() + m.log.debug("start loadInitialItems()") m.loadItemsTask.control = "stop" startLoadingSpinner() @@ -237,6 +240,7 @@ sub loadInitialItems() startLoadingSpinner(false) m.loadItemsTask.control = "RUN" SetUpOptions() + m.log.debug("end loadInitialItems()") end sub ' Set Movies view, sort, and filter options @@ -447,6 +451,7 @@ end sub 'Handle loaded data, and add to Grid sub ItemDataLoaded(msg) + m.log.debug("start ItemDataLoaded()") itemData = msg.GetData() m.loadItemsTask.unobserveField("content") m.loadItemsTask.content = [] @@ -503,22 +508,28 @@ sub ItemDataLoaded(msg) end if stopLoadingSpinner() + m.log.debug("end ItemDataLoaded()") end sub 'Set Background Image sub SetBackground(backgroundUri as string) - + m.log.debug("start SetBackground()", backgroundUri, m.swapAnimation.state, m.newBackdrop.loadStatus) 'If a new image is being loaded, or transitioned to, store URL to load next - if m.swapAnimation.state <> "stopped" or m.newBackdrop.loadStatus = "loading" - m.queuedBGUri = backgroundUri - return + if not m.top.alphaActive + if m.swapAnimation.state <> "stopped" or m.newBackdrop.loadStatus = "loading" + m.log.debug("caching new background URI") + m.queuedBGUri = backgroundUri + return + end if end if m.newBackdrop.uri = backgroundUri + m.log.debug("end SetBackground()") end sub 'Handle new item being focused sub onItemFocused() + m.log.debug("start onItemFocused()", m.itemGrid.currFocusRow, m.itemGrid.itemFocused) focusedRow = m.itemGrid.currFocusRow @@ -527,7 +538,7 @@ sub onItemFocused() updateTitle() ' If no selected item, set background to parent backdrop - if itemInt = -1 + if itemInt = -1 or focusedRow = -1 return end if @@ -540,6 +551,7 @@ sub onItemFocused() if focusedRow >= m.loadedRows - 5 and m.loadeditems < m.loadItemsTask.totalRecordCount loadMoreData() end if + m.log.debug("end onItemFocused()") end sub 'When Image Loading Status changes @@ -560,6 +572,7 @@ sub swapDone() 'If there is another one to load if m.newBackdrop.uri <> m.queuedBGUri and m.queuedBGUri <> "" + m.log.debug("Loading queued backdrop image", m.queuedBGUri) SetBackground(m.queuedBGUri) m.queuedBGUri = "" end if @@ -568,6 +581,7 @@ end sub 'Load next set of items sub loadMoreData() + m.log.debug("start loadMoreData()") if m.Loading = true then return startLoadingSpinner(false) @@ -575,6 +589,7 @@ sub loadMoreData() m.loadItemsTask.startIndex = m.loadedItems m.loadItemsTask.observeField("content", "ItemDataLoaded") m.loadItemsTask.control = "RUN" + m.log.debug("end loadMoreData()") end sub 'Item Selected @@ -769,6 +784,20 @@ function getItemFocused() return invalid end function +sub alphaActiveChanged() + m.log.debug("start alphaActiveChanged()", m.top.alphaActive) + + if m.top.alphaActive + ' fade into an empty backdrop + m.swapAnimation.state = "stop" + m.queuedBGUri = "" + ' use a 1px image because we can't use the animation to fade into a blank uri string + SetBackground("pkg:/images/1px-262626.png") + end if + + m.log.debug("end alphaActiveChanged()") +end sub + function onKeyEvent(key as string, press as boolean) as boolean if not press then return false @@ -835,11 +864,14 @@ function onKeyEvent(key as string, press as boolean) as boolean return true end if else if key = "left" and topGrp.isinFocusChain() and m.alpha.visible + m.log.debug("Now entering alpha menu") m.top.alphaActive = true topGrp.setFocus(false) m.alphaMenu.setFocus(true) + return true else if key = "right" and m.alpha.isinFocusChain() + m.log.debug("Now leaving alpha menu") m.top.alphaActive = false m.alphaMenu.setFocus(false) topGrp.setFocus(true) diff --git a/docs/api/components_PlaystateTask.bs.html b/docs/api/components_PlaystateTask.bs.html index 82447325..84f288b6 100644 --- a/docs/api/components_PlaystateTask.bs.html +++ b/docs/api/components_PlaystateTask.bs.html @@ -10,7 +10,7 @@ end sub sub PlaystateUpdate() if m.top.status = "start" url = "Sessions/Playing" - else if m.top.status = "stop" + else if m.top.status = "stop" or m.top.status = "finished" url = "Sessions/Playing/Stopped" else if m.top.status = "update" url = "Sessions/Playing/Progress" diff --git a/docs/api/components_video_VideoPlayerView.bs.html b/docs/api/components_video_VideoPlayerView.bs.html index 452a2ef3..f1eb563d 100644 --- a/docs/api/components_video_VideoPlayerView.bs.html +++ b/docs/api/components_video_VideoPlayerView.bs.html @@ -2,8 +2,10 @@
On this page

components_video_VideoPlayerView.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
+import "pkg:/source/roku_modules/log/LogMixin.brs"
 
 sub init()
+    m.log = log.Logger("VideoPlayerView")
     ' Hide the overhang on init to prevent showing 2 clocks
     m.top.getScene().findNode("overhang").visible = false
     m.currentItem = m.global.queueManager.callFunc("getCurrentItem")
@@ -604,6 +606,7 @@ end sub
 '
 ' When Video Player state changes
 sub onState(msg)
+    m.log.debug("start onState()", m.top.state)
     if isValid(m.captionTask)
         m.captionTask.playerState = m.top.state + m.top.globalCaptionMode
     end if
@@ -612,12 +615,23 @@ sub onState(msg)
     m.osd.playbackState = m.top.state
 
     ' When buffering, start timer to monitor buffering process
-    if m.top.state = "buffering" and m.bufferCheckTimer <> invalid
+    if m.top.state = "buffering"
+        ' start buffer timer
+        if isValid(m.bufferCheckTimer)
+            m.bufferCheckTimer.control = "start"
+            m.bufferCheckTimer.ObserveField("fire", "bufferCheck")
+        end if
 
-        ' start timer
-        m.bufferCheckTimer.control = "start"
-        m.bufferCheckTimer.ObserveField("fire", "bufferCheck")
+        ' update server if needed
+        if not m.playReported
+            m.playReported = true
+            ReportPlayback("start")
+        end if
     else if m.top.state = "error"
+        m.log.error(m.top.errorCode, m.top.errorMsg, m.top.errorStr, m.top.errorCode)
+
+        print m.top.errorInfo
+
         if not m.playReported and m.top.transcodeAvailable
             m.top.retryWithTranscoding = true ' If playback was not reported, retry with transcoding
         else
@@ -627,7 +641,6 @@ sub onState(msg)
 
         ' Stop playback and exit player
         m.top.control = "stop"
-        m.top.backPressed = true
     else if m.top.state = "playing"
 
         ' Check if next episode is available
@@ -653,16 +666,22 @@ sub onState(msg)
         m.playbackTimer.control = "stop"
         ReportPlayback("stop")
         m.playReported = false
+    else if m.top.state = "finished"
+        m.playbackTimer.control = "stop"
+        ReportPlayback("finished")
+    else
+        m.log.warning("Unhandled state", m.top.state, m.playReported, m.playFinished)
     end if
-
+    m.log.debug("end onState()", m.top.state)
 end sub
 
 '
 ' Report playback to server
 sub ReportPlayback(state = "update" as string)
-
     if m.top.position = invalid then return
 
+    m.log.debug("start ReportPlayback()", state, int(m.top.position))
+
     params = {
         "ItemId": m.top.id,
         "PlaySessionId": m.top.PlaySessionId,
@@ -681,6 +700,8 @@ sub ReportPlayback(state = "update" as string)
     playstateTask = m.global.playstateTask
     playstateTask.setFields({ status: state, params: params })
     playstateTask.control = "RUN"
+
+    m.log.debug("end ReportPlayback()", state, int(m.top.position))
 end sub
 
 '
@@ -706,7 +727,6 @@ sub bufferCheck(msg)
 
             ' Stop playback and exit player
             m.top.control = "stop"
-            m.top.backPressed = true
         end if
     end if
 
diff --git a/docs/api/data/search.json b/docs/api/data/search.json
index f2ec65cb..9186b9be 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.exitScrubMode","link":"exitScrubMode","description":"

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

"},{"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.moveSeekbarThumb","link":"moveSeekbarThumb","description":"

moveSeekbarThumb: Positions the thumb on the seekbar

"},{"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.processScrubAction","link":"processScrubAction","description":"

processScrubAction: Handles +/- seeking for the audio trickplay bar

"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.resetSeekbarThumb","link":"resetSeekbarThumb","description":"

resetSeekbarThumb: Resets the thumb to the playing position

"},{"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.setSelectedButtonState","link":"setSelectedButtonState","description":"

setSelectedButtonState: Changes the icon state url for the currently selected button

"},{"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.ClockFormat","link":"ClockFormat","description":"

Possible clock formats

"},{"title":"module:Clock.ClockFormat.h12","link":"h12"},{"title":"module:Clock.ClockFormat.h24","link":"h24"},{"title":"module:Clock.format12HourTime","link":"format12HourTime","description":"

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

"},{"title":"module:Clock.format24HourTime","link":"format24HourTime","description":"

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

"},{"title":"module:Clock.formatTimeAsString","link":"formatTimeAsString","description":"

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour 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.initName","link":"initName"},{"title":"module:ExtrasItem.initPosterImg","link":"initPosterImg"},{"title":"module:ExtrasItem.initRole","link":"initRole"},{"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.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook called when the screen is hidden by the screen manager

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

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.initBackdrop","link":"initBackdrop"},{"title":"module:HomeItem.initItemPoster","link":"initItemPoster"},{"title":"module:HomeItem.initItemText","link":"initItemText"},{"title":"module:HomeItem.initItemTextExtra","link":"initItemTextExtra"},{"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.LOADING_WAIT_TIME","link":"LOADING_WAIT_TIME"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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:JFContentItem","link":"JFContentItem"},{"title":"module:JFContentItem.setFields","link":"setFields","description":"

Called whenever m.top.json changes.\nIt is expected that each node that extends JFContentItem will override this function

"},{"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.isLogoVisibleChange","link":"isLogoVisibleChange","description":"

component boolean field isLogoVisibleChange has changed value

"},{"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.SubtitleSelection","link":"SubtitleSelection"},{"title":"module:LoadVideoContentTask.SubtitleSelection.none","link":"none"},{"title":"module:LoadVideoContentTask.SubtitleSelection.notset","link":"notset"},{"title":"module:LoadVideoContentTask.addAudioStreamsToVideo","link":"addAudioStreamsToVideo","description":"

addAudioStreamsToVideo: Add audio stream data to video

"},{"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.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

defaultSubtitleTrack:

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

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook.

"},{"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","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.onMoviePosterSwapAnimationStateChange","link":"onMoviePosterSwapAnimationStateChange","description":"

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

"},{"title":"module:MovieDetails.onNewPosterImageURIChange","link":"onNewPosterImageURIChange","description":"

onNewPosterImageURIChange: Handler for newPosterImageURI param change

"},{"title":"module:MovieDetails.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.LOGO_RIGHT_PADDING","link":"LOGO_RIGHT_PADDING"},{"title":"module:OSD.OPTIONCONTROLS_TOP_PADDING","link":"OPTIONCONTROLS_TOP_PADDING"},{"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.moveOptionControls","link":"moveOptionControls","description":"

moveOptionControls: Moves option controls node based on passed pixel values

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

onButtonSelected: Handler for selection of buttons from the menu.

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

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

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

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

"},{"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.onLogoImageChanged","link":"onLogoImageChanged","description":"

onLogoImageChanged: Handler for changes to m.top.logoImage param.

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

onLogoLoadStatusChanged: Handler for changes to logo image's status.

"},{"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.onSeasonNumberChanged","link":"onSeasonNumberChanged","description":"

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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","description":"

getItemType: Returns the media type of the passed item

"},{"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:RecordingData","link":"RecordingData"},{"title":"module:RecordingData.setFields","link":"setFields"},{"title":"module:RecordingData.setPoster","link":"setPoster"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

"},{"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.handleItemSkipAction","link":"handleItemSkipAction","description":"

handleItemSkipAction: Handles user command to skip items

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

handleShowAudioMenuAction: Handles action to show audio selection 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.onAudioIndexChange","link":"onAudioIndexChange","description":"

Event handler for when audioIndex changes

"},{"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"},{"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.onSelectAudioPressed","link":"onSelectAudioPressed","description":"

onSelectAudioPressed: Display audio selection dialog

"},{"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.processAudioSelection","link":"processAudioSelection","description":"

processAudioSelection: Audio track selection handler

"},{"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"},{"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"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.CLIENT_VERSION_REQUIRING_BASE_MIGRATION","link":"CLIENT_VERSION_REQUIRING_BASE_MIGRATION"},{"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.createLogoPoster","link":"createLogoPoster","description":"

Create and return a Jellyfin logo poster node

"},{"title":"module:misc.createOverhangUser","link":"createOverhangUser"},{"title":"module:misc.createSeperator","link":"createSeperator","description":"

Create and return a rectangle node used as a seperator in the overhang

"},{"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.isAllValid","link":"isAllValid","description":"

Returns whether or not all items in passed array are valid

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

isChainValid: Returns whether or not all the properties in the passed property chain are valid.\nStops evaluating at first found false value

"},{"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.toBoolean","link":"toBoolean","description":"

convert value to boolean and return value

"},{"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: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"},{"title":"quickplay","link":"quickplay"},{"title":"quickplay.album","link":"album","description":"

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

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

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

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

A single audio file.

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

A boxset.\nPlay all items inside.

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

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

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

Quick Play A folder.\nShuffle play all items found

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

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

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

A single music video file.

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

Quick Play A Person.\nShuffle play all videos found

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

A single photo.

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

A photo album.

"},{"title":"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":"quickplay.program","link":"program","description":"

Quick Play A Live Program

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

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

"},{"title":"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":"quickplay.series","link":"series","description":"

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

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

Quick Play A TVChannel

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

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

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

A single video file.

"},{"title":"quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"}]} \ 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.exitScrubMode","link":"exitScrubMode","description":"

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

"},{"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.moveSeekbarThumb","link":"moveSeekbarThumb","description":"

moveSeekbarThumb: Positions the thumb on the seekbar

"},{"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.processScrubAction","link":"processScrubAction","description":"

processScrubAction: Handles +/- seeking for the audio trickplay bar

"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.resetSeekbarThumb","link":"resetSeekbarThumb","description":"

resetSeekbarThumb: Resets the thumb to the playing position

"},{"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.setSelectedButtonState","link":"setSelectedButtonState","description":"

setSelectedButtonState: Changes the icon state url for the currently selected button

"},{"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.ClockFormat","link":"ClockFormat","description":"

Possible clock formats

"},{"title":"module:Clock.ClockFormat.h12","link":"h12"},{"title":"module:Clock.ClockFormat.h24","link":"h24"},{"title":"module:Clock.format12HourTime","link":"format12HourTime","description":"

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

"},{"title":"module:Clock.format24HourTime","link":"format24HourTime","description":"

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

"},{"title":"module:Clock.formatTimeAsString","link":"formatTimeAsString","description":"

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour 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.initName","link":"initName"},{"title":"module:ExtrasItem.initPosterImg","link":"initPosterImg"},{"title":"module:ExtrasItem.initRole","link":"initRole"},{"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.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook called when the screen is hidden by the screen manager

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

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.initBackdrop","link":"initBackdrop"},{"title":"module:HomeItem.initItemPoster","link":"initItemPoster"},{"title":"module:HomeItem.initItemText","link":"initItemText"},{"title":"module:HomeItem.initItemTextExtra","link":"initItemTextExtra"},{"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.LOADING_WAIT_TIME","link":"LOADING_WAIT_TIME"},{"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.alphaActiveChanged","link":"alphaActiveChanged"},{"title":"module:ItemGrid.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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:JFContentItem","link":"JFContentItem"},{"title":"module:JFContentItem.setFields","link":"setFields","description":"

Called whenever m.top.json changes.\nIt is expected that each node that extends JFContentItem will override this function

"},{"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.isLogoVisibleChange","link":"isLogoVisibleChange","description":"

component boolean field isLogoVisibleChange has changed value

"},{"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.SubtitleSelection","link":"SubtitleSelection"},{"title":"module:LoadVideoContentTask.SubtitleSelection.none","link":"none"},{"title":"module:LoadVideoContentTask.SubtitleSelection.notset","link":"notset"},{"title":"module:LoadVideoContentTask.addAudioStreamsToVideo","link":"addAudioStreamsToVideo","description":"

addAudioStreamsToVideo: Add audio stream data to video

"},{"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.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

defaultSubtitleTrack:

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

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook.

"},{"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","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.onMoviePosterSwapAnimationStateChange","link":"onMoviePosterSwapAnimationStateChange","description":"

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

"},{"title":"module:MovieDetails.onNewPosterImageURIChange","link":"onNewPosterImageURIChange","description":"

onNewPosterImageURIChange: Handler for newPosterImageURI param change

"},{"title":"module:MovieDetails.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.LOGO_RIGHT_PADDING","link":"LOGO_RIGHT_PADDING"},{"title":"module:OSD.OPTIONCONTROLS_TOP_PADDING","link":"OPTIONCONTROLS_TOP_PADDING"},{"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.moveOptionControls","link":"moveOptionControls","description":"

moveOptionControls: Moves option controls node based on passed pixel values

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

onButtonSelected: Handler for selection of buttons from the menu.

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

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

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

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

"},{"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.onLogoImageChanged","link":"onLogoImageChanged","description":"

onLogoImageChanged: Handler for changes to m.top.logoImage param.

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

onLogoLoadStatusChanged: Handler for changes to logo image's status.

"},{"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.onSeasonNumberChanged","link":"onSeasonNumberChanged","description":"

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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","description":"

getItemType: Returns the media type of the passed item

"},{"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:RecordingData","link":"RecordingData"},{"title":"module:RecordingData.setFields","link":"setFields"},{"title":"module:RecordingData.setPoster","link":"setPoster"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

"},{"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.handleItemSkipAction","link":"handleItemSkipAction","description":"

handleItemSkipAction: Handles user command to skip items

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

handleShowAudioMenuAction: Handles action to show audio selection 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.onAudioIndexChange","link":"onAudioIndexChange","description":"

Event handler for when audioIndex changes

"},{"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"},{"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.onSelectAudioPressed","link":"onSelectAudioPressed","description":"

onSelectAudioPressed: Display audio selection dialog

"},{"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.processAudioSelection","link":"processAudioSelection","description":"

processAudioSelection: Audio track selection handler

"},{"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"},{"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"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.CLIENT_VERSION_REQUIRING_BASE_MIGRATION","link":"CLIENT_VERSION_REQUIRING_BASE_MIGRATION"},{"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.createLogoPoster","link":"createLogoPoster","description":"

Create and return a Jellyfin logo poster node

"},{"title":"module:misc.createOverhangUser","link":"createOverhangUser"},{"title":"module:misc.createSeperator","link":"createSeperator","description":"

Create and return a rectangle node used as a seperator in the overhang

"},{"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.isAllValid","link":"isAllValid","description":"

Returns whether or not all items in passed array are valid

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

isChainValid: Returns whether or not all the properties in the passed property chain are valid.\nStops evaluating at first found false value

"},{"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.toBoolean","link":"toBoolean","description":"

convert value to boolean and return value

"},{"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: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"},{"title":"quickplay","link":"quickplay"},{"title":"quickplay.album","link":"album","description":"

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

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

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

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

A single audio file.

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

A boxset.\nPlay all items inside.

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

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

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

Quick Play A folder.\nShuffle play all items found

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

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

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

A single music video file.

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

Quick Play A Person.\nShuffle play all videos found

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

A single photo.

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

A photo album.

"},{"title":"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":"quickplay.program","link":"program","description":"

Quick Play A Live Program

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

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

"},{"title":"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":"quickplay.series","link":"series","description":"

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

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

Quick Play A TVChannel

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

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

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

A single video file.

"},{"title":"quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"}]} \ No newline at end of file diff --git a/docs/api/module-ItemGrid.html b/docs/api/module-ItemGrid.html index 2f79659e..97a76a82 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) alphaSelectedChanged() → {void}

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) 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) alphaActiveChanged() → {void}

Returns:
Type: 
void

(static) alphaSelectedChanged() → {void}

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) 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/source_api_Items.bs.html b/docs/api/source_api_Items.bs.html index 4c2525e5..0766a917 100644 --- a/docs/api/source_api_Items.bs.html +++ b/docs/api/source_api_Items.bs.html @@ -28,7 +28,17 @@ function ItemPostPlaybackInfo(id as string, mediaSourceId = "" as string, audioT "SubtitleStreamIndex": subtitleTrackIndex } - if mediaSourceId <> "" then params.MediaSourceId = mediaSourceId + ' Note: Jellyfin v10.9+ now remuxs LiveTV and does not allow DirectPlay anymore. + ' Because of this, we need to tell the server "EnableDirectPlay = false" so that we receive the + ' transcoding URL (which is just a remux and not a transcode; unless it is) + ' The web handles this by disabling EnableDirectPlay on a Retry, but we don't currently Retry a Live + ' TV stream, thus we just turn it off on the first try here. + if mediaSourceId <> "" + params.MediaSourceId = mediaSourceId + else + ' No mediaSourceId? Must be LiveTV... + params.EnableDirectPlay = false + end if if audioTrackIndex > -1 then params.AudioStreamIndex = audioTrackIndex diff --git a/docs/api/source_utils_deviceCapabilities.bs.html b/docs/api/source_utils_deviceCapabilities.bs.html index d07f522a..b415c38d 100644 --- a/docs/api/source_utils_deviceCapabilities.bs.html +++ b/docs/api/source_utils_deviceCapabilities.bs.html @@ -442,7 +442,26 @@ function getCodecProfiles() as object if di.CanDecodeAudio({ Codec: audioCodec, ChCnt: audioChannel }).Result channelSupportFound = true for each codecType in ["VideoAudio", "Audio"] - if audioCodec = "opus" and codecType = "Audio" + if audioCodec = "aac" + codecProfiles.push({ + "Type": codecType, + "Codec": audioCodec, + "Conditions": [ + { + "Condition": "NotEquals", + "Property": "AudioProfile", + "Value": "Main", + "IsRequired": true + }, + { + "Condition": "LessThanEqual", + "Property": "AudioChannels", + "Value": audioChannel, + "IsRequired": true + } + ] + }) + else if audioCodec = "opus" and codecType = "Audio" ' opus audio files not supported by roku else codecProfiles.push({ From 74394b0acf7d8c2e49a17a4f307c0cd615e966a3 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Sun, 29 Sep 2024 15:33:10 +0000 Subject: [PATCH 053/141] Bump build version --- Makefile | 2 +- manifest | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index b22a6d4d..7cc79f17 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # If you want to get_images, you'll also need convert from ImageMagick ########################################################################## -VERSION := 2.1.5 +VERSION := 2.1.6 ## usage diff --git a/manifest b/manifest index 47de6e80..e5d2bc83 100644 --- a/manifest +++ b/manifest @@ -3,7 +3,7 @@ title=Jellyfin major_version=2 minor_version=1 -build_version=5 +build_version=6 ### Main Menu Icons / Channel Poster Artwork diff --git a/package-lock.json b/package-lock.json index 63f2aa01..3f3ee683 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jellyfin-roku", - "version": "2.1.5", + "version": "2.1.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "jellyfin-roku", - "version": "2.1.5", + "version": "2.1.6", "hasInstallScript": true, "license": "GPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 6ff6fed7..b52c2258 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jellyfin-roku", "type": "module", - "version": "2.1.5", + "version": "2.1.6", "description": "Roku app for Jellyfin media server", "dependencies": { "@rokucommunity/bslib": "0.1.1", From 6d55a9e7cacc0b0ad10d2f690948f939889b8b0d Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Mon, 30 Sep 2024 08:55:16 -0400 Subject: [PATCH 054/141] revert uneeded buffer state change --- components/video/VideoPlayerView.bs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index 5850bbd9..4e82d085 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -610,19 +610,12 @@ sub onState(msg) ' Pass video state into OSD m.osd.playbackState = m.top.state - ' When buffering, start timer to monitor buffering process if m.top.state = "buffering" - ' start buffer timer + ' When buffering, start timer to monitor buffering process if isValid(m.bufferCheckTimer) m.bufferCheckTimer.control = "start" m.bufferCheckTimer.ObserveField("fire", "bufferCheck") end if - - ' update server if needed - if not m.playReported - m.playReported = true - ReportPlayback("start") - end if else if m.top.state = "error" m.log.error(m.top.errorCode, m.top.errorMsg, m.top.errorStr, m.top.errorCode) From 9309d93b3eb0575869ed9594872120de2cb39712 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Mon, 30 Sep 2024 11:10:43 -0400 Subject: [PATCH 055/141] set `playback.bitrate.maxlimited` to disabled by default --- settings/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/settings.json b/settings/settings.json index 6564175e..e3b01eee 100644 --- a/settings/settings.json +++ b/settings/settings.json @@ -25,7 +25,7 @@ "description": "Enable or disable the 'Maximum Bitrate' setting.", "settingName": "playback.bitrate.maxlimited", "type": "bool", - "default": "true" + "default": "false" }, { "title": "Maximum Bitrate", From b6f6728e53c54dc6e0739c031010818ab3e06d0a Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 1 Oct 2024 09:08:17 -0400 Subject: [PATCH 056/141] prevent app crash when reloading movie details --- source/Main.bs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/Main.bs b/source/Main.bs index 33c3ba85..5865c7c9 100644 --- a/source/Main.bs +++ b/source/Main.bs @@ -248,11 +248,13 @@ sub Main (args as dynamic) as void currentScene.itemContent.json = api.users.GetItem(m.global.session.user.id, currentScene.itemContent.id) movieMetaData = ItemMetaData(currentScene.itemContent.id) - ' Redraw movie poster - currentScene.newPosterImageURI = movieMetaData.posterURL + if isValid(movieMetaData) + ' Redraw movie poster + currentScene.newPosterImageURI = movieMetaData.posterURL - ' Set updated starting point for the queue item - m.global.queueManager.callFunc("setTopStartingPoint", currentScene.itemContent.json.UserData.PlaybackPositionTicks) + ' Set updated starting point for the queue item + m.global.queueManager.callFunc("setTopStartingPoint", currentScene.itemContent.json.UserData.PlaybackPositionTicks) + end if end if stopLoadingSpinner() From a51a75b8cd67a692b06eeec2ef259f605322c23a Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 1 Oct 2024 09:29:52 -0400 Subject: [PATCH 057/141] validate node refs to prevent crash --- components/home/HomeItem.bs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/components/home/HomeItem.bs b/components/home/HomeItem.bs index 797e253c..6be223fb 100644 --- a/components/home/HomeItem.bs +++ b/components/home/HomeItem.bs @@ -10,12 +10,12 @@ sub init() initItemPoster() m.itemProgress = m.top.findNode("progress") m.itemProgressBackground = m.top.findNode("progressBackground") - m.itemIcon = m.top.findNode("itemIcon") + initItemIcon() initItemTextExtra() m.itemPoster.observeField("loadStatus", "onPosterLoadStatusChanged") m.unplayedCount = m.top.findNode("unplayedCount") m.unplayedEpisodeCount = m.top.findNode("unplayedEpisodeCount") - m.playedIndicator = m.top.findNode("playedIndicator") + initPlayedIndicator() m.showProgressBarAnimation = m.top.findNode("showProgressBar") m.showProgressBarField = m.top.findNode("showProgressBarField") @@ -50,6 +50,14 @@ sub initBackdrop() m.backdrop = m.top.findNode("backdrop") end sub +sub initItemIcon() + m.itemIcon = m.top.findNode("itemIcon") +end sub + +sub initPlayedIndicator() + m.playedIndicator = m.top.findNode("playedIndicator") +end sub + sub itemContentChanged() if isValid(m.unplayedCount) then m.unplayedCount.visible = false itemData = m.top.itemContent @@ -63,6 +71,8 @@ sub itemContentChanged() if not isValid(m.itemText) then initItemText() if not isValid(m.itemTextExtra) then initItemTextExtra() if not isValid(m.backdrop) then initBackdrop() + if not isValid(m.itemIcon) then initItemIcon() + if not isValid(m.playedIndicator) then initPlayedIndicator() m.itemPoster.width = itemData.imageWidth m.itemText.maxWidth = itemData.imageWidth @@ -87,7 +97,9 @@ sub itemContentChanged() if isValid(itemData.json.UserData) and isValid(itemData.json.UserData.UnplayedItemCount) if itemData.json.UserData.UnplayedItemCount > 0 if isValid(m.unplayedCount) then m.unplayedCount.visible = true - m.unplayedEpisodeCount.text = itemData.json.UserData.UnplayedItemCount + if isValid(m.unplayedEpisodeCount) + m.unplayedEpisodeCount.text = itemData.json.UserData.UnplayedItemCount + end if end if end if end if From e2080fb25a1d136e9a6118620d2cabd97aa05f88 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 1 Oct 2024 11:24:49 -0400 Subject: [PATCH 058/141] validate data from api to prevent crash on episode list --- source/Main.bs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/Main.bs b/source/Main.bs index 33c3ba85..042ee656 100644 --- a/source/Main.bs +++ b/source/Main.bs @@ -224,8 +224,12 @@ sub Main (args as dynamic) as void ' Find the object in the scene's data and update its json data for i = 0 to currentScene.objects.Items.count() - 1 if LCase(currentScene.objects.Items[i].id) = LCase(currentEpisode.id) - currentScene.objects.Items[i].json = api.users.GetItem(m.global.session.user.id, currentEpisode.id) - m.global.queueManager.callFunc("setTopStartingPoint", currentScene.objects.Items[i].json.UserData.PlaybackPositionTicks) + + data = api.users.GetItem(m.global.session.user.id, currentEpisode.id) + if isValid(data) + currentScene.objects.Items[i].json = data + m.global.queueManager.callFunc("setTopStartingPoint", data.UserData.PlaybackPositionTicks) + end if exit for end if end for From 4eda9edb0bc2cd2046d892124b194bde9a034a78 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 1 Oct 2024 11:35:09 -0400 Subject: [PATCH 059/141] validate data from api to prevent crash when refreshing movie detail screen --- source/Main.bs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/source/Main.bs b/source/Main.bs index 33c3ba85..c449601f 100644 --- a/source/Main.bs +++ b/source/Main.bs @@ -244,15 +244,19 @@ sub Main (args as dynamic) as void currentScene = m.global.sceneManager.callFunc("getActiveScene") if isValid(currentScene) and isValid(currentScene.itemContent) and isValid(currentScene.itemContent.id) - ' Refresh movie detail data - currentScene.itemContent.json = api.users.GetItem(m.global.session.user.id, currentScene.itemContent.id) - movieMetaData = ItemMetaData(currentScene.itemContent.id) + data = api.users.GetItem(m.global.session.user.id, currentScene.itemContent.id) + if isValid(data) + currentScene.itemContent.json = data + ' Set updated starting point for the queue item + m.global.queueManager.callFunc("setTopStartingPoint", data.UserData.PlaybackPositionTicks) - ' Redraw movie poster - currentScene.newPosterImageURI = movieMetaData.posterURL - - ' Set updated starting point for the queue item - m.global.queueManager.callFunc("setTopStartingPoint", currentScene.itemContent.json.UserData.PlaybackPositionTicks) + ' Refresh movie detail data + movieMetaData = ItemMetaData(currentScene.itemContent.id) + if isValid(movieMetaData) + ' Redraw movie poster + currentScene.newPosterImageURI = movieMetaData.posterURL + end if + end if end if stopLoadingSpinner() From 1088b64357a2e50d87e36894ffb91e75ff7687af Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 1 Oct 2024 12:00:43 -0400 Subject: [PATCH 060/141] validate data to prevent crash --- source/Main.bs | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/source/Main.bs b/source/Main.bs index 33c3ba85..7fe2a0c1 100644 --- a/source/Main.bs +++ b/source/Main.bs @@ -574,36 +574,41 @@ sub Main (args as dynamic) as void ' If a button is selected, we have some determining to do btn = getButton(msg) group = sceneManager.callFunc("getActiveScene") + if isValid(btn) and btn.id = "play-button" + if not isValid(group) then return + ' 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) + if isValid(group.selectedAudioStreamIndex) audio_stream_idx = group.selectedAudioStreamIndex end if - group.itemContent.selectedAudioStreamIndex = audio_stream_idx - group.itemContent.id = group.selectedVideoStreamId + if isValid(group.itemContent) + group.itemContent.selectedAudioStreamIndex = audio_stream_idx + group.itemContent.id = group.selectedVideoStreamId - ' Display playback options dialog - if group.itemContent.json.userdata.PlaybackPositionTicks > 0 - m.global.queueManager.callFunc("hold", group.itemContent) - playbackOptionDialog(group.itemContent.json.userdata.PlaybackPositionTicks, group.itemContent.json) - else - m.global.queueManager.callFunc("clear") - m.global.queueManager.callFunc("push", group.itemContent) - m.global.queueManager.callFunc("playQueue") + ' Display playback options dialog + if group.itemContent.json.userdata.PlaybackPositionTicks > 0 + m.global.queueManager.callFunc("hold", group.itemContent) + playbackOptionDialog(group.itemContent.json.userdata.PlaybackPositionTicks, group.itemContent.json) + else + m.global.queueManager.callFunc("clear") + m.global.queueManager.callFunc("push", group.itemContent) + m.global.queueManager.callFunc("playQueue") + end if end if - if isValid(group) and isValid(group.lastFocus) and isValid(group.lastFocus.id) and group.lastFocus.id = "main_group" + if isValid(group.lastFocus) and isValid(group.lastFocus.id) and group.lastFocus.id = "main_group" buttons = group.findNode("buttons") if isValid(buttons) group.lastFocus = group.findNode("buttons") end if end if - if isValid(group) and isValid(group.lastFocus) + if isValid(group.lastFocus) group.lastFocus.setFocus(true) end if From 4328318ad93b97173d1c3d438b3cf28a3da53371 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 1 Oct 2024 13:58:56 -0400 Subject: [PATCH 061/141] validate api data to prevent crash when hitting shuffle play from tv show details --- components/tvshows/TVShowDetails.bs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/tvshows/TVShowDetails.bs b/components/tvshows/TVShowDetails.bs index 24184590..f7bd9ad3 100644 --- a/components/tvshows/TVShowDetails.bs +++ b/components/tvshows/TVShowDetails.bs @@ -181,8 +181,10 @@ end function sub onShuffleEpisodeDataLoaded() m.getShuffleEpisodesTask.unobserveField("data") - m.global.queueManager.callFunc("set", m.getShuffleEpisodesTask.data.items) - m.global.queueManager.callFunc("playQueue") + if isValid(m.getShuffleEpisodesTask.data) + m.global.queueManager.callFunc("set", m.getShuffleEpisodesTask.data.items) + m.global.queueManager.callFunc("playQueue") + end if end sub function onKeyEvent(key as string, press as boolean) as boolean From 9a3c7a3f854fe6666c4ce1928045499ffa24aa27 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 1 Oct 2024 14:14:08 -0400 Subject: [PATCH 062/141] validate user setting data to prevent crash --- components/home/HomeItem.bs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/home/HomeItem.bs b/components/home/HomeItem.bs index 797e253c..1917c5b0 100644 --- a/components/home/HomeItem.bs +++ b/components/home/HomeItem.bs @@ -83,7 +83,8 @@ sub itemContentChanged() if LCase(itemData.type) = "series" if isValid(localGlobal) and isValid(localGlobal.session) and isValid(localGlobal.session.user) and isValid(localGlobal.session.user.settings) - if not localGlobal.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"] + unwatchedEpisodeCountSetting = localGlobal.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"] + if isValid(unwatchedEpisodeCountSetting) and not unwatchedEpisodeCountSetting if isValid(itemData.json.UserData) and isValid(itemData.json.UserData.UnplayedItemCount) if itemData.json.UserData.UnplayedItemCount > 0 if isValid(m.unplayedCount) then m.unplayedCount.visible = true From 6f708c6a90c0b8f2a81c9d66f9db12b4e6b9120f Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 1 Oct 2024 18:55:50 -0400 Subject: [PATCH 063/141] validate node ref to prevent crash --- components/ItemGrid/GridItemSmall.bs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/components/ItemGrid/GridItemSmall.bs b/components/ItemGrid/GridItemSmall.bs index a197d37b..8211e218 100644 --- a/components/ItemGrid/GridItemSmall.bs +++ b/components/ItemGrid/GridItemSmall.bs @@ -4,7 +4,7 @@ import "pkg:/source/utils/config.bs" sub init() m.itemPoster = m.top.findNode("itemPoster") m.posterText = m.top.findNode("posterText") - m.title = m.top.findNode("title") + initTitle() m.posterText.font.size = 30 m.title.font.size = 25 m.backdrop = m.top.findNode("backdrop") @@ -23,6 +23,10 @@ sub init() end if end sub +sub initTitle() + m.title = m.top.findNode("title") +end sub + sub itemContentChanged() m.backdrop.blendColor = "#101010" @@ -54,6 +58,8 @@ sub itemContentChanged() end sub sub focusChanged() + if not isValid(m.title) then initTitle() + if m.top.itemHasFocus = true m.title.repeatCount = -1 else From e0786e23c15275f163e4fc8a4985d09ef7896138 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 1 Oct 2024 19:37:26 -0400 Subject: [PATCH 064/141] remove unused code causing crash --- components/ItemGrid/MusicArtistGridItem.bs | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/ItemGrid/MusicArtistGridItem.bs b/components/ItemGrid/MusicArtistGridItem.bs index 96af114d..446ae927 100644 --- a/components/ItemGrid/MusicArtistGridItem.bs +++ b/components/ItemGrid/MusicArtistGridItem.bs @@ -18,10 +18,8 @@ sub init() m.itemPoster.loadDisplayMode = m.topParent.imageDisplayMode end if - m.gridTitles = m.global.session.user.settings["itemgrid.gridTitles"] m.posterText.visible = false m.postTextBackground.visible = false - end sub sub itemContentChanged() From 3002ce0a59155cce731d31fdb2e9e508fd1340fb Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 1 Oct 2024 19:48:31 -0400 Subject: [PATCH 065/141] validate we have data from api to prevent crash --- components/data/PersonData.bs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/data/PersonData.bs b/components/data/PersonData.bs index 71745b06..48058fb0 100644 --- a/components/data/PersonData.bs +++ b/components/data/PersonData.bs @@ -4,9 +4,12 @@ import "pkg:/source/utils/config.bs" sub setFields() json = m.top.json + m.top.Type = "Person" + + if json = invalid then return + m.top.id = json.id m.top.favorite = json.UserData.isFavorite - m.top.Type = "Person" setPoster() end sub From 4ec187d17b6ab4f9cbdd6ab1ecc2cceed4354743 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Tue, 1 Oct 2024 20:04:59 -0400 Subject: [PATCH 066/141] validate data before sending to isLocalHost() to prevent app crash --- components/ItemGrid/LoadVideoContentTask.bs | 8 ++++++-- source/VideoPlayer.bs | 10 +++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/components/ItemGrid/LoadVideoContentTask.bs b/components/ItemGrid/LoadVideoContentTask.bs index 643df4fe..7a865db1 100644 --- a/components/ItemGrid/LoadVideoContentTask.bs +++ b/components/ItemGrid/LoadVideoContentTask.bs @@ -350,11 +350,15 @@ sub addVideoContentURL(video, mediaSourceId, audio_stream_idx, fully_external) protocol = LCase(m.playbackInfo.MediaSources[0].Protocol) if protocol <> "file" uri = parseUrl(m.playbackInfo.MediaSources[0].Path) - if isLocalhost(uri[2]) + if not isValidAndNotEmpty(uri) then return + + if isValid(uri[2]) and isLocalhost(uri[2]) ' if the domain of the URI is local to the server, ' create a new URI by appending the received path to the server URL ' later we will substitute the users provided URL for this case - video.content.url = buildURL(uri[4]) + if isValid(uri[4]) + video.content.url = buildURL(uri[4]) + end if else fully_external = true video.content.url = m.playbackInfo.MediaSources[0].Path diff --git a/source/VideoPlayer.bs b/source/VideoPlayer.bs index 1c4f7e75..97a93fa6 100644 --- a/source/VideoPlayer.bs +++ b/source/VideoPlayer.bs @@ -263,16 +263,20 @@ sub AddVideoContent(video as object, mediaSourceId as dynamic, audio_stream_idx protocol = LCase(m.playbackInfo.MediaSources[0].Protocol) if protocol <> "file" uri = parseUrl(m.playbackInfo.MediaSources[0].Path) - if isLocalhost(uri[2]) + if not isValidAndNotEmpty(uri) then return + + if isValid(uri[2]) and isLocalhost(uri[2]) ' the domain of the URI is local to the server. ' create a new URI by appending the received path to the server URL ' later we will substitute the users provided URL for this case - video.content.url = buildURL(uri[4]) + if isValid(uri[4]) + video.content.url = buildURL(uri[4]) + end if else fully_external = true video.content.url = m.playbackInfo.MediaSources[0].Path end if - else: + else params.append({ "Static": "true", "Container": video.container, From 6939c1d598a6ea86e7b92c4cbc3d65650293e098 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Thu, 3 Oct 2024 13:58:59 -0400 Subject: [PATCH 067/141] tell server rokus don't support HE-AACv1 --- source/utils/deviceCapabilities.bs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/utils/deviceCapabilities.bs b/source/utils/deviceCapabilities.bs index 05bec80b..746880cb 100644 --- a/source/utils/deviceCapabilities.bs +++ b/source/utils/deviceCapabilities.bs @@ -451,6 +451,12 @@ function getCodecProfiles() as object "Value": "Main", "IsRequired": true }, + { + "Condition": "NotEquals", + "Property": "AudioProfile", + "Value": "HE-AAC", + "IsRequired": true + }, { "Condition": "LessThanEqual", "Property": "AudioChannels", From 20f0c769d0a0efbeb4d6aa593262d2cc64d879bf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Oct 2024 21:17:50 +0000 Subject: [PATCH 068/141] Update dependency rooibos-roku to v5.14.0 --- package-lock.json | 443 +++++++++++++++++++++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 416 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index 99083eb0..eadfb40f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "rimraf": "6.0.1", "roku-deploy": "3.12.1", "roku-log-bsc-plugin": "0.8.1", - "rooibos-roku": "5.13.0", + "rooibos-roku": "5.14.0", "ropm": "0.10.26", "spellchecker-cli": "6.2.0", "undent": "0.1.0" @@ -494,6 +494,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", @@ -556,6 +563,26 @@ "integrity": "sha512-zvSN2Esek1aeLdKDYuntKAYjti9Z2oT4I8bfkLLhIxHlv3dwZ5vvATxOc31820iYm4hQRCwjUgDpwSMFjfTUnw==", "dev": true }, + "node_modules/@types/request": { + "version": "2.48.12", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", + "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", @@ -746,6 +773,16 @@ "node": ">=0.8" } }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1417,6 +1454,13 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.2.tgz", "integrity": "sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw==" }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true, + "license": "MIT" + }, "node_modules/debounce-promise": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz", @@ -1694,6 +1738,15 @@ "safer-buffer": "^2.1.0" } }, + "node_modules/emitter-component": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.2.tgz", + "integrity": "sha512-QdXO3nXOzZB4pAjM0n6ZE+R9/+kPpECA/XSELIcc54NeYVnBqIk+4DFiBgK+8QbV3mdvTG6nedl7dTYgO+5wDw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1721,6 +1774,13 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/eol": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==", + "dev": true, + "license": "MIT" + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1857,6 +1917,26 @@ "node": ">=8" } }, + "node_modules/find": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/find/-/find-0.1.7.tgz", + "integrity": "sha512-jPrupTOe/pO//3a9Ty2o4NqQCp0L46UG+swUnfFtdmtQVN8pEltKpAqR7Nuf6vWn0GBXx5w+R1MyZzqwjEIqdA==", + "dev": true, + "dependencies": { + "traverse-chain": "~0.1.0" + } + }, + "node_modules/find-in-files": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/find-in-files/-/find-in-files-0.5.0.tgz", + "integrity": "sha512-VraTc6HdtdSHmAp0yJpAy20yPttGKzyBWc7b7FPnnsX9TOgmKx0g9xajizpF/iuu4IvNK4TP0SpyBT9zAlwG+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "find": "^0.1.5", + "q": "^1.0.1" + } + }, "node_modules/find-replace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", @@ -1905,6 +1985,21 @@ "node": "*" } }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", @@ -3722,6 +3817,23 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/natural-orderby": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", + "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/net": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", + "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==", + "dev": true, + "license": "MIT" + }, "node_modules/nlcst-affix-emoticon-modifier": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nlcst-affix-emoticon-modifier/-/nlcst-affix-emoticon-modifier-2.1.1.tgz", @@ -4247,6 +4359,31 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/postman-request": { "version": "2.88.1-postman.32", "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.32.tgz", @@ -4341,6 +4478,18 @@ "node": ">=6" } }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, "node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -4538,6 +4687,74 @@ "node": ">= 0.10" } }, + "node_modules/replace-in-file": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.3.5.tgz", + "integrity": "sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "glob": "^7.2.0", + "yargs": "^17.2.1" + }, + "bin": { + "replace-in-file": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/replace-in-file/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/replace-in-file/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/replace-in-file/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace-last": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/replace-last/-/replace-last-1.2.6.tgz", + "integrity": "sha512-Cj+MK38VtNu1S5J73mEZY3ciQb9dJajNq1Q8inP4dn/MhJMjHwoAF3Z3FjspwAEV9pfABl565MQucmrjOkty4g==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4952,6 +5169,95 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/roku-debug": { + "version": "0.21.11", + "resolved": "https://registry.npmjs.org/roku-debug/-/roku-debug-0.21.11.tgz", + "integrity": "sha512-OXFKmU91hefyWc5QKYz7bGYjWYntNo8/tOaPwYwDRQnNSYoXYCPViUjQV4VCpOFp7Xj7VJjJIFKwTK/BmvSAQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rokucommunity/logger": "^0.3.9", + "@types/request": "^2.48.8", + "brighterscript": "^0.67.7", + "dateformat": "^4.6.3", + "debounce": "^1.2.1", + "eol": "^0.9.1", + "eventemitter3": "^4.0.7", + "fast-glob": "^3.2.11", + "find-in-files": "^0.5.0", + "fs-extra": "^10.0.0", + "natural-orderby": "^2.0.3", + "portfinder": "^1.0.32", + "postman-request": "^2.88.1-postman.32", + "replace-in-file": "^6.3.2", + "replace-last": "^1.2.6", + "roku-deploy": "^3.12.1", + "semver": "^7.5.4", + "serialize-error": "^8.1.0", + "smart-buffer": "^4.2.0", + "source-map": "^0.7.4", + "telnet-client": "^1.4.9", + "vscode-debugadapter": "^1.49.0", + "vscode-debugprotocol": "^1.49.0", + "vscode-languageserver": "^6.1.1", + "xml2js": "^0.5.0" + }, + "bin": { + "roku-debug": "dist/cli.js" + } + }, + "node_modules/roku-debug/node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/roku-debug/node_modules/serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/roku-debug/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/roku-debug/node_modules/vscode-languageserver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz", + "integrity": "sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "^3.15.3" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, "node_modules/roku-deploy": { "version": "3.12.1", "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.12.1.tgz", @@ -5043,26 +5349,22 @@ "dev": true }, "node_modules/rooibos-roku": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/rooibos-roku/-/rooibos-roku-5.13.0.tgz", - "integrity": "sha512-tp+hlAtYVnzF3ZMatSmodGl990+pzKg0uwSqM8dyFBNn0Ob5PdUGFRv0oQKg3m7FYCjnglIQxiL97VpiT4rOMg==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/rooibos-roku/-/rooibos-roku-5.14.0.tgz", + "integrity": "sha512-eSAqO5J2IKYn08ZSFji/DGlD/7mX8wYD7/E0HgxQrWIFoxggR8e/o+8ljxnp/udcJ5aATbBgUi8xd89asyVmCQ==", "dev": true, "license": "ISC", "dependencies": { + "roku-debug": "^0.21.10", + "roku-deploy": "^3.12.1", "source-map": "^0.7.3", "undent": "^0.1.0", "vscode-languageserver": "~6.1.1", - "vscode-languageserver-protocol": "~3.15.3" - } - }, - "node_modules/rooibos-roku/node_modules/vscode-jsonrpc": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz", - "integrity": "sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0 || >=10.0.0" + "vscode-languageserver-protocol": "~3.17.5", + "yargs": "^16.2.0" + }, + "bin": { + "rooibos": "dist/cli.js" } }, "node_modules/rooibos-roku/node_modules/vscode-languageserver": { @@ -5078,24 +5380,25 @@ "installServerIntoExtension": "bin/installServerIntoExtension" } }, - "node_modules/rooibos-roku/node_modules/vscode-languageserver-protocol": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz", - "integrity": "sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==", + "node_modules/rooibos-roku/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", "dependencies": { - "vscode-jsonrpc": "^5.0.1", - "vscode-languageserver-types": "3.15.1" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "node_modules/rooibos-roku/node_modules/vscode-languageserver-types": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz", - "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==", - "dev": true, - "license": "MIT" - }, "node_modules/ropm": { "version": "0.10.26", "resolved": "https://registry.npmjs.org/ropm/-/ropm-0.10.26.tgz", @@ -5362,6 +5665,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -5471,6 +5785,16 @@ "node": ">=0.10.0" } }, + "node_modules/stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz", + "integrity": "sha512-gCq3NDI2P35B2n6t76YJuOp7d6cN/C7Rt0577l91wllh0sY9ZBuw9KaSGqH/b0hzn3CWWJbpbW0W0WvQ1H/Q7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emitter-component": "^1.1.1" + } + }, "node_modules/stream-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz", @@ -5619,6 +5943,29 @@ "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", "dev": true }, + "node_modules/telnet-client": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/telnet-client/-/telnet-client-1.4.11.tgz", + "integrity": "sha512-m15pRh7F74ZzWmqjUtOg3SYp8iSnH7xY1lD9hWk8icjuLRSItABPk1vRJFwSM7op6TgZuEXOWOSbiK9nknloSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.4", + "net": "^1.0.2", + "stream": "^0.0.2" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" + } + }, + "node_modules/telnet-client/node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -5668,6 +6015,13 @@ "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", "dev": true }, + "node_modules/traverse-chain": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", + "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==", + "dev": true, + "license": "MIT" + }, "node_modules/trough": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", @@ -6090,6 +6444,39 @@ "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", "dev": true }, + "node_modules/vscode-debugadapter": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.51.0.tgz", + "integrity": "sha512-mObaXD5/FH/z6aL2GDuyCLbnwLsYRCAJWgFid01vKW9Y5Si8OvINK+Tn+Yl/lRUbetjNuZW3j1euMEz6z8Yzqg==", + "deprecated": "This package has been renamed to @vscode/debugadapter, please update to the new name", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "vscode-debugprotocol": "1.51.0" + } + }, + "node_modules/vscode-debugadapter/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vscode-debugprotocol": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.51.0.tgz", + "integrity": "sha512-dzKWTMMyebIMPF1VYMuuQj7gGFq7guR8AFya0mKacu+ayptJfaRuM0mdHCqiOth4FnRP8mPhEroFPx6Ift8wHA==", + "deprecated": "This package has been renamed to @vscode/debugprotocol, please update to the new name", + "dev": true, + "license": "MIT" + }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", diff --git a/package.json b/package.json index f4c7abe4..51819e4e 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "rimraf": "6.0.1", "roku-deploy": "3.12.1", "roku-log-bsc-plugin": "0.8.1", - "rooibos-roku": "5.13.0", + "rooibos-roku": "5.14.0", "ropm": "0.10.26", "spellchecker-cli": "6.2.0", "undent": "0.1.0" From a5baa30e408e00df8e14bc42a6e8b6458adb90b3 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Thu, 3 Oct 2024 23:23:00 -0400 Subject: [PATCH 069/141] force aac main and he-aacv1 to be transcoded to mp3. save currently playing video meta data to global session --- components/ItemGrid/LoadVideoContentTask.bs | 7 ++--- components/video/VideoPlayerView.bs | 12 ++++++-- source/api/Items.bs | 33 +++++++++++++++++---- source/utils/session.bs | 20 ++++++++++++- 4 files changed, 60 insertions(+), 12 deletions(-) diff --git a/components/ItemGrid/LoadVideoContentTask.bs b/components/ItemGrid/LoadVideoContentTask.bs index 643df4fe..cf1f3256 100644 --- a/components/ItemGrid/LoadVideoContentTask.bs +++ b/components/ItemGrid/LoadVideoContentTask.bs @@ -6,6 +6,7 @@ import "pkg:/source/utils/config.bs" import "pkg:/source/api/Image.bs" import "pkg:/source/api/userauth.bs" import "pkg:/source/utils/deviceCapabilities.bs" +import "pkg:/source/utils/session.bs" enum SubtitleSelection notset = -2 @@ -71,14 +72,14 @@ end function sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_stream_idx = 1 as integer, forceTranscoding = false as boolean) meta = ItemMetaData(video.id) - subtitle_idx = m.top.selectedSubtitleIndex - if not isValid(meta) video.errorMsg = "Error loading metadata" video.content = invalid return end if + session.video.Update(meta) + subtitle_idx = m.top.selectedSubtitleIndex videotype = LCase(meta.type) ' Check for any Live TV streams or Recordings coming from other places other than the TV Guide @@ -196,12 +197,10 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s } end if - ' 'TODO: allow user selection of subtitle track before playback initiated, for now set to no subtitles video.directPlaySupported = m.playbackInfo.MediaSources[0].SupportsDirectPlay fully_external = false - ' For h264/hevc video, Roku spec states that it supports specfic encoding levels ' The device can decode content with a Higher Encoding level but may play it back with certain ' artifacts. If the user preference is set, and the only reason the server says we need to diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index 4e82d085..553d14b4 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -1,5 +1,6 @@ import "pkg:/source/utils/misc.bs" import "pkg:/source/utils/config.bs" +import "pkg:/source/utils/session.bs" import "pkg:/source/roku_modules/log/LogMixin.brs" sub init() @@ -102,6 +103,7 @@ sub handleItemSkipAction(action as string) ' If there is something next in the queue, play it if m.global.queueManager.callFunc("getPosition") < m.global.queueManager.callFunc("getCount") - 1 m.top.control = "stop" + session.video.Delete() m.global.sceneManager.callFunc("clearPreviousScene") m.global.queueManager.callFunc("moveForward") m.global.queueManager.callFunc("playQueue") @@ -114,6 +116,7 @@ sub handleItemSkipAction(action as string) ' If there is something previous in the queue, play it if m.global.queueManager.callFunc("getPosition") > 0 m.top.control = "stop" + session.video.Delete() m.global.sceneManager.callFunc("clearPreviousScene") m.global.queueManager.callFunc("moveBack") m.global.queueManager.callFunc("playQueue") @@ -626,10 +629,10 @@ sub onState(msg) else ' If an error was encountered, Display dialog showPlaybackErrorDialog(tr("Error During Playback")) + session.video.Delete() end if - ' Stop playback and exit player - m.top.control = "stop" + else if m.top.state = "playing" ' Check if next episode is available @@ -655,9 +658,11 @@ sub onState(msg) m.playbackTimer.control = "stop" ReportPlayback("stop") m.playReported = false + session.video.Delete() else if m.top.state = "finished" m.playbackTimer.control = "stop" ReportPlayback("finished") + session.video.Delete() else m.log.warning("Unhandled state", m.top.state, m.playReported, m.playFinished) end if @@ -716,6 +721,7 @@ sub bufferCheck(msg) ' Stop playback and exit player m.top.control = "stop" + session.video.Delete() end if end if @@ -785,6 +791,7 @@ function onKeyEvent(key as string, press as boolean) as boolean if key = "OK" and m.nextEpisodeButton.hasfocus() and not m.top.trickPlayBar.visible m.top.control = "stop" m.top.state = "finished" + session.video.Delete() hideNextEpisodeButton() return true else @@ -859,6 +866,7 @@ function onKeyEvent(key as string, press as boolean) as boolean if key = "back" m.top.control = "stop" + session.video.Delete() end if return false diff --git a/source/api/Items.bs b/source/api/Items.bs index f4262dc2..2a9f6c72 100644 --- a/source/api/Items.bs +++ b/source/api/Items.bs @@ -1,4 +1,5 @@ import "pkg:/source/api/sdk.bs" +import "pkg:/source/utils/misc.bs" function ItemGetPlaybackInfo(id as string, startTimeTicks = 0 as longinteger) params = { @@ -13,9 +14,6 @@ function ItemGetPlaybackInfo(id as string, startTimeTicks = 0 as longinteger) end function function ItemPostPlaybackInfo(id as string, mediaSourceId = "" as string, audioTrackIndex = -1 as integer, subtitleTrackIndex = -1 as integer, startTimeTicks = 0 as longinteger) - body = { - "DeviceProfile": getDeviceProfile() - } params = { "UserId": m.global.session.user.id, "StartTimeTicks": startTimeTicks, @@ -25,6 +23,7 @@ function ItemPostPlaybackInfo(id as string, mediaSourceId = "" as string, audioT "MaxStaticBitrate": "140000000", "SubtitleStreamIndex": subtitleTrackIndex } + deviceProfile = getDeviceProfile() ' Note: Jellyfin v10.9+ now remuxs LiveTV and does not allow DirectPlay anymore. ' Because of this, we need to tell the server "EnableDirectPlay = false" so that we receive the @@ -38,11 +37,35 @@ function ItemPostPlaybackInfo(id as string, mediaSourceId = "" as string, audioT params.EnableDirectPlay = false end if - if audioTrackIndex > -1 then params.AudioStreamIndex = audioTrackIndex + if audioTrackIndex > -1 + params.AudioStreamIndex = audioTrackIndex + + ' force the server to transcode AAC profiles we don't support to MP3 instead of the usual AAC + ' TODO: Remove this after server adds support for transcoding AAC from one profile to another + selectedAudioStream = m.global.session.video.json.MediaStreams[audioTrackIndex] + + if LCase(selectedAudioStream.Codec) = "aac" + if LCase(selectedAudioStream.Profile) = "main" or LCase(selectedAudioStream.Profile) = "he-aac" + for each rule in deviceProfile.TranscodingProfiles + if rule.Container = "ts" or rule.Container = "mp4" + if rule.AudioCodec = "aac" + rule.AudioCodec = "mp3" + else if rule.AudioCodec.Left(4) = "aac," + rule.AudioCodec = mid(rule.AudioCodec, 5) + + if rule.AudioCodec.Left(3) <> "mp3" + rule.AudioCodec = "mp3," + rule.AudioCodec + end if + end if + end if + end for + end if + end if + end if req = APIRequest(Substitute("Items/{0}/PlaybackInfo", id), params) req.SetRequest("POST") - return postJson(req, FormatJson(body)) + return postJson(req, FormatJson({ "DeviceProfile": deviceProfile })) end function ' Search across all libraries diff --git a/source/utils/session.bs b/source/utils/session.bs index 497ff310..c82cc71e 100644 --- a/source/utils/session.bs +++ b/source/utils/session.bs @@ -15,6 +15,9 @@ namespace session Policy: {}, settings: {}, lastRunVersion: invalid + }, + video: { + json: {} } } }) @@ -30,7 +33,7 @@ namespace session ' Update one value from the global session array (m.global.session) sub Update(key as string, value = {} as object) ' validate parameters - if key = "" or (key <> "user" and key <> "server") or value = invalid + if key = "" or (key <> "user" and key <> "server" and key <> "video") or value = invalid print "Error in session.Update(): Invalid parameters provided" return end if @@ -429,4 +432,19 @@ namespace session end sub end namespace end namespace + + namespace video + ' Return the global video session array to it's default state + sub Delete() + session.Update("video", { json: {} }) + end sub + + ' Update the global video session array (m.global.session.video) + sub Update(videoMetaData as object) + if videoMetaData = invalid then return + + session.video.Delete() + session.Update("video", videoMetaData) + end sub + end namespace end namespace From 050bdde4f22efc9669df2214467a0287e6be0752 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Fri, 4 Oct 2024 11:07:56 -0400 Subject: [PATCH 070/141] Use the current video dimensions to set MaxVideoDecodeResolution and update video length and streamformat --- components/ItemGrid/LoadVideoContentTask.bs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/components/ItemGrid/LoadVideoContentTask.bs b/components/ItemGrid/LoadVideoContentTask.bs index bfbfb2c6..2142477c 100644 --- a/components/ItemGrid/LoadVideoContentTask.bs +++ b/components/ItemGrid/LoadVideoContentTask.bs @@ -79,6 +79,16 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s end if session.video.Update(meta) + + if isValid(meta.json.MediaSources[0].RunTimeTicks) + if meta.json.MediaSources[0].RunTimeTicks = 0 + video.length = 0 + else + video.length = meta.json.MediaSources[0].RunTimeTicks / 10000000 + end if + end if + video.MaxVideoDecodeResolution = [meta.json.MediaSources[0].MediaStreams[0].Width, meta.json.MediaSources[0].MediaStreams[0].Height] + subtitle_idx = m.top.selectedSubtitleIndex videotype = LCase(meta.type) @@ -183,6 +193,11 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s end if video.container = getContainerType(meta) + if video.container = "mp4" + video.content.StreamFormat = "mp4" + else if video.container = "mkv" + video.content.StreamFormat = "mkv" + end if if not isValid(m.playbackInfo.MediaSources[0]) m.playbackInfo = meta.json From 42bb0ebecbfae61528ec89b0867a4f47ec08245f Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Fri, 4 Oct 2024 11:27:45 -0400 Subject: [PATCH 071/141] validate data to prevent crash --- source/api/Items.bs | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/source/api/Items.bs b/source/api/Items.bs index 2a9f6c72..c7ba4989 100644 --- a/source/api/Items.bs +++ b/source/api/Items.bs @@ -38,28 +38,31 @@ function ItemPostPlaybackInfo(id as string, mediaSourceId = "" as string, audioT end if if audioTrackIndex > -1 - params.AudioStreamIndex = audioTrackIndex - - ' force the server to transcode AAC profiles we don't support to MP3 instead of the usual AAC - ' TODO: Remove this after server adds support for transcoding AAC from one profile to another selectedAudioStream = m.global.session.video.json.MediaStreams[audioTrackIndex] - if LCase(selectedAudioStream.Codec) = "aac" - if LCase(selectedAudioStream.Profile) = "main" or LCase(selectedAudioStream.Profile) = "he-aac" - for each rule in deviceProfile.TranscodingProfiles - if rule.Container = "ts" or rule.Container = "mp4" - if rule.AudioCodec = "aac" - rule.AudioCodec = "mp3" - else if rule.AudioCodec.Left(4) = "aac," - rule.AudioCodec = mid(rule.AudioCodec, 5) + if selectedAudioStream <> invalid + params.AudioStreamIndex = audioTrackIndex - if rule.AudioCodec.Left(3) <> "mp3" - rule.AudioCodec = "mp3," + rule.AudioCodec + ' force the server to transcode AAC profiles we don't support to MP3 instead of the usual AAC + ' TODO: Remove this after server adds support for transcoding AAC from one profile to another + if LCase(selectedAudioStream.Codec) = "aac" + if LCase(selectedAudioStream.Profile) = "main" or LCase(selectedAudioStream.Profile) = "he-aac" + for each rule in deviceProfile.TranscodingProfiles + if rule.Container = "ts" or rule.Container = "mp4" + if rule.AudioCodec = "aac" + rule.AudioCodec = "mp3" + else if rule.AudioCodec.Left(4) = "aac," + rule.AudioCodec = mid(rule.AudioCodec, 5) + + if rule.AudioCodec.Left(3) <> "mp3" + rule.AudioCodec = "mp3," + rule.AudioCodec + end if end if end if - end if - end for + end for + end if end if + end if end if From b1809c081595205156c870b08eb45b0c4e4a055a Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 5 Oct 2024 11:52:36 -0400 Subject: [PATCH 072/141] use async when fetching captions to prevent crash --- components/captionTask.bs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/components/captionTask.bs b/components/captionTask.bs index 8ea8e9b4..0dc4d99b 100644 --- a/components/captionTask.bs +++ b/components/captionTask.bs @@ -1,7 +1,9 @@ import "pkg:/source/utils/config.bs" import "pkg:/source/api/baserequest.bs" +import "pkg:/source/roku_modules/log/LogMixin.brs" sub init() + m.log = log.Logger("captionTask") m.top.observeField("url", "fetchCaption") m.top.currentCaption = [] m.top.currentPos = 0 @@ -41,17 +43,26 @@ sub setFont() end sub sub fetchCaption() + m.log.debug("start fetchCaption()") m.captionTimer.control = "stop" re = CreateObject("roRegex", "(http.*?\.vtt)", "s") url = re.match(m.top.url)[0] + if url <> invalid + port = createObject("roMessagePort") m.reader.setUrl(url) - text = m.reader.GetToString() - m.captionList = parseVTT(text) - m.captionTimer.control = "start" + m.reader.setMessagePort(port) + if m.reader.AsyncGetToString() + msg = port.waitMessage(0) + if type(msg) = "roUrlEvent" + m.captionList = parseVTT(msg.GetString()) + m.captionTimer.control = "start" + end if + end if else m.captionTimer.control = "stop" end if + m.log.debug("end fetchCaption()", url) end sub function newlabel(txt) From a09e3944a713ab19f8bbfeb7fc7fc830ed1ecdc7 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Sun, 6 Oct 2024 00:51:49 +0000 Subject: [PATCH 073/141] Bump build version --- Makefile | 2 +- manifest | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 7cc79f17..f91b8244 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # If you want to get_images, you'll also need convert from ImageMagick ########################################################################## -VERSION := 2.1.6 +VERSION := 2.1.7 ## usage diff --git a/manifest b/manifest index e5d2bc83..532b80fa 100644 --- a/manifest +++ b/manifest @@ -3,7 +3,7 @@ title=Jellyfin major_version=2 minor_version=1 -build_version=6 +build_version=7 ### Main Menu Icons / Channel Poster Artwork diff --git a/package-lock.json b/package-lock.json index 3f3ee683..8cf4e823 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jellyfin-roku", - "version": "2.1.6", + "version": "2.1.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "jellyfin-roku", - "version": "2.1.6", + "version": "2.1.7", "hasInstallScript": true, "license": "GPL-2.0", "dependencies": { diff --git a/package.json b/package.json index b52c2258..ff420268 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jellyfin-roku", "type": "module", - "version": "2.1.6", + "version": "2.1.7", "description": "Roku app for Jellyfin media server", "dependencies": { "@rokucommunity/bslib": "0.1.1", From 8e4d1553493f82ef9625e040af82c2fb37c8bfde Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Sun, 6 Oct 2024 00:51:57 +0000 Subject: [PATCH 074/141] Update API docs --- .../components_ItemGrid_GridItemSmall.bs.html | 8 ++- ...ents_ItemGrid_LoadVideoContentTask.bs.html | 30 ++++++++-- ...nents_ItemGrid_MusicArtistGridItem.bs.html | 2 - docs/api/components_captionTask.bs.html | 17 +++++- docs/api/components_data_PersonData.bs.html | 5 +- docs/api/components_home_HomeItem.bs.html | 21 +++++-- .../components_tvshows_TVShowDetails.bs.html | 6 +- .../components_video_VideoPlayerView.bs.html | 21 +++---- docs/api/data/search.json | 2 +- docs/api/module-GridItemSmall.html | 2 +- docs/api/module-HomeItem.html | 2 +- docs/api/source_Main.bs.html | 59 +++++++++++-------- docs/api/source_VideoPlayer.bs.html | 10 +++- docs/api/source_api_Items.bs.html | 36 +++++++++-- .../source_utils_deviceCapabilities.bs.html | 6 ++ 15 files changed, 164 insertions(+), 63 deletions(-) diff --git a/docs/api/components_ItemGrid_GridItemSmall.bs.html b/docs/api/components_ItemGrid_GridItemSmall.bs.html index b2e7187a..3900bb8f 100644 --- a/docs/api/components_ItemGrid_GridItemSmall.bs.html +++ b/docs/api/components_ItemGrid_GridItemSmall.bs.html @@ -6,7 +6,7 @@ import "pkg:/source/utils/config.bs" sub init() m.itemPoster = m.top.findNode("itemPoster") m.posterText = m.top.findNode("posterText") - m.title = m.top.findNode("title") + initTitle() m.posterText.font.size = 30 m.title.font.size = 25 m.backdrop = m.top.findNode("backdrop") @@ -25,6 +25,10 @@ sub init() end if end sub +sub initTitle() + m.title = m.top.findNode("title") +end sub + sub itemContentChanged() m.backdrop.blendColor = "#101010" @@ -56,6 +60,8 @@ sub itemContentChanged() end sub sub focusChanged() + if not isValid(m.title) then initTitle() + if m.top.itemHasFocus = true m.title.repeatCount = -1 else diff --git a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html index 5734487d..a69847bd 100644 --- a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html +++ b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html @@ -8,6 +8,7 @@ import "pkg:/source/utils/config.bs" import "pkg:/source/api/Image.bs" import "pkg:/source/api/userauth.bs" import "pkg:/source/utils/deviceCapabilities.bs" +import "pkg:/source/utils/session.bs" enum SubtitleSelection notset = -2 @@ -73,14 +74,24 @@ end function sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_stream_idx = 1 as integer, forceTranscoding = false as boolean) meta = ItemMetaData(video.id) - subtitle_idx = m.top.selectedSubtitleIndex - if not isValid(meta) video.errorMsg = "Error loading metadata" video.content = invalid return end if + session.video.Update(meta) + + if isValid(meta.json.MediaSources[0].RunTimeTicks) + if meta.json.MediaSources[0].RunTimeTicks = 0 + video.length = 0 + else + video.length = meta.json.MediaSources[0].RunTimeTicks / 10000000 + end if + end if + video.MaxVideoDecodeResolution = [meta.json.MediaSources[0].MediaStreams[0].Width, meta.json.MediaSources[0].MediaStreams[0].Height] + + subtitle_idx = m.top.selectedSubtitleIndex videotype = LCase(meta.type) ' Check for any Live TV streams or Recordings coming from other places other than the TV Guide @@ -185,6 +196,11 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s end if video.container = getContainerType(meta) + if video.container = "mp4" + video.content.StreamFormat = "mp4" + else if video.container = "mkv" + video.content.StreamFormat = "mkv" + end if if not isValid(m.playbackInfo.MediaSources[0]) m.playbackInfo = meta.json @@ -199,12 +215,10 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s } end if - ' 'TODO: allow user selection of subtitle track before playback initiated, for now set to no subtitles video.directPlaySupported = m.playbackInfo.MediaSources[0].SupportsDirectPlay fully_external = false - ' For h264/hevc video, Roku spec states that it supports specfic encoding levels ' The device can decode content with a Higher Encoding level but may play it back with certain ' artifacts. If the user preference is set, and the only reason the server says we need to @@ -353,11 +367,15 @@ sub addVideoContentURL(video, mediaSourceId, audio_stream_idx, fully_external) protocol = LCase(m.playbackInfo.MediaSources[0].Protocol) if protocol <> "file" uri = parseUrl(m.playbackInfo.MediaSources[0].Path) - if isLocalhost(uri[2]) + if not isValidAndNotEmpty(uri) then return + + if isValid(uri[2]) and isLocalhost(uri[2]) ' if the domain of the URI is local to the server, ' create a new URI by appending the received path to the server URL ' later we will substitute the users provided URL for this case - video.content.url = buildURL(uri[4]) + if isValid(uri[4]) + video.content.url = buildURL(uri[4]) + end if else fully_external = true video.content.url = m.playbackInfo.MediaSources[0].Path diff --git a/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html b/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html index c9078211..10b9c254 100644 --- a/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html +++ b/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html @@ -20,10 +20,8 @@ sub init() m.itemPoster.loadDisplayMode = m.topParent.imageDisplayMode end if - m.gridTitles = m.global.session.user.settings["itemgrid.gridTitles"] m.posterText.visible = false m.postTextBackground.visible = false - end sub sub itemContentChanged() diff --git a/docs/api/components_captionTask.bs.html b/docs/api/components_captionTask.bs.html index 78b00a9c..3bf7c7af 100644 --- a/docs/api/components_captionTask.bs.html +++ b/docs/api/components_captionTask.bs.html @@ -2,8 +2,10 @@
On this page

components_captionTask.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/baserequest.bs"
+import "pkg:/source/roku_modules/log/LogMixin.brs"
 
 sub init()
+    m.log = log.Logger("captionTask")
     m.top.observeField("url", "fetchCaption")
     m.top.currentCaption = []
     m.top.currentPos = 0
@@ -43,17 +45,26 @@ sub setFont()
 end sub
 
 sub fetchCaption()
+    m.log.debug("start fetchCaption()")
     m.captionTimer.control = "stop"
     re = CreateObject("roRegex", "(http.*?\.vtt)", "s")
     url = re.match(m.top.url)[0]
+
     if url <> invalid
+        port = createObject("roMessagePort")
         m.reader.setUrl(url)
-        text = m.reader.GetToString()
-        m.captionList = parseVTT(text)
-        m.captionTimer.control = "start"
+        m.reader.setMessagePort(port)
+        if m.reader.AsyncGetToString()
+            msg = port.waitMessage(0)
+            if type(msg) = "roUrlEvent"
+                m.captionList = parseVTT(msg.GetString())
+                m.captionTimer.control = "start"
+            end if
+        end if
     else
         m.captionTimer.control = "stop"
     end if
+    m.log.debug("end fetchCaption()", url)
 end sub
 
 function newlabel(txt)
diff --git a/docs/api/components_data_PersonData.bs.html b/docs/api/components_data_PersonData.bs.html
index 718239c3..324506c8 100644
--- a/docs/api/components_data_PersonData.bs.html
+++ b/docs/api/components_data_PersonData.bs.html
@@ -6,9 +6,12 @@ import "pkg:/source/utils/config.bs"
 
 sub setFields()
     json = m.top.json
+    m.top.Type = "Person"
+
+    if json = invalid then return
+
     m.top.id = json.id
     m.top.favorite = json.UserData.isFavorite
-    m.top.Type = "Person"
     setPoster()
 end sub
 
diff --git a/docs/api/components_home_HomeItem.bs.html b/docs/api/components_home_HomeItem.bs.html
index 81297322..29b0cc5d 100644
--- a/docs/api/components_home_HomeItem.bs.html
+++ b/docs/api/components_home_HomeItem.bs.html
@@ -12,12 +12,12 @@ sub init()
     initItemPoster()
     m.itemProgress = m.top.findNode("progress")
     m.itemProgressBackground = m.top.findNode("progressBackground")
-    m.itemIcon = m.top.findNode("itemIcon")
+    initItemIcon()
     initItemTextExtra()
     m.itemPoster.observeField("loadStatus", "onPosterLoadStatusChanged")
     m.unplayedCount = m.top.findNode("unplayedCount")
     m.unplayedEpisodeCount = m.top.findNode("unplayedEpisodeCount")
-    m.playedIndicator = m.top.findNode("playedIndicator")
+    initPlayedIndicator()
 
     m.showProgressBarAnimation = m.top.findNode("showProgressBar")
     m.showProgressBarField = m.top.findNode("showProgressBarField")
@@ -52,6 +52,14 @@ sub initBackdrop()
     m.backdrop = m.top.findNode("backdrop")
 end sub
 
+sub initItemIcon()
+    m.itemIcon = m.top.findNode("itemIcon")
+end sub
+
+sub initPlayedIndicator()
+    m.playedIndicator = m.top.findNode("playedIndicator")
+end sub
+
 sub itemContentChanged()
     if isValid(m.unplayedCount) then m.unplayedCount.visible = false
     itemData = m.top.itemContent
@@ -65,6 +73,8 @@ sub itemContentChanged()
     if not isValid(m.itemText) then initItemText()
     if not isValid(m.itemTextExtra) then initItemTextExtra()
     if not isValid(m.backdrop) then initBackdrop()
+    if not isValid(m.itemIcon) then initItemIcon()
+    if not isValid(m.playedIndicator) then initPlayedIndicator()
 
     m.itemPoster.width = itemData.imageWidth
     m.itemText.maxWidth = itemData.imageWidth
@@ -85,11 +95,14 @@ sub itemContentChanged()
 
         if LCase(itemData.type) = "series"
             if isValid(localGlobal) and isValid(localGlobal.session) and isValid(localGlobal.session.user) and isValid(localGlobal.session.user.settings)
-                if not localGlobal.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"]
+                unwatchedEpisodeCountSetting = localGlobal.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"]
+                if isValid(unwatchedEpisodeCountSetting) and not unwatchedEpisodeCountSetting
                     if isValid(itemData.json.UserData) and isValid(itemData.json.UserData.UnplayedItemCount)
                         if itemData.json.UserData.UnplayedItemCount > 0
                             if isValid(m.unplayedCount) then m.unplayedCount.visible = true
-                            m.unplayedEpisodeCount.text = itemData.json.UserData.UnplayedItemCount
+                            if isValid(m.unplayedEpisodeCount)
+                                m.unplayedEpisodeCount.text = itemData.json.UserData.UnplayedItemCount
+                            end if
                         end if
                     end if
                 end if
diff --git a/docs/api/components_tvshows_TVShowDetails.bs.html b/docs/api/components_tvshows_TVShowDetails.bs.html
index 787afe4c..0a24faa8 100644
--- a/docs/api/components_tvshows_TVShowDetails.bs.html
+++ b/docs/api/components_tvshows_TVShowDetails.bs.html
@@ -183,8 +183,10 @@ end function
 
 sub onShuffleEpisodeDataLoaded()
     m.getShuffleEpisodesTask.unobserveField("data")
-    m.global.queueManager.callFunc("set", m.getShuffleEpisodesTask.data.items)
-    m.global.queueManager.callFunc("playQueue")
+    if isValid(m.getShuffleEpisodesTask.data)
+        m.global.queueManager.callFunc("set", m.getShuffleEpisodesTask.data.items)
+        m.global.queueManager.callFunc("playQueue")
+    end if
 end sub
 
 function onKeyEvent(key as string, press as boolean) as boolean
diff --git a/docs/api/components_video_VideoPlayerView.bs.html b/docs/api/components_video_VideoPlayerView.bs.html
index f1eb563d..aac9affd 100644
--- a/docs/api/components_video_VideoPlayerView.bs.html
+++ b/docs/api/components_video_VideoPlayerView.bs.html
@@ -2,6 +2,7 @@
       
     
On this page

components_video_VideoPlayerView.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
+import "pkg:/source/utils/session.bs"
 import "pkg:/source/roku_modules/log/LogMixin.brs"
 
 sub init()
@@ -104,6 +105,7 @@ sub handleItemSkipAction(action as string)
         ' If there is something next in the queue, play it
         if m.global.queueManager.callFunc("getPosition") < m.global.queueManager.callFunc("getCount") - 1
             m.top.control = "stop"
+            session.video.Delete()
             m.global.sceneManager.callFunc("clearPreviousScene")
             m.global.queueManager.callFunc("moveForward")
             m.global.queueManager.callFunc("playQueue")
@@ -116,6 +118,7 @@ sub handleItemSkipAction(action as string)
         ' If there is something previous in the queue, play it
         if m.global.queueManager.callFunc("getPosition") > 0
             m.top.control = "stop"
+            session.video.Delete()
             m.global.sceneManager.callFunc("clearPreviousScene")
             m.global.queueManager.callFunc("moveBack")
             m.global.queueManager.callFunc("playQueue")
@@ -614,19 +617,12 @@ sub onState(msg)
     ' Pass video state into OSD
     m.osd.playbackState = m.top.state
 
-    ' When buffering, start timer to monitor buffering process
     if m.top.state = "buffering"
-        ' start buffer timer
+        ' When buffering, start timer to monitor buffering process
         if isValid(m.bufferCheckTimer)
             m.bufferCheckTimer.control = "start"
             m.bufferCheckTimer.ObserveField("fire", "bufferCheck")
         end if
-
-        ' update server if needed
-        if not m.playReported
-            m.playReported = true
-            ReportPlayback("start")
-        end if
     else if m.top.state = "error"
         m.log.error(m.top.errorCode, m.top.errorMsg, m.top.errorStr, m.top.errorCode)
 
@@ -637,10 +633,10 @@ sub onState(msg)
         else
             ' If an error was encountered, Display dialog
             showPlaybackErrorDialog(tr("Error During Playback"))
+            session.video.Delete()
         end if
 
-        ' Stop playback and exit player
-        m.top.control = "stop"
+
     else if m.top.state = "playing"
 
         ' Check if next episode is available
@@ -666,9 +662,11 @@ sub onState(msg)
         m.playbackTimer.control = "stop"
         ReportPlayback("stop")
         m.playReported = false
+        session.video.Delete()
     else if m.top.state = "finished"
         m.playbackTimer.control = "stop"
         ReportPlayback("finished")
+        session.video.Delete()
     else
         m.log.warning("Unhandled state", m.top.state, m.playReported, m.playFinished)
     end if
@@ -727,6 +725,7 @@ sub bufferCheck(msg)
 
             ' Stop playback and exit player
             m.top.control = "stop"
+            session.video.Delete()
         end if
     end if
 
@@ -796,6 +795,7 @@ function onKeyEvent(key as string, press as boolean) as boolean
     if key = "OK" and m.nextEpisodeButton.hasfocus() and not m.top.trickPlayBar.visible
         m.top.control = "stop"
         m.top.state = "finished"
+        session.video.Delete()
         hideNextEpisodeButton()
         return true
     else
@@ -870,6 +870,7 @@ function onKeyEvent(key as string, press as boolean) as boolean
 
     if key = "back"
         m.top.control = "stop"
+        session.video.Delete()
     end if
 
     return false
diff --git a/docs/api/data/search.json b/docs/api/data/search.json
index 9186b9be..401b12cc 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.exitScrubMode","link":"exitScrubMode","description":"

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

"},{"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.moveSeekbarThumb","link":"moveSeekbarThumb","description":"

moveSeekbarThumb: Positions the thumb on the seekbar

"},{"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.processScrubAction","link":"processScrubAction","description":"

processScrubAction: Handles +/- seeking for the audio trickplay bar

"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.resetSeekbarThumb","link":"resetSeekbarThumb","description":"

resetSeekbarThumb: Resets the thumb to the playing position

"},{"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.setSelectedButtonState","link":"setSelectedButtonState","description":"

setSelectedButtonState: Changes the icon state url for the currently selected button

"},{"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.ClockFormat","link":"ClockFormat","description":"

Possible clock formats

"},{"title":"module:Clock.ClockFormat.h12","link":"h12"},{"title":"module:Clock.ClockFormat.h24","link":"h24"},{"title":"module:Clock.format12HourTime","link":"format12HourTime","description":"

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

"},{"title":"module:Clock.format24HourTime","link":"format24HourTime","description":"

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

"},{"title":"module:Clock.formatTimeAsString","link":"formatTimeAsString","description":"

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour 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.initName","link":"initName"},{"title":"module:ExtrasItem.initPosterImg","link":"initPosterImg"},{"title":"module:ExtrasItem.initRole","link":"initRole"},{"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.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook called when the screen is hidden by the screen manager

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

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.initBackdrop","link":"initBackdrop"},{"title":"module:HomeItem.initItemPoster","link":"initItemPoster"},{"title":"module:HomeItem.initItemText","link":"initItemText"},{"title":"module:HomeItem.initItemTextExtra","link":"initItemTextExtra"},{"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.LOADING_WAIT_TIME","link":"LOADING_WAIT_TIME"},{"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.alphaActiveChanged","link":"alphaActiveChanged"},{"title":"module:ItemGrid.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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:JFContentItem","link":"JFContentItem"},{"title":"module:JFContentItem.setFields","link":"setFields","description":"

Called whenever m.top.json changes.\nIt is expected that each node that extends JFContentItem will override this function

"},{"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.isLogoVisibleChange","link":"isLogoVisibleChange","description":"

component boolean field isLogoVisibleChange has changed value

"},{"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.SubtitleSelection","link":"SubtitleSelection"},{"title":"module:LoadVideoContentTask.SubtitleSelection.none","link":"none"},{"title":"module:LoadVideoContentTask.SubtitleSelection.notset","link":"notset"},{"title":"module:LoadVideoContentTask.addAudioStreamsToVideo","link":"addAudioStreamsToVideo","description":"

addAudioStreamsToVideo: Add audio stream data to video

"},{"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.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

defaultSubtitleTrack:

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

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook.

"},{"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","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.onMoviePosterSwapAnimationStateChange","link":"onMoviePosterSwapAnimationStateChange","description":"

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

"},{"title":"module:MovieDetails.onNewPosterImageURIChange","link":"onNewPosterImageURIChange","description":"

onNewPosterImageURIChange: Handler for newPosterImageURI param change

"},{"title":"module:MovieDetails.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.LOGO_RIGHT_PADDING","link":"LOGO_RIGHT_PADDING"},{"title":"module:OSD.OPTIONCONTROLS_TOP_PADDING","link":"OPTIONCONTROLS_TOP_PADDING"},{"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.moveOptionControls","link":"moveOptionControls","description":"

moveOptionControls: Moves option controls node based on passed pixel values

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

onButtonSelected: Handler for selection of buttons from the menu.

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

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

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

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

"},{"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.onLogoImageChanged","link":"onLogoImageChanged","description":"

onLogoImageChanged: Handler for changes to m.top.logoImage param.

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

onLogoLoadStatusChanged: Handler for changes to logo image's status.

"},{"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.onSeasonNumberChanged","link":"onSeasonNumberChanged","description":"

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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","description":"

getItemType: Returns the media type of the passed item

"},{"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:RecordingData","link":"RecordingData"},{"title":"module:RecordingData.setFields","link":"setFields"},{"title":"module:RecordingData.setPoster","link":"setPoster"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

"},{"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.handleItemSkipAction","link":"handleItemSkipAction","description":"

handleItemSkipAction: Handles user command to skip items

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

handleShowAudioMenuAction: Handles action to show audio selection 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.onAudioIndexChange","link":"onAudioIndexChange","description":"

Event handler for when audioIndex changes

"},{"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"},{"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.onSelectAudioPressed","link":"onSelectAudioPressed","description":"

onSelectAudioPressed: Display audio selection dialog

"},{"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.processAudioSelection","link":"processAudioSelection","description":"

processAudioSelection: Audio track selection handler

"},{"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"},{"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"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.CLIENT_VERSION_REQUIRING_BASE_MIGRATION","link":"CLIENT_VERSION_REQUIRING_BASE_MIGRATION"},{"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.createLogoPoster","link":"createLogoPoster","description":"

Create and return a Jellyfin logo poster node

"},{"title":"module:misc.createOverhangUser","link":"createOverhangUser"},{"title":"module:misc.createSeperator","link":"createSeperator","description":"

Create and return a rectangle node used as a seperator in the overhang

"},{"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.isAllValid","link":"isAllValid","description":"

Returns whether or not all items in passed array are valid

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

isChainValid: Returns whether or not all the properties in the passed property chain are valid.\nStops evaluating at first found false value

"},{"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.toBoolean","link":"toBoolean","description":"

convert value to boolean and return value

"},{"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: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"},{"title":"quickplay","link":"quickplay"},{"title":"quickplay.album","link":"album","description":"

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

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

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

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

A single audio file.

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

A boxset.\nPlay all items inside.

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

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

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

Quick Play A folder.\nShuffle play all items found

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

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

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

A single music video file.

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

Quick Play A Person.\nShuffle play all videos found

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

A single photo.

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

A photo album.

"},{"title":"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":"quickplay.program","link":"program","description":"

Quick Play A Live Program

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

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

"},{"title":"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":"quickplay.series","link":"series","description":"

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

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

Quick Play A TVChannel

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

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

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

A single video file.

"},{"title":"quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"}]} \ 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.exitScrubMode","link":"exitScrubMode","description":"

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

"},{"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.moveSeekbarThumb","link":"moveSeekbarThumb","description":"

moveSeekbarThumb: Positions the thumb on the seekbar

"},{"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.processScrubAction","link":"processScrubAction","description":"

processScrubAction: Handles +/- seeking for the audio trickplay bar

"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.resetSeekbarThumb","link":"resetSeekbarThumb","description":"

resetSeekbarThumb: Resets the thumb to the playing position

"},{"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.setSelectedButtonState","link":"setSelectedButtonState","description":"

setSelectedButtonState: Changes the icon state url for the currently selected button

"},{"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.ClockFormat","link":"ClockFormat","description":"

Possible clock formats

"},{"title":"module:Clock.ClockFormat.h12","link":"h12"},{"title":"module:Clock.ClockFormat.h24","link":"h24"},{"title":"module:Clock.format12HourTime","link":"format12HourTime","description":"

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

"},{"title":"module:Clock.format24HourTime","link":"format24HourTime","description":"

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

"},{"title":"module:Clock.formatTimeAsString","link":"formatTimeAsString","description":"

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour 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.initName","link":"initName"},{"title":"module:ExtrasItem.initPosterImg","link":"initPosterImg"},{"title":"module:ExtrasItem.initRole","link":"initRole"},{"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.initTitle","link":"initTitle"},{"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.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook called when the screen is hidden by the screen manager

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

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.initBackdrop","link":"initBackdrop"},{"title":"module:HomeItem.initItemIcon","link":"initItemIcon"},{"title":"module:HomeItem.initItemPoster","link":"initItemPoster"},{"title":"module:HomeItem.initItemText","link":"initItemText"},{"title":"module:HomeItem.initItemTextExtra","link":"initItemTextExtra"},{"title":"module:HomeItem.initPlayedIndicator","link":"initPlayedIndicator"},{"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.LOADING_WAIT_TIME","link":"LOADING_WAIT_TIME"},{"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.alphaActiveChanged","link":"alphaActiveChanged"},{"title":"module:ItemGrid.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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:JFContentItem","link":"JFContentItem"},{"title":"module:JFContentItem.setFields","link":"setFields","description":"

Called whenever m.top.json changes.\nIt is expected that each node that extends JFContentItem will override this function

"},{"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.isLogoVisibleChange","link":"isLogoVisibleChange","description":"

component boolean field isLogoVisibleChange has changed value

"},{"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.SubtitleSelection","link":"SubtitleSelection"},{"title":"module:LoadVideoContentTask.SubtitleSelection.none","link":"none"},{"title":"module:LoadVideoContentTask.SubtitleSelection.notset","link":"notset"},{"title":"module:LoadVideoContentTask.addAudioStreamsToVideo","link":"addAudioStreamsToVideo","description":"

addAudioStreamsToVideo: Add audio stream data to video

"},{"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.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

defaultSubtitleTrack:

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

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook.

"},{"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","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.onMoviePosterSwapAnimationStateChange","link":"onMoviePosterSwapAnimationStateChange","description":"

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

"},{"title":"module:MovieDetails.onNewPosterImageURIChange","link":"onNewPosterImageURIChange","description":"

onNewPosterImageURIChange: Handler for newPosterImageURI param change

"},{"title":"module:MovieDetails.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.LOGO_RIGHT_PADDING","link":"LOGO_RIGHT_PADDING"},{"title":"module:OSD.OPTIONCONTROLS_TOP_PADDING","link":"OPTIONCONTROLS_TOP_PADDING"},{"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.moveOptionControls","link":"moveOptionControls","description":"

moveOptionControls: Moves option controls node based on passed pixel values

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

onButtonSelected: Handler for selection of buttons from the menu.

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

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

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

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

"},{"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.onLogoImageChanged","link":"onLogoImageChanged","description":"

onLogoImageChanged: Handler for changes to m.top.logoImage param.

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

onLogoLoadStatusChanged: Handler for changes to logo image's status.

"},{"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.onSeasonNumberChanged","link":"onSeasonNumberChanged","description":"

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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","description":"

getItemType: Returns the media type of the passed item

"},{"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:RecordingData","link":"RecordingData"},{"title":"module:RecordingData.setFields","link":"setFields"},{"title":"module:RecordingData.setPoster","link":"setPoster"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

"},{"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.handleItemSkipAction","link":"handleItemSkipAction","description":"

handleItemSkipAction: Handles user command to skip items

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

handleShowAudioMenuAction: Handles action to show audio selection 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.onAudioIndexChange","link":"onAudioIndexChange","description":"

Event handler for when audioIndex changes

"},{"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"},{"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.onSelectAudioPressed","link":"onSelectAudioPressed","description":"

onSelectAudioPressed: Display audio selection dialog

"},{"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.processAudioSelection","link":"processAudioSelection","description":"

processAudioSelection: Audio track selection handler

"},{"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"},{"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"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.CLIENT_VERSION_REQUIRING_BASE_MIGRATION","link":"CLIENT_VERSION_REQUIRING_BASE_MIGRATION"},{"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.createLogoPoster","link":"createLogoPoster","description":"

Create and return a Jellyfin logo poster node

"},{"title":"module:misc.createOverhangUser","link":"createOverhangUser"},{"title":"module:misc.createSeperator","link":"createSeperator","description":"

Create and return a rectangle node used as a seperator in the overhang

"},{"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.isAllValid","link":"isAllValid","description":"

Returns whether or not all items in passed array are valid

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

isChainValid: Returns whether or not all the properties in the passed property chain are valid.\nStops evaluating at first found false value

"},{"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.toBoolean","link":"toBoolean","description":"

convert value to boolean and return value

"},{"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: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"},{"title":"quickplay","link":"quickplay"},{"title":"quickplay.album","link":"album","description":"

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

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

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

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

A single audio file.

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

A boxset.\nPlay all items inside.

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

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

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

Quick Play A folder.\nShuffle play all items found

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

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

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

A single music video file.

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

Quick Play A Person.\nShuffle play all videos found

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

A single photo.

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

A photo album.

"},{"title":"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":"quickplay.program","link":"program","description":"

Quick Play A Live Program

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

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

"},{"title":"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":"quickplay.series","link":"series","description":"

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

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

Quick Play A TVChannel

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

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

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

A single video file.

"},{"title":"quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"}]} \ No newline at end of file diff --git a/docs/api/module-GridItemSmall.html b/docs/api/module-GridItemSmall.html index 33c91c5f..d3770859 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) initTitle() → {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-HomeItem.html b/docs/api/module-HomeItem.html index 01981b79..7f922212 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) initBackdrop() → {void}

Returns:
Type: 
void

(static) initItemPoster() → {void}

Returns:
Type: 
void

(static) initItemText() → {void}

Returns:
Type: 
void

(static) initItemTextExtra() → {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) initBackdrop() → {void}

Returns:
Type: 
void

(static) initItemIcon() → {void}

Returns:
Type: 
void

(static) initItemPoster() → {void}

Returns:
Type: 
void

(static) initItemText() → {void}

Returns:
Type: 
void

(static) initItemTextExtra() → {void}

Returns:
Type: 
void

(static) initPlayedIndicator() → {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/source_Main.bs.html b/docs/api/source_Main.bs.html index 6f0cc7f9..262592af 100644 --- a/docs/api/source_Main.bs.html +++ b/docs/api/source_Main.bs.html @@ -226,8 +226,12 @@ ' Find the object in the scene's data and update its json data for i = 0 to currentScene.objects.Items.count() - 1 if LCase(currentScene.objects.Items[i].id) = LCase(currentEpisode.id) - currentScene.objects.Items[i].json = api.users.GetItem(m.global.session.user.id, currentEpisode.id) - m.global.queueManager.callFunc("setTopStartingPoint", currentScene.objects.Items[i].json.UserData.PlaybackPositionTicks) + + data = api.users.GetItem(m.global.session.user.id, currentEpisode.id) + if isValid(data) + currentScene.objects.Items[i].json = data + m.global.queueManager.callFunc("setTopStartingPoint", data.UserData.PlaybackPositionTicks) + end if exit for end if end for @@ -246,15 +250,19 @@ currentScene = m.global.sceneManager.callFunc("getActiveScene") if isValid(currentScene) and isValid(currentScene.itemContent) and isValid(currentScene.itemContent.id) - ' Refresh movie detail data - currentScene.itemContent.json = api.users.GetItem(m.global.session.user.id, currentScene.itemContent.id) - movieMetaData = ItemMetaData(currentScene.itemContent.id) + data = api.users.GetItem(m.global.session.user.id, currentScene.itemContent.id) + if isValid(data) + currentScene.itemContent.json = data + ' Set updated starting point for the queue item + m.global.queueManager.callFunc("setTopStartingPoint", data.UserData.PlaybackPositionTicks) - ' Redraw movie poster - currentScene.newPosterImageURI = movieMetaData.posterURL - - ' Set updated starting point for the queue item - m.global.queueManager.callFunc("setTopStartingPoint", currentScene.itemContent.json.UserData.PlaybackPositionTicks) + ' Refresh movie detail data + movieMetaData = ItemMetaData(currentScene.itemContent.id) + if isValid(movieMetaData) + ' Redraw movie poster + currentScene.newPosterImageURI = movieMetaData.posterURL + end if + end if end if stopLoadingSpinner() @@ -579,36 +587,41 @@ ' If a button is selected, we have some determining to do btn = getButton(msg) group = sceneManager.callFunc("getActiveScene") + if isValid(btn) and btn.id = "play-button" + if not isValid(group) then return + ' 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) + if isValid(group.selectedAudioStreamIndex) audio_stream_idx = group.selectedAudioStreamIndex end if - group.itemContent.selectedAudioStreamIndex = audio_stream_idx - group.itemContent.id = group.selectedVideoStreamId + if isValid(group.itemContent) + group.itemContent.selectedAudioStreamIndex = audio_stream_idx + group.itemContent.id = group.selectedVideoStreamId - ' Display playback options dialog - if group.itemContent.json.userdata.PlaybackPositionTicks > 0 - m.global.queueManager.callFunc("hold", group.itemContent) - playbackOptionDialog(group.itemContent.json.userdata.PlaybackPositionTicks, group.itemContent.json) - else - m.global.queueManager.callFunc("clear") - m.global.queueManager.callFunc("push", group.itemContent) - m.global.queueManager.callFunc("playQueue") + ' Display playback options dialog + if group.itemContent.json.userdata.PlaybackPositionTicks > 0 + m.global.queueManager.callFunc("hold", group.itemContent) + playbackOptionDialog(group.itemContent.json.userdata.PlaybackPositionTicks, group.itemContent.json) + else + m.global.queueManager.callFunc("clear") + m.global.queueManager.callFunc("push", group.itemContent) + m.global.queueManager.callFunc("playQueue") + end if end if - if isValid(group) and isValid(group.lastFocus) and isValid(group.lastFocus.id) and group.lastFocus.id = "main_group" + if isValid(group.lastFocus) and isValid(group.lastFocus.id) and group.lastFocus.id = "main_group" buttons = group.findNode("buttons") if isValid(buttons) group.lastFocus = group.findNode("buttons") end if end if - if isValid(group) and isValid(group.lastFocus) + if isValid(group.lastFocus) group.lastFocus.setFocus(true) end if diff --git a/docs/api/source_VideoPlayer.bs.html b/docs/api/source_VideoPlayer.bs.html index aefeca7a..44f7239a 100644 --- a/docs/api/source_VideoPlayer.bs.html +++ b/docs/api/source_VideoPlayer.bs.html @@ -265,16 +265,20 @@ sub AddVideoContent(video as object, mediaSourceId as dynamic, audio_stream_idx protocol = LCase(m.playbackInfo.MediaSources[0].Protocol) if protocol <> "file" uri = parseUrl(m.playbackInfo.MediaSources[0].Path) - if isLocalhost(uri[2]) + if not isValidAndNotEmpty(uri) then return + + if isValid(uri[2]) and isLocalhost(uri[2]) ' the domain of the URI is local to the server. ' create a new URI by appending the received path to the server URL ' later we will substitute the users provided URL for this case - video.content.url = buildURL(uri[4]) + if isValid(uri[4]) + video.content.url = buildURL(uri[4]) + end if else fully_external = true video.content.url = m.playbackInfo.MediaSources[0].Path end if - else: + else params.append({ "Static": "true", "Container": video.container, diff --git a/docs/api/source_api_Items.bs.html b/docs/api/source_api_Items.bs.html index 0766a917..d197ee35 100644 --- a/docs/api/source_api_Items.bs.html +++ b/docs/api/source_api_Items.bs.html @@ -1,6 +1,7 @@ Source: source/api/Items.bs
On this page

source_api_Items.bs

import "pkg:/source/api/sdk.bs"
+import "pkg:/source/utils/misc.bs"
 
 function ItemGetPlaybackInfo(id as string, startTimeTicks = 0 as longinteger)
     params = {
@@ -15,9 +16,6 @@ function ItemGetPlaybackInfo(id as string, startTimeTicks = 0 as longinteger)
 end function
 
 function ItemPostPlaybackInfo(id as string, mediaSourceId = "" as string, audioTrackIndex = -1 as integer, subtitleTrackIndex = -1 as integer, startTimeTicks = 0 as longinteger)
-    body = {
-        "DeviceProfile": getDeviceProfile()
-    }
     params = {
         "UserId": m.global.session.user.id,
         "StartTimeTicks": startTimeTicks,
@@ -27,6 +25,7 @@ function ItemPostPlaybackInfo(id as string, mediaSourceId = "" as string, audioT
         "MaxStaticBitrate": "140000000",
         "SubtitleStreamIndex": subtitleTrackIndex
     }
+    deviceProfile = getDeviceProfile()
 
     ' Note: Jellyfin v10.9+ now remuxs LiveTV and does not allow DirectPlay anymore.
     ' Because of this, we need to tell the server "EnableDirectPlay = false" so that we receive the
@@ -40,11 +39,38 @@ function ItemPostPlaybackInfo(id as string, mediaSourceId = "" as string, audioT
         params.EnableDirectPlay = false
     end if
 
-    if audioTrackIndex > -1 then params.AudioStreamIndex = audioTrackIndex
+    if audioTrackIndex > -1
+        selectedAudioStream = m.global.session.video.json.MediaStreams[audioTrackIndex]
+
+        if selectedAudioStream <> invalid
+            params.AudioStreamIndex = audioTrackIndex
+
+            ' force the server to transcode AAC profiles we don't support to MP3 instead of the usual AAC
+            ' TODO: Remove this after server adds support for transcoding AAC from one profile to another
+            if LCase(selectedAudioStream.Codec) = "aac"
+                if LCase(selectedAudioStream.Profile) = "main" or LCase(selectedAudioStream.Profile) = "he-aac"
+                    for each rule in deviceProfile.TranscodingProfiles
+                        if rule.Container = "ts" or rule.Container = "mp4"
+                            if rule.AudioCodec = "aac"
+                                rule.AudioCodec = "mp3"
+                            else if rule.AudioCodec.Left(4) = "aac,"
+                                rule.AudioCodec = mid(rule.AudioCodec, 5)
+
+                                if rule.AudioCodec.Left(3) <> "mp3"
+                                    rule.AudioCodec = "mp3," + rule.AudioCodec
+                                end if
+                            end if
+                        end if
+                    end for
+                end if
+            end if
+
+        end if
+    end if
 
     req = APIRequest(Substitute("Items/{0}/PlaybackInfo", id), params)
     req.SetRequest("POST")
-    return postJson(req, FormatJson(body))
+    return postJson(req, FormatJson({ "DeviceProfile": deviceProfile }))
 end function
 
 ' Search across all libraries
diff --git a/docs/api/source_utils_deviceCapabilities.bs.html b/docs/api/source_utils_deviceCapabilities.bs.html
index b415c38d..cdf70608 100644
--- a/docs/api/source_utils_deviceCapabilities.bs.html
+++ b/docs/api/source_utils_deviceCapabilities.bs.html
@@ -453,6 +453,12 @@ function getCodecProfiles() as object
                                     "Value": "Main",
                                     "IsRequired": true
                                 },
+                                {
+                                    "Condition": "NotEquals",
+                                    "Property": "AudioProfile",
+                                    "Value": "HE-AAC",
+                                    "IsRequired": true
+                                },
                                 {
                                     "Condition": "LessThanEqual",
                                     "Property": "AudioChannels",

From 50aa0cf12ec8c67035c7cfe1c69c5c5bb0191f60 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 7 Oct 2024 18:08:51 +0000
Subject: [PATCH 075/141] Update actions/checkout digest to eef6144

---
 .github/workflows/build-dev.yml       |  2 +-
 .github/workflows/build-docs.yml      |  2 +-
 .github/workflows/build-prod.yml      |  2 +-
 .github/workflows/bump-version.yml    | 12 ++++++------
 .github/workflows/deploy-api-docs.yml |  2 +-
 .github/workflows/roku-analysis.yml   |  2 +-
 6 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml
index 46f97c29..6d5f0ffc 100644
--- a/.github/workflows/build-dev.yml
+++ b/.github/workflows/build-dev.yml
@@ -10,7 +10,7 @@ jobs:
     if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
       - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4
         with:
           node-version: "lts/*"
diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
index ceee6bfd..9dbb9521 100644
--- a/.github/workflows/build-docs.yml
+++ b/.github/workflows/build-docs.yml
@@ -13,7 +13,7 @@ jobs:
       # Give the default GITHUB_TOKEN write permission to commit and push the changed files back to the repository.
       contents: write
     steps:
-      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
         with:
           ref: ${{ github.head_ref }}
           token: ${{ secrets.JF_BOT_TOKEN }}
diff --git a/.github/workflows/build-prod.yml b/.github/workflows/build-prod.yml
index d482f30d..0545cd21 100644
--- a/.github/workflows/build-prod.yml
+++ b/.github/workflows/build-prod.yml
@@ -12,7 +12,7 @@ jobs:
     if: ${{ github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'release-prep') }}
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
       - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4
         with:
           node-version: "lts/*"
diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml
index 1b64af00..00a5aa9c 100644
--- a/.github/workflows/bump-version.yml
+++ b/.github/workflows/bump-version.yml
@@ -26,7 +26,7 @@ jobs:
     steps:
       # Setup
       - name: Checkout code
-        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
       - name: Install required packages
         uses: awalsh128/cache-apt-pkgs-action@latest
         with:
@@ -50,7 +50,7 @@ jobs:
         run: echo "targetBranch=${{ env.bugfixBranch }}" >> $GITHUB_ENV
       - name: Checkout bugfix branch
         if: github.event.inputs.targetBranch == 'bugfix'
-        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
         with:
           ref: ${{ env.targetBranch }}
       # Save old version again if needed
@@ -101,7 +101,7 @@ jobs:
     steps:
       # Setup
       - name: Checkout code
-        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
       - name: Install jq to update json
         uses: awalsh128/cache-apt-pkgs-action@latest
         with:
@@ -125,7 +125,7 @@ jobs:
         run: echo "targetBranch=${{ env.bugfixBranch }}" >> $GITHUB_ENV
       - name: Checkout bugfix branch
         if: github.event.inputs.targetBranch == 'bugfix'
-        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
         with:
           ref: ${{ env.targetBranch }}
       # Calculate new version
@@ -169,7 +169,7 @@ jobs:
     steps:
       # Setup
       - name: Checkout code
-        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
       - name: Install jq to update json
         uses: awalsh128/cache-apt-pkgs-action@latest
         with:
@@ -193,7 +193,7 @@ jobs:
         run: echo "targetBranch=${{ env.bugfixBranch }}" >> $GITHUB_ENV
       - name: Checkout bugfix branch
         if: github.event.inputs.targetBranch == 'bugfix'
-        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
         with:
           ref: ${{ env.targetBranch }}
       # Calculate new version
diff --git a/.github/workflows/deploy-api-docs.yml b/.github/workflows/deploy-api-docs.yml
index b509a61e..85d24a33 100644
--- a/.github/workflows/deploy-api-docs.yml
+++ b/.github/workflows/deploy-api-docs.yml
@@ -30,7 +30,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout
-        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+        uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
       - name: Setup Pages
         uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5
       - name: Upload artifact
diff --git a/.github/workflows/roku-analysis.yml b/.github/workflows/roku-analysis.yml
index 6027db5a..503bc1c8 100644
--- a/.github/workflows/roku-analysis.yml
+++ b/.github/workflows/roku-analysis.yml
@@ -12,7 +12,7 @@ jobs:
     if: github.repository == 'jellyfin/jellyfin-roku' && github.event_name != 'pull_request' || github.repository == 'jellyfin/jellyfin-roku' && github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
+      - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4
       - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4
         with:
           node-version: "lts/*"

From a3117a7e54f5aee9c69c181e27cd62a0a5bde43f Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 7 Oct 2024 18:08:55 +0000
Subject: [PATCH 076/141] Update actions/upload-artifact digest to 604373d

---
 .github/workflows/build-dev.yml  | 2 +-
 .github/workflows/build-prod.yml | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml
index 46f97c29..8e0d8489 100644
--- a/.github/workflows/build-dev.yml
+++ b/.github/workflows/build-dev.yml
@@ -21,7 +21,7 @@ jobs:
         run: npm run ropm
       - name: Build app
         run: npm run build
-      - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4
+      - uses: actions/upload-artifact@604373da6381bf24206979c74d06a550515601b9 # v4
         with:
           name: Jellyfin-Roku-dev-${{ github.sha }}
           path: ${{ github.workspace }}/build/staging
diff --git a/.github/workflows/build-prod.yml b/.github/workflows/build-prod.yml
index d482f30d..0e3e4cd1 100644
--- a/.github/workflows/build-prod.yml
+++ b/.github/workflows/build-prod.yml
@@ -23,7 +23,7 @@ jobs:
         run: npm run ropm
       - name: Build app for production
         run: npm run build-prod
-      - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4
+      - uses: actions/upload-artifact@604373da6381bf24206979c74d06a550515601b9 # v4
         with:
           name: Jellyfin-Roku-v${{ env.newManVersion }}-${{ github.sha }}
           path: ${{ github.workspace }}/build/staging

From 2f302802754dd14eb3d702c84f3fa124c90b3bd3 Mon Sep 17 00:00:00 2001
From: Jimi 
Date: Tue, 8 Oct 2024 07:22:52 -0600
Subject: [PATCH 077/141] Fix 2.1.6 crash

---
 components/ItemGrid/LoadVideoContentTask.bs | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/components/ItemGrid/LoadVideoContentTask.bs b/components/ItemGrid/LoadVideoContentTask.bs
index 2142477c..fdbddfa6 100644
--- a/components/ItemGrid/LoadVideoContentTask.bs
+++ b/components/ItemGrid/LoadVideoContentTask.bs
@@ -87,7 +87,9 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s
             video.length = meta.json.MediaSources[0].RunTimeTicks / 10000000
         end if
     end if
-    video.MaxVideoDecodeResolution = [meta.json.MediaSources[0].MediaStreams[0].Width, meta.json.MediaSources[0].MediaStreams[0].Height]
+    if isValid(meta.json.MediaSources[0]) and isValid(meta.json.MediaSources[0].MediaStreams[0])
+        video.MaxVideoDecodeResolution = [meta.json.MediaSources[0].MediaStreams[0].Width, meta.json.MediaSources[0].MediaStreams[0].Height]
+    end if
 
     subtitle_idx = m.top.selectedSubtitleIndex
     videotype = LCase(meta.type)

From 50e59d97851afad03181541d1c2af2ee4f27b3df Mon Sep 17 00:00:00 2001
From: jellyfin-bot 
Date: Tue, 8 Oct 2024 14:04:10 +0000
Subject: [PATCH 078/141] Update API docs

---
 docs/api/components_ItemGrid_LoadVideoContentTask.bs.html | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html
index a69847bd..730f9338 100644
--- a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html
+++ b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html
@@ -89,7 +89,9 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s
             video.length = meta.json.MediaSources[0].RunTimeTicks / 10000000
         end if
     end if
-    video.MaxVideoDecodeResolution = [meta.json.MediaSources[0].MediaStreams[0].Width, meta.json.MediaSources[0].MediaStreams[0].Height]
+    if isValid(meta.json.MediaSources[0]) and isValid(meta.json.MediaSources[0].MediaStreams[0])
+        video.MaxVideoDecodeResolution = [meta.json.MediaSources[0].MediaStreams[0].Width, meta.json.MediaSources[0].MediaStreams[0].Height]
+    end if
 
     subtitle_idx = m.top.selectedSubtitleIndex
     videotype = LCase(meta.type)

From 781bf5d8f8aeda27916903862d685c4968d0361d Mon Sep 17 00:00:00 2001
From: Charles Ewert 
Date: Tue, 8 Oct 2024 11:43:35 -0400
Subject: [PATCH 079/141] Merge pull request #1974 from
 cewert/revert-video-StreamFormat

---
 components/ItemGrid/LoadVideoContentTask.bs | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/components/ItemGrid/LoadVideoContentTask.bs b/components/ItemGrid/LoadVideoContentTask.bs
index fdbddfa6..333f995a 100644
--- a/components/ItemGrid/LoadVideoContentTask.bs
+++ b/components/ItemGrid/LoadVideoContentTask.bs
@@ -195,11 +195,6 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s
     end if
 
     video.container = getContainerType(meta)
-    if video.container = "mp4"
-        video.content.StreamFormat = "mp4"
-    else if video.container = "mkv"
-        video.content.StreamFormat = "mkv"
-    end if
 
     if not isValid(m.playbackInfo.MediaSources[0])
         m.playbackInfo = meta.json

From c3afaebf3f7d7faf6d3636b6db4fc8f2cba0c87e Mon Sep 17 00:00:00 2001
From: jellyfin-bot 
Date: Tue, 8 Oct 2024 16:23:40 +0000
Subject: [PATCH 080/141] Bump build version

---
 Makefile          | 2 +-
 manifest          | 2 +-
 package-lock.json | 4 ++--
 package.json      | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/Makefile b/Makefile
index f91b8244..bcc572a3 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 # If you want to get_images, you'll also need convert from ImageMagick
 ##########################################################################
 
-VERSION := 2.1.7
+VERSION := 2.1.8
 
 ## usage
 
diff --git a/manifest b/manifest
index 532b80fa..0486a682 100644
--- a/manifest
+++ b/manifest
@@ -3,7 +3,7 @@
 title=Jellyfin
 major_version=2
 minor_version=1
-build_version=7
+build_version=8
 
 ### Main Menu Icons / Channel Poster Artwork
 
diff --git a/package-lock.json b/package-lock.json
index 8cf4e823..8e69fd21 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "jellyfin-roku",
-  "version": "2.1.7",
+  "version": "2.1.8",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "jellyfin-roku",
-      "version": "2.1.7",
+      "version": "2.1.8",
       "hasInstallScript": true,
       "license": "GPL-2.0",
       "dependencies": {
diff --git a/package.json b/package.json
index ff420268..da1252fd 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "jellyfin-roku",
   "type": "module",
-  "version": "2.1.7",
+  "version": "2.1.8",
   "description": "Roku app for Jellyfin media server",
   "dependencies": {
     "@rokucommunity/bslib": "0.1.1",

From 9086dd867de85d865330f5d0e9f5971b88f1cea6 Mon Sep 17 00:00:00 2001
From: jellyfin-bot 
Date: Tue, 8 Oct 2024 16:23:55 +0000
Subject: [PATCH 081/141] Update API docs

---
 docs/api/components_ItemGrid_LoadVideoContentTask.bs.html | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html
index 730f9338..5cdbd43a 100644
--- a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html
+++ b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html
@@ -198,11 +198,6 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s
     end if
 
     video.container = getContainerType(meta)
-    if video.container = "mp4"
-        video.content.StreamFormat = "mp4"
-    else if video.container = "mkv"
-        video.content.StreamFormat = "mkv"
-    end if
 
     if not isValid(m.playbackInfo.MediaSources[0])
         m.playbackInfo = meta.json

From c9e391bf9b0f090d7ba3b34b1b763c8ef539286f Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 10 Oct 2024 17:24:48 +0000
Subject: [PATCH 082/141] Update actions/upload-artifact digest to b4b15b8

---
 .github/workflows/build-dev.yml  | 2 +-
 .github/workflows/build-prod.yml | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml
index b9395933..3f5bf9a9 100644
--- a/.github/workflows/build-dev.yml
+++ b/.github/workflows/build-dev.yml
@@ -21,7 +21,7 @@ jobs:
         run: npm run ropm
       - name: Build app
         run: npm run build
-      - uses: actions/upload-artifact@604373da6381bf24206979c74d06a550515601b9 # v4
+      - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4
         with:
           name: Jellyfin-Roku-dev-${{ github.sha }}
           path: ${{ github.workspace }}/build/staging
diff --git a/.github/workflows/build-prod.yml b/.github/workflows/build-prod.yml
index 12c0ce40..18c3cfc3 100644
--- a/.github/workflows/build-prod.yml
+++ b/.github/workflows/build-prod.yml
@@ -23,7 +23,7 @@ jobs:
         run: npm run ropm
       - name: Build app for production
         run: npm run build-prod
-      - uses: actions/upload-artifact@604373da6381bf24206979c74d06a550515601b9 # v4
+      - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4
         with:
           name: Jellyfin-Roku-v${{ env.newManVersion }}-${{ github.sha }}
           path: ${{ github.workspace }}/build/staging

From a724f156ec94e2f75e904351f1bb8e17b37c2cd7 Mon Sep 17 00:00:00 2001
From: photonconvergence <116527579+photonconvergence@users.noreply.github.com>
Date: Thu, 10 Oct 2024 15:07:00 -0700
Subject: [PATCH 083/141] resolve merge conflict

---
 locale/en_US/translations.ts | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts
index 410ea54e..50aad734 100644
--- a/locale/en_US/translations.ts
+++ b/locale/en_US/translations.ts
@@ -1321,5 +1321,10 @@
             Use Show Image
             User Setting - Setting option title
         
+        
+            Special
+            Special
+            Special episode of a TV Show
+        
     
 

From 34b0978a7d8756e7860af43295a2c72442ed0458 Mon Sep 17 00:00:00 2001
From: Reynolds 
Date: Fri, 11 Oct 2024 10:28:06 -0400
Subject: [PATCH 084/141] Initial Changes to Support Next-Up Behavior

---
 components/home/HomeRows.bs                   |  1 +
 components/tvshows/TVEpisodeRow.bs            | 17 ++++++++
 components/tvshows/TVEpisodeRow.xml           |  3 ++
 components/tvshows/TVEpisodeRowWithOptions.bs |  6 +++
 .../tvshows/TVEpisodeRowWithOptions.xml       |  3 ++
 components/tvshows/TVEpisodes.bs              |  8 ++++
 components/tvshows/TVEpisodes.xml             |  3 ++
 locale/en_US/translations.ts                  | 27 ++++++++++++-
 settings/settings.json                        | 21 ++++++++++
 source/Main.bs                                | 39 +++++++++++++------
 source/ShowScenes.bs                          | 10 ++++-
 11 files changed, 124 insertions(+), 14 deletions(-)

diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs
index 598a0896..90522eb8 100644
--- a/components/home/HomeRows.bs
+++ b/components/home/HomeRows.bs
@@ -686,6 +686,7 @@ end sub
 sub itemSelected()
     m.selectedRowItem = m.top.rowItemSelected
 
+    m.global.launchSource = "home"
     m.top.selectedItem = m.top.content.getChild(m.top.rowItemSelected[0]).getChild(m.top.rowItemSelected[1])
 
     'Prevent the selected item event from double firing
diff --git a/components/tvshows/TVEpisodeRow.bs b/components/tvshows/TVEpisodeRow.bs
index 5782723f..62cfb143 100644
--- a/components/tvshows/TVEpisodeRow.bs
+++ b/components/tvshows/TVEpisodeRow.bs
@@ -6,11 +6,28 @@ sub init()
 
     m.top.showRowLabel = [false]
 
+    m.top.observeField("selectItemId", "onItemSelected")
+
     updateSize()
 
     m.top.setFocus(true)
 end sub
 
+sub onItemSelected()
+    Id = m.top.selectItemId
+
+    if Id <> invalid and Id <> "" and m.top.objects <> invalid
+        for i = 0 to m.top.objects.items.count() - 1
+            item = m.top.objects.items[i]
+            if item.id = Id
+                m.top.jumpToItem = i
+                return
+            end if
+        end for
+    end if
+end sub
+
+
 sub updateSize()
     m.top.translation = [450, 180]
 
diff --git a/components/tvshows/TVEpisodeRow.xml b/components/tvshows/TVEpisodeRow.xml
index 0e14bc3a..9885529c 100644
--- a/components/tvshows/TVEpisodeRow.xml
+++ b/components/tvshows/TVEpisodeRow.xml
@@ -4,5 +4,8 @@
     
     
     
+    
+
+    
   
 
\ No newline at end of file
diff --git a/components/tvshows/TVEpisodeRowWithOptions.bs b/components/tvshows/TVEpisodeRowWithOptions.bs
index d982d82c..6c68fde7 100644
--- a/components/tvshows/TVEpisodeRowWithOptions.bs
+++ b/components/tvshows/TVEpisodeRowWithOptions.bs
@@ -4,9 +4,15 @@ sub init()
     m.rows = m.top.findNode("tvEpisodeRow")
     m.tvListOptions = m.top.findNode("tvListOptions")
 
+    m.top.observeField("selectItemId", "onItemSelected")
     m.rows.observeField("doneLoading", "rowsDoneLoading")
 end sub
 
+sub onItemSelected()
+    Id = m.top.selectItemId
+    m.rows.selectItemId = Id
+end sub
+
 sub setupRows()
     objects = m.top.objects
     m.rows.objects = objects
diff --git a/components/tvshows/TVEpisodeRowWithOptions.xml b/components/tvshows/TVEpisodeRowWithOptions.xml
index 00872097..6b6c904d 100644
--- a/components/tvshows/TVEpisodeRowWithOptions.xml
+++ b/components/tvshows/TVEpisodeRowWithOptions.xml
@@ -8,5 +8,8 @@
     
     
     
+    
+
+    
   
 
\ No newline at end of file
diff --git a/components/tvshows/TVEpisodes.bs b/components/tvshows/TVEpisodes.bs
index 95b98f02..916a1fca 100644
--- a/components/tvshows/TVEpisodes.bs
+++ b/components/tvshows/TVEpisodes.bs
@@ -6,6 +6,7 @@ import "pkg:/source/api/sdk.bs"
 
 sub init()
     m.top.optionsAvailable = false
+    m.top.observeField("selectItemId", "onItemSelected")
 
     m.rows = m.top.findNode("picker")
     m.poster = m.top.findNode("seasonPoster")
@@ -25,6 +26,11 @@ sub setSeasonLoading()
     m.top.overhangTitle = tr("Loading...")
 end sub
 
+sub onItemSelected()
+    Id = m.top.selectItemId
+    m.rows.selectItemId = Id
+end sub
+
 ' Updates the visibility of the Extras button based on if this season has any extra features
 sub setExtraButtonVisibility()
     if isValid(m.top.extrasObjects) and isValidAndNotEmpty(m.top.extrasObjects.items)
@@ -73,6 +79,7 @@ end function
 ' OnScreenShown: Callback function when view is presented on screen
 '
 sub OnScreenShown()
+
     if m.isFirstRun
         m.isFirstRun = false
         return
@@ -80,6 +87,7 @@ sub OnScreenShown()
 
     m.tvEpisodeRow.setFocus(true)
     m.top.refreshSeasonDetailsData = not m.top.refreshSeasonDetailsData
+
 end sub
 
 ' Handle navigation input from the remote and act on it
diff --git a/components/tvshows/TVEpisodes.xml b/components/tvshows/TVEpisodes.xml
index 1c0cfefc..2213b49d 100644
--- a/components/tvshows/TVEpisodes.xml
+++ b/components/tvshows/TVEpisodes.xml
@@ -19,6 +19,9 @@
     
     
     
+    
+
     
+    
   
 
\ No newline at end of file
diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts
index 410ea54e..99a32962 100644
--- a/locale/en_US/translations.ts
+++ b/locale/en_US/translations.ts
@@ -1321,5 +1321,30 @@
             Use Show Image
             User Setting - Setting option title
         
+        
+            Episode Next Up Behavior
+            Episode Next Up Behavior
+            User Setting - Setting option title
+        
+        
+            What should clicking a Next Up episode do.
+            What should clicking a Next Up episode do.
+            User Setting - Setting description
+        
+        
+            Play Episode Immediately
+            Play Episode Immediately
+            User Setting - Setting option title
+        
+        
+            View Episode Details
+            View Episode Details
+            User Setting - Setting option title
+        
+        
+            View Season Details
+            View Season Details
+            User Setting - Setting option title
+        
     
-
+
\ No newline at end of file
diff --git a/settings/settings.json b/settings/settings.json
index e3b01eee..de50d62e 100644
--- a/settings/settings.json
+++ b/settings/settings.json
@@ -262,6 +262,27 @@
                             }
                         ]
                     },
+                    {
+                        "title": "Episode Next Up Behavior",
+                        "description": "What should clicking a Next Up episode do.",
+                        "settingName": "ui.general.episodenextupbehavior",
+                        "type": "radio",
+                        "default": "play",
+                        "options": [
+                            {
+                                "title": "Play Episode Immediately",
+                                "id": "play"
+                            },
+                            {
+                                "title": "View Episode Details",
+                                "id": "episode"
+                            },
+                            {
+                                "title": "View Season Details",
+                                "id": "season"
+                            }
+                        ]
+                    },
                     {
                         "title": "Hide Clock",
                         "description": "Hide all clocks in Jellyfin. Jellyfin will need to be closed and reopened for changes to take effect.",
diff --git a/source/Main.bs b/source/Main.bs
index 232532e2..3ee6aba1 100644
--- a/source/Main.bs
+++ b/source/Main.bs
@@ -36,7 +36,7 @@ sub Main (args as dynamic) as void
     sceneManager = CreateObject("roSGNode", "SceneManager")
     sceneManager.observeField("dataReturned", m.port)
 
-    m.global.addFields({ app_loaded: false, playstateTask: playstateTask, sceneManager: sceneManager })
+    m.global.addFields({ app_loaded: false, playstateTask: playstateTask, sceneManager: sceneManager, launchSource: "" })
     m.global.addFields({ queueManager: CreateObject("roSGNode", "QueueManager") })
     m.global.addFields({ audioPlayer: CreateObject("roSGNode", "AudioPlayer") })
 
@@ -304,22 +304,39 @@ sub Main (args as dynamic) as void
                         audio_stream_idx = selectedItem.selectedAudioStreamIndex
                     end if
 
+                    launchSource = m.global.launchSource
+                    m.global.launchSource = ""
+
                     selectedItem.selectedAudioStreamIndex = audio_stream_idx
-                    ' Display playback options dialog
-                    if selectedItem.json.userdata.PlaybackPositionTicks > 0
-                        m.global.queueManager.callFunc("hold", selectedItem)
-                        playbackOptionDialog(selectedItem.json.userdata.PlaybackPositionTicks, selectedItem.json)
-                    else
-                        m.global.queueManager.callFunc("clear")
-                        m.global.queueManager.callFunc("push", selectedItem)
-                        m.global.queueManager.callFunc("playQueue")
+
+                    localGlobal = m.global
+
+                    ' we only use this special steering logic from the home screen
+                    if localGlobal.session.user.settings["ui.general.episodenextupbehavior"] = "play" or launchSource <> "home"
+                        ' Display playback options dialog
+                        if selectedItem.json.userdata.PlaybackPositionTicks > 0
+                            m.global.queueManager.callFunc("hold", selectedItem)
+                            playbackOptionDialog(selectedItem.json.userdata.PlaybackPositionTicks, selectedItem.json)
+                        else
+                            m.global.queueManager.callFunc("clear")
+                            m.global.queueManager.callFunc("push", selectedItem)
+                            m.global.queueManager.callFunc("playQueue")
+                        end if
+
+                    else if localGlobal.session.user.settings["ui.general.episodenextupbehavior"] = "episode"
+                        group = CreateMovieDetailsGroup(selectedItem)
+
+                    else if localGlobal.session.user.settings["ui.general.episodenextupbehavior"] = "season"
+                        group = CreateSeasonDetailsGroupByID(selectedItem.json.SeriesId, selectedItem.json.SeasonId, selectedItem.id)
+
                     end if
 
+
                 else if selectedItemType = "Series"
                     group = CreateSeriesDetailsGroup(selectedItem.json.id)
                 else if selectedItemType = "Season"
                     if isValid(selectedItem.json) and isValid(selectedItem.json.SeriesId) and isValid(selectedItem.id)
-                        group = CreateSeasonDetailsGroupByID(selectedItem.json.SeriesId, selectedItem.id)
+                        group = CreateSeasonDetailsGroupByID(selectedItem.json.SeriesId, selectedItem.id, "")
                     else
                         stopLoadingSpinner()
                         message_dialog(tr("Error loading Season"))
@@ -860,7 +877,7 @@ sub Main (args as dynamic) as void
                     else if popupNode.returnData.indexselected = 3
                         ' User chose Go to season
                         if isValid(selectedItem[0].json) and isValid(selectedItem[0].json.SeriesId) and isValid(selectedItem[0].json.seasonID)
-                            CreateSeasonDetailsGroupByID(selectedItem[0].json.SeriesId, selectedItem[0].json.seasonID)
+                            CreateSeasonDetailsGroupByID(selectedItem[0].json.SeriesId, selectedItem[0].json.seasonID, "")
                         else
                             stopLoadingSpinner()
                             message_dialog(tr("Error loading Season"))
diff --git a/source/ShowScenes.bs b/source/ShowScenes.bs
index 4aa14f8e..1829e928 100644
--- a/source/ShowScenes.bs
+++ b/source/ShowScenes.bs
@@ -646,7 +646,7 @@ function CreateSeriesDetailsGroup(seriesID as string) as dynamic
     ' Divert to season details if user setting goStraightToEpisodeListing is enabled and only one season exists.
     if seasonData <> invalid and m.global.session.user.settings["ui.tvshows.goStraightToEpisodeListing"] and seasonData.Items.Count() = 1
         stopLoadingSpinner()
-        return CreateSeasonDetailsGroupByID(seriesID, seasonData.Items[0].id)
+        return CreateSeasonDetailsGroupByID(seriesID, seasonData.Items[0].id, "")
     end if
     ' start building SeriesDetails view
     group = CreateObject("roSGNode", "TVShowDetails")
@@ -793,7 +793,7 @@ function CreateSeasonDetailsGroup(series as object, season as object) as dynamic
     return group
 end function
 
-function CreateSeasonDetailsGroupByID(seriesID as string, seasonID as string) as dynamic
+function CreateSeasonDetailsGroupByID(seriesID as string, seasonID as string, selectId as string) as dynamic
     ' validate parameters
     if seriesID = "" or seasonID = "" then return invalid
 
@@ -805,9 +805,11 @@ function CreateSeasonDetailsGroupByID(seriesID as string, seasonID as string) as
         stopLoadingSpinner()
         return invalid
     end if
+
     ' start building SeasonDetails view
     group = CreateObject("roSGNode", "TVEpisodes")
     group.optionsAvailable = false
+
     ' push scene asap (to prevent extra button presses when retriving series/movie info)
     group.seasonData = seasonMetaData.json
     group.objects = TVEpisodes(seriesID, seasonID)
@@ -821,6 +823,10 @@ function CreateSeasonDetailsGroupByID(seriesID as string, seasonID as string) as
     ' check for specials/extras for this season
     group.extrasObjects = TVSeasonExtras(seasonID)
 
+    group.observeField("sceneReady", "onSceneReady")
+
+    group.selectItemId = selectId
+
     ' finished building SeasonDetails view
     return group
 end function

From 97961b315bad7045f741895b4a223651166a3191 Mon Sep 17 00:00:00 2001
From: Reynolds 
Date: Fri, 11 Oct 2024 12:56:41 -0400
Subject: [PATCH 085/141] Added Settings for Remaining Time Display

This adds a setting with controls the type of data displayed for remaining time: remaining time, completion time of day, or both.
---
 components/video/OSD.bs      | 12 +++++++++++-
 components/video/OSD.xml     |  2 +-
 locale/en_US/translations.ts | 25 +++++++++++++++++++++++++
 settings/settings.json       | 21 +++++++++++++++++++++
 source/utils/misc.bs         | 18 ++++++++++++++++++
 5 files changed, 76 insertions(+), 2 deletions(-)

diff --git a/components/video/OSD.bs b/components/video/OSD.bs
index 4f687c7a..446d3b65 100644
--- a/components/video/OSD.bs
+++ b/components/video/OSD.bs
@@ -42,7 +42,17 @@ end sub
 '
 sub onProgressPercentageChanged()
     m.videoPositionTime.text = secondsToHuman(m.top.positionTime, true)
-    m.videoRemainingTime.text = secondsToHuman(m.top.remainingPositionTime, true)
+
+    osdmode = m.global.session.user.settings["ui.general.osdremainingtime"]
+
+    if osdmode = "remaining"
+        m.videoRemainingTime.text = secondsToHuman(m.top.remainingPositionTime, true)
+    else if osdmode = "timeofday"
+        m.videoRemainingTime.text = secondsToEndTime(m.top.remainingPositionTime)
+    else if osdmode = "both"
+        m.videoRemainingTime.text = secondsToHuman(m.top.remainingPositionTime, true) + " | " + secondsToEndTime(m.top.remainingPositionTime)
+    end if
+
     m.progressBar.width = m.progressBarBackground.width * m.top.progressPercentage
 end sub
 
diff --git a/components/video/OSD.xml b/components/video/OSD.xml
index 4093701d..e80eb64e 100644
--- a/components/video/OSD.xml
+++ b/components/video/OSD.xml
@@ -34,7 +34,7 @@
     
 
     
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 47888785..38775169 100644 --- a/docs/api/source_utils_globals.bs.html +++ b/docs/api/source_utils_globals.bs.html @@ -99,11 +99,8 @@ sub SaveDeviceToGlobal() print "ERROR parsing deviceInfo.GetVideoMode()" end if videoWidth = heightToWidth[videoHeight] - if videoHeight = "2160" and extraData = "b10" - bitDepth = 10 - else if videoHeight = "4320" - bitDepth = 12 - end if + if extraData <> invalid and extraData = "b10" then bitDepth = 10 + if videoHeight = "4320" then bitDepth = 12 m.global.addFields({ device: { From dddbd4197c053b4110e4d150226525db9d0842da Mon Sep 17 00:00:00 2001 From: Highlandword9 Date: Wed, 16 Oct 2024 15:39:37 +0000 Subject: [PATCH 094/141] Translated using Weblate (English (United Kingdom)) Currently translated at 100.0% (291 of 291 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/en_GB/ --- locale/en_GB/translations.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/locale/en_GB/translations.ts b/locale/en_GB/translations.ts index 00dcae40..90029987 100644 --- a/locale/en_GB/translations.ts +++ b/locale/en_GB/translations.ts @@ -1314,6 +1314,14 @@ Use Show Image User Setting - Setting option title + + Play Next Episode Automatically + Play Next Episode Automatically + + + When finished playing a single episode, play the next one automatically. + When finished playing a single episode, play the next one automatically. + From 2e85933956d03eeaafbeabb8d0d187d6bfce6e82 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Wed, 16 Oct 2024 22:30:16 -0400 Subject: [PATCH 095/141] Replace Special episode number with "Special" by @photonconvergence --- components/tvshows/TVListDetails.bs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/tvshows/TVListDetails.bs b/components/tvshows/TVListDetails.bs index 986c73f2..67a5e5a1 100644 --- a/components/tvshows/TVListDetails.bs +++ b/components/tvshows/TVListDetails.bs @@ -27,7 +27,9 @@ sub itemContentChanged() item.selectedVideoStreamId = itemData.MediaSources[0].id end if - if isValid(itemData.indexNumber) + if isValid(itemData.parentIndexNumber) and itemData.parentIndexNumber = 0 + indexNumber = `${tr("Special")} - ` + else if isValid(itemData.indexNumber) indexNumber = `${itemData.indexNumber}. ` if isValid(itemData.indexNumberEnd) indexNumber = `${itemData.indexNumber}-${itemData.indexNumberEnd}. ` From 4f867fe391b780194a81cc45acaaeff05ad0249a Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Thu, 17 Oct 2024 02:35:15 +0000 Subject: [PATCH 096/141] Update API docs --- docs/api/components_tvshows_TVListDetails.bs.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/api/components_tvshows_TVListDetails.bs.html b/docs/api/components_tvshows_TVListDetails.bs.html index 6d2a974b..fe072452 100644 --- a/docs/api/components_tvshows_TVListDetails.bs.html +++ b/docs/api/components_tvshows_TVListDetails.bs.html @@ -29,7 +29,9 @@ sub itemContentChanged() item.selectedVideoStreamId = itemData.MediaSources[0].id end if - if isValid(itemData.indexNumber) + if isValid(itemData.parentIndexNumber) and itemData.parentIndexNumber = 0 + indexNumber = `${tr("Special")} - ` + else if isValid(itemData.indexNumber) indexNumber = `${itemData.indexNumber}. ` if isValid(itemData.indexNumberEnd) indexNumber = `${itemData.indexNumber}-${itemData.indexNumberEnd}. ` From 6b3466fa84c10b756e19b143dcf739be6a08a236 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Wed, 16 Oct 2024 22:38:09 -0400 Subject: [PATCH 097/141] use local var instead of global Co-authored-by: Jimi --- source/Main.bs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Main.bs b/source/Main.bs index 2847d658..212ff934 100644 --- a/source/Main.bs +++ b/source/Main.bs @@ -76,7 +76,7 @@ sub Main (args as dynamic) as void if not m.global.app.isDev ' has the current user ran this version before? usersLastRunVersion = m.global.session.user.settings.lastRunVersion - if not isValid(usersLastRunVersion) or not versionChecker(m.global.session.user.settings.lastRunVersion, m.global.app.version) + if not isValid(usersLastRunVersion) or not versionChecker(usersLastRunVersion, m.global.app.version) set_user_setting("LastRunVersion", m.global.app.version) ' show what's new popup if m.global.session.user.settings["load.allowwhatsnew"] From 95b84d0e11e357a8efd82b85ef0b7b654ed50458 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Thu, 17 Oct 2024 11:54:52 -0400 Subject: [PATCH 098/141] save global refs to prevent deep copies --- components/ItemGrid/GridItem.bs | 10 +- components/ItemGrid/ItemGrid.bs | 37 ++--- components/ItemGrid/LoadVideoContentTask.bs | 43 +++--- components/ItemGrid/MovieLibraryView.bs | 20 +-- components/ItemGrid/MusicLibraryView.bs | 16 +- components/JFVideo.bs | 5 +- components/ListPoster.bs | 13 +- components/WhatsNewDialog.bs | 5 +- components/home/HomeItem.bs | 22 +-- components/home/HomeRows.bs | 9 +- components/home/LoadItemsTask.bs | 5 +- components/manager/ViewCreator.bs | 39 ++--- components/movies/MovieDetails.bs | 7 +- components/music/AudioPlayerView.bs | 160 ++++++++++---------- components/photos/PhotoDetails.bs | 5 +- components/settings/settings.bs | 9 +- components/tvshows/TVListDetails.bs | 7 +- components/tvshows/TVShowDetails.bs | 5 +- components/video/OSD.bs | 4 +- components/video/VideoPlayerView.bs | 27 ++-- 20 files changed, 240 insertions(+), 208 deletions(-) diff --git a/components/ItemGrid/GridItem.bs b/components/ItemGrid/GridItem.bs index 9f7a62ae..0658304e 100644 --- a/components/ItemGrid/GridItem.bs +++ b/components/ItemGrid/GridItem.bs @@ -42,10 +42,10 @@ end sub sub itemContentChanged() m.backdrop.blendColor = "#00a4db" ' set default in case global var is invalid - localGlobal = m.global + myGlobal = m.global - if isValid(localGlobal) and isValid(localGlobal.constants) and isValid(localGlobal.constants.poster_bg_pallet) - posterBackgrounds = localGlobal.constants.poster_bg_pallet + if isValid(myGlobal) and isValid(myGlobal.constants) and isValid(myGlobal.constants.poster_bg_pallet) + posterBackgrounds = myGlobal.constants.poster_bg_pallet m.backdrop.blendColor = posterBackgrounds[rnd(posterBackgrounds.count()) - 1] end if @@ -62,8 +62,8 @@ sub itemContentChanged() m.itemIcon.uri = itemData.iconUrl m.itemText.text = itemData.Title else if itemData.type = "Series" - if isValid(localGlobal) and isValid(localGlobal.session) and isValid(localGlobal.session.user) and isValid(localGlobal.session.user.settings) - if localGlobal.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"] = false + if isValid(myGlobal) and isValid(myGlobal.session) and isValid(myGlobal.session.user) and isValid(myGlobal.session.user.settings) + if myGlobal.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"] = false if isValid(itemData.json) and isValid(itemData.json.UserData) and isValid(itemData.json.UserData.UnplayedItemCount) if itemData.json.UserData.UnplayedItemCount > 0 m.unplayedCount.visible = true diff --git a/components/ItemGrid/ItemGrid.bs b/components/ItemGrid/ItemGrid.bs index 759bacd7..2b5875d9 100644 --- a/components/ItemGrid/ItemGrid.bs +++ b/components/ItemGrid/ItemGrid.bs @@ -7,9 +7,11 @@ import "pkg:/source/roku_modules/log/LogMixin.brs" sub init() m.log = log.Logger("ItemGrid") m.log.debug("start init()") + userSettings = m.global.session.user.settings + m.options = m.top.findNode("options") - m.showItemCount = m.global.session.user.settings["itemgrid.showItemCount"] + m.showItemCount = userSettings["itemgrid.showItemCount"] m.tvGuide = invalid m.channelFocused = invalid @@ -68,9 +70,9 @@ sub init() m.alphaMenu = m.alpha.findNode("alphaMenu") 'Get reset folder setting - m.resetGrid = m.global.session.user.settings["itemgrid.reset"] + m.resetGrid = userSettings["itemgrid.reset"] - m.top.gridTitles = m.global.session.user.settings["itemgrid.gridTitles"] + m.top.gridTitles = userSettings["itemgrid.gridTitles"] m.log.debug("end init()") end sub @@ -84,6 +86,7 @@ sub loadInitialItems() m.log.debug("start loadInitialItems()") m.loadItemsTask.control = "stop" startLoadingSpinner() + userSettings = m.global.session.user.settings if m.top.parentItem.json.Type = "CollectionFolder" 'or m.top.parentItem.json.Type = "Folder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -96,25 +99,25 @@ sub loadInitialItems() ' Read view/sort/filter settings if m.top.parentItem.collectionType = "livetv" ' Translate between app and server nomenclature - viewSetting = m.global.session.user.settings["display.livetv.landing"] + viewSetting = userSettings["display.livetv.landing"] if viewSetting = "guide" m.view = "tvGuide" else m.view = "livetv" end if - m.sortField = m.global.session.user.settings["display.livetv.sortField"] - sortAscendingStr = m.global.session.user.settings["display.livetv.sortAscending"] - m.filter = m.global.session.user.settings["display.livetv.filter"] + m.sortField = userSettings["display.livetv.sortField"] + sortAscendingStr = userSettings["display.livetv.sortAscending"] + m.filter = userSettings["display.livetv.filter"] else if m.top.parentItem.collectionType = "music" - m.view = m.global.session.user.settings["display.music.view"] - m.sortField = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortField"] - sortAscendingStr = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortAscending"] - m.filter = m.global.session.user.settings["display." + m.top.parentItem.Id + ".filter"] + m.view = userSettings["display.music.view"] + m.sortField = userSettings["display." + m.top.parentItem.Id + ".sortField"] + sortAscendingStr = userSettings["display." + m.top.parentItem.Id + ".sortAscending"] + m.filter = userSettings["display." + m.top.parentItem.Id + ".filter"] else - m.sortField = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortField"] - sortAscendingStr = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortAscending"] - m.filter = m.global.session.user.settings["display." + m.top.parentItem.Id + ".filter"] - m.view = m.global.session.user.settings["display." + m.top.parentItem.Id + ".landing"] + m.sortField = userSettings["display." + m.top.parentItem.Id + ".sortField"] + sortAscendingStr = userSettings["display." + m.top.parentItem.Id + ".sortAscending"] + m.filter = userSettings["display." + m.top.parentItem.Id + ".filter"] + m.view = userSettings["display." + m.top.parentItem.Id + ".landing"] end if if m.sortField = invalid @@ -180,7 +183,7 @@ sub loadInitialItems() m.loadItemsTask.itemType = "MusicArtist" m.loadItemsTask.itemId = m.top.parentItem.Id - m.view = m.global.session.user.settings["display.music.view"] + m.view = userSettings["display.music.view"] if m.view = "music-album" m.loadItemsTask.itemType = "MusicAlbum" @@ -191,7 +194,7 @@ sub loadInitialItems() ' For LiveTV, we want to "Fit" the item images, not zoom m.top.imageDisplayMode = "scaleToFit" - if m.global.session.user.settings["display.livetv.landing"] = "guide" and m.options.view <> "livetv" + if userSettings["display.livetv.landing"] = "guide" and m.options.view <> "livetv" showTvGuide() end if else if m.top.parentItem.collectionType = "CollectionFolder" or m.top.parentItem.type = "CollectionFolder" or m.top.parentItem.collectionType = "boxsets" or m.top.parentItem.Type = "Boxset" or m.top.parentItem.Type = "Boxsets" or m.top.parentItem.Type = "Folder" or m.top.parentItem.Type = "Channel" diff --git a/components/ItemGrid/LoadVideoContentTask.bs b/components/ItemGrid/LoadVideoContentTask.bs index 74da4f44..1ab4edbb 100644 --- a/components/ItemGrid/LoadVideoContentTask.bs +++ b/components/ItemGrid/LoadVideoContentTask.bs @@ -17,21 +17,23 @@ sub init() end sub sub loadItems() + queueManager = m.global.queueManager + ' Reset intro tracker in case task gets reused m.top.isIntro = false ' Only show preroll once per queue - if m.global.queueManager.callFunc("isPrerollActive") + if queueManager.callFunc("isPrerollActive") ' Prerolls not allowed if we're resuming video - if m.global.queueManager.callFunc("getCurrentItem").startingPoint = 0 + if queueManager.callFunc("getCurrentItem").startingPoint = 0 preRoll = GetIntroVideos(m.top.itemId) if isValid(preRoll) and preRoll.TotalRecordCount > 0 and isValid(preRoll.items[0]) ' If an error is thrown in the Intros plugin, instead of passing the error they pass the entire rick roll music video. ' Bypass the music video and treat it as an error message if lcase(preRoll.items[0].name) <> "rick roll'd" - m.global.queueManager.callFunc("push", m.global.queueManager.callFunc("getCurrentItem")) + queueManager.callFunc("push", queueManager.callFunc("getCurrentItem")) m.top.itemId = preRoll.items[0].id - m.global.queueManager.callFunc("setPrerollStatus", false) + queueManager.callFunc("setPrerollStatus", false) m.top.isIntro = true end if end if @@ -39,7 +41,7 @@ sub loadItems() end if if m.top.selectedAudioStreamIndex = 0 - currentItem = m.global.queueManager.callFunc("getCurrentItem") + currentItem = queueManager.callFunc("getCurrentItem") if isValid(currentItem) and isValid(currentItem.json) m.top.selectedAudioStreamIndex = FindPreferredAudioStream(currentItem.json.MediaStreams) end if @@ -79,6 +81,10 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s return end if + queueManager = m.global.queueManager + userSession = m.global.session.user + userSettings = userSession.settings + videotype = LCase(meta.type) ' Check for any Live TV streams or Recordings coming from other places other than the TV Guide @@ -119,15 +125,14 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s end if if LCase(m.top.itemType) = "episode" - userSession = m.global.session.user - if userSession.settings["playback.playnextepisode"] = "enabled" or userSession.settings["playback.playnextepisode"] = "webclient" and userSession.Configuration.EnableNextEpisodeAutoPlay + if userSettings["playback.playnextepisode"] = "enabled" or userSettings["playback.playnextepisode"] = "webclient" and userSession.Configuration.EnableNextEpisodeAutoPlay addNextEpisodesToQueue(video.showID) end if end if playbackPosition = 0! - currentItem = m.global.queueManager.callFunc("getCurrentItem") + currentItem = queueManager.callFunc("getCurrentItem") if isValid(currentItem) and isValid(currentItem.startingPoint) playbackPosition = currentItem.startingPoint @@ -209,8 +214,8 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s ' transcode is that the Encoding Level is not supported, then try to direct play but silently ' fall back to the transcode if that fails. if m.playbackInfo.MediaSources[0].MediaStreams.Count() > 0 and meta.live = false - tryDirectPlay = m.global.session.user.settings["playback.tryDirect.h264ProfileLevel"] and m.playbackInfo.MediaSources[0].MediaStreams[0].codec = "h264" - tryDirectPlay = tryDirectPlay or (m.global.session.user.settings["playback.tryDirect.hevcProfileLevel"] and m.playbackInfo.MediaSources[0].MediaStreams[0].codec = "hevc") + tryDirectPlay = userSettings["playback.tryDirect.h264ProfileLevel"] and m.playbackInfo.MediaSources[0].MediaStreams[0].codec = "h264" + tryDirectPlay = tryDirectPlay or (userSettings["playback.tryDirect.hevcProfileLevel"] and m.playbackInfo.MediaSources[0].MediaStreams[0].codec = "hevc") if tryDirectPlay and isValid(m.playbackInfo.MediaSources[0].TranscodingUrl) and forceTranscoding = false transcodingReasons = getTranscodeReasons(m.playbackInfo.MediaSources[0].TranscodingUrl) if transcodingReasons.Count() = 1 and transcodingReasons[0] = "VideoLevelNotSupported" @@ -250,7 +255,8 @@ end sub ' @param {dynamic} videoID - id of video user is playing ' @return {integer} indicating the default track's server-side index. Defaults to {SubtitleSelection.none} is one is not found function defaultSubtitleTrackFromVid(videoID) as integer - if m.global.session.user.configuration.SubtitleMode = "None" + userSession = m.global.session.user + if userSession.configuration.SubtitleMode = "None" return SubtitleSelection.none ' No subtitles desired: return none end if @@ -276,7 +282,7 @@ function defaultSubtitleTrackFromVid(videoID) as integer return defaultTextSubs end if - if not m.global.session.user.settings["playback.subs.onlytext"] + if not userSession.settings["playback.subs.onlytext"] return defaultSubtitleTrack(subtitles["all"], selectedAudioLanguage) ' if no appropriate text subs exist, allow non-text end if @@ -476,6 +482,8 @@ end function ' Add next episodes to the playback queue sub addNextEpisodesToQueue(showID) + queueManager = m.global.queueManager + ' Don't queue next episodes if we already have a playback queue maxQueueCount = 1 @@ -483,13 +491,13 @@ sub addNextEpisodesToQueue(showID) maxQueueCount = 2 end if - if m.global.queueManager.callFunc("getCount") > maxQueueCount then return + if queueManager.callFunc("getCount") > maxQueueCount then return videoID = m.top.itemId ' If first item is an intro video, use the next item in the queue if m.top.isIntro - currentVideo = m.global.queueManager.callFunc("getItemByIndex", 1) + currentVideo = queueManager.callFunc("getItemByIndex", 1) if isValid(currentVideo) and isValid(currentVideo.id) videoID = currentVideo.id @@ -511,7 +519,7 @@ sub addNextEpisodesToQueue(showID) if isValid(data) and data.Items.Count() > 1 for i = 1 to data.Items.Count() - 1 - m.global.queueManager.callFunc("push", data.Items[i]) + queueManager.callFunc("push", data.Items[i]) end for end if end sub @@ -570,8 +578,9 @@ function sortSubtitles(id as string, MediaStreams) end function function FindPreferredAudioStream(streams as dynamic) as integer - preferredLanguage = m.global.session.user.Configuration.AudioLanguagePreference - playDefault = m.global.session.user.Configuration.PlayDefaultAudioTrack + userConfig = m.global.session.user.configuration + preferredLanguage = userConfig.AudioLanguagePreference + playDefault = userConfig.PlayDefaultAudioTrack if playDefault <> invalid and playDefault = true return 1 diff --git a/components/ItemGrid/MovieLibraryView.bs b/components/ItemGrid/MovieLibraryView.bs index 5ff0fae7..1f7294f5 100644 --- a/components/ItemGrid/MovieLibraryView.bs +++ b/components/ItemGrid/MovieLibraryView.bs @@ -30,6 +30,7 @@ end sub sub init() setupNodes() + userSettings = m.global.session.user.settings m.overhang.isVisible = false @@ -39,7 +40,7 @@ sub init() alphaMicText = m.alpha.findNode("alphaMicText") alphaMicText.visible = false - m.showItemCount = m.global.session.user.settings["itemgrid.showItemCount"] + m.showItemCount = userSettings["itemgrid.showItemCount"] m.swapAnimation.observeField("state", "swapDone") @@ -86,7 +87,7 @@ sub init() m.loadItemsTask.totalRecordCount = 0 'Get reset folder setting - m.resetGrid = m.global.session.user.settings["itemgrid.reset"] + m.resetGrid = userSettings["itemgrid.reset"] end sub sub OnScreenHidden() @@ -112,6 +113,7 @@ end sub sub loadInitialItems() m.loadItemsTask.control = "stop" startLoadingSpinner(false) + userSettings = m.global.session.user.settings if m.top.parentItem.json.Type = "CollectionFolder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -123,15 +125,15 @@ sub loadInitialItems() SetBackground("") end if - m.sortField = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortField"] - m.filter = m.global.session.user.settings["display." + m.top.parentItem.Id + ".filter"] - m.filterOptions = m.global.session.user.settings["display." + m.top.parentItem.Id + ".filterOptions"] - m.view = m.global.session.user.settings["display." + m.top.parentItem.Id + ".landing"] - m.sortAscending = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortAscending"] + m.sortField = userSettings["display." + m.top.parentItem.Id + ".sortField"] + m.filter = userSettings["display." + m.top.parentItem.Id + ".filter"] + m.filterOptions = userSettings["display." + m.top.parentItem.Id + ".filterOptions"] + m.view = userSettings["display." + m.top.parentItem.Id + ".landing"] + m.sortAscending = userSettings["display." + m.top.parentItem.Id + ".sortAscending"] ' If user has not set a preferred view for this folder, check if they've set a default view if not isValid(m.view) - m.view = m.global.session.user.settings["itemgrid.movieDefaultView"] + m.view = userSettings["itemgrid.movieDefaultView"] end if if not isValid(m.sortField) then m.sortField = "SortName" @@ -200,7 +202,7 @@ sub loadInitialItems() m.itemGrid.numRows = "3" m.selectedMovieOverview.visible = false m.infoGroup.visible = false - m.top.showItemTitles = m.global.session.user.settings["itemgrid.gridTitles"] + m.top.showItemTitles = userSettings["itemgrid.gridTitles"] if LCase(m.top.showItemTitles) = "hidealways" m.itemGrid.itemSize = "[230, 315]" m.itemGrid.rowHeights = "[315]" diff --git a/components/ItemGrid/MusicLibraryView.bs b/components/ItemGrid/MusicLibraryView.bs index 8ff8c6ce..efa883fe 100644 --- a/components/ItemGrid/MusicLibraryView.bs +++ b/components/ItemGrid/MusicLibraryView.bs @@ -25,6 +25,7 @@ end sub sub init() setupNodes() + userSettings = m.global.session.user.settings m.overhang.isVisible = false @@ -34,7 +35,7 @@ sub init() alphaMicText = m.alpha.findNode("alphaMicText") alphaMicText.visible = false - m.showItemCount = m.global.session.user.settings["itemgrid.showItemCount"] + m.showItemCount = userSettings["itemgrid.showItemCount"] m.swapAnimation.observeField("state", "swapDone") @@ -80,7 +81,7 @@ sub init() m.loadItemsTask.totalRecordCount = 0 'Get reset folder setting - m.resetGrid = m.global.session.user.settings["itemgrid.reset"] + m.resetGrid = userSettings["itemgrid.reset"] end sub sub OnScreenHidden() @@ -106,6 +107,7 @@ end sub sub loadInitialItems() m.loadItemsTask.control = "stop" startLoadingSpinner(false) + userSettings = m.global.session.user.settings if LCase(m.top.parentItem.json.Type) = "collectionfolder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -117,17 +119,17 @@ sub loadInitialItems() SetBackground("") end if - m.sortField = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortField"] - m.sortAscending = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortAscending"] - m.filter = m.global.session.user.settings["display." + m.top.parentItem.Id + ".filter"] - m.view = m.global.session.user.settings["display." + m.top.parentItem.Id + ".landing"] + m.sortField = userSettings["display." + m.top.parentItem.Id + ".sortField"] + m.sortAscending = userSettings["display." + m.top.parentItem.Id + ".sortAscending"] + m.filter = userSettings["display." + m.top.parentItem.Id + ".filter"] + m.view = userSettings["display." + m.top.parentItem.Id + ".landing"] if not isValid(m.sortField) then m.sortField = "SortName" if not isValid(m.filter) then m.filter = "All" if not isValid(m.view) then m.view = "ArtistsPresentation" if not isValid(m.sortAscending) then m.sortAscending = true - m.top.showItemTitles = m.global.session.user.settings["itemgrid.gridTitles"] + m.top.showItemTitles = userSettings["itemgrid.gridTitles"] if LCase(m.top.parentItem.json.type) = "musicgenre" m.itemGrid.translation = "[96, 60]" diff --git a/components/JFVideo.bs b/components/JFVideo.bs index 5be3d853..f7c631e0 100644 --- a/components/JFVideo.bs +++ b/components/JFVideo.bs @@ -13,7 +13,8 @@ sub init() m.top.transcodeReasons = [] m.bufferCheckTimer.duration = 30 - if m.global.session.user.settings["ui.design.hideclock"] = true + userSettings = m.global.session.user.settings + if userSettings["ui.design.hideclock"] clockNode = findNodeBySubtype(m.top, "clock") if clockNode[0] <> invalid then clockNode[0].parent.removeChild(clockNode[0].node) end if @@ -22,7 +23,7 @@ sub init() m.nextEpisodeButton = m.top.findNode("nextEpisode") m.nextEpisodeButton.text = tr("Next Episode") m.nextEpisodeButton.setFocus(false) - m.nextupbuttonseconds = m.global.session.user.settings["playback.nextupbuttonseconds"].ToInt() + m.nextupbuttonseconds = userSettings["playback.nextupbuttonseconds"].ToInt() m.showNextEpisodeButtonAnimation = m.top.findNode("showNextEpisodeButton") m.hideNextEpisodeButtonAnimation = m.top.findNode("hideNextEpisodeButton") diff --git a/components/ListPoster.bs b/components/ListPoster.bs index 22310504..59d309cc 100644 --- a/components/ListPoster.bs +++ b/components/ListPoster.bs @@ -17,10 +17,10 @@ sub init() ' Randomize the background colors backdropColor = "#00a4db" ' set default in case global var is invalid - localGlobal = m.global + myGlobal = m.global - if isValid(localGlobal) and isValid(localGlobal.constants) and isValid(localGlobal.constants.poster_bg_pallet) - posterBackgrounds = localGlobal.constants.poster_bg_pallet + if isValid(myGlobal) and isValid(myGlobal.constants) and isValid(myGlobal.constants.poster_bg_pallet) + posterBackgrounds = myGlobal.constants.poster_bg_pallet backdropColor = posterBackgrounds[rnd(posterBackgrounds.count()) - 1] end if @@ -65,8 +65,9 @@ sub itemContentChanged() as void m.poster = m.top.findNode("poster") itemData = m.top.itemContent m.title.text = itemData.title + userSettings = m.global.session.user.settings - if m.global.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"] = false + if not userSettings["ui.tvshows.disableUnwatchedEpisodeCount"] if isValid(itemData.json.UserData) and isValid(itemData.json.UserData.UnplayedItemCount) if itemData.json.UserData.UnplayedItemCount > 0 m.unplayedCount.visible = true @@ -94,7 +95,7 @@ sub itemContentChanged() as void imageUrl = itemData.posterURL - if m.global.session.user.settings["ui.tvshows.blurunwatched"] = true + if userSettings["ui.tvshows.blurunwatched"] if itemData.json.lookup("Type") = "Episode" and isValid(itemData.json.userdata) if not itemData.json.userdata.played imageUrl = imageUrl + "&blur=15" @@ -116,7 +117,7 @@ sub focusChanged() m.staticTitle.visible = false m.title.visible = true ' text to speech for accessibility - if m.global.device.isAudioGuideEnabled = true + if m.global.device.isAudioGuideEnabled txt2Speech = CreateObject("roTextToSpeech") txt2Speech.Flush() txt2Speech.Say(m.title.text) diff --git a/components/WhatsNewDialog.bs b/components/WhatsNewDialog.bs index a556de8f..c528c4d6 100644 --- a/components/WhatsNewDialog.bs +++ b/components/WhatsNewDialog.bs @@ -1,11 +1,12 @@ sub init() m.content = m.top.findNode("content") + appVersion = m.global.app.version setPalette() m.top.id = "OKDialog" m.top.height = 900 - m.top.title = tr("Welcome to version") + " " + m.global.app.version + m.top.title = tr("Welcome to version") + " " + appVersion m.top.buttons = [tr("OK")] dialogStyles = { @@ -27,7 +28,7 @@ sub init() textLine = m.content.CreateChild("StdDlgMultiStyleTextItem") textLine.drawingStyles = dialogStyles - textLine.text = tr("To view a complete list of changes visit") + " https://github.com/jellyfin/jellyfin-roku/releases/tag/v" + m.global.app.version + "" + textLine.text = tr("To view a complete list of changes visit") + " https://github.com/jellyfin/jellyfin-roku/releases/tag/v" + appVersion + "" end sub sub setPalette() diff --git a/components/home/HomeItem.bs b/components/home/HomeItem.bs index b1ddeb2b..935130df 100644 --- a/components/home/HomeItem.bs +++ b/components/home/HomeItem.bs @@ -22,10 +22,10 @@ sub init() ' Randomize the background colors backdropColor = "#00a4db" ' set default in case global var is invalid - localGlobal = m.global + myGlobal = m.global - if isValid(localGlobal) and isValid(localGlobal.constants) and isValid(localGlobal.constants.poster_bg_pallet) - posterBackgrounds = localGlobal.constants.poster_bg_pallet + if isValid(myGlobal) and isValid(myGlobal.constants) and isValid(myGlobal.constants.poster_bg_pallet) + posterBackgrounds = myGlobal.constants.poster_bg_pallet backdropColor = posterBackgrounds[rnd(posterBackgrounds.count()) - 1] end if @@ -54,7 +54,7 @@ sub itemContentChanged() if isValid(m.unplayedCount) then m.unplayedCount.visible = false itemData = m.top.itemContent if itemData = invalid then return - localGlobal = m.global + userSettings = m.global.session.user.settings itemData.Title = itemData.name ' Temporarily required while we move from "HomeItem" to "JFContentItem" @@ -69,9 +69,9 @@ sub itemContentChanged() m.itemTextExtra.width = itemData.imageWidth m.itemTextExtra.visible = true m.itemTextExtra.text = "" - m.backdrop.width = itemData.imageWidth + if isValid(itemData.iconUrl) m.itemIcon.uri = itemData.iconUrl end if @@ -82,8 +82,8 @@ sub itemContentChanged() m.playedIndicator.visible = false if LCase(itemData.type) = "series" - if isValid(localGlobal) and isValid(localGlobal.session) and isValid(localGlobal.session.user) and isValid(localGlobal.session.user.settings) - if not localGlobal.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"] + if isValid(userSettings) + if not userSettings["ui.tvshows.disableUnwatchedEpisodeCount"] if isValid(itemData.json.UserData) and isValid(itemData.json.UserData.UnplayedItemCount) if itemData.json.UserData.UnplayedItemCount > 0 if isValid(m.unplayedCount) then m.unplayedCount.visible = true @@ -151,16 +151,16 @@ sub itemContentChanged() drawProgressBar(itemData) end if - if localGlobal.session.user.settings["ui.general.episodeimagesnextup"] = "webclient" - tmpSetting = localGlobal.session.user.Configuration.useEpisodeImagesInNextUpAndResume + if userSettings["ui.general.episodeimagesnextup"] = "webclient" + tmpSetting = m.global.session.user.Configuration.useEpisodeImagesInNextUpAndResume if isValid(tmpSetting) and tmpSetting m.itemPoster.uri = itemData.thumbnailURL else m.itemPoster.uri = itemData.widePosterURL end if - else if localGlobal.session.user.settings["ui.general.episodeimagesnextup"] = "show" + else if userSettings["ui.general.episodeimagesnextup"] = "show" m.itemPoster.uri = itemData.widePosterURL - else if localGlobal.session.user.settings["ui.general.episodeimagesnextup"] = "episode" + else if userSettings["ui.general.episodeimagesnextup"] = "episode" m.itemPoster.uri = itemData.thumbnailURL end if diff --git a/components/home/HomeRows.bs b/components/home/HomeRows.bs index 598a0896..d691cb15 100644 --- a/components/home/HomeRows.bs +++ b/components/home/HomeRows.bs @@ -76,10 +76,11 @@ sub processUserSections() m.processedRowCount = 0 sessionUser = m.global.session.user + userSettings = sessionUser.settings ' calculate expected row count by processing homesections for i = 0 to 6 - userSection = sessionUser.settings["homesection" + i.toStr()] + userSection = userSettings["homesection" + i.toStr()] sectionName = userSection ?? "none" sectionName = LCase(sectionName) @@ -99,7 +100,7 @@ sub processUserSections() ' Add home sections in order based on user settings loadedSections = 0 for i = 0 to 6 - userSection = sessionUser.settings["homesection" + i.toStr()] + userSection = userSettings["homesection" + i.toStr()] sectionName = userSection ?? "none" sectionName = LCase(sectionName) @@ -149,10 +150,10 @@ function getOriginalSectionIndex(sectionName as string) as integer sectionIndex = 0 indexLatestMediaSection = 0 - sessionUser = m.global.session.user + userSettings = m.global.session.user.settings for i = 0 to 6 - userSection = sessionUser.settings["homesection" + i.toStr()] + userSection = userSettings["homesection" + i.toStr()] settingSectionName = userSection ?? "none" settingSectionName = LCase(settingSectionName) diff --git a/components/home/LoadItemsTask.bs b/components/home/LoadItemsTask.bs index f947d125..b918a8df 100644 --- a/components/home/LoadItemsTask.bs +++ b/components/home/LoadItemsTask.bs @@ -60,6 +60,7 @@ sub loadItems() ' Load Next Up else if m.top.itemsToLoad = "nextUp" + userSettings = m.global.session.user.settings url = "Shows/NextUp" params = {} @@ -68,12 +69,12 @@ sub loadItems() params["SortOrder"] = "Descending" params["ImageTypeLimit"] = 1 params["UserId"] = m.global.session.user.id - params["EnableRewatching"] = m.global.session.user.settings["ui.details.enablerewatchingnextup"] + params["EnableRewatching"] = userSettings["ui.details.enablerewatchingnextup"] params["DisableFirstEpisode"] = false params["limit"] = 24 params["EnableTotalRecordCount"] = false - maxDaysInNextUp = m.global.session.user.settings["ui.details.maxdaysnextup"].ToInt() + maxDaysInNextUp = userSettings["ui.details.maxdaysnextup"].ToInt() if isValid(maxDaysInNextUp) if maxDaysInNextUp > 0 dateToday = CreateObject("roDateTime") diff --git a/components/manager/ViewCreator.bs b/components/manager/ViewCreator.bs index c2efcd07..58bd92a8 100644 --- a/components/manager/ViewCreator.bs +++ b/components/manager/ViewCreator.bs @@ -58,9 +58,9 @@ sub onSelectAudioPressed() audioData.data.push(audioStreamItem) end for - - m.global.sceneManager.callFunc("radioDialog", tr("Select Audio"), audioData) - m.global.sceneManager.observeField("returnData", "onSelectionMade") + sceneManager = m.global.sceneManager + sceneManager.callFunc("radioDialog", tr("Select Audio"), audioData) + sceneManager.observeField("returnData", "onSelectionMade") end sub ' User requested subtitle selection popup @@ -110,23 +110,25 @@ sub onSelectSubtitlePressed() "Type": "subtitleselection" }) - m.global.sceneManager.callFunc("radioDialog", tr("Select Subtitles"), subtitleData) - m.global.sceneManager.observeField("returnData", "onSelectionMade") + sceneManager = m.global.sceneManager + sceneManager.callFunc("radioDialog", tr("Select Subtitles"), subtitleData) + sceneManager.observeField("returnData", "onSelectionMade") end sub ' User has selected something from the radioDialog popup sub onSelectionMade() - m.global.sceneManager.unobserveField("returnData") + sceneManager = m.global.sceneManager + sceneManager.unobserveField("returnData") - if not isValid(m.global.sceneManager.returnData) then return - if not isValid(m.global.sceneManager.returnData.type) then return + if not isValid(sceneManager.returnData) then return + if not isValid(sceneManager.returnData.type) then return - if LCase(m.global.sceneManager.returnData.type) = "subtitleselection" + if LCase(sceneManager.returnData.type) = "subtitleselection" processSubtitleSelection() return end if - if LCase(m.global.sceneManager.returnData.type) = "audioselection" + if LCase(sceneManager.returnData.type) = "audioselection" processAudioSelection() return end if @@ -216,21 +218,24 @@ end sub ' Playback state change event handlers sub onStateChange() if LCase(m.view.state) = "finished" + sceneManager = m.global.sceneManager + queueManager = m.global.queueManager + ' Close any open dialogs - if m.global.sceneManager.callFunc("isDialogOpen") - m.global.sceneManager.callFunc("dismissDialog") + if sceneManager.callFunc("isDialogOpen") + sceneManager.callFunc("dismissDialog") end if ' If there is something next in the queue, play it - if m.global.queueManager.callFunc("getPosition") < m.global.queueManager.callFunc("getCount") - 1 - m.global.sceneManager.callFunc("clearPreviousScene") - m.global.queueManager.callFunc("moveForward") - m.global.queueManager.callFunc("playQueue") + if queueManager.callFunc("getPosition") < queueManager.callFunc("getCount") - 1 + sceneManager.callFunc("clearPreviousScene") + queueManager.callFunc("moveForward") + queueManager.callFunc("playQueue") return end if ' Playback completed, return user to previous screen - m.global.sceneManager.callFunc("popScene") + sceneManager.callFunc("popScene") m.global.audioPlayer.loopMode = "" end if end sub diff --git a/components/movies/MovieDetails.bs b/components/movies/MovieDetails.bs index e7aa3d3a..5812f4c4 100644 --- a/components/movies/MovieDetails.bs +++ b/components/movies/MovieDetails.bs @@ -97,6 +97,7 @@ sub itemContentChanged() ' Updates video metadata item = m.top.itemContent if isValid(item) and isValid(item.json) + userSettings = m.global.session.user.settings itemData = item.json m.top.id = itemData.id m.top.findNode("moviePoster").uri = m.top.itemContent.posterURL @@ -120,7 +121,7 @@ sub itemContentChanged() m.infoGroup.removeChild(m.top.findNode("officialRating")) end if - if m.global.session.user.settings["ui.movies.showRatings"] + if userSettings["ui.movies.showRatings"] if isValid(itemData.communityRating) setFieldText("communityRating", int(itemData.communityRating * 10) / 10) else @@ -145,7 +146,7 @@ sub itemContentChanged() if type(itemData.RunTimeTicks) = "LongInteger" setFieldText("runtime", stri(getRuntime()) + " mins") - if m.global.session.user.settings["ui.design.hideclock"] <> true + if userSettings["ui.design.hideclock"] <> true setFieldText("ends-at", tr("Ends at %1").Replace("%1", getEndTime())) end if end if @@ -173,7 +174,7 @@ sub itemContentChanged() m.top.findNode("details").removeChild(m.top.findNode("director")) end if - if m.global.session.user.settings["ui.details.hidetagline"] = false + if userSettings["ui.details.hidetagline"] = false if itemData.taglines.count() > 0 setFieldText("tagline", itemData.taglines[0]) end if diff --git a/components/music/AudioPlayerView.bs b/components/music/AudioPlayerView.bs index 12786a6b..6270b0ca 100644 --- a/components/music/AudioPlayerView.bs +++ b/components/music/AudioPlayerView.bs @@ -9,9 +9,14 @@ sub init() m.lastRecordedPositionTimestamp = 0 m.scrubTimestamp = -1 - m.playlistTypeCount = m.global.queueManager.callFunc("getQueueUniqueTypes").count() + m.queueManager = m.global.queueManager + m.playlistTypeCount = m.queueManager.callFunc("getQueueUniqueTypes").count() + + m.audioPlayer = m.global.audioPlayer + m.audioPlayer.observeField("state", "audioStateChanged") + m.audioPlayer.observeField("position", "audioPositionChanged") + m.audioPlayer.observeField("bufferingStatus", "bufferPositionChanged") - setupAudioNode() setupAnimationTasks() setupButtons() setupInfoNodes() @@ -91,13 +96,6 @@ sub setupDataTasks() m.LoadScreenSaverTimeoutTask = CreateObject("roSGNode", "LoadScreenSaverTimeoutTask") end sub -' Creates audio node used to play song(s) -sub setupAudioNode() - m.global.audioPlayer.observeField("state", "audioStateChanged") - m.global.audioPlayer.observeField("position", "audioPositionChanged") - m.global.audioPlayer.observeField("bufferingStatus", "bufferPositionChanged") -end sub - ' Setup playback buttons, default to Play button selected sub setupButtons() m.buttons = m.top.findNode("buttons") @@ -149,10 +147,10 @@ end sub sub bufferPositionChanged() if m.inScrubMode then return - if not isValid(m.global.audioPlayer.bufferingStatus) + if not isValid(m.audioPlayer.bufferingStatus) bufferPositionBarWidth = m.seekBar.width else - bufferPositionBarWidth = m.seekBar.width * m.global.audioPlayer.bufferingStatus.percentage + bufferPositionBarWidth = m.seekBar.width * m.audioPlayer.bufferingStatus.percentage end if ' Ensure position bar is never wider than the seek bar @@ -168,16 +166,16 @@ end sub sub audioPositionChanged() stopLoadingSpinner() - if m.global.audioPlayer.position = 0 + if m.audioPlayer.position = 0 m.playPosition.width = 0 end if - if not isValid(m.global.audioPlayer.position) + if not isValid(m.audioPlayer.position) playPositionBarWidth = 0 else if not isValid(m.songDuration) playPositionBarWidth = 0 else - songPercentComplete = m.global.audioPlayer.position / m.songDuration + songPercentComplete = m.audioPlayer.position / m.songDuration playPositionBarWidth = m.seekBar.width * songPercentComplete end if @@ -189,7 +187,7 @@ sub audioPositionChanged() if not m.inScrubMode moveSeekbarThumb(playPositionBarWidth) ' Change the seek position timestamp - m.seekTimestamp.text = secondsToHuman(m.global.audioPlayer.position, false) + m.seekTimestamp.text = secondsToHuman(m.audioPlayer.position, false) end if ' Use animation to make the display smooth @@ -197,9 +195,9 @@ sub audioPositionChanged() m.playPositionAnimation.control = "start" ' Update displayed position timestamp - if isValid(m.global.audioPlayer.position) - m.lastRecordedPositionTimestamp = m.global.audioPlayer.position - m.positionTimestamp.text = secondsToHuman(m.global.audioPlayer.position, false) + if isValid(m.audioPlayer.position) + m.lastRecordedPositionTimestamp = m.audioPlayer.position + m.positionTimestamp.text = secondsToHuman(m.audioPlayer.position, false) else m.lastRecordedPositionTimestamp = 0 m.positionTimestamp.text = "0:00" @@ -247,25 +245,24 @@ sub endScreenSaver() end sub sub audioStateChanged() - ' Song Finished, attempt to move to next song - if m.global.audioPlayer.state = "finished" + if m.audioPlayer.state = "finished" ' User has enabled single song loop, play current song again - if m.global.audioPlayer.loopMode = "one" + if m.audioPlayer.loopMode = "one" m.scrubTimestamp = -1 playAction() exitScrubMode() return end if - if m.global.queueManager.callFunc("getPosition") < m.global.queueManager.callFunc("getCount") - 1 + if m.queueManager.callFunc("getPosition") < m.queueManager.callFunc("getCount") - 1 m.top.state = "finished" else ' We are at the end of the song queue ' User has enabled loop for entire song queue, move back to first song - if m.global.audioPlayer.loopMode = "all" - m.global.queueManager.callFunc("setPosition", -1) + if m.audioPlayer.loopMode = "all" + m.queueManager.callFunc("setPosition", -1) LoadNextSong() return end if @@ -277,18 +274,19 @@ sub audioStateChanged() end sub function playAction() as boolean - if m.global.audioPlayer.state = "playing" - m.global.audioPlayer.control = "pause" + + if m.audioPlayer.state = "playing" + m.audioPlayer.control = "pause" ' Allow screen to go to real screensaver WriteAsciiFile("tmp:/scene.temp", "nowplaying-paused") MoveFile("tmp:/scene.temp", "tmp:/scene") - else if m.global.audioPlayer.state = "paused" - m.global.audioPlayer.control = "resume" + else if m.audioPlayer.state = "paused" + m.audioPlayer.control = "resume" ' Write screen tracker for screensaver WriteAsciiFile("tmp:/scene.temp", "nowplaying") MoveFile("tmp:/scene.temp", "tmp:/scene") - else if m.global.audioPlayer.state = "finished" - m.global.audioPlayer.control = "play" + else if m.audioPlayer.state = "finished" + m.audioPlayer.control = "play" ' Write screen tracker for screensaver WriteAsciiFile("tmp:/scene.temp", "nowplaying") MoveFile("tmp:/scene.temp", "tmp:/scene") @@ -298,20 +296,19 @@ function playAction() as boolean end function function previousClicked() as boolean - currentQueuePosition = m.global.queueManager.callFunc("getPosition") - + currentQueuePosition = m.queueManager.callFunc("getPosition") if currentQueuePosition = 0 then return false if m.playlistTypeCount > 1 - previousItem = m.global.queueManager.callFunc("getItemByIndex", currentQueuePosition - 1) - previousItemType = m.global.queueManager.callFunc("getItemType", previousItem) + previousItem = m.queueManager.callFunc("getItemByIndex", currentQueuePosition - 1) + previousItemType = m.queueManager.callFunc("getItemType", previousItem) if previousItemType <> "audio" - m.global.audioPlayer.control = "stop" + m.audioPlayer.control = "stop" m.global.sceneManager.callFunc("clearPreviousScene") - m.global.queueManager.callFunc("moveBack") - m.global.queueManager.callFunc("playQueue") + m.queueManager.callFunc("moveBack") + m.queueManager.callFunc("playQueue") return true end if end if @@ -321,34 +318,33 @@ function previousClicked() as boolean m.lastRecordedPositionTimestamp = 0 m.positionTimestamp.text = "0:00" - if m.global.audioPlayer.state = "playing" - m.global.audioPlayer.control = "stop" + if m.audioPlayer.state = "playing" + m.audioPlayer.control = "stop" end if ' Reset loop mode due to manual user interaction - if m.global.audioPlayer.loopMode = "one" + if m.audioPlayer.loopMode = "one" resetLoopModeToDefault() end if - m.global.queueManager.callFunc("moveBack") + m.queueManager.callFunc("moveBack") pageContentChanged() return true end function sub resetLoopModeToDefault() - m.global.audioPlayer.loopMode = "" + m.audioPlayer.loopMode = "" setLoopButtonImage() end sub function loopClicked() as boolean - - if m.global.audioPlayer.loopMode = "" - m.global.audioPlayer.loopMode = "all" - else if m.global.audioPlayer.loopMode = "all" - m.global.audioPlayer.loopMode = "one" + if m.audioPlayer.loopMode = "" + m.audioPlayer.loopMode = "all" + else if m.audioPlayer.loopMode = "all" + m.audioPlayer.loopMode = "one" else - m.global.audioPlayer.loopMode = "" + m.audioPlayer.loopMode = "" end if setLoopButtonImage() @@ -357,10 +353,10 @@ function loopClicked() as boolean end function sub setLoopButtonImage() - if m.global.audioPlayer.loopMode = "all" + if m.audioPlayer.loopMode = "all" m.loopIndicator.opacity = "1" m.loopIndicator.uri = m.loopIndicator.uri.Replace("-off", "-on") - else if m.global.audioPlayer.loopMode = "one" + else if m.audioPlayer.loopMode = "one" m.loopIndicator.uri = m.loopIndicator.uri.Replace("-on", "1-on") else m.loopIndicator.uri = m.loopIndicator.uri.Replace("1-on", "-off") @@ -368,19 +364,20 @@ sub setLoopButtonImage() end sub function nextClicked() as boolean - if m.playlistTypeCount > 1 - currentQueuePosition = m.global.queueManager.callFunc("getPosition") - if currentQueuePosition < m.global.queueManager.callFunc("getCount") - 1 - nextItem = m.global.queueManager.callFunc("getItemByIndex", currentQueuePosition + 1) - nextItemType = m.global.queueManager.callFunc("getItemType", nextItem) + if m.playlistTypeCount > 1 + currentQueuePosition = m.queueManager.callFunc("getPosition") + if currentQueuePosition < m.queueManager.callFunc("getCount") - 1 + + nextItem = m.queueManager.callFunc("getItemByIndex", currentQueuePosition + 1) + nextItemType = m.queueManager.callFunc("getItemType", nextItem) if nextItemType <> "audio" - m.global.audioPlayer.control = "stop" + m.audioPlayer.control = "stop" m.global.sceneManager.callFunc("clearPreviousScene") - m.global.queueManager.callFunc("moveForward") - m.global.queueManager.callFunc("playQueue") + m.queueManager.callFunc("moveForward") + m.queueManager.callFunc("playQueue") return true end if end if @@ -392,11 +389,11 @@ function nextClicked() as boolean m.positionTimestamp.text = "0:00" ' Reset loop mode due to manual user interaction - if m.global.audioPlayer.loopMode = "one" + if m.audioPlayer.loopMode = "one" resetLoopModeToDefault() end if - if m.global.queueManager.callFunc("getPosition") < m.global.queueManager.callFunc("getCount") - 1 + if m.queueManager.callFunc("getPosition") < m.queueManager.callFunc("getCount") - 1 LoadNextSong() end if @@ -404,14 +401,14 @@ function nextClicked() as boolean end function sub toggleShuffleEnabled() - m.global.queueManager.callFunc("toggleShuffle") + m.queueManager.callFunc("toggleShuffle") end sub function findCurrentSongIndex(songList) as integer if not isValidAndNotEmpty(songList) then return 0 for i = 0 to songList.count() - 1 - if songList[i].id = m.global.queueManager.callFunc("getCurrentItem").id + if songList[i].id = m.queueManager.callFunc("getCurrentItem").id return i end if end for @@ -420,15 +417,14 @@ function findCurrentSongIndex(songList) as integer end function function shuffleClicked() as boolean - - currentSongIndex = findCurrentSongIndex(m.global.queueManager.callFunc("getUnshuffledQueue")) + currentSongIndex = findCurrentSongIndex(m.queueManager.callFunc("getUnshuffledQueue")) toggleShuffleEnabled() - if not m.global.queueManager.callFunc("getIsShuffled") + if not m.queueManager.callFunc("getIsShuffled") m.shuffleIndicator.opacity = ".4" m.shuffleIndicator.uri = m.shuffleIndicator.uri.Replace("-on", "-off") - m.global.queueManager.callFunc("setPosition", currentSongIndex) + m.queueManager.callFunc("setPosition", currentSongIndex) setTrackNumberDisplay() return true end if @@ -441,26 +437,26 @@ function shuffleClicked() as boolean end function sub setShuffleIconState() - if m.global.queueManager.callFunc("getIsShuffled") + if m.queueManager.callFunc("getIsShuffled") m.shuffleIndicator.opacity = "1" m.shuffleIndicator.uri = m.shuffleIndicator.uri.Replace("-off", "-on") end if end sub sub setTrackNumberDisplay() - setFieldTextValue("numberofsongs", "Track " + stri(m.global.queueManager.callFunc("getPosition") + 1) + "/" + stri(m.global.queueManager.callFunc("getCount"))) + setFieldTextValue("numberofsongs", "Track " + stri(m.queueManager.callFunc("getPosition") + 1) + "/" + stri(m.queueManager.callFunc("getCount"))) end sub sub LoadNextSong() - if m.global.audioPlayer.state = "playing" - m.global.audioPlayer.control = "stop" + if m.audioPlayer.state = "playing" + m.audioPlayer.control = "stop" end if exitScrubMode() ' Reset playPosition bar without animation m.playPosition.width = 0 - m.global.queueManager.callFunc("moveForward") + m.queueManager.callFunc("moveForward") pageContentChanged() end sub @@ -469,7 +465,7 @@ sub pageContentChanged() m.LoadAudioStreamTask.control = "STOP" - currentItem = m.global.queueManager.callFunc("getCurrentItem") + currentItem = m.queueManager.callFunc("getCurrentItem") m.LoadAudioStreamTask.itemId = currentItem.id m.LoadAudioStreamTask.observeField("content", "onAudioStreamLoaded") @@ -478,7 +474,7 @@ end sub ' If we have more and 1 song to play, fade in the next and previous controls sub loadButtons() - if m.global.queueManager.callFunc("getCount") > 1 + if m.queueManager.callFunc("getCount") > 1 m.shuffleIndicator.opacity = ".4" m.loopIndicator.opacity = ".4" m.displayButtonsAnimation.control = "start" @@ -495,7 +491,7 @@ sub onAudioStreamLoaded() m.bufferPosition.width = 0 useMetaTask = false - currentItem = m.global.queueManager.callFunc("getCurrentItem") + currentItem = m.queueManager.callFunc("getCurrentItem") if not isValid(currentItem.RunTimeTicks) useMetaTask = true @@ -531,9 +527,9 @@ sub onAudioStreamLoaded() m.totalLengthTimestamp.text = ticksToHuman(currentItem.RunTimeTicks) end if - m.global.audioPlayer.content = data - m.global.audioPlayer.control = "none" - m.global.audioPlayer.control = "play" + m.audioPlayer.content = data + m.audioPlayer.control = "none" + m.audioPlayer.control = "play" end if end sub @@ -739,7 +735,7 @@ function onKeyEvent(key as string, press as boolean) as boolean if m.inScrubMode startLoadingSpinner() m.inScrubMode = false - m.global.audioPlayer.seek = m.scrubTimestamp + m.audioPlayer.seek = m.scrubTimestamp return true end if @@ -773,15 +769,15 @@ function onKeyEvent(key as string, press as boolean) as boolean end if if key = "back" - m.global.audioPlayer.control = "stop" - m.global.audioPlayer.loopMode = "" + m.audioPlayer.control = "stop" + m.audioPlayer.loopMode = "" else if key = "rewind" return previousClicked() else if key = "fastforward" return nextClicked() else if key = "left" if m.buttons.hasFocus() - if m.global.queueManager.callFunc("getCount") = 1 then return false + if m.queueManager.callFunc("getCount") = 1 then return false if m.top.selectedButtonIndex > 0 m.previouslySelectedButtonIndex = m.top.selectedButtonIndex @@ -791,7 +787,7 @@ function onKeyEvent(key as string, press as boolean) as boolean end if else if key = "right" if m.buttons.hasFocus() - if m.global.queueManager.callFunc("getCount") = 1 then return false + if m.queueManager.callFunc("getCount") = 1 then return false m.previouslySelectedButtonIndex = m.top.selectedButtonIndex if m.top.selectedButtonIndex < m.buttonCount - 1 then m.top.selectedButtonIndex = m.top.selectedButtonIndex + 1 diff --git a/components/photos/PhotoDetails.bs b/components/photos/PhotoDetails.bs index 07d16f67..7e3571b2 100644 --- a/components/photos/PhotoDetails.bs +++ b/components/photos/PhotoDetails.bs @@ -10,8 +10,9 @@ sub init() m.textBackground = m.top.findNode("background") m.statusTimer = m.top.findNode("statusTimer") m.statusTimer.observeField("fire", "statusUpdate") - m.slideshow = m.global.session.user.settings["photos.slideshow"] - m.random = m.global.session.user.settings["photos.random"] + userSettings = m.global.session.user.settings + m.slideshow = userSettings["photos.slideshow"] + m.random = userSettings["photos.random"] m.showStatusAnimation = m.top.findNode("showStatusAnimation") m.hideStatusAnimation = m.top.findNode("hideStatusAnimation") diff --git a/components/settings/settings.bs b/components/settings/settings.bs index dec4b043..55239d77 100644 --- a/components/settings/settings.bs +++ b/components/settings/settings.bs @@ -91,26 +91,28 @@ sub settingFocused() m.integerSetting.visible = false m.radioSetting.visible = false + userSettings = m.global.session.user.settings + if selectedSetting.type = invalid return else if selectedSetting.type = "bool" m.boolSetting.visible = true - if m.global.session.user.settings[selectedSetting.settingName] = true + if userSettings[selectedSetting.settingName] = true m.boolSetting.checkedItem = 1 else m.boolSetting.checkedItem = 0 end if else if selectedSetting.type = "integer" - integerValue = m.global.session.user.settings[selectedSetting.settingName].ToStr() + integerValue = userSettings[selectedSetting.settingName].ToStr() if isValid(integerValue) m.integerSetting.text = integerValue end if m.integerSetting.visible = true else if LCase(selectedSetting.type) = "radio" - selectedValue = m.global.session.user.settings[selectedSetting.settingName] + selectedValue = userSettings[selectedSetting.settingName] radioContent = CreateObject("roSGNode", "ContentNode") @@ -173,7 +175,6 @@ sub boolSettingChanged() set_setting(selectedSetting.settingName, "true") ' setting specific triggers if selectedSetting.settingName = "global.rememberme" - print "m.global.session.user.id=", m.global.session.user.id set_setting("active_user", m.global.session.user.id) end if else diff --git a/components/tvshows/TVListDetails.bs b/components/tvshows/TVListDetails.bs index 986c73f2..5c72a513 100644 --- a/components/tvshows/TVListDetails.bs +++ b/components/tvshows/TVListDetails.bs @@ -21,6 +21,7 @@ end sub sub itemContentChanged() item = m.top.itemContent itemData = item.json + userSettings = m.global.session.user.settings ' Set default video source if user hasn't selected one yet if item.selectedVideoStreamId = "" and isValid(itemData.MediaSources) @@ -46,7 +47,7 @@ sub itemContentChanged() imageUrl = item.posterURL - if m.global.session.user.settings["ui.tvshows.blurunwatched"] = true + if userSettings["ui.tvshows.blurunwatched"] = true if itemData.lookup("Type") = "Episode" if not itemData.userdata.played imageUrl = imageUrl + "&blur=15" @@ -64,12 +65,12 @@ sub itemContentChanged() m.top.findNode("runtime").text = stri(runTime).trim() + " mins" end if - if m.global.session.user.settings["ui.design.hideclock"] <> true + if userSettings["ui.design.hideclock"] <> true m.top.findNode("endtime").text = tr("Ends at %1").Replace("%1", getEndTime()) end if end if - if m.global.session.user.settings["ui.tvshows.disableCommunityRating"] = false + if userSettings["ui.tvshows.disableCommunityRating"] = false if isValid(itemData.communityRating) m.top.findNode("star").visible = true m.top.findNode("communityRating").text = str(int(itemData.communityRating * 10) / 10) diff --git a/components/tvshows/TVShowDetails.bs b/components/tvshows/TVShowDetails.bs index 24184590..b460ad8f 100644 --- a/components/tvshows/TVShowDetails.bs +++ b/components/tvshows/TVShowDetails.bs @@ -181,8 +181,9 @@ end function sub onShuffleEpisodeDataLoaded() m.getShuffleEpisodesTask.unobserveField("data") - m.global.queueManager.callFunc("set", m.getShuffleEpisodesTask.data.items) - m.global.queueManager.callFunc("playQueue") + queueManager = m.global.queueManager + queueManager.callFunc("set", m.getShuffleEpisodesTask.data.items) + queueManager.callFunc("playQueue") end sub function onKeyEvent(key as string, press as boolean) as boolean diff --git a/components/video/OSD.bs b/components/video/OSD.bs index 4f687c7a..95928db4 100644 --- a/components/video/OSD.bs +++ b/components/video/OSD.bs @@ -35,7 +35,6 @@ sub init() m.optionControls.buttonFocused = m.optionControls.getChildCount() - 1 m.videoControls.getChild(m.defaultButtonIndex).focus = true - m.deviceInfo = CreateObject("roDeviceInfo") end sub ' onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param @@ -211,7 +210,8 @@ sub inactiveCheck() return end if - if m.deviceInfo.timeSinceLastKeypress() >= m.top.inactiveTimeout + deviceInfo = CreateObject("roDeviceInfo") + if deviceInfo.timeSinceLastKeypress() >= m.top.inactiveTimeout m.top.action = "hide" end if end sub diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index b662cfcf..0c881583 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -6,6 +6,7 @@ sub init() m.log = log.Logger("VideoPlayerView") ' Hide the overhang on init to prevent showing 2 clocks m.top.getScene().findNode("overhang").visible = false + userSettings = m.global.session.user.settings m.currentItem = m.global.queueManager.callFunc("getCurrentItem") m.top.id = m.currentItem.id @@ -45,7 +46,7 @@ sub init() m.top.transcodeReasons = [] m.bufferCheckTimer.duration = 30 - if m.global.session.user.settings["ui.design.hideclock"] = true + if userSettings["ui.design.hideclock"] = true clockNode = findNodeBySubtype(m.top, "clock") if clockNode[0] <> invalid then clockNode[0].parent.removeChild(clockNode[0].node) end if @@ -54,7 +55,7 @@ sub init() m.nextEpisodeButton = m.top.findNode("nextEpisode") m.nextEpisodeButton.text = tr("Next Episode") m.nextEpisodeButton.setFocus(false) - m.nextupbuttonseconds = m.global.session.user.settings["playback.nextupbuttonseconds"].ToInt() + m.nextupbuttonseconds = userSettings["playback.nextupbuttonseconds"].ToInt() m.showNextEpisodeButtonAnimation = m.top.findNode("showNextEpisodeButton") m.hideNextEpisodeButtonAnimation = m.top.findNode("hideNextEpisodeButton") @@ -99,24 +100,28 @@ end sub ' @param {string} action - skip action to take sub handleItemSkipAction(action as string) if action = "itemnext" + queueManager = m.global.queueManager + ' If there is something next in the queue, play it - if m.global.queueManager.callFunc("getPosition") < m.global.queueManager.callFunc("getCount") - 1 + if queueManager.callFunc("getPosition") < queueManager.callFunc("getCount") - 1 m.top.control = "stop" m.global.sceneManager.callFunc("clearPreviousScene") - m.global.queueManager.callFunc("moveForward") - m.global.queueManager.callFunc("playQueue") + queueManager.callFunc("moveForward") + queueManager.callFunc("playQueue") end if return end if if action = "itemback" + queueManager = m.global.queueManager + ' If there is something previous in the queue, play it - if m.global.queueManager.callFunc("getPosition") > 0 + if queueManager.callFunc("getPosition") > 0 m.top.control = "stop" m.global.sceneManager.callFunc("clearPreviousScene") - m.global.queueManager.callFunc("moveBack") - m.global.queueManager.callFunc("playQueue") + queueManager.callFunc("moveBack") + queueManager.callFunc("playQueue") end if return @@ -520,9 +525,9 @@ sub showNextEpisodeButton() 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? if m.nextEpisodeButton.opacity <> 0 then return - userSession = m.global.session.user - if userSession.settings["playback.playnextepisode"] = "disabled" then return - if userSession.settings["playback.playnextepisode"] = "webclient" and not userSession.Configuration.EnableNextEpisodeAutoPlay then return + userSettings = m.global.session.user.settings + if userSettings["playback.playnextepisode"] = "disabled" then return + if userSettings["playback.playnextepisode"] = "webclient" and not m.global.session.user.Configuration.EnableNextEpisodeAutoPlay then return m.nextEpisodeButton.visible = true m.showNextEpisodeButtonAnimation.control = "start" From 305419d38086b3f6b3247c2c10793b33e6ce4776 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Thu, 17 Oct 2024 16:18:03 +0000 Subject: [PATCH 099/141] Update API docs --- docs/api/source_Main.bs.html | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/api/source_Main.bs.html b/docs/api/source_Main.bs.html index 262592af..906dbc59 100644 --- a/docs/api/source_Main.bs.html +++ b/docs/api/source_Main.bs.html @@ -74,15 +74,18 @@ end if end if - ' has the current user ran this version before? - usersLastRunVersion = m.global.session.user.settings.lastRunVersion - if not isValid(usersLastRunVersion) or not versionChecker(m.global.session.user.settings.lastRunVersion, m.global.app.version) - set_user_setting("LastRunVersion", m.global.app.version) - ' show what's new popup - if m.global.session.user.settings["load.allowwhatsnew"] - dialog = createObject("roSGNode", "WhatsNewDialog") - m.scene.dialog = dialog - m.scene.dialog.observeField("buttonSelected", m.port) + ' only show whats new popup and update lastRunVersion on prod + if not m.global.app.isDev + ' has the current user ran this version before? + usersLastRunVersion = m.global.session.user.settings.lastRunVersion + if not isValid(usersLastRunVersion) or not versionChecker(usersLastRunVersion, m.global.app.version) + set_user_setting("LastRunVersion", m.global.app.version) + ' show what's new popup + if m.global.session.user.settings["load.allowwhatsnew"] + dialog = createObject("roSGNode", "WhatsNewDialog") + m.scene.dialog = dialog + m.scene.dialog.observeField("buttonSelected", m.port) + end if end if end if From 1fdcb6821abf91d1d3e5de88c4da386b9ca25b89 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Thu, 17 Oct 2024 17:10:18 +0000 Subject: [PATCH 100/141] Update API docs --- docs/api/components_ItemGrid_GridItem.bs.html | 10 +- docs/api/components_ItemGrid_ItemGrid.bs.html | 37 ++-- ...ents_ItemGrid_LoadVideoContentTask.bs.html | 43 +++-- ...mponents_ItemGrid_MovieLibraryView.bs.html | 20 ++- ...mponents_ItemGrid_MusicLibraryView.bs.html | 16 +- docs/api/components_JFVideo.bs.html | 5 +- docs/api/components_ListPoster.bs.html | 13 +- docs/api/components_WhatsNewDialog.bs.html | 5 +- docs/api/components_home_HomeItem.bs.html | 22 +-- docs/api/components_home_HomeRows.bs.html | 9 +- .../api/components_home_LoadItemsTask.bs.html | 5 +- .../components_manager_ViewCreator.bs.html | 39 +++-- .../components_movies_MovieDetails.bs.html | 7 +- .../components_music_AudioPlayerView.bs.html | 160 +++++++++--------- .../components_photos_PhotoDetails.bs.html | 5 +- docs/api/components_settings_settings.bs.html | 9 +- .../components_tvshows_TVListDetails.bs.html | 7 +- .../components_tvshows_TVShowDetails.bs.html | 6 +- docs/api/components_video_OSD.bs.html | 4 +- .../components_video_VideoPlayerView.bs.html | 27 +-- docs/api/data/search.json | 2 +- docs/api/module-AudioPlayerView.html | 2 +- 22 files changed, 243 insertions(+), 210 deletions(-) diff --git a/docs/api/components_ItemGrid_GridItem.bs.html b/docs/api/components_ItemGrid_GridItem.bs.html index 643d47c7..0a65ea0c 100644 --- a/docs/api/components_ItemGrid_GridItem.bs.html +++ b/docs/api/components_ItemGrid_GridItem.bs.html @@ -44,10 +44,10 @@ end sub sub itemContentChanged() m.backdrop.blendColor = "#00a4db" ' set default in case global var is invalid - localGlobal = m.global + myGlobal = m.global - if isValid(localGlobal) and isValid(localGlobal.constants) and isValid(localGlobal.constants.poster_bg_pallet) - posterBackgrounds = localGlobal.constants.poster_bg_pallet + if isValid(myGlobal) and isValid(myGlobal.constants) and isValid(myGlobal.constants.poster_bg_pallet) + posterBackgrounds = myGlobal.constants.poster_bg_pallet m.backdrop.blendColor = posterBackgrounds[rnd(posterBackgrounds.count()) - 1] end if @@ -64,8 +64,8 @@ sub itemContentChanged() m.itemIcon.uri = itemData.iconUrl m.itemText.text = itemData.Title else if itemData.type = "Series" - if isValid(localGlobal) and isValid(localGlobal.session) and isValid(localGlobal.session.user) and isValid(localGlobal.session.user.settings) - if localGlobal.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"] = false + if isValid(myGlobal) and isValid(myGlobal.session) and isValid(myGlobal.session.user) and isValid(myGlobal.session.user.settings) + if myGlobal.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"] = false if isValid(itemData.json) and isValid(itemData.json.UserData) and isValid(itemData.json.UserData.UnplayedItemCount) if itemData.json.UserData.UnplayedItemCount > 0 m.unplayedCount.visible = true diff --git a/docs/api/components_ItemGrid_ItemGrid.bs.html b/docs/api/components_ItemGrid_ItemGrid.bs.html index e5846f98..b863644d 100644 --- a/docs/api/components_ItemGrid_ItemGrid.bs.html +++ b/docs/api/components_ItemGrid_ItemGrid.bs.html @@ -9,9 +9,11 @@ import "pkg:/source/roku_modules/log/LogMixin.brs" sub init() m.log = log.Logger("ItemGrid") m.log.debug("start init()") + userSettings = m.global.session.user.settings + m.options = m.top.findNode("options") - m.showItemCount = m.global.session.user.settings["itemgrid.showItemCount"] + m.showItemCount = userSettings["itemgrid.showItemCount"] m.tvGuide = invalid m.channelFocused = invalid @@ -70,9 +72,9 @@ sub init() m.alphaMenu = m.alpha.findNode("alphaMenu") 'Get reset folder setting - m.resetGrid = m.global.session.user.settings["itemgrid.reset"] + m.resetGrid = userSettings["itemgrid.reset"] - m.top.gridTitles = m.global.session.user.settings["itemgrid.gridTitles"] + m.top.gridTitles = userSettings["itemgrid.gridTitles"] m.log.debug("end init()") end sub @@ -86,6 +88,7 @@ sub loadInitialItems() m.log.debug("start loadInitialItems()") m.loadItemsTask.control = "stop" startLoadingSpinner() + userSettings = m.global.session.user.settings if m.top.parentItem.json.Type = "CollectionFolder" 'or m.top.parentItem.json.Type = "Folder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -98,25 +101,25 @@ sub loadInitialItems() ' Read view/sort/filter settings if m.top.parentItem.collectionType = "livetv" ' Translate between app and server nomenclature - viewSetting = m.global.session.user.settings["display.livetv.landing"] + viewSetting = userSettings["display.livetv.landing"] if viewSetting = "guide" m.view = "tvGuide" else m.view = "livetv" end if - m.sortField = m.global.session.user.settings["display.livetv.sortField"] - sortAscendingStr = m.global.session.user.settings["display.livetv.sortAscending"] - m.filter = m.global.session.user.settings["display.livetv.filter"] + m.sortField = userSettings["display.livetv.sortField"] + sortAscendingStr = userSettings["display.livetv.sortAscending"] + m.filter = userSettings["display.livetv.filter"] else if m.top.parentItem.collectionType = "music" - m.view = m.global.session.user.settings["display.music.view"] - m.sortField = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortField"] - sortAscendingStr = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortAscending"] - m.filter = m.global.session.user.settings["display." + m.top.parentItem.Id + ".filter"] + m.view = userSettings["display.music.view"] + m.sortField = userSettings["display." + m.top.parentItem.Id + ".sortField"] + sortAscendingStr = userSettings["display." + m.top.parentItem.Id + ".sortAscending"] + m.filter = userSettings["display." + m.top.parentItem.Id + ".filter"] else - m.sortField = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortField"] - sortAscendingStr = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortAscending"] - m.filter = m.global.session.user.settings["display." + m.top.parentItem.Id + ".filter"] - m.view = m.global.session.user.settings["display." + m.top.parentItem.Id + ".landing"] + m.sortField = userSettings["display." + m.top.parentItem.Id + ".sortField"] + sortAscendingStr = userSettings["display." + m.top.parentItem.Id + ".sortAscending"] + m.filter = userSettings["display." + m.top.parentItem.Id + ".filter"] + m.view = userSettings["display." + m.top.parentItem.Id + ".landing"] end if if m.sortField = invalid @@ -182,7 +185,7 @@ sub loadInitialItems() m.loadItemsTask.itemType = "MusicArtist" m.loadItemsTask.itemId = m.top.parentItem.Id - m.view = m.global.session.user.settings["display.music.view"] + m.view = userSettings["display.music.view"] if m.view = "music-album" m.loadItemsTask.itemType = "MusicAlbum" @@ -193,7 +196,7 @@ sub loadInitialItems() ' For LiveTV, we want to "Fit" the item images, not zoom m.top.imageDisplayMode = "scaleToFit" - if m.global.session.user.settings["display.livetv.landing"] = "guide" and m.options.view <> "livetv" + if userSettings["display.livetv.landing"] = "guide" and m.options.view <> "livetv" showTvGuide() end if else if m.top.parentItem.collectionType = "CollectionFolder" or m.top.parentItem.type = "CollectionFolder" or m.top.parentItem.collectionType = "boxsets" or m.top.parentItem.Type = "Boxset" or m.top.parentItem.Type = "Boxsets" or m.top.parentItem.Type = "Folder" or m.top.parentItem.Type = "Channel" diff --git a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html index 5cdbd43a..001b828b 100644 --- a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html +++ b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html @@ -20,21 +20,23 @@ sub init() end sub sub loadItems() + queueManager = m.global.queueManager + ' Reset intro tracker in case task gets reused m.top.isIntro = false ' Only show preroll once per queue - if m.global.queueManager.callFunc("isPrerollActive") + if queueManager.callFunc("isPrerollActive") ' Prerolls not allowed if we're resuming video - if m.global.queueManager.callFunc("getCurrentItem").startingPoint = 0 + if queueManager.callFunc("getCurrentItem").startingPoint = 0 preRoll = GetIntroVideos(m.top.itemId) if isValid(preRoll) and preRoll.TotalRecordCount > 0 and isValid(preRoll.items[0]) ' If an error is thrown in the Intros plugin, instead of passing the error they pass the entire rick roll music video. ' Bypass the music video and treat it as an error message if lcase(preRoll.items[0].name) <> "rick roll'd" - m.global.queueManager.callFunc("push", m.global.queueManager.callFunc("getCurrentItem")) + queueManager.callFunc("push", queueManager.callFunc("getCurrentItem")) m.top.itemId = preRoll.items[0].id - m.global.queueManager.callFunc("setPrerollStatus", false) + queueManager.callFunc("setPrerollStatus", false) m.top.isIntro = true end if end if @@ -42,7 +44,7 @@ sub loadItems() end if if m.top.selectedAudioStreamIndex = 0 - currentItem = m.global.queueManager.callFunc("getCurrentItem") + currentItem = queueManager.callFunc("getCurrentItem") if isValid(currentItem) and isValid(currentItem.json) m.top.selectedAudioStreamIndex = FindPreferredAudioStream(currentItem.json.MediaStreams) end if @@ -80,6 +82,10 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s return end if + queueManager = m.global.queueManager + userSession = m.global.session.user + userSettings = userSession.settings + session.video.Update(meta) if isValid(meta.json.MediaSources[0].RunTimeTicks) @@ -134,15 +140,14 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s end if if LCase(m.top.itemType) = "episode" - userSession = m.global.session.user - if userSession.settings["playback.playnextepisode"] = "enabled" or userSession.settings["playback.playnextepisode"] = "webclient" and userSession.Configuration.EnableNextEpisodeAutoPlay + if userSettings["playback.playnextepisode"] = "enabled" or userSettings["playback.playnextepisode"] = "webclient" and userSession.Configuration.EnableNextEpisodeAutoPlay addNextEpisodesToQueue(video.showID) end if end if playbackPosition = 0! - currentItem = m.global.queueManager.callFunc("getCurrentItem") + currentItem = queueManager.callFunc("getCurrentItem") if isValid(currentItem) and isValid(currentItem.startingPoint) playbackPosition = currentItem.startingPoint @@ -222,8 +227,8 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s ' transcode is that the Encoding Level is not supported, then try to direct play but silently ' fall back to the transcode if that fails. if m.playbackInfo.MediaSources[0].MediaStreams.Count() > 0 and meta.live = false - tryDirectPlay = m.global.session.user.settings["playback.tryDirect.h264ProfileLevel"] and m.playbackInfo.MediaSources[0].MediaStreams[0].codec = "h264" - tryDirectPlay = tryDirectPlay or (m.global.session.user.settings["playback.tryDirect.hevcProfileLevel"] and m.playbackInfo.MediaSources[0].MediaStreams[0].codec = "hevc") + tryDirectPlay = userSettings["playback.tryDirect.h264ProfileLevel"] and m.playbackInfo.MediaSources[0].MediaStreams[0].codec = "h264" + tryDirectPlay = tryDirectPlay or (userSettings["playback.tryDirect.hevcProfileLevel"] and m.playbackInfo.MediaSources[0].MediaStreams[0].codec = "hevc") if tryDirectPlay and isValid(m.playbackInfo.MediaSources[0].TranscodingUrl) and forceTranscoding = false transcodingReasons = getTranscodeReasons(m.playbackInfo.MediaSources[0].TranscodingUrl) if transcodingReasons.Count() = 1 and transcodingReasons[0] = "VideoLevelNotSupported" @@ -263,7 +268,8 @@ end sub ' @param {dynamic} videoID - id of video user is playing ' @return {integer} indicating the default track's server-side index. Defaults to {SubtitleSelection.none} is one is not found function defaultSubtitleTrackFromVid(videoID) as integer - if m.global.session.user.configuration.SubtitleMode = "None" + userSession = m.global.session.user + if userSession.configuration.SubtitleMode = "None" return SubtitleSelection.none ' No subtitles desired: return none end if @@ -289,7 +295,7 @@ function defaultSubtitleTrackFromVid(videoID) as integer return defaultTextSubs end if - if not m.global.session.user.settings["playback.subs.onlytext"] + if not userSession.settings["playback.subs.onlytext"] return defaultSubtitleTrack(subtitles["all"], selectedAudioLanguage) ' if no appropriate text subs exist, allow non-text end if @@ -493,6 +499,8 @@ end function ' Add next episodes to the playback queue sub addNextEpisodesToQueue(showID) + queueManager = m.global.queueManager + ' Don't queue next episodes if we already have a playback queue maxQueueCount = 1 @@ -500,13 +508,13 @@ sub addNextEpisodesToQueue(showID) maxQueueCount = 2 end if - if m.global.queueManager.callFunc("getCount") > maxQueueCount then return + if queueManager.callFunc("getCount") > maxQueueCount then return videoID = m.top.itemId ' If first item is an intro video, use the next item in the queue if m.top.isIntro - currentVideo = m.global.queueManager.callFunc("getItemByIndex", 1) + currentVideo = queueManager.callFunc("getItemByIndex", 1) if isValid(currentVideo) and isValid(currentVideo.id) videoID = currentVideo.id @@ -528,7 +536,7 @@ sub addNextEpisodesToQueue(showID) if isValid(data) and data.Items.Count() > 1 for i = 1 to data.Items.Count() - 1 - m.global.queueManager.callFunc("push", data.Items[i]) + queueManager.callFunc("push", data.Items[i]) end for end if end sub @@ -587,8 +595,9 @@ function sortSubtitles(id as string, MediaStreams) end function function FindPreferredAudioStream(streams as dynamic) as integer - preferredLanguage = m.global.session.user.Configuration.AudioLanguagePreference - playDefault = m.global.session.user.Configuration.PlayDefaultAudioTrack + userConfig = m.global.session.user.configuration + preferredLanguage = userConfig.AudioLanguagePreference + playDefault = userConfig.PlayDefaultAudioTrack if playDefault <> invalid and playDefault = true return 1 diff --git a/docs/api/components_ItemGrid_MovieLibraryView.bs.html b/docs/api/components_ItemGrid_MovieLibraryView.bs.html index 4cb66371..edf4724c 100644 --- a/docs/api/components_ItemGrid_MovieLibraryView.bs.html +++ b/docs/api/components_ItemGrid_MovieLibraryView.bs.html @@ -32,6 +32,7 @@ end sub sub init() setupNodes() + userSettings = m.global.session.user.settings m.overhang.isVisible = false @@ -41,7 +42,7 @@ sub init() alphaMicText = m.alpha.findNode("alphaMicText") alphaMicText.visible = false - m.showItemCount = m.global.session.user.settings["itemgrid.showItemCount"] + m.showItemCount = userSettings["itemgrid.showItemCount"] m.swapAnimation.observeField("state", "swapDone") @@ -88,7 +89,7 @@ sub init() m.loadItemsTask.totalRecordCount = 0 'Get reset folder setting - m.resetGrid = m.global.session.user.settings["itemgrid.reset"] + m.resetGrid = userSettings["itemgrid.reset"] end sub sub OnScreenHidden() @@ -114,6 +115,7 @@ end sub sub loadInitialItems() m.loadItemsTask.control = "stop" startLoadingSpinner(false) + userSettings = m.global.session.user.settings if m.top.parentItem.json.Type = "CollectionFolder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -125,15 +127,15 @@ sub loadInitialItems() SetBackground("") end if - m.sortField = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortField"] - m.filter = m.global.session.user.settings["display." + m.top.parentItem.Id + ".filter"] - m.filterOptions = m.global.session.user.settings["display." + m.top.parentItem.Id + ".filterOptions"] - m.view = m.global.session.user.settings["display." + m.top.parentItem.Id + ".landing"] - m.sortAscending = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortAscending"] + m.sortField = userSettings["display." + m.top.parentItem.Id + ".sortField"] + m.filter = userSettings["display." + m.top.parentItem.Id + ".filter"] + m.filterOptions = userSettings["display." + m.top.parentItem.Id + ".filterOptions"] + m.view = userSettings["display." + m.top.parentItem.Id + ".landing"] + m.sortAscending = userSettings["display." + m.top.parentItem.Id + ".sortAscending"] ' If user has not set a preferred view for this folder, check if they've set a default view if not isValid(m.view) - m.view = m.global.session.user.settings["itemgrid.movieDefaultView"] + m.view = userSettings["itemgrid.movieDefaultView"] end if if not isValid(m.sortField) then m.sortField = "SortName" @@ -202,7 +204,7 @@ sub loadInitialItems() m.itemGrid.numRows = "3" m.selectedMovieOverview.visible = false m.infoGroup.visible = false - m.top.showItemTitles = m.global.session.user.settings["itemgrid.gridTitles"] + m.top.showItemTitles = userSettings["itemgrid.gridTitles"] if LCase(m.top.showItemTitles) = "hidealways" m.itemGrid.itemSize = "[230, 315]" m.itemGrid.rowHeights = "[315]" diff --git a/docs/api/components_ItemGrid_MusicLibraryView.bs.html b/docs/api/components_ItemGrid_MusicLibraryView.bs.html index 3d6ba65f..4248da5f 100644 --- a/docs/api/components_ItemGrid_MusicLibraryView.bs.html +++ b/docs/api/components_ItemGrid_MusicLibraryView.bs.html @@ -27,6 +27,7 @@ end sub sub init() setupNodes() + userSettings = m.global.session.user.settings m.overhang.isVisible = false @@ -36,7 +37,7 @@ sub init() alphaMicText = m.alpha.findNode("alphaMicText") alphaMicText.visible = false - m.showItemCount = m.global.session.user.settings["itemgrid.showItemCount"] + m.showItemCount = userSettings["itemgrid.showItemCount"] m.swapAnimation.observeField("state", "swapDone") @@ -82,7 +83,7 @@ sub init() m.loadItemsTask.totalRecordCount = 0 'Get reset folder setting - m.resetGrid = m.global.session.user.settings["itemgrid.reset"] + m.resetGrid = userSettings["itemgrid.reset"] end sub sub OnScreenHidden() @@ -108,6 +109,7 @@ end sub sub loadInitialItems() m.loadItemsTask.control = "stop" startLoadingSpinner(false) + userSettings = m.global.session.user.settings if LCase(m.top.parentItem.json.Type) = "collectionfolder" m.top.HomeLibraryItem = m.top.parentItem.Id @@ -119,17 +121,17 @@ sub loadInitialItems() SetBackground("") end if - m.sortField = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortField"] - m.sortAscending = m.global.session.user.settings["display." + m.top.parentItem.Id + ".sortAscending"] - m.filter = m.global.session.user.settings["display." + m.top.parentItem.Id + ".filter"] - m.view = m.global.session.user.settings["display." + m.top.parentItem.Id + ".landing"] + m.sortField = userSettings["display." + m.top.parentItem.Id + ".sortField"] + m.sortAscending = userSettings["display." + m.top.parentItem.Id + ".sortAscending"] + m.filter = userSettings["display." + m.top.parentItem.Id + ".filter"] + m.view = userSettings["display." + m.top.parentItem.Id + ".landing"] if not isValid(m.sortField) then m.sortField = "SortName" if not isValid(m.filter) then m.filter = "All" if not isValid(m.view) then m.view = "ArtistsPresentation" if not isValid(m.sortAscending) then m.sortAscending = true - m.top.showItemTitles = m.global.session.user.settings["itemgrid.gridTitles"] + m.top.showItemTitles = userSettings["itemgrid.gridTitles"] if LCase(m.top.parentItem.json.type) = "musicgenre" m.itemGrid.translation = "[96, 60]" diff --git a/docs/api/components_JFVideo.bs.html b/docs/api/components_JFVideo.bs.html index 0d4421bd..9bf94e16 100644 --- a/docs/api/components_JFVideo.bs.html +++ b/docs/api/components_JFVideo.bs.html @@ -15,7 +15,8 @@ sub init() m.top.transcodeReasons = [] m.bufferCheckTimer.duration = 30 - if m.global.session.user.settings["ui.design.hideclock"] = true + userSettings = m.global.session.user.settings + if userSettings["ui.design.hideclock"] clockNode = findNodeBySubtype(m.top, "clock") if clockNode[0] <> invalid then clockNode[0].parent.removeChild(clockNode[0].node) end if @@ -24,7 +25,7 @@ sub init() m.nextEpisodeButton = m.top.findNode("nextEpisode") m.nextEpisodeButton.text = tr("Next Episode") m.nextEpisodeButton.setFocus(false) - m.nextupbuttonseconds = m.global.session.user.settings["playback.nextupbuttonseconds"].ToInt() + m.nextupbuttonseconds = userSettings["playback.nextupbuttonseconds"].ToInt() m.showNextEpisodeButtonAnimation = m.top.findNode("showNextEpisodeButton") m.hideNextEpisodeButtonAnimation = m.top.findNode("hideNextEpisodeButton") diff --git a/docs/api/components_ListPoster.bs.html b/docs/api/components_ListPoster.bs.html index 36555868..d53de911 100644 --- a/docs/api/components_ListPoster.bs.html +++ b/docs/api/components_ListPoster.bs.html @@ -19,10 +19,10 @@ sub init() ' Randomize the background colors backdropColor = "#00a4db" ' set default in case global var is invalid - localGlobal = m.global + myGlobal = m.global - if isValid(localGlobal) and isValid(localGlobal.constants) and isValid(localGlobal.constants.poster_bg_pallet) - posterBackgrounds = localGlobal.constants.poster_bg_pallet + if isValid(myGlobal) and isValid(myGlobal.constants) and isValid(myGlobal.constants.poster_bg_pallet) + posterBackgrounds = myGlobal.constants.poster_bg_pallet backdropColor = posterBackgrounds[rnd(posterBackgrounds.count()) - 1] end if @@ -67,8 +67,9 @@ sub itemContentChanged() as void m.poster = m.top.findNode("poster") itemData = m.top.itemContent m.title.text = itemData.title + userSettings = m.global.session.user.settings - if m.global.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"] = false + if not userSettings["ui.tvshows.disableUnwatchedEpisodeCount"] if isValid(itemData.json.UserData) and isValid(itemData.json.UserData.UnplayedItemCount) if itemData.json.UserData.UnplayedItemCount > 0 m.unplayedCount.visible = true @@ -96,7 +97,7 @@ sub itemContentChanged() as void imageUrl = itemData.posterURL - if m.global.session.user.settings["ui.tvshows.blurunwatched"] = true + if userSettings["ui.tvshows.blurunwatched"] if itemData.json.lookup("Type") = "Episode" and isValid(itemData.json.userdata) if not itemData.json.userdata.played imageUrl = imageUrl + "&blur=15" @@ -118,7 +119,7 @@ sub focusChanged() m.staticTitle.visible = false m.title.visible = true ' text to speech for accessibility - if m.global.device.isAudioGuideEnabled = true + if m.global.device.isAudioGuideEnabled txt2Speech = CreateObject("roTextToSpeech") txt2Speech.Flush() txt2Speech.Say(m.title.text) diff --git a/docs/api/components_WhatsNewDialog.bs.html b/docs/api/components_WhatsNewDialog.bs.html index 88bc37ff..d395cd4f 100644 --- a/docs/api/components_WhatsNewDialog.bs.html +++ b/docs/api/components_WhatsNewDialog.bs.html @@ -2,12 +2,13 @@
On this page

components_WhatsNewDialog.bs

sub init()
     m.content = m.top.findNode("content")
+    appVersion = m.global.app.version
 
     setPalette()
 
     m.top.id = "OKDialog"
     m.top.height = 900
-    m.top.title = tr("Welcome to version") + " " + m.global.app.version
+    m.top.title = tr("Welcome to version") + " " + appVersion
     m.top.buttons = [tr("OK")]
 
     dialogStyles = {
@@ -29,7 +30,7 @@
 
     textLine = m.content.CreateChild("StdDlgMultiStyleTextItem")
     textLine.drawingStyles = dialogStyles
-    textLine.text = tr("To view a complete list of changes visit") + " <url>https://github.com/jellyfin/jellyfin-roku/releases/tag/v" + m.global.app.version + "</url>"
+    textLine.text = tr("To view a complete list of changes visit") + " <url>https://github.com/jellyfin/jellyfin-roku/releases/tag/v" + appVersion + "</url>"
 end sub
 
 sub setPalette()
diff --git a/docs/api/components_home_HomeItem.bs.html b/docs/api/components_home_HomeItem.bs.html
index 29b0cc5d..6f28722e 100644
--- a/docs/api/components_home_HomeItem.bs.html
+++ b/docs/api/components_home_HomeItem.bs.html
@@ -24,10 +24,10 @@ sub init()
 
     ' Randomize the background colors
     backdropColor = "#00a4db" ' set default in case global var is invalid
-    localGlobal = m.global
+    myGlobal = m.global
 
-    if isValid(localGlobal) and isValid(localGlobal.constants) and isValid(localGlobal.constants.poster_bg_pallet)
-        posterBackgrounds = localGlobal.constants.poster_bg_pallet
+    if isValid(myGlobal) and isValid(myGlobal.constants) and isValid(myGlobal.constants.poster_bg_pallet)
+        posterBackgrounds = myGlobal.constants.poster_bg_pallet
         backdropColor = posterBackgrounds[rnd(posterBackgrounds.count()) - 1]
     end if
 
@@ -64,7 +64,7 @@ sub itemContentChanged()
     if isValid(m.unplayedCount) then m.unplayedCount.visible = false
     itemData = m.top.itemContent
     if itemData = invalid then return
-    localGlobal = m.global
+    userSettings = m.global.session.user.settings
 
     itemData.Title = itemData.name ' Temporarily required while we move from "HomeItem" to "JFContentItem"
 
@@ -81,9 +81,9 @@ sub itemContentChanged()
     m.itemTextExtra.width = itemData.imageWidth
     m.itemTextExtra.visible = true
     m.itemTextExtra.text = ""
-
     m.backdrop.width = itemData.imageWidth
 
+
     if isValid(itemData.iconUrl)
         m.itemIcon.uri = itemData.iconUrl
     end if
@@ -94,8 +94,8 @@ sub itemContentChanged()
         m.playedIndicator.visible = false
 
         if LCase(itemData.type) = "series"
-            if isValid(localGlobal) and isValid(localGlobal.session) and isValid(localGlobal.session.user) and isValid(localGlobal.session.user.settings)
-                unwatchedEpisodeCountSetting = localGlobal.session.user.settings["ui.tvshows.disableUnwatchedEpisodeCount"]
+            if isValid(userSettings)
+                unwatchedEpisodeCountSetting = userSettings["ui.tvshows.disableUnwatchedEpisodeCount"]
                 if isValid(unwatchedEpisodeCountSetting) and not unwatchedEpisodeCountSetting
                     if isValid(itemData.json.UserData) and isValid(itemData.json.UserData.UnplayedItemCount)
                         if itemData.json.UserData.UnplayedItemCount > 0
@@ -166,16 +166,16 @@ sub itemContentChanged()
             drawProgressBar(itemData)
         end if
 
-        if localGlobal.session.user.settings["ui.general.episodeimagesnextup"] = "webclient"
-            tmpSetting = localGlobal.session.user.Configuration.useEpisodeImagesInNextUpAndResume
+        if userSettings["ui.general.episodeimagesnextup"] = "webclient"
+            tmpSetting = m.global.session.user.Configuration.useEpisodeImagesInNextUpAndResume
             if isValid(tmpSetting) and tmpSetting
                 m.itemPoster.uri = itemData.thumbnailURL
             else
                 m.itemPoster.uri = itemData.widePosterURL
             end if
-        else if localGlobal.session.user.settings["ui.general.episodeimagesnextup"] = "show"
+        else if userSettings["ui.general.episodeimagesnextup"] = "show"
             m.itemPoster.uri = itemData.widePosterURL
-        else if localGlobal.session.user.settings["ui.general.episodeimagesnextup"] = "episode"
+        else if userSettings["ui.general.episodeimagesnextup"] = "episode"
             m.itemPoster.uri = itemData.thumbnailURL
         end if
 
diff --git a/docs/api/components_home_HomeRows.bs.html b/docs/api/components_home_HomeRows.bs.html
index 56c4041f..27e236fd 100644
--- a/docs/api/components_home_HomeRows.bs.html
+++ b/docs/api/components_home_HomeRows.bs.html
@@ -78,10 +78,11 @@ sub processUserSections()
     m.processedRowCount = 0
 
     sessionUser = m.global.session.user
+    userSettings = sessionUser.settings
 
     ' calculate expected row count by processing homesections
     for i = 0 to 6
-        userSection = sessionUser.settings["homesection" + i.toStr()]
+        userSection = userSettings["homesection" + i.toStr()]
         sectionName = userSection ?? "none"
         sectionName = LCase(sectionName)
 
@@ -101,7 +102,7 @@ sub processUserSections()
     ' Add home sections in order based on user settings
     loadedSections = 0
     for i = 0 to 6
-        userSection = sessionUser.settings["homesection" + i.toStr()]
+        userSection = userSettings["homesection" + i.toStr()]
         sectionName = userSection ?? "none"
         sectionName = LCase(sectionName)
 
@@ -151,10 +152,10 @@ function getOriginalSectionIndex(sectionName as string) as integer
     sectionIndex = 0
     indexLatestMediaSection = 0
 
-    sessionUser = m.global.session.user
+    userSettings = m.global.session.user.settings
 
     for i = 0 to 6
-        userSection = sessionUser.settings["homesection" + i.toStr()]
+        userSection = userSettings["homesection" + i.toStr()]
         settingSectionName = userSection ?? "none"
         settingSectionName = LCase(settingSectionName)
 
diff --git a/docs/api/components_home_LoadItemsTask.bs.html b/docs/api/components_home_LoadItemsTask.bs.html
index adc69bf3..3e7c3324 100644
--- a/docs/api/components_home_LoadItemsTask.bs.html
+++ b/docs/api/components_home_LoadItemsTask.bs.html
@@ -62,6 +62,7 @@ sub loadItems()
 
         ' Load Next Up
     else if m.top.itemsToLoad = "nextUp"
+        userSettings = m.global.session.user.settings
 
         url = "Shows/NextUp"
         params = {}
@@ -70,12 +71,12 @@ sub loadItems()
         params["SortOrder"] = "Descending"
         params["ImageTypeLimit"] = 1
         params["UserId"] = m.global.session.user.id
-        params["EnableRewatching"] = m.global.session.user.settings["ui.details.enablerewatchingnextup"]
+        params["EnableRewatching"] = userSettings["ui.details.enablerewatchingnextup"]
         params["DisableFirstEpisode"] = false
         params["limit"] = 24
         params["EnableTotalRecordCount"] = false
 
-        maxDaysInNextUp = m.global.session.user.settings["ui.details.maxdaysnextup"].ToInt()
+        maxDaysInNextUp = userSettings["ui.details.maxdaysnextup"].ToInt()
         if isValid(maxDaysInNextUp)
             if maxDaysInNextUp > 0
                 dateToday = CreateObject("roDateTime")
diff --git a/docs/api/components_manager_ViewCreator.bs.html b/docs/api/components_manager_ViewCreator.bs.html
index cb6d2471..b6e875e3 100644
--- a/docs/api/components_manager_ViewCreator.bs.html
+++ b/docs/api/components_manager_ViewCreator.bs.html
@@ -60,9 +60,9 @@ sub onSelectAudioPressed()
 
         audioData.data.push(audioStreamItem)
     end for
-
-    m.global.sceneManager.callFunc("radioDialog", tr("Select Audio"), audioData)
-    m.global.sceneManager.observeField("returnData", "onSelectionMade")
+    sceneManager = m.global.sceneManager
+    sceneManager.callFunc("radioDialog", tr("Select Audio"), audioData)
+    sceneManager.observeField("returnData", "onSelectionMade")
 end sub
 
 ' User requested subtitle selection popup
@@ -112,23 +112,25 @@ sub onSelectSubtitlePressed()
         "Type": "subtitleselection"
     })
 
-    m.global.sceneManager.callFunc("radioDialog", tr("Select Subtitles"), subtitleData)
-    m.global.sceneManager.observeField("returnData", "onSelectionMade")
+    sceneManager = m.global.sceneManager
+    sceneManager.callFunc("radioDialog", tr("Select Subtitles"), subtitleData)
+    sceneManager.observeField("returnData", "onSelectionMade")
 end sub
 
 ' User has selected something from the radioDialog popup
 sub onSelectionMade()
-    m.global.sceneManager.unobserveField("returnData")
+    sceneManager = m.global.sceneManager
+    sceneManager.unobserveField("returnData")
 
-    if not isValid(m.global.sceneManager.returnData) then return
-    if not isValid(m.global.sceneManager.returnData.type) then return
+    if not isValid(sceneManager.returnData) then return
+    if not isValid(sceneManager.returnData.type) then return
 
-    if LCase(m.global.sceneManager.returnData.type) = "subtitleselection"
+    if LCase(sceneManager.returnData.type) = "subtitleselection"
         processSubtitleSelection()
         return
     end if
 
-    if LCase(m.global.sceneManager.returnData.type) = "audioselection"
+    if LCase(sceneManager.returnData.type) = "audioselection"
         processAudioSelection()
         return
     end if
@@ -218,21 +220,24 @@ end sub
 ' Playback state change event handlers
 sub onStateChange()
     if LCase(m.view.state) = "finished"
+        sceneManager = m.global.sceneManager
+        queueManager = m.global.queueManager
+
         ' Close any open dialogs
-        if m.global.sceneManager.callFunc("isDialogOpen")
-            m.global.sceneManager.callFunc("dismissDialog")
+        if sceneManager.callFunc("isDialogOpen")
+            sceneManager.callFunc("dismissDialog")
         end if
 
         ' If there is something next in the queue, play it
-        if m.global.queueManager.callFunc("getPosition") < m.global.queueManager.callFunc("getCount") - 1
-            m.global.sceneManager.callFunc("clearPreviousScene")
-            m.global.queueManager.callFunc("moveForward")
-            m.global.queueManager.callFunc("playQueue")
+        if queueManager.callFunc("getPosition") < queueManager.callFunc("getCount") - 1
+            sceneManager.callFunc("clearPreviousScene")
+            queueManager.callFunc("moveForward")
+            queueManager.callFunc("playQueue")
             return
         end if
 
         ' Playback completed, return user to previous screen
-        m.global.sceneManager.callFunc("popScene")
+        sceneManager.callFunc("popScene")
         m.global.audioPlayer.loopMode = ""
     end if
 end sub
diff --git a/docs/api/components_movies_MovieDetails.bs.html b/docs/api/components_movies_MovieDetails.bs.html
index 51de14bd..811f5bdb 100644
--- a/docs/api/components_movies_MovieDetails.bs.html
+++ b/docs/api/components_movies_MovieDetails.bs.html
@@ -99,6 +99,7 @@ sub itemContentChanged()
     ' Updates video metadata
     item = m.top.itemContent
     if isValid(item) and isValid(item.json)
+        userSettings = m.global.session.user.settings
         itemData = item.json
         m.top.id = itemData.id
         m.top.findNode("moviePoster").uri = m.top.itemContent.posterURL
@@ -122,7 +123,7 @@ sub itemContentChanged()
             m.infoGroup.removeChild(m.top.findNode("officialRating"))
         end if
 
-        if m.global.session.user.settings["ui.movies.showRatings"]
+        if userSettings["ui.movies.showRatings"]
             if isValid(itemData.communityRating)
                 setFieldText("communityRating", int(itemData.communityRating * 10) / 10)
             else
@@ -147,7 +148,7 @@ sub itemContentChanged()
 
         if type(itemData.RunTimeTicks) = "LongInteger"
             setFieldText("runtime", stri(getRuntime()) + " mins")
-            if m.global.session.user.settings["ui.design.hideclock"] <> true
+            if userSettings["ui.design.hideclock"] <> true
                 setFieldText("ends-at", tr("Ends at %1").Replace("%1", getEndTime()))
             end if
         end if
@@ -175,7 +176,7 @@ sub itemContentChanged()
             m.top.findNode("details").removeChild(m.top.findNode("director"))
         end if
 
-        if m.global.session.user.settings["ui.details.hidetagline"] = false
+        if userSettings["ui.details.hidetagline"] = false
             if itemData.taglines.count() > 0
                 setFieldText("tagline", itemData.taglines[0])
             end if
diff --git a/docs/api/components_music_AudioPlayerView.bs.html b/docs/api/components_music_AudioPlayerView.bs.html
index 08ac4b59..5197d8d1 100644
--- a/docs/api/components_music_AudioPlayerView.bs.html
+++ b/docs/api/components_music_AudioPlayerView.bs.html
@@ -11,9 +11,14 @@ sub init()
     m.lastRecordedPositionTimestamp = 0
     m.scrubTimestamp = -1
 
-    m.playlistTypeCount = m.global.queueManager.callFunc("getQueueUniqueTypes").count()
+    m.queueManager = m.global.queueManager
+    m.playlistTypeCount = m.queueManager.callFunc("getQueueUniqueTypes").count()
+
+    m.audioPlayer = m.global.audioPlayer
+    m.audioPlayer.observeField("state", "audioStateChanged")
+    m.audioPlayer.observeField("position", "audioPositionChanged")
+    m.audioPlayer.observeField("bufferingStatus", "bufferPositionChanged")
 
-    setupAudioNode()
     setupAnimationTasks()
     setupButtons()
     setupInfoNodes()
@@ -93,13 +98,6 @@ sub setupDataTasks()
     m.LoadScreenSaverTimeoutTask = CreateObject("roSGNode", "LoadScreenSaverTimeoutTask")
 end sub
 
-' Creates audio node used to play song(s)
-sub setupAudioNode()
-    m.global.audioPlayer.observeField("state", "audioStateChanged")
-    m.global.audioPlayer.observeField("position", "audioPositionChanged")
-    m.global.audioPlayer.observeField("bufferingStatus", "bufferPositionChanged")
-end sub
-
 ' Setup playback buttons, default to Play button selected
 sub setupButtons()
     m.buttons = m.top.findNode("buttons")
@@ -151,10 +149,10 @@ end sub
 sub bufferPositionChanged()
     if m.inScrubMode then return
 
-    if not isValid(m.global.audioPlayer.bufferingStatus)
+    if not isValid(m.audioPlayer.bufferingStatus)
         bufferPositionBarWidth = m.seekBar.width
     else
-        bufferPositionBarWidth = m.seekBar.width * m.global.audioPlayer.bufferingStatus.percentage
+        bufferPositionBarWidth = m.seekBar.width * m.audioPlayer.bufferingStatus.percentage
     end if
 
     ' Ensure position bar is never wider than the seek bar
@@ -170,16 +168,16 @@ end sub
 sub audioPositionChanged()
     stopLoadingSpinner()
 
-    if m.global.audioPlayer.position = 0
+    if m.audioPlayer.position = 0
         m.playPosition.width = 0
     end if
 
-    if not isValid(m.global.audioPlayer.position)
+    if not isValid(m.audioPlayer.position)
         playPositionBarWidth = 0
     else if not isValid(m.songDuration)
         playPositionBarWidth = 0
     else
-        songPercentComplete = m.global.audioPlayer.position / m.songDuration
+        songPercentComplete = m.audioPlayer.position / m.songDuration
         playPositionBarWidth = m.seekBar.width * songPercentComplete
     end if
 
@@ -191,7 +189,7 @@ sub audioPositionChanged()
     if not m.inScrubMode
         moveSeekbarThumb(playPositionBarWidth)
         ' Change the seek position timestamp
-        m.seekTimestamp.text = secondsToHuman(m.global.audioPlayer.position, false)
+        m.seekTimestamp.text = secondsToHuman(m.audioPlayer.position, false)
     end if
 
     ' Use animation to make the display smooth
@@ -199,9 +197,9 @@ sub audioPositionChanged()
     m.playPositionAnimation.control = "start"
 
     ' Update displayed position timestamp
-    if isValid(m.global.audioPlayer.position)
-        m.lastRecordedPositionTimestamp = m.global.audioPlayer.position
-        m.positionTimestamp.text = secondsToHuman(m.global.audioPlayer.position, false)
+    if isValid(m.audioPlayer.position)
+        m.lastRecordedPositionTimestamp = m.audioPlayer.position
+        m.positionTimestamp.text = secondsToHuman(m.audioPlayer.position, false)
     else
         m.lastRecordedPositionTimestamp = 0
         m.positionTimestamp.text = "0:00"
@@ -249,25 +247,24 @@ sub endScreenSaver()
 end sub
 
 sub audioStateChanged()
-
     ' Song Finished, attempt to move to next song
-    if m.global.audioPlayer.state = "finished"
+    if m.audioPlayer.state = "finished"
         ' User has enabled single song loop, play current song again
-        if m.global.audioPlayer.loopMode = "one"
+        if m.audioPlayer.loopMode = "one"
             m.scrubTimestamp = -1
             playAction()
             exitScrubMode()
             return
         end if
 
-        if m.global.queueManager.callFunc("getPosition") < m.global.queueManager.callFunc("getCount") - 1
+        if m.queueManager.callFunc("getPosition") < m.queueManager.callFunc("getCount") - 1
             m.top.state = "finished"
         else
             ' We are at the end of the song queue
 
             ' User has enabled loop for entire song queue, move back to first song
-            if m.global.audioPlayer.loopMode = "all"
-                m.global.queueManager.callFunc("setPosition", -1)
+            if m.audioPlayer.loopMode = "all"
+                m.queueManager.callFunc("setPosition", -1)
                 LoadNextSong()
                 return
             end if
@@ -279,18 +276,19 @@ sub audioStateChanged()
 end sub
 
 function playAction() as boolean
-    if m.global.audioPlayer.state = "playing"
-        m.global.audioPlayer.control = "pause"
+
+    if m.audioPlayer.state = "playing"
+        m.audioPlayer.control = "pause"
         ' Allow screen to go to real screensaver
         WriteAsciiFile("tmp:/scene.temp", "nowplaying-paused")
         MoveFile("tmp:/scene.temp", "tmp:/scene")
-    else if m.global.audioPlayer.state = "paused"
-        m.global.audioPlayer.control = "resume"
+    else if m.audioPlayer.state = "paused"
+        m.audioPlayer.control = "resume"
         ' Write screen tracker for screensaver
         WriteAsciiFile("tmp:/scene.temp", "nowplaying")
         MoveFile("tmp:/scene.temp", "tmp:/scene")
-    else if m.global.audioPlayer.state = "finished"
-        m.global.audioPlayer.control = "play"
+    else if m.audioPlayer.state = "finished"
+        m.audioPlayer.control = "play"
         ' Write screen tracker for screensaver
         WriteAsciiFile("tmp:/scene.temp", "nowplaying")
         MoveFile("tmp:/scene.temp", "tmp:/scene")
@@ -300,20 +298,19 @@ function playAction() as boolean
 end function
 
 function previousClicked() as boolean
-    currentQueuePosition = m.global.queueManager.callFunc("getPosition")
-
+    currentQueuePosition = m.queueManager.callFunc("getPosition")
     if currentQueuePosition = 0 then return false
 
     if m.playlistTypeCount > 1
-        previousItem = m.global.queueManager.callFunc("getItemByIndex", currentQueuePosition - 1)
-        previousItemType = m.global.queueManager.callFunc("getItemType", previousItem)
+        previousItem = m.queueManager.callFunc("getItemByIndex", currentQueuePosition - 1)
+        previousItemType = m.queueManager.callFunc("getItemType", previousItem)
 
         if previousItemType <> "audio"
-            m.global.audioPlayer.control = "stop"
+            m.audioPlayer.control = "stop"
 
             m.global.sceneManager.callFunc("clearPreviousScene")
-            m.global.queueManager.callFunc("moveBack")
-            m.global.queueManager.callFunc("playQueue")
+            m.queueManager.callFunc("moveBack")
+            m.queueManager.callFunc("playQueue")
             return true
         end if
     end if
@@ -323,34 +320,33 @@ function previousClicked() as boolean
     m.lastRecordedPositionTimestamp = 0
     m.positionTimestamp.text = "0:00"
 
-    if m.global.audioPlayer.state = "playing"
-        m.global.audioPlayer.control = "stop"
+    if m.audioPlayer.state = "playing"
+        m.audioPlayer.control = "stop"
     end if
 
     ' Reset loop mode due to manual user interaction
-    if m.global.audioPlayer.loopMode = "one"
+    if m.audioPlayer.loopMode = "one"
         resetLoopModeToDefault()
     end if
 
-    m.global.queueManager.callFunc("moveBack")
+    m.queueManager.callFunc("moveBack")
     pageContentChanged()
 
     return true
 end function
 
 sub resetLoopModeToDefault()
-    m.global.audioPlayer.loopMode = ""
+    m.audioPlayer.loopMode = ""
     setLoopButtonImage()
 end sub
 
 function loopClicked() as boolean
-
-    if m.global.audioPlayer.loopMode = ""
-        m.global.audioPlayer.loopMode = "all"
-    else if m.global.audioPlayer.loopMode = "all"
-        m.global.audioPlayer.loopMode = "one"
+    if m.audioPlayer.loopMode = ""
+        m.audioPlayer.loopMode = "all"
+    else if m.audioPlayer.loopMode = "all"
+        m.audioPlayer.loopMode = "one"
     else
-        m.global.audioPlayer.loopMode = ""
+        m.audioPlayer.loopMode = ""
     end if
 
     setLoopButtonImage()
@@ -359,10 +355,10 @@ function loopClicked() as boolean
 end function
 
 sub setLoopButtonImage()
-    if m.global.audioPlayer.loopMode = "all"
+    if m.audioPlayer.loopMode = "all"
         m.loopIndicator.opacity = "1"
         m.loopIndicator.uri = m.loopIndicator.uri.Replace("-off", "-on")
-    else if m.global.audioPlayer.loopMode = "one"
+    else if m.audioPlayer.loopMode = "one"
         m.loopIndicator.uri = m.loopIndicator.uri.Replace("-on", "1-on")
     else
         m.loopIndicator.uri = m.loopIndicator.uri.Replace("1-on", "-off")
@@ -370,19 +366,20 @@ sub setLoopButtonImage()
 end sub
 
 function nextClicked() as boolean
-    if m.playlistTypeCount > 1
-        currentQueuePosition = m.global.queueManager.callFunc("getPosition")
-        if currentQueuePosition < m.global.queueManager.callFunc("getCount") - 1
 
-            nextItem = m.global.queueManager.callFunc("getItemByIndex", currentQueuePosition + 1)
-            nextItemType = m.global.queueManager.callFunc("getItemType", nextItem)
+    if m.playlistTypeCount > 1
+        currentQueuePosition = m.queueManager.callFunc("getPosition")
+        if currentQueuePosition < m.queueManager.callFunc("getCount") - 1
+
+            nextItem = m.queueManager.callFunc("getItemByIndex", currentQueuePosition + 1)
+            nextItemType = m.queueManager.callFunc("getItemType", nextItem)
 
             if nextItemType <> "audio"
-                m.global.audioPlayer.control = "stop"
+                m.audioPlayer.control = "stop"
 
                 m.global.sceneManager.callFunc("clearPreviousScene")
-                m.global.queueManager.callFunc("moveForward")
-                m.global.queueManager.callFunc("playQueue")
+                m.queueManager.callFunc("moveForward")
+                m.queueManager.callFunc("playQueue")
                 return true
             end if
         end if
@@ -394,11 +391,11 @@ function nextClicked() as boolean
     m.positionTimestamp.text = "0:00"
 
     ' Reset loop mode due to manual user interaction
-    if m.global.audioPlayer.loopMode = "one"
+    if m.audioPlayer.loopMode = "one"
         resetLoopModeToDefault()
     end if
 
-    if m.global.queueManager.callFunc("getPosition") < m.global.queueManager.callFunc("getCount") - 1
+    if m.queueManager.callFunc("getPosition") < m.queueManager.callFunc("getCount") - 1
         LoadNextSong()
     end if
 
@@ -406,14 +403,14 @@ function nextClicked() as boolean
 end function
 
 sub toggleShuffleEnabled()
-    m.global.queueManager.callFunc("toggleShuffle")
+    m.queueManager.callFunc("toggleShuffle")
 end sub
 
 function findCurrentSongIndex(songList) as integer
     if not isValidAndNotEmpty(songList) then return 0
 
     for i = 0 to songList.count() - 1
-        if songList[i].id = m.global.queueManager.callFunc("getCurrentItem").id
+        if songList[i].id = m.queueManager.callFunc("getCurrentItem").id
             return i
         end if
     end for
@@ -422,15 +419,14 @@ function findCurrentSongIndex(songList) as integer
 end function
 
 function shuffleClicked() as boolean
-
-    currentSongIndex = findCurrentSongIndex(m.global.queueManager.callFunc("getUnshuffledQueue"))
+    currentSongIndex = findCurrentSongIndex(m.queueManager.callFunc("getUnshuffledQueue"))
 
     toggleShuffleEnabled()
 
-    if not m.global.queueManager.callFunc("getIsShuffled")
+    if not m.queueManager.callFunc("getIsShuffled")
         m.shuffleIndicator.opacity = ".4"
         m.shuffleIndicator.uri = m.shuffleIndicator.uri.Replace("-on", "-off")
-        m.global.queueManager.callFunc("setPosition", currentSongIndex)
+        m.queueManager.callFunc("setPosition", currentSongIndex)
         setTrackNumberDisplay()
         return true
     end if
@@ -443,26 +439,26 @@ function shuffleClicked() as boolean
 end function
 
 sub setShuffleIconState()
-    if m.global.queueManager.callFunc("getIsShuffled")
+    if m.queueManager.callFunc("getIsShuffled")
         m.shuffleIndicator.opacity = "1"
         m.shuffleIndicator.uri = m.shuffleIndicator.uri.Replace("-off", "-on")
     end if
 end sub
 
 sub setTrackNumberDisplay()
-    setFieldTextValue("numberofsongs", "Track " + stri(m.global.queueManager.callFunc("getPosition") + 1) + "/" + stri(m.global.queueManager.callFunc("getCount")))
+    setFieldTextValue("numberofsongs", "Track " + stri(m.queueManager.callFunc("getPosition") + 1) + "/" + stri(m.queueManager.callFunc("getCount")))
 end sub
 
 sub LoadNextSong()
-    if m.global.audioPlayer.state = "playing"
-        m.global.audioPlayer.control = "stop"
+    if m.audioPlayer.state = "playing"
+        m.audioPlayer.control = "stop"
     end if
 
     exitScrubMode()
 
     ' Reset playPosition bar without animation
     m.playPosition.width = 0
-    m.global.queueManager.callFunc("moveForward")
+    m.queueManager.callFunc("moveForward")
     pageContentChanged()
 end sub
 
@@ -471,7 +467,7 @@ sub pageContentChanged()
 
     m.LoadAudioStreamTask.control = "STOP"
 
-    currentItem = m.global.queueManager.callFunc("getCurrentItem")
+    currentItem = m.queueManager.callFunc("getCurrentItem")
 
     m.LoadAudioStreamTask.itemId = currentItem.id
     m.LoadAudioStreamTask.observeField("content", "onAudioStreamLoaded")
@@ -480,7 +476,7 @@ end sub
 
 ' If we have more and 1 song to play, fade in the next and previous controls
 sub loadButtons()
-    if m.global.queueManager.callFunc("getCount") > 1
+    if m.queueManager.callFunc("getCount") > 1
         m.shuffleIndicator.opacity = ".4"
         m.loopIndicator.opacity = ".4"
         m.displayButtonsAnimation.control = "start"
@@ -497,7 +493,7 @@ sub onAudioStreamLoaded()
         m.bufferPosition.width = 0
 
         useMetaTask = false
-        currentItem = m.global.queueManager.callFunc("getCurrentItem")
+        currentItem = m.queueManager.callFunc("getCurrentItem")
 
         if not isValid(currentItem.RunTimeTicks)
             useMetaTask = true
@@ -533,9 +529,9 @@ sub onAudioStreamLoaded()
             m.totalLengthTimestamp.text = ticksToHuman(currentItem.RunTimeTicks)
         end if
 
-        m.global.audioPlayer.content = data
-        m.global.audioPlayer.control = "none"
-        m.global.audioPlayer.control = "play"
+        m.audioPlayer.content = data
+        m.audioPlayer.control = "none"
+        m.audioPlayer.control = "play"
     end if
 end sub
 
@@ -741,7 +737,7 @@ function onKeyEvent(key as string, press as boolean) as boolean
                 if m.inScrubMode
                     startLoadingSpinner()
                     m.inScrubMode = false
-                    m.global.audioPlayer.seek = m.scrubTimestamp
+                    m.audioPlayer.seek = m.scrubTimestamp
                     return true
                 end if
 
@@ -775,15 +771,15 @@ function onKeyEvent(key as string, press as boolean) as boolean
         end if
 
         if key = "back"
-            m.global.audioPlayer.control = "stop"
-            m.global.audioPlayer.loopMode = ""
+            m.audioPlayer.control = "stop"
+            m.audioPlayer.loopMode = ""
         else if key = "rewind"
             return previousClicked()
         else if key = "fastforward"
             return nextClicked()
         else if key = "left"
             if m.buttons.hasFocus()
-                if m.global.queueManager.callFunc("getCount") = 1 then return false
+                if m.queueManager.callFunc("getCount") = 1 then return false
 
                 if m.top.selectedButtonIndex > 0
                     m.previouslySelectedButtonIndex = m.top.selectedButtonIndex
@@ -793,7 +789,7 @@ function onKeyEvent(key as string, press as boolean) as boolean
             end if
         else if key = "right"
             if m.buttons.hasFocus()
-                if m.global.queueManager.callFunc("getCount") = 1 then return false
+                if m.queueManager.callFunc("getCount") = 1 then return false
 
                 m.previouslySelectedButtonIndex = m.top.selectedButtonIndex
                 if m.top.selectedButtonIndex < m.buttonCount - 1 then m.top.selectedButtonIndex = m.top.selectedButtonIndex + 1
diff --git a/docs/api/components_photos_PhotoDetails.bs.html b/docs/api/components_photos_PhotoDetails.bs.html
index 4d8061cb..ad5f58b1 100644
--- a/docs/api/components_photos_PhotoDetails.bs.html
+++ b/docs/api/components_photos_PhotoDetails.bs.html
@@ -12,8 +12,9 @@ sub init()
     m.textBackground = m.top.findNode("background")
     m.statusTimer = m.top.findNode("statusTimer")
     m.statusTimer.observeField("fire", "statusUpdate")
-    m.slideshow = m.global.session.user.settings["photos.slideshow"]
-    m.random = m.global.session.user.settings["photos.random"]
+    userSettings = m.global.session.user.settings
+    m.slideshow = userSettings["photos.slideshow"]
+    m.random = userSettings["photos.random"]
 
     m.showStatusAnimation = m.top.findNode("showStatusAnimation")
     m.hideStatusAnimation = m.top.findNode("hideStatusAnimation")
diff --git a/docs/api/components_settings_settings.bs.html b/docs/api/components_settings_settings.bs.html
index c5f73fd1..363d8d16 100644
--- a/docs/api/components_settings_settings.bs.html
+++ b/docs/api/components_settings_settings.bs.html
@@ -93,26 +93,28 @@ sub settingFocused()
     m.integerSetting.visible = false
     m.radioSetting.visible = false
 
+    userSettings = m.global.session.user.settings
+
     if selectedSetting.type = invalid
         return
     else if selectedSetting.type = "bool"
 
         m.boolSetting.visible = true
 
-        if m.global.session.user.settings[selectedSetting.settingName] = true
+        if userSettings[selectedSetting.settingName] = true
             m.boolSetting.checkedItem = 1
         else
             m.boolSetting.checkedItem = 0
         end if
     else if selectedSetting.type = "integer"
-        integerValue = m.global.session.user.settings[selectedSetting.settingName].ToStr()
+        integerValue = userSettings[selectedSetting.settingName].ToStr()
         if isValid(integerValue)
             m.integerSetting.text = integerValue
         end if
         m.integerSetting.visible = true
     else if LCase(selectedSetting.type) = "radio"
 
-        selectedValue = m.global.session.user.settings[selectedSetting.settingName]
+        selectedValue = userSettings[selectedSetting.settingName]
 
         radioContent = CreateObject("roSGNode", "ContentNode")
 
@@ -175,7 +177,6 @@ sub boolSettingChanged()
             set_setting(selectedSetting.settingName, "true")
             ' setting specific triggers
             if selectedSetting.settingName = "global.rememberme"
-                print "m.global.session.user.id=", m.global.session.user.id
                 set_setting("active_user", m.global.session.user.id)
             end if
         else
diff --git a/docs/api/components_tvshows_TVListDetails.bs.html b/docs/api/components_tvshows_TVListDetails.bs.html
index fe072452..2d3179c4 100644
--- a/docs/api/components_tvshows_TVListDetails.bs.html
+++ b/docs/api/components_tvshows_TVListDetails.bs.html
@@ -23,6 +23,7 @@ end sub
 sub itemContentChanged()
     item = m.top.itemContent
     itemData = item.json
+    userSettings = m.global.session.user.settings
 
     ' Set default video source if user hasn't selected one yet
     if item.selectedVideoStreamId = "" and isValid(itemData.MediaSources)
@@ -50,7 +51,7 @@ sub itemContentChanged()
 
     imageUrl = item.posterURL
 
-    if m.global.session.user.settings["ui.tvshows.blurunwatched"] = true
+    if userSettings["ui.tvshows.blurunwatched"] = true
         if itemData.lookup("Type") = "Episode"
             if not itemData.userdata.played
                 imageUrl = imageUrl + "&blur=15"
@@ -68,12 +69,12 @@ sub itemContentChanged()
             m.top.findNode("runtime").text = stri(runTime).trim() + " mins"
         end if
 
-        if m.global.session.user.settings["ui.design.hideclock"] <> true
+        if userSettings["ui.design.hideclock"] <> true
             m.top.findNode("endtime").text = tr("Ends at %1").Replace("%1", getEndTime())
         end if
     end if
 
-    if m.global.session.user.settings["ui.tvshows.disableCommunityRating"] = false
+    if userSettings["ui.tvshows.disableCommunityRating"] = false
         if isValid(itemData.communityRating)
             m.top.findNode("star").visible = true
             m.top.findNode("communityRating").text = str(int(itemData.communityRating * 10) / 10)
diff --git a/docs/api/components_tvshows_TVShowDetails.bs.html b/docs/api/components_tvshows_TVShowDetails.bs.html
index 0a24faa8..b7c86b67 100644
--- a/docs/api/components_tvshows_TVShowDetails.bs.html
+++ b/docs/api/components_tvshows_TVShowDetails.bs.html
@@ -183,9 +183,11 @@ end function
 
 sub onShuffleEpisodeDataLoaded()
     m.getShuffleEpisodesTask.unobserveField("data")
+
     if isValid(m.getShuffleEpisodesTask.data)
-        m.global.queueManager.callFunc("set", m.getShuffleEpisodesTask.data.items)
-        m.global.queueManager.callFunc("playQueue")
+        queueManager = m.global.queueManager
+        queueManager.callFunc("set", m.getShuffleEpisodesTask.data.items)
+        queueManager.callFunc("playQueue")
     end if
 end sub
 
diff --git a/docs/api/components_video_OSD.bs.html b/docs/api/components_video_OSD.bs.html
index 1be0385a..bf9d239d 100644
--- a/docs/api/components_video_OSD.bs.html
+++ b/docs/api/components_video_OSD.bs.html
@@ -37,7 +37,6 @@ sub init()
     m.optionControls.buttonFocused = m.optionControls.getChildCount() - 1
 
     m.videoControls.getChild(m.defaultButtonIndex).focus = true
-    m.deviceInfo = CreateObject("roDeviceInfo")
 end sub
 
 ' onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param
@@ -213,7 +212,8 @@ sub inactiveCheck()
         return
     end if
 
-    if m.deviceInfo.timeSinceLastKeypress() >= m.top.inactiveTimeout
+    deviceInfo = CreateObject("roDeviceInfo")
+    if deviceInfo.timeSinceLastKeypress() >= m.top.inactiveTimeout
         m.top.action = "hide"
     end if
 end sub
diff --git a/docs/api/components_video_VideoPlayerView.bs.html b/docs/api/components_video_VideoPlayerView.bs.html
index aac9affd..54fd53c4 100644
--- a/docs/api/components_video_VideoPlayerView.bs.html
+++ b/docs/api/components_video_VideoPlayerView.bs.html
@@ -9,6 +9,7 @@ sub init()
     m.log = log.Logger("VideoPlayerView")
     ' Hide the overhang on init to prevent showing 2 clocks
     m.top.getScene().findNode("overhang").visible = false
+    userSettings = m.global.session.user.settings
     m.currentItem = m.global.queueManager.callFunc("getCurrentItem")
 
     m.top.id = m.currentItem.id
@@ -48,7 +49,7 @@ sub init()
     m.top.transcodeReasons = []
     m.bufferCheckTimer.duration = 30
 
-    if m.global.session.user.settings["ui.design.hideclock"] = true
+    if userSettings["ui.design.hideclock"] = true
         clockNode = findNodeBySubtype(m.top, "clock")
         if clockNode[0] <> invalid then clockNode[0].parent.removeChild(clockNode[0].node)
     end if
@@ -57,7 +58,7 @@ sub init()
     m.nextEpisodeButton = m.top.findNode("nextEpisode")
     m.nextEpisodeButton.text = tr("Next Episode")
     m.nextEpisodeButton.setFocus(false)
-    m.nextupbuttonseconds = m.global.session.user.settings["playback.nextupbuttonseconds"].ToInt()
+    m.nextupbuttonseconds = userSettings["playback.nextupbuttonseconds"].ToInt()
 
     m.showNextEpisodeButtonAnimation = m.top.findNode("showNextEpisodeButton")
     m.hideNextEpisodeButtonAnimation = m.top.findNode("hideNextEpisodeButton")
@@ -102,26 +103,30 @@ end sub
 ' @param {string} action - skip action to take
 sub handleItemSkipAction(action as string)
     if action = "itemnext"
+        queueManager = m.global.queueManager
+
         ' If there is something next in the queue, play it
-        if m.global.queueManager.callFunc("getPosition") < m.global.queueManager.callFunc("getCount") - 1
+        if queueManager.callFunc("getPosition") < queueManager.callFunc("getCount") - 1
             m.top.control = "stop"
             session.video.Delete()
             m.global.sceneManager.callFunc("clearPreviousScene")
-            m.global.queueManager.callFunc("moveForward")
-            m.global.queueManager.callFunc("playQueue")
+            queueManager.callFunc("moveForward")
+            queueManager.callFunc("playQueue")
         end if
 
         return
     end if
 
     if action = "itemback"
+        queueManager = m.global.queueManager
+
         ' If there is something previous in the queue, play it
-        if m.global.queueManager.callFunc("getPosition") > 0
+        if queueManager.callFunc("getPosition") > 0
             m.top.control = "stop"
             session.video.Delete()
             m.global.sceneManager.callFunc("clearPreviousScene")
-            m.global.queueManager.callFunc("moveBack")
-            m.global.queueManager.callFunc("playQueue")
+            queueManager.callFunc("moveBack")
+            queueManager.callFunc("playQueue")
         end if
 
         return
@@ -525,9 +530,9 @@ sub showNextEpisodeButton()
     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?
     if m.nextEpisodeButton.opacity <> 0 then return
-    userSession = m.global.session.user
-    if userSession.settings["playback.playnextepisode"] = "disabled" then return
-    if userSession.settings["playback.playnextepisode"] = "webclient" and not userSession.Configuration.EnableNextEpisodeAutoPlay then return
+    userSettings = m.global.session.user.settings
+    if userSettings["playback.playnextepisode"] = "disabled" then return
+    if userSettings["playback.playnextepisode"] = "webclient" and not m.global.session.user.Configuration.EnableNextEpisodeAutoPlay then return
 
     m.nextEpisodeButton.visible = true
     m.showNextEpisodeButtonAnimation.control = "start"
diff --git a/docs/api/data/search.json b/docs/api/data/search.json
index 6984a8ba..04a9b281 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.exitScrubMode","link":"exitScrubMode","description":"

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

"},{"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.moveSeekbarThumb","link":"moveSeekbarThumb","description":"

moveSeekbarThumb: Positions the thumb on the seekbar

"},{"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.processScrubAction","link":"processScrubAction","description":"

processScrubAction: Handles +/- seeking for the audio trickplay bar

"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.resetSeekbarThumb","link":"resetSeekbarThumb","description":"

resetSeekbarThumb: Resets the thumb to the playing position

"},{"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.setSelectedButtonState","link":"setSelectedButtonState","description":"

setSelectedButtonState: Changes the icon state url for the currently selected button

"},{"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.ClockFormat","link":"ClockFormat","description":"

Possible clock formats

"},{"title":"module:Clock.ClockFormat.h12","link":"h12"},{"title":"module:Clock.ClockFormat.h24","link":"h24"},{"title":"module:Clock.format12HourTime","link":"format12HourTime","description":"

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

"},{"title":"module:Clock.format24HourTime","link":"format24HourTime","description":"

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

"},{"title":"module:Clock.formatTimeAsString","link":"formatTimeAsString","description":"

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour 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.initName","link":"initName"},{"title":"module:ExtrasItem.initPosterImg","link":"initPosterImg"},{"title":"module:ExtrasItem.initRole","link":"initRole"},{"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.initTitle","link":"initTitle"},{"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.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook called when the screen is hidden by the screen manager

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

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.initBackdrop","link":"initBackdrop"},{"title":"module:HomeItem.initItemIcon","link":"initItemIcon"},{"title":"module:HomeItem.initItemPoster","link":"initItemPoster"},{"title":"module:HomeItem.initItemText","link":"initItemText"},{"title":"module:HomeItem.initItemTextExtra","link":"initItemTextExtra"},{"title":"module:HomeItem.initPlayedIndicator","link":"initPlayedIndicator"},{"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.LOADING_WAIT_TIME","link":"LOADING_WAIT_TIME"},{"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.alphaActiveChanged","link":"alphaActiveChanged"},{"title":"module:ItemGrid.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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:JFContentItem","link":"JFContentItem"},{"title":"module:JFContentItem.setFields","link":"setFields","description":"

Called whenever m.top.json changes.\nIt is expected that each node that extends JFContentItem will override this function

"},{"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.isLogoVisibleChange","link":"isLogoVisibleChange","description":"

component boolean field isLogoVisibleChange has changed value

"},{"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.SubtitleSelection","link":"SubtitleSelection"},{"title":"module:LoadVideoContentTask.SubtitleSelection.none","link":"none"},{"title":"module:LoadVideoContentTask.SubtitleSelection.notset","link":"notset"},{"title":"module:LoadVideoContentTask.addAudioStreamsToVideo","link":"addAudioStreamsToVideo","description":"

addAudioStreamsToVideo: Add audio stream data to video

"},{"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.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

defaultSubtitleTrack:

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

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook.

"},{"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","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.onMoviePosterSwapAnimationStateChange","link":"onMoviePosterSwapAnimationStateChange","description":"

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

"},{"title":"module:MovieDetails.onNewPosterImageURIChange","link":"onNewPosterImageURIChange","description":"

onNewPosterImageURIChange: Handler for newPosterImageURI param change

"},{"title":"module:MovieDetails.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.LOGO_RIGHT_PADDING","link":"LOGO_RIGHT_PADDING"},{"title":"module:OSD.OPTIONCONTROLS_TOP_PADDING","link":"OPTIONCONTROLS_TOP_PADDING"},{"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.moveOptionControls","link":"moveOptionControls","description":"

moveOptionControls: Moves option controls node based on passed pixel values

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

onButtonSelected: Handler for selection of buttons from the menu.

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

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

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

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

"},{"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.onLogoImageChanged","link":"onLogoImageChanged","description":"

onLogoImageChanged: Handler for changes to m.top.logoImage param.

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

onLogoLoadStatusChanged: Handler for changes to logo image's status.

"},{"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.onSeasonNumberChanged","link":"onSeasonNumberChanged","description":"

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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","description":"

getItemType: Returns the media type of the passed item

"},{"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:RecordingData","link":"RecordingData"},{"title":"module:RecordingData.setFields","link":"setFields"},{"title":"module:RecordingData.setPoster","link":"setPoster"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

"},{"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.handleItemSkipAction","link":"handleItemSkipAction","description":"

handleItemSkipAction: Handles user command to skip items

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

handleShowAudioMenuAction: Handles action to show audio selection 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.onAudioIndexChange","link":"onAudioIndexChange","description":"

Event handler for when audioIndex changes

"},{"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"},{"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.onSelectAudioPressed","link":"onSelectAudioPressed","description":"

onSelectAudioPressed: Display audio selection dialog

"},{"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.processAudioSelection","link":"processAudioSelection","description":"

processAudioSelection: Audio track selection handler

"},{"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"},{"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.canPlay4k","link":"canPlay4k","description":"

does the connected display support playing 4k video?

"},{"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"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.CLIENT_VERSION_REQUIRING_BASE_MIGRATION","link":"CLIENT_VERSION_REQUIRING_BASE_MIGRATION"},{"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.createLogoPoster","link":"createLogoPoster","description":"

Create and return a Jellyfin logo poster node

"},{"title":"module:misc.createOverhangUser","link":"createOverhangUser"},{"title":"module:misc.createSeperator","link":"createSeperator","description":"

Create and return a rectangle node used as a seperator in the overhang

"},{"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.isAllValid","link":"isAllValid","description":"

Returns whether or not all items in passed array are valid

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

isChainValid: Returns whether or not all the properties in the passed property chain are valid.\nStops evaluating at first found false value

"},{"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.toBoolean","link":"toBoolean","description":"

convert value to boolean and return value

"},{"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: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"},{"title":"quickplay","link":"quickplay"},{"title":"quickplay.album","link":"album","description":"

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

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

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

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

A single audio file.

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

A boxset.\nPlay all items inside.

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

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

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

Quick Play A folder.\nShuffle play all items found

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

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

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

A single music video file.

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

Quick Play A Person.\nShuffle play all videos found

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

A single photo.

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

A photo album.

"},{"title":"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":"quickplay.program","link":"program","description":"

Quick Play A Live Program

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

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

"},{"title":"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":"quickplay.series","link":"series","description":"

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

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

Quick Play A TVChannel

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

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

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

A single video file.

"},{"title":"quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"}]} \ 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.exitScrubMode","link":"exitScrubMode","description":"

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

"},{"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.moveSeekbarThumb","link":"moveSeekbarThumb","description":"

moveSeekbarThumb: Positions the thumb on the seekbar

"},{"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.processScrubAction","link":"processScrubAction","description":"

processScrubAction: Handles +/- seeking for the audio trickplay bar

"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.resetSeekbarThumb","link":"resetSeekbarThumb","description":"

resetSeekbarThumb: Resets the thumb to the playing position

"},{"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.setSelectedButtonState","link":"setSelectedButtonState","description":"

setSelectedButtonState: Changes the icon state url for the currently selected button

"},{"title":"module:AudioPlayerView.setShuffleIconState","link":"setShuffleIconState"},{"title":"module:AudioPlayerView.setTrackNumberDisplay","link":"setTrackNumberDisplay"},{"title":"module:AudioPlayerView.setupAnimationTasks","link":"setupAnimationTasks"},{"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.ClockFormat","link":"ClockFormat","description":"

Possible clock formats

"},{"title":"module:Clock.ClockFormat.h12","link":"h12"},{"title":"module:Clock.ClockFormat.h24","link":"h24"},{"title":"module:Clock.format12HourTime","link":"format12HourTime","description":"

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

"},{"title":"module:Clock.format24HourTime","link":"format24HourTime","description":"

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

"},{"title":"module:Clock.formatTimeAsString","link":"formatTimeAsString","description":"

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour 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.initName","link":"initName"},{"title":"module:ExtrasItem.initPosterImg","link":"initPosterImg"},{"title":"module:ExtrasItem.initRole","link":"initRole"},{"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.initTitle","link":"initTitle"},{"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.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook called when the screen is hidden by the screen manager

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

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.initBackdrop","link":"initBackdrop"},{"title":"module:HomeItem.initItemIcon","link":"initItemIcon"},{"title":"module:HomeItem.initItemPoster","link":"initItemPoster"},{"title":"module:HomeItem.initItemText","link":"initItemText"},{"title":"module:HomeItem.initItemTextExtra","link":"initItemTextExtra"},{"title":"module:HomeItem.initPlayedIndicator","link":"initPlayedIndicator"},{"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.LOADING_WAIT_TIME","link":"LOADING_WAIT_TIME"},{"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.alphaActiveChanged","link":"alphaActiveChanged"},{"title":"module:ItemGrid.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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:JFContentItem","link":"JFContentItem"},{"title":"module:JFContentItem.setFields","link":"setFields","description":"

Called whenever m.top.json changes.\nIt is expected that each node that extends JFContentItem will override this function

"},{"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.isLogoVisibleChange","link":"isLogoVisibleChange","description":"

component boolean field isLogoVisibleChange has changed value

"},{"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.SubtitleSelection","link":"SubtitleSelection"},{"title":"module:LoadVideoContentTask.SubtitleSelection.none","link":"none"},{"title":"module:LoadVideoContentTask.SubtitleSelection.notset","link":"notset"},{"title":"module:LoadVideoContentTask.addAudioStreamsToVideo","link":"addAudioStreamsToVideo","description":"

addAudioStreamsToVideo: Add audio stream data to video

"},{"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.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

defaultSubtitleTrack:

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

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook.

"},{"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","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.onMoviePosterSwapAnimationStateChange","link":"onMoviePosterSwapAnimationStateChange","description":"

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

"},{"title":"module:MovieDetails.onNewPosterImageURIChange","link":"onNewPosterImageURIChange","description":"

onNewPosterImageURIChange: Handler for newPosterImageURI param change

"},{"title":"module:MovieDetails.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.LOGO_RIGHT_PADDING","link":"LOGO_RIGHT_PADDING"},{"title":"module:OSD.OPTIONCONTROLS_TOP_PADDING","link":"OPTIONCONTROLS_TOP_PADDING"},{"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.moveOptionControls","link":"moveOptionControls","description":"

moveOptionControls: Moves option controls node based on passed pixel values

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

onButtonSelected: Handler for selection of buttons from the menu.

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

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

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

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

"},{"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.onLogoImageChanged","link":"onLogoImageChanged","description":"

onLogoImageChanged: Handler for changes to m.top.logoImage param.

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

onLogoLoadStatusChanged: Handler for changes to logo image's status.

"},{"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.onSeasonNumberChanged","link":"onSeasonNumberChanged","description":"

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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","description":"

getItemType: Returns the media type of the passed item

"},{"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:RecordingData","link":"RecordingData"},{"title":"module:RecordingData.setFields","link":"setFields"},{"title":"module:RecordingData.setPoster","link":"setPoster"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

"},{"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.handleItemSkipAction","link":"handleItemSkipAction","description":"

handleItemSkipAction: Handles user command to skip items

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

handleShowAudioMenuAction: Handles action to show audio selection 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.onAudioIndexChange","link":"onAudioIndexChange","description":"

Event handler for when audioIndex changes

"},{"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"},{"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.onSelectAudioPressed","link":"onSelectAudioPressed","description":"

onSelectAudioPressed: Display audio selection dialog

"},{"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.processAudioSelection","link":"processAudioSelection","description":"

processAudioSelection: Audio track selection handler

"},{"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"},{"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.canPlay4k","link":"canPlay4k","description":"

does the connected display support playing 4k video?

"},{"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"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.CLIENT_VERSION_REQUIRING_BASE_MIGRATION","link":"CLIENT_VERSION_REQUIRING_BASE_MIGRATION"},{"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.createLogoPoster","link":"createLogoPoster","description":"

Create and return a Jellyfin logo poster node

"},{"title":"module:misc.createOverhangUser","link":"createOverhangUser"},{"title":"module:misc.createSeperator","link":"createSeperator","description":"

Create and return a rectangle node used as a seperator in the overhang

"},{"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.isAllValid","link":"isAllValid","description":"

Returns whether or not all items in passed array are valid

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

isChainValid: Returns whether or not all the properties in the passed property chain are valid.\nStops evaluating at first found false value

"},{"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.toBoolean","link":"toBoolean","description":"

convert value to boolean and return value

"},{"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: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"},{"title":"quickplay","link":"quickplay"},{"title":"quickplay.album","link":"album","description":"

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

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

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

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

A single audio file.

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

A boxset.\nPlay all items inside.

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

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

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

Quick Play A folder.\nShuffle play all items found

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

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

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

A single music video file.

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

Quick Play A Person.\nShuffle play all videos found

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

A single photo.

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

A photo album.

"},{"title":"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":"quickplay.program","link":"program","description":"

Quick Play A Live Program

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

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

"},{"title":"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":"quickplay.series","link":"series","description":"

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

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

Quick Play A TVChannel

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

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

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

A single video file.

"},{"title":"quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"}]} \ No newline at end of file diff --git a/docs/api/module-AudioPlayerView.html b/docs/api/module-AudioPlayerView.html index c0978831..9fc8ab3b 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) exitScrubMode() → {void}

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

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) moveSeekbarThumb(playPositionBarWidth) → {void}

moveSeekbarThumb: Positions the thumb on the seekbar

Parameters:
NameTypeDescription
playPositionBarWidthfloat

width of the play position bar

Returns:
Type: 
void

(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) processScrubAction(seekStep) → {void}

processScrubAction: Handles +/- seeking for the audio trickplay bar

Parameters:
NameTypeDescription
seekStepinteger

seconds to move the trickplay position (negative values allowed)

Returns:
Type: 
void

(static) resetLoopModeToDefault() → {void}

Returns:
Type: 
void

(static) resetSeekbarThumb() → {void}

resetSeekbarThumb: Resets the thumb to the playing position

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) setSelectedButtonState(oldState, newState) → {void}

setSelectedButtonState: Changes the icon state url for the currently selected button

Parameters:
NameTypeDescription
oldStatestring

current state to replace in icon url

newStatestring

state to replace {oldState} with in icon url

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) exitScrubMode() → {void}

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

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) moveSeekbarThumb(playPositionBarWidth) → {void}

moveSeekbarThumb: Positions the thumb on the seekbar

Parameters:
NameTypeDescription
playPositionBarWidthfloat

width of the play position bar

Returns:
Type: 
void

(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) processScrubAction(seekStep) → {void}

processScrubAction: Handles +/- seeking for the audio trickplay bar

Parameters:
NameTypeDescription
seekStepinteger

seconds to move the trickplay position (negative values allowed)

Returns:
Type: 
void

(static) resetLoopModeToDefault() → {void}

Returns:
Type: 
void

(static) resetSeekbarThumb() → {void}

resetSeekbarThumb: Resets the thumb to the playing position

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) setSelectedButtonState(oldState, newState) → {void}

setSelectedButtonState: Changes the icon state url for the currently selected button

Parameters:
NameTypeDescription
oldStatestring

current state to replace in icon url

newStatestring

state to replace {oldState} with in icon url

Returns:
Type: 
void

(static) setShuffleIconState() → {void}

Returns:
Type: 
void

(static) setTrackNumberDisplay() → {void}

Returns:
Type: 
void

(static) setupAnimationTasks() → {void}

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 From 9e8d0b900ee0c6d68b0ef4ba9ee05b074df49389 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Thu, 17 Oct 2024 17:10:23 +0000 Subject: [PATCH 101/141] Bump minor version --- Makefile | 2 +- manifest | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index bcc572a3..1a69b6e6 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # If you want to get_images, you'll also need convert from ImageMagick ########################################################################## -VERSION := 2.1.8 +VERSION := 2.2.0 ## usage diff --git a/manifest b/manifest index 0486a682..491d15ee 100644 --- a/manifest +++ b/manifest @@ -2,8 +2,8 @@ title=Jellyfin major_version=2 -minor_version=1 -build_version=8 +minor_version=2 +build_version=0 ### Main Menu Icons / Channel Poster Artwork diff --git a/package-lock.json b/package-lock.json index d131407e..a02dda7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jellyfin-roku", - "version": "2.1.8", + "version": "2.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "jellyfin-roku", - "version": "2.1.8", + "version": "2.2.0", "hasInstallScript": true, "license": "GPL-2.0", "dependencies": { diff --git a/package.json b/package.json index d6af8ca5..99344c0b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jellyfin-roku", "type": "module", - "version": "2.1.8", + "version": "2.2.0", "description": "Roku app for Jellyfin media server", "dependencies": { "@rokucommunity/bslib": "0.1.1", From 320d9918ccd75a08590e66939b6809beed1fd905 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Thu, 17 Oct 2024 17:31:47 +0000 Subject: [PATCH 102/141] Bump build version --- Makefile | 2 +- manifest | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 1a69b6e6..05e0611f 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # If you want to get_images, you'll also need convert from ImageMagick ########################################################################## -VERSION := 2.2.0 +VERSION := 2.2.1 ## usage diff --git a/manifest b/manifest index 491d15ee..44cc3831 100644 --- a/manifest +++ b/manifest @@ -3,7 +3,7 @@ title=Jellyfin major_version=2 minor_version=2 -build_version=0 +build_version=1 ### Main Menu Icons / Channel Poster Artwork diff --git a/package-lock.json b/package-lock.json index a02dda7b..5c90afad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jellyfin-roku", - "version": "2.2.0", + "version": "2.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "jellyfin-roku", - "version": "2.2.0", + "version": "2.2.1", "hasInstallScript": true, "license": "GPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 99344c0b..6579bae4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jellyfin-roku", "type": "module", - "version": "2.2.0", + "version": "2.2.1", "description": "Roku app for Jellyfin media server", "dependencies": { "@rokucommunity/bslib": "0.1.1", From 0f2e40571fcda7ca697c249acae7f73f6a9c4fd7 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Thu, 17 Oct 2024 22:16:32 -0400 Subject: [PATCH 103/141] validate data to prevent crash --- source/api/Items.bs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/api/Items.bs b/source/api/Items.bs index 3f631943..65ed564b 100644 --- a/source/api/Items.bs +++ b/source/api/Items.bs @@ -47,8 +47,8 @@ function ItemPostPlaybackInfo(id as string, mediaSourceId = "" as string, audioT ' force the server to transcode AAC profiles we don't support to MP3 instead of the usual AAC ' TODO: Remove this after server adds support for transcoding AAC from one profile to another - if LCase(selectedAudioStream.Codec) = "aac" - if LCase(selectedAudioStream.Profile) = "main" or LCase(selectedAudioStream.Profile) = "he-aac" + if selectedAudioStream.Codec <> invalid and LCase(selectedAudioStream.Codec) = "aac" + if selectedAudioStream.Profile <> invalid and LCase(selectedAudioStream.Profile) = "main" or LCase(selectedAudioStream.Profile) = "he-aac" for each rule in deviceProfile.TranscodingProfiles if rule.Container = "ts" or rule.Container = "mp4" if rule.AudioCodec = "aac" From 1eb686ae6923a72dc122fc68969dc75c459d8604 Mon Sep 17 00:00:00 2001 From: Reynolds Date: Fri, 18 Oct 2024 08:52:02 -0400 Subject: [PATCH 104/141] Removed Play Option --- locale/en_US/translations.ts | 9 ++------- settings/settings.json | 8 ++------ source/Main.bs | 2 +- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts index e687c2ac..5730979d 100644 --- a/locale/en_US/translations.ts +++ b/locale/en_US/translations.ts @@ -1327,15 +1327,10 @@ User Setting - Setting option title - What should clicking a Next Up episode do. - What should clicking a Next Up episode do. + What should clicking OK on a Next Up episode do. + What should clicking OK on a Next Up episode do. User Setting - Setting description - - Play Episode Immediately - Play Episode Immediately - User Setting - Setting option title - View Episode Details View Episode Details diff --git a/settings/settings.json b/settings/settings.json index 0dd2a423..9555a914 100644 --- a/settings/settings.json +++ b/settings/settings.json @@ -264,15 +264,11 @@ }, { "title": "Episode Next Up Behavior", - "description": "What should clicking a Next Up episode do.", + "description": "What should clicking OK on a Next Up episode do.", "settingName": "ui.general.episodenextupbehavior", "type": "radio", - "default": "play", + "default": "episode", "options": [ - { - "title": "Play Episode Immediately", - "id": "play" - }, { "title": "View Episode Details", "id": "episode" diff --git a/source/Main.bs b/source/Main.bs index 3ee6aba1..b5b1476d 100644 --- a/source/Main.bs +++ b/source/Main.bs @@ -312,7 +312,7 @@ sub Main (args as dynamic) as void localGlobal = m.global ' we only use this special steering logic from the home screen - if localGlobal.session.user.settings["ui.general.episodenextupbehavior"] = "play" or launchSource <> "home" + if launchSource <> "home" ' Display playback options dialog if selectedItem.json.userdata.PlaybackPositionTicks > 0 m.global.queueManager.callFunc("hold", selectedItem) From b70233fcc55129cfee687227107bfb4e0a7bc782 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Oct 2024 21:35:59 +0000 Subject: [PATCH 105/141] Update dependency brighterscript to v0.67.8 --- package-lock.json | 52 ++++++++++++++++++++++++++++++++++++++++++----- package.json | 2 +- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index a02dda7b..9943466b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@rokucommunity/bslint": "0.8.25", - "brighterscript": "0.67.7", + "brighterscript": "0.67.8", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", "jsdoc": "4.0.3", @@ -886,9 +886,9 @@ } }, "node_modules/brighterscript": { - "version": "0.67.7", - "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.67.7.tgz", - "integrity": "sha512-KvHM3U4AVu3cOprwmWCOjg8Z7eMkehEJJeDp2PABVnT4GcqwOxtObOUITDJiJ5EuPSsmBlCzt1v3eTywyy7hTw==", + "version": "0.67.8", + "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.67.8.tgz", + "integrity": "sha512-2pQcPzW/NCEEofojLuHRDcLuQTmHssNpj1xW2oRiSFMo0YHR5cBIHrG/I71lpJwpyw/HzzK0vcEbthlOW4QVuw==", "license": "MIT", "dependencies": { "@rokucommunity/bslib": "^0.1.1", @@ -914,7 +914,7 @@ "parse-ms": "^2.1.0", "readline": "^1.3.0", "require-relative": "^0.8.7", - "roku-deploy": "^3.12.1", + "roku-deploy": "^3.12.2", "serialize-error": "^7.0.1", "source-map": "^0.7.4", "vscode-languageserver": "^9.0.1", @@ -1056,6 +1056,46 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/brighterscript/node_modules/roku-deploy": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.12.2.tgz", + "integrity": "sha512-CePBiVk+6u4Pka/aq7WR4GnTW39BlAveEbhuDHQX2UfR9+4j3+YEvfXqxB0R69RU52eGfnk1ejI7H0HStEKa2Q==", + "license": "MIT", + "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==", + "license": "MIT", + "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", @@ -5262,6 +5302,7 @@ "version": "3.12.1", "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.12.1.tgz", "integrity": "sha512-PEOdiFKGW1jrcoC9zjb+9kOWC/Q3eH7dzPvSi5kKignjNcyDiyJi+/wINwNrzw9SsxAVtw+NLvYueyZi9wQVsw==", + "dev": true, "license": "MIT", "dependencies": { "chalk": "^2.4.2", @@ -5288,6 +5329,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, "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", diff --git a/package.json b/package.json index 99344c0b..1cd473b2 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "devDependencies": { "@rokucommunity/bslint": "0.8.25", - "brighterscript": "0.67.7", + "brighterscript": "0.67.8", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", "jsdoc": "4.0.3", From 3700d87c0ef3f7e6c57e6f1f6396d8cb7cd7c5b9 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Fri, 18 Oct 2024 17:57:21 -0400 Subject: [PATCH 106/141] don't show resumable items in Next Up --- components/home/LoadItemsTask.bs | 1 + 1 file changed, 1 insertion(+) diff --git a/components/home/LoadItemsTask.bs b/components/home/LoadItemsTask.bs index b918a8df..893b826e 100644 --- a/components/home/LoadItemsTask.bs +++ b/components/home/LoadItemsTask.bs @@ -73,6 +73,7 @@ sub loadItems() params["DisableFirstEpisode"] = false params["limit"] = 24 params["EnableTotalRecordCount"] = false + params["EnableResumable"] = false maxDaysInNextUp = userSettings["ui.details.maxdaysnextup"].ToInt() if isValid(maxDaysInNextUp) From 5e39d607e10d8ea953b07b879e5375fd311c81b8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Oct 2024 21:59:02 +0000 Subject: [PATCH 107/141] Update dependency @rokucommunity/bslint to v0.8.26 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9943466b..2f788b52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "log": "npm:roku-log@0.11.1" }, "devDependencies": { - "@rokucommunity/bslint": "0.8.25", + "@rokucommunity/bslint": "0.8.26", "brighterscript": "0.67.8", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", @@ -315,9 +315,9 @@ "integrity": "sha512-2ox6EUL+UTtccTbD4dbVjZK3QHa0PHCqpoKMF8lZz9ayzzEP3iVPF8KZR6hOi6bxsIcbGXVjqmtCVkpC4P9SrA==" }, "node_modules/@rokucommunity/bslint": { - "version": "0.8.25", - "resolved": "https://registry.npmjs.org/@rokucommunity/bslint/-/bslint-0.8.25.tgz", - "integrity": "sha512-qQ9o5khnyF80K/2FnpnUFHfz28sW1B5UOsBiCjqAjhtTBKWzhkIQP8CrIIWej2nGy7+UlmA4slODZkinCsJv+w==", + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/@rokucommunity/bslint/-/bslint-0.8.26.tgz", + "integrity": "sha512-HdlHhovHxMZk+wkg2qkfQCx2F+gGzIZ4q5DokSYNhU2wsDFtlDT+4oxeDmBzmpoJfpBVDyGBPtnej+VOASlb1Q==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 1cd473b2..996b925d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "log": "npm:roku-log@0.11.1" }, "devDependencies": { - "@rokucommunity/bslint": "0.8.25", + "@rokucommunity/bslint": "0.8.26", "brighterscript": "0.67.8", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", From de1888f680619fcf538ba319d5706282d721e095 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Oct 2024 22:00:40 +0000 Subject: [PATCH 108/141] Update dependency brighterscript-formatter to v1.7.6 --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2f788b52..103c27a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "license": "GPL-2.0", "dependencies": { "@rokucommunity/bslib": "0.1.1", - "brighterscript-formatter": "1.7.5", + "brighterscript-formatter": "1.7.6", "log": "npm:roku-log@0.11.1" }, "devDependencies": { @@ -930,12 +930,12 @@ } }, "node_modules/brighterscript-formatter": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/brighterscript-formatter/-/brighterscript-formatter-1.7.5.tgz", - "integrity": "sha512-TIo1BdzHfhd07aFcikEMHyeLhrZqbVNOKF/v03DX3n/33FXhsstR3PhhVjJUxFsoeawO6dRhzGUGDh/EegJ5Iw==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/brighterscript-formatter/-/brighterscript-formatter-1.7.6.tgz", + "integrity": "sha512-a+VCZ/xK6Sgjfz0232MQlJ6yVXQ+YVQ+PfJbxtSprRq6mfJLDswaNnb163WmEbKAQXgbjFy+HSecPJjM8zhbbQ==", "license": "MIT", "dependencies": { - "brighterscript": "^0.67.7", + "brighterscript": "^0.67.8", "glob-all": "^3.3.0", "jsonc-parser": "^3.0.0", "source-map": "^0.7.3", diff --git a/package.json b/package.json index 996b925d..9717d307 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "description": "Roku app for Jellyfin media server", "dependencies": { "@rokucommunity/bslib": "0.1.1", - "brighterscript-formatter": "1.7.5", + "brighterscript-formatter": "1.7.6", "log": "npm:roku-log@0.11.1" }, "devDependencies": { From e01981a45985252e277c105170323b14d9e59abf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Oct 2024 22:00:59 +0000 Subject: [PATCH 109/141] Update dependency roku-deploy to v3.12.2 --- package-lock.json | 50 ++++------------------------------------------- package.json | 2 +- 2 files changed, 5 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2f788b52..0ad3970f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "jshint": "2.13.6", "markdownlint-cli2": "0.14.0", "rimraf": "6.0.1", - "roku-deploy": "3.12.1", + "roku-deploy": "3.12.2", "roku-log-bsc-plugin": "0.8.1", "rooibos-roku": "5.14.0", "ropm": "0.10.26", @@ -1056,46 +1056,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/brighterscript/node_modules/roku-deploy": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.12.2.tgz", - "integrity": "sha512-CePBiVk+6u4Pka/aq7WR4GnTW39BlAveEbhuDHQX2UfR9+4j3+YEvfXqxB0R69RU52eGfnk1ejI7H0HStEKa2Q==", - "license": "MIT", - "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==", - "license": "MIT", - "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", @@ -5299,10 +5259,9 @@ } }, "node_modules/roku-deploy": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.12.1.tgz", - "integrity": "sha512-PEOdiFKGW1jrcoC9zjb+9kOWC/Q3eH7dzPvSi5kKignjNcyDiyJi+/wINwNrzw9SsxAVtw+NLvYueyZi9wQVsw==", - "dev": true, + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.12.2.tgz", + "integrity": "sha512-CePBiVk+6u4Pka/aq7WR4GnTW39BlAveEbhuDHQX2UfR9+4j3+YEvfXqxB0R69RU52eGfnk1ejI7H0HStEKa2Q==", "license": "MIT", "dependencies": { "chalk": "^2.4.2", @@ -5329,7 +5288,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, "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", diff --git a/package.json b/package.json index 996b925d..876d4a96 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "jshint": "2.13.6", "markdownlint-cli2": "0.14.0", "rimraf": "6.0.1", - "roku-deploy": "3.12.1", + "roku-deploy": "3.12.2", "roku-log-bsc-plugin": "0.8.1", "rooibos-roku": "5.14.0", "ropm": "0.10.26", From 62392e2771e16812c6667d0699b5f195e368afee Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2024 01:15:04 +0000 Subject: [PATCH 110/141] Update dependency ropm to v0.10.27 --- package-lock.json | 12 ++++++------ package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84ae1200..9646876a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "roku-deploy": "3.12.2", "roku-log-bsc-plugin": "0.8.1", "rooibos-roku": "5.14.0", - "ropm": "0.10.26", + "ropm": "0.10.27", "spellchecker-cli": "6.2.0", "undent": "0.1.0" } @@ -5400,21 +5400,21 @@ } }, "node_modules/ropm": { - "version": "0.10.26", - "resolved": "https://registry.npmjs.org/ropm/-/ropm-0.10.26.tgz", - "integrity": "sha512-NvWbT7OpQQNyp6ISxU8mvVXhHxA7vgxN+7Cg8xq5BudnlAfKT8JCLhPxA5tcC152thhOxtljSpdXs5wkzU4xVw==", + "version": "0.10.27", + "resolved": "https://registry.npmjs.org/ropm/-/ropm-0.10.27.tgz", + "integrity": "sha512-Uo/DLKXxdqK4RnbkVLl27Ybt2japr1teHsb1fbElsPZrg1iNdxwO0TLMAAwqAClGtkq7Sa5TS3JIYAJWZgrMhQ==", "dev": true, "license": "MIT", "dependencies": { "@xml-tools/ast": "^5.0.5", "@xml-tools/parser": "1.0.10", - "brighterscript": "^0.67.7", + "brighterscript": "^0.67.8", "del": "6.0.0", "fs-extra": "9.1.0", "glob-all": "3.2.1", "latinize": "0.5.0", "npm-packlist": "2.1.4", - "roku-deploy": "^3.12.1", + "roku-deploy": "^3.12.2", "semver": "^7.6.3", "yargs": "16.2.0" }, diff --git a/package.json b/package.json index f2fe7863..2a95b015 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "roku-deploy": "3.12.2", "roku-log-bsc-plugin": "0.8.1", "rooibos-roku": "5.14.0", - "ropm": "0.10.26", + "ropm": "0.10.27", "spellchecker-cli": "6.2.0", "undent": "0.1.0" }, From 895f569419508d4fd85c3600487875773d080ead Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Sat, 19 Oct 2024 10:34:13 -0400 Subject: [PATCH 111/141] improve support for av1 video --- source/utils/deviceCapabilities.bs | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/source/utils/deviceCapabilities.bs b/source/utils/deviceCapabilities.bs index 38483897..44cc05d6 100644 --- a/source/utils/deviceCapabilities.bs +++ b/source/utils/deviceCapabilities.bs @@ -301,21 +301,11 @@ function getTranscodingProfiles() as object end if ' AV1 - for each container in transcodingContainers - if di.CanDecodeVideo({ Codec: "av1", Container: container }).Result - if container = "mp4" - ' check for codec string before adding it - if mp4VideoCodecs.Instr(0, ",av1") = -1 - mp4VideoCodecs = mp4VideoCodecs + ",av1" - end if - else if container = "ts" - ' check for codec string before adding it - if tsVideoCodecs.Instr(0, ",av1") = -1 - tsVideoCodecs = tsVideoCodecs + ",av1" - end if - end if - end if - end for + ' CanDecodeVideo() returns false for AV1 when the container is provided + ' Manually add AV1 to the mp4VideoCodecs list if support is detected + if di.CanDecodeVideo({ Codec: "av1" }).Result + mp4VideoCodecs = mp4VideoCodecs + ",av1" + end if ' AUDIO CODECS for each container in transcodingContainers From 5155e8145c46d58d4e4d61e2cc1d770d883555a5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2024 22:09:29 +0000 Subject: [PATCH 112/141] Update dependency jsdoc to v4.0.4 --- package-lock.json | 36 +++++++++++++++--------------------- package.json | 2 +- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9646876a..1515baac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "brighterscript": "0.67.8", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", - "jsdoc": "4.0.3", + "jsdoc": "4.0.4", "jshint": "2.13.6", "markdownlint-cli2": "0.14.0", "rimraf": "6.0.1", @@ -517,14 +517,14 @@ "dev": true }, "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, "node_modules/@types/mdast": { @@ -2573,10 +2573,11 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "node_modules/jsdoc": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", - "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz", + "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@babel/parser": "^7.20.15", "@jsdoc/salty": "^0.2.1", @@ -2601,27 +2602,19 @@ "node": ">=12.0.0" } }, - "node_modules/jsdoc/node_modules/@types/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", - "dev": true, - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, "node_modules/jsdoc/node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsdoc/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2631,6 +2624,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, diff --git a/package.json b/package.json index 2a95b015..13b31e46 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "brighterscript": "0.67.8", "brighterscript-jsdocs-plugin": "0.7.3", "clean-jsdoc-theme": "4.3.0", - "jsdoc": "4.0.3", + "jsdoc": "4.0.4", "jshint": "2.13.6", "markdownlint-cli2": "0.14.0", "rimraf": "6.0.1", From c329a94972499adf7122b961d10117e2af07f4ee Mon Sep 17 00:00:00 2001 From: Justin Date: Sat, 19 Oct 2024 23:15:06 +0000 Subject: [PATCH 113/141] Translated using Weblate (German) Currently translated at 100.0% (291 of 291 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/de/ --- locale/de_DE/translations.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts index 309154ed..1389c1fd 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -1338,6 +1338,14 @@ Serienbild verwenden User Setting - Setting option title + + Play Next Episode Automatically + Nächste Episode automatisch abspielen + + + When finished playing a single episode, play the next one automatically. + Wenn die Wiedergabe einer einzelnen Episode beendet ist, wird automatisch die nächste Episode abgespielt. + From a0fb109532877424d6a15c0ba47dfe7216f89734 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:05:11 +0000 Subject: [PATCH 114/141] Update dependency spellchecker-cli to v7 --- package-lock.json | 1283 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 +- 2 files changed, 1279 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9646876a..d9210e2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "roku-log-bsc-plugin": "0.8.1", "rooibos-roku": "5.14.0", "ropm": "0.10.27", - "spellchecker-cli": "6.2.0", + "spellchecker-cli": "7.0.0", "undent": "0.1.0" } }, @@ -510,6 +510,16 @@ "@types/ms": "*" } }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", @@ -589,6 +599,13 @@ "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", "dev": true }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@xml-tools/ast": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@xml-tools/ast/-/ast-5.0.5.tgz", @@ -1167,6 +1184,28 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chevrotain": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.2.tgz", @@ -1304,6 +1343,17 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/command-line-args": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", @@ -1576,6 +1626,20 @@ "node": ">=6" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dictionary-en": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/dictionary-en/-/dictionary-en-3.2.0.tgz", @@ -2263,6 +2327,468 @@ "node": ">=4" } }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/hast-util-from-html/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/hast-util-from-parse5/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", + "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/hast-util-to-nlcst": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-nlcst/-/hast-util-to-nlcst-4.0.0.tgz", + "integrity": "sha512-+YxIJMLJe+2AEhJeJHXZu1VuhApzjD9dLlWOLTS9kUusHfxKsyqRSnSF/YEu4h0uvzwSC0wPqFwIb9GSnK/chQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-to-string": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-position": "^5.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-nlcst/node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hast-util-to-nlcst/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/hast-util-to-nlcst/node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-nlcst/node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-nlcst/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-nlcst/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-nlcst/node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-nlcst/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz", + "integrity": "sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/html-minifier-terser": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", @@ -2284,6 +2810,17 @@ "node": "^14.13.1 || >=16.0.0" } }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", @@ -3143,6 +3680,242 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-to-hast/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-to-hast/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-markdown": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", @@ -4187,6 +4960,19 @@ "node": ">=6" } }, + "node_modules/parse5": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", + "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -4456,6 +5242,17 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -4582,6 +5379,430 @@ "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==" }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/rehype-parse/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-retext": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rehype-retext/-/rehype-retext-5.0.0.tgz", + "integrity": "sha512-amCBMrCItZzu2tLIfL+m0S8mE6+nwD+H88hesbxCgZ9AdMZ42aGPqunMh+bbkb/v1kY3bwppSnfPMDmxIz42Nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/nlcst": "^2.0.0", + "hast-util-to-nlcst": "^4.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-retext/node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/rehype-retext/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/rehype-retext/node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-retext/node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/rehype-retext/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-retext/node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-retext/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-retext/node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-retext/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-retext/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/rehype-stringify/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/rehype/node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype/node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -5703,11 +6924,23 @@ "node": ">=0.10.0" } }, - "node_modules/spellchecker-cli": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-6.2.0.tgz", - "integrity": "sha512-oWYwNYp2TVAhwUQ1D5FVLGrSkKjBht37X1UVFzbx9RwzkrXPrOq2tynUbxxx78LrTLtBro63UxuELK80QeTPoA==", + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spellchecker-cli": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/spellchecker-cli/-/spellchecker-cli-7.0.0.tgz", + "integrity": "sha512-v6ArsUnURxEVld9ZiLOAYZkT2NWeIMSWnO5j81hdBrMDAjPIZrxtz/GR6+uwxNA/OrG53FFJyAgLYD7Vg0dWNw==", + "dev": true, + "license": "MIT", "dependencies": { "chalk": "^2.4.2", "command-line-args": "^5.1.1", @@ -5725,6 +6958,8 @@ "junit-report-builder": "^3.0.1", "lodash": "^4.17.21", "pkg-dir": "^6.0.1", + "rehype": "^13.0.2", + "rehype-retext": "^5.0.0", "remark": "^14.0.0", "remark-frontmatter": "^4.0.0", "remark-retext": "^5.0.1", @@ -5749,6 +6984,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -5839,6 +7075,21 @@ "node": ">=8" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -6022,6 +7273,17 @@ "dev": true, "license": "MIT" }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/trough": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", @@ -6525,6 +7787,17 @@ "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", "license": "MIT" }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 2a95b015..60c8516b 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "roku-log-bsc-plugin": "0.8.1", "rooibos-roku": "5.14.0", "ropm": "0.10.27", - "spellchecker-cli": "6.2.0", + "spellchecker-cli": "7.0.0", "undent": "0.1.0" }, "scripts": { From d8c2f58da3f4fac9efe3c5d6bcd6462412301fc6 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Mon, 21 Oct 2024 16:11:53 +0000 Subject: [PATCH 115/141] Bump build version --- Makefile | 2 +- manifest | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 05e0611f..e036d412 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # If you want to get_images, you'll also need convert from ImageMagick ########################################################################## -VERSION := 2.2.1 +VERSION := 2.2.2 ## usage diff --git a/manifest b/manifest index 44cc3831..8f46b09a 100644 --- a/manifest +++ b/manifest @@ -3,7 +3,7 @@ title=Jellyfin major_version=2 minor_version=2 -build_version=1 +build_version=2 ### Main Menu Icons / Channel Poster Artwork diff --git a/package-lock.json b/package-lock.json index 5c90afad..0e16e4ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jellyfin-roku", - "version": "2.2.1", + "version": "2.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "jellyfin-roku", - "version": "2.2.1", + "version": "2.2.2", "hasInstallScript": true, "license": "GPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 6579bae4..e00d7e38 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jellyfin-roku", "type": "module", - "version": "2.2.1", + "version": "2.2.2", "description": "Roku app for Jellyfin media server", "dependencies": { "@rokucommunity/bslib": "0.1.1", From 19800a4e8187d0b3ef7ef2e74873b8213a0b374a Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Mon, 21 Oct 2024 16:12:04 +0000 Subject: [PATCH 116/141] Update API docs --- .../api/components_home_LoadItemsTask.bs.html | 1 + docs/api/source_api_Items.bs.html | 4 ++-- .../source_utils_deviceCapabilities.bs.html | 20 +++++-------------- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/docs/api/components_home_LoadItemsTask.bs.html b/docs/api/components_home_LoadItemsTask.bs.html index 3e7c3324..ef033c92 100644 --- a/docs/api/components_home_LoadItemsTask.bs.html +++ b/docs/api/components_home_LoadItemsTask.bs.html @@ -75,6 +75,7 @@ sub loadItems() params["DisableFirstEpisode"] = false params["limit"] = 24 params["EnableTotalRecordCount"] = false + params["EnableResumable"] = false maxDaysInNextUp = userSettings["ui.details.maxdaysnextup"].ToInt() if isValid(maxDaysInNextUp) diff --git a/docs/api/source_api_Items.bs.html b/docs/api/source_api_Items.bs.html index 1c9607f1..a7bfe263 100644 --- a/docs/api/source_api_Items.bs.html +++ b/docs/api/source_api_Items.bs.html @@ -49,8 +49,8 @@ function ItemPostPlaybackInfo(id as string, mediaSourceId = "" as string, audioT ' force the server to transcode AAC profiles we don't support to MP3 instead of the usual AAC ' TODO: Remove this after server adds support for transcoding AAC from one profile to another - if LCase(selectedAudioStream.Codec) = "aac" - if LCase(selectedAudioStream.Profile) = "main" or LCase(selectedAudioStream.Profile) = "he-aac" + if selectedAudioStream.Codec <> invalid and LCase(selectedAudioStream.Codec) = "aac" + if selectedAudioStream.Profile <> invalid and LCase(selectedAudioStream.Profile) = "main" or LCase(selectedAudioStream.Profile) = "he-aac" for each rule in deviceProfile.TranscodingProfiles if rule.Container = "ts" or rule.Container = "mp4" if rule.AudioCodec = "aac" diff --git a/docs/api/source_utils_deviceCapabilities.bs.html b/docs/api/source_utils_deviceCapabilities.bs.html index df7644c1..9c720e11 100644 --- a/docs/api/source_utils_deviceCapabilities.bs.html +++ b/docs/api/source_utils_deviceCapabilities.bs.html @@ -303,21 +303,11 @@ function getTranscodingProfiles() as object end if ' AV1 - for each container in transcodingContainers - if di.CanDecodeVideo({ Codec: "av1", Container: container }).Result - if container = "mp4" - ' check for codec string before adding it - if mp4VideoCodecs.Instr(0, ",av1") = -1 - mp4VideoCodecs = mp4VideoCodecs + ",av1" - end if - else if container = "ts" - ' check for codec string before adding it - if tsVideoCodecs.Instr(0, ",av1") = -1 - tsVideoCodecs = tsVideoCodecs + ",av1" - end if - end if - end if - end for + ' CanDecodeVideo() returns false for AV1 when the container is provided + ' Manually add AV1 to the mp4VideoCodecs list if support is detected + if di.CanDecodeVideo({ Codec: "av1" }).Result + mp4VideoCodecs = mp4VideoCodecs + ",av1" + end if ' AUDIO CODECS for each container in transcodingContainers From 77326192f841b927d3b4a596d4c468de12363d48 Mon Sep 17 00:00:00 2001 From: Justin Date: Mon, 21 Oct 2024 20:00:32 +0000 Subject: [PATCH 117/141] Translated using Weblate (German) Currently translated at 100.0% (292 of 292 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/de/ --- locale/de_DE/translations.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts index 1389c1fd..ebf06248 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -1346,6 +1346,10 @@ When finished playing a single episode, play the next one automatically. Wenn die Wiedergabe einer einzelnen Episode beendet ist, wird automatisch die nächste Episode abgespielt. + + Special + Special + From 9e94e2acc2e3a91b1a0789e49a31af015672e39a Mon Sep 17 00:00:00 2001 From: Andi Chandler Date: Mon, 21 Oct 2024 20:55:05 +0000 Subject: [PATCH 118/141] Translated using Weblate (English (United Kingdom)) Currently translated at 100.0% (292 of 292 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/en_GB/ --- locale/en_GB/translations.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/locale/en_GB/translations.ts b/locale/en_GB/translations.ts index 90029987..8193d8e5 100644 --- a/locale/en_GB/translations.ts +++ b/locale/en_GB/translations.ts @@ -1322,6 +1322,10 @@ When finished playing a single episode, play the next one automatically. When finished playing a single episode, play the next one automatically. + + Special + Special + From aa0231fa320ea18e401e1670b51b02de309e950e Mon Sep 17 00:00:00 2001 From: Reynolds Date: Tue, 22 Oct 2024 09:33:57 -0400 Subject: [PATCH 119/141] Change settings wording --- locale/en_US/translations.ts | 4 ++-- settings/settings.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts index 602dbf76..14445ef9 100644 --- a/locale/en_US/translations.ts +++ b/locale/en_US/translations.ts @@ -1327,8 +1327,8 @@ User Setting - Setting option title - What should clicking OK on a Next Up episode do. - What should clicking OK on a Next Up episode do. + This controls what clicking OK on a Next Up episode does. + This controls what clicking OK on a Next Up episode does. User Setting - Setting description diff --git a/settings/settings.json b/settings/settings.json index 9555a914..836a59bb 100644 --- a/settings/settings.json +++ b/settings/settings.json @@ -264,7 +264,7 @@ }, { "title": "Episode Next Up Behavior", - "description": "What should clicking OK on a Next Up episode do.", + "description": "This controls what clicking OK on a Next Up episode does.", "settingName": "ui.general.episodenextupbehavior", "type": "radio", "default": "episode", From 98548608c888c56d94d07b165bbac633c6ed21ed Mon Sep 17 00:00:00 2001 From: Reynolds Date: Tue, 22 Oct 2024 09:38:26 -0400 Subject: [PATCH 120/141] Hide Time of Completion OSD for Hide Clocks Setting --- components/video/OSD.bs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/video/OSD.bs b/components/video/OSD.bs index 6878f8c2..6d9d0d48 100644 --- a/components/video/OSD.bs +++ b/components/video/OSD.bs @@ -43,6 +43,10 @@ sub onProgressPercentageChanged() m.videoPositionTime.text = secondsToHuman(m.top.positionTime, true) osdmode = m.global.session.user.settings["ui.general.osdremainingtime"] + if m.global.session.user.settings["ui.design.hideclock"] + ' in order to honor the hide clocks setting + osdmode = "remaining" + end if if osdmode = "remaining" m.videoRemainingTime.text = secondsToHuman(m.top.remainingPositionTime, true) From 83c4146e494c3d22b2fe293e9f961d7092991210 Mon Sep 17 00:00:00 2001 From: Jimi Date: Tue, 22 Oct 2024 21:24:49 -0600 Subject: [PATCH 121/141] Don't show extras slider if nothing to show --- components/extras/ExtrasRowList.bs | 21 ++++++++++++++++++--- components/movies/MovieDetails.bs | 2 +- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/components/extras/ExtrasRowList.bs b/components/extras/ExtrasRowList.bs index 70b886c3..7a0cf126 100644 --- a/components/extras/ExtrasRowList.bs +++ b/components/extras/ExtrasRowList.bs @@ -35,6 +35,7 @@ sub updateSize() end sub sub loadParts(data as object) + m.extrasGrp = m.top.getParent().findNode("extrasGrp") m.top.parentId = data.id m.people = data.People m.LoadAdditionalPartsTask.itemId = m.top.parentId @@ -42,6 +43,7 @@ sub loadParts(data as object) end sub sub loadPersonVideos(personId) + m.extrasGrp = m.top.getParent().findNode("extrasGrp") m.personId = personId m.LoadMoviesTask.itemId = m.personId m.LoadMoviesTask.observeField("content", "onMoviesLoaded") @@ -114,7 +116,7 @@ sub onLikeThisLoaded() m.SpecialFeaturesTask.control = "RUN" end sub -function onSpecialFeaturesLoaded() +sub onSpecialFeaturesLoaded() data = m.SpecialFeaturesTask.content m.SpecialFeaturesTask.unobserveField("content") if data <> invalid and data.count() > 0 @@ -132,8 +134,8 @@ function onSpecialFeaturesLoaded() addRowSize([462, 372]) end if - return m.top.content -end function + showOrHideMe() +end sub sub onMoviesLoaded() data = m.LoadMoviesTask.content @@ -179,6 +181,8 @@ sub onSeriesLoaded() m.top.content.appendChild(row) end if m.top.visible = true + + showOrHideMe() end sub function buildRow(rowTitle as string, items, imgWdth = 0) @@ -218,6 +222,17 @@ sub addRowSize(newRow) m.top.rowItemSize = newSizeArray end sub +' don't show popup panel if there is nothing to show +sub showOrHideMe() + if isValid(m.top.content) + if m.top.content.getChildCount() = 0 + m.extrasGrp.visible = false + else + m.extrasGrp.visible = true + end if + end if +end sub + sub onRowItemSelected() m.top.selectedItem = m.top.content.getChild(m.top.rowItemSelected[0]).getChild(m.top.rowItemSelected[1]) end sub diff --git a/components/movies/MovieDetails.bs b/components/movies/MovieDetails.bs index 5812f4c4..56ab0ba0 100644 --- a/components/movies/MovieDetails.bs +++ b/components/movies/MovieDetails.bs @@ -403,7 +403,7 @@ function onKeyEvent(key as string, press as boolean) as boolean m.options.setFocus(true) end if - if key = "down" and m.buttonGrp.isInFocusChain() + if key = "down" and m.buttonGrp.isInFocusChain() and m.extrasGrp.visible = true m.top.lastFocus = m.extrasGrid m.extrasGrid.setFocus(true) m.top.findNode("VertSlider").reverse = false From 440cc942b544ec3b03897453c673e45e5d7583ba Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Wed, 23 Oct 2024 12:25:27 +0000 Subject: [PATCH 122/141] Update API docs --- .../components_extras_ExtrasRowList.bs.html | 21 ++++++++-- docs/api/components_home_HomeRows.bs.html | 1 + .../components_movies_MovieDetails.bs.html | 2 +- .../components_tvshows_TVEpisodeRow.bs.html | 17 ++++++++ ...ts_tvshows_TVEpisodeRowWithOptions.bs.html | 6 +++ .../api/components_tvshows_TVEpisodes.bs.html | 8 ++++ docs/api/components_video_OSD.bs.html | 16 +++++++- docs/api/data/search.json | 2 +- docs/api/module-ExtrasRowList.html | 2 +- docs/api/module-ShowScenes.html | 2 +- docs/api/module-TVEpisodeRow.html | 2 +- docs/api/module-TVEpisodeRowWithOptions.html | 2 +- docs/api/module-TVEpisodes.html | 2 +- docs/api/module-misc.html | 2 +- docs/api/source_Main.bs.html | 39 +++++++++++++------ docs/api/source_ShowScenes.bs.html | 10 ++++- docs/api/source_utils_misc.bs.html | 18 +++++++++ 17 files changed, 127 insertions(+), 25 deletions(-) diff --git a/docs/api/components_extras_ExtrasRowList.bs.html b/docs/api/components_extras_ExtrasRowList.bs.html index fbdbafae..2b098485 100644 --- a/docs/api/components_extras_ExtrasRowList.bs.html +++ b/docs/api/components_extras_ExtrasRowList.bs.html @@ -37,6 +37,7 @@ sub updateSize() end sub sub loadParts(data as object) + m.extrasGrp = m.top.getParent().findNode("extrasGrp") m.top.parentId = data.id m.people = data.People m.LoadAdditionalPartsTask.itemId = m.top.parentId @@ -44,6 +45,7 @@ sub loadParts(data as object) end sub sub loadPersonVideos(personId) + m.extrasGrp = m.top.getParent().findNode("extrasGrp") m.personId = personId m.LoadMoviesTask.itemId = m.personId m.LoadMoviesTask.observeField("content", "onMoviesLoaded") @@ -116,7 +118,7 @@ sub onLikeThisLoaded() m.SpecialFeaturesTask.control = "RUN" end sub -function onSpecialFeaturesLoaded() +sub onSpecialFeaturesLoaded() data = m.SpecialFeaturesTask.content m.SpecialFeaturesTask.unobserveField("content") if data <> invalid and data.count() > 0 @@ -134,8 +136,8 @@ function onSpecialFeaturesLoaded() addRowSize([462, 372]) end if - return m.top.content -end function + showOrHideMe() +end sub sub onMoviesLoaded() data = m.LoadMoviesTask.content @@ -181,6 +183,8 @@ sub onSeriesLoaded() m.top.content.appendChild(row) end if m.top.visible = true + + showOrHideMe() end sub function buildRow(rowTitle as string, items, imgWdth = 0) @@ -220,6 +224,17 @@ sub addRowSize(newRow) m.top.rowItemSize = newSizeArray end sub +' don't show popup panel if there is nothing to show +sub showOrHideMe() + if isValid(m.top.content) + if m.top.content.getChildCount() = 0 + m.extrasGrp.visible = false + else + m.extrasGrp.visible = true + end if + end if +end sub + sub onRowItemSelected() m.top.selectedItem = m.top.content.getChild(m.top.rowItemSelected[0]).getChild(m.top.rowItemSelected[1]) end sub diff --git a/docs/api/components_home_HomeRows.bs.html b/docs/api/components_home_HomeRows.bs.html index 27e236fd..abae358e 100644 --- a/docs/api/components_home_HomeRows.bs.html +++ b/docs/api/components_home_HomeRows.bs.html @@ -689,6 +689,7 @@ end sub sub itemSelected() m.selectedRowItem = m.top.rowItemSelected + m.global.launchSource = "home" m.top.selectedItem = m.top.content.getChild(m.top.rowItemSelected[0]).getChild(m.top.rowItemSelected[1]) 'Prevent the selected item event from double firing diff --git a/docs/api/components_movies_MovieDetails.bs.html b/docs/api/components_movies_MovieDetails.bs.html index 811f5bdb..6d74cb1d 100644 --- a/docs/api/components_movies_MovieDetails.bs.html +++ b/docs/api/components_movies_MovieDetails.bs.html @@ -405,7 +405,7 @@ function onKeyEvent(key as string, press as boolean) as boolean m.options.setFocus(true) end if - if key = "down" and m.buttonGrp.isInFocusChain() + if key = "down" and m.buttonGrp.isInFocusChain() and m.extrasGrp.visible = true m.top.lastFocus = m.extrasGrid m.extrasGrid.setFocus(true) m.top.findNode("VertSlider").reverse = false diff --git a/docs/api/components_tvshows_TVEpisodeRow.bs.html b/docs/api/components_tvshows_TVEpisodeRow.bs.html index 9fdd2e86..d537ff99 100644 --- a/docs/api/components_tvshows_TVEpisodeRow.bs.html +++ b/docs/api/components_tvshows_TVEpisodeRow.bs.html @@ -8,11 +8,28 @@ m.top.showRowLabel = [false] + m.top.observeField("selectItemId", "onItemSelected") + updateSize() m.top.setFocus(true) end sub +sub onItemSelected() + Id = m.top.selectItemId + + if Id <> invalid and Id <> "" and m.top.objects <> invalid + for i = 0 to m.top.objects.items.count() - 1 + item = m.top.objects.items[i] + if item.id = Id + m.top.jumpToItem = i + return + end if + end for + end if +end sub + + sub updateSize() m.top.translation = [450, 180] diff --git a/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html b/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html index e29cf369..150d50d3 100644 --- a/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html +++ b/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html @@ -6,9 +6,15 @@ sub init() m.rows = m.top.findNode("tvEpisodeRow") m.tvListOptions = m.top.findNode("tvListOptions") + m.top.observeField("selectItemId", "onItemSelected") m.rows.observeField("doneLoading", "rowsDoneLoading") end sub +sub onItemSelected() + Id = m.top.selectItemId + m.rows.selectItemId = Id +end sub + sub setupRows() objects = m.top.objects m.rows.objects = objects diff --git a/docs/api/components_tvshows_TVEpisodes.bs.html b/docs/api/components_tvshows_TVEpisodes.bs.html index 53be5200..f316b0a5 100644 --- a/docs/api/components_tvshows_TVEpisodes.bs.html +++ b/docs/api/components_tvshows_TVEpisodes.bs.html @@ -8,6 +8,7 @@ import "pkg:/source/api/sdk.bs" sub init() m.top.optionsAvailable = false + m.top.observeField("selectItemId", "onItemSelected") m.rows = m.top.findNode("picker") m.poster = m.top.findNode("seasonPoster") @@ -27,6 +28,11 @@ sub setSeasonLoading() m.top.overhangTitle = tr("Loading...") end sub +sub onItemSelected() + Id = m.top.selectItemId + m.rows.selectItemId = Id +end sub + ' Updates the visibility of the Extras button based on if this season has any extra features sub setExtraButtonVisibility() if isValid(m.top.extrasObjects) and isValidAndNotEmpty(m.top.extrasObjects.items) @@ -75,6 +81,7 @@ end function ' OnScreenShown: Callback function when view is presented on screen ' sub OnScreenShown() + if m.isFirstRun m.isFirstRun = false return @@ -82,6 +89,7 @@ sub OnScreenShown() m.tvEpisodeRow.setFocus(true) m.top.refreshSeasonDetailsData = not m.top.refreshSeasonDetailsData + end sub ' Handle navigation input from the remote and act on it diff --git a/docs/api/components_video_OSD.bs.html b/docs/api/components_video_OSD.bs.html index bf9d239d..4ada62c7 100644 --- a/docs/api/components_video_OSD.bs.html +++ b/docs/api/components_video_OSD.bs.html @@ -43,7 +43,21 @@ end sub ' sub onProgressPercentageChanged() m.videoPositionTime.text = secondsToHuman(m.top.positionTime, true) - m.videoRemainingTime.text = secondsToHuman(m.top.remainingPositionTime, true) + + osdmode = m.global.session.user.settings["ui.general.osdremainingtime"] + if m.global.session.user.settings["ui.design.hideclock"] + ' in order to honor the hide clocks setting + osdmode = "remaining" + end if + + if osdmode = "remaining" + m.videoRemainingTime.text = secondsToHuman(m.top.remainingPositionTime, true) + else if osdmode = "timeofday" + m.videoRemainingTime.text = secondsToEndTime(m.top.remainingPositionTime) + else if osdmode = "both" + m.videoRemainingTime.text = secondsToHuman(m.top.remainingPositionTime, true) + " | " + secondsToEndTime(m.top.remainingPositionTime) + end if + m.progressBar.width = m.progressBarBackground.width * m.top.progressPercentage end sub diff --git a/docs/api/data/search.json b/docs/api/data/search.json index 04a9b281..3f262492 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.exitScrubMode","link":"exitScrubMode","description":"

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

"},{"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.moveSeekbarThumb","link":"moveSeekbarThumb","description":"

moveSeekbarThumb: Positions the thumb on the seekbar

"},{"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.processScrubAction","link":"processScrubAction","description":"

processScrubAction: Handles +/- seeking for the audio trickplay bar

"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.resetSeekbarThumb","link":"resetSeekbarThumb","description":"

resetSeekbarThumb: Resets the thumb to the playing position

"},{"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.setSelectedButtonState","link":"setSelectedButtonState","description":"

setSelectedButtonState: Changes the icon state url for the currently selected button

"},{"title":"module:AudioPlayerView.setShuffleIconState","link":"setShuffleIconState"},{"title":"module:AudioPlayerView.setTrackNumberDisplay","link":"setTrackNumberDisplay"},{"title":"module:AudioPlayerView.setupAnimationTasks","link":"setupAnimationTasks"},{"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.ClockFormat","link":"ClockFormat","description":"

Possible clock formats

"},{"title":"module:Clock.ClockFormat.h12","link":"h12"},{"title":"module:Clock.ClockFormat.h24","link":"h24"},{"title":"module:Clock.format12HourTime","link":"format12HourTime","description":"

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

"},{"title":"module:Clock.format24HourTime","link":"format24HourTime","description":"

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

"},{"title":"module:Clock.formatTimeAsString","link":"formatTimeAsString","description":"

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour 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.initName","link":"initName"},{"title":"module:ExtrasItem.initPosterImg","link":"initPosterImg"},{"title":"module:ExtrasItem.initRole","link":"initRole"},{"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.initTitle","link":"initTitle"},{"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.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook called when the screen is hidden by the screen manager

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

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.initBackdrop","link":"initBackdrop"},{"title":"module:HomeItem.initItemIcon","link":"initItemIcon"},{"title":"module:HomeItem.initItemPoster","link":"initItemPoster"},{"title":"module:HomeItem.initItemText","link":"initItemText"},{"title":"module:HomeItem.initItemTextExtra","link":"initItemTextExtra"},{"title":"module:HomeItem.initPlayedIndicator","link":"initPlayedIndicator"},{"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.LOADING_WAIT_TIME","link":"LOADING_WAIT_TIME"},{"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.alphaActiveChanged","link":"alphaActiveChanged"},{"title":"module:ItemGrid.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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:JFContentItem","link":"JFContentItem"},{"title":"module:JFContentItem.setFields","link":"setFields","description":"

Called whenever m.top.json changes.\nIt is expected that each node that extends JFContentItem will override this function

"},{"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.isLogoVisibleChange","link":"isLogoVisibleChange","description":"

component boolean field isLogoVisibleChange has changed value

"},{"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.SubtitleSelection","link":"SubtitleSelection"},{"title":"module:LoadVideoContentTask.SubtitleSelection.none","link":"none"},{"title":"module:LoadVideoContentTask.SubtitleSelection.notset","link":"notset"},{"title":"module:LoadVideoContentTask.addAudioStreamsToVideo","link":"addAudioStreamsToVideo","description":"

addAudioStreamsToVideo: Add audio stream data to video

"},{"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.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

defaultSubtitleTrack:

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

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook.

"},{"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","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.onMoviePosterSwapAnimationStateChange","link":"onMoviePosterSwapAnimationStateChange","description":"

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

"},{"title":"module:MovieDetails.onNewPosterImageURIChange","link":"onNewPosterImageURIChange","description":"

onNewPosterImageURIChange: Handler for newPosterImageURI param change

"},{"title":"module:MovieDetails.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.LOGO_RIGHT_PADDING","link":"LOGO_RIGHT_PADDING"},{"title":"module:OSD.OPTIONCONTROLS_TOP_PADDING","link":"OPTIONCONTROLS_TOP_PADDING"},{"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.moveOptionControls","link":"moveOptionControls","description":"

moveOptionControls: Moves option controls node based on passed pixel values

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

onButtonSelected: Handler for selection of buttons from the menu.

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

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

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

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

"},{"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.onLogoImageChanged","link":"onLogoImageChanged","description":"

onLogoImageChanged: Handler for changes to m.top.logoImage param.

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

onLogoLoadStatusChanged: Handler for changes to logo image's status.

"},{"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.onSeasonNumberChanged","link":"onSeasonNumberChanged","description":"

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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","description":"

getItemType: Returns the media type of the passed item

"},{"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:RecordingData","link":"RecordingData"},{"title":"module:RecordingData.setFields","link":"setFields"},{"title":"module:RecordingData.setPoster","link":"setPoster"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

"},{"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.handleItemSkipAction","link":"handleItemSkipAction","description":"

handleItemSkipAction: Handles user command to skip items

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

handleShowAudioMenuAction: Handles action to show audio selection 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.onAudioIndexChange","link":"onAudioIndexChange","description":"

Event handler for when audioIndex changes

"},{"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"},{"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.onSelectAudioPressed","link":"onSelectAudioPressed","description":"

onSelectAudioPressed: Display audio selection dialog

"},{"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.processAudioSelection","link":"processAudioSelection","description":"

processAudioSelection: Audio track selection handler

"},{"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"},{"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.canPlay4k","link":"canPlay4k","description":"

does the connected display support playing 4k video?

"},{"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"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.CLIENT_VERSION_REQUIRING_BASE_MIGRATION","link":"CLIENT_VERSION_REQUIRING_BASE_MIGRATION"},{"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.createLogoPoster","link":"createLogoPoster","description":"

Create and return a Jellyfin logo poster node

"},{"title":"module:misc.createOverhangUser","link":"createOverhangUser"},{"title":"module:misc.createSeperator","link":"createSeperator","description":"

Create and return a rectangle node used as a seperator in the overhang

"},{"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.isAllValid","link":"isAllValid","description":"

Returns whether or not all items in passed array are valid

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

isChainValid: Returns whether or not all the properties in the passed property chain are valid.\nStops evaluating at first found false value

"},{"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.toBoolean","link":"toBoolean","description":"

convert value to boolean and return value

"},{"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: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"},{"title":"quickplay","link":"quickplay"},{"title":"quickplay.album","link":"album","description":"

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

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

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

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

A single audio file.

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

A boxset.\nPlay all items inside.

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

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

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

Quick Play A folder.\nShuffle play all items found

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

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

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

A single music video file.

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

Quick Play A Person.\nShuffle play all videos found

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

A single photo.

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

A photo album.

"},{"title":"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":"quickplay.program","link":"program","description":"

Quick Play A Live Program

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

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

"},{"title":"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":"quickplay.series","link":"series","description":"

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

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

Quick Play A TVChannel

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

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

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

A single video file.

"},{"title":"quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"}]} \ 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.exitScrubMode","link":"exitScrubMode","description":"

exitScrubMode: Moves player out of scrub mode state, resets back to standard play mode

"},{"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.moveSeekbarThumb","link":"moveSeekbarThumb","description":"

moveSeekbarThumb: Positions the thumb on the seekbar

"},{"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.processScrubAction","link":"processScrubAction","description":"

processScrubAction: Handles +/- seeking for the audio trickplay bar

"},{"title":"module:AudioPlayerView.resetLoopModeToDefault","link":"resetLoopModeToDefault"},{"title":"module:AudioPlayerView.resetSeekbarThumb","link":"resetSeekbarThumb","description":"

resetSeekbarThumb: Resets the thumb to the playing position

"},{"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.setSelectedButtonState","link":"setSelectedButtonState","description":"

setSelectedButtonState: Changes the icon state url for the currently selected button

"},{"title":"module:AudioPlayerView.setShuffleIconState","link":"setShuffleIconState"},{"title":"module:AudioPlayerView.setTrackNumberDisplay","link":"setTrackNumberDisplay"},{"title":"module:AudioPlayerView.setupAnimationTasks","link":"setupAnimationTasks"},{"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.ClockFormat","link":"ClockFormat","description":"

Possible clock formats

"},{"title":"module:Clock.ClockFormat.h12","link":"h12"},{"title":"module:Clock.ClockFormat.h24","link":"h24"},{"title":"module:Clock.format12HourTime","link":"format12HourTime","description":"

format12HourTime: Returns a string with the current time formatted for a 12 hour clock

"},{"title":"module:Clock.format24HourTime","link":"format24HourTime","description":"

format24HourTime: Returns a string with the current time formatted for a 24 hour clock

"},{"title":"module:Clock.formatTimeAsString","link":"formatTimeAsString","description":"

formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour 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.initName","link":"initName"},{"title":"module:ExtrasItem.initPosterImg","link":"initPosterImg"},{"title":"module:ExtrasItem.initRole","link":"initRole"},{"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.showOrHideMe","link":"showOrHideMe","description":"

don't show popup panel if there is nothing to show

"},{"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.initTitle","link":"initTitle"},{"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.OnScreenHidden","link":"OnScreenHidden","description":"

JFScreen hook called when the screen is hidden by the screen manager

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

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.initBackdrop","link":"initBackdrop"},{"title":"module:HomeItem.initItemIcon","link":"initItemIcon"},{"title":"module:HomeItem.initItemPoster","link":"initItemPoster"},{"title":"module:HomeItem.initItemText","link":"initItemText"},{"title":"module:HomeItem.initItemTextExtra","link":"initItemTextExtra"},{"title":"module:HomeItem.initPlayedIndicator","link":"initPlayedIndicator"},{"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.LOADING_WAIT_TIME","link":"LOADING_WAIT_TIME"},{"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.alphaActiveChanged","link":"alphaActiveChanged"},{"title":"module:ItemGrid.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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:JFContentItem","link":"JFContentItem"},{"title":"module:JFContentItem.setFields","link":"setFields","description":"

Called whenever m.top.json changes.\nIt is expected that each node that extends JFContentItem will override this function

"},{"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.isLogoVisibleChange","link":"isLogoVisibleChange","description":"

component boolean field isLogoVisibleChange has changed value

"},{"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.SubtitleSelection","link":"SubtitleSelection"},{"title":"module:LoadVideoContentTask.SubtitleSelection.none","link":"none"},{"title":"module:LoadVideoContentTask.SubtitleSelection.notset","link":"notset"},{"title":"module:LoadVideoContentTask.addAudioStreamsToVideo","link":"addAudioStreamsToVideo","description":"

addAudioStreamsToVideo: Add audio stream data to video

"},{"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.defaultSubtitleTrack","link":"defaultSubtitleTrack","description":"

defaultSubtitleTrack:

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

defaultSubtitleTrackFromVid: Identifies the default subtitle track given video id

"},{"title":"module:LoadVideoContentTask.directPlaySupported","link":"directPlaySupported"},{"title":"module:LoadVideoContentTask.getContainerType","link":"getContainerType"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook.

"},{"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","description":"

OnScreenShown: Callback function when view is presented on screen

"},{"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.onMoviePosterSwapAnimationStateChange","link":"onMoviePosterSwapAnimationStateChange","description":"

onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state

"},{"title":"module:MovieDetails.onNewPosterImageURIChange","link":"onNewPosterImageURIChange","description":"

onNewPosterImageURIChange: Handler for newPosterImageURI param change

"},{"title":"module:MovieDetails.onPosterLoadStatusChanged","link":"onPosterLoadStatusChanged","description":"

onPosterLoadStatusChanged: Handler for changes to m.moviePosterSwap.loadStatus

"},{"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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.alphaSelectedChanged","link":"alphaSelectedChanged"},{"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.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.LOGO_RIGHT_PADDING","link":"LOGO_RIGHT_PADDING"},{"title":"module:OSD.OPTIONCONTROLS_TOP_PADDING","link":"OPTIONCONTROLS_TOP_PADDING"},{"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.moveOptionControls","link":"moveOptionControls","description":"

moveOptionControls: Moves option controls node based on passed pixel values

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

onButtonSelected: Handler for selection of buttons from the menu.

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

onEpisodeNumberChanged: Handler for changes to m.top.episodeNumber param.

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

onEpisodeNumberEndChanged: Handler for changes to m.top.episodeNumberEnd param.

"},{"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.onLogoImageChanged","link":"onLogoImageChanged","description":"

onLogoImageChanged: Handler for changes to m.top.logoImage param.

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

onLogoLoadStatusChanged: Handler for changes to logo image's status.

"},{"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.onSeasonNumberChanged","link":"onSeasonNumberChanged","description":"

onSeasonNumberChanged: Handler for changes to m.top.seasonNumber 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","description":"

getItemType: Returns the media type of the passed item

"},{"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:RecordingData","link":"RecordingData"},{"title":"module:RecordingData.setFields","link":"setFields"},{"title":"module:RecordingData.setPoster","link":"setPoster"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.onItemSelected","link":"onItemSelected"},{"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.onItemSelected","link":"onItemSelected"},{"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.OnScreenShown","link":"OnScreenShown","description":"

OnScreenShown: Callback function when view is presented on screen

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

get the currently focused item

"},{"title":"module:TVEpisodes.init","link":"init"},{"title":"module:TVEpisodes.onItemSelected","link":"onItemSelected"},{"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.OnScreenShown","link":"OnScreenShown","description":"

JFScreen hook called when the screen is displayed by the screen manager

"},{"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.availSubtitleTrackIdx","link":"availSubtitleTrackIdx","description":"

availSubtitleTrackIdx: Returns Roku's index for requested subtitle track

"},{"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.handleItemSkipAction","link":"handleItemSkipAction","description":"

handleItemSkipAction: Handles user command to skip items

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

handleShowAudioMenuAction: Handles action to show audio selection 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.onAudioIndexChange","link":"onAudioIndexChange","description":"

Event handler for when audioIndex changes

"},{"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"},{"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.onSelectAudioPressed","link":"onSelectAudioPressed","description":"

onSelectAudioPressed: Display audio selection dialog

"},{"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.processAudioSelection","link":"processAudioSelection","description":"

processAudioSelection: Audio track selection handler

"},{"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"},{"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.canPlay4k","link":"canPlay4k","description":"

does the connected display support playing 4k video?

"},{"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"},{"title":"module:migrations","link":"migrations"},{"title":"module:migrations.CLIENT_VERSION_REQUIRING_BASE_MIGRATION","link":"CLIENT_VERSION_REQUIRING_BASE_MIGRATION"},{"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.createLogoPoster","link":"createLogoPoster","description":"

Create and return a Jellyfin logo poster node

"},{"title":"module:misc.createOverhangUser","link":"createOverhangUser"},{"title":"module:misc.createSeperator","link":"createSeperator","description":"

Create and return a rectangle node used as a seperator in the overhang

"},{"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.isAllValid","link":"isAllValid","description":"

Returns whether or not all items in passed array are valid

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

isChainValid: Returns whether or not all the properties in the passed property chain are valid.\nStops evaluating at first found false value

"},{"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.secondsToEndTime","link":"secondsToEndTime"},{"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.toBoolean","link":"toBoolean","description":"

convert value to boolean and return value

"},{"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: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"},{"title":"quickplay","link":"quickplay"},{"title":"quickplay.album","link":"album","description":"

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

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

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

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

A single audio file.

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

A boxset.\nPlay all items inside.

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

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

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

Quick Play A folder.\nShuffle play all items found

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

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

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

A single music video file.

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

Quick Play A Person.\nShuffle play all videos found

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

A single photo.

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

A photo album.

"},{"title":"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":"quickplay.program","link":"program","description":"

Quick Play A Live Program

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

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

"},{"title":"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":"quickplay.series","link":"series","description":"

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

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

Quick Play A TVChannel

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

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

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

A single video file.

"},{"title":"quickplay.videoContainer","link":"videoContainer","description":"

A container with some kind of videos inside of it

"}]} \ No newline at end of file diff --git a/docs/api/module-ExtrasRowList.html b/docs/api/module-ExtrasRowList.html index 787fc87b..ece94438 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() → {void}

Returns:
Type: 
void

(static) showOrHideMe() → {void}

don't show popup panel if there is nothing to show

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-ShowScenes.html b/docs/api/module-ShowScenes.html index c16803e7..4025853f 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, selectId) → {dynamic}

Parameters:
NameTypeDescription
seriesIDstring
seasonIDstring
selectIdstring
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-TVEpisodeRow.html b/docs/api/module-TVEpisodeRow.html index f86f8e6b..23562597 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) onItemSelected() → {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 57816b38..1fae0d9d 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) onItemSelected() → {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 89788dc1..8bd162a1 100644 --- a/docs/api/module-TVEpisodes.html +++ b/docs/api/module-TVEpisodes.html @@ -1,3 +1,3 @@ Module: TVEpisodes
On this page

Methods

(static) OnScreenShown() → {void}

OnScreenShown: Callback function when view is presented on screen

Returns:
Type: 
void

(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) OnScreenShown() → {void}

OnScreenShown: Callback function when view is presented on screen

Returns:
Type: 
void

(static) getFocusedItem() → {dynamic}

get the currently focused item

Returns:
Type: 
dynamic

(static) init() → {void}

Returns:
Type: 
void

(static) onItemSelected() → {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-misc.html b/docs/api/module-misc.html index 6eef4113..3126f2fd 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) createLogoPoster() → {dynamic}

Create and return a Jellyfin logo poster node

Returns:
Type: 
dynamic

(static) createOverhangUser() → {dynamic}

Returns:
Type: 
dynamic

(static) createSeperator(id) → {dynamic}

Create and return a rectangle node used as a seperator in the overhang

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(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) isAllValid(input) → {boolean}

Returns whether or not all items in passed array are valid

Parameters:
NameTypeDescription
inputobject
Returns:
Type: 
boolean

(static) isChainValid(root, propertyPath) → {boolean}

isChainValid: Returns whether or not all the properties in the passed property chain are valid. Stops evaluating at first found false value

Parameters:
NameTypeDescription
rootdynamic

high-level object to test property chain against

propertyPathstring

chain of properties under root object to test

Returns:

indicating if all properties in chain are valid

Type: 
boolean

(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) toBoolean(value) → {dynamic}

convert value to boolean and return value

Parameters:
NameTypeDescription
valuedynamic
Returns:
Type: 
dynamic

(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) createLogoPoster() → {dynamic}

Create and return a Jellyfin logo poster node

Returns:
Type: 
dynamic

(static) createOverhangUser() → {dynamic}

Returns:
Type: 
dynamic

(static) createSeperator(id) → {dynamic}

Create and return a rectangle node used as a seperator in the overhang

Parameters:
NameTypeDescription
idstring
Returns:
Type: 
dynamic

(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) isAllValid(input) → {boolean}

Returns whether or not all items in passed array are valid

Parameters:
NameTypeDescription
inputobject
Returns:
Type: 
boolean

(static) isChainValid(root, propertyPath) → {boolean}

isChainValid: Returns whether or not all the properties in the passed property chain are valid. Stops evaluating at first found false value

Parameters:
NameTypeDescription
rootdynamic

high-level object to test property chain against

propertyPathstring

chain of properties under root object to test

Returns:

indicating if all properties in chain are valid

Type: 
boolean

(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) secondsToEndTime(totalSeconds) → {string}

Parameters:
NameTypeDescription
totalSecondsdynamic
Returns:
Type: 
string

(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) toBoolean(value) → {dynamic}

convert value to boolean and return value

Parameters:
NameTypeDescription
valuedynamic
Returns:
Type: 
dynamic

(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 906dbc59..13dd5122 100644 --- a/docs/api/source_Main.bs.html +++ b/docs/api/source_Main.bs.html @@ -38,7 +38,7 @@ sceneManager = CreateObject("roSGNode", "SceneManager") sceneManager.observeField("dataReturned", m.port) - m.global.addFields({ app_loaded: false, playstateTask: playstateTask, sceneManager: sceneManager }) + m.global.addFields({ app_loaded: false, playstateTask: playstateTask, sceneManager: sceneManager, launchSource: "" }) m.global.addFields({ queueManager: CreateObject("roSGNode", "QueueManager") }) m.global.addFields({ audioPlayer: CreateObject("roSGNode", "AudioPlayer") }) @@ -309,22 +309,39 @@ audio_stream_idx = selectedItem.selectedAudioStreamIndex end if + launchSource = m.global.launchSource + m.global.launchSource = "" + selectedItem.selectedAudioStreamIndex = audio_stream_idx - ' Display playback options dialog - if selectedItem.json.userdata.PlaybackPositionTicks > 0 - m.global.queueManager.callFunc("hold", selectedItem) - playbackOptionDialog(selectedItem.json.userdata.PlaybackPositionTicks, selectedItem.json) - else - m.global.queueManager.callFunc("clear") - m.global.queueManager.callFunc("push", selectedItem) - m.global.queueManager.callFunc("playQueue") + + localGlobal = m.global + + ' we only use this special steering logic from the home screen + if launchSource <> "home" + ' Display playback options dialog + if selectedItem.json.userdata.PlaybackPositionTicks > 0 + m.global.queueManager.callFunc("hold", selectedItem) + playbackOptionDialog(selectedItem.json.userdata.PlaybackPositionTicks, selectedItem.json) + else + m.global.queueManager.callFunc("clear") + m.global.queueManager.callFunc("push", selectedItem) + m.global.queueManager.callFunc("playQueue") + end if + + else if localGlobal.session.user.settings["ui.general.episodenextupbehavior"] = "episode" + group = CreateMovieDetailsGroup(selectedItem) + + else if localGlobal.session.user.settings["ui.general.episodenextupbehavior"] = "season" + group = CreateSeasonDetailsGroupByID(selectedItem.json.SeriesId, selectedItem.json.SeasonId, selectedItem.id) + end if + else if selectedItemType = "Series" group = CreateSeriesDetailsGroup(selectedItem.json.id) else if selectedItemType = "Season" if isValid(selectedItem.json) and isValid(selectedItem.json.SeriesId) and isValid(selectedItem.id) - group = CreateSeasonDetailsGroupByID(selectedItem.json.SeriesId, selectedItem.id) + group = CreateSeasonDetailsGroupByID(selectedItem.json.SeriesId, selectedItem.id, "") else stopLoadingSpinner() message_dialog(tr("Error loading Season")) @@ -865,7 +882,7 @@ else if popupNode.returnData.indexselected = 3 ' User chose Go to season if isValid(selectedItem[0].json) and isValid(selectedItem[0].json.SeriesId) and isValid(selectedItem[0].json.seasonID) - CreateSeasonDetailsGroupByID(selectedItem[0].json.SeriesId, selectedItem[0].json.seasonID) + CreateSeasonDetailsGroupByID(selectedItem[0].json.SeriesId, selectedItem[0].json.seasonID, "") else stopLoadingSpinner() message_dialog(tr("Error loading Season")) diff --git a/docs/api/source_ShowScenes.bs.html b/docs/api/source_ShowScenes.bs.html index 94a4966c..16725a94 100644 --- a/docs/api/source_ShowScenes.bs.html +++ b/docs/api/source_ShowScenes.bs.html @@ -648,7 +648,7 @@ function CreateSeriesDetailsGroup(seriesID as string) as dynamic ' Divert to season details if user setting goStraightToEpisodeListing is enabled and only one season exists. if seasonData <> invalid and m.global.session.user.settings["ui.tvshows.goStraightToEpisodeListing"] and seasonData.Items.Count() = 1 stopLoadingSpinner() - return CreateSeasonDetailsGroupByID(seriesID, seasonData.Items[0].id) + return CreateSeasonDetailsGroupByID(seriesID, seasonData.Items[0].id, "") end if ' start building SeriesDetails view group = CreateObject("roSGNode", "TVShowDetails") @@ -795,7 +795,7 @@ function CreateSeasonDetailsGroup(series as object, season as object) as dynamic return group end function -function CreateSeasonDetailsGroupByID(seriesID as string, seasonID as string) as dynamic +function CreateSeasonDetailsGroupByID(seriesID as string, seasonID as string, selectId as string) as dynamic ' validate parameters if seriesID = "" or seasonID = "" then return invalid @@ -807,9 +807,11 @@ function CreateSeasonDetailsGroupByID(seriesID as string, seasonID as string) as stopLoadingSpinner() return invalid end if + ' start building SeasonDetails view group = CreateObject("roSGNode", "TVEpisodes") group.optionsAvailable = false + ' push scene asap (to prevent extra button presses when retriving series/movie info) group.seasonData = seasonMetaData.json group.objects = TVEpisodes(seriesID, seasonID) @@ -823,6 +825,10 @@ function CreateSeasonDetailsGroupByID(seriesID as string, seasonID as string) as ' check for specials/extras for this season group.extrasObjects = TVSeasonExtras(seasonID) + group.observeField("sceneReady", "onSceneReady") + + group.selectItemId = selectId + ' finished building SeasonDetails view return group end function diff --git a/docs/api/source_utils_misc.bs.html b/docs/api/source_utils_misc.bs.html index 3e9ccd60..e26f7a43 100644 --- a/docs/api/source_utils_misc.bs.html +++ b/docs/api/source_utils_misc.bs.html @@ -72,6 +72,24 @@ function secondsToHuman(totalSeconds as integer, addLeadingMinuteZero as boolean return humanTime end function +function secondsToEndTime(totalSeconds) as string + ' Get the current time in seconds since midnight UTC (Unix Epoch Time) + currentUTCTime = CreateObject("roDateTime").AsSeconds() + + ' Calculate the target time in seconds by adding the number of seconds + targetTimeInSeconds = currentUTCTime + totalSeconds + + ' Create a new roDateTime object for the target time + targetDateTime = CreateObject("roDateTime") + targetDateTime.FromSeconds(targetTimeInSeconds) + targetDateTime.ToLocalTime() + + formattedTime = formatTime(targetDateTime) + + return formattedTime +end function + + ' Format time as 12 or 24 hour format based on system clock setting function formatTime(time) as string hours = time.getHours() From 21af7ff2e4a173872af20283633e5b9705d3e52b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:20:26 +0000 Subject: [PATCH 123/141] Update actions/checkout digest to 11bd719 --- .github/workflows/build-dev.yml | 2 +- .github/workflows/build-docs.yml | 2 +- .github/workflows/build-prod.yml | 2 +- .github/workflows/bump-version.yml | 12 ++++++------ .github/workflows/deploy-api-docs.yml | 2 +- .github/workflows/roku-analysis.yml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml index 3f5bf9a9..c09b3487 100644 --- a/.github/workflows/build-dev.yml +++ b/.github/workflows/build-dev.yml @@ -10,7 +10,7 @@ jobs: if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4 with: node-version: "lts/*" diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 9dbb9521..18065e5d 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -13,7 +13,7 @@ jobs: # Give the default GITHUB_TOKEN write permission to commit and push the changed files back to the repository. contents: write steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: ref: ${{ github.head_ref }} token: ${{ secrets.JF_BOT_TOKEN }} diff --git a/.github/workflows/build-prod.yml b/.github/workflows/build-prod.yml index 18c3cfc3..6b99438e 100644 --- a/.github/workflows/build-prod.yml +++ b/.github/workflows/build-prod.yml @@ -12,7 +12,7 @@ jobs: if: ${{ github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'release-prep') }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4 with: node-version: "lts/*" diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml index 00a5aa9c..43ea03d9 100644 --- a/.github/workflows/bump-version.yml +++ b/.github/workflows/bump-version.yml @@ -26,7 +26,7 @@ jobs: steps: # Setup - name: Checkout code - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Install required packages uses: awalsh128/cache-apt-pkgs-action@latest with: @@ -50,7 +50,7 @@ jobs: run: echo "targetBranch=${{ env.bugfixBranch }}" >> $GITHUB_ENV - name: Checkout bugfix branch if: github.event.inputs.targetBranch == 'bugfix' - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: ref: ${{ env.targetBranch }} # Save old version again if needed @@ -101,7 +101,7 @@ jobs: steps: # Setup - name: Checkout code - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Install jq to update json uses: awalsh128/cache-apt-pkgs-action@latest with: @@ -125,7 +125,7 @@ jobs: run: echo "targetBranch=${{ env.bugfixBranch }}" >> $GITHUB_ENV - name: Checkout bugfix branch if: github.event.inputs.targetBranch == 'bugfix' - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: ref: ${{ env.targetBranch }} # Calculate new version @@ -169,7 +169,7 @@ jobs: steps: # Setup - name: Checkout code - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Install jq to update json uses: awalsh128/cache-apt-pkgs-action@latest with: @@ -193,7 +193,7 @@ jobs: run: echo "targetBranch=${{ env.bugfixBranch }}" >> $GITHUB_ENV - name: Checkout bugfix branch if: github.event.inputs.targetBranch == 'bugfix' - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: ref: ${{ env.targetBranch }} # Calculate new version diff --git a/.github/workflows/deploy-api-docs.yml b/.github/workflows/deploy-api-docs.yml index 85d24a33..2ba5234b 100644 --- a/.github/workflows/deploy-api-docs.yml +++ b/.github/workflows/deploy-api-docs.yml @@ -30,7 +30,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Setup Pages uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5 - name: Upload artifact diff --git a/.github/workflows/roku-analysis.yml b/.github/workflows/roku-analysis.yml index 503bc1c8..f170dc48 100644 --- a/.github/workflows/roku-analysis.yml +++ b/.github/workflows/roku-analysis.yml @@ -12,7 +12,7 @@ jobs: if: github.repository == 'jellyfin/jellyfin-roku' && github.event_name != 'pull_request' || github.repository == 'jellyfin/jellyfin-roku' && github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name runs-on: ubuntu-latest steps: - - uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4 with: node-version: "lts/*" From 7f1cc982392eb391c3840d568b0e20577a5ea0bb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 16:13:05 +0000 Subject: [PATCH 124/141] Update actions/setup-java digest to 8df1039 --- .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 503bc1c8..f70045b4 100644 --- a/.github/workflows/roku-analysis.yml +++ b/.github/workflows/roku-analysis.yml @@ -28,7 +28,7 @@ jobs: if: env.BRANCH_NAME == 'master' run: npm run build-prod - name: Setup Java - uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4 + uses: actions/setup-java@8df1039502a15bceb9433410b1a100fbe190c53b # v4 with: distribution: "temurin" java-version: "21" From cf653d4c19628367dc81f80ae5cea08ff5101016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl?= Date: Fri, 25 Oct 2024 17:31:23 +0000 Subject: [PATCH 125/141] Translated using Weblate (French) Currently translated at 100.0% (292 of 292 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/fr/ --- locale/fr/translations.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/locale/fr/translations.ts b/locale/fr/translations.ts index c843ba7c..5212ac2f 100644 --- a/locale/fr/translations.ts +++ b/locale/fr/translations.ts @@ -1330,6 +1330,18 @@ Images d'épisodes à suivre User Setting - Setting title
+ + Play Next Episode Automatically + Lancer automatiquement le nouvel épisode + + + Special + Spécial + + + When finished playing a single episode, play the next one automatically. + Lorsque la lecture d'un épisode est terminée, lancer automatiquement le suivant. +
From 8c62550414fd4a2ac923065d639e44909173819e Mon Sep 17 00:00:00 2001 From: Lantium Date: Sat, 26 Oct 2024 11:02:39 +0000 Subject: [PATCH 126/141] Translated using Weblate (French) Currently translated at 99.0% (298 of 301 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/fr/ --- locale/fr/translations.ts | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/locale/fr/translations.ts b/locale/fr/translations.ts index 5212ac2f..a9ccba16 100644 --- a/locale/fr/translations.ts +++ b/locale/fr/translations.ts @@ -1342,6 +1342,42 @@ When finished playing a single episode, play the next one automatically. Lorsque la lecture d'un épisode est terminée, lancer automatiquement le suivant. + + How is remaining time represented. Remaining time shows hours, minutes, and seconds remaining. Time of day shows what time the video will complete. + Comment le temps restant est-il représenté ? Le temps restant indique les heures, les minutes et les secondes restantes. L'heure du jour indique l'heure à laquelle la vidéo se terminera. + + + Episode Next Up Behavior + Épisode suivant : Comportement + + + This controls what clicking OK on a Next Up episode does. + Cela contrôle ce que fait un clic sur OK sur un épisode suivant. + + + View Episode Details + Voir les détails de l'épisode + + + View Season Details + Voir les détails de la saison + + + OSD Remaining Time + Durée restante de l'affichage à l'écran + + + Remaining Time + Temps restant + + + Time of Day + Heure de la journée + + + Both + Les deux + From 9cc9efee5009c03c0cf37b3c6182bc4dd2a498ec Mon Sep 17 00:00:00 2001 From: NOV Date: Sun, 27 Oct 2024 01:26:32 +0000 Subject: [PATCH 127/141] Translated using Weblate (French) Currently translated at 99.3% (299 of 301 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/fr/ --- locale/fr/translations.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/fr/translations.ts b/locale/fr/translations.ts index a9ccba16..82328018 100644 --- a/locale/fr/translations.ts +++ b/locale/fr/translations.ts @@ -1352,7 +1352,7 @@ This controls what clicking OK on a Next Up episode does. - Cela contrôle ce que fait un clic sur OK sur un épisode suivant. + Cela contrôle ce que fait un clic sur OK sur un épisode suivant. View Episode Details @@ -1364,7 +1364,7 @@ OSD Remaining Time - Durée restante de l'affichage à l'écran + Affichage à l'écran du temps restant Remaining Time From db8485ca6139ff6391565bb78f908e7b3f9969c5 Mon Sep 17 00:00:00 2001 From: Michael Cresswell Date: Sun, 27 Oct 2024 11:49:32 -0400 Subject: [PATCH 128/141] Add channel number to Live TV channel title --- components/data/ChannelData.bs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/components/data/ChannelData.bs b/components/data/ChannelData.bs index ff4ec818..f7080839 100644 --- a/components/data/ChannelData.bs +++ b/components/data/ChannelData.bs @@ -5,7 +5,11 @@ import "pkg:/source/utils/config.bs" sub setFields() json = m.top.json m.top.id = json.id - m.top.title = json.name + if json.number <> "" + m.top.title = json.number + " " + json.name + else + m.top.title = json.name + end if m.top.live = true m.top.Type = "TvChannel" setPoster() From 99be8d56326a0b8556cdd1cf58072f0f72a6bf92 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 03:50:58 +0000 Subject: [PATCH 129/141] Update actions/setup-node digest to 39370e3 --- .github/workflows/build-dev.yml | 2 +- .github/workflows/build-prod.yml | 2 +- .github/workflows/roku-analysis.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml index c09b3487..70cb8b70 100644 --- a/.github/workflows/build-dev.yml +++ b/.github/workflows/build-dev.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4 + - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4 with: node-version: "lts/*" cache: "npm" diff --git a/.github/workflows/build-prod.yml b/.github/workflows/build-prod.yml index 6b99438e..c2575989 100644 --- a/.github/workflows/build-prod.yml +++ b/.github/workflows/build-prod.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4 + - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4 with: node-version: "lts/*" cache: "npm" diff --git a/.github/workflows/roku-analysis.yml b/.github/workflows/roku-analysis.yml index f170dc48..88640b83 100644 --- a/.github/workflows/roku-analysis.yml +++ b/.github/workflows/roku-analysis.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4 + - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4 with: node-version: "lts/*" cache: "npm" From 572cce8f775e1a633e8f3ff0d05ccb362832b8c6 Mon Sep 17 00:00:00 2001 From: Michael Cresswell Date: Mon, 28 Oct 2024 16:27:45 -0400 Subject: [PATCH 130/141] Make more robust with validation function and string template --- components/data/ChannelData.bs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/data/ChannelData.bs b/components/data/ChannelData.bs index f7080839..3f5f3998 100644 --- a/components/data/ChannelData.bs +++ b/components/data/ChannelData.bs @@ -5,8 +5,8 @@ import "pkg:/source/utils/config.bs" sub setFields() json = m.top.json m.top.id = json.id - if json.number <> "" - m.top.title = json.number + " " + json.name + if isValid(json.number) + m.top.title = `CH ${json.number} ${json.name}` else m.top.title = json.name end if From dee86eaf2804286fd69fb0298e5cd56cd17bc720 Mon Sep 17 00:00:00 2001 From: Andi Chandler Date: Thu, 31 Oct 2024 12:18:22 +0000 Subject: [PATCH 131/141] Translated using Weblate (English (United Kingdom)) Currently translated at 100.0% (301 of 301 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/en_GB/ --- locale/en_GB/translations.ts | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/locale/en_GB/translations.ts b/locale/en_GB/translations.ts index 8193d8e5..1ac5b4f2 100644 --- a/locale/en_GB/translations.ts +++ b/locale/en_GB/translations.ts @@ -1326,6 +1326,42 @@ Special Special + + How is remaining time represented. Remaining time shows hours, minutes, and seconds remaining. Time of day shows what time the video will complete. + How is remaining time represented. Remaining time shows hours, minutes, and seconds remaining. Time of day shows what time the video will complete. + + + Episode Next Up Behavior + Episode Next Up Behaviour + + + This controls what clicking OK on a Next Up episode does. + This controls what clicking OK on a Next Up episode does. + + + View Episode Details + View Episode Details + + + View Season Details + View Season Details + + + OSD Remaining Time + OSD Remaining Time + + + Remaining Time + Remaining Time + + + Time of Day + Time of Day + + + Both + Both + From da9440387d4235915629c4f17a39612c31aae8e2 Mon Sep 17 00:00:00 2001 From: Jimi Date: Sun, 3 Nov 2024 06:44:33 -0700 Subject: [PATCH 132/141] Remeber Roku subs settings for videos with Forced subs --- components/video/VideoPlayerView.bs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index 215f0682..109a5569 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -9,6 +9,7 @@ sub init() m.top.getScene().findNode("overhang").visible = false userSettings = m.global.session.user.settings m.currentItem = m.global.queueManager.callFunc("getCurrentItem") + m.originalClosedCaptionState = invalid m.top.id = m.currentItem.id m.top.seekMode = "accurate" @@ -461,7 +462,12 @@ sub onVideoContentLoaded() availableSubtitleTrackIndex = availSubtitleTrackIdx(selectedSubtitle.Track.TrackName) if availableSubtitleTrackIndex <> -1 if not selectedSubtitle.IsEncoded - m.top.globalCaptionMode = "On" + if selectedSubtitle.IsForced + ' If IsForced, make sure to remember the Roku global setting so we + ' can set it back when the video is done playing. + m.originalClosedCaptionState = m.top.globalCaptionMode + m.top.globalCaptionMode = "On" + end if m.top.subtitleTrack = m.top.availableSubtitleTracks[availableSubtitleTrackIndex].TrackName end if end if @@ -697,6 +703,12 @@ sub ReportPlayback(state = "update" as string) m.bufferCheckTimer.duration = 30 end if + if (state = "stop" or state = "finished") and m.originalClosedCaptionState <> invalid + m.log.debug("ReportPlayback() setting", m.top.globalCaptionMode, "back to", m.originalClosedCaptionState) + m.top.globalCaptionMode = m.originalClosedCaptionState + m.originalClosedCaptionState = invalid + end if + ' Report playstate via worker task playstateTask = m.global.playstateTask playstateTask.setFields({ status: state, params: params }) From b60378a0b9c6a8baa03dff479643b2a19047d87a Mon Sep 17 00:00:00 2001 From: Frostslayer Date: Sun, 3 Nov 2024 13:53:20 +0000 Subject: [PATCH 133/141] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (301 of 301 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/pt_BR/ --- locale/pt_BR/translations.ts | 48 ++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/locale/pt_BR/translations.ts b/locale/pt_BR/translations.ts index 37c2d3dd..0e54760e 100644 --- a/locale/pt_BR/translations.ts +++ b/locale/pt_BR/translations.ts @@ -1353,6 +1353,54 @@ Usar imagem da série User Setting - Setting option title + + Play Next Episode Automatically + Reproduzir o próximo episódio automaticamente + + + When finished playing a single episode, play the next one automatically. + Quando terminar de reproduzir um único episodio, reproduz o próximo de forma automática. + + + Special + Especial + + + How is remaining time represented. Remaining time shows hours, minutes, and seconds remaining. Time of day shows what time the video will complete. + Como o tempo restante é representado. O tempo exibe as horas, minutos e segundos restantes. A hora do dia mostra o horário em que o vídeo será concluído. + + + Episode Next Up Behavior + Comportamento do Próximo Episódio + + + View Episode Details + Ver Detalhes do Episódio + + + This controls what clicking OK on a Next Up episode does. + Isso controla o que acontece ao pressionar OK no próximo episódio. + + + View Season Details + Ver Detalhes da Temporada + + + Remaining Time + Tempo Restante + + + OSD Remaining Time + Tempo Restante de Exibição na Tela + + + Time of Day + Hora do Dia + + + Both + Ambos + From 05fed807598d484017b5029ac375a6a762081c00 Mon Sep 17 00:00:00 2001 From: Frostslayer Date: Sun, 3 Nov 2024 16:24:54 +0000 Subject: [PATCH 134/141] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (301 of 301 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/pt_BR/ --- locale/pt_BR/translations.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/pt_BR/translations.ts b/locale/pt_BR/translations.ts index 0e54760e..e645ba11 100644 --- a/locale/pt_BR/translations.ts +++ b/locale/pt_BR/translations.ts @@ -1371,7 +1371,7 @@ Episode Next Up Behavior - Comportamento do Próximo Episódio + Comportamento do A Seguir View Episode Details @@ -1379,7 +1379,7 @@ This controls what clicking OK on a Next Up episode does. - Isso controla o que acontece ao pressionar OK no próximo episódio. + Isso controla o comportamento ao clicar OK no A Seguir. View Season Details From 738764c65e643fd777966697d99b60c62cff37d8 Mon Sep 17 00:00:00 2001 From: Justin Date: Sun, 3 Nov 2024 19:32:38 +0000 Subject: [PATCH 135/141] Translated using Weblate (German) Currently translated at 100.0% (301 of 301 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/de/ --- locale/de_DE/translations.ts | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts index ebf06248..a4550648 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -1350,6 +1350,42 @@ Special Special + + Episode Next Up Behavior + Nächste Episode Verhalten + + + This controls what clicking OK on a Next Up episode does. + Damit wird gesteuert, was ein Klick auf OK bei einer Folge von Next Up bewirkt. + + + View Episode Details + Details zur Episode ansehen + + + View Season Details + Staffel Details ansehen + + + OSD Remaining Time + verbleibende OSD Zeit + + + How is remaining time represented. Remaining time shows hours, minutes, and seconds remaining. Time of day shows what time the video will complete. + Wie wird die verbleibende Zeit dargestellt? Die verbleibende Zeit zeigt die verbleibenden Stunden, Minuten und Sekunden an. Die Tageszeit zeigt an, wann das Video beendet sein wird. + + + Remaining Time + verbleibende Zeit + + + Time of Day + Tageszeit + + + Both + Beide + From 41cbb9643a7fc7d31527e4d21ed3e7d8b216550b Mon Sep 17 00:00:00 2001 From: BalHaise Date: Mon, 4 Nov 2024 00:17:16 +0000 Subject: [PATCH 136/141] Translated using Weblate (French) Currently translated at 99.3% (299 of 301 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/fr/ --- locale/fr/translations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/fr/translations.ts b/locale/fr/translations.ts index 82328018..65d3b5c8 100644 --- a/locale/fr/translations.ts +++ b/locale/fr/translations.ts @@ -1348,7 +1348,7 @@ Episode Next Up Behavior - Épisode suivant : Comportement + Comportement du prochain épisode This controls what clicking OK on a Next Up episode does. From 2429a573cbaec7428a27790d3612fd387899afb6 Mon Sep 17 00:00:00 2001 From: Nastase Alexandru Date: Tue, 5 Nov 2024 08:23:52 +0000 Subject: [PATCH 137/141] Translated using Weblate (Romanian) Currently translated at 67.7% (204 of 301 strings) Translation: Jellyfin/Jellyfin Roku Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-roku/ro/ --- locale/ro/translations.ts | 304 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) diff --git a/locale/ro/translations.ts b/locale/ro/translations.ts index 77c37c84..25f57c0c 100644 --- a/locale/ro/translations.ts +++ b/locale/ro/translations.ts @@ -581,6 +581,310 @@ Necunoscut Title for a cast member for which we have no information for + + Bring the theater experience straight to your living room with the ability to play custom intros before the main feature. + Adu experiența cinematografică direct în sufrageria ta, cu posibilitatea de a reda introduceri personalizate înainte de filmul principal. + + + Slideshow Paused + Slideshow Paused + + + Random Off + Aleatoriu Oprit + + + Use Splashscreen as Home Background + Folosește Ecranul de Start ca Fundal pentru Pagina Principală + + + Audio Codec + Codec Audio + + + You can search for Titles, People, Live TV Channels and more + Poți căuta Titluri, Persoane, Canale TV live și altele + + + Attempt Direct Play for HEVC media with unsupported profile levels before falling back to transcoding if it fails. + Încearcă redarea directă pentru media HEVC cu niveluri de profil nesuportate, înainte de a recurge la transcodare dacă aceasta eșuează. + + + Reason + Motiv + + + Video Codec + Codec Video + + + Size + Dimensiune + + + Use voice remote to search + Folosește căutare vocală + + + H.264 + H.264 + + + Settings relating to how the application looks. + Setări referitoare la aspectul aplicației. + + + Go directly to the episode list if a TV series has only one season. + Mergi direct la lista de episoade dacă un serial are un singur sezon. + + + Blur images of unwatched episodes. + Estompează imaginile episoadelor nevizionate. + + + Hide Clock + Ascunde Ceasul + + + Hide all clocks in Jellyfin. Jellyfin will need to be closed and reopened for changes to take effect. + Ascunde ceasul peste tot in Jellyfin. Va fi necesar să închizi și să redeschizi Jellyfin pentru ca modificările să aibă efect. + + + Attempt Direct Play for H.264 media with unsupported profile levels before falling back to transcoding if it fails. + Încearcă redarea directă pentru media H.264 cu niveluri de profil nesuportate, înainte de a recurge la transcodare dacă aceasta eșuează. + + + Custom Subtitles + Subtitrări Personalizate + + + 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. + Înlocuiește funcțiile implicite de subtitrare ale Roku cu funcții personalizate care suportă fonturi CJK (chineză, japoneză, coreeană). Fonturile de rezervă trebuie configurate și activate pe server pentru ca redarea CJK să funcționeze. + + + all + toate + + + Slideshow Off + Slideshow Off + + + Slideshow On + Slideshow On + + + MPEG-4 Support + Suport MPEG-4 + + + Slideshow Resumed + Slideshow Resumed + + + Parental Ratings + Evaluări Parentale + + + Years + Ani + + + Show What's New Popup + Afișează Popup-ul „Ce e Nou” + + + Show What's New popup when Jellyfin is updated to a new version. + Afișează popup-ul „Ce e Nou” când Jellyfin este actualizat la o versiune nouă. + + + Next episode + Următorul episod + + + Random On + Aleatoriu Pornit + + + Movies (Presentation) + Filme (Prezentare) + + + Movies (Grid) + Filme (Grilă) + + + Show item count in the library and index of selected item. + Afișează numărul de elemente din bibliotecă și indexul elementului selectat. + + + Here is your Quick Connect code: + Iată codul tău de Conectare Rapidă: + + + Hide Taglines + Ascunde sloganurile + + + Design Elements + Elemente de Design + + + Play Trailer + Redă Trailer + + + Transcoding Information + Informații de transcodare + + + Audio Channels + Canale Audio + + + Level + Nivel + + + Video range type + Tipul intervalului video + + + Set Favorite + Setează că favorit + + + Set Watched + Marcheaza ca vizionat + + + Go to series + Mergi la sezoane + + + Search now + Caută acum + + + (Dialog will close automatically) + (Dialogul se va închide automat) + + + Return to Top + Revino la început + + + Studios + Studiouri + + + 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). + Folosește butonul de reluare pentru a anima încet până la primul element din folder. (Dacă este dezactivat, folderul va reveni imediat la primul element). + + + Hides tagline text on details pages. + Ascunde textul de slogan pe paginile de detalii. + + + Options for TV Shows. + Opțiuni pentru seriale TV. + + + Blur Unwatched Episodes + Estompează episoadele nevizionate + + + Skip Details for Single Seasons + Omite detaliile pentru sezoanele individuale + + + Options that alter the design of Jellyfin. + Opțiuni ce modifică designul Jellyfin. + + + Use generated splashscreen image as Jellyfin's home background. Jellyfin will need to be closed and reopened for change to take effect. + Folosește imaginea generată a ecranului de start ca fundal pentru pagina principală a Jellyfin. Va fi necesar să închizi și să redeschizi Jellyfin pentru ca schimbarea să aibă efect. + + + Cinema Mode + Mod Cinema + + + HEVC + HEVC + + + Settings relating to playback and supported codec and media types. + Setări referitoare la redare și la codec-urile și tipurile de media acceptate. + + + Max Days Next Up + Zile Maxime la Următorul Episod + + + Playback Information + Informații de redare + + + Set the maximum amount of days a show should stay in the 'Next Up' list without watching it. + Setează numărul maxim de zile în care un serial ar trebui să rămână în lista „Următorul Episod” fără a fi vizionat. + + + direct + direct + + + Total Bitrate + Bitrate Total + + + Stream Information + Informații Stream + + + Codec + Codec + + + Codec Tag + Tag Codec + + + Bit Rate + Bit Rate + + + Container + Container + + + Pixel format + Format Pixel + + + WxH + Lățime x Înălțime (LxÎ) + + + Unable to find any albums or songs belonging to this artist + Nu s-au găsit albume sau melodii aparținând acestui artist + + + Text Subtitles Only + Doar Subtitrări Text + + + Aired + Difuzat + + + Only display text subtitles to minimize transcoding. + Afișează doar subtitrările text pentru a minimiza transcodarea. + + + Unplayed + Nevizionat + From dae7677dbe6f1fc0a2ad001cfcd11a6b1290d320 Mon Sep 17 00:00:00 2001 From: Michael Cresswell Date: Wed, 6 Nov 2024 15:49:34 -0500 Subject: [PATCH 138/141] Add localization for channel abbreviation string --- components/data/ChannelData.bs | 2 +- locale/en_US/translations.ts | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/components/data/ChannelData.bs b/components/data/ChannelData.bs index 3f5f3998..e9bc35f0 100644 --- a/components/data/ChannelData.bs +++ b/components/data/ChannelData.bs @@ -6,7 +6,7 @@ sub setFields() json = m.top.json m.top.id = json.id if isValid(json.number) - m.top.title = `CH ${json.number} ${json.name}` + m.top.title = `${tr("CH")} ${json.number} ${json.name}` else m.top.title = json.name end if diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts index 14445ef9..2bfc46dc 100644 --- a/locale/en_US/translations.ts +++ b/locale/en_US/translations.ts @@ -1371,5 +1371,10 @@ Special Special episode of a TV Show + + CH + CH + Abbreviation for Channel + \ No newline at end of file From 67138f6d98c8f5598c91a36272457b93e3788b77 Mon Sep 17 00:00:00 2001 From: Charles Ewert Date: Wed, 6 Nov 2024 20:59:18 -0500 Subject: [PATCH 139/141] fix sorting by Date Played when viewing a TV Show library --- components/ItemGrid/ItemGrid.bs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ItemGrid/ItemGrid.bs b/components/ItemGrid/ItemGrid.bs index 2b5875d9..8aba4e33 100644 --- a/components/ItemGrid/ItemGrid.bs +++ b/components/ItemGrid/ItemGrid.bs @@ -302,7 +302,7 @@ sub setTvShowsOptions(options) { "Title": tr("TITLE"), "Name": "SortName" }, { "Title": tr("IMDB_RATING"), "Name": "CommunityRating" }, { "Title": tr("DATE_ADDED"), "Name": "DateCreated" }, - { "Title": tr("DATE_PLAYED"), "Name": "DatePlayed" }, + { "Title": tr("DATE_PLAYED"), "Name": "SeriesDatePlayed" }, { "Title": tr("OFFICIAL_RATING"), "Name": "OfficialRating" }, { "Title": tr("RELEASE_DATE"), "Name": "PremiereDate" }, { "Title": tr("Random"), "Name": "Random" }, From f5648360a59a55750f8114f451bae0f71b39579d Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Fri, 8 Nov 2024 02:39:55 +0000 Subject: [PATCH 140/141] Update API docs --- docs/api/components_data_ChannelData.bs.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/api/components_data_ChannelData.bs.html b/docs/api/components_data_ChannelData.bs.html index 9ee19420..3a12c2ea 100644 --- a/docs/api/components_data_ChannelData.bs.html +++ b/docs/api/components_data_ChannelData.bs.html @@ -7,7 +7,11 @@ import "pkg:/source/utils/config.bs" sub setFields() json = m.top.json m.top.id = json.id - m.top.title = json.name + if isValid(json.number) + m.top.title = `${tr("CH")} ${json.number} ${json.name}` + else + m.top.title = json.name + end if m.top.live = true m.top.Type = "TvChannel" setPoster() From 1695990d16555cd89c6b427491798aca535a19d5 Mon Sep 17 00:00:00 2001 From: jellyfin-bot Date: Fri, 8 Nov 2024 02:58:32 +0000 Subject: [PATCH 141/141] Update API docs --- docs/api/components_ItemGrid_ItemGrid.bs.html | 2 +- docs/api/components_video_VideoPlayerView.bs.html | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/api/components_ItemGrid_ItemGrid.bs.html b/docs/api/components_ItemGrid_ItemGrid.bs.html index b863644d..fe921ead 100644 --- a/docs/api/components_ItemGrid_ItemGrid.bs.html +++ b/docs/api/components_ItemGrid_ItemGrid.bs.html @@ -304,7 +304,7 @@ sub setTvShowsOptions(options) { "Title": tr("TITLE"), "Name": "SortName" }, { "Title": tr("IMDB_RATING"), "Name": "CommunityRating" }, { "Title": tr("DATE_ADDED"), "Name": "DateCreated" }, - { "Title": tr("DATE_PLAYED"), "Name": "DatePlayed" }, + { "Title": tr("DATE_PLAYED"), "Name": "SeriesDatePlayed" }, { "Title": tr("OFFICIAL_RATING"), "Name": "OfficialRating" }, { "Title": tr("RELEASE_DATE"), "Name": "PremiereDate" }, { "Title": tr("Random"), "Name": "Random" }, diff --git a/docs/api/components_video_VideoPlayerView.bs.html b/docs/api/components_video_VideoPlayerView.bs.html index 54fd53c4..ac764c94 100644 --- a/docs/api/components_video_VideoPlayerView.bs.html +++ b/docs/api/components_video_VideoPlayerView.bs.html @@ -11,6 +11,7 @@ sub init() m.top.getScene().findNode("overhang").visible = false userSettings = m.global.session.user.settings m.currentItem = m.global.queueManager.callFunc("getCurrentItem") + m.originalClosedCaptionState = invalid m.top.id = m.currentItem.id m.top.seekMode = "accurate" @@ -463,7 +464,12 @@ sub onVideoContentLoaded() availableSubtitleTrackIndex = availSubtitleTrackIdx(selectedSubtitle.Track.TrackName) if availableSubtitleTrackIndex <> -1 if not selectedSubtitle.IsEncoded - m.top.globalCaptionMode = "On" + if selectedSubtitle.IsForced + ' If IsForced, make sure to remember the Roku global setting so we + ' can set it back when the video is done playing. + m.originalClosedCaptionState = m.top.globalCaptionMode + m.top.globalCaptionMode = "On" + end if m.top.subtitleTrack = m.top.availableSubtitleTracks[availableSubtitleTrackIndex].TrackName end if end if @@ -699,6 +705,12 @@ sub ReportPlayback(state = "update" as string) m.bufferCheckTimer.duration = 30 end if + if (state = "stop" or state = "finished") and m.originalClosedCaptionState <> invalid + m.log.debug("ReportPlayback() setting", m.top.globalCaptionMode, "back to", m.originalClosedCaptionState) + m.top.globalCaptionMode = m.originalClosedCaptionState + m.originalClosedCaptionState = invalid + end if + ' Report playstate via worker task playstateTask = m.global.playstateTask playstateTask.setFields({ status: state, params: params })