Methods
(static) applyOverflow() → {void}
- Source
- Type:
- void
(static) calibrateLiveTvIfNeeded() → {void}
Anchor m.liveTvEpochAtPosition0 on first play tick. Idempotent.
- Source
- Type:
- void
(static) closeMoreMenuBeforeRowChanges() → {void}
Same contract ItemDetails runs; see the comment there. The reachable trigger on this surface is a live-TV program boundary: setButtonStates() re-derives the row from the refreshed program's metadata, and populateData() repaints the title, subtitle and logo in the same turn, so the menu closing reads as the OSD moving to the new program rather than as a dialog dismissing itself.
- Source
- Type:
- void
(static) createSubtitleDividerNode() → {object}
- Source
- Type:
- object
(static) createSubtitleLabelNode(labelId) → {object}
| Name | Type | Description |
|---|---|---|
labelId | string |
- Source
- Type:
- object
(static) dispatchOsdAction(buttonId) → {void}
Run the action for a button ID. Reached two ways (a press on a visible button, and a row picked out of the "More" menu), so the overflow menu adds no second copy of this mapping. VideoPlayerView.onOSDAction routes action from here.
| Name | Type | Description |
|---|---|---|
buttonId | string |
- Source
- Type:
- void
(static) displaySubtitleNode(node) → {void}
| Name | Type | Description |
|---|---|---|
node | object |
- Source
- Type:
- void
(static) getLiveTvBehindLiveSeconds() → {integer}
- Source
- Type:
- integer
(static) inactiveCheck() → {void}
1s timer: auto-hide on inactivity AND drive the behind-live countdown while paused
- Source
- Type:
- void
(static) init() → {void}
- Source
- Type:
- void
(static) isLiveTvItem() → {boolean}
- Source
- Type:
- boolean
(static) onButtonSelected() → {void}
- Source
- Type:
- void
(static) onDestroy() → {void}
onDestroy: Full teardown releasing all resources before component removal Called by VideoPlayerView.onDestroy() since OSD is a child component, not a SceneManager scene
- Source
- Type:
- void
(static) onFocusChanged() → {void}
- Source
- Type:
- void
(static) onItemDataChanged() → {void}
onItemDataChanged: Reads typed fields from JellyfinBaseItem node and populates OSD display.
Replaces the old JSON-parsing setFields(). The item node is immutable - all metadata is read directly from typed fields (item.type, item.name, item.communityRating, etc.)
Content Type Detection (isMovie/isSeries): These flags determine which user settings control ratings display:
- isMovie=true: Uses uiMoviesShowRatings setting
- isSeries=true: Uses uiTvShowsDisableCommunityRating setting
Detection Priority (applied in order):
- API flags: Uses isMovie/isSeries from JellyfinBaseItem if provided
- Flag validation: Ensures mutual exclusivity (both cannot be true)
- Type-based: Recording types always classified as series content
- Metadata heuristic: Presence of seriesName/parentIndexNumber indicates series
- Default fallback: Assumes movie content if no other indicators
- Source
- Type:
- void
(static) onKeyEvent(key, press) → {boolean}
| Name | Type | Description |
|---|---|---|
key | string | |
press | boolean |
- Source
- Type:
- boolean
(static) onLiveTvPauseIfNeeded() → {void}
Snapshot the current behindLive into accumulated and start the wall-clock pause counter. Wall-clock math takes over from here because Roku's m.top.position keeps advancing during pause for live HLS DVR streams (it tracks the live edge, not the user's playhead), which would silently zero out position-math.
- Source
- Type:
- void
(static) onLiveTvResumeIfNeeded() → {void}
Re-anchor epochAtPosition0 so play-math continues from the same offset where wall-clock math left off, then clear pause state.
- Source
- Type:
- void
(static) onMoreMenuResult() → {void}
- Source
- Type:
- void
(static) onPlaybackStateChanged() → {void}
- Source
- Type:
- void
(static) onPositionTimeChanged() → {void}
- Source
- Type:
- void
(static) onProgressPercentageChanged() → {void}
- Source
- Type:
- void
(static) onScreenShown() → {void}
- Source
- Type:
- void
(static) onVisibleChanged() → {void}
- Source
- Type:
- void
(static) openMoreMenu() → {void}
Open the overflow menu. Rows carry the label and glyph their buttons were wearing and resolve back to a button ID, so a selection runs through dispatchOsdAction rather than a second copy of the mapping.
- Source
- Type:
- void
(static) osdButtonCap() → {integer}
The cap for the left row: it may not reach the right group's leftmost edge.
- Source
- Type:
- integer
(static) osdRowGeometry() → {object}
The left row's geometry, in ONE place so the cap and the overflow menu's anchor cannot be derived from different numbers.
The right group is right-ALIGNED, so its origin is its right edge and it grows leftward. Its width is derived from its live child count so pinning a second button there correctly costs the left row a slot.
translation is taken as a SCREEN coordinate: the OSD is mounted at the origin of a full-screen view, which is the same assumption the right group's own 1830 origin already encodes.
- Source
- Type:
- object
(static) osdRowSpacing(group) → {integer}
| Name | Type | Description |
|---|---|---|
group | object |
- Source
- Type:
- integer
(static) populateData() → {void}
- Source
- Type:
- void
(static) resetFocusToDefaultButton() → {void}
- Source
- Type:
- void
(static) setButtonStates() → {void}
setButtonStates: Disable previous/next buttons if needed and remove any other unneeded buttons
- Source
- Type:
- void
(static) setEndsAtText() → {void}
setEndsAtText: "Ends at
The time goes through formatDisambiguatedTime(), the same rule ItemDetails' "Ends at" chip uses, so it picks up an am/pm suffix exactly when the bare <Clock /> beside it can't disambiguate (across noon/midnight, or beyond a 12-hour horizon). The suffix changes the label's width, which is safe here: endsAtGroup is a horiz LayoutGroup with horizAlignment="right", so its origin is the right edge of the last child and it grows leftward from the action-safe x=1824 rather than toward the screen edge.
- Source
- Type:
- void
(static) setGoToLiveEnabled(isEnabled) → {void}
The per-moment half: greys the button at the live edge, restores it once the user is behind. A no-op for non-live items, where the button is not a member at all.
| Name | Type | Description |
|---|---|---|
isEnabled | boolean |
- Source
- Type:
- void
(static) setVideoLogoGroup() → {void}
- Source
- Type:
- void
(static) setVideoSubTitle() → {void}
- Source
- Type:
- void
(static) setVideoTitle() → {void}
- Source
- Type:
- void
(static) unsplitButtons() → {void}
- Source
- Type:
- void
(static) updateLiveTvDisplay() → {void}
Called from onProgressPercentageChanged() (position updates) and inactiveCheck() (1s timer). The timer ensures behind-live derived state ticks while paused.
- Source
- Type:
- void