diff --git a/.github/workflows/auto-close-stale-pr.yml b/.github/workflows/auto-close-stale-pr.yml index 5cdd7447f..00892eec5 100644 --- a/.github/workflows/auto-close-stale-pr.yml +++ b/.github/workflows/auto-close-stale-pr.yml @@ -15,9 +15,9 @@ jobs: days-before-issue-stale: -1 days-before-issue-close: -1 stale-pr-label: stale - stale-pr-message: "This pull request has been inactive for 21 days and will be automatically closed in 7 days if there is no further activity." - close-pr-message: "This pull request has been closed because it has been inactive for 28 days. You may submit a new pull request if desired." - days-before-pr-stale: 21 - days-before-pr-close: 7 + stale-pr-message: "This pull request has been inactive for 30 days and will be automatically closed in 15 days if there is no further activity." + close-pr-message: "This pull request has been closed because it has been inactive for 45 days. You may submit a new pull request if desired." + days-before-pr-stale: 30 + days-before-pr-close: 15 exempt-draft-pr: true repo-token: ${{ secrets.JF_BOT_TOKEN }} diff --git a/.github/workflows/automations.yml b/.github/workflows/automations.yml index a29a73f4d..3f167cb54 100644 --- a/.github/workflows/automations.yml +++ b/.github/workflows/automations.yml @@ -10,7 +10,8 @@ on: jobs: project: - if: github.repository == 'jellyfin/jellyfin-roku' + # don't run job on forks and prevent job from running twice when a PR pushes a new commit + 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 name: Project board 📊 runs-on: ubuntu-latest steps: @@ -22,7 +23,8 @@ jobs: column: In progress repo-token: ${{ secrets.JF_BOT_TOKEN }} label: - if: github.repository == 'jellyfin/jellyfin-roku' + # don't run job on forks and prevent job from running twice when a PR pushes a new commit + 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 name: Labeling 🏷️ runs-on: ubuntu-latest steps: diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml index 7dd170e12..46f97c295 100644 --- a/.github/workflows/build-dev.yml +++ b/.github/workflows/build-dev.yml @@ -6,10 +6,12 @@ on: jobs: dev: + # prevent job from running twice when a PR pushes a new commit + 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/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 + - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4 with: node-version: "lts/*" cache: "npm" @@ -19,7 +21,7 @@ jobs: run: npm run ropm - name: Build app run: npm run build - - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # 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 63e58dbbd..d482f30d2 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" @@ -23,7 +23,7 @@ jobs: run: npm run ropm - name: Build app for production run: npm run build-prod - - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4 + - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4 with: name: Jellyfin-Roku-v${{ env.newManVersion }}-${{ github.sha }} path: ${{ github.workspace }}/build/staging diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml index 5670dc7de..1b64af00a 100644 --- a/.github/workflows/bump-version.yml +++ b/.github/workflows/bump-version.yml @@ -94,7 +94,7 @@ jobs: git add . git commit -m "Bump ${{ github.event.inputs.versionType }} version" git push --set-upstream origin "${{ env.newBranch }}" - gh pr create --title "Bump ${{ github.event.inputs.targetBranch }} branch to ${{ env.newVersion }}" --body "Bump version to prep for next release." --label ignore-changelog --base ${{ env.targetBranch }} + gh pr create --title "Bump ${{ github.event.inputs.targetBranch }} branch to ${{ env.newVersion }}" --body "Bump version to prep for next release. Generated by `.github/workflows/bump-version.yml`" --label ignore-changelog --base ${{ env.targetBranch }} minor: if: ${{ github.event.inputs.versionType == 'minor' }} runs-on: ubuntu-latest @@ -161,7 +161,7 @@ jobs: git add . git commit -m "Bump ${{ github.event.inputs.versionType }} version" git push --set-upstream origin "${{ env.newBranch }}" - gh pr create --title "Bump ${{ github.event.inputs.targetBranch }} branch to ${{ env.newVersion }}" --body "Bump version to prep for next release." --label ignore-changelog --base ${{ env.targetBranch }} + gh pr create --title "Bump ${{ github.event.inputs.targetBranch }} branch to ${{ env.newVersion }}" --body "Bump version to prep for next release. Generated by `.github/workflows/bump-version.yml`" --label ignore-changelog --base ${{ env.targetBranch }} major: if: ${{ github.event.inputs.versionType == 'major' }} @@ -231,5 +231,5 @@ jobs: git add . git commit -m "Bump ${{ github.event.inputs.versionType }} version" git push --set-upstream origin "${{ env.newBranch }}" - gh pr create --title "Bump ${{ github.event.inputs.targetBranch }} branch to ${{ env.newVersion }}" --body "Bump version to prep for next release." --label ignore-changelog --base ${{ env.targetBranch }} + gh pr create --title "Bump ${{ github.event.inputs.targetBranch }} branch to ${{ env.newVersion }}" --body "Bump version to prep for next release. Generated by `.github/workflows/bump-version.yml`" --label ignore-changelog --base ${{ env.targetBranch }} \ No newline at end of file diff --git a/.github/workflows/lint-brightscript.yml b/.github/workflows/lint-brightscript.yml new file mode 100644 index 000000000..560bfd8be --- /dev/null +++ b/.github/workflows/lint-brightscript.yml @@ -0,0 +1,20 @@ +name: lint-brightscript +on: + pull_request: + paths: + - "**/*.brs" + - "**/*.bs" + +jobs: + run: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: actions/setup-node@master + with: + node-version: "lts/*" + cache: "npm" + - run: npm ci + - run: npx ropm install + - run: npm run validate + - run: npm run check-formatting diff --git a/.github/workflows/lint-json.yml b/.github/workflows/lint-json.yml new file mode 100644 index 000000000..a5b9f9080 --- /dev/null +++ b/.github/workflows/lint-json.yml @@ -0,0 +1,23 @@ +name: lint-json +on: + pull_request: + paths: + - "!docs/api/**" + - "**/*.json" + +jobs: + run: + runs-on: ubuntu-latest + steps: + - name: Clone github repo + uses: actions/checkout@master + - uses: actions/setup-node@master + with: + node-version: "lts/*" + cache: "npm" + - name: Install npm dependencies + run: npm ci + - name: Install roku package dependencies + run: npx ropm install + - name: Validate JSON syntax + run: npm run lint-json \ No newline at end of file diff --git a/.github/workflows/lint-markdown.yml b/.github/workflows/lint-markdown.yml new file mode 100644 index 000000000..a3a0f1a28 --- /dev/null +++ b/.github/workflows/lint-markdown.yml @@ -0,0 +1,23 @@ +name: lint-markdown +on: + pull_request: + paths: + - "**/*.md" + +jobs: + run: + runs-on: ubuntu-latest + steps: + - name: Clone github repo + uses: actions/checkout@master + - uses: actions/setup-node@master + with: + node-version: "lts/*" + cache: "npm" + - name: Install npm dependencies + run: npm ci + - name: Install roku package dependencies + run: npx ropm install + - uses: xt0rted/markdownlint-problem-matcher@1a5fabfb577370cfdf5af944d418e4be3ea06f27 # v3 + - name: Lint markdown files + run: npm run lint-markdown diff --git a/.github/workflows/lint-spelling.yml b/.github/workflows/lint-spelling.yml new file mode 100644 index 000000000..c2c9b8545 --- /dev/null +++ b/.github/workflows/lint-spelling.yml @@ -0,0 +1,22 @@ +name: lint-spelling +on: + pull_request: + paths: + - "**/*.md" + +jobs: + run: + runs-on: ubuntu-latest + steps: + - name: Clone github repo + uses: actions/checkout@master + - uses: actions/setup-node@master + with: + node-version: "lts/*" + cache: "npm" + - name: Install npm dependencies + run: npm ci + - name: Install roku package dependencies + run: npx ropm install + - name: Check markdown files for spelling errors + run: npm run lint-spelling diff --git a/.github/workflows/lint-translation-files.yml b/.github/workflows/lint-translation-files.yml new file mode 100644 index 000000000..011547e4c --- /dev/null +++ b/.github/workflows/lint-translation-files.yml @@ -0,0 +1,25 @@ +name: lint-translation-files +on: + pull_request: + paths: + - "locale/*/*.ts" + +jobs: + run: + runs-on: ubuntu-latest + steps: + - name: Clone github repo + uses: actions/checkout@master + - name: Install xmllint and xmlstarlet using apt (from cache) + uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: libxml2-utils xmlstarlet + - name: Validate XML syntax + run: xmllint --noout ./locale/en_US/translations.ts + - name: Save output of duplicate check + run: echo "tsDuplicates=$(xmlstarlet sel -t -m '/TS/context/message/source' -c '.' -nl ./locale/en_US/translations.ts | sort | uniq -d | awk '{ printf "%s", $0 }')" >> $GITHUB_ENV + - name: Check for duplicates + run: xmlstarlet sel -t -m '/TS/context/message/source' -f -o ' ' -c '.' -nl ./locale/en_US/translations.ts | sort | uniq -d + - name: Duplicates found + if: env.tsDuplicates != '' + run: exit 1 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index a46dfa9d8..000000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: lint -on: - pull_request: - -jobs: - brightscript: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - uses: actions/setup-node@master - with: - node-version: "lts/*" - cache: "npm" - - run: npm ci - - run: npx ropm install - - run: npm run validate - - run: npm run check-formatting - translation-files: - runs-on: ubuntu-latest - steps: - - name: Clone github repo - uses: actions/checkout@master - - name: Install xmllint and xmlstarlet using apt (from cache) - uses: awalsh128/cache-apt-pkgs-action@latest - with: - packages: libxml2-utils xmlstarlet - - name: Validate XML syntax - run: xmllint --noout ./locale/en_US/translations.ts - - name: Save output of duplicate check - run: echo "tsDuplicates=$(xmlstarlet sel -t -m '/TS/context/message/source' -c '.' -nl ./locale/en_US/translations.ts | sort | uniq -d | awk '{ printf "%s", $0 }')" >> $GITHUB_ENV - - name: Check for duplicates - run: xmlstarlet sel -t -m '/TS/context/message/source' -f -o ' ' -c '.' -nl ./locale/en_US/translations.ts | sort | uniq -d - - name: Duplicates found - if: env.tsDuplicates != '' - run: exit 1 - json: - runs-on: ubuntu-latest - steps: - - name: Clone github repo - uses: actions/checkout@master - - uses: actions/setup-node@master - with: - node-version: "lts/*" - cache: "npm" - - name: Install npm dependencies - run: npm ci - - name: Install roku package dependencies - run: npx ropm install - - name: Validate JSON syntax - run: npm run lint-json - markdown: - runs-on: ubuntu-latest - steps: - - name: Clone github repo - uses: actions/checkout@master - - uses: actions/setup-node@master - with: - node-version: "lts/*" - cache: "npm" - - name: Install npm dependencies - run: npm ci - - name: Install roku package dependencies - run: npx ropm install - - uses: xt0rted/markdownlint-problem-matcher@1a5fabfb577370cfdf5af944d418e4be3ea06f27 # v3 - - name: Lint markdown files - run: npm run lint-markdown - spelling: - runs-on: ubuntu-latest - steps: - - name: Clone github repo - uses: actions/checkout@master - - uses: actions/setup-node@master - with: - node-version: "lts/*" - cache: "npm" - - name: Install npm dependencies - run: npm ci - - name: Install roku package dependencies - run: npx ropm install - - name: Check markdown files for spelling errors - run: npm run lint-spelling diff --git a/.github/workflows/release-prep.yml b/.github/workflows/release-prep.yml deleted file mode 100644 index 35619c328..000000000 --- a/.github/workflows/release-prep.yml +++ /dev/null @@ -1,80 +0,0 @@ -# All of the jobs in this workflow will only run if the PR that triggered it has a 'release-prep' label -name: release-prep - -on: - pull_request: - types: [labeled, opened, reopened, synchronize] - -jobs: - version-check: - if: ${{ contains(github.event.pull_request.labels.*.name, 'release-prep') }} - runs-on: ubuntu-latest - steps: - - name: DEBUG ${{ github.event.pull_request.base.ref }} - run: echo ${{ github.event.pull_request.base.ref }} - - name: Checkout the branch this PR wants to update - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 - with: - ref: ${{ github.event.pull_request.base.ref }} - - name: Install jq to parse json - uses: awalsh128/cache-apt-pkgs-action@latest - with: - packages: jq - - name: Save old package.json version - run: echo "oldPackVersion=$(jq -r ".version" package.json)" >> $GITHUB_ENV - - name: Find and save old major_version from manifest - run: awk 'BEGIN { FS="=" } /^major_version/ { print "oldMajor="$2; }' manifest >> $GITHUB_ENV - - name: Find and save old minor_version from manifest - run: awk 'BEGIN { FS="=" } /^minor_version/ { print "oldMinor="$2; }' manifest >> $GITHUB_ENV - - name: Find and save old build_version from manifest - run: awk 'BEGIN { FS="=" } /^build_version/ { print "oldBuild="$2; }' manifest >> $GITHUB_ENV - - name: Save old manifest version - run: echo "oldManVersion=${{ env.oldMajor }}.${{ env.oldMinor }}.${{ env.oldBuild }}" >> $GITHUB_ENV - - name: Save old Makefile version - run: awk 'BEGIN { FS=" := " } /^VERSION/ { print "oldMakeVersion="$2; }' Makefile >> $GITHUB_ENV - - name: Checkout PR branch - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 - - name: Save new package.json version - run: echo "newPackVersion=$(jq -r ".version" package.json)" >> $GITHUB_ENV - - name: package.json version must be updated - if: env.oldPackVersion == env.newPackVersion - run: exit 1 - - name: Find and save new major_version from manifest - run: awk 'BEGIN { FS="=" } /^major_version/ { print "newMajor="$2; }' manifest >> $GITHUB_ENV - - name: Find and save new minor_version from manifest - run: awk 'BEGIN { FS="=" } /^minor_version/ { print "newMinor="$2; }' manifest >> $GITHUB_ENV - - name: Find and save new build_version from manifest - run: awk 'BEGIN { FS="=" } /^build_version/ { print "newBuild="$2; }' manifest >> $GITHUB_ENV - - name: Save new manifest version - run: echo "newManVersion=${{ env.newMajor }}.${{ env.newMinor }}.${{ env.newBuild }}" >> $GITHUB_ENV - - name: Manifest version must be updated - if: env.oldManVersion == env.newManVersion - run: exit 1 - - name: Save new Makefile version - run: awk 'BEGIN { FS=" := " } /^VERSION/ { print "newMakeVersion="$2; }' Makefile >> $GITHUB_ENV - - name: Makefile version must be updated - if: env.oldMakeVersion == env.newMakeVersion - run: exit 1 - - name: All new versions must match - if: (env.newManVersion != env.newPackVersion) || (env.newManVersion != env.newMakeVersion) - run: exit 1 - build-prod: - if: ${{ contains(github.event.pull_request.labels.*.name, 'release-prep') }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 - - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 - with: - node-version: "lts/*" - cache: "npm" - - name: NPM install - run: npm ci - - name: Install roku module dependencies - run: npm run ropm - - name: Build app for production - run: npm run build-prod - - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4 - with: - name: Jellyfin-Roku-v${{ env.newManVersion }}-${{ github.sha }} - path: ${{ github.workspace }}/build/staging - if-no-files-found: error diff --git a/.github/workflows/roku-analysis.yml b/.github/workflows/roku-analysis.yml index 2bac16036..6027db5a1 100644 --- a/.github/workflows/roku-analysis.yml +++ b/.github/workflows/roku-analysis.yml @@ -2,17 +2,18 @@ name: roku-analysis on: pull_request: - push: env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} jobs: static: + # don't run job on forks and prevent job from running twice when a PR pushes a new commit + 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/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 + - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4 with: node-version: "lts/*" cache: "npm" @@ -27,7 +28,7 @@ jobs: if: env.BRANCH_NAME == 'master' run: npm run build-prod - name: Setup Java - uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 # v4 + uses: actions/setup-java@b36c23c0d998641eff861008f374ee103c25ac73 # v4 with: distribution: "temurin" java-version: "21" diff --git a/.vscode/launch.json b/.vscode/launch.json index 482f3d164..59566402d 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", diff --git a/components/ItemGrid/GridItem.bs b/components/ItemGrid/GridItem.bs index 248f43024..9f7a62ae1 100644 --- a/components/ItemGrid/GridItem.bs +++ b/components/ItemGrid/GridItem.bs @@ -115,6 +115,21 @@ sub itemContentChanged() else m.itemText.text = itemData.Title end if + ' Adjust to wide posters for "View All Next Up" + if m.itemGrid.overhangTitle = tr("View All Next Up") + m.posterMask.maskUri = "" + + m.itemPoster.height = 300 + m.itemPoster.width = 400 + m.itemPoster.loadDisplayMode = "scaleToFit" + + m.backdrop.height = 300 + m.backdrop.width = 400 + m.backdrop.loadDisplayMode = "scaleToFit" + + m.itemText.translation = [0, m.itemPoster.height + 7] + m.itemText.maxWidth = 400 + end if else if itemData.type = "MusicArtist" m.itemPoster.uri = itemData.PosterUrl m.itemText.text = itemData.Title diff --git a/components/ItemGrid/ItemGrid.bs b/components/ItemGrid/ItemGrid.bs index b67b21787..759bacd7e 100644 --- a/components/ItemGrid/ItemGrid.bs +++ b/components/ItemGrid/ItemGrid.bs @@ -201,6 +201,14 @@ sub loadInitialItems() ' non recursive for collections (folders, boxsets, photo albums, etc) m.loadItemsTask.recursive = false end if + + if getCollectionType() = "nextup" + m.loadItemsTask.itemType = "NextUp" + m.itemGrid.itemSize = "[400, 300]" + m.top.imageDisplayMode = "scaleToFit" + m.itemGrid.numColumns = 4 + m.alpha.visible = false + end if else if m.top.parentItem.json.type = "Studio" m.loadItemsTask.itemId = m.top.parentItem.parentFolder m.loadItemsTask.itemType = "Series,Movie" @@ -406,7 +414,6 @@ sub SetUpOptions() setPhotoAlbumOptions(options) else if getCollectionType() = "music" setMusicOptions(options) - else setDefaultOptions(options) end if @@ -804,7 +811,7 @@ function onKeyEvent(key as string, press as boolean) as boolean searchGrp.setFocus(false) end if - if key = "options" + if key = "options" and getCollectionType() <> "nextup" if m.options.visible = true m.options.visible = false m.top.removeChild(m.options) @@ -854,7 +861,7 @@ function onKeyEvent(key as string, press as boolean) as boolean m.top.quickPlayNode = itemToPlay return true end if - else if key = "left" and topGrp.isinFocusChain() + 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) diff --git a/components/ItemGrid/LoadItemsTask2.bs b/components/ItemGrid/LoadItemsTask2.bs index 2a7292d90..2290103d1 100644 --- a/components/ItemGrid/LoadItemsTask2.bs +++ b/components/ItemGrid/LoadItemsTask2.bs @@ -130,6 +130,11 @@ sub loadItems() url = Substitute("Users/{0}/Items/", m.global.session.user.id) params.append({ ImageTypeLimit: 1 }) params.append({ EnableImageTypes: "Primary,Backdrop,Banner,Thumb" }) + else if LCase(m.top.ItemType) = "nextup" + url = "Shows/NextUp" + params.limit = 100 ' If you have more than 100 in your Next Up queue, maybe go outside a bit more. + params.append({ ImageTypeLimit: 1 }) + params.append({ EnableImageTypes: "Primary,Backdrop,Banner,Thumb" }) else url = Substitute("Users/{0}/Items/", m.global.session.user.id) end if @@ -194,6 +199,10 @@ sub loadItems() tmp.image = PosterImage(item.id, { "maxHeight": 425, "maxWidth": 290, "quality": "90" }) else if item.type = "Episode" tmp = CreateObject("roSGNode", "TVEpisode") + if LCase(m.top.ItemType) = "nextup" + tmp.title = item.name + tmp.type = "Episode" + end if else if LCase(item.Type) = "recording" tmp = CreateObject("roSGNode", "RecordingData") else if item.Type = "Genre" @@ -281,7 +290,7 @@ sub loadItems() end if if tmp <> invalid - if item.Type <> "Genre" and item.Type <> "MusicGenre" + if LCase(item.Type) <> "genre" and LCase(item.Type) <> "musicgenre" tmp.parentFolder = m.top.itemId tmp.json = item if item.UserData <> invalid and item.UserData.isFavorite <> invalid diff --git a/components/ItemGrid/LoadVideoContentTask.bs b/components/ItemGrid/LoadVideoContentTask.bs index 643df4fe1..74da4f449 100644 --- a/components/ItemGrid/LoadVideoContentTask.bs +++ b/components/ItemGrid/LoadVideoContentTask.bs @@ -118,8 +118,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/components/JFVideo.bs b/components/JFVideo.bs index f4dfb74e8..5be3d8537 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 and m.global.session.user.configuration.EnableNextEpisodeAutoPlay - m.nextEpisodeButton.visible = true - m.showNextEpisodeButtonAnimation.control = "start" - m.nextEpisodeButton.setFocus(true) - end if + 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 + + m.nextEpisodeButton.visible = true + m.showNextEpisodeButtonAnimation.control = "start" + m.nextEpisodeButton.setFocus(true) end sub ' diff --git a/components/data/HomeData.bs b/components/data/HomeData.bs index 196274507..648cdc8e8 100644 --- a/components/data/HomeData.bs +++ b/components/data/HomeData.bs @@ -19,15 +19,17 @@ sub setData() ' Set appropriate Images for Wide and Tall based on type - if datum.type = "CollectionFolder" or datum.type = "UserView" - params = { "Tag": datum.ImageTags.Primary, "maxHeight": 261, "maxWidth": 464 } - m.top.thumbnailURL = ImageURL(datum.id, "Primary", params) - m.top.widePosterUrl = m.top.thumbnailURL + if LCase(datum.type) = "collectionfolder" or LCase(datum.type) = "userview" + if IsValid(datum.ImageTags) + params = { "Tag": datum.ImageTags.Primary, "maxHeight": 261, "maxWidth": 464 } + m.top.thumbnailURL = ImageURL(datum.id, "Primary", params) + m.top.widePosterUrl = m.top.thumbnailURL + end if ' Add Icon URLs for display if there is no Poster - if datum.CollectionType = "livetv" + if LCase(m.top.CollectionType) = "livetv" m.top.iconUrl = "pkg:/images/media_type_icons/live_tv_white.png" - else if datum.CollectionType = "folders" + else if LCase(m.top.CollectionType) = "folders" or LCase(m.top.CollectionType) = "nextup" m.top.iconUrl = "pkg:/images/media_type_icons/folder_white.png" end if @@ -58,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 }) diff --git a/components/home/HomeItem.bs b/components/home/HomeItem.bs index 797e253c1..b1ddeb2be 100644 --- a/components/home/HomeItem.bs +++ b/components/home/HomeItem.bs @@ -151,9 +151,16 @@ sub itemContentChanged() drawProgressBar(itemData) end if - if itemData.usePoster = true + if localGlobal.session.user.settings["ui.general.episodeimagesnextup"] = "webclient" + tmpSetting = localGlobal.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" m.itemPoster.uri = itemData.widePosterURL - else + else if localGlobal.session.user.settings["ui.general.episodeimagesnextup"] = "episode" m.itemPoster.uri = itemData.thumbnailURL end if diff --git a/components/home/LoadItemsTask.bs b/components/home/LoadItemsTask.bs index 369ce7b43..f947d1250 100644 --- a/components/home/LoadItemsTask.bs +++ b/components/home/LoadItemsTask.bs @@ -68,7 +68,7 @@ sub loadItems() params["SortOrder"] = "Descending" params["ImageTypeLimit"] = 1 params["UserId"] = m.global.session.user.id - params["EnableRewatching"] = false + params["EnableRewatching"] = m.global.session.user.settings["ui.details.enablerewatchingnextup"] params["DisableFirstEpisode"] = false params["limit"] = 24 params["EnableTotalRecordCount"] = false @@ -85,6 +85,9 @@ sub loadItems() end if end if + addViewAll = true ' Assume there will be a "View All" to start + checkViewAll = false ' Only need to check if we don't have anything in the Next Up home row + resp = APIRequest(url, params) data = getJson(resp) if isValid(data) and isValid(data.Items) @@ -93,6 +96,36 @@ sub loadItems() tmp.json = item results.push(tmp) end for + if data.Items.Count() = 0 + checkViewAll = true + end if + else + checkViewAll = true + end if + + ' Add "View All" + if checkViewAll + ' Nothing to show in Next Up, but are there hidden items (e.g. > 365 days old)? + params.Delete("NextUpDateCutoff") + params["limit"] = 1 ' if there is even one, then we know we need to show "View All" + resp = APIRequest(url, params) + data = getJson(resp) + if not isValid(data) or isValid(data) and isValid(data.Items) and data.Items.Count() = 0 + addViewAll = false + end if + end if + + if addViewAll + tmp = CreateObject("roSGNode", "HomeData") + tmp.type = "CollectionFolder" + tmp.usePoster = false + tmp.json = { + IsFolder: true, + Name: tr("View All Next Up"), + Type: "CollectionFolder", + CollectionType: "nextup" + } + results.push(tmp) end if ' Load Continue Watching else if m.top.itemsToLoad = "continue" diff --git a/components/music/AlbumView.bs b/components/music/AlbumView.bs index 57af32742..67436da95 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 995b803bb..3ad015e89 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 238638758..3d6588045 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") diff --git a/components/settings/settings.xml b/components/settings/settings.xml index 10f3a24da..ec0bc7b47 100644 --- a/components/settings/settings.xml +++ b/components/settings/settings.xml @@ -35,7 +35,7 @@ - + \ No newline at end of file diff --git a/components/video/VideoPlayerView.bs b/components/video/VideoPlayerView.bs index 5850bbd94..b662cfcf9 100644 --- a/components/video/VideoPlayerView.bs +++ b/components/video/VideoPlayerView.bs @@ -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 and m.global.session.user.configuration.EnableNextEpisodeAutoPlay - m.nextEpisodeButton.visible = true - m.showNextEpisodeButtonAnimation.control = "start" - m.nextEpisodeButton.setFocus(true) - end if + 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 + + m.nextEpisodeButton.visible = true + m.showNextEpisodeButtonAnimation.control = "start" + m.nextEpisodeButton.setFocus(true) end sub ' diff --git a/docs/api/components_ButtonGroupHoriz.bs.html b/docs/api/components_ButtonGroupHoriz.bs.html index e0a8c8bbd..d02d484c5 100644 --- a/docs/api/components_ButtonGroupHoriz.bs.html +++ b/docs/api/components_ButtonGroupHoriz.bs.html @@ -1,6 +1,6 @@ Source: components/ButtonGroupHoriz.bs
On this page

components_ButtonGroupHoriz.bs

sub init()
+    
On this page

components_ButtonGroupHoriz.bs

sub init()
     m.top.layoutDirection = "horiz"
 end sub
 
@@ -25,4 +25,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ButtonGroupVert.bs.html b/docs/api/components_ButtonGroupVert.bs.html index ee5a49f1b..b4f3d1b9e 100644 --- a/docs/api/components_ButtonGroupVert.bs.html +++ b/docs/api/components_ButtonGroupVert.bs.html @@ -1,6 +1,6 @@ Source: components/ButtonGroupVert.bs
On this page

components_ButtonGroupVert.bs

sub init()
+    
On this page

components_ButtonGroupVert.bs

sub init()
     m.top.layoutDirection = "vert"
     m.top.observeField("focusedChild", "onFocusChanged")
     m.top.observeField("focusButton", "onFocusButtonChanged")
@@ -44,4 +44,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_Buttons_JFButtons.bs.html b/docs/api/components_Buttons_JFButtons.bs.html index 8c3224d4b..8e5b116e1 100644 --- a/docs/api/components_Buttons_JFButtons.bs.html +++ b/docs/api/components_Buttons_JFButtons.bs.html @@ -1,6 +1,6 @@ Source: components/Buttons/JFButtons.bs
On this page

components_Buttons_JFButtons.bs

sub init()
+    
On this page

components_Buttons_JFButtons.bs

sub init()
 
     m.top.focusable = true
 
@@ -122,4 +122,4 @@
     end if
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_Buttons_SlideOutButton.bs.html b/docs/api/components_Buttons_SlideOutButton.bs.html index 22a585243..54bb803ad 100644 --- a/docs/api/components_Buttons_SlideOutButton.bs.html +++ b/docs/api/components_Buttons_SlideOutButton.bs.html @@ -1,6 +1,6 @@ Source: components/Buttons/SlideOutButton.bs
On this page

components_Buttons_SlideOutButton.bs

sub init()
+    
On this page

components_Buttons_SlideOutButton.bs

sub init()
     m.buttonBackground = m.top.findNode("buttonBackground")
     m.buttonIcon = m.top.findNode("buttonIcon")
     m.buttonText = m.top.findNode("buttonText")
@@ -100,4 +100,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_Buttons_TextSizeTask.bs.html b/docs/api/components_Buttons_TextSizeTask.bs.html index 7cbd62318..c15dba8c3 100644 --- a/docs/api/components_Buttons_TextSizeTask.bs.html +++ b/docs/api/components_Buttons_TextSizeTask.bs.html @@ -1,6 +1,6 @@ Source: components/Buttons/TextSizeTask.bs
On this page

components_Buttons_TextSizeTask.bs

sub init()
+    
On this page

components_Buttons_TextSizeTask.bs

sub init()
     m.top.functionName = "getTextSize"
 end sub
 
@@ -21,4 +21,4 @@
     m.top.width = res
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_Clock.bs.html b/docs/api/components_Clock.bs.html index 590abdada..80833e4aa 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 @@
 
     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 f5d6a0e3b..4f0b7c06f 100644 --- a/docs/api/components_GetNextEpisodeTask.bs.html +++ b/docs/api/components_GetNextEpisodeTask.bs.html @@ -1,6 +1,6 @@ Source: components/GetNextEpisodeTask.bs
On this page

components_GetNextEpisodeTask.bs

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

components_GetNextEpisodeTask.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/sdk.bs"
 
 sub init()
@@ -16,4 +16,4 @@
 
     m.top.nextEpisodeData = m.nextEpisodeData
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_GetPlaybackInfoTask.bs.html b/docs/api/components_GetPlaybackInfoTask.bs.html index a5b10a587..5af675107 100644 --- a/docs/api/components_GetPlaybackInfoTask.bs.html +++ b/docs/api/components_GetPlaybackInfoTask.bs.html @@ -1,6 +1,6 @@ Source: components/GetPlaybackInfoTask.bs
On this page

components_GetPlaybackInfoTask.bs

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

components_GetPlaybackInfoTask.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/deviceCapabilities.bs"
 import "pkg:/source/api/baserequest.bs"
@@ -170,4 +170,4 @@
         return Str(Fix(bitrate / 1000)) + " Kbps"
     end if
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_GetShuffleEpisodesTask.bs.html b/docs/api/components_GetShuffleEpisodesTask.bs.html index b0b09f421..d7148bd30 100644 --- a/docs/api/components_GetShuffleEpisodesTask.bs.html +++ b/docs/api/components_GetShuffleEpisodesTask.bs.html @@ -1,6 +1,6 @@ Source: components/GetShuffleEpisodesTask.bs
On this page

components_GetShuffleEpisodesTask.bs

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

components_GetShuffleEpisodesTask.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/sdk.bs"
 
 sub init()
@@ -16,4 +16,4 @@
 
     m.top.data = data
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_IconButton.bs.html b/docs/api/components_IconButton.bs.html index 49c1ed302..14a105f10 100644 --- a/docs/api/components_IconButton.bs.html +++ b/docs/api/components_IconButton.bs.html @@ -1,6 +1,6 @@ Source: components/IconButton.bs
On this page

components_IconButton.bs

sub init()
+    
On this page

components_IconButton.bs

sub init()
     m.buttonBackground = m.top.findNode("buttonBackground")
     m.buttonIcon = m.top.findNode("buttonIcon")
     m.buttonText = m.top.findNode("buttonText")
@@ -81,4 +81,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_Alpha.bs.html b/docs/api/components_ItemGrid_Alpha.bs.html index 69fac5325..cf7fbc3f5 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 @@
 
     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 9c95470d5..47ef5b7a7 100644 --- a/docs/api/components_ItemGrid_FavoriteItemsTask.bs.html +++ b/docs/api/components_ItemGrid_FavoriteItemsTask.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/FavoriteItemsTask.bs
On this page

components_ItemGrid_FavoriteItemsTask.bs

import "pkg:/source/api/UserLibrary.bs"
+    
On this page

components_ItemGrid_FavoriteItemsTask.bs

import "pkg:/source/api/UserLibrary.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -19,4 +19,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_GridItem.bs.html b/docs/api/components_ItemGrid_GridItem.bs.html index fbe36be96..4e2e3bc24 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"
 
@@ -23,18 +23,21 @@
     m.checkmark.height = 60
 
     m.itemText.translation = [0, m.itemPoster.height + 7]
-
-    m.gridTitles = m.global.session.user.settings["itemgrid.gridTitles"]
     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
 
-    'Parent is MarkupGrid and it's parent is the ItemGrid
-    m.topParent = m.top.GetParent().GetParent()
-    'Get the imageDisplayMode for these grid items
-    if isValid(m.topParent.imageDisplayMode)
-        m.itemPoster.loadDisplayMode = m.topParent.imageDisplayMode
+    ' grab data from ItemGrid node
+    m.itemGrid = m.top.GetParent().GetParent() 'Parent is MarkupGrid and it's parent is the ItemGrid
+
+    if isValid(m.itemGrid)
+        if isValid(m.itemGrid.imageDisplayMode)
+            m.itemPoster.loadDisplayMode = m.itemGrid.imageDisplayMode
+        end if
+        if isValid(m.itemGrid.gridTitles)
+            m.gridTitles = m.itemGrid.gridTitles
+        end if
     end if
 
 end sub
@@ -93,7 +96,7 @@
         m.itemPoster.uri = itemData.PosterUrl
         'm.itemIcon.uri = itemData.iconUrl
         m.itemText.text = itemData.Title
-        m.itemPoster.loadDisplayMode = m.topParent.imageDisplayMode
+        m.itemPoster.loadDisplayMode = m.itemGrid.imageDisplayMode
     else if itemData.type = "Video"
         m.itemPoster.uri = itemData.PosterUrl
         m.itemIcon.uri = itemData.iconUrl
@@ -114,6 +117,21 @@
         else
             m.itemText.text = itemData.Title
         end if
+        ' Adjust to wide posters for "View All Next Up"
+        if m.itemGrid.overhangTitle = tr("View All Next Up")
+            m.posterMask.maskUri = ""
+
+            m.itemPoster.height = 300
+            m.itemPoster.width = 400
+            m.itemPoster.loadDisplayMode = "scaleToFit"
+
+            m.backdrop.height = 300
+            m.backdrop.width = 400
+            m.backdrop.loadDisplayMode = "scaleToFit"
+
+            m.itemText.translation = [0, m.itemPoster.height + 7]
+            m.itemText.maxWidth = 400
+        end if
     else if itemData.type = "MusicArtist"
         m.itemPoster.uri = itemData.PosterUrl
         m.itemText.text = itemData.Title
@@ -171,7 +189,7 @@
         m.posterMask.scale = [1, 1]
     else
         m.itemText.repeatCount = 0
-        if m.topParent.alphaActive = true
+        if m.itemGrid.alphaActive = true
             m.posterMask.scale = [0.85, 0.85]
         end if
     end if
@@ -187,4 +205,4 @@
         m.posterText.visible = false
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_GridItemSmall.bs.html b/docs/api/components_ItemGrid_GridItemSmall.bs.html index ad5b17bfb..b2e7187ad 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 @@
         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 417c23f56..8ca270563 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"
@@ -70,15 +70,15 @@
 
     'Get reset folder setting
     m.resetGrid = m.global.session.user.settings["itemgrid.reset"]
+
+    m.top.gridTitles = m.global.session.user.settings["itemgrid.gridTitles"]
 end sub
 
-'
 'Genre Item Selected
 sub onGenreItemSelected()
     m.top.selectedItem = m.genreList.content.getChild(m.genreList.rowItemSelected[0]).getChild(m.genreList.rowItemSelected[1])
 end sub
 
-'
 'Load initial set of Data
 sub loadInitialItems()
     m.loadItemsTask.control = "stop"
@@ -200,6 +200,14 @@
             ' non recursive for collections (folders, boxsets, photo albums, etc)
             m.loadItemsTask.recursive = false
         end if
+
+        if getCollectionType() = "nextup"
+            m.loadItemsTask.itemType = "NextUp"
+            m.itemGrid.itemSize = "[400, 300]"
+            m.top.imageDisplayMode = "scaleToFit"
+            m.itemGrid.numColumns = 4
+            m.alpha.visible = false
+        end if
     else if m.top.parentItem.json.type = "Studio"
         m.loadItemsTask.itemId = m.top.parentItem.parentFolder
         m.loadItemsTask.itemType = "Series,Movie"
@@ -404,7 +412,6 @@
         setPhotoAlbumOptions(options)
     else if getCollectionType() = "music"
         setMusicOptions(options)
-
     else
         setDefaultOptions(options)
     end if
@@ -438,7 +445,6 @@
     m.options.options = options
 end sub
 
-'
 'Handle loaded data, and add to Grid
 sub ItemDataLoaded(msg)
     itemData = msg.GetData()
@@ -499,7 +505,6 @@
     stopLoadingSpinner()
 end sub
 
-'
 'Set Background Image
 sub SetBackground(backgroundUri as string)
 
@@ -512,7 +517,6 @@
     m.newBackdrop.uri = backgroundUri
 end sub
 
-'
 'Handle new item being focused
 sub onItemFocused()
 
@@ -538,7 +542,6 @@
     end if
 end sub
 
-'
 'When Image Loading Status changes
 sub newBGLoaded()
     'If image load was sucessful, start the fade swap
@@ -547,12 +550,9 @@
     end if
 end sub
 
-'
 'Swap Complete
 sub swapDone()
-
-    if m.swapAnimation.state = "stopped"
-
+    if isValid(m.swapAnimation) and m.swapAnimation.state = "stopped"
         'Set main BG node image and hide transitioning node
         m.backdrop.uri = m.newBackdrop.uri
         m.backdrop.opacity = 0.25
@@ -566,7 +566,6 @@
     end if
 end sub
 
-'
 'Load next set of items
 sub loadMoreData()
     if m.Loading = true then return
@@ -578,7 +577,6 @@
     m.loadItemsTask.control = "RUN"
 end sub
 
-'
 'Item Selected
 sub onItemSelected()
     m.top.selectedItem = m.itemGrid.content.getChild(m.itemGrid.itemSelected)
@@ -629,8 +627,6 @@
     end if
 end sub
 
-
-'
 'Check if options updated and any reloading required
 sub optionsClosed()
     if m.top.parentItem.collectionType = "livetv" and m.options.view <> m.view
@@ -788,7 +784,7 @@
         searchGrp.setFocus(false)
     end if
 
-    if key = "options"
+    if key = "options" and getCollectionType() <> "nextup"
         if m.options.visible = true
             m.options.visible = false
             m.top.removeChild(m.options)
@@ -838,7 +834,7 @@
             m.top.quickPlayNode = itemToPlay
             return true
         end if
-    else if key = "left" and topGrp.isinFocusChain()
+    else if key = "left" and topGrp.isinFocusChain() and m.alpha.visible
         m.top.alphaActive = true
         topGrp.setFocus(false)
         m.alphaMenu.setFocus(true)
@@ -912,4 +908,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_ItemGridOptions.bs.html b/docs/api/components_ItemGrid_ItemGridOptions.bs.html index 69ef43d45..b9e3473db 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()
@@ -197,6 +197,8 @@
 end sub
 
 sub toggleFavorite()
+    if not isValid(m.selectedFavoriteItem) then return
+
     m.favItemsTask = createObject("roSGNode", "FavoriteItemsTask")
     if m.favoriteMenu.iconUri = "pkg:/images/icons/favorite.png"
         m.favoriteMenu.iconUri = "pkg:/images/icons/favorite_selected.png"
@@ -388,4 +390,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_LoadItemsTask2.bs.html b/docs/api/components_ItemGrid_LoadItemsTask2.bs.html index e7d8cfff7..781fcf3f8 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"
@@ -132,6 +132,11 @@
         url = Substitute("Users/{0}/Items/", m.global.session.user.id)
         params.append({ ImageTypeLimit: 1 })
         params.append({ EnableImageTypes: "Primary,Backdrop,Banner,Thumb" })
+    else if LCase(m.top.ItemType) = "nextup"
+        url = "Shows/NextUp"
+        params.limit = 100 ' If you have more than 100 in your Next Up queue, maybe go outside a bit more.
+        params.append({ ImageTypeLimit: 1 })
+        params.append({ EnableImageTypes: "Primary,Backdrop,Banner,Thumb" })
     else
         url = Substitute("Users/{0}/Items/", m.global.session.user.id)
     end if
@@ -196,6 +201,10 @@
                 tmp.image = PosterImage(item.id, { "maxHeight": 425, "maxWidth": 290, "quality": "90" })
             else if item.type = "Episode"
                 tmp = CreateObject("roSGNode", "TVEpisode")
+                if LCase(m.top.ItemType) = "nextup"
+                    tmp.title = item.name
+                    tmp.type = "Episode"
+                end if
             else if LCase(item.Type) = "recording"
                 tmp = CreateObject("roSGNode", "RecordingData")
             else if item.Type = "Genre"
@@ -283,7 +292,7 @@
             end if
 
             if tmp <> invalid
-                if item.Type <> "Genre" and item.Type <> "MusicGenre"
+                if LCase(item.Type) <> "genre" and LCase(item.Type) <> "musicgenre"
                     tmp.parentFolder = m.top.itemId
                     tmp.json = item
                     if item.UserData <> invalid and item.UserData.isFavorite <> invalid
@@ -297,4 +306,4 @@
     end if
     m.top.content = results
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html b/docs/api/components_ItemGrid_LoadVideoContentTask.bs.html index 307138677..5734487d6 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"
@@ -15,7 +15,6 @@
 end enum
 
 sub init()
-    m.user = AboutMe()
     m.top.functionName = "loadItems"
 end sub
 
@@ -121,9 +120,9 @@
         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
@@ -397,6 +396,12 @@
 end sub
 
 sub addSubtitlesToVideo(video, meta)
+    if not isValid(meta) then return
+    if not isValid(meta.id) then return
+    if not isValid(m.playbackInfo) then return
+    if not isValidAndNotEmpty(m.playbackInfo.MediaSources) then return
+    if not isValid(m.playbackInfo.MediaSources[0].MediaStreams) then return
+
     subtitles = sortSubtitles(meta.id, m.playbackInfo.MediaSources[0].MediaStreams)
     safesubs = subtitles["all"]
     subtitleTracks = []
@@ -567,8 +572,8 @@
 end function
 
 function FindPreferredAudioStream(streams as dynamic) as integer
-    preferredLanguage = m.user.Configuration.AudioLanguagePreference
-    playDefault = m.user.Configuration.PlayDefaultAudioTrack
+    preferredLanguage = m.global.session.user.Configuration.AudioLanguagePreference
+    playDefault = m.global.session.user.Configuration.PlayDefaultAudioTrack
 
     if playDefault <> invalid and playDefault = true
         return 1
@@ -576,7 +581,7 @@
 
     ' Do we already have the MediaStreams or not?
     if streams = invalid
-        url = Substitute("Users/{0}/Items/{1}", m.user.id, m.top.itemId)
+        url = Substitute("Users/{0}/Items/{1}", m.global.session.user.id, m.top.itemId)
         resp = APIRequest(url)
         jsonResponse = getJson(resp)
 
@@ -597,4 +602,4 @@
 
     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 a9b0f0a63..4cb66371c 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"
@@ -682,7 +682,7 @@
 '
 'Swap Complete
 sub swapDone()
-    if m.swapAnimation.state = "stopped"
+    if isValid(m.swapAnimation) and m.swapAnimation.state = "stopped"
         'Set main BG node image and hide transitioning node
         m.backdrop.uri = m.newBackdrop.uri
         m.backdrop.opacity = 1
@@ -962,4 +962,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html b/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html index 72a6cd9aa..c90782115 100644 --- a/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html +++ b/docs/api/components_ItemGrid_MusicArtistGridItem.bs.html @@ -1,6 +1,6 @@ Source: components/ItemGrid/MusicArtistGridItem.bs
On this page

components_ItemGrid_MusicArtistGridItem.bs

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

components_ItemGrid_MusicArtistGridItem.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -83,4 +83,4 @@
         m.backdrop.visible = false
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ItemGrid_MusicLibraryView.bs.html b/docs/api/components_ItemGrid_MusicLibraryView.bs.html index dbce3cf16..3d6ba65f2 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 @@
 
     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 81d93c176..2855e9cc1 100644 --- a/docs/api/components_JFButton.bs.html +++ b/docs/api/components_JFButton.bs.html @@ -1,6 +1,6 @@ Source: components/JFButton.bs
On this page

components_JFButton.bs

sub init()
+    
On this page

components_JFButton.bs

sub init()
     m.top.observeFieldScoped("text", "onTextChanged")
     m.top.iconUri = ""
     m.top.focusedIconUri = ""
@@ -24,4 +24,4 @@
         addSpaceAfter = addSpaceAfter = false
     end while
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFGroup.bs.html b/docs/api/components_JFGroup.bs.html index eb08bac5b..09d22a262 100644 --- a/docs/api/components_JFGroup.bs.html +++ b/docs/api/components_JFGroup.bs.html @@ -1,6 +1,6 @@ Source: components/JFGroup.bs
On this page

components_JFGroup.bs

sub init()
+    
On this page

components_JFGroup.bs

sub init()
 end sub
 
 function onKeyEvent(key as string, press as boolean) as boolean
@@ -8,4 +8,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFMessageDialog.bs.html b/docs/api/components_JFMessageDialog.bs.html index 4cdfcf1d3..bbab69a37 100644 --- a/docs/api/components_JFMessageDialog.bs.html +++ b/docs/api/components_JFMessageDialog.bs.html @@ -1,6 +1,6 @@ Source: components/JFMessageDialog.bs
On this page

components_JFMessageDialog.bs

sub init()
+    
On this page

components_JFMessageDialog.bs

sub init()
     options = m.top.findNode("optionList")
     options.focusBitmapBlendColor = "0x0cb0e8"
     options.color = "0xffffff"
@@ -73,4 +73,4 @@
 
     m.top.translation = [(1920 - boxWidth) / 2, (1080 - boxHeight) / 2]
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFOverhang.bs.html b/docs/api/components_JFOverhang.bs.html index a72ffc6ac..d432e42fe 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 @@
         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 93543c605..198112641 100644 --- a/docs/api/components_JFScene.bs.html +++ b/docs/api/components_JFScene.bs.html @@ -1,6 +1,6 @@ Source: components/JFScene.bs
On this page

components_JFScene.bs

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

components_JFScene.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.top.backgroundColor = "#262626" '"#101010"
@@ -47,4 +47,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFScreen.bs.html b/docs/api/components_JFScreen.bs.html index 88f0eade6..a09cfe3cc 100644 --- a/docs/api/components_JFScreen.bs.html +++ b/docs/api/components_JFScreen.bs.html @@ -1,6 +1,6 @@ Source: components/JFScreen.bs
On this page

components_JFScreen.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
+    
On this page

components_JFScreen.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
 
 sub init()
     ' initialize the log manager. second param sets log output:
@@ -24,4 +24,4 @@
 sub OnScreenHidden()
 end sub
 
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_JFVideo.bs.html b/docs/api/components_JFVideo.bs.html index 36578b134..0d4421bdf 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()
@@ -94,12 +94,14 @@
 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 and m.global.session.user.configuration.EnableNextEpisodeAutoPlay
-        m.nextEpisodeButton.visible = true
-        m.showNextEpisodeButtonAnimation.control = "start"
-        m.nextEpisodeButton.setFocus(true)
-    end if
+    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
+
+    m.nextEpisodeButton.visible = true
+    m.showNextEpisodeButtonAnimation.control = "start"
+    m.nextEpisodeButton.setFocus(true)
 end sub
 
 '
@@ -313,4 +315,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_ListPoster.bs.html b/docs/api/components_ListPoster.bs.html index f14118e61..365558683 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()
@@ -17,10 +17,16 @@
 
     m.backdrop = m.top.findNode("backdrop")
 
-    ' Randmomise the background colors
-    posterBackgrounds = m.global.constants.poster_bg_pallet
-    m.backdrop.color = posterBackgrounds[rnd(posterBackgrounds.count()) - 1]
+    ' Randomize the background colors
+    backdropColor = "#00a4db" ' set default in case global var is invalid
+    localGlobal = m.global
 
+    if isValid(localGlobal) and isValid(localGlobal.constants) and isValid(localGlobal.constants.poster_bg_pallet)
+        posterBackgrounds = localGlobal.constants.poster_bg_pallet
+        backdropColor = posterBackgrounds[rnd(posterBackgrounds.count()) - 1]
+    end if
+
+    m.backdrop.color = backdropColor
     updateSize()
 end sub
 
@@ -124,4 +130,4 @@
         m.title.visible = false
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_OverviewDialog.bs.html b/docs/api/components_OverviewDialog.bs.html index 6d8700cfb..a4d1e06d4 100644 --- a/docs/api/components_OverviewDialog.bs.html +++ b/docs/api/components_OverviewDialog.bs.html @@ -1,6 +1,6 @@ Source: components/OverviewDialog.bs
On this page

components_OverviewDialog.bs

sub setTitle()
+    
On this page

components_OverviewDialog.bs

sub setTitle()
     m.top.findNode("titleArea").primaryTitle = m.top.title
 end sub
 
@@ -17,4 +17,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_PersonDetails.bs.html b/docs/api/components_PersonDetails.bs.html index 8d8ab69e9..f1fa24bdf 100644 --- a/docs/api/components_PersonDetails.bs.html +++ b/docs/api/components_PersonDetails.bs.html @@ -1,6 +1,6 @@ Source: components/PersonDetails.bs
On this page

components_PersonDetails.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_PersonDetails.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -174,4 +174,4 @@
     myDate.FromISO8601String(isoDate)
     return myDate.AsDateString("short-month-no-weekday")
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_PlaybackDialog.bs.html b/docs/api/components_PlaybackDialog.bs.html index 4e16e68d4..df9e5cf60 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 4cc5a847f..da1dd744f 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 7436c0df5..824473251 100644 --- a/docs/api/components_PlaystateTask.bs.html +++ b/docs/api/components_PlaystateTask.bs.html @@ -1,6 +1,6 @@ Source: components/PlaystateTask.bs
On this page

components_PlaystateTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_PlaystateTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -54,4 +54,4 @@
     end for
     return FormatJson(new_params)
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_RadioDialog.bs.html b/docs/api/components_RadioDialog.bs.html index b731bc403..d3f20eb54 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 @@
 
     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 b557f4c7a..602e1d1cf 100644 --- a/docs/api/components_SearchBox.bs.html +++ b/docs/api/components_SearchBox.bs.html @@ -1,6 +1,6 @@ Source: components/SearchBox.bs
On this page

components_SearchBox.bs

import "pkg:/source/api/Items.bs"
+    
On this page

components_SearchBox.bs

import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/Image.bs"
@@ -33,4 +33,4 @@
         m.searchText.textEditBox.leadingEllipsis = false
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_Spinner.bs.html b/docs/api/components_Spinner.bs.html index 8e3788443..734089ed4 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 9caf0b926..3f37ada4e 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 @@
         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 6066d561b..88bc37ffe 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 @@
 
     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 554b63ae2..78b00a9cc 100644 --- a/docs/api/components_captionTask.bs.html +++ b/docs/api/components_captionTask.bs.html @@ -1,6 +1,6 @@ Source: components/captionTask.bs
On this page

components_captionTask.bs

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

components_captionTask.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/baserequest.bs"
 
 sub init()
@@ -150,4 +150,4 @@
     end for
     return entries
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_ConfigData.bs.html b/docs/api/components_config_ConfigData.bs.html index 8fa9a292f..58500f24d 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 0a8ef85d4..d147fbe22 100644 --- a/docs/api/components_config_ConfigItem.bs.html +++ b/docs/api/components_config_ConfigItem.bs.html @@ -1,6 +1,6 @@ Source: components/config/ConfigItem.bs
On this page

components_config_ConfigItem.bs

sub init()
+    
On this page

components_config_ConfigItem.bs

sub init()
     m.name = m.top.findNode("label")
     m.value = m.top.findNode("value")
 
@@ -37,4 +37,4 @@
     m.value.textColor = color
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_ConfigList.bs.html b/docs/api/components_config_ConfigList.bs.html index 54d0e1fda..3051d90d9 100644 --- a/docs/api/components_config_ConfigList.bs.html +++ b/docs/api/components_config_ConfigList.bs.html @@ -1,6 +1,6 @@ Source: components/config/ConfigList.bs
On this page

components_config_ConfigList.bs

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

components_config_ConfigList.bs

import "pkg:/source/utils/config.bs"
 
 sub init()
     m.top.itemComponentName = "ConfigItem"
@@ -76,4 +76,4 @@
 sub dismiss_dialog()
     m.dialog.close = true
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_JFServer.bs.html b/docs/api/components_config_JFServer.bs.html index 121062072..5d1bdfe0f 100644 --- a/docs/api/components_config_JFServer.bs.html +++ b/docs/api/components_config_JFServer.bs.html @@ -1,6 +1,6 @@ Source: components/config/JFServer.bs
On this page

components_config_JFServer.bs

sub init() as void
+    
On this page

components_config_JFServer.bs

sub init() as void
     m.poster = m.top.findNode("poster")
     m.name = m.top.findNode("name")
     m.baseUrl = m.top.findNode("baseUrl")
@@ -34,4 +34,4 @@
         child.color = color
     end for
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_LoginScene.bs.html b/docs/api/components_config_LoginScene.bs.html index 68354361a..c9783970b 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 @@
     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 e5736307c..83d7645f5 100644 --- a/docs/api/components_config_ServerDiscoveryTask.bs.html +++ b/docs/api/components_config_ServerDiscoveryTask.bs.html @@ -1,6 +1,6 @@ Source: components/config/ServerDiscoveryTask.bs
On this page

components_config_ServerDiscoveryTask.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
+    
On this page

components_config_ServerDiscoveryTask.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
 
 '
 ' Task used to discover jellyfin servers on the local network
@@ -171,4 +171,4 @@
         end if
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_config_SetServerScreen.bs.html b/docs/api/components_config_SetServerScreen.bs.html index 08e6e99df..76388153b 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 @@
         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 e950344bd..a0e8c02da 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 2b6d6a1ab..9ee194203 100644 --- a/docs/api/components_data_ChannelData.bs.html +++ b/docs/api/components_data_ChannelData.bs.html @@ -1,6 +1,6 @@ Source: components/data/ChannelData.bs
On this page

components_data_ChannelData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_ChannelData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -24,4 +24,4 @@
         m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_CollectionData.bs.html b/docs/api/components_data_CollectionData.bs.html index 03f85de01..eb3f127c4 100644 --- a/docs/api/components_data_CollectionData.bs.html +++ b/docs/api/components_data_CollectionData.bs.html @@ -1,6 +1,6 @@ Source: components/data/CollectionData.bs
On this page

components_data_CollectionData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_CollectionData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -40,4 +40,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_FolderData.bs.html b/docs/api/components_data_FolderData.bs.html index eb5a576cb..b57d6e4bf 100644 --- a/docs/api/components_data_FolderData.bs.html +++ b/docs/api/components_data_FolderData.bs.html @@ -1,6 +1,6 @@ Source: components/data/FolderData.bs
On this page

components_data_FolderData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_FolderData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -33,4 +33,4 @@
 end sub
 
 'TODO Set network Poster image
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_GetFiltersTask.bs.html b/docs/api/components_data_GetFiltersTask.bs.html index c87474080..2d8f4f52d 100644 --- a/docs/api/components_data_GetFiltersTask.bs.html +++ b/docs/api/components_data_GetFiltersTask.bs.html @@ -1,6 +1,6 @@ Source: components/data/GetFiltersTask.bs
On this page

components_data_GetFiltersTask.bs

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

components_data_GetFiltersTask.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/sdk.bs"
 
 sub init()
@@ -11,4 +11,4 @@
     m.filters = api.items.GetFilters(m.top.params)
     m.top.filters = m.filters
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_HomeData.bs.html b/docs/api/components_data_HomeData.bs.html index c41f3739d..d9c08f3df 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"
 
@@ -21,15 +21,17 @@
 
     ' Set appropriate Images for Wide and Tall based on type
 
-    if datum.type = "CollectionFolder" or datum.type = "UserView"
-        params = { "Tag": datum.ImageTags.Primary, "maxHeight": 261, "maxWidth": 464 }
-        m.top.thumbnailURL = ImageURL(datum.id, "Primary", params)
-        m.top.widePosterUrl = m.top.thumbnailURL
+    if LCase(datum.type) = "collectionfolder" or LCase(datum.type) = "userview"
+        if IsValid(datum.ImageTags)
+            params = { "Tag": datum.ImageTags.Primary, "maxHeight": 261, "maxWidth": 464 }
+            m.top.thumbnailURL = ImageURL(datum.id, "Primary", params)
+            m.top.widePosterUrl = m.top.thumbnailURL
+        end if
 
         ' Add Icon URLs for display if there is no Poster
-        if datum.CollectionType = "livetv"
+        if LCase(m.top.CollectionType) = "livetv"
             m.top.iconUrl = "pkg:/images/media_type_icons/live_tv_white.png"
-        else if datum.CollectionType = "folders"
+        else if LCase(m.top.CollectionType) = "folders" or LCase(m.top.CollectionType) = "nextup"
             m.top.iconUrl = "pkg:/images/media_type_icons/folder_white.png"
         end if
 
@@ -60,6 +62,7 @@
         end if
 
     else if datum.type = "Series"
+        m.top.isWatched = datum.UserData.Played
         imgParams = { "maxHeight": 261 }
         imgParams.Append({ "maxWidth": 464 })
 
@@ -136,4 +139,4 @@
         m.top.posterUrl = m.top.thumbnailURL
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_ImageData.bs.html b/docs/api/components_data_ImageData.bs.html index 7be8f697a..8dd37a612 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 2e918a0f7..1aa858f7e 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 6253dd02f..9d51114c3 100644 --- a/docs/api/components_data_MovieData.bs.html +++ b/docs/api/components_data_MovieData.bs.html @@ -1,11 +1,12 @@ 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"
 
 sub setFields()
+    if not isValid(m.top.json) then return
     json = m.top.json
 
     m.top.id = json.id
@@ -80,4 +81,4 @@
         m.top.container = "mp4"
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_MusicAlbumData.bs.html b/docs/api/components_data_MusicAlbumData.bs.html index 11c4bdc21..3de601688 100644 --- a/docs/api/components_data_MusicAlbumData.bs.html +++ b/docs/api/components_data_MusicAlbumData.bs.html @@ -1,6 +1,6 @@ Source: components/data/MusicAlbumData.bs
On this page

components_data_MusicAlbumData.bs

sub setFields()
+    
On this page

components_data_MusicAlbumData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
@@ -15,4 +15,4 @@
         m.top.posterURL = ""
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_MusicAlbumSongListData.bs.html b/docs/api/components_data_MusicAlbumSongListData.bs.html index dc3a57a8b..5d73163c0 100644 --- a/docs/api/components_data_MusicAlbumSongListData.bs.html +++ b/docs/api/components_data_MusicAlbumSongListData.bs.html @@ -1,6 +1,6 @@ Source: components/data/MusicAlbumSongListData.bs
On this page

components_data_MusicAlbumSongListData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_MusicAlbumSongListData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -36,4 +36,4 @@
 
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_MusicArtistData.bs.html b/docs/api/components_data_MusicArtistData.bs.html index e450b05dc..fc2eccd61 100644 --- a/docs/api/components_data_MusicArtistData.bs.html +++ b/docs/api/components_data_MusicArtistData.bs.html @@ -1,6 +1,6 @@ Source: components/data/MusicArtistData.bs
On this page

components_data_MusicArtistData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_MusicArtistData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -39,4 +39,4 @@
 
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_MusicSongData.bs.html b/docs/api/components_data_MusicSongData.bs.html index 123a9a8ca..26e8af2b5 100644 --- a/docs/api/components_data_MusicSongData.bs.html +++ b/docs/api/components_data_MusicSongData.bs.html @@ -1,6 +1,6 @@ Source: components/data/MusicSongData.bs
On this page

components_data_MusicSongData.bs

sub setFields()
+    
On this page

components_data_MusicSongData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
@@ -17,4 +17,4 @@
         m.top.posterURL = ""
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_OptionsButton.bs.html b/docs/api/components_data_OptionsButton.bs.html index 26d6eef54..b959c17fa 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 d11c882c8..315ac2029 100644 --- a/docs/api/components_data_OptionsData.bs.html +++ b/docs/api/components_data_OptionsData.bs.html @@ -1,6 +1,6 @@ Source: components/data/OptionsData.bs
On this page

components_data_OptionsData.bs

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

components_data_OptionsData.bs

import "pkg:/source/utils/config.bs"
 
 sub init()
     m.top.value_index = 0
@@ -40,4 +40,4 @@
         set_user_setting(m.top.config_key, m.top.value)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_PersonData.bs.html b/docs/api/components_data_PersonData.bs.html index fdd38e98b..718239c3f 100644 --- a/docs/api/components_data_PersonData.bs.html +++ b/docs/api/components_data_PersonData.bs.html @@ -1,6 +1,6 @@ Source: components/data/PersonData.bs
On this page

components_data_PersonData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_PersonData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -36,4 +36,4 @@
 
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_PhotoData.bs.html b/docs/api/components_data_PhotoData.bs.html index abedba587..4508b18ec 100644 --- a/docs/api/components_data_PhotoData.bs.html +++ b/docs/api/components_data_PhotoData.bs.html @@ -1,6 +1,6 @@ Source: components/data/PhotoData.bs
On this page

components_data_PhotoData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_PhotoData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -38,4 +38,4 @@
 
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_PlaylistData.bs.html b/docs/api/components_data_PlaylistData.bs.html index 1cde8ef46..abed05aee 100644 --- a/docs/api/components_data_PlaylistData.bs.html +++ b/docs/api/components_data_PlaylistData.bs.html @@ -1,6 +1,6 @@ Source: components/data/PlaylistData.bs
On this page

components_data_PlaylistData.bs

sub setFields()
+    
On this page

components_data_PlaylistData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
@@ -15,4 +15,4 @@
         m.top.posterURL = ""
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_PublicUserData.bs.html b/docs/api/components_data_PublicUserData.bs.html index 26ac2361e..eba302318 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 7327dab8e..76c0bbea2 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 @@
         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 f34f2d578..02b73aba0 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 @@
 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 f0b7a6b1b..c2b83c2ab 100644 --- a/docs/api/components_data_ScheduleProgramData.bs.html +++ b/docs/api/components_data_ScheduleProgramData.bs.html @@ -1,6 +1,6 @@ Source: components/data/ScheduleProgramData.bs
On this page

components_data_ScheduleProgramData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_ScheduleProgramData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -47,4 +47,4 @@
         end if
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_SearchData.bs.html b/docs/api/components_data_SearchData.bs.html index 877255da0..e7595be90 100644 --- a/docs/api/components_data_SearchData.bs.html +++ b/docs/api/components_data_SearchData.bs.html @@ -1,6 +1,6 @@ Source: components/data/SearchData.bs
On this page

components_data_SearchData.bs

sub setFields()
+    
On this page

components_data_SearchData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
@@ -15,4 +15,4 @@
         m.top.posterURL = ""
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_SeriesData.bs.html b/docs/api/components_data_SeriesData.bs.html index f1783f7f1..0fb6eb60d 100644 --- a/docs/api/components_data_SeriesData.bs.html +++ b/docs/api/components_data_SeriesData.bs.html @@ -1,6 +1,6 @@ Source: components/data/SeriesData.bs
On this page

components_data_SeriesData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_SeriesData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -53,4 +53,4 @@
 
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_TVEpisode.bs.html b/docs/api/components_data_TVEpisode.bs.html index f5e962c5b..7b4818b56 100644 --- a/docs/api/components_data_TVEpisode.bs.html +++ b/docs/api/components_data_TVEpisode.bs.html @@ -1,6 +1,6 @@ Source: components/data/TVEpisode.bs
On this page

components_data_TVEpisode.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_TVEpisode.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -25,4 +25,4 @@
         m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_TVEpisodeData.bs.html b/docs/api/components_data_TVEpisodeData.bs.html index 969ef687c..3d903185b 100644 --- a/docs/api/components_data_TVEpisodeData.bs.html +++ b/docs/api/components_data_TVEpisodeData.bs.html @@ -1,6 +1,9 @@ Source: components/data/TVEpisodeData.bs
On this page

components_data_TVEpisodeData.bs

sub setFields()
+    
On this page

components_data_TVEpisodeData.bs

import "pkg:/source/utils/misc.bs"
+
+sub setFields()
+    if not isValid(m.top.json) then return
     datum = m.top.json
 
     m.top.id = datum.id
@@ -12,10 +15,10 @@
 end sub
 
 sub setPoster()
-    if m.top.image <> invalid
+    if isValid(m.top.image)
         m.top.posterURL = m.top.image.url
     else
         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 161c972fa..42e611494 100644 --- a/docs/api/components_data_TVSeasonData.bs.html +++ b/docs/api/components_data_TVSeasonData.bs.html @@ -1,6 +1,6 @@ Source: components/data/TVSeasonData.bs
On this page

components_data_TVSeasonData.bs

sub setFields()
+    
On this page

components_data_TVSeasonData.bs

sub setFields()
     datum = m.top.json
 
     m.top.id = datum.id
@@ -18,4 +18,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_UserData.bs.html b/docs/api/components_data_UserData.bs.html index e9a1c2abf..5a47e2346 100644 --- a/docs/api/components_data_UserData.bs.html +++ b/docs/api/components_data_UserData.bs.html @@ -1,6 +1,6 @@ Source: components/data/UserData.bs
On this page

components_data_UserData.bs

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

components_data_UserData.bs

import "pkg:/source/utils/config.bs"
 
 sub setDataFromJSON()
     json = m.top.json
@@ -58,4 +58,4 @@
 sub setServer(hostname as string)
     m.top.server = hostname
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_data_VideoData.bs.html b/docs/api/components_data_VideoData.bs.html index f8ce75946..5ddbca558 100644 --- a/docs/api/components_data_VideoData.bs.html +++ b/docs/api/components_data_VideoData.bs.html @@ -1,6 +1,6 @@ Source: components/data/VideoData.bs
On this page

components_data_VideoData.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_data_VideoData.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
@@ -25,4 +25,4 @@
         m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_extras_ExtrasItem.bs.html b/docs/api/components_extras_ExtrasItem.bs.html index 5a8276d6a..9a27482fd 100644 --- a/docs/api/components_extras_ExtrasItem.bs.html +++ b/docs/api/components_extras_ExtrasItem.bs.html @@ -1,13 +1,32 @@ Source: components/extras/ExtrasItem.bs
On this page

components_extras_ExtrasItem.bs

sub init()
+    
On this page

components_extras_ExtrasItem.bs

import "pkg:/source/utils/misc.bs"
+
+sub init()
+    initPosterImg()
+    initName()
+    initRole()
+end sub
+
+sub initPosterImg()
     m.posterImg = m.top.findNode("posterImg")
+end sub
+
+sub initName()
     m.name = m.top.findNode("pLabel")
+end sub
+
+sub initRole()
     m.role = m.top.findNode("subTitle")
 end sub
 
 sub showContent()
-    if m.top.itemContent <> invalid
+    ' validate nodes to prevent crash
+    if not isValid(m.posterImg) then initPosterImg()
+    if not isValid(m.name) then initName()
+    if not isValid(m.role) then initRole()
+
+    if isValid(m.top.itemContent)
         cont = m.top.itemContent
         m.name.text = cont.labelText
         m.name.maxWidth = cont.imageWidth
@@ -37,4 +56,4 @@
         txt2Speech.Say(m.role.text)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_extras_ExtrasRowList.bs.html b/docs/api/components_extras_ExtrasRowList.bs.html index dfcd9e4b7..fbdbafaef 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 @@
 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 07949b61b..c799f62a6 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 @@
     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 9c7e5d988..812973223 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"
@@ -8,12 +8,12 @@
 
 sub init()
     m.log = log.Logger("HomeItem")
-    m.itemText = m.top.findNode("itemText")
-    m.itemPoster = m.top.findNode("itemPoster")
+    initItemText()
+    initItemPoster()
     m.itemProgress = m.top.findNode("progress")
     m.itemProgressBackground = m.top.findNode("progressBackground")
     m.itemIcon = m.top.findNode("itemIcon")
-    m.itemTextExtra = m.top.findNode("itemTextExtra")
+    initItemTextExtra()
     m.itemPoster.observeField("loadStatus", "onPosterLoadStatusChanged")
     m.unplayedCount = m.top.findNode("unplayedCount")
     m.unplayedEpisodeCount = m.top.findNode("unplayedEpisodeCount")
@@ -32,10 +32,25 @@
     end if
 
     ' update the backdrop node
-    m.backdrop = m.top.findNode("backdrop")
+    initBackdrop()
     m.backdrop.color = backdropColor
 end sub
 
+sub initItemText()
+    m.itemText = m.top.findNode("itemText")
+end sub
+
+sub initItemPoster()
+    m.itemPoster = m.top.findNode("itemPoster")
+end sub
+
+sub initItemTextExtra()
+    m.itemTextExtra = m.top.findNode("itemTextExtra")
+end sub
+
+sub initBackdrop()
+    m.backdrop = m.top.findNode("backdrop")
+end sub
 
 sub itemContentChanged()
     if isValid(m.unplayedCount) then m.unplayedCount.visible = false
@@ -45,6 +60,12 @@
 
     itemData.Title = itemData.name ' Temporarily required while we move from "HomeItem" to "JFContentItem"
 
+    ' validate to prevent crash
+    if not isValid(m.itemPoster) then initItemPoster()
+    if not isValid(m.itemText) then initItemText()
+    if not isValid(m.itemTextExtra) then initItemTextExtra()
+    if not isValid(m.backdrop) then initBackdrop()
+
     m.itemPoster.width = itemData.imageWidth
     m.itemText.maxWidth = itemData.imageWidth
     m.itemTextExtra.width = itemData.imageWidth
@@ -132,9 +153,16 @@
             drawProgressBar(itemData)
         end if
 
-        if itemData.usePoster = true
+        if localGlobal.session.user.settings["ui.general.episodeimagesnextup"] = "webclient"
+            tmpSetting = localGlobal.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"
             m.itemPoster.uri = itemData.widePosterURL
-        else
+        else if localGlobal.session.user.settings["ui.general.episodeimagesnextup"] = "episode"
             m.itemPoster.uri = itemData.thumbnailURL
         end if
 
@@ -346,4 +374,4 @@
         m.itemIcon.visible = true
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_home_HomeRows.bs.html b/docs/api/components_home_HomeRows.bs.html index 18936c2a0..56c4041f0 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 @@
     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 a9d364eee..adc69bf32 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"
@@ -70,7 +70,7 @@
         params["SortOrder"] = "Descending"
         params["ImageTypeLimit"] = 1
         params["UserId"] = m.global.session.user.id
-        params["EnableRewatching"] = false
+        params["EnableRewatching"] = m.global.session.user.settings["ui.details.enablerewatchingnextup"]
         params["DisableFirstEpisode"] = false
         params["limit"] = 24
         params["EnableTotalRecordCount"] = false
@@ -87,6 +87,9 @@
             end if
         end if
 
+        addViewAll = true ' Assume there will be a "View All" to start
+        checkViewAll = false ' Only need to check if we don't have anything in the Next Up home row
+
         resp = APIRequest(url, params)
         data = getJson(resp)
         if isValid(data) and isValid(data.Items)
@@ -95,6 +98,36 @@
                 tmp.json = item
                 results.push(tmp)
             end for
+            if data.Items.Count() = 0
+                checkViewAll = true
+            end if
+        else
+            checkViewAll = true
+        end if
+
+        ' Add "View All"
+        if checkViewAll
+            ' Nothing to show in Next Up, but are there hidden items (e.g. > 365 days old)?
+            params.Delete("NextUpDateCutoff")
+            params["limit"] = 1 ' if there is even one, then we know we need to show "View All"
+            resp = APIRequest(url, params)
+            data = getJson(resp)
+            if not isValid(data) or isValid(data) and isValid(data.Items) and data.Items.Count() = 0
+                addViewAll = false
+            end if
+        end if
+
+        if addViewAll
+            tmp = CreateObject("roSGNode", "HomeData")
+            tmp.type = "CollectionFolder"
+            tmp.usePoster = false
+            tmp.json = {
+                IsFolder: true,
+                Name: tr("View All Next Up"),
+                Type: "CollectionFolder",
+                CollectionType: "nextup"
+            }
+            results.push(tmp)
         end if
         ' Load Continue Watching
     else if m.top.itemsToLoad = "continue"
@@ -268,4 +301,4 @@
         end for
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_keyboards_IntegerKeyboard.bs.html b/docs/api/components_keyboards_IntegerKeyboard.bs.html index a4be2ceb2..2e0b375d0 100644 --- a/docs/api/components_keyboards_IntegerKeyboard.bs.html +++ b/docs/api/components_keyboards_IntegerKeyboard.bs.html @@ -1,6 +1,6 @@ Source: components/keyboards/IntegerKeyboard.bs
On this page

components_keyboards_IntegerKeyboard.bs

sub init()
+    
On this page

components_keyboards_IntegerKeyboard.bs

sub init()
     m.top.keyGrid.keyDefinitionUri = "pkg:/components/keyboards/IntegerKeyboardKDF.json"
 end sub
 
@@ -81,4 +81,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_LoadChannelsTask.bs.html b/docs/api/components_liveTv_LoadChannelsTask.bs.html index fe86b7253..0bcd0c87f 100644 --- a/docs/api/components_liveTv_LoadChannelsTask.bs.html +++ b/docs/api/components_liveTv_LoadChannelsTask.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/LoadChannelsTask.bs
On this page

components_liveTv_LoadChannelsTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_liveTv_LoadChannelsTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -72,4 +72,4 @@
     end for
     m.top.channels = results
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_LoadProgramDetailsTask.bs.html b/docs/api/components_liveTv_LoadProgramDetailsTask.bs.html index 1eab29183..14d865fe7 100644 --- a/docs/api/components_liveTv_LoadProgramDetailsTask.bs.html +++ b/docs/api/components_liveTv_LoadProgramDetailsTask.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/LoadProgramDetailsTask.bs
On this page

components_liveTv_LoadProgramDetailsTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_liveTv_LoadProgramDetailsTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -44,4 +44,4 @@
     m.top.programDetails = program
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_LoadSheduleTask.bs.html b/docs/api/components_liveTv_LoadSheduleTask.bs.html index 20dea311e..5a40cec83 100644 --- a/docs/api/components_liveTv_LoadSheduleTask.bs.html +++ b/docs/api/components_liveTv_LoadSheduleTask.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/LoadSheduleTask.bs
On this page

components_liveTv_LoadSheduleTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_liveTv_LoadSheduleTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -50,4 +50,4 @@
     m.top.schedule = results
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_ProgramDetails.bs.html b/docs/api/components_liveTv_ProgramDetails.bs.html index 401ece8b5..958f9ba05 100644 --- a/docs/api/components_liveTv_ProgramDetails.bs.html +++ b/docs/api/components_liveTv_ProgramDetails.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/ProgramDetails.bs
On this page

components_liveTv_ProgramDetails.bs

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

components_liveTv_ProgramDetails.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -374,4 +374,4 @@
     return false
 end function
 
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_RecordProgramTask.bs.html b/docs/api/components_liveTv_RecordProgramTask.bs.html index b1e3457b1..88b1a9215 100644 --- a/docs/api/components_liveTv_RecordProgramTask.bs.html +++ b/docs/api/components_liveTv_RecordProgramTask.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/RecordProgramTask.bs
On this page

components_liveTv_RecordProgramTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_liveTv_RecordProgramTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/roku_modules/log/LogMixin.brs"
 
@@ -60,4 +60,4 @@
 
     m.top.recordOperationDone = true
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_liveTv_schedule.bs.html b/docs/api/components_liveTv_schedule.bs.html index ed5695ac0..bfbb84295 100644 --- a/docs/api/components_liveTv_schedule.bs.html +++ b/docs/api/components_liveTv_schedule.bs.html @@ -1,6 +1,6 @@ Source: components/liveTv/schedule.bs
On this page

components_liveTv_schedule.bs

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

components_liveTv_schedule.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.EPGLaunchCompleteSignaled = false
@@ -305,4 +305,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_login_UserItem.bs.html b/docs/api/components_login_UserItem.bs.html index 692dd5d3a..361d605ca 100644 --- a/docs/api/components_login_UserItem.bs.html +++ b/docs/api/components_login_UserItem.bs.html @@ -1,6 +1,6 @@ Source: components/login/UserItem.bs
On this page

components_login_UserItem.bs

sub init()
+    
On this page

components_login_UserItem.bs

sub init()
 end sub
 
 sub itemContentChanged()
@@ -17,4 +17,4 @@
     end if
     profileName.text = itemData.name
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_login_UserRow.bs.html b/docs/api/components_login_UserRow.bs.html index cb88b393f..2ddfa3de8 100644 --- a/docs/api/components_login_UserRow.bs.html +++ b/docs/api/components_login_UserRow.bs.html @@ -1,6 +1,6 @@ Source: components/login/UserRow.bs
On this page

components_login_UserRow.bs

sub init()
+    
On this page

components_login_UserRow.bs

sub init()
     m.top.itemComponentName = "UserItem"
     m.top.content = SetData()
     m.top.observeField("itemSelected", "SetUser")
@@ -53,4 +53,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_login_UserSelect.bs.html b/docs/api/components_login_UserSelect.bs.html index 1b6ca0d05..c9c8fb159 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 @@
     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 8aae093ad..43dcb7d2b 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 @@
 
     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 0c4125b63..cb6d24712 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 @@
     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 c628a4ee5..a7b64e786 100644 --- a/docs/api/components_mediaPlayers_AudioPlayer.bs.html +++ b/docs/api/components_mediaPlayers_AudioPlayer.bs.html @@ -1,6 +1,6 @@ Source: components/mediaPlayers/AudioPlayer.bs
On this page

components_mediaPlayers_AudioPlayer.bs

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

components_mediaPlayers_AudioPlayer.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.playReported = false
@@ -43,4 +43,4 @@
     playstateTask.setFields({ status: state, params: params })
     playstateTask.control = "RUN"
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_movies_AudioTrackListItem.bs.html b/docs/api/components_movies_AudioTrackListItem.bs.html index 16dc79c3e..96eb75c31 100644 --- a/docs/api/components_movies_AudioTrackListItem.bs.html +++ b/docs/api/components_movies_AudioTrackListItem.bs.html @@ -1,6 +1,6 @@ Source: components/movies/AudioTrackListItem.bs
On this page

components_movies_AudioTrackListItem.bs

sub init()
+    
On this page

components_movies_AudioTrackListItem.bs

sub init()
     m.title = m.top.findNode("title")
     m.description = m.top.findNode("description")
     m.selectedIcon = m.top.findNode("selectedIcon")
@@ -33,4 +33,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_movies_MovieDetails.bs.html b/docs/api/components_movies_MovieDetails.bs.html index 0d40dc3bb..51de14bd9 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()
@@ -53,6 +53,7 @@
 ' onMoviePosterSwapAnimationStateChange: Handler for changes to m.moviePosterSwapAnimation.state
 '
 sub onMoviePosterSwapAnimationStateChange()
+    if not isValid(m.moviePosterSwapAnimation) then return
     if LCase(m.moviePosterSwapAnimation.state) <> "stopped" then return
     m.moviePoster.uri = m.moviePosterSwap.uri
     m.moviePoster.opacity = 1
@@ -97,102 +98,105 @@
 sub itemContentChanged()
     ' Updates video metadata
     item = m.top.itemContent
-    itemData = item.json
-    m.top.id = itemData.id
-    m.top.findNode("moviePoster").uri = m.top.itemContent.posterURL
-
-    ' Set default video source if user hasn't selected one yet
-    if m.top.selectedVideoStreamId = "" and isValid(itemData.MediaSources)
-        m.top.selectedVideoStreamId = itemData.MediaSources[0].id
-    end if
+    if isValid(item) and isValid(item.json)
+        itemData = item.json
+        m.top.id = itemData.id
+        m.top.findNode("moviePoster").uri = m.top.itemContent.posterURL
+
+        ' Set default video source if user hasn't selected one yet
+        if m.top.selectedVideoStreamId = "" and isValid(itemData.MediaSources)
+            m.top.selectedVideoStreamId = itemData.MediaSources[0].id
+        end if
 
-    ' Find first Audio Stream and set that as default
-    SetDefaultAudioTrack(itemData)
+        ' Find first Audio Stream and set that as default
+        SetDefaultAudioTrack(itemData)
 
-    ' Handle all "As Is" fields
-    m.top.overhangTitle = itemData.name
-    setFieldText("releaseYear", itemData.productionYear)
-    setFieldText("overview", itemData.overview)
+        ' Handle all "As Is" fields
+        m.top.overhangTitle = itemData.name
+        setFieldText("releaseYear", itemData.productionYear)
+        setFieldText("overview", itemData.overview)
 
-    if itemData.officialRating <> invalid
-        setFieldText("officialRating", itemData.officialRating)
-    else
-        m.infoGroup.removeChild(m.top.findNode("officialRating"))
-    end if
-
-    if m.global.session.user.settings["ui.movies.showRatings"]
-        if isValid(itemData.communityRating)
-            setFieldText("communityRating", int(itemData.communityRating * 10) / 10)
+        if itemData.officialRating <> invalid
+            setFieldText("officialRating", itemData.officialRating)
         else
-            m.infoGroup.removeChild(m.top.findNode("communityRatingGroup"))
+            m.infoGroup.removeChild(m.top.findNode("officialRating"))
         end if
-        if isValid(itemData.CriticRating)
-            setFieldText("criticRatingLabel", itemData.criticRating)
-            if itemData.CriticRating > 60
-                tomato = "pkg:/images/fresh.png"
+
+        if m.global.session.user.settings["ui.movies.showRatings"]
+            if isValid(itemData.communityRating)
+                setFieldText("communityRating", int(itemData.communityRating * 10) / 10)
+            else
+                m.infoGroup.removeChild(m.top.findNode("communityRatingGroup"))
+            end if
+            if isValid(itemData.CriticRating)
+                setFieldText("criticRatingLabel", itemData.criticRating)
+                if itemData.CriticRating > 60
+                    tomato = "pkg:/images/fresh.png"
+                else
+                    tomato = "pkg:/images/rotten.png"
+                end if
+                criticRatingIcon = m.top.findNode("criticRatingIcon")
+                if isValid(criticRatingIcon) then criticRatingIcon.uri = tomato
             else
-                tomato = "pkg:/images/rotten.png"
+                m.infoGroup.removeChild(m.top.findNode("criticRatingGroup"))
             end if
-            m.top.findNode("criticRatingIcon").uri = tomato
         else
+            m.infoGroup.removeChild(m.top.findNode("communityRatingGroup"))
             m.infoGroup.removeChild(m.top.findNode("criticRatingGroup"))
         end if
-    else
-        m.infoGroup.removeChild(m.top.findNode("communityRatingGroup"))
-        m.infoGroup.removeChild(m.top.findNode("criticRatingGroup"))
-    end if
 
-    if type(itemData.RunTimeTicks) = "LongInteger"
-        setFieldText("runtime", stri(getRuntime()) + " mins")
-        if m.global.session.user.settings["ui.design.hideclock"] <> true
-            setFieldText("ends-at", tr("Ends at %1").Replace("%1", getEndTime()))
+        if type(itemData.RunTimeTicks) = "LongInteger"
+            setFieldText("runtime", stri(getRuntime()) + " mins")
+            if m.global.session.user.settings["ui.design.hideclock"] <> true
+                setFieldText("ends-at", tr("Ends at %1").Replace("%1", getEndTime()))
+            end if
         end if
-    end if
 
-    if itemData.genres.count() > 0
-        setFieldText("genres", tr("Genres") + ": " + itemData.genres.join(", "))
-    else
-        m.top.findNode("details").removeChild(m.top.findNode("genres"))
-    end if
+        if itemData.genres.count() > 0
+            setFieldText("genres", tr("Genres") + ": " + itemData.genres.join(", "))
+        else
+            m.top.findNode("details").removeChild(m.top.findNode("genres"))
+        end if
 
-    ' show tags if there are no genres to display
-    if itemData.genres.count() = 0 and isValid(itemData.tags) and itemData.tags.count() > 0
-        setFieldText("genres", tr("Tags") + ": " + itemData.tags.join(", "))
-    end if
+        ' show tags if there are no genres to display
+        if itemData.genres.count() = 0 and isValid(itemData.tags) and itemData.tags.count() > 0
+            setFieldText("genres", tr("Tags") + ": " + itemData.tags.join(", "))
+        end if
 
-    directors = []
-    for each person in itemData.people
-        if person.type = "Director"
-            directors.push(person.name)
+        directors = []
+        for each person in itemData.people
+            if person.type = "Director"
+                directors.push(person.name)
+            end if
+        end for
+        if directors.count() > 0
+            setFieldText("director", tr("Director") + ": " + directors.join(", "))
+        else
+            m.top.findNode("details").removeChild(m.top.findNode("director"))
         end if
-    end for
-    if directors.count() > 0
-        setFieldText("director", tr("Director") + ": " + directors.join(", "))
-    else
-        m.top.findNode("details").removeChild(m.top.findNode("director"))
-    end if
 
-    if m.global.session.user.settings["ui.details.hidetagline"] = false
-        if itemData.taglines.count() > 0
-            setFieldText("tagline", itemData.taglines[0])
+        if m.global.session.user.settings["ui.details.hidetagline"] = false
+            if itemData.taglines.count() > 0
+                setFieldText("tagline", itemData.taglines[0])
+            end if
+        else
+            m.details.removeChild(m.tagline)
         end if
-    else
-        m.details.removeChild(m.tagline)
-    end if
 
-    'set aired date if type is Episode
-    if itemData.PremiereDate <> invalid and itemData.Type = "Episode"
-        airDate = CreateObject("roDateTime")
-        airDate.FromISO8601String(itemData.PremiereDate)
-        m.top.findNode("aired").text = tr("Aired") + ": " + airDate.AsDateString("short-month-no-weekday")
-        'remove movie release year label
-        m.infoGroup.removeChild(m.top.findNode("releaseYear"))
-    end if
+        'set aired date if type is Episode
+        if itemData.PremiereDate <> invalid and itemData.Type = "Episode"
+            airDate = CreateObject("roDateTime")
+            airDate.FromISO8601String(itemData.PremiereDate)
+            m.top.findNode("aired").text = tr("Aired") + ": " + airDate.AsDateString("short-month-no-weekday")
+            'remove movie release year label
+            m.infoGroup.removeChild(m.top.findNode("releaseYear"))
+        end if
 
-    setFavoriteColor()
-    setWatchedColor()
-    SetUpVideoOptions(itemData.mediaSources)
-    SetUpAudioOptions(itemData.mediaStreams)
+        setFavoriteColor()
+        setWatchedColor()
+        SetUpVideoOptions(itemData.mediaSources)
+        SetUpAudioOptions(itemData.mediaStreams)
+    end if
     m.buttonGrp.visible = true
     stopLoadingSpinner()
 end sub
@@ -438,4 +442,4 @@
     end if
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_movies_MovieOptions.bs.html b/docs/api/components_movies_MovieOptions.bs.html index eaa61ca8d..9f71c6853 100644 --- a/docs/api/components_movies_MovieOptions.bs.html +++ b/docs/api/components_movies_MovieOptions.bs.html @@ -1,6 +1,6 @@ Source: components/movies/MovieOptions.bs
On this page

components_movies_MovieOptions.bs

sub init()
+    
On this page

components_movies_MovieOptions.bs

sub init()
 
     m.buttons = m.top.findNode("buttons")
     m.buttons.buttons = [tr("Video"), tr("Audio")]
@@ -155,4 +155,4 @@
     return false
 
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_movies_VideoTrackListItem.bs.html b/docs/api/components_movies_VideoTrackListItem.bs.html index 5cb6656fe..ecd95353e 100644 --- a/docs/api/components_movies_VideoTrackListItem.bs.html +++ b/docs/api/components_movies_VideoTrackListItem.bs.html @@ -1,6 +1,6 @@ Source: components/movies/VideoTrackListItem.bs
On this page

components_movies_VideoTrackListItem.bs

sub init()
+    
On this page

components_movies_VideoTrackListItem.bs

sub init()
     m.title = m.top.findNode("title")
     m.description = m.top.findNode("description")
     m.selectedIcon = m.top.findNode("selectedIcon")
@@ -33,4 +33,4 @@
     end if
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_AlbumGrid.bs.html b/docs/api/components_music_AlbumGrid.bs.html index d3f5096a1..9dded0c61 100644 --- a/docs/api/components_music_AlbumGrid.bs.html +++ b/docs/api/components_music_AlbumGrid.bs.html @@ -1,6 +1,6 @@ Source: components/music/AlbumGrid.bs
On this page

components_music_AlbumGrid.bs

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

components_music_AlbumGrid.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     getData()
@@ -69,4 +69,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_AlbumTrackList.bs.html b/docs/api/components_music_AlbumTrackList.bs.html index 4b6312ff8..70b90b61d 100644 --- a/docs/api/components_music_AlbumTrackList.bs.html +++ b/docs/api/components_music_AlbumTrackList.bs.html @@ -1,6 +1,6 @@ Source: components/music/AlbumTrackList.bs
On this page

components_music_AlbumTrackList.bs

sub init()
+    
On this page

components_music_AlbumTrackList.bs

sub init()
     m.top.content = getData()
     m.top.setfocus(true)
 end sub
@@ -25,4 +25,4 @@
 
     return data
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_AlbumView.bs.html b/docs/api/components_music_AlbumView.bs.html index 34de3b955..2a236cfb0 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
@@ -138,7 +138,7 @@
     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")
@@ -170,4 +170,4 @@
     m.songList.unobservefield("doneLoading")
     stopLoadingSpinner()
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_ArtistView.bs.html b/docs/api/components_music_ArtistView.bs.html index d46187f2b..d20929d39 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
@@ -225,7 +225,7 @@
     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")
@@ -335,4 +335,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_AudioPlayerView.bs.html b/docs/api/components_music_AudioPlayerView.bs.html index 7b62bda55..08ac4b595 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 @@
     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 d27470df7..858496d4c 100644 --- a/docs/api/components_music_LoadScreenSaverTimeoutTask.bs.html +++ b/docs/api/components_music_LoadScreenSaverTimeoutTask.bs.html @@ -1,6 +1,6 @@ Source: components/music/LoadScreenSaverTimeoutTask.bs
On this page

components_music_LoadScreenSaverTimeoutTask.bs

sub init()
+    
On this page

components_music_LoadScreenSaverTimeoutTask.bs

sub init()
     m.top.functionName = "getScreensaverTimeout"
 end sub
 
@@ -8,4 +8,4 @@
     appinfo = CreateObject("roAppManager")
     m.top.content = appinfo.GetScreensaverTimeout() * 60
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_PlaylistView.bs.html b/docs/api/components_music_PlaylistView.bs.html index c9cb02e21..db0554111 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
@@ -129,7 +129,7 @@
     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")
@@ -161,4 +161,4 @@
     m.songList.unobservefield("doneLoading")
     stopLoadingSpinner()
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_music_SongItem.bs.html b/docs/api/components_music_SongItem.bs.html index e54241dc5..a6a19f6cc 100644 --- a/docs/api/components_music_SongItem.bs.html +++ b/docs/api/components_music_SongItem.bs.html @@ -1,6 +1,6 @@ Source: components/music/SongItem.bs
On this page

components_music_SongItem.bs

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

components_music_SongItem.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.itemText = m.top.findNode("itemText")
@@ -31,4 +31,4 @@
     m.trackNumber.color = color
     m.tracklength.color = color
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_options_OptionNode.bs.html b/docs/api/components_options_OptionNode.bs.html index 4bc48e8fe..19c69726a 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 4623df713..f8b95b597 100644 --- a/docs/api/components_options_OptionsSlider.bs.html +++ b/docs/api/components_options_OptionsSlider.bs.html @@ -1,6 +1,6 @@ Source: components/options/OptionsSlider.bs
On this page

components_options_OptionsSlider.bs

sub init()
+    
On this page

components_options_OptionsSlider.bs

sub init()
     m.top.visible = false
 
     panel = m.top.findNode("panel")
@@ -41,4 +41,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_photos_LoadPhotoTask.bs.html b/docs/api/components_photos_LoadPhotoTask.bs.html index 9217bf60c..bce63d9a2 100644 --- a/docs/api/components_photos_LoadPhotoTask.bs.html +++ b/docs/api/components_photos_LoadPhotoTask.bs.html @@ -1,6 +1,6 @@ Source: components/photos/LoadPhotoTask.bs
On this page

components_photos_LoadPhotoTask.bs

import "pkg:/source/api/Image.bs"
+    
On this page

components_photos_LoadPhotoTask.bs

import "pkg:/source/api/Image.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/misc.bs"
@@ -28,4 +28,4 @@
 
 
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_photos_PhotoDetails.bs.html b/docs/api/components_photos_PhotoDetails.bs.html index 59e42bfa3..4d8061cb2 100644 --- a/docs/api/components_photos_PhotoDetails.bs.html +++ b/docs/api/components_photos_PhotoDetails.bs.html @@ -1,6 +1,6 @@ Source: components/photos/PhotoDetails.bs
On this page

components_photos_PhotoDetails.bs

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

components_photos_PhotoDetails.bs

import "pkg:/source/utils/misc.bs"
 import "pkg:/source/utils/config.bs"
 
 sub init()
@@ -177,4 +177,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_quickConnect_QuickConnect.bs.html b/docs/api/components_quickConnect_QuickConnect.bs.html index 661257e96..bd3b77b1a 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 @@
 
     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 9943c8e64..93ab97247 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 @@
 
     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 fd21736d0..7513c62a9 100644 --- a/docs/api/components_search_SearchResults.bs.html +++ b/docs/api/components_search_SearchResults.bs.html @@ -1,6 +1,6 @@ Source: components/search/SearchResults.bs
On this page

components_search_SearchResults.bs

import "pkg:/source/api/Items.bs"
+    
On this page

components_search_SearchResults.bs

import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/Image.bs"
@@ -84,4 +84,4 @@
     return false
 
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_search_SearchRow.bs.html b/docs/api/components_search_SearchRow.bs.html index 82f7e6986..66fafd64f 100644 --- a/docs/api/components_search_SearchRow.bs.html +++ b/docs/api/components_search_SearchRow.bs.html @@ -1,6 +1,6 @@ Source: components/search/SearchRow.bs
On this page

components_search_SearchRow.bs

import "pkg:/source/api/Items.bs"
+    
On this page

components_search_SearchRow.bs

import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/Image.bs"
@@ -94,4 +94,4 @@
         end if
     end for
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_search_SearchTask.bs.html b/docs/api/components_search_SearchTask.bs.html index e8fd1f200..513cdb92a 100644 --- a/docs/api/components_search_SearchTask.bs.html +++ b/docs/api/components_search_SearchTask.bs.html @@ -1,6 +1,6 @@ Source: components/search/SearchTask.bs
On this page

components_search_SearchTask.bs

import "pkg:/source/api/Items.bs"
+    
On this page

components_search_SearchTask.bs

import "pkg:/source/api/Items.bs"
 import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/config.bs"
 import "pkg:/source/api/Image.bs"
@@ -15,4 +15,4 @@
         m.top.results = searchMedia(m.top.query)
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_section_section.bs.html b/docs/api/components_section_section.bs.html index d5ff994ff..6020ee9e2 100644 --- a/docs/api/components_section_section.bs.html +++ b/docs/api/components_section_section.bs.html @@ -1,6 +1,6 @@ Source: components/section/section.bs
On this page

components_section_section.bs

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

components_section_section.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.showFromBottomAnimation = m.top.findNode("showFromBottomAnimation")
@@ -97,4 +97,4 @@
         end if
     end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_section_sectionScroller.bs.html b/docs/api/components_section_sectionScroller.bs.html index cbbc5c148..f291c2149 100644 --- a/docs/api/components_section_sectionScroller.bs.html +++ b/docs/api/components_section_sectionScroller.bs.html @@ -1,6 +1,6 @@ Source: components/section/sectionScroller.bs
On this page

components_section_sectionScroller.bs

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

components_section_sectionScroller.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.previouslyDisplayedSection = 0
@@ -60,4 +60,4 @@
 
     m.previouslyDisplayedSection = m.top.displayedIndex
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_settings_settings.bs.html b/docs/api/components_settings_settings.bs.html index e5956349f..c5f73fd17 100644 --- a/docs/api/components_settings_settings.bs.html +++ b/docs/api/components_settings_settings.bs.html @@ -1,6 +1,6 @@ Source: components/settings/settings.bs
On this page

components_settings_settings.bs

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

components_settings_settings.bs

import "pkg:/source/utils/config.bs"
 import "pkg:/source/utils/misc.bs"
 import "pkg:/source/roku_modules/log/LogMixin.brs"
 ' post device profile
@@ -254,4 +254,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tasks_PostTask.bs.html b/docs/api/components_tasks_PostTask.bs.html index 6db28d792..81e846f25 100644 --- a/docs/api/components_tasks_PostTask.bs.html +++ b/docs/api/components_tasks_PostTask.bs.html @@ -1,6 +1,6 @@ Source: components/tasks/PostTask.bs
On this page

components_tasks_PostTask.bs

import "pkg:/source/api/baserequest.bs"
+    
On this page

components_tasks_PostTask.bs

import "pkg:/source/api/baserequest.bs"
 import "pkg:/source/utils/misc.bs"
 
 sub init()
@@ -79,4 +79,4 @@
     m.top.responseHeaders = {}
     m.top.failureReason = ""
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVEpisodeRow.bs.html b/docs/api/components_tvshows_TVEpisodeRow.bs.html index f04425a95..9fdd2e861 100644 --- a/docs/api/components_tvshows_TVEpisodeRow.bs.html +++ b/docs/api/components_tvshows_TVEpisodeRow.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVEpisodeRow.bs
On this page

components_tvshows_TVEpisodeRow.bs

sub init()
+    
On this page

components_tvshows_TVEpisodeRow.bs

sub init()
     m.top.itemComponentName = "TVListDetails"
     m.top.content = setData()
 
@@ -62,4 +62,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html b/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html index f57ce36cb..e29cf3698 100644 --- a/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html +++ b/docs/api/components_tvshows_TVEpisodeRowWithOptions.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVEpisodeRowWithOptions.bs
On this page

components_tvshows_TVEpisodeRowWithOptions.bs

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

components_tvshows_TVEpisodeRowWithOptions.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     m.rows = m.top.findNode("tvEpisodeRow")
@@ -123,4 +123,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVEpisodes.bs.html b/docs/api/components_tvshows_TVEpisodes.bs.html index a403a9caa..53be52002 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 @@
 
     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 dcc684536..6d2a974b9 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 @@
         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 a0e913315..6c2818a7e 100644 --- a/docs/api/components_tvshows_TVListOptions.bs.html +++ b/docs/api/components_tvshows_TVListOptions.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVListOptions.bs
On this page

components_tvshows_TVListOptions.bs

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

components_tvshows_TVListOptions.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
 
@@ -154,4 +154,4 @@
     return false
 
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVSeasonRow.bs.html b/docs/api/components_tvshows_TVSeasonRow.bs.html index b3043733f..41963439e 100644 --- a/docs/api/components_tvshows_TVSeasonRow.bs.html +++ b/docs/api/components_tvshows_TVSeasonRow.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVSeasonRow.bs
On this page

components_tvshows_TVSeasonRow.bs

sub init()
+    
On this page

components_tvshows_TVSeasonRow.bs

sub init()
     m.top.itemComponentName = "ListPoster"
     m.top.content = getData()
 
@@ -48,4 +48,4 @@
     m.top.content = data
     return data
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVShowDescription.bs.html b/docs/api/components_tvshows_TVShowDescription.bs.html index 9c9eca296..c6d445d1c 100644 --- a/docs/api/components_tvshows_TVShowDescription.bs.html +++ b/docs/api/components_tvshows_TVShowDescription.bs.html @@ -1,6 +1,6 @@ Source: components/tvshows/TVShowDescription.bs
On this page

components_tvshows_TVShowDescription.bs

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

components_tvshows_TVShowDescription.bs

import "pkg:/source/utils/misc.bs"
 
 sub init()
     buttons = m.top.findNode("buttons")
@@ -132,4 +132,4 @@
     end if
 end function
 
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/components_tvshows_TVShowDetails.bs.html b/docs/api/components_tvshows_TVShowDetails.bs.html index 64dc717df..787afe4c4 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 @@
 
     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 83d0daf02..1be0385ac 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 @@
     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 60313b65f..452a2ef34 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()
@@ -519,12 +519,14 @@
     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 and m.global.session.user.configuration.EnableNextEpisodeAutoPlay
-        m.nextEpisodeButton.visible = true
-        m.showNextEpisodeButtonAnimation.control = "start"
-        m.nextEpisodeButton.setFocus(true)
-    end if
+    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
+
+    m.nextEpisodeButton.visible = true
+    m.showNextEpisodeButtonAnimation.control = "start"
+    m.nextEpisodeButton.setFocus(true)
 end sub
 
 '
@@ -576,9 +578,12 @@
 
 ' When Video Player state changes
 sub onPositionChanged()
-
     ' Pass video position data into OSD
-    m.osd.progressPercentage = m.top.position / m.top.duration
+    if m.top.duration = 0
+        m.osd.progressPercentage = 0
+    else
+        m.osd.progressPercentage = m.top.position / m.top.duration
+    end if
     m.osd.positionTime = m.top.position
     m.osd.remainingPositionTime = m.top.duration - m.top.position
 
@@ -664,7 +669,7 @@
         "PositionTicks": int(m.top.position) * 10000000&, 'Ensure a LongInteger is used
         "IsPaused": (m.top.state = "paused")
     }
-    if m.top.content.live
+    if isValid(m.top.content) and isValid(m.top.content.live) and m.top.content.live
         params.append({
             "MediaSourceId": m.top.transcodeParams.MediaSourceId,
             "LiveStreamId": m.top.transcodeParams.LiveStreamId
@@ -849,4 +854,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/data/search.json b/docs/api/data/search.json index 43e8998be..f2ec65cbb 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.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.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.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 b9e7daa8b..d7e974de7 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 1fecafafc..18b7617c5 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 66cdfa603..c54933d7d 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 c8d87f29e..8e405840c 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 93ab0bd83..e9ff7bc2a 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 28b5ea911..76a2da81b 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 10972b814..0351b8966 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 d75b8f12e..d8cf73009 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 14d645e5b..c09788315 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 de3cb5564..04f77eaed 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 83379aeb5..b51a80ed9 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 f0d9cbf76..0bf16b694 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 bcda30d49..c218730a0 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 f69ece512..519e96d92 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 30d47ad41..9e08788b3 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 3ba281ebc..069f35187 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 28a7577b5..a3e4b57a6 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 c681ead36..3e6435871 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 0cf8a5c51..adb8f5ddc 100644 --- a/docs/api/module-ExtrasItem.html +++ b/docs/api/module-ExtrasItem.html @@ -1,3 +1,3 @@ Module: ExtrasItem
On this page
jellyfin-roku Code Documentation
\ No newline at end of file +
On this page

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 49a22d12d..787fc87bf 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 b6b5b2222..37a67f4fe 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 5aeda83a0..be2e61903 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 d29b5f24e..df3b4f2fe 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 e70ce718b..b46755642 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 588ebe724..12d4e499d 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 464707194..16b64eb35 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 0067ea5ed..81429ee3e 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 713bcf806..33c91c5fc 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 d31644cc0..c5f96779d 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 6c8da2423..bd2f55356 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 d43606df3..01981b798 100644 --- a/docs/api/module-HomeItem.html +++ b/docs/api/module-HomeItem.html @@ -1,3 +1,3 @@ Module: HomeItem
On this page

Methods

(static) drawProgressBar(itemData) → {void}

Draws and animates item progress bar

Parameters:
NameTypeDescription
itemDatadynamic
Returns:
Type: 
void

(static) focusChanged() → {void}

Enable title scrolling based on item Focus

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) itemContentChanged() → {void}

Returns:
Type: 
void

(static) onPosterLoadStatusChanged() → {void}

Hide backdrop and icon when poster loaded

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

Methods

(static) drawProgressBar(itemData) → {void}

Draws and animates item progress bar

Parameters:
NameTypeDescription
itemDatadynamic
Returns:
Type: 
void

(static) focusChanged() → {void}

Enable title scrolling based on item Focus

Returns:
Type: 
void

(static) init() → {void}

Returns:
Type: 
void

(static) 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 26fd50840..000000000 --- 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 71cd183a9..f1b6aee0f 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 4daac9908..9836f6c71 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 cf4079be0..8489ecda2 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 96f8190bd..5a06b272d 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 d3577a00d..032751000 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 cc84419a4..2f79659e0 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 3584ea85e..fd14ee386 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 d019d5f9f..ab686b7fa 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 6072fc627..f7787ee3a 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 6a5fa7206..a296ccf98 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 cad24de6a..3999be4e2 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 a197addd2..404add5d8 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 30b793ac9..22e4c58ea 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 c52279cc3..44c4fe2a5 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 58876ea8b..18ebb1542 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 061aef133..b9c44743c 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 b992736e5..65ca340b7 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 001c49c39..bcf6e7839 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 ae5e2b643..4283d7d3a 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 e756ad327..3f91a273b 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 890424745..0fe82327a 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 4586af1b9..3dd802e56 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 8bad2870a..7939d25ff 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 20535c3c8..7ad43fe2f 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 a46f1ddf6..73b6451a0 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 0679cbc97..743033ac4 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 a39388855..fabbf269d 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 90293524c..84ccdafd5 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 7ff2856ea..2e37f712b 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 36de83aea..4bb9559a1 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 bc8bde2ea..477aedc33 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 ea3dcad3a..f84460026 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 fc14ed56c..0892ba44f 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 02125e257..06bbd1c0f 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 f9818865d..c0a6f9915 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 9b6df577b..cf8352544 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 7180b3e58..e6daacf78 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 1550de871..a152d0dec 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 9ee611b69..57ae02ae7 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 f63e735a8..47092af88 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 437b1e221..8d243d46c 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 42fe3f9d3..a418cdb98 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 1d92634f3..cb7e15e5a 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 1eb18b2d7..2bc7f3aee 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 f88b0d8fb..4e146bd6e 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 2a93df21e..130eb8832 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 0b839042c..e47200b1a 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 047131c9d..5e3d6d106 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 04500ab7c..085a48e19 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 cb2b44618..1ca7b3138 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 0c12812f5..30582e47f 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 e24298f49..1caba5172 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 d6cc0920b..81095ed6d 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 fcde92eac..f0d5395b1 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 e48663cfd..5615dba47 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 6d6a11a25..8734ca557 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 b305cb0f0..350ed533f 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 b8f68a1eb..fe3939572 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 03ce388ab..86745161f 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 698cde1be..46738f029 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 e0e424f99..d92190c33 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 87177847d..9d2c7bac9 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 b27e77d04..5badc1801 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 27bac9ce3..ac64778e9 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 8afd39a10..b362bf090 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 a3526a816..ee1d48636 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 3edfb8698..6c516b943 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 377be22eb..18d4f1ae7 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 8ea3b1ab8..a2c8417e0 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 6f675df23..850a52d36 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 47b0ed2ef..4c9a550ad 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 a81be0d4a..2e69e9e52 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 5b69b6c60..3a70d45c9 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 979fc92a3..c16803e72 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 8a8a09c9c..178375dec 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 3b4290d6d..41bb90dca 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 471b7587a..432de9739 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 b025a8475..eb11dcf20 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 aa16d3a51..5044b9ac3 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 faab67754..9ed6b619e 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 3361f7221..e7003b8a6 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 714fe8332..f86f8e6bb 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 c0a90cc3a..57816b38a 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 babbb2d9e..89788dc12 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 9f7fadfc1..373fe338b 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 ff4d13afb..949807a87 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 903716610..56a7ed992 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 f4356bd87..ba4847fe5 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 87e460522..e63ec2add 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 9bac97b0d..583d0f39b 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 aec692a1a..f09d4d8ce 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 7333f2ea6..680bb9825 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 16fe626c3..853a2d35e 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 13bb1e22e..18acc968b 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 fbbabcc89..b1af13c93 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 c5f49c2f3..b41663f4f 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 7148e6bd9..44a1e057d 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 c04156402..9802a4d9e 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 a2fd1bc7e..5a4e705a0 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 874e486bb..da9269772 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 f5752bd1a..7356d9101 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 089141078..d3e398d0e 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 361ccb2f9..a3293097d 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 95800352b..127196b6f 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 d59b3e0f7..f47d4cb96 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 06c12cdeb..2a14ec86c 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 d37948fee..8b63532f4 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 c45c7e1ae..1a6682b2c 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 6e357e798..000000000 --- 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 615fc3d18..cc247b745 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 b31208f9f..6eef41132 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) 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 9abd12820..38d7c1df0 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 646521d81..eaebbb659 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 7e3ed9295..88b426714 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 0a8eb692d..c8d40c209 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 550774f8f..bb19fd011 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 176252d99..3642cdb88 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 000000000..39f2ec138 --- /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/scripts/core.js b/docs/api/scripts/core.js index 238a88294..47ae5e7c8 100644 --- a/docs/api/scripts/core.js +++ b/docs/api/scripts/core.js @@ -634,7 +634,7 @@ function addHrefToSidebarTitle() { function highlightActiveLinkInSidebar() { const list = document.location.href.split('/'); - const targetURL = list[list.length - 1]; + const targetURL = decodeURI(list[list.length - 1]); let element = document.querySelector(`.sidebar a[href*='${targetURL}']`); if (!element) { diff --git a/docs/api/scripts/core.min.js b/docs/api/scripts/core.min.js index 76e237d8c..9d2b94163 100644 --- a/docs/api/scripts/core.min.js +++ b/docs/api/scripts/core.min.js @@ -20,4 +20,4 @@ var accordionLocalStorageKey="accordion-id",themeLocalStorageKey="theme",fontSiz - `}function initTooltip(){tippy(".theme-toggle",{content:"Toggle Theme",delay:500}),tippy(".search-button",{content:"Search",delay:500}),tippy(".font-size",{content:"Change font size",delay:500}),tippy(".codepen-button",{content:"Open code in CodePen",placement:"left"}),tippy(".copy-code",{content:"Copy this code",placement:"left"}),tippy(".font-size",{content:fontSizeTooltip(),trigger:"click",interactive:!0,allowHTML:!0,placement:"left"})}function fixTable(){for(const t of document.querySelectorAll("table")){if(t.classList.contains("hljs-ln"))return;var e=document.createElement("div");e.classList.add("table-div"),t.parentNode.insertBefore(e,t),e.appendChild(t)}}function hideMobileMenu(){var e=document.querySelector("#mobile-sidebar"),t=document.querySelector("#mobile-menu"),o=t.querySelector("use");e&&e.classList.remove("show"),t&&t.setAttribute("data-isopen","false"),o&&o.setAttribute("xlink:href","#menu-icon")}function showMobileMenu(){var e=document.querySelector("#mobile-sidebar"),t=document.querySelector("#mobile-menu"),o=t.querySelector("use");e&&e.classList.add("show"),t&&t.setAttribute("data-isopen","true"),o&&o.setAttribute("xlink:href","#close-icon")}function onMobileMenuClick(){("true"===document.querySelector("#mobile-menu").getAttribute("data-isopen")?hideMobileMenu:showMobileMenu)()}function initMobileMenu(){var e=document.querySelector("#mobile-menu");e&&e.addEventListener("click",onMobileMenuClick)}function addHrefToSidebarTitle(){document.querySelectorAll(".sidebar-title-anchor").forEach(function(e){e.setAttribute("href",baseURL)})}function highlightActiveLinkInSidebar(){var e=document.location.href.split("/");const t=e[e.length-1];let o=document.querySelector(`.sidebar a[href*='${t}']`);if(!o)try{o=document.querySelector(`.sidebar a[href*='${t.split("#")[0]}']`)}catch(e){return void console.error(e)}o&&(o.parentElement.classList.add("active"),o.scrollIntoView())}function onDomContentLoaded(){var e=document.querySelectorAll(".theme-toggle");initMobileMenu(),e&&e.forEach(function(e){e.addEventListener("click",toggleTheme)}),hljs.addPlugin({"after:highlightElement":function(e){e.el.parentNode.setAttribute("data-lang","code")}}),hljs.highlightAll(),hljs.initLineNumbersOnLoad({singleLine:!0}),initAccordion(),addAnchor(),processAllPre(),hideTocOnSourcePage(),setTimeout(function(){bringIdToViewOnMount(),isSourcePage()&&highlightAndBringLineIntoView()},1e3),initTooltip(),fixTable(),addHrefToSidebarTitle(),highlightActiveLinkInSidebar()}updateTheme(getTheme()),function(){var e=getFontSize(),t=localStorage.getItem(fontSizeLocalStorageKey);t?(t=Number.parseInt(t,10))!==e&&updateFontSize(t):updateFontSize(e)}(),window.addEventListener("DOMContentLoaded",onDomContentLoaded),window.addEventListener("hashchange",e=>{e=new URL(e.newURL);""!==e.hash&&bringIdToViewOnMount(e.hash)}),window.addEventListener("storage",e=>{"undefined"!==e.newValue&&(initTooltip(),e.key===themeLocalStorageKey&&localUpdateTheme(e.newValue),e.key===fontSizeLocalStorageKey&&localUpdateFontSize(e.newValue))}); \ No newline at end of file + `}function initTooltip(){tippy(".theme-toggle",{content:"Toggle Theme",delay:500}),tippy(".search-button",{content:"Search",delay:500}),tippy(".font-size",{content:"Change font size",delay:500}),tippy(".codepen-button",{content:"Open code in CodePen",placement:"left"}),tippy(".copy-code",{content:"Copy this code",placement:"left"}),tippy(".font-size",{content:fontSizeTooltip(),trigger:"click",interactive:!0,allowHTML:!0,placement:"left"})}function fixTable(){for(const t of document.querySelectorAll("table")){if(t.classList.contains("hljs-ln"))return;var e=document.createElement("div");e.classList.add("table-div"),t.parentNode.insertBefore(e,t),e.appendChild(t)}}function hideMobileMenu(){var e=document.querySelector("#mobile-sidebar"),t=document.querySelector("#mobile-menu"),o=t.querySelector("use");e&&e.classList.remove("show"),t&&t.setAttribute("data-isopen","false"),o&&o.setAttribute("xlink:href","#menu-icon")}function showMobileMenu(){var e=document.querySelector("#mobile-sidebar"),t=document.querySelector("#mobile-menu"),o=t.querySelector("use");e&&e.classList.add("show"),t&&t.setAttribute("data-isopen","true"),o&&o.setAttribute("xlink:href","#close-icon")}function onMobileMenuClick(){("true"===document.querySelector("#mobile-menu").getAttribute("data-isopen")?hideMobileMenu:showMobileMenu)()}function initMobileMenu(){var e=document.querySelector("#mobile-menu");e&&e.addEventListener("click",onMobileMenuClick)}function addHrefToSidebarTitle(){document.querySelectorAll(".sidebar-title-anchor").forEach(function(e){e.setAttribute("href",baseURL)})}function highlightActiveLinkInSidebar(){var e=document.location.href.split("/");const t=decodeURI(e[e.length-1]);let o=document.querySelector(`.sidebar a[href*='${t}']`);if(!o)try{o=document.querySelector(`.sidebar a[href*='${t.split("#")[0]}']`)}catch(e){return void console.error(e)}o&&(o.parentElement.classList.add("active"),o.scrollIntoView())}function onDomContentLoaded(){var e=document.querySelectorAll(".theme-toggle");initMobileMenu(),e&&e.forEach(function(e){e.addEventListener("click",toggleTheme)}),hljs.addPlugin({"after:highlightElement":function(e){e.el.parentNode.setAttribute("data-lang","code")}}),hljs.highlightAll(),hljs.initLineNumbersOnLoad({singleLine:!0}),initAccordion(),addAnchor(),processAllPre(),hideTocOnSourcePage(),setTimeout(function(){bringIdToViewOnMount(),isSourcePage()&&highlightAndBringLineIntoView()},1e3),initTooltip(),fixTable(),addHrefToSidebarTitle(),highlightActiveLinkInSidebar()}updateTheme(getTheme()),function(){var e=getFontSize(),t=localStorage.getItem(fontSizeLocalStorageKey);t?(t=Number.parseInt(t,10))!==e&&updateFontSize(t):updateFontSize(e)}(),window.addEventListener("DOMContentLoaded",onDomContentLoaded),window.addEventListener("hashchange",e=>{e=new URL(e.newURL);""!==e.hash&&bringIdToViewOnMount(e.hash)}),window.addEventListener("storage",e=>{"undefined"!==e.newValue&&(initTooltip(),e.key===themeLocalStorageKey&&localUpdateTheme(e.newValue),e.key===fontSizeLocalStorageKey&&localUpdateFontSize(e.newValue))}); \ No newline at end of file diff --git a/docs/api/source_Main.bs.html b/docs/api/source_Main.bs.html index ff895bf74..6f0cc7f90 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")
@@ -217,37 +217,45 @@
         else if isNodeEvent(msg, "refreshSeasonDetailsData")
             startLoadingSpinner()
 
-            currentEpisode = m.global.queueManager.callFunc("getCurrentItem")
             currentScene = m.global.sceneManager.callFunc("getActiveScene")
 
-            ' 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)
-                    exit for
+            if isValid(currentScene) and isValid(currentScene.objects) and isValid(currentScene.seasonData)
+                currentEpisode = m.global.queueManager.callFunc("getCurrentItem")
+
+                if isValid(currentScene.objects.Items) and isValid(currentEpisode) and isValid(currentEpisode.id)
+                    ' 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)
+                            exit for
+                        end if
+                    end for
                 end if
-            end for
 
-            seasonMetaData = ItemMetaData(currentScene.seasonData.id)
-            currentScene.seasonData = seasonMetaData.json
-            currentScene.episodeObjects = currentScene.objects
-            currentScene.callFunc("updateSeason")
+                seasonMetaData = ItemMetaData(currentScene.seasonData.id)
+                if isValid(seasonMetaData) then currentScene.seasonData = seasonMetaData.json
+                currentScene.episodeObjects = currentScene.objects
+                currentScene.callFunc("updateSeason")
+            end if
+
             stopLoadingSpinner()
         else if isNodeEvent(msg, "refreshMovieDetailsData")
             startLoadingSpinner()
 
             currentScene = m.global.sceneManager.callFunc("getActiveScene")
 
-            ' Refresh movie detail data
-            currentScene.itemContent.json = api.users.GetItem(m.global.session.user.id, currentScene.itemContent.id)
-            movieMetaData = ItemMetaData(currentScene.itemContent.id)
+            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)
 
-            ' Redraw movie poster
-            currentScene.newPosterImageURI = movieMetaData.posterURL
+                ' 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
 
             stopLoadingSpinner()
         else if isNodeEvent(msg, "selectedItem")
@@ -262,6 +270,9 @@
                         group = CreateMovieLibraryView(selectedItem)
                     else if selectedItem.collectionType = "music"
                         group = CreateMusicLibraryView(selectedItem)
+                    else if selectedItem.collectionType = "nextup"
+                        group = CreateItemGrid(selectedItem)
+                        group.optionsAvailable = false
                     else
                         group = CreateItemGrid(selectedItem)
                     end if
@@ -301,7 +312,12 @@
                 else if selectedItemType = "Series"
                     group = CreateSeriesDetailsGroup(selectedItem.json.id)
                 else if selectedItemType = "Season"
-                    group = CreateSeasonDetailsGroupByID(selectedItem.json.SeriesId, selectedItem.id)
+                    if isValid(selectedItem.json) and isValid(selectedItem.json.SeriesId) and isValid(selectedItem.id)
+                        group = CreateSeasonDetailsGroupByID(selectedItem.json.SeriesId, selectedItem.id)
+                    else
+                        stopLoadingSpinner()
+                        message_dialog(tr("Error loading Season"))
+                    end if
                 else if selectedItemType = "Movie"
                     ' open movie detail page
                     group = CreateMovieDetailsGroup(selectedItem)
@@ -448,9 +464,9 @@
             selectedIndex = msg.getData()
             screenContent = msg.getRoSGNode()
 
-            m.global.queueManager.callFunc("clear")
             m.global.queueManager.callFunc("resetShuffle")
-            m.global.queueManager.callFunc("push", screenContent.albumData.items[selectedIndex])
+            m.global.queueManager.callFunc("set", screenContent.albumData.items)
+            m.global.queueManager.callFunc("setPosition", selectedIndex)
             m.global.queueManager.callFunc("playQueue")
         else if isNodeEvent(msg, "playAllSelected")
             ' User has selected playlist of of audio they want us to play
@@ -804,7 +820,7 @@
                 selectedItem = m.global.queueManager.callFunc("getHold")
                 m.global.queueManager.callFunc("clearHold")
 
-                if isValid(selectedItem) and selectedItem.count() > 0 and isValid(selectedItem[0])
+                if isValidAndNotEmpty(selectedItem) and isValid(selectedItem[0])
                     if popupNode.returnData.indexselected = 0
                         'Resume video from resume point
                         startLoadingSpinner()
@@ -832,7 +848,13 @@
                         CreateSeriesDetailsGroup(selectedItem[0].json.SeriesId)
                     else if popupNode.returnData.indexselected = 3
                         ' User chose Go to season
-                        CreateSeasonDetailsGroupByID(selectedItem[0].json.SeriesId, selectedItem[0].json.seasonID)
+                        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)
+                        else
+                            stopLoadingSpinner()
+                            message_dialog(tr("Error loading Season"))
+                        end if
+
                     else if popupNode.returnData.indexselected = 4
                         ' User chose Go to episode
                         CreateMovieDetailsGroup(selectedItem[0])
@@ -846,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 14a6e39d7..94a4966c9 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:
 
@@ -44,9 +44,10 @@
         SendPerformanceBeacon("AppDialogInitiate") ' Roku Performance monitoring - Dialog Starting
 
         publicUsers = GetPublicUsers()
-        savedUsers = getSavedUsers()
+        numPubUsers = 0
+        if isValid(publicUsers) then numPubUsers = publicUsers.count()
 
-        numPubUsers = publicUsers.count()
+        savedUsers = getSavedUsers()
         numSavedUsers = savedUsers.count()
 
         if numPubUsers > 0 or numSavedUsers > 0
@@ -645,7 +646,7 @@
     ' Get season data early in the function so we can check number of seasons.
     seasonData = TVSeasons(seriesID)
     ' Divert to season details if user setting goStraightToEpisodeListing is enabled and only one season exists.
-    if m.global.session.user.settings["ui.tvshows.goStraightToEpisodeListing"] = true and seasonData.Items.Count() = 1
+    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)
     end if
@@ -938,4 +939,4 @@
     stopLoadingSpinner()
     m.global.sceneManager.callFunc("optionDialog", tr("Playback Options"), [], resumeData)
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_VideoPlayer.bs.html b/docs/api/source_VideoPlayer.bs.html index 462832782..aefeca7a1 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
@@ -437,11 +437,11 @@
 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)
@@ -598,4 +598,4 @@
         return Str(Fix(bitrate / 1000)) + " Kbps"
     end if
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_api_Image.bs.html b/docs/api/source_api_Image.bs.html index c78c9bcc5..2e281b2ba 100644 --- a/docs/api/source_api_Image.bs.html +++ b/docs/api/source_api_Image.bs.html @@ -1,6 +1,6 @@ Source: source/api/Image.bs
On this page

source_api_Image.bs

function ItemImages(id = "" as string, params = {} as object)
+    
On this page

source_api_Image.bs

function ItemImages(id = "" as string, params = {} as object)
     ' This seems to cause crazy core dumps
     ' if there is a conflict between on disk images, and library.db
     resp = APIRequest(Substitute("Items/{0}/Images", id))
@@ -71,4 +71,4 @@
     url = Substitute("Users/{0}/Images/Primary", id)
     return buildURL(url, params)
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_api_Items.bs.html b/docs/api/source_api_Items.bs.html index 8872a1d06..4c2525e5f 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 = {
@@ -55,6 +55,8 @@
             "limit": 100
         })
 
+        if data = invalid then return []
+
         results = []
         for each item in data.Items
             tmp = CreateObject("roSGNode", "SearchData")
@@ -97,7 +99,7 @@
         tmp.image = PosterImage(data.id, imgParams)
         tmp.json = data
         return tmp
-    else if LCase(data.type) = "recording"
+    else if data.type = "Recording"
         tmp = CreateObject("roSGNode", "RecordingData")
         tmp.image = PosterImage(data.id, imgParams)
         tmp.json = data
@@ -501,4 +503,4 @@
 
     return data
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_api_UserLibrary.bs.html b/docs/api/source_api_UserLibrary.bs.html index da3f8e4bc..c4bfb89c5 100644 --- a/docs/api/source_api_UserLibrary.bs.html +++ b/docs/api/source_api_UserLibrary.bs.html @@ -1,6 +1,6 @@ Source: source/api/UserLibrary.bs
On this page

source_api_UserLibrary.bs

function MarkItemFavorite(id as string)
+    
On this page

source_api_UserLibrary.bs

function MarkItemFavorite(id as string)
     url = Substitute("Users/{0}/FavoriteItems/{1}", m.global.session.user.id, id)
     resp = APIRequest(url)
     return postJson(resp)
@@ -27,4 +27,4 @@
     resp.setRequest("DELETE")
     return getJson(resp)
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_api_baserequest.bs.html b/docs/api/source_api_baserequest.bs.html index 4e19334a3..22e6e70ee 100644 --- a/docs/api/source_api_baserequest.bs.html +++ b/docs/api/source_api_baserequest.bs.html @@ -1,6 +1,6 @@ Source: source/api/baserequest.bs
On this page

source_api_baserequest.bs

' Functions for making requests to the API
+    
On this page

source_api_baserequest.bs

' Functions for making requests to the API
 function buildParams(params = {} as object) as string
     ' Take an object of parameters and construct the URL query
 
@@ -221,4 +221,4 @@
 
     return auth
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_api_userauth.bs.html b/docs/api/source_api_userauth.bs.html index 62ca2ad68..4a14e50fe 100644 --- a/docs/api/source_api_userauth.bs.html +++ b/docs/api/source_api_userauth.bs.html @@ -1,6 +1,6 @@ Source: source/api/userauth.bs
On this page

source_api_userauth.bs

' needed for SignOut() and ServerInfo()
+    
On this page

source_api_userauth.bs

' needed for SignOut() and ServerInfo()
 import "pkg:/source/utils/session.bs"
 import "pkg:/source/utils/misc.bs"
 
@@ -171,4 +171,4 @@
 
     return false
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_constants_HomeRowItemSizes.bs.html b/docs/api/source_constants_HomeRowItemSizes.bs.html deleted file mode 100644 index a832ca591..000000000 --- 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 35416fa2f..090cc1930 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 @@
         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 5c6754a4c..6384c5609 100644 --- a/docs/api/source_utils_Subtitles.bs.html +++ b/docs/api/source_utils_Subtitles.bs.html @@ -1,6 +1,6 @@ Source: source/utils/Subtitles.bs
On this page

source_utils_Subtitles.bs

' Roku translates the info provided in subtitleTracks into availableSubtitleTracks
+    
On this page

source_utils_Subtitles.bs

' Roku translates the info provided in subtitleTracks into availableSubtitleTracks
 ' Including ignoring tracks, if they are not understood, thus making indexing unpredictable.
 ' This function translates between our internel selected subtitle index
 ' and the corresponding index in availableSubtitleTracks.
@@ -732,4 +732,4 @@
         "zza": "Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki"
     }
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_conditional.bs.html b/docs/api/source_utils_conditional.bs.html index 36bd6b54d..224569e84 100644 --- a/docs/api/source_utils_conditional.bs.html +++ b/docs/api/source_utils_conditional.bs.html @@ -1,6 +1,6 @@ Source: source/utils/conditional.bs
On this page

source_utils_conditional.bs

' @fileoverview Conditional functions that depend on 'bs_const' values specified in the manifest file
+    
On this page

source_utils_conditional.bs

' @fileoverview Conditional functions that depend on 'bs_const' values specified in the manifest file
 
 ' Print out all of the registry contents to the debug log
 sub printRegistry()
@@ -16,4 +16,4 @@
         end for
     #end if
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_config.bs.html b/docs/api/source_utils_config.bs.html index 91512cd7e..285673433 100644 --- a/docs/api/source_utils_config.bs.html +++ b/docs/api/source_utils_config.bs.html @@ -1,6 +1,6 @@ Source: source/utils/config.bs
On this page

source_utils_config.bs

' needed for set_user_setting() and unset_user_setting()
+    
On this page

source_utils_config.bs

' needed for set_user_setting() and unset_user_setting()
 import "pkg:/source/utils/session.bs"
 
 ' Read config tree from json config file and return
@@ -136,4 +136,4 @@
 
     return savedServerUsers
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_deviceCapabilities.bs.html b/docs/api/source_utils_deviceCapabilities.bs.html index 523c1b406..d07f522ad 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 @@
         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 d1402437c..47888785d 100644 --- a/docs/api/source_utils_globals.bs.html +++ b/docs/api/source_utils_globals.bs.html @@ -1,6 +1,6 @@ Source: source/utils/globals.bs
On this page

source_utils_globals.bs

' Set global constants
+    
On this page

source_utils_globals.bs

' Set global constants
 sub setConstants()
     globals = m.screen.getGlobalNode()
 
@@ -132,4 +132,4 @@
         }
     })
 end sub
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/source_utils_misc.bs.html b/docs/api/source_utils_misc.bs.html index 5615e1181..3e9ccd608 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
@@ -586,4 +586,19 @@
 
     return userLabel
 end function
-
jellyfin-roku Code Documentation
\ No newline at end of file + +' convert value to boolean and return value +function toBoolean(value as dynamic) as dynamic + if value = invalid then return invalid + if Type(value) = "Boolean" then return value + if Type(value) <> "String" then return value + + if value = "true" + return true + else if value = "false" + return false + else + return value + end if +end function +
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 4d4a432cb..a2912c462 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.
@@ -168,7 +168,7 @@
             "SortOrder": "Descending",
             "ImageTypeLimit": 1,
             "UserId": m.global.session.user.id,
-            "EnableRewatching": false,
+            "EnableRewatching": m.global.session.user.settings["ui.details.enablerewatchingnextup"],
             "DisableFirstEpisode": false,
             "EnableTotalRecordCount": false
         })
@@ -721,4 +721,4 @@
     end sub
 
 end namespace
-
jellyfin-roku Code Documentation
\ No newline at end of file +
jellyfin-roku Code Documentation
\ No newline at end of file diff --git a/docs/api/styles/clean-jsdoc-theme-base.css b/docs/api/styles/clean-jsdoc-theme-base.css index efdc600df..070a022f2 100644 --- a/docs/api/styles/clean-jsdoc-theme-base.css +++ b/docs/api/styles/clean-jsdoc-theme-base.css @@ -123,8 +123,7 @@ p { } article ul { - list-style: none; - + list-style: disc; } article ul li, @@ -135,7 +134,7 @@ article ol li { article ol, article ul { - padding-left: 3rem; + padding-left: 2rem; } @@ -461,7 +460,7 @@ code { .sidebar-title { font-family: heading; font-size: 1.5rem; - margin: 0; + margin: 0 0 2rem; padding: 0 2rem; text-decoration: none; @@ -474,7 +473,6 @@ code { .sidebar-items-container { flex: 1; - margin-top: 5rem; overflow: auto; position: relative; diff --git a/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css b/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css index 76b8bd2fa..ced379500 100644 --- a/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css +++ b/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css @@ -1 +1 @@ -@font-face{font-display:swap;font-family:"heading";src:url(../fonts/WorkSans-Bold.ttf)format("truetype")}@font-face{font-display:swap;font-family:"body";src:url(../fonts/OpenSans-Regular.ttf)format("truetype")}@font-face{font-display:swap;font-family:"code";src:url(../fonts/Inconsolata-Regular.ttf)format("truetype")}:root{--outer-wrapper-max-width:65rem}*{box-sizing:border-box;margin:0;padding:0}html,body{line-height:1.75;min-height:100%;width:100%}body{font-family:"body";overflow-x:hidden;position:relative}b{font-family:heading}h1,h2,h3,h4,h5,h6{font-family:"heading";font-weight:400;line-height:1.75}h1{font-size:3.5rem;margin:0}h2{font-size:2.25rem;margin:2rem 0 0}h3{font-size:1.5rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:1rem}img{max-width:100%}a{text-decoration:none}a:hover{text-decoration:underline}a img{margin-right:.5rem}p{margin:1rem 0}article ul{list-style:none}article ul li,article ol li{padding:.5rem 0}article ol,article ul{padding-left:3rem}article ol p,article ul p{margin:0}.variation{display:none}.signature-attributes{font-style:italic;font-weight:lighter}.ancestors a{text-decoration:none}.important{font-weight:700}.signature{font-family:"code"}.name{font-family:"code";font-weight:700}blockquote{border-radius:1rem;font-size:.875rem;margin:.5rem 0;padding:.0625rem 1.25rem}.details{border-radius:1rem;margin:1rem 0}.details .details-item-container{display:flex;padding:1rem 2rem}dt{font-family:heading}.details dt{float:left;min-width:11rem}.details ul{display:inline-flex;list-style-type:none;margin:0}.details ul li{display:inline-flex;margin-right:.6125rem;padding:0;word-break:break-word}.details ul li p{margin:0}.details pre.prettyprint{margin:0}.details .object-value{padding-top:0}.description{margin-bottom:2rem}.method-member-container table{margin-top:1rem}.pre-div .hljs-ln{margin:0}.code-caption{font-size:.875rem}.prettyprint{font-size:.875rem;overflow:auto}pre.prettyprint{margin-top:3rem}.prettyprint.source{width:inherit}.prettyprint code{display:block;font-size:1rem;line-height:1.75;padding:0 0 1rem}.prettyprint .compact{padding:0}h4.name{margin-top:.5rem}.params,.props,table{border-collapse:separate;border-radius:.5rem;border-spacing:0 .5rem;font-size:.875rem;margin:0;width:100%}table td:first-child,.params td:first-child,table thead th:first-child,.params thead th:first-child,.props thead th:first-child{border-bottom-left-radius:1rem;border-top-left-radius:1rem}table td:last-child,.params td:last-child,table thead th:last-child,.params thead th:last-child,.props thead th:last-child{border-bottom-right-radius:1rem;border-top-right-radius:1rem}table th,.params th{position:sticky;top:0}.params .name,.props .name,.name code{font-family:"code";font-size:1rem}.params td,.params th,.props td,.props th,th,td{display:table-cell;margin:0;padding:1rem 2rem;text-align:left;vertical-align:top}.params thead tr,.props thead tr{font-weight:700}.params .params thead tr,.props .props thead tr{font-weight:700}.params td.description>p:first-child,.props td.description>p:first-child{margin-top:0;padding-top:0}.params td.description>p:last-child,.props td.description>p:last-child{margin-bottom:0;padding-bottom:0}dl.param-type{margin-bottom:1rem;padding-bottom:1rem}.param-type dt,.param-type dd{display:inline-block}.param-type dd{font-family:"code";font-size:1rem}code{border-radius:.3rem;font-family:"code";font-size:1rem;padding:.1rem .4rem}.mt-20{margin-top:1.5rem}.codepen-form{bottom:0;position:absolute;right:.6125rem}.body-wrapper{display:flex;flex-direction:column;height:100vh;position:relative}.sidebar-container{bottom:0;display:flex;left:0;padding:1rem;position:fixed;top:0;width:25rem;z-index:10}.sidebar{border-radius:1rem;display:flex;flex:1;flex-direction:column;overflow:hidden;padding:1.5rem 0}.sidebar-title{font-family:heading;font-size:1.5rem;margin:0;padding:0 2rem;text-decoration:none}.sidebar-title:hover{text-decoration:none}.sidebar-items-container{flex:1;margin-top:5rem;overflow:auto;position:relative}.sidebar-section-title{border-radius:1rem;font-family:heading;font-size:1.25rem;padding:.5rem 2rem}.with-arrow{align-items:center;cursor:pointer;display:flex}.with-arrow div{flex:1}.with-arrow svg{height:1rem;transition:transform .3s;width:1rem}.with-arrow[data-isopen=true] svg{transform:rotate(180deg)}.sidebar-section-children-container{border-radius:.5rem;overflow:hidden}.sidebar-section-children a{display:block;padding:.25rem 2rem;width:100%}.sidebar-section-children a{text-decoration:none}.with-arrow[data-isopen=false]+.sidebar-section-children-container{height:0;overflow:hidden}.with-arrow[data-isopen=true]+.sidebar-section-children-container{height:auto}.toc-container{bottom:0;position:fixed;right:4rem;top:0;width:16rem;z-index:10}.toc-content{display:flex;flex-direction:column;height:100%;padding-top:10rem}#eed4d2a0bfd64539bb9df78095dec881{flex:1;margin:2rem 0;overflow:auto}.toc-list{list-style:none;padding-left:1rem}.toc-link{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.toc-link.is-active-link{font-family:heading}.has-anchor{position:relative}.link-anchor{padding:0 .5rem}.has-anchor .link-anchor{left:0;position:absolute;text-decoration:none;top:0;transform:translateX(-100%);visibility:hidden}.has-anchor:hover .link-anchor{visibility:visible}.navbar-container{display:flex;height:7rem;justify-content:center;left:25rem;padding-top:1rem;position:fixed;right:25rem;top:0;z-index:10}.navbar{display:flex;flex:1;max-width:var(--outer-wrapper-max-width);padding:1rem 4rem 1rem 2rem}.navbar-left-items{display:flex;flex:1}.navbar-right-items{display:flex}.icon-button svg{height:1rem;width:1rem}.icon-button{background:0 0;border:0;border-radius:50%;cursor:pointer;display:inline-flex;padding:.5rem;position:relative;transition:background .3s}.navbar-right-item{align-items:center;display:flex;justify-content:center;margin:0 .25rem}.navbar-item{border-radius:.5rem;overflow:hidden}.navbar-item a{display:inline-block;padding:1rem 2rem;text-decoration:none;transition:.3s}.font-size-tooltip{align-items:center;display:flex;margin:0-.5rem}.font-size-tooltip .icon-button.disabled{pointer-events:none}.main-content{align-items:center;display:flex;flex:1;flex-direction:column;overflow:auto;padding:7rem 25rem 0;position:relative}.main-wrapper{max-width:var(--outer-wrapper-max-width);padding:0 4rem 1rem;width:100%}.p-h-n{padding:.4rem 1rem}.footer{border-radius:1rem;display:flex;font-size:.875rem;justify-content:center;margin-top:5rem;width:100%}.source-page+.footer{margin-top:3rem}.footer .wrapper{flex:1;max-width:var(--outer-wrapper-max-width);padding:1rem 2rem}pre{position:relative}.hljs table td{background:0 0;border-radius:0;line-height:1.5;padding:0 .6125rem}.hljs .hljs-ln-numbers{padding-left:1.5rem;user-select:none;white-space:nowrap;width:2rem}.hljs-ln-line.hljs-ln-numbers::before{content:attr(data-line-number)}.pre-div{border-radius:1rem;margin:2rem 0;overflow:hidden;position:relative}.pre-top-bar-container{align-items:center;display:flex;justify-content:space-between;left:0;padding:.3125rem 1.5rem;position:absolute;right:0;top:0}.code-copy-icon-container{align-items:center;border-radius:50%;cursor:pointer;display:flex;height:1.875rem;justify-content:center;transition:.3s;width:1.875rem}.code-copy-icon-container>div{margin-top:.25rem;position:relative}.sm-icon{height:1rem;width:1rem}.code-lang-name{font-family:"body";font-size:.75rem}.tooltip{border-radius:.3125rem;opacity:0;padding:.1875rem .5rem;position:absolute;right:2rem;top:.3125rem;transform:scale(0);transition:.3s}.show-tooltip{opacity:1;transform:scale(1)}.allow-overflow{overflow:auto}.bold{font-family:heading}.search-container{align-items:flex-start;bottom:0;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:50}.search-container .wrapper{border-radius:1rem;margin:3rem 25rem;max-width:60rem;padding:4rem 2rem 2rem;position:relative;width:100%}.search-close-button{position:absolute;right:1rem;top:1rem}.search-result-c-text{display:flex;justify-content:center;user-select:none}.search-result-c{max-height:40rem;min-height:20rem;overflow:auto;padding:2rem 0}.search-box-c{align-items:center;display:flex;position:relative;width:100%}.search-box-c svg{height:1.5rem;left:1.5rem;position:absolute;width:1.5rem}.search-input{border:0;border-radius:1rem;flex:1;font-family:body;font-size:1.25rem;padding:1rem 2rem 1rem 4rem;width:100%}.search-result-item{border-radius:1rem;display:block;margin:1rem 0;padding:1rem;text-decoration:none}.search-result-item:hover{text-decoration:none}.search-result-item:active{text-decoration:none}.search-result-item-title{font-family:heading;font-size:1.5rem;margin:0}.search-result-item-p{font-size:.875rem;margin:0}.mobile-menu-icon-container{bottom:1.5rem;display:none;position:fixed;right:2rem;z-index:30}.mobile-menu-icon-container .icon-button svg{height:2rem;width:2rem}.mobile-sidebar-container{bottom:0;display:none;left:0;padding:1rem;position:fixed;right:0;top:0;z-index:25}.mobile-sidebar-container.show{display:block}.mobile-sidebar-wrapper{border-radius:1rem;display:flex;flex-direction:column;height:100%;padding-top:2rem;width:100%}.mobile-nav-links{display:flex;flex-wrap:wrap;padding-top:2rem}.mobile-sidebar-items-c{flex:1;overflow:auto}.mobile-navbar-actions{display:flex;padding:1rem}.rel{position:relative}.icon-button.codepen-button svg{height:1.5rem;width:1.5rem}.table-div{overflow:auto;width:100%}.tag-default{overflow:auto}@media screen and (max-width:100em){.toc-container{display:none}.main-content{padding:7rem 0 0 25rem}.search-container .wrapper{margin-right:1rem}.navbar-container{right:1rem}}@media screen and (min-width:65em){.mobile-sidebar-container.show{display:none}}@media screen and (max-width:65em){h1{font-size:3rem}h2{font-size:2rem}h3{font-size:1.875}h4,h5,h6{font-size:1rem}.main-wrapper{padding:0 1rem 1rem}.search-result-c{max-height:25rem}.mobile-menu-icon-container{display:block}.sidebar-container{display:none}.search-container .wrapper{margin-left:1rem}.main-content{padding-left:0;padding-top:1rem}.navbar-container{display:none}.source-page+.footer,.footer{margin-top:2rem}.has-anchor:hover .link-anchor{visibility:hidden}}.child-tutorial-container{display:flex;flex-direction:row;flex-wrap:wrap}.child-tutorial{border:1px solid;border-radius:10px;display:block;margin:5px;padding:10px 16px}.child-tutorial:hover{text-decoration:none}::selection{background:#ffce76;color:#222}body{background-color:#1a1a1a;color:#fff}a,a:active{color:#0bf}hr{color:#222}h1,h2,h3,h4,h5,h6{color:#fff}.sidebar{background-color:#222;color:#999}.sidebar-title{color:#999}.sidebar-section-title{color:#999}.sidebar-section-title:hover{background:#252525}.with-arrow{fill:#999}.sidebar-section-children-container{background:#292929}.sidebar-section-children.active{background:#444}.sidebar-section-children a:hover{background:#2c2c2c}.sidebar-section-children a{color:#fff}.navbar-container{background:#1a1a1a}.icon-button svg,.navbar-item a{color:#999;fill:#999}.font-size-tooltip .icon-button svg{fill:#fff}.font-size-tooltip .icon-button.disabled{background:#999}.icon-button:hover{background:#333}.icon-button:active{background:#444}.navbar-item a:active{background-color:#222;color:#aaa}.navbar-item:hover{background:#202020}.footer{background:#222;color:#999}.footer a{color:#999}.toc-link{color:#777;font-size:.875rem;transition:color .3s}.toc-link.is-active-link{color:#fff}.has-anchor .link-anchor{color:#555}.has-anchor .link-anchor:hover{color:#888}tt,code,kbd,samp{background:#333}.signature-attributes{color:#aaa}.ancestors{color:#999}.ancestors a{color:#999!important}.important{color:#c51313}.type-signature{color:#00918e}.name,.name a{color:#f7f7f7}.details{background:#222;color:#fff}.prettyprint{background:#222}.member-item-container strong,.method-member-container strong{color:#fff}.pre-top-bar-container{background:#292929}.prettyprint.source,.prettyprint code{background-color:#222;color:#c9d1d9}.pre-div{background-color:#222}.hljs .hljs-ln-numbers{color:#777}.hljs .selected{background:#444}.hljs .selected .hljs-ln-numbers{color:#eee}table .name,.params .name,.props .name,.name code{color:#fff}table td,.params td{background-color:#292929}table thead th,.params thead th,.props thead th{background-color:#222;color:#fff}table .params thead tr,.params .params thead tr,.props .props thead tr{background-color:#222;color:#fff}.disabled{color:#aaa}.code-lang-name{color:#ff8a00}.tooltip{background:#ffce76;color:#222}.hljs-comment{color:#8b949e}.hljs-doctag,.hljs-keyword,.hljs-template-tag,.hljs-variable.language_{color:#ff7b72}.hljs-template-variable,.hljs-type{color:#30ac7c}.hljs-meta,.hljs-string,.hljs-regexp{color:#a5d6ff}.hljs-title.class_,.hljs-title{color:#ffa657}.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}blockquote{background:#222;color:#fff}.search-container{background:rgba(255,255,255,.1)}.icon-button.search-close-button svg{fill:#a00}.search-container .wrapper{background:#222}.search-result-c{color:#666}.search-box-c{fill:#333}.search-input{background:#333;color:#fff}.search-box-c svg{fill:#fff}.search-result-item{background:#333}.search-result-item:hover{background:#444}.search-result-item:active{background:#555}.search-result-item-title{color:#fff}.search-result-item-p{color:#aaa}.mobile-menu-icon-container .icon-button{background:#333}.mobile-sidebar-container{background:#1a1a1a}.mobile-sidebar-wrapper{background:#222}.child-tutorial{border-color:#555;color:#f3f3f3}.child-tutorial:hover{background:#222}.light ::selection{background:#ffce76;color:#1d1919}body.light{background-color:#fff;color:#111}.light a,.light a:active{color:#007bff}.light hr{color:#f7f7f7}.light h1,.light h2,.light h3,.light h4,.light h5,.light h6{color:#111}.light .sidebar{background-color:#f7f7f7;color:#222}.light .sidebar-title{color:#222}.light .sidebar-section-title{color:#222}.light .sidebar-section-title:hover,.light .sidebar-section-title.active{background:#eee}.light .with-arrow{fill:#111}.light .sidebar-section-children-container{background:#eee}.light .sidebar-section-children.active{background:#ccc}.light .sidebar-section-children a:hover{background:#e0e0e0}.light .sidebar-section-children a{color:#111}.light .navbar-container{background:#fff}.light .icon-button svg,.light .navbar-item a{color:#222;fill:#222}.light .tippy-box{background:#eee;color:#111}.light .tippy-arrow{color:#f1f1f1}.light .font-size-tooltip .icon-button svg{fill:#111}.light .font-size-tooltip .icon-button.disabled svg{fill:#999}.light .icon-button:hover{background:#ddd}.light .icon-button:active{background:#ccc}.light .navbar-item a:active{background-color:#eee;color:#333}.light .navbar-item:hover{background:#f7f7f7}.light .footer{background:#f7f7f7;color:#111}.light .footer a{color:#111}.light .toc-link{color:#999;font-size:.875rem;transition:color .3s}.light .toc-link.is-active-link{color:#111}.light .has-anchor .link-anchor{color:#ddd}.light .has-anchor .link-anchor:hover{color:#ccc}.light .signature-attributes{color:#aaa}.light .ancestors{color:#999}.light .ancestors a{color:#999!important}.light .important{color:#ee1313}.light .type-signature{color:#00918e}.light .name,.light .name a{color:#293a80}.light .details{background:#f9f9f9;color:#101010}.light .member-item-container strong,.light .method-member-container strong{color:#000}.light .prettyprint{background:#f7f7f7}.light .pre-div{background:#f7f7f7}.light .hljs .hljs-ln-numbers{color:#aaa}.light .hljs .selected{background:#ccc}.light table.hljs-ln td{background:0 0}.light .hljs .selected .hljs-ln-numbers{color:#444}.light .pre-top-bar-container{background-color:#eee}.light .prettyprint code{background-color:#f7f7f7}.light table .name,.light .params .name,.light .props .name,.light .name code{color:#4d4e53}.light table td,.light .params td{background:#f7f7f7}.light table thead th,.light .params thead th,.light .props thead th{background-color:#eee;color:#111}.light table .params thead tr,.light .params .params thead tr,.light .props .props thead tr{background-color:#eee;color:#111}.light .disabled{color:#454545}.light .code-lang-name{color:red}.light .tooltip{background:#ffce76;color:#000}.light .hljs-comment,.light .hljs-quote{color:#a0a1a7}.light .hljs-doctag,.light .hljs-keyword,.light .hljs-formula{color:#a626a4}.light .hljs-section,.light .hljs-name,.light .hljs-selector-tag,.light .hljs-deletion,.light .hljs-subst{color:#e45649}.light .hljs-literal{color:#0184bb}.light .hljs-string,.light .hljs-regexp,.light .hljs-addition,.light .hljs-attribute,.light .hljs-meta .hljs-string{color:#50a14f}.light .hljs-attr,.light .hljs-variable,.light .hljs-template-variable,.light .hljs-type,.light .hljs-selector-class,.light .hljs-selector-attr,.light .hljs-selector-pseudo,.light .hljs-number{color:#986801}.light .hljs-symbol,.light .hljs-bullet,.light .hljs-link,.light .hljs-meta,.light .hljs-selector-id,.light .hljs-title{color:#4078f2}.light .hljs-built_in,.light .hljs-title.class_,.light .hljs-class .hljs-title{color:#c18401}.light .hljs-emphasis{font-style:italic}.light .hljs-strong{font-weight:700}.light .hljs-link{text-decoration:underline}.light blockquote{background:#eee;color:#111}.light code{background:#ddd;color:#000}.light .search-container{background:rgba(0,0,0,.1)}.light .search-close-button svg{fill:red}.light .search-container .wrapper{background:#eee}.light .search-result-c{color:#aaa}.light .search-box-c svg{fill:#333}.light .search-input{background:#f7f7f7;color:#111}.light .search-result-item{background:#f7f7f7}.light .search-result-item:hover{background:#e9e9e9}.light .search-result-item:active{background:#f7f7f7}.light .search-result-item-title{color:#111}.light .search-result-item-p{color:#aaa}.light .mobile-menu-icon-container .icon-button{background:#e5e5e5}.light .mobile-sidebar-container{background:#fff}.light .mobile-sidebar-wrapper{background:#f7f7f7}.light .child-tutorial{border-color:#aaa;color:#222}.light .child-tutorial:hover{background:#ccc} \ No newline at end of file +@font-face{font-display:swap;font-family:"heading";src:url(../fonts/WorkSans-Bold.ttf)format("truetype")}@font-face{font-display:swap;font-family:"body";src:url(../fonts/OpenSans-Regular.ttf)format("truetype")}@font-face{font-display:swap;font-family:"code";src:url(../fonts/Inconsolata-Regular.ttf)format("truetype")}:root{--outer-wrapper-max-width:65rem}*{box-sizing:border-box;margin:0;padding:0}html,body{line-height:1.75;min-height:100%;width:100%}body{font-family:"body";overflow-x:hidden;position:relative}b{font-family:heading}h1,h2,h3,h4,h5,h6{font-family:"heading";font-weight:400;line-height:1.75}h1{font-size:3.5rem;margin:0}h2{font-size:2.25rem;margin:2rem 0 0}h3{font-size:1.5rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:1rem}img{max-width:100%}a{text-decoration:none}a:hover{text-decoration:underline}a img{margin-right:.5rem}p{margin:1rem 0}article ul{list-style:disc}article ul li,article ol li{padding:.5rem 0}article ol,article ul{padding-left:2rem}article ol p,article ul p{margin:0}.variation{display:none}.signature-attributes{font-style:italic;font-weight:lighter}.ancestors a{text-decoration:none}.important{font-weight:700}.signature{font-family:"code"}.name{font-family:"code";font-weight:700}blockquote{border-radius:1rem;font-size:.875rem;margin:.5rem 0;padding:.0625rem 1.25rem}.details{border-radius:1rem;margin:1rem 0}.details .details-item-container{display:flex;padding:1rem 2rem}dt{font-family:heading}.details dt{float:left;min-width:11rem}.details ul{display:inline-flex;list-style-type:none;margin:0}.details ul li{display:inline-flex;margin-right:.6125rem;padding:0;word-break:break-word}.details ul li p{margin:0}.details pre.prettyprint{margin:0}.details .object-value{padding-top:0}.description{margin-bottom:2rem}.method-member-container table{margin-top:1rem}.pre-div .hljs-ln{margin:0}.code-caption{font-size:.875rem}.prettyprint{font-size:.875rem;overflow:auto}pre.prettyprint{margin-top:3rem}.prettyprint.source{width:inherit}.prettyprint code{display:block;font-size:1rem;line-height:1.75;padding:0 0 1rem}.prettyprint .compact{padding:0}h4.name{margin-top:.5rem}.params,.props,table{border-collapse:separate;border-radius:.5rem;border-spacing:0 .5rem;font-size:.875rem;margin:0;width:100%}table td:first-child,.params td:first-child,table thead th:first-child,.params thead th:first-child,.props thead th:first-child{border-bottom-left-radius:1rem;border-top-left-radius:1rem}table td:last-child,.params td:last-child,table thead th:last-child,.params thead th:last-child,.props thead th:last-child{border-bottom-right-radius:1rem;border-top-right-radius:1rem}table th,.params th{position:sticky;top:0}.params .name,.props .name,.name code{font-family:"code";font-size:1rem}.params td,.params th,.props td,.props th,th,td{display:table-cell;margin:0;padding:1rem 2rem;text-align:left;vertical-align:top}.params thead tr,.props thead tr{font-weight:700}.params .params thead tr,.props .props thead tr{font-weight:700}.params td.description>p:first-child,.props td.description>p:first-child{margin-top:0;padding-top:0}.params td.description>p:last-child,.props td.description>p:last-child{margin-bottom:0;padding-bottom:0}dl.param-type{margin-bottom:1rem;padding-bottom:1rem}.param-type dt,.param-type dd{display:inline-block}.param-type dd{font-family:"code";font-size:1rem}code{border-radius:.3rem;font-family:"code";font-size:1rem;padding:.1rem .4rem}.mt-20{margin-top:1.5rem}.codepen-form{bottom:0;position:absolute;right:.6125rem}.body-wrapper{display:flex;flex-direction:column;height:100vh;position:relative}.sidebar-container{bottom:0;display:flex;left:0;padding:1rem;position:fixed;top:0;width:25rem;z-index:10}.sidebar{border-radius:1rem;display:flex;flex:1;flex-direction:column;overflow:hidden;padding:1.5rem 0}.sidebar-title{font-family:heading;font-size:1.5rem;margin:0 0 2rem;padding:0 2rem;text-decoration:none}.sidebar-title:hover{text-decoration:none}.sidebar-items-container{flex:1;overflow:auto;position:relative}.sidebar-section-title{border-radius:1rem;font-family:heading;font-size:1.25rem;padding:.5rem 2rem}.with-arrow{align-items:center;cursor:pointer;display:flex}.with-arrow div{flex:1}.with-arrow svg{height:1rem;transition:transform .3s;width:1rem}.with-arrow[data-isopen=true] svg{transform:rotate(180deg)}.sidebar-section-children-container{border-radius:.5rem;overflow:hidden}.sidebar-section-children a{display:block;padding:.25rem 2rem;width:100%}.sidebar-section-children a{text-decoration:none}.with-arrow[data-isopen=false]+.sidebar-section-children-container{height:0;overflow:hidden}.with-arrow[data-isopen=true]+.sidebar-section-children-container{height:auto}.toc-container{bottom:0;position:fixed;right:4rem;top:0;width:16rem;z-index:10}.toc-content{display:flex;flex-direction:column;height:100%;padding-top:10rem}#eed4d2a0bfd64539bb9df78095dec881{flex:1;margin:2rem 0;overflow:auto}.toc-list{list-style:none;padding-left:1rem}.toc-link{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.toc-link.is-active-link{font-family:heading}.has-anchor{position:relative}.link-anchor{padding:0 .5rem}.has-anchor .link-anchor{left:0;position:absolute;text-decoration:none;top:0;transform:translateX(-100%);visibility:hidden}.has-anchor:hover .link-anchor{visibility:visible}.navbar-container{display:flex;height:7rem;justify-content:center;left:25rem;padding-top:1rem;position:fixed;right:25rem;top:0;z-index:10}.navbar{display:flex;flex:1;max-width:var(--outer-wrapper-max-width);padding:1rem 4rem 1rem 2rem}.navbar-left-items{display:flex;flex:1}.navbar-right-items{display:flex}.icon-button svg{height:1rem;width:1rem}.icon-button{background:0 0;border:0;border-radius:50%;cursor:pointer;display:inline-flex;padding:.5rem;position:relative;transition:background .3s}.navbar-right-item{align-items:center;display:flex;justify-content:center;margin:0 .25rem}.navbar-item{border-radius:.5rem;overflow:hidden}.navbar-item a{display:inline-block;padding:1rem 2rem;text-decoration:none;transition:.3s}.font-size-tooltip{align-items:center;display:flex;margin:0-.5rem}.font-size-tooltip .icon-button.disabled{pointer-events:none}.main-content{align-items:center;display:flex;flex:1;flex-direction:column;overflow:auto;padding:7rem 25rem 0;position:relative}.main-wrapper{max-width:var(--outer-wrapper-max-width);padding:0 4rem 1rem;width:100%}.p-h-n{padding:.4rem 1rem}.footer{border-radius:1rem;display:flex;font-size:.875rem;justify-content:center;margin-top:5rem;width:100%}.source-page+.footer{margin-top:3rem}.footer .wrapper{flex:1;max-width:var(--outer-wrapper-max-width);padding:1rem 2rem}pre{position:relative}.hljs table td{background:0 0;border-radius:0;line-height:1.5;padding:0 .6125rem}.hljs .hljs-ln-numbers{padding-left:1.5rem;user-select:none;white-space:nowrap;width:2rem}.hljs-ln-line.hljs-ln-numbers::before{content:attr(data-line-number)}.pre-div{border-radius:1rem;margin:2rem 0;overflow:hidden;position:relative}.pre-top-bar-container{align-items:center;display:flex;justify-content:space-between;left:0;padding:.3125rem 1.5rem;position:absolute;right:0;top:0}.code-copy-icon-container{align-items:center;border-radius:50%;cursor:pointer;display:flex;height:1.875rem;justify-content:center;transition:.3s;width:1.875rem}.code-copy-icon-container>div{margin-top:.25rem;position:relative}.sm-icon{height:1rem;width:1rem}.code-lang-name{font-family:"body";font-size:.75rem}.tooltip{border-radius:.3125rem;opacity:0;padding:.1875rem .5rem;position:absolute;right:2rem;top:.3125rem;transform:scale(0);transition:.3s}.show-tooltip{opacity:1;transform:scale(1)}.allow-overflow{overflow:auto}.bold{font-family:heading}.search-container{align-items:flex-start;bottom:0;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:50}.search-container .wrapper{border-radius:1rem;margin:3rem 25rem;max-width:60rem;padding:4rem 2rem 2rem;position:relative;width:100%}.search-close-button{position:absolute;right:1rem;top:1rem}.search-result-c-text{display:flex;justify-content:center;user-select:none}.search-result-c{max-height:40rem;min-height:20rem;overflow:auto;padding:2rem 0}.search-box-c{align-items:center;display:flex;position:relative;width:100%}.search-box-c svg{height:1.5rem;left:1.5rem;position:absolute;width:1.5rem}.search-input{border:0;border-radius:1rem;flex:1;font-family:body;font-size:1.25rem;padding:1rem 2rem 1rem 4rem;width:100%}.search-result-item{border-radius:1rem;display:block;margin:1rem 0;padding:1rem;text-decoration:none}.search-result-item:hover{text-decoration:none}.search-result-item:active{text-decoration:none}.search-result-item-title{font-family:heading;font-size:1.5rem;margin:0}.search-result-item-p{font-size:.875rem;margin:0}.mobile-menu-icon-container{bottom:1.5rem;display:none;position:fixed;right:2rem;z-index:30}.mobile-menu-icon-container .icon-button svg{height:2rem;width:2rem}.mobile-sidebar-container{bottom:0;display:none;left:0;padding:1rem;position:fixed;right:0;top:0;z-index:25}.mobile-sidebar-container.show{display:block}.mobile-sidebar-wrapper{border-radius:1rem;display:flex;flex-direction:column;height:100%;padding-top:2rem;width:100%}.mobile-nav-links{display:flex;flex-wrap:wrap;padding-top:2rem}.mobile-sidebar-items-c{flex:1;overflow:auto}.mobile-navbar-actions{display:flex;padding:1rem}.rel{position:relative}.icon-button.codepen-button svg{height:1.5rem;width:1.5rem}.table-div{overflow:auto;width:100%}.tag-default{overflow:auto}@media screen and (max-width:100em){.toc-container{display:none}.main-content{padding:7rem 0 0 25rem}.search-container .wrapper{margin-right:1rem}.navbar-container{right:1rem}}@media screen and (min-width:65em){.mobile-sidebar-container.show{display:none}}@media screen and (max-width:65em){h1{font-size:3rem}h2{font-size:2rem}h3{font-size:1.875}h4,h5,h6{font-size:1rem}.main-wrapper{padding:0 1rem 1rem}.search-result-c{max-height:25rem}.mobile-menu-icon-container{display:block}.sidebar-container{display:none}.search-container .wrapper{margin-left:1rem}.main-content{padding-left:0;padding-top:1rem}.navbar-container{display:none}.source-page+.footer,.footer{margin-top:2rem}.has-anchor:hover .link-anchor{visibility:hidden}}.child-tutorial-container{display:flex;flex-direction:row;flex-wrap:wrap}.child-tutorial{border:1px solid;border-radius:10px;display:block;margin:5px;padding:10px 16px}.child-tutorial:hover{text-decoration:none}::selection{background:#ffce76;color:#222}body{background-color:#1a1a1a;color:#fff}a,a:active{color:#0bf}hr{color:#222}h1,h2,h3,h4,h5,h6{color:#fff}.sidebar{background-color:#222;color:#999}.sidebar-title{color:#999}.sidebar-section-title{color:#999}.sidebar-section-title:hover{background:#252525}.with-arrow{fill:#999}.sidebar-section-children-container{background:#292929}.sidebar-section-children.active{background:#444}.sidebar-section-children a:hover{background:#2c2c2c}.sidebar-section-children a{color:#fff}.navbar-container{background:#1a1a1a}.icon-button svg,.navbar-item a{color:#999;fill:#999}.font-size-tooltip .icon-button svg{fill:#fff}.font-size-tooltip .icon-button.disabled{background:#999}.icon-button:hover{background:#333}.icon-button:active{background:#444}.navbar-item a:active{background-color:#222;color:#aaa}.navbar-item:hover{background:#202020}.footer{background:#222;color:#999}.footer a{color:#999}.toc-link{color:#777;font-size:.875rem;transition:color .3s}.toc-link.is-active-link{color:#fff}.has-anchor .link-anchor{color:#555}.has-anchor .link-anchor:hover{color:#888}tt,code,kbd,samp{background:#333}.signature-attributes{color:#aaa}.ancestors{color:#999}.ancestors a{color:#999!important}.important{color:#c51313}.type-signature{color:#00918e}.name,.name a{color:#f7f7f7}.details{background:#222;color:#fff}.prettyprint{background:#222}.member-item-container strong,.method-member-container strong{color:#fff}.pre-top-bar-container{background:#292929}.prettyprint.source,.prettyprint code{background-color:#222;color:#c9d1d9}.pre-div{background-color:#222}.hljs .hljs-ln-numbers{color:#777}.hljs .selected{background:#444}.hljs .selected .hljs-ln-numbers{color:#eee}table .name,.params .name,.props .name,.name code{color:#fff}table td,.params td{background-color:#292929}table thead th,.params thead th,.props thead th{background-color:#222;color:#fff}table .params thead tr,.params .params thead tr,.props .props thead tr{background-color:#222;color:#fff}.disabled{color:#aaa}.code-lang-name{color:#ff8a00}.tooltip{background:#ffce76;color:#222}.hljs-comment{color:#8b949e}.hljs-doctag,.hljs-keyword,.hljs-template-tag,.hljs-variable.language_{color:#ff7b72}.hljs-template-variable,.hljs-type{color:#30ac7c}.hljs-meta,.hljs-string,.hljs-regexp{color:#a5d6ff}.hljs-title.class_,.hljs-title{color:#ffa657}.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}blockquote{background:#222;color:#fff}.search-container{background:rgba(255,255,255,.1)}.icon-button.search-close-button svg{fill:#a00}.search-container .wrapper{background:#222}.search-result-c{color:#666}.search-box-c{fill:#333}.search-input{background:#333;color:#fff}.search-box-c svg{fill:#fff}.search-result-item{background:#333}.search-result-item:hover{background:#444}.search-result-item:active{background:#555}.search-result-item-title{color:#fff}.search-result-item-p{color:#aaa}.mobile-menu-icon-container .icon-button{background:#333}.mobile-sidebar-container{background:#1a1a1a}.mobile-sidebar-wrapper{background:#222}.child-tutorial{border-color:#555;color:#f3f3f3}.child-tutorial:hover{background:#222}.light ::selection{background:#ffce76;color:#1d1919}body.light{background-color:#fff;color:#111}.light a,.light a:active{color:#007bff}.light hr{color:#f7f7f7}.light h1,.light h2,.light h3,.light h4,.light h5,.light h6{color:#111}.light .sidebar{background-color:#f7f7f7;color:#222}.light .sidebar-title{color:#222}.light .sidebar-section-title{color:#222}.light .sidebar-section-title:hover,.light .sidebar-section-title.active{background:#eee}.light .with-arrow{fill:#111}.light .sidebar-section-children-container{background:#eee}.light .sidebar-section-children.active{background:#ccc}.light .sidebar-section-children a:hover{background:#e0e0e0}.light .sidebar-section-children a{color:#111}.light .navbar-container{background:#fff}.light .icon-button svg,.light .navbar-item a{color:#222;fill:#222}.light .tippy-box{background:#eee;color:#111}.light .tippy-arrow{color:#f1f1f1}.light .font-size-tooltip .icon-button svg{fill:#111}.light .font-size-tooltip .icon-button.disabled svg{fill:#999}.light .icon-button:hover{background:#ddd}.light .icon-button:active{background:#ccc}.light .navbar-item a:active{background-color:#eee;color:#333}.light .navbar-item:hover{background:#f7f7f7}.light .footer{background:#f7f7f7;color:#111}.light .footer a{color:#111}.light .toc-link{color:#999;font-size:.875rem;transition:color .3s}.light .toc-link.is-active-link{color:#111}.light .has-anchor .link-anchor{color:#ddd}.light .has-anchor .link-anchor:hover{color:#ccc}.light .signature-attributes{color:#aaa}.light .ancestors{color:#999}.light .ancestors a{color:#999!important}.light .important{color:#ee1313}.light .type-signature{color:#00918e}.light .name,.light .name a{color:#293a80}.light .details{background:#f9f9f9;color:#101010}.light .member-item-container strong,.light .method-member-container strong{color:#000}.light .prettyprint{background:#f7f7f7}.light .pre-div{background:#f7f7f7}.light .hljs .hljs-ln-numbers{color:#aaa}.light .hljs .selected{background:#ccc}.light table.hljs-ln td{background:0 0}.light .hljs .selected .hljs-ln-numbers{color:#444}.light .pre-top-bar-container{background-color:#eee}.light .prettyprint code{background-color:#f7f7f7}.light table .name,.light .params .name,.light .props .name,.light .name code{color:#4d4e53}.light table td,.light .params td{background:#f7f7f7}.light table thead th,.light .params thead th,.light .props thead th{background-color:#eee;color:#111}.light table .params thead tr,.light .params .params thead tr,.light .props .props thead tr{background-color:#eee;color:#111}.light .disabled{color:#454545}.light .code-lang-name{color:red}.light .tooltip{background:#ffce76;color:#000}.light .hljs-comment,.light .hljs-quote{color:#a0a1a7}.light .hljs-doctag,.light .hljs-keyword,.light .hljs-formula{color:#a626a4}.light .hljs-section,.light .hljs-name,.light .hljs-selector-tag,.light .hljs-deletion,.light .hljs-subst{color:#e45649}.light .hljs-literal{color:#0184bb}.light .hljs-string,.light .hljs-regexp,.light .hljs-addition,.light .hljs-attribute,.light .hljs-meta .hljs-string{color:#50a14f}.light .hljs-attr,.light .hljs-variable,.light .hljs-template-variable,.light .hljs-type,.light .hljs-selector-class,.light .hljs-selector-attr,.light .hljs-selector-pseudo,.light .hljs-number{color:#986801}.light .hljs-symbol,.light .hljs-bullet,.light .hljs-link,.light .hljs-meta,.light .hljs-selector-id,.light .hljs-title{color:#4078f2}.light .hljs-built_in,.light .hljs-title.class_,.light .hljs-class .hljs-title{color:#c18401}.light .hljs-emphasis{font-style:italic}.light .hljs-strong{font-weight:700}.light .hljs-link{text-decoration:underline}.light blockquote{background:#eee;color:#111}.light code{background:#ddd;color:#000}.light .search-container{background:rgba(0,0,0,.1)}.light .search-close-button svg{fill:red}.light .search-container .wrapper{background:#eee}.light .search-result-c{color:#aaa}.light .search-box-c svg{fill:#333}.light .search-input{background:#f7f7f7;color:#111}.light .search-result-item{background:#f7f7f7}.light .search-result-item:hover{background:#e9e9e9}.light .search-result-item:active{background:#f7f7f7}.light .search-result-item-title{color:#111}.light .search-result-item-p{color:#aaa}.light .mobile-menu-icon-container .icon-button{background:#e5e5e5}.light .mobile-sidebar-container{background:#fff}.light .mobile-sidebar-wrapper{background:#f7f7f7}.light .child-tutorial{border-color:#aaa;color:#222}.light .child-tutorial:hover{background:#ccc} \ No newline at end of file diff --git a/docs/api/styles/clean-jsdoc-theme.min.css b/docs/api/styles/clean-jsdoc-theme.min.css index 5ce12f1ad..35a696a0f 100644 --- a/docs/api/styles/clean-jsdoc-theme.min.css +++ b/docs/api/styles/clean-jsdoc-theme.min.css @@ -1 +1 @@ -@font-face{font-display:swap;font-family:"heading";src:url(../fonts/WorkSans-Bold.ttf)format("truetype")}@font-face{font-display:swap;font-family:"body";src:url(../fonts/OpenSans-Regular.ttf)format("truetype")}@font-face{font-display:swap;font-family:"code";src:url(../fonts/Inconsolata-Regular.ttf)format("truetype")}:root{--outer-wrapper-max-width:65rem}*{box-sizing:border-box;margin:0;padding:0}html,body{line-height:1.75;min-height:100%;width:100%}body{font-family:"body";overflow-x:hidden;position:relative}b{font-family:heading}h1,h2,h3,h4,h5,h6{font-family:"heading";font-weight:400;line-height:1.75}h1{font-size:3.5rem;margin:0}h2{font-size:2.25rem;margin:2rem 0 0}h3{font-size:1.5rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:1rem}img{max-width:100%}a{text-decoration:none}a:hover{text-decoration:underline}a img{margin-right:.5rem}p{margin:1rem 0}article ul{list-style:none}article ul li,article ol li{padding:.5rem 0}article ol,article ul{padding-left:3rem}article ol p,article ul p{margin:0}.variation{display:none}.signature-attributes{font-style:italic;font-weight:lighter}.ancestors a{text-decoration:none}.important{font-weight:700}.signature{font-family:"code"}.name{font-family:"code";font-weight:700}blockquote{border-radius:1rem;font-size:.875rem;margin:.5rem 0;padding:.0625rem 1.25rem}.details{border-radius:1rem;margin:1rem 0}.details .details-item-container{display:flex;padding:1rem 2rem}dt{font-family:heading}.details dt{float:left;min-width:11rem}.details ul{display:inline-flex;list-style-type:none;margin:0}.details ul li{display:inline-flex;margin-right:.6125rem;padding:0;word-break:break-word}.details ul li p{margin:0}.details pre.prettyprint{margin:0}.details .object-value{padding-top:0}.description{margin-bottom:2rem}.method-member-container table{margin-top:1rem}.pre-div .hljs-ln{margin:0}.code-caption{font-size:.875rem}.prettyprint{font-size:.875rem;overflow:auto}pre.prettyprint{margin-top:3rem}.prettyprint.source{width:inherit}.prettyprint code{display:block;font-size:1rem;line-height:1.75;padding:0 0 1rem}.prettyprint .compact{padding:0}h4.name{margin-top:.5rem}.params,.props,table{border-collapse:separate;border-radius:.5rem;border-spacing:0 .5rem;font-size:.875rem;margin:0;width:100%}table td:first-child,.params td:first-child,table thead th:first-child,.params thead th:first-child,.props thead th:first-child{border-bottom-left-radius:1rem;border-top-left-radius:1rem}table td:last-child,.params td:last-child,table thead th:last-child,.params thead th:last-child,.props thead th:last-child{border-bottom-right-radius:1rem;border-top-right-radius:1rem}table th,.params th{position:sticky;top:0}.params .name,.props .name,.name code{font-family:"code";font-size:1rem}.params td,.params th,.props td,.props th,th,td{display:table-cell;margin:0;padding:1rem 2rem;text-align:left;vertical-align:top}.params thead tr,.props thead tr{font-weight:700}.params .params thead tr,.props .props thead tr{font-weight:700}.params td.description>p:first-child,.props td.description>p:first-child{margin-top:0;padding-top:0}.params td.description>p:last-child,.props td.description>p:last-child{margin-bottom:0;padding-bottom:0}dl.param-type{margin-bottom:1rem;padding-bottom:1rem}.param-type dt,.param-type dd{display:inline-block}.param-type dd{font-family:"code";font-size:1rem}code{border-radius:.3rem;font-family:"code";font-size:1rem;padding:.1rem .4rem}.mt-20{margin-top:1.5rem}.codepen-form{bottom:0;position:absolute;right:.6125rem}.body-wrapper{display:flex;flex-direction:column;height:100vh;position:relative}.sidebar-container{bottom:0;display:flex;left:0;padding:1rem;position:fixed;top:0;width:25rem;z-index:10}.sidebar{border-radius:1rem;display:flex;flex:1;flex-direction:column;overflow:hidden;padding:1.5rem 0}.sidebar-title{font-family:heading;font-size:1.5rem;margin:0;padding:0 2rem;text-decoration:none}.sidebar-title:hover{text-decoration:none}.sidebar-items-container{flex:1;margin-top:5rem;overflow:auto;position:relative}.sidebar-section-title{border-radius:1rem;font-family:heading;font-size:1.25rem;padding:.5rem 2rem}.with-arrow{align-items:center;cursor:pointer;display:flex}.with-arrow div{flex:1}.with-arrow svg{height:1rem;transition:transform .3s;width:1rem}.with-arrow[data-isopen=true] svg{transform:rotate(180deg)}.sidebar-section-children-container{border-radius:.5rem;overflow:hidden}.sidebar-section-children a{display:block;padding:.25rem 2rem;width:100%}.sidebar-section-children a{text-decoration:none}.with-arrow[data-isopen=false]+.sidebar-section-children-container{height:0;overflow:hidden}.with-arrow[data-isopen=true]+.sidebar-section-children-container{height:auto}.toc-container{bottom:0;position:fixed;right:4rem;top:0;width:16rem;z-index:10}.toc-content{display:flex;flex-direction:column;height:100%;padding-top:10rem}#eed4d2a0bfd64539bb9df78095dec881{flex:1;margin:2rem 0;overflow:auto}.toc-list{list-style:none;padding-left:1rem}.toc-link{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.toc-link.is-active-link{font-family:heading}.has-anchor{position:relative}.link-anchor{padding:0 .5rem}.has-anchor .link-anchor{left:0;position:absolute;text-decoration:none;top:0;transform:translateX(-100%);visibility:hidden}.has-anchor:hover .link-anchor{visibility:visible}.navbar-container{display:flex;height:7rem;justify-content:center;left:25rem;padding-top:1rem;position:fixed;right:25rem;top:0;z-index:10}.navbar{display:flex;flex:1;max-width:var(--outer-wrapper-max-width);padding:1rem 4rem 1rem 2rem}.navbar-left-items{display:flex;flex:1}.navbar-right-items{display:flex}.icon-button svg{height:1rem;width:1rem}.icon-button{background:0 0;border:0;border-radius:50%;cursor:pointer;display:inline-flex;padding:.5rem;position:relative;transition:background .3s}.navbar-right-item{align-items:center;display:flex;justify-content:center;margin:0 .25rem}.navbar-item{border-radius:.5rem;overflow:hidden}.navbar-item a{display:inline-block;padding:1rem 2rem;text-decoration:none;transition:.3s}.font-size-tooltip{align-items:center;display:flex;margin:0-.5rem}.font-size-tooltip .icon-button.disabled{pointer-events:none}.main-content{align-items:center;display:flex;flex:1;flex-direction:column;overflow:auto;padding:7rem 25rem 0;position:relative}.main-wrapper{max-width:var(--outer-wrapper-max-width);padding:0 4rem 1rem;width:100%}.p-h-n{padding:.4rem 1rem}.footer{border-radius:1rem;display:flex;font-size:.875rem;justify-content:center;margin-top:5rem;width:100%}.source-page+.footer{margin-top:3rem}.footer .wrapper{flex:1;max-width:var(--outer-wrapper-max-width);padding:1rem 2rem}pre{position:relative}.hljs table td{background:0 0;border-radius:0;line-height:1.5;padding:0 .6125rem}.hljs .hljs-ln-numbers{padding-left:1.5rem;user-select:none;white-space:nowrap;width:2rem}.hljs-ln-line.hljs-ln-numbers::before{content:attr(data-line-number)}.pre-div{border-radius:1rem;margin:2rem 0;overflow:hidden;position:relative}.pre-top-bar-container{align-items:center;display:flex;justify-content:space-between;left:0;padding:.3125rem 1.5rem;position:absolute;right:0;top:0}.code-copy-icon-container{align-items:center;border-radius:50%;cursor:pointer;display:flex;height:1.875rem;justify-content:center;transition:.3s;width:1.875rem}.code-copy-icon-container>div{margin-top:.25rem;position:relative}.sm-icon{height:1rem;width:1rem}.code-lang-name{font-family:"body";font-size:.75rem}.tooltip{border-radius:.3125rem;opacity:0;padding:.1875rem .5rem;position:absolute;right:2rem;top:.3125rem;transform:scale(0);transition:.3s}.show-tooltip{opacity:1;transform:scale(1)}.allow-overflow{overflow:auto}.bold{font-family:heading}.search-container{align-items:flex-start;bottom:0;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:50}.search-container .wrapper{border-radius:1rem;margin:3rem 25rem;max-width:60rem;padding:4rem 2rem 2rem;position:relative;width:100%}.search-close-button{position:absolute;right:1rem;top:1rem}.search-result-c-text{display:flex;justify-content:center;user-select:none}.search-result-c{max-height:40rem;min-height:20rem;overflow:auto;padding:2rem 0}.search-box-c{align-items:center;display:flex;position:relative;width:100%}.search-box-c svg{height:1.5rem;left:1.5rem;position:absolute;width:1.5rem}.search-input{border:0;border-radius:1rem;flex:1;font-family:body;font-size:1.25rem;padding:1rem 2rem 1rem 4rem;width:100%}.search-result-item{border-radius:1rem;display:block;margin:1rem 0;padding:1rem;text-decoration:none}.search-result-item:hover{text-decoration:none}.search-result-item:active{text-decoration:none}.search-result-item-title{font-family:heading;font-size:1.5rem;margin:0}.search-result-item-p{font-size:.875rem;margin:0}.mobile-menu-icon-container{bottom:1.5rem;display:none;position:fixed;right:2rem;z-index:30}.mobile-menu-icon-container .icon-button svg{height:2rem;width:2rem}.mobile-sidebar-container{bottom:0;display:none;left:0;padding:1rem;position:fixed;right:0;top:0;z-index:25}.mobile-sidebar-container.show{display:block}.mobile-sidebar-wrapper{border-radius:1rem;display:flex;flex-direction:column;height:100%;padding-top:2rem;width:100%}.mobile-nav-links{display:flex;flex-wrap:wrap;padding-top:2rem}.mobile-sidebar-items-c{flex:1;overflow:auto}.mobile-navbar-actions{display:flex;padding:1rem}.rel{position:relative}.icon-button.codepen-button svg{height:1.5rem;width:1.5rem}.table-div{overflow:auto;width:100%}.tag-default{overflow:auto}@media screen and (max-width:100em){.toc-container{display:none}.main-content{padding:7rem 0 0 25rem}.search-container .wrapper{margin-right:1rem}.navbar-container{right:1rem}}@media screen and (min-width:65em){.mobile-sidebar-container.show{display:none}}@media screen and (max-width:65em){h1{font-size:3rem}h2{font-size:2rem}h3{font-size:1.875}h4,h5,h6{font-size:1rem}.main-wrapper{padding:0 1rem 1rem}.search-result-c{max-height:25rem}.mobile-menu-icon-container{display:block}.sidebar-container{display:none}.search-container .wrapper{margin-left:1rem}.main-content{padding-left:0;padding-top:1rem}.navbar-container{display:none}.source-page+.footer,.footer{margin-top:2rem}.has-anchor:hover .link-anchor{visibility:hidden}}.child-tutorial-container{display:flex;flex-direction:row;flex-wrap:wrap}.child-tutorial{border:1px solid;border-radius:10px;display:block;margin:5px;padding:10px 16px}.child-tutorial:hover{text-decoration:none}::selection{background:#ffce76;color:#222}body{background-color:#1a1a1a;color:#fff}a,a:active{color:#0bf}hr{color:#222}h1,h2,h3,h4,h5,h6{color:#fff}.sidebar{background-color:#222;color:#999}.sidebar-title{color:#999}.sidebar-section-title{color:#999}.sidebar-section-title:hover{background:#252525}.with-arrow{fill:#999}.sidebar-section-children-container{background:#292929}.sidebar-section-children.active{background:#444}.sidebar-section-children a:hover{background:#2c2c2c}.sidebar-section-children a{color:#fff}.navbar-container{background:#1a1a1a}.icon-button svg,.navbar-item a{color:#999;fill:#999}.font-size-tooltip .icon-button svg{fill:#fff}.font-size-tooltip .icon-button.disabled{background:#999}.icon-button:hover{background:#333}.icon-button:active{background:#444}.navbar-item a:active{background-color:#222;color:#aaa}.navbar-item:hover{background:#202020}.footer{background:#222;color:#999}.footer a{color:#999}.toc-link{color:#777;font-size:.875rem;transition:color .3s}.toc-link.is-active-link{color:#fff}.has-anchor .link-anchor{color:#555}.has-anchor .link-anchor:hover{color:#888}tt,code,kbd,samp{background:#333}.signature-attributes{color:#aaa}.ancestors{color:#999}.ancestors a{color:#999!important}.important{color:#c51313}.type-signature{color:#00918e}.name,.name a{color:#f7f7f7}.details{background:#222;color:#fff}.prettyprint{background:#222}.member-item-container strong,.method-member-container strong{color:#fff}.pre-top-bar-container{background:#292929}.prettyprint.source,.prettyprint code{background-color:#222;color:#c9d1d9}.pre-div{background-color:#222}.hljs .hljs-ln-numbers{color:#777}.hljs .selected{background:#444}.hljs .selected .hljs-ln-numbers{color:#eee}table .name,.params .name,.props .name,.name code{color:#fff}table td,.params td{background-color:#292929}table thead th,.params thead th,.props thead th{background-color:#222;color:#fff}table .params thead tr,.params .params thead tr,.props .props thead tr{background-color:#222;color:#fff}.disabled{color:#aaa}.code-lang-name{color:#ff8a00}.tooltip{background:#ffce76;color:#222}.hljs-comment{color:#8b949e}.hljs-doctag,.hljs-keyword,.hljs-template-tag,.hljs-variable.language_{color:#ff7b72}.hljs-template-variable,.hljs-type{color:#30ac7c}.hljs-meta,.hljs-string,.hljs-regexp{color:#a5d6ff}.hljs-title.class_,.hljs-title{color:#ffa657}.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}blockquote{background:#222;color:#fff}.search-container{background:rgba(255,255,255,.1)}.icon-button.search-close-button svg{fill:#a00}.search-container .wrapper{background:#222}.search-result-c{color:#666}.search-box-c{fill:#333}.search-input{background:#333;color:#fff}.search-box-c svg{fill:#fff}.search-result-item{background:#333}.search-result-item:hover{background:#444}.search-result-item:active{background:#555}.search-result-item-title{color:#fff}.search-result-item-p{color:#aaa}.mobile-menu-icon-container .icon-button{background:#333}.mobile-sidebar-container{background:#1a1a1a}.mobile-sidebar-wrapper{background:#222}.child-tutorial{border-color:#555;color:#f3f3f3}.child-tutorial:hover{background:#222}.light ::selection{background:#ffce76;color:#1d1919}body.light{background-color:#fff;color:#111}.light a,.light a:active{color:#007bff}.light hr{color:#f7f7f7}.light h1,.light h2,.light h3,.light h4,.light h5,.light h6{color:#111}.light .sidebar{background-color:#f7f7f7;color:#222}.light .sidebar-title{color:#222}.light .sidebar-section-title{color:#222}.light .sidebar-section-title:hover,.light .sidebar-section-title.active{background:#eee}.light .with-arrow{fill:#111}.light .sidebar-section-children-container{background:#eee}.light .sidebar-section-children.active{background:#ccc}.light .sidebar-section-children a:hover{background:#e0e0e0}.light .sidebar-section-children a{color:#111}.light .navbar-container{background:#fff}.light .icon-button svg,.light .navbar-item a{color:#222;fill:#222}.light .tippy-box{background:#eee;color:#111}.light .tippy-arrow{color:#f1f1f1}.light .font-size-tooltip .icon-button svg{fill:#111}.light .font-size-tooltip .icon-button.disabled svg{fill:#999}.light .icon-button:hover{background:#ddd}.light .icon-button:active{background:#ccc}.light .navbar-item a:active{background-color:#eee;color:#333}.light .navbar-item:hover{background:#f7f7f7}.light .footer{background:#f7f7f7;color:#111}.light .footer a{color:#111}.light .toc-link{color:#999;font-size:.875rem;transition:color .3s}.light .toc-link.is-active-link{color:#111}.light .has-anchor .link-anchor{color:#ddd}.light .has-anchor .link-anchor:hover{color:#ccc}.light .signature-attributes{color:#aaa}.light .ancestors{color:#999}.light .ancestors a{color:#999!important}.light .important{color:#ee1313}.light .type-signature{color:#00918e}.light .name,.light .name a{color:#293a80}.light .details{background:#f9f9f9;color:#101010}.light .member-item-container strong,.light .method-member-container strong{color:#000}.light .prettyprint{background:#f7f7f7}.light .pre-div{background:#f7f7f7}.light .hljs .hljs-ln-numbers{color:#aaa}.light .hljs .selected{background:#ccc}.light table.hljs-ln td{background:0 0}.light .hljs .selected .hljs-ln-numbers{color:#444}.light .pre-top-bar-container{background-color:#eee}.light .prettyprint code{background-color:#f7f7f7}.light table .name,.light .params .name,.light .props .name,.light .name code{color:#4d4e53}.light table td,.light .params td{background:#f7f7f7}.light table thead th,.light .params thead th,.light .props thead th{background-color:#eee;color:#111}.light table .params thead tr,.light .params .params thead tr,.light .props .props thead tr{background-color:#eee;color:#111}.light .disabled{color:#454545}.light .code-lang-name{color:red}.light .tooltip{background:#ffce76;color:#000}.light .hljs-comment,.light .hljs-quote{color:#a0a1a7}.light .hljs-doctag,.light .hljs-keyword,.light .hljs-formula{color:#a626a4}.light .hljs-section,.light .hljs-name,.light .hljs-selector-tag,.light .hljs-deletion,.light .hljs-subst{color:#e45649}.light .hljs-literal{color:#0184bb}.light .hljs-string,.light .hljs-regexp,.light .hljs-addition,.light .hljs-attribute,.light .hljs-meta .hljs-string{color:#50a14f}.light .hljs-attr,.light .hljs-variable,.light .hljs-template-variable,.light .hljs-type,.light .hljs-selector-class,.light .hljs-selector-attr,.light .hljs-selector-pseudo,.light .hljs-number{color:#986801}.light .hljs-symbol,.light .hljs-bullet,.light .hljs-link,.light .hljs-meta,.light .hljs-selector-id,.light .hljs-title{color:#4078f2}.light .hljs-built_in,.light .hljs-title.class_,.light .hljs-class .hljs-title{color:#c18401}.light .hljs-emphasis{font-style:italic}.light .hljs-strong{font-weight:700}.light .hljs-link{text-decoration:underline}.light blockquote{background:#eee;color:#111}.light code{background:#ddd;color:#000}.light .search-container{background:rgba(0,0,0,.1)}.light .search-close-button svg{fill:red}.light .search-container .wrapper{background:#eee}.light .search-result-c{color:#aaa}.light .search-box-c svg{fill:#333}.light .search-input{background:#f7f7f7;color:#111}.light .search-result-item{background:#f7f7f7}.light .search-result-item:hover{background:#e9e9e9}.light .search-result-item:active{background:#f7f7f7}.light .search-result-item-title{color:#111}.light .search-result-item-p{color:#aaa}.light .mobile-menu-icon-container .icon-button{background:#e5e5e5}.light .mobile-sidebar-container{background:#fff}.light .mobile-sidebar-wrapper{background:#f7f7f7}.light .child-tutorial{border-color:#aaa;color:#222}.light .child-tutorial:hover{background:#ccc}::-webkit-scrollbar{height:.3125rem;width:.3125rem}::-webkit-scrollbar-thumb,::-webkit-scrollbar-track{border-radius:1rem}::-webkit-scrollbar-track{background:#333}::-webkit-scrollbar-thumb{background:#555;outline:.06125rem solid #555}.light ::-webkit-scrollbar-track{background:#ddd}.light ::-webkit-scrollbar-thumb{background:#aaa;outline:.06125rem solid #aaa} \ No newline at end of file +@font-face{font-display:swap;font-family:"heading";src:url(../fonts/WorkSans-Bold.ttf)format("truetype")}@font-face{font-display:swap;font-family:"body";src:url(../fonts/OpenSans-Regular.ttf)format("truetype")}@font-face{font-display:swap;font-family:"code";src:url(../fonts/Inconsolata-Regular.ttf)format("truetype")}:root{--outer-wrapper-max-width:65rem}*{box-sizing:border-box;margin:0;padding:0}html,body{line-height:1.75;min-height:100%;width:100%}body{font-family:"body";overflow-x:hidden;position:relative}b{font-family:heading}h1,h2,h3,h4,h5,h6{font-family:"heading";font-weight:400;line-height:1.75}h1{font-size:3.5rem;margin:0}h2{font-size:2.25rem;margin:2rem 0 0}h3{font-size:1.5rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:1rem}img{max-width:100%}a{text-decoration:none}a:hover{text-decoration:underline}a img{margin-right:.5rem}p{margin:1rem 0}article ul{list-style:disc}article ul li,article ol li{padding:.5rem 0}article ol,article ul{padding-left:2rem}article ol p,article ul p{margin:0}.variation{display:none}.signature-attributes{font-style:italic;font-weight:lighter}.ancestors a{text-decoration:none}.important{font-weight:700}.signature{font-family:"code"}.name{font-family:"code";font-weight:700}blockquote{border-radius:1rem;font-size:.875rem;margin:.5rem 0;padding:.0625rem 1.25rem}.details{border-radius:1rem;margin:1rem 0}.details .details-item-container{display:flex;padding:1rem 2rem}dt{font-family:heading}.details dt{float:left;min-width:11rem}.details ul{display:inline-flex;list-style-type:none;margin:0}.details ul li{display:inline-flex;margin-right:.6125rem;padding:0;word-break:break-word}.details ul li p{margin:0}.details pre.prettyprint{margin:0}.details .object-value{padding-top:0}.description{margin-bottom:2rem}.method-member-container table{margin-top:1rem}.pre-div .hljs-ln{margin:0}.code-caption{font-size:.875rem}.prettyprint{font-size:.875rem;overflow:auto}pre.prettyprint{margin-top:3rem}.prettyprint.source{width:inherit}.prettyprint code{display:block;font-size:1rem;line-height:1.75;padding:0 0 1rem}.prettyprint .compact{padding:0}h4.name{margin-top:.5rem}.params,.props,table{border-collapse:separate;border-radius:.5rem;border-spacing:0 .5rem;font-size:.875rem;margin:0;width:100%}table td:first-child,.params td:first-child,table thead th:first-child,.params thead th:first-child,.props thead th:first-child{border-bottom-left-radius:1rem;border-top-left-radius:1rem}table td:last-child,.params td:last-child,table thead th:last-child,.params thead th:last-child,.props thead th:last-child{border-bottom-right-radius:1rem;border-top-right-radius:1rem}table th,.params th{position:sticky;top:0}.params .name,.props .name,.name code{font-family:"code";font-size:1rem}.params td,.params th,.props td,.props th,th,td{display:table-cell;margin:0;padding:1rem 2rem;text-align:left;vertical-align:top}.params thead tr,.props thead tr{font-weight:700}.params .params thead tr,.props .props thead tr{font-weight:700}.params td.description>p:first-child,.props td.description>p:first-child{margin-top:0;padding-top:0}.params td.description>p:last-child,.props td.description>p:last-child{margin-bottom:0;padding-bottom:0}dl.param-type{margin-bottom:1rem;padding-bottom:1rem}.param-type dt,.param-type dd{display:inline-block}.param-type dd{font-family:"code";font-size:1rem}code{border-radius:.3rem;font-family:"code";font-size:1rem;padding:.1rem .4rem}.mt-20{margin-top:1.5rem}.codepen-form{bottom:0;position:absolute;right:.6125rem}.body-wrapper{display:flex;flex-direction:column;height:100vh;position:relative}.sidebar-container{bottom:0;display:flex;left:0;padding:1rem;position:fixed;top:0;width:25rem;z-index:10}.sidebar{border-radius:1rem;display:flex;flex:1;flex-direction:column;overflow:hidden;padding:1.5rem 0}.sidebar-title{font-family:heading;font-size:1.5rem;margin:0 0 2rem;padding:0 2rem;text-decoration:none}.sidebar-title:hover{text-decoration:none}.sidebar-items-container{flex:1;overflow:auto;position:relative}.sidebar-section-title{border-radius:1rem;font-family:heading;font-size:1.25rem;padding:.5rem 2rem}.with-arrow{align-items:center;cursor:pointer;display:flex}.with-arrow div{flex:1}.with-arrow svg{height:1rem;transition:transform .3s;width:1rem}.with-arrow[data-isopen=true] svg{transform:rotate(180deg)}.sidebar-section-children-container{border-radius:.5rem;overflow:hidden}.sidebar-section-children a{display:block;padding:.25rem 2rem;width:100%}.sidebar-section-children a{text-decoration:none}.with-arrow[data-isopen=false]+.sidebar-section-children-container{height:0;overflow:hidden}.with-arrow[data-isopen=true]+.sidebar-section-children-container{height:auto}.toc-container{bottom:0;position:fixed;right:4rem;top:0;width:16rem;z-index:10}.toc-content{display:flex;flex-direction:column;height:100%;padding-top:10rem}#eed4d2a0bfd64539bb9df78095dec881{flex:1;margin:2rem 0;overflow:auto}.toc-list{list-style:none;padding-left:1rem}.toc-link{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.toc-link.is-active-link{font-family:heading}.has-anchor{position:relative}.link-anchor{padding:0 .5rem}.has-anchor .link-anchor{left:0;position:absolute;text-decoration:none;top:0;transform:translateX(-100%);visibility:hidden}.has-anchor:hover .link-anchor{visibility:visible}.navbar-container{display:flex;height:7rem;justify-content:center;left:25rem;padding-top:1rem;position:fixed;right:25rem;top:0;z-index:10}.navbar{display:flex;flex:1;max-width:var(--outer-wrapper-max-width);padding:1rem 4rem 1rem 2rem}.navbar-left-items{display:flex;flex:1}.navbar-right-items{display:flex}.icon-button svg{height:1rem;width:1rem}.icon-button{background:0 0;border:0;border-radius:50%;cursor:pointer;display:inline-flex;padding:.5rem;position:relative;transition:background .3s}.navbar-right-item{align-items:center;display:flex;justify-content:center;margin:0 .25rem}.navbar-item{border-radius:.5rem;overflow:hidden}.navbar-item a{display:inline-block;padding:1rem 2rem;text-decoration:none;transition:.3s}.font-size-tooltip{align-items:center;display:flex;margin:0-.5rem}.font-size-tooltip .icon-button.disabled{pointer-events:none}.main-content{align-items:center;display:flex;flex:1;flex-direction:column;overflow:auto;padding:7rem 25rem 0;position:relative}.main-wrapper{max-width:var(--outer-wrapper-max-width);padding:0 4rem 1rem;width:100%}.p-h-n{padding:.4rem 1rem}.footer{border-radius:1rem;display:flex;font-size:.875rem;justify-content:center;margin-top:5rem;width:100%}.source-page+.footer{margin-top:3rem}.footer .wrapper{flex:1;max-width:var(--outer-wrapper-max-width);padding:1rem 2rem}pre{position:relative}.hljs table td{background:0 0;border-radius:0;line-height:1.5;padding:0 .6125rem}.hljs .hljs-ln-numbers{padding-left:1.5rem;user-select:none;white-space:nowrap;width:2rem}.hljs-ln-line.hljs-ln-numbers::before{content:attr(data-line-number)}.pre-div{border-radius:1rem;margin:2rem 0;overflow:hidden;position:relative}.pre-top-bar-container{align-items:center;display:flex;justify-content:space-between;left:0;padding:.3125rem 1.5rem;position:absolute;right:0;top:0}.code-copy-icon-container{align-items:center;border-radius:50%;cursor:pointer;display:flex;height:1.875rem;justify-content:center;transition:.3s;width:1.875rem}.code-copy-icon-container>div{margin-top:.25rem;position:relative}.sm-icon{height:1rem;width:1rem}.code-lang-name{font-family:"body";font-size:.75rem}.tooltip{border-radius:.3125rem;opacity:0;padding:.1875rem .5rem;position:absolute;right:2rem;top:.3125rem;transform:scale(0);transition:.3s}.show-tooltip{opacity:1;transform:scale(1)}.allow-overflow{overflow:auto}.bold{font-family:heading}.search-container{align-items:flex-start;bottom:0;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:50}.search-container .wrapper{border-radius:1rem;margin:3rem 25rem;max-width:60rem;padding:4rem 2rem 2rem;position:relative;width:100%}.search-close-button{position:absolute;right:1rem;top:1rem}.search-result-c-text{display:flex;justify-content:center;user-select:none}.search-result-c{max-height:40rem;min-height:20rem;overflow:auto;padding:2rem 0}.search-box-c{align-items:center;display:flex;position:relative;width:100%}.search-box-c svg{height:1.5rem;left:1.5rem;position:absolute;width:1.5rem}.search-input{border:0;border-radius:1rem;flex:1;font-family:body;font-size:1.25rem;padding:1rem 2rem 1rem 4rem;width:100%}.search-result-item{border-radius:1rem;display:block;margin:1rem 0;padding:1rem;text-decoration:none}.search-result-item:hover{text-decoration:none}.search-result-item:active{text-decoration:none}.search-result-item-title{font-family:heading;font-size:1.5rem;margin:0}.search-result-item-p{font-size:.875rem;margin:0}.mobile-menu-icon-container{bottom:1.5rem;display:none;position:fixed;right:2rem;z-index:30}.mobile-menu-icon-container .icon-button svg{height:2rem;width:2rem}.mobile-sidebar-container{bottom:0;display:none;left:0;padding:1rem;position:fixed;right:0;top:0;z-index:25}.mobile-sidebar-container.show{display:block}.mobile-sidebar-wrapper{border-radius:1rem;display:flex;flex-direction:column;height:100%;padding-top:2rem;width:100%}.mobile-nav-links{display:flex;flex-wrap:wrap;padding-top:2rem}.mobile-sidebar-items-c{flex:1;overflow:auto}.mobile-navbar-actions{display:flex;padding:1rem}.rel{position:relative}.icon-button.codepen-button svg{height:1.5rem;width:1.5rem}.table-div{overflow:auto;width:100%}.tag-default{overflow:auto}@media screen and (max-width:100em){.toc-container{display:none}.main-content{padding:7rem 0 0 25rem}.search-container .wrapper{margin-right:1rem}.navbar-container{right:1rem}}@media screen and (min-width:65em){.mobile-sidebar-container.show{display:none}}@media screen and (max-width:65em){h1{font-size:3rem}h2{font-size:2rem}h3{font-size:1.875}h4,h5,h6{font-size:1rem}.main-wrapper{padding:0 1rem 1rem}.search-result-c{max-height:25rem}.mobile-menu-icon-container{display:block}.sidebar-container{display:none}.search-container .wrapper{margin-left:1rem}.main-content{padding-left:0;padding-top:1rem}.navbar-container{display:none}.source-page+.footer,.footer{margin-top:2rem}.has-anchor:hover .link-anchor{visibility:hidden}}.child-tutorial-container{display:flex;flex-direction:row;flex-wrap:wrap}.child-tutorial{border:1px solid;border-radius:10px;display:block;margin:5px;padding:10px 16px}.child-tutorial:hover{text-decoration:none}::selection{background:#ffce76;color:#222}body{background-color:#1a1a1a;color:#fff}a,a:active{color:#0bf}hr{color:#222}h1,h2,h3,h4,h5,h6{color:#fff}.sidebar{background-color:#222;color:#999}.sidebar-title{color:#999}.sidebar-section-title{color:#999}.sidebar-section-title:hover{background:#252525}.with-arrow{fill:#999}.sidebar-section-children-container{background:#292929}.sidebar-section-children.active{background:#444}.sidebar-section-children a:hover{background:#2c2c2c}.sidebar-section-children a{color:#fff}.navbar-container{background:#1a1a1a}.icon-button svg,.navbar-item a{color:#999;fill:#999}.font-size-tooltip .icon-button svg{fill:#fff}.font-size-tooltip .icon-button.disabled{background:#999}.icon-button:hover{background:#333}.icon-button:active{background:#444}.navbar-item a:active{background-color:#222;color:#aaa}.navbar-item:hover{background:#202020}.footer{background:#222;color:#999}.footer a{color:#999}.toc-link{color:#777;font-size:.875rem;transition:color .3s}.toc-link.is-active-link{color:#fff}.has-anchor .link-anchor{color:#555}.has-anchor .link-anchor:hover{color:#888}tt,code,kbd,samp{background:#333}.signature-attributes{color:#aaa}.ancestors{color:#999}.ancestors a{color:#999!important}.important{color:#c51313}.type-signature{color:#00918e}.name,.name a{color:#f7f7f7}.details{background:#222;color:#fff}.prettyprint{background:#222}.member-item-container strong,.method-member-container strong{color:#fff}.pre-top-bar-container{background:#292929}.prettyprint.source,.prettyprint code{background-color:#222;color:#c9d1d9}.pre-div{background-color:#222}.hljs .hljs-ln-numbers{color:#777}.hljs .selected{background:#444}.hljs .selected .hljs-ln-numbers{color:#eee}table .name,.params .name,.props .name,.name code{color:#fff}table td,.params td{background-color:#292929}table thead th,.params thead th,.props thead th{background-color:#222;color:#fff}table .params thead tr,.params .params thead tr,.props .props thead tr{background-color:#222;color:#fff}.disabled{color:#aaa}.code-lang-name{color:#ff8a00}.tooltip{background:#ffce76;color:#222}.hljs-comment{color:#8b949e}.hljs-doctag,.hljs-keyword,.hljs-template-tag,.hljs-variable.language_{color:#ff7b72}.hljs-template-variable,.hljs-type{color:#30ac7c}.hljs-meta,.hljs-string,.hljs-regexp{color:#a5d6ff}.hljs-title.class_,.hljs-title{color:#ffa657}.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}blockquote{background:#222;color:#fff}.search-container{background:rgba(255,255,255,.1)}.icon-button.search-close-button svg{fill:#a00}.search-container .wrapper{background:#222}.search-result-c{color:#666}.search-box-c{fill:#333}.search-input{background:#333;color:#fff}.search-box-c svg{fill:#fff}.search-result-item{background:#333}.search-result-item:hover{background:#444}.search-result-item:active{background:#555}.search-result-item-title{color:#fff}.search-result-item-p{color:#aaa}.mobile-menu-icon-container .icon-button{background:#333}.mobile-sidebar-container{background:#1a1a1a}.mobile-sidebar-wrapper{background:#222}.child-tutorial{border-color:#555;color:#f3f3f3}.child-tutorial:hover{background:#222}.light ::selection{background:#ffce76;color:#1d1919}body.light{background-color:#fff;color:#111}.light a,.light a:active{color:#007bff}.light hr{color:#f7f7f7}.light h1,.light h2,.light h3,.light h4,.light h5,.light h6{color:#111}.light .sidebar{background-color:#f7f7f7;color:#222}.light .sidebar-title{color:#222}.light .sidebar-section-title{color:#222}.light .sidebar-section-title:hover,.light .sidebar-section-title.active{background:#eee}.light .with-arrow{fill:#111}.light .sidebar-section-children-container{background:#eee}.light .sidebar-section-children.active{background:#ccc}.light .sidebar-section-children a:hover{background:#e0e0e0}.light .sidebar-section-children a{color:#111}.light .navbar-container{background:#fff}.light .icon-button svg,.light .navbar-item a{color:#222;fill:#222}.light .tippy-box{background:#eee;color:#111}.light .tippy-arrow{color:#f1f1f1}.light .font-size-tooltip .icon-button svg{fill:#111}.light .font-size-tooltip .icon-button.disabled svg{fill:#999}.light .icon-button:hover{background:#ddd}.light .icon-button:active{background:#ccc}.light .navbar-item a:active{background-color:#eee;color:#333}.light .navbar-item:hover{background:#f7f7f7}.light .footer{background:#f7f7f7;color:#111}.light .footer a{color:#111}.light .toc-link{color:#999;font-size:.875rem;transition:color .3s}.light .toc-link.is-active-link{color:#111}.light .has-anchor .link-anchor{color:#ddd}.light .has-anchor .link-anchor:hover{color:#ccc}.light .signature-attributes{color:#aaa}.light .ancestors{color:#999}.light .ancestors a{color:#999!important}.light .important{color:#ee1313}.light .type-signature{color:#00918e}.light .name,.light .name a{color:#293a80}.light .details{background:#f9f9f9;color:#101010}.light .member-item-container strong,.light .method-member-container strong{color:#000}.light .prettyprint{background:#f7f7f7}.light .pre-div{background:#f7f7f7}.light .hljs .hljs-ln-numbers{color:#aaa}.light .hljs .selected{background:#ccc}.light table.hljs-ln td{background:0 0}.light .hljs .selected .hljs-ln-numbers{color:#444}.light .pre-top-bar-container{background-color:#eee}.light .prettyprint code{background-color:#f7f7f7}.light table .name,.light .params .name,.light .props .name,.light .name code{color:#4d4e53}.light table td,.light .params td{background:#f7f7f7}.light table thead th,.light .params thead th,.light .props thead th{background-color:#eee;color:#111}.light table .params thead tr,.light .params .params thead tr,.light .props .props thead tr{background-color:#eee;color:#111}.light .disabled{color:#454545}.light .code-lang-name{color:red}.light .tooltip{background:#ffce76;color:#000}.light .hljs-comment,.light .hljs-quote{color:#a0a1a7}.light .hljs-doctag,.light .hljs-keyword,.light .hljs-formula{color:#a626a4}.light .hljs-section,.light .hljs-name,.light .hljs-selector-tag,.light .hljs-deletion,.light .hljs-subst{color:#e45649}.light .hljs-literal{color:#0184bb}.light .hljs-string,.light .hljs-regexp,.light .hljs-addition,.light .hljs-attribute,.light .hljs-meta .hljs-string{color:#50a14f}.light .hljs-attr,.light .hljs-variable,.light .hljs-template-variable,.light .hljs-type,.light .hljs-selector-class,.light .hljs-selector-attr,.light .hljs-selector-pseudo,.light .hljs-number{color:#986801}.light .hljs-symbol,.light .hljs-bullet,.light .hljs-link,.light .hljs-meta,.light .hljs-selector-id,.light .hljs-title{color:#4078f2}.light .hljs-built_in,.light .hljs-title.class_,.light .hljs-class .hljs-title{color:#c18401}.light .hljs-emphasis{font-style:italic}.light .hljs-strong{font-weight:700}.light .hljs-link{text-decoration:underline}.light blockquote{background:#eee;color:#111}.light code{background:#ddd;color:#000}.light .search-container{background:rgba(0,0,0,.1)}.light .search-close-button svg{fill:red}.light .search-container .wrapper{background:#eee}.light .search-result-c{color:#aaa}.light .search-box-c svg{fill:#333}.light .search-input{background:#f7f7f7;color:#111}.light .search-result-item{background:#f7f7f7}.light .search-result-item:hover{background:#e9e9e9}.light .search-result-item:active{background:#f7f7f7}.light .search-result-item-title{color:#111}.light .search-result-item-p{color:#aaa}.light .mobile-menu-icon-container .icon-button{background:#e5e5e5}.light .mobile-sidebar-container{background:#fff}.light .mobile-sidebar-wrapper{background:#f7f7f7}.light .child-tutorial{border-color:#aaa;color:#222}.light .child-tutorial:hover{background:#ccc}::-webkit-scrollbar{height:.3125rem;width:.3125rem}::-webkit-scrollbar-thumb,::-webkit-scrollbar-track{border-radius:1rem}::-webkit-scrollbar-track{background:#333}::-webkit-scrollbar-thumb{background:#555;outline:.06125rem solid #555}.light ::-webkit-scrollbar-track{background:#ddd}.light ::-webkit-scrollbar-thumb{background:#aaa;outline:.06125rem solid #aaa} \ No newline at end of file diff --git a/locale/cs/translations.ts b/locale/cs/translations.ts index 267c0b474..b12c20861 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 @@ -1280,6 +1280,50 @@ Zdrojový soubor je zcela kompatibilní s tímto klientem a relace přijímá soubor bez úprav. Direct play info box text in GetPlaybackInfoTask.brs + + Show already watched episodes in 'Next Up' sections. + Zobrazit již zhlédnuté díly v sekci 'Další díly'. + User Setting - Setting description + + + Rewatching Next Up + Sledujte znovu Další díly + User Setting - Setting title + + + Welcome to version + Vítejte ve verzi + WhatsNewDialog title - Welcome to version 2.0.0 + + + To view a complete list of changes visit + 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 + diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts index e894ee760..309154ed3 100644 --- a/locale/de_DE/translations.ts +++ b/locale/de_DE/translations.ts @@ -1288,6 +1288,56 @@ Die Quelldatei ist mit diesem Client vollständig kompatibel und die Sitzung empfängt die Datei ohne Änderungen. Direct play info box text in GetPlaybackInfoTask.brs + + Welcome to version + Willkommen bei der Version + WhatsNewDialog title - Welcome to version 2.0.0 + + + To view a complete list of changes visit + Eine vollständige Liste der Änderungen findest du unter + WhatsNewDialog body text preceding the changelog URL + + + Rewatching Next Up + Als nächstes noch einmal ansehen + User Setting - Setting title + + + Show already watched episodes in 'Next Up' sections. + Zeige bereits gesehene Episoden in der Rubrik 'Nächste Folge' an. + User Setting - Setting description + + + View All Next Up + 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 + diff --git a/locale/en_GB/translations.ts b/locale/en_GB/translations.ts index aac600fa1..00dcae40e 100644 --- a/locale/en_GB/translations.ts +++ b/locale/en_GB/translations.ts @@ -1264,6 +1264,56 @@ Ratings for how good a movie is User Setting - Setting description + + Rewatching Next Up + Rewatching Next Up + User Setting - Setting title + + + Welcome to version + Welcome to version + WhatsNewDialog title - Welcome to version 2.0.0 + + + To view a complete list of changes visit + To view a complete list of changes visit + WhatsNewDialog body text preceding the changelog URL + + + Show already watched episodes in 'Next Up' sections. + 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 + diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts index 3c429640b..410ea54e3 100644 --- a/locale/en_US/translations.ts +++ b/locale/en_US/translations.ts @@ -1271,5 +1271,55 @@ Ratings for how good a movie is User Setting - Setting description + + View All Next Up + View All Next Up + Title for viewing all episodes available in the Next Up section + + + Rewatching Next Up + Rewatching Next Up + User Setting - Setting title + + + Show already watched episodes in 'Next Up' sections. + 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 + + + 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 + - \ No newline at end of file + diff --git a/locale/es_419/translations.ts b/locale/es_419/translations.ts index 743b32a1c..ca8d9ead6 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 + diff --git a/locale/es_AR/translations.ts b/locale/es_AR/translations.ts index d22ce4df3..cec19fd39 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? + diff --git a/locale/es_ES/translations.ts b/locale/es_ES/translations.ts index b277be7cb..9c72ce11e 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 @@ -1131,6 +1131,273 @@ 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. + + + 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 + diff --git a/locale/fr/translations.ts b/locale/fr/translations.ts index 9fc192711..c843ba7c1 100644 --- a/locale/fr/translations.ts +++ b/locale/fr/translations.ts @@ -6,7 +6,7 @@ default 192.168.1.100:8096 or https://example.com/jellyfin - 192.168.1.100:8096 ou https://example.com/jellyfin + 192.168.1.100:8096 ou https://exemple.com/jellyfin Cancel @@ -50,7 +50,7 @@ Please sign in - Connectez-vous s'il vous plaît + S'il vous plaît connectez-vous Search @@ -58,7 +58,7 @@ Server not found, is it online? - Serveur non trouvé, est-il connecté à Internet ? + Le serveur est introuvable. Est-ce qu'il est connecté au réseau ? Shuffle @@ -595,7 +595,7 @@ Delete Saved - Supprimer les valeurs enregistrées + Effacer la sauvegarde Support Direct Play of MPEG-4 content. This may need to be disabled for playback of DIVX encoded video files. @@ -1207,7 +1207,7 @@ Remember Me? - Se souvenir de moi ? + Se souvenir de moi ? User Setting - Setting title @@ -1280,6 +1280,56 @@ Notes pour dire que le film est bon User Setting - Setting description + + Welcome to version + Bienvenue à la version + WhatsNewDialog title - Welcome to version 2.0.0 + + + To view a complete list of changes visit + Pour consulter la liste complète des modifications, visitez + WhatsNewDialog body text preceding the changelog URL + + + Show already watched episodes in 'Next Up' sections. + Voir les épisodes déjà vus dans la section "À suivre". + User Setting - Setting description + + + Rewatching Next Up + Revoir tout ce qui est à suivre + User Setting - Setting title + + + View All Next Up + Voir tout ce qui est à suivre + Title for viewing all episodes available in the Next Up section + + + Use Web Client Setting + Utiliser les paramètres du client web + User Setting - Setting option title + + + Use Episode Image + Utiliser l'image de l'épisode + User Setting - Setting option title + + + What type of images to use for Episodes shown in the 'Next Up' and 'Continue Watching' sections. + Quel type d'images utiliser pour les épisodes visibles dans les sections "À suivre" et "Continuer la lecture". + User Setting - Setting description + + + Use Show Image + Utiliser l'image de la série + User Setting - Setting option title + + + Episode Images Next Up + Images d'épisodes à suivre + User Setting - Setting title + diff --git a/locale/fr_CA/translations.ts b/locale/fr_CA/translations.ts index 2b071f028..687835616 100644 --- a/locale/fr_CA/translations.ts +++ b/locale/fr_CA/translations.ts @@ -542,6 +542,238 @@ MPEG-4 Name of codec used in settings menu + + Go to season + Afficher la page de la saison + Continue Watching Popup Menu - Navigate to the Season Page + + + Search now + Rechercher + Help text in search Box + + + Quick Connect + Connexion rapide + + + Special Features + Fonctionnalités supplémentaires + + + Movies (Presentation) + Films (Présentation) + Movie library view option + + + Set Favorite + Ajouter aux favoris + Button Text - When pressed, sets item as Favorite + + + (Dialog will close automatically) + (La boite de dialogue se fermera automatiquement) + + + Item Count + Nombre d'items + UI -> Media Grid -> Item Count in user setting screen. + + + Support Direct Play of MPEG-4 content. This may need to be disabled for playback of DIVX encoded video files. + Contenu MPEG-4 pris en charge en « Direct Play ». Cette fonctionnalité peut nécessiter d'être désactivée pour le visionnement des fichiers vidéo au format DIVX. + Settings Menu - Description for option + + + User Interface + Interface utilisateur + Title for User Interface section in user setting screen. + + + Use voice remote to search + Utiliser la voix pour effectuer une recherche à l'aide de la télécommande + Help text in search voice text box + + + You can search for Titles, People, Live TV Channels and more + Vous pouvez rechercher par titres, personnes, canaux de la télévision en direct et plus + Help text in search results + + + %1 of %2 + %1 de %2 + Item position and count. %1 = current item. %2 = total number of items + + + Studios + Studios + + + Shows + Séries + + + Show item count in the library and index of selected item. + Afficher le nombre d'items dans la médiathèque et l'index des items sélectionnés. + Description for option in Setting Screen + + + Set Watched + Marquer comme étant visionné + Button Text - When pressed, marks item as Warched + + + Go to series + Afficher les détails de la série + Continue Watching Popup Menu - Navigate to the Series Detail Page + + + Go to episode + Afficher les détails de l'épisode + Continue Watching Popup Menu - Navigate to the Episode Detail Page + + + Here is your Quick Connect code: + Voici votre code pour la connexion rapide : + + + Networks + Réseaux + + + Return to Top + Retourner au haut de la liste + UI -> Media Grid -> Item Title in user setting screen. + + + There was an error authenticating via Quick Connect. + Une erreur d'authentification s'est produite lors de la tentative de connexion rapide. + + + Enabled + Activé + + + Disabled + Désactivé + + + Bring the theater experience straight to your living room with the ability to play custom intros before the main feature. + Amenez l'expérience du cinéma directement dans votre salon avec la possibilité de jouer des intros personnalisées avant les fonctionnalités principales. + Settings Menu - Description for option + + + Use generated splashscreen image as Jellyfin's home background. Jellyfin will need to be closed and reopened for change to take effect. + Utiliser l'image d'écran d'attente généré comme le fond de l'écran principal de Jellyfin. Jellyfin devra être fermé et ré-ouvert pour que le changement soit appliqué. + Description for option in Setting Screen + + + Design Elements + Élément du design + + + Next episode + Épisode suivant + + + Blur images of unwatched episodes. + Flouter les images des épisodes non-regardés. + + + Go directly to the episode list if a TV series has only one season. + Aller directement à la liste des épisodes si la série télé n'a qu'une saison. + Settings Menu - Description for option + + + Hide all clocks in Jellyfin. Jellyfin will need to be closed and reopened for changes to take effect. + Cacher toues les horloges dans Jellyfin. Jellyfin devra être fermé et ré-ouvert pour que le changement soit appliqué. + Settings Menu - Description for option + + + Media Grid + Grille média + UI -> Media Grid section in user setting screen. + + + Hide Clock + Cacher l'horloge + Option Title in user setting screen + + + Options that alter the design of Jellyfin. + Options qui modifient le design de Jellyfin. + Description for Design Elements user settings. + + + Use Splashscreen as Home Background + Utiliser la fenêtre d'attente comme fond de l'écran principal + Option Title in user setting screen + + + Cinema Mode + Mode cinéma + Settings Menu - Title for option + + + Play Trailer + Jouer la bande annonce + + + HEVC + HEVC + Name of codec used in settings menu + + + Hide Taglines + Cacher les mots-clés + Option Title in user setting screen + + + Hides tagline text on details pages. + Masque le texte de l'accroche sur les pages de détails. + + + Options for TV Shows. + Options pour les séries télé. + Description for TV Shows user settings. + + + H.264 + H.264 + Name of codec used in settings menu + + + Attempt Direct Play for H.264 media with unsupported profile levels before falling back to transcoding if it fails. + Essayer Lecture directe pour les médias en H.264 avec des profils non supportés avant de se tourner vers la conversion si ça échoue. + Settings Menu - Description for option + + + Settings relating to playback and supported codec and media types. + Options relatifs à la lecture et codec / type de média supportés. + + + Settings relating to how the application looks. + Options relatives à l'apparence de l'application. + + + Media Grid options. + Options de la grille média. + + + 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). + Utilisez le bouton rejouer pour animer lentement le premier élément du dossier. (S'il est désactivé, le dossier revient immédiatement au premier élément). + Description for option in Setting Screen + + + Blur Unwatched Episodes + Flouter les épisodes non-regardés + Option Title in user setting screen + + + Skip Details for Single Seasons + Sauter les détails pour les saisons uniques + Settings Menu - Title for option + diff --git a/locale/hu/translations.ts b/locale/hu/translations.ts index ed7dded9c..b321ed28c 100644 --- a/locale/hu/translations.ts +++ b/locale/hu/translations.ts @@ -569,6 +569,25 @@ Ha nincs listázott szerver, akkor add meg a szerver URL-t manuálisan: Instructions on initial app launch when the user is asked to manually enter a server URL + + An error was encountered while playing this item. Server did not provide required transcoding data. + Hiba történt az elem lejátszása közben. A szerver nem biztosította a szükséges átkódolási adatokat. + Content of message box when trying to play an item which requires transcoding, and the server did not provide transcode url + + + Version + Verzió + + + Playback + Lejátszás + Title for Playback section in user setting screen. + + + Error Getting Playback Information + Hiba a lejátszási információk lekérésekor + Dialog Title: Received error from server when trying to get information about the selected item for playback + diff --git a/locale/it_IT/translations.ts b/locale/it_IT/translations.ts index deaa4e7aa..c7f3002b0 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 + diff --git a/locale/pt_BR/translations.ts b/locale/pt_BR/translations.ts index 5f2e1ca23..37c2d3dd2 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 + diff --git a/locale/ro/translations.ts b/locale/ro/translations.ts index 962af4447..77c37c848 100644 --- a/locale/ro/translations.ts +++ b/locale/ro/translations.ts @@ -26,7 +26,7 @@ Favorite - Favorite + Favorit Loading... @@ -215,6 +215,372 @@ 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 + + + 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. + + + 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 + diff --git a/package-lock.json b/package-lock.json index 63f2aa011..99083eb06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,22 +11,22 @@ "license": "GPL-2.0", "dependencies": { "@rokucommunity/bslib": "0.1.1", - "brighterscript-formatter": "1.7.3", + "brighterscript-formatter": "1.7.5", "log": "npm:roku-log@0.11.1" }, "devDependencies": { - "@rokucommunity/bslint": "0.8.21", - "brighterscript": "0.67.3", - "brighterscript-jsdocs-plugin": "0.6.0", + "@rokucommunity/bslint": "0.8.25", + "brighterscript": "0.67.7", + "brighterscript-jsdocs-plugin": "0.7.3", "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.0", + "roku-deploy": "3.12.1", "roku-log-bsc-plugin": "0.8.1", - "rooibos-roku": "5.12.0", - "ropm": "0.10.24", + "rooibos-roku": "5.13.0", + "ropm": "0.10.26", "spellchecker-cli": "6.2.0", "undent": "0.1.0" } @@ -315,9 +315,9 @@ "integrity": "sha512-2ox6EUL+UTtccTbD4dbVjZK3QHa0PHCqpoKMF8lZz9ayzzEP3iVPF8KZR6hOi6bxsIcbGXVjqmtCVkpC4P9SrA==" }, "node_modules/@rokucommunity/bslint": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/@rokucommunity/bslint/-/bslint-0.8.21.tgz", - "integrity": "sha512-gPLddRR/MKoyKoy4sNo/q7HgWrn9AquV9XC66+SwtiepMThjltNk59teJFfX5D0/jqrDnmY/XuXoOLXhvLp/Eg==", + "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": { @@ -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": "*" @@ -848,9 +849,9 @@ } }, "node_modules/brighterscript": { - "version": "0.67.3", - "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.67.3.tgz", - "integrity": "sha512-uuAIvDmIENA+HdeuRiC1KM+n250m0J9k0Cdiwpby4cBZiFAHRkYoynEqmL8kwAaPtxdXI5RcZU4JqInCd1avlA==", + "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", @@ -876,7 +877,7 @@ "parse-ms": "^2.1.0", "readline": "^1.3.0", "require-relative": "^0.8.7", - "roku-deploy": "^3.12.0", + "roku-deploy": "^3.12.1", "serialize-error": "^7.0.1", "source-map": "^0.7.4", "vscode-languageserver": "^9.0.1", @@ -892,12 +893,12 @@ } }, "node_modules/brighterscript-formatter": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/brighterscript-formatter/-/brighterscript-formatter-1.7.3.tgz", - "integrity": "sha512-UkxUcqlOvwdkFCel0lsHFmOk0qtb+bK9emIWtGLHW9s6/K8RA+yLEdcGKLqGwgrcnnuK2famP+V718yIvk1Sug==", + "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.2", + "brighterscript": "^0.67.7", "glob-all": "^3.3.0", "jsonc-parser": "^3.0.0", "source-map": "^0.7.3", @@ -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==", - "dev": true, - "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==", + "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": { - "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": { @@ -1201,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", @@ -3016,18 +2791,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/luxon": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz", @@ -3100,13 +2863,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" @@ -3116,17 +2880,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" @@ -3139,19 +2904,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", @@ -3172,6 +2942,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" }, @@ -3180,16 +2951,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" }, @@ -3198,10 +2971,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" }, @@ -3385,12 +3159,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", @@ -3858,11 +3626,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": { @@ -5184,9 +4953,10 @@ } }, "node_modules/roku-deploy": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.12.0.tgz", - "integrity": "sha512-YiCZeQ+sEmFW9ZfXtMNH+/CBSHQ5deNZYWONM+s6gCEQsrz7kCMFPj5YEdgfqW+d2b8G1ve9GELHcSt2FsfM8g==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.12.1.tgz", + "integrity": "sha512-PEOdiFKGW1jrcoC9zjb+9kOWC/Q3eH7dzPvSi5kKignjNcyDiyJi+/wINwNrzw9SsxAVtw+NLvYueyZi9wQVsw==", + "license": "MIT", "dependencies": { "chalk": "^2.4.2", "dateformat": "^3.0.3", @@ -5212,6 +4982,7 @@ "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", @@ -5272,10 +5043,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", @@ -5288,6 +5060,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" } @@ -5297,6 +5070,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" }, @@ -5309,6 +5083,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" @@ -5318,25 +5093,26 @@ "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.24", - "resolved": "https://registry.npmjs.org/ropm/-/ropm-0.10.24.tgz", - "integrity": "sha512-Jqa7jhOwHBx83RO81H3e4dY9cSrkf4TpYQ23r0+l4MKpZW29FXFqrAirG11nIPXR4jG/MsDXTCSOBfojCs2zBg==", + "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.1", + "brighterscript": "^0.67.7", "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.0", - "semver": "7.3.4", + "roku-deploy": "^3.12.1", + "semver": "^7.6.3", "yargs": "16.2.0" }, "bin": { @@ -5480,13 +5256,11 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5845,12 +5619,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", @@ -5941,12 +5709,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", @@ -6329,34 +6091,34 @@ "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, + "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": ">=8.0.0 || >=10.0.0" + "node": ">=14.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, + "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.16.0" + "vscode-languageserver-protocol": "3.17.5" }, "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, + "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": "6.0.0", - "vscode-languageserver-types": "3.16.0" + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" } }, "node_modules/vscode-languageserver-textdocument": { @@ -6365,16 +6127,16 @@ "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 + "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": "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 + "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", @@ -6488,12 +6250,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/yargs": { "version": "17.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", diff --git a/package.json b/package.json index 6ff6fed7b..f4c7abe4a 100644 --- a/package.json +++ b/package.json @@ -5,22 +5,22 @@ "description": "Roku app for Jellyfin media server", "dependencies": { "@rokucommunity/bslib": "0.1.1", - "brighterscript-formatter": "1.7.3", + "brighterscript-formatter": "1.7.5", "log": "npm:roku-log@0.11.1" }, "devDependencies": { - "@rokucommunity/bslint": "0.8.21", - "brighterscript": "0.67.3", - "brighterscript-jsdocs-plugin": "0.6.0", + "@rokucommunity/bslint": "0.8.25", + "brighterscript": "0.67.7", + "brighterscript-jsdocs-plugin": "0.7.3", "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.0", + "roku-deploy": "3.12.1", "roku-log-bsc-plugin": "0.8.1", - "rooibos-roku": "5.12.0", - "ropm": "0.10.24", + "rooibos-roku": "5.13.0", + "ropm": "0.10.26", "spellchecker-cli": "6.2.0", "undent": "0.1.0" }, diff --git a/settings/settings.json b/settings/settings.json index d5b67399d..6564175e7 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.", @@ -220,6 +241,27 @@ "title": "General", "description": "Settings relating to the appearance of the Home screen and the program in general.", "children": [ + { + "title": "Episode Images Next Up", + "description": "What type of images to use for Episodes shown in the 'Next Up' and 'Continue Watching' sections.", + "settingName": "ui.general.episodeimagesnextup", + "type": "radio", + "default": "webclient", + "options": [ + { + "title": "Use Web Client Setting", + "id": "webclient" + }, + { + "title": "Use Episode Image", + "id": "episode" + }, + { + "title": "Use Show Image", + "id": "show" + } + ] + }, { "title": "Hide Clock", "description": "Hide all clocks in Jellyfin. Jellyfin will need to be closed and reopened for changes to take effect.", @@ -234,6 +276,13 @@ "type": "integer", "default": "365" }, + { + "title": "Rewatching Next Up", + "description": "Show already watched episodes in 'Next Up' sections.", + "settingName": "ui.details.enablerewatchingnextup", + "type": "bool", + "default": "false" + }, { "title": "Show What's New Popup", "description": "Show What's New popup when Jellyfin is updated to a new version.", diff --git a/source/Main.bs b/source/Main.bs index 33c3ba856..57877874e 100644 --- a/source/Main.bs +++ b/source/Main.bs @@ -268,6 +268,9 @@ sub Main (args as dynamic) as void group = CreateMovieLibraryView(selectedItem) else if selectedItem.collectionType = "music" group = CreateMusicLibraryView(selectedItem) + else if selectedItem.collectionType = "nextup" + group = CreateItemGrid(selectedItem) + group.optionsAvailable = false else group = CreateItemGrid(selectedItem) end if @@ -459,9 +462,9 @@ sub Main (args as dynamic) as void selectedIndex = msg.getData() screenContent = msg.getRoSGNode() - m.global.queueManager.callFunc("clear") m.global.queueManager.callFunc("resetShuffle") - m.global.queueManager.callFunc("push", screenContent.albumData.items[selectedIndex]) + m.global.queueManager.callFunc("set", screenContent.albumData.items) + m.global.queueManager.callFunc("setPosition", selectedIndex) m.global.queueManager.callFunc("playQueue") else if isNodeEvent(msg, "playAllSelected") ' User has selected playlist of of audio they want us to play diff --git a/source/VideoPlayer.bs b/source/VideoPlayer.bs index 1c4f7e758..d034b78ef 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) diff --git a/source/utils/misc.bs b/source/utils/misc.bs index 8af32c61f..24c44f569 100644 --- a/source/utils/misc.bs +++ b/source/utils/misc.bs @@ -584,3 +584,18 @@ function createOverhangUser() return userLabel end function + +' convert value to boolean and return value +function toBoolean(value as dynamic) as dynamic + if value = invalid then return invalid + if Type(value) = "Boolean" then return value + if Type(value) <> "String" then return value + + if value = "true" + return true + else if value = "false" + return false + else + return value + end if +end function diff --git a/source/utils/quickplay.bs b/source/utils/quickplay.bs index cca3dfa96..3dcb149f1 100644 --- a/source/utils/quickplay.bs +++ b/source/utils/quickplay.bs @@ -166,7 +166,7 @@ namespace quickplay "SortOrder": "Descending", "ImageTypeLimit": 1, "UserId": m.global.session.user.id, - "EnableRewatching": false, + "EnableRewatching": m.global.session.user.settings["ui.details.enablerewatchingnextup"], "DisableFirstEpisode": false, "EnableTotalRecordCount": false }) diff --git a/source/utils/session.bs b/source/utils/session.bs index 497ff310b..20ff7a9b1 100644 --- a/source/utils/session.bs +++ b/source/utils/session.bs @@ -2,6 +2,7 @@ import "pkg:/source/api/userauth.bs" import "pkg:/source/api/baserequest.bs" import "pkg:/source/migrations.bs" +import "pkg:/source/utils/misc.bs" namespace session ' Initialize the global session array @@ -182,13 +183,6 @@ namespace session end if end for - if m.global.app.isDev - print "m.global.session.user = ", m.global.session.user - print "m.global.session.user.Configuration = ", m.global.session.user.Configuration - print "m.global.session.user.Policy = ", m.global.session.user.Policy - print "m.global.session.user.settings = ", m.global.session.user.settings - end if - set_user_setting("serverId", m.global.session.server.id) if saveCredentials @@ -204,6 +198,13 @@ namespace session session.user.SetServerDeviceName() ' Load user preferences from server session.user.LoadUserPreferences() + + if m.global.app.isDev + print "m.global.session.user = ", m.global.session.user + print "m.global.session.user.Configuration = ", m.global.session.user.Configuration + print "m.global.session.user.Policy = ", m.global.session.user.Policy + print "m.global.session.user.settings = ", m.global.session.user.settings + end if end sub ' Sets the global server device name value used by the API @@ -234,6 +235,14 @@ namespace session jsonResponse = getJson(resp) if isValid(jsonResponse) and isValid(jsonResponse.CustomPrefs) + ' save useEpisodeImagesInNextUpAndResume to global session + tmpSetting = jsonResponse.CustomPrefs.useEpisodeImagesInNextUpAndResume + if isValid(tmpSetting) + tmpConfig = m.global.session.user.Configuration + tmpConfig.AddReplace("useEpisodeImagesInNextUpAndResume", toBoolean(tmpSetting)) + session.user.Update("Configuration", tmpConfig) + end if + session.user.SaveUserHomeSections(jsonResponse.CustomPrefs) if isValid(jsonResponse.CustomPrefs["landing-livetv"]) @@ -414,16 +423,8 @@ namespace session sub Save(name as string, value as string) if name = invalid or value = invalid then return tmpSettingArray = m.global.session.user.settings - convertedValue = value - - ' convert to boolean - if value = "true" - convertedValue = true - else if value = "false" - convertedValue = false - end if - tmpSettingArray[name] = convertedValue + tmpSettingArray[name] = toBoolean(value) session.user.Update("settings", tmpSettingArray) end sub