jf-roku/components/tvshows/TVEpisodeRowWithOptions.bs
2023-10-03 12:11:25 -04:00

124 lines
4.2 KiB
Plaintext

import "pkg:/source/utils/misc.bs"
sub init()
m.rows = m.top.findNode("tvEpisodeRow")
m.tvListOptions = m.top.findNode("tvListOptions")
m.rows.observeField("doneLoading", "rowsDoneLoading")
end sub
sub setupRows()
objects = m.top.objects
m.rows.objects = objects
end sub
sub rowsDoneLoading()
m.top.doneLoading = true
end sub
' List of video versions to choose from
sub SetUpVideoOptions(streams as object)
videos = []
for i = 0 to streams.Count() - 1
if LCase(streams[i].VideoType) = "videofile"
' Create options for user to switch between video tracks
videos.push({
"Title": streams[i].Name,
"Description": tr("Video"),
"Selected": m.top.objects.items[m.currentSelected].selectedVideoStreamId = streams[i].id,
"StreamID": streams[i].id,
"video_codec": streams[i].mediaStreams[0].displayTitle
})
end if
end for
if videos.count() >= 1
options = {}
options.videos = videos
m.tvListOptions.options = options
end if
end sub
' List of audio tracks to choose from
sub SetUpAudioOptions(streams as object)
tracks = []
for i = 0 to streams.Count() - 1
if streams[i].Type = "Audio"
tracks.push({
"Title": streams[i].displayTitle,
"Description": streams[i].Title,
"Selected": m.top.objects.items[m.currentSelected].selectedAudioStreamIndex = i,
"StreamIndex": i
})
end if
end for
if tracks.count() >= 1
options = {}
if isValid(m.tvListOptions.options) and isValid(m.tvListOptions.options.videos)
options.videos = m.tvListOptions.options.videos
end if
options.audios = tracks
m.tvListOptions.options = options
end if
end sub
sub audioOptionsClosed()
if m.currentSelected <> invalid
' If the user opened the audio options, we report back even if they left the selection alone.
' Otherwise, the users' lang peference from the server will take over.
' To do this, we interpret anything other than "0" as the user opened the audio options.
m.top.objects.items[m.currentSelected].selectedAudioStreamIndex = m.tvListOptions.audioStreamIndex = 0 ? 1 : m.tvListOptions.audioStreamIndex
end if
end sub
sub videoOptionsClosed()
if m.tvListOptions.videoStreamId <> m.top.objects.items[m.currentSelected].selectedVideoStreamId
m.rows.objects.items[m.currentSelected].selectedVideoStreamId = m.tvListOptions.videoStreamId
end if
end sub
function onKeyEvent(key as string, press as boolean) as boolean
if not press then return false
if key = "options" and isValid(m.rows.focusedChild) and isValid(m.rows.focusedChild.rowItemFocused)
m.currentSelected = m.rows.focusedChild.rowItemFocused[0]
mediaStreams = m.rows.objects.items[m.currentSelected].json.MediaStreams
mediaSources = m.rows.objects.items[m.currentSelected].json.MediaSources
if m.rows.objects.items[m.currentSelected].selectedVideoStreamId <> ""
for each source in mediaSources
if source.id = m.rows.objects.items[m.currentSelected].selectedVideoStreamId
mediaStreams = source.MediaStreams
exit for
end if
end for
end if
if isValid(mediaSources)
SetUpVideoOptions(mediaSources)
end if
if isValid(mediaStreams)
SetUpAudioOptions(mediaStreams)
end if
if isValid(m.tvListOptions.options)
m.tvListOptions.visible = true
m.tvListOptions.setFocus(true)
end if
return true
else if m.tvListOptions.visible = true and key = "back" or key = "options"
m.tvListOptions.setFocus(false)
m.tvListOptions.visible = false
m.rows.setFocus(true)
videoOptionsClosed()
audioOptionsClosed()
return true
else if key = "up" and m.rows.hasFocus() = false
m.rows.setFocus(true)
else if key = "down" and m.rows.hasFocus() = false
m.rows.setFocus(true)
end if
return false
end function