Members

(static, readonly) JellyfinLanguage

JellyfinLanguage: ISO 639-2 three-letter language codes used by Jellyfin Only includes languages supported by Roku OS locales

Properties
NameTypeDescription
ENGLISH
SPANISH
PORTUGUESE
FRENCH
GERMAN
ITALIAN

Methods

(static) findBestAudioStreamIndex(streams, playDefault, preferredLanguage, deviceCapabilitiesopt) → {integer}

findBestAudioStreamIndex: Primary function for selecting the best audio stream

Selection priority when playDefault = true (Jellyfin: "Play default audio track regardless of language"):

  1. Filter by IsDefault = true streams (ignore language preference)
  2. If multiple IsDefault streams, use language preference as tiebreaker
  3. If still multiple or no language match, apply hardware optimization
  4. If no IsDefault streams exist, fall back to language preference → hardware optimization

Selection priority when playDefault = false:

  1. Filter by language preference (completely ignore IsDefault flag)
  2. If multiple language matches, apply hardware optimization
  3. If no language matches, apply hardware optimization to all streams

Roku OS Language Fallback: When preferredLanguage is blank/empty, automatically uses the Roku device's OS language (from m.global.device.locale) as fallback for better out-of-box experience (see issue #179)

Hardware optimization:

  • Prefer streams matching device's max channel capability
  • Among matches, prefer direct-playable codecs
  • Fall back intelligently based on channel counts
Parameters:
NameTypeAttributesDefaultDescription
streamsdynamic

Array of media streams from Jellyfin metadata

playDefaultdynamic

Boolean, if true use IsDefault flag and only use language as tiebreaker

preferredLanguagedynamic

Three-letter language code (e.g., "eng", "jpn")

deviceCapabilitiesdynamic<optional>
invalid

Optional: Device audio capabilities (for testing). If invalid, will detect automatically.

Returns:
  • Jellyfin index of best audio stream, or 0 if not found
Type: 
integer

(static) findDirectPlayableStreamByChannelCount(audioStreams, targetChannels, deviceCapabilities) → {dynamic}

findDirectPlayableStreamByChannelCount: Finds a direct-playable stream with specific channel count

Parameters:
NameTypeDescription
audioStreamsobject

Array of audio streams

targetChannelsinteger

Desired channel count (2, 6, or 8)

deviceCapabilitiesobject

Device capability info

Returns:
  • Matching stream or invalid
Type: 
dynamic

(static) getDeviceAudioCapabilities() → {object}

getDeviceAudioCapabilities: Detects device audio codec and channel support

Strategy:

  • Use combined check (no PassThru) for 6-channel and below (safe, checks both)
  • ALWAYS verify 8-channel with PassThru: 1 (combined check can lie)
  • Roku max native decode is 6 channels (varies by model)
  • 8-channel requires HDMI passthrough to receiver/soundbar

maxChannels (integer: 2, 6, or 8) - Maximum supported audio channels supports8Channel (boolean) - True if HDMI passthrough supports 8-channel audio

Returns:
  • AssocArray with:
Type: 
object

(static) isStreamDirectPlayable(stream, deviceCapabilities) → {boolean}

isStreamDirectPlayable: Checks if an audio stream can be directly played by the device

For 8-channel: MUST use PassThru: 1 (only HDMI passthrough, Roku can't decode 8-channel) For 6-channel and below: Use combined check (no PassThru) - checks both Roku and HDMI

Parameters:
NameTypeDescription
streamobject

Audio stream object with codec and channels fields

deviceCapabilitiesobject

Device capability info

Returns:
  • True if stream can be direct played
Type: 
boolean

(static) mapRokuLocaleToJellyfinLanguage(rokuLocale) → {string}

mapRokuLocaleToJellyfinLanguage: Converts Roku locale codes to Jellyfin ISO 639-2 language codes

Maps Roku device locale (e.g., "en_US", "fr_CA") to Jellyfin's 3-letter language codes. Extracts base language from locale and maps to standard ISO 639-2 codes.

Supported Roku locales:

  • en_US, en_GB, en_CA, en_AU → eng (English)
  • es_ES, es_MX → spa (Spanish)
  • pt_BR → por (Portuguese)
  • fr_CA → fra (French)
  • de_DE → deu (German)
  • it_IT → ita (Italian)
Parameters:
NameTypeDescription
rokuLocaledynamic

Roku locale string (e.g., "en_US", "fr_CA")

Returns:
  • Jellyfin ISO 639-2 language code (e.g., "eng", "fra"), or empty string if not recognized
Type: 
string

(static) resolvePlayDefaultAudioTrack(userSettings, userConfig) → {boolean}

resolvePlayDefaultAudioTrack: Resolves the playDefaultAudioTrack setting value

Checks JellyRock override setting first, then falls back to web client setting. Ensures a valid boolean is always returned.

Parameters:
NameTypeDescription
userSettingsobject

JellyfinUserSettings node (JellyRock settings)

userConfigobject

JellyfinUserConfiguration node (web client settings)

Returns:
  • Resolved playDefaultAudioTrack value (guaranteed boolean)
Type: 
boolean

(static) selectBestStreamByHardware(audioStreams, deviceCapabilities) → {dynamic}

selectBestStreamByHardware: Selects the best audio stream based on device capabilities

Priority:

  1. Prefer streams matching device's max channel capability (for quality)
  2. Among matching streams, prefer direct-playable codecs
  3. Fall back intelligently based on channel counts
Parameters:
NameTypeDescription
audioStreamsobject

Array of audio stream objects

deviceCapabilitiesobject

Device capability info from getDeviceAudioCapabilities()

Returns:
  • Best matching audio stream object, or invalid
Type: 
dynamic