jf-roku/components/liveTv/ProgramDetails.bs

375 lines
14 KiB
Plaintext
Raw Normal View History

import "pkg:/source/utils/misc.bs"
import "pkg:/source/utils/config.bs"
2020-11-23 17:13:57 +00:00
sub init()
' Max "Overview" lines to show in Preview and Detail
m.maxPreviewLines = 5
m.maxDetailLines = 14
m.detailsView = m.top.findNode("detailsView")
m.noInfoView = m.top.findNode("noInformation")
2020-11-23 17:13:57 +00:00
m.programName = m.top.findNode("programName")
m.episodeTitle = m.top.findNode("episodeTitle")
m.episodeNumber = m.top.findNode("episodeNumber")
m.overview = m.top.findNode("overview")
m.episodeDetailsGroup = m.top.findNode("episodeDetailsGroup")
m.isLiveGroup = m.top.findNode("isLive")
m.isRepeatGroup = m.top.findNode("isRepeat")
m.broadcastDetails = m.top.findNode("broadcastDetails")
m.duration = m.top.findNode("duration")
m.channelName = m.top.findNode("channelName")
m.image = m.top.findNode("image")
2022-05-14 10:13:28 +00:00
m.favorite = m.top.findNode("favorite")
2020-11-23 17:13:57 +00:00
2022-01-05 03:36:21 +00:00
m.viewChannelFocusAnimationOpacity = m.top.findNode("viewChannelFocusAnimationOpacity")
m.recordFocusAnimationOpacity = m.top.findNode("recordFocusAnimationOpacity")
m.recordSeriesFocusAnimationOpacity = m.top.findNode("recordSeriesFocusAnimationOpacity")
2020-11-23 17:13:57 +00:00
m.focusAnimation = m.top.findNode("focusAnimation")
m.viewChannelButton = m.top.findNode("viewChannelButton")
2022-01-05 03:36:21 +00:00
m.recordButton = m.top.findNode("recordButton")
m.recordSeriesButton = m.top.findNode("recordSeriesButton")
2020-11-23 17:13:57 +00:00
2022-01-05 03:36:21 +00:00
m.viewChannelOutline = m.top.findNode("viewChannelOutline")
m.recordOutline = m.top.findNode("recordOutline")
m.recordSeriesOutline = m.top.findNode("recordSeriesOutline")
m.viewChannelLabel = m.top.findNode("viewChannelButtonLabel")
m.recordLabel = m.top.findNode("recordButtonLabel")
m.recordSeriesLabel = m.top.findNode("recordSeriesButtonLabel")
2020-11-23 17:13:57 +00:00
m.viewChannelButtonBackground = m.top.findNode("viewChannelButtonBackground")
m.recordButtonBackground = m.top.findNode("recordButtonBackground")
m.recordSeriesButtonBackground = m.top.findNode("recordSeriesButtonBackground")
2022-01-05 03:36:21 +00:00
m.focusAnimation.observeField("state", "onAnimationComplete")
2022-01-09 05:50:53 +00:00
2020-11-23 17:13:57 +00:00
setupLabels()
end sub
' Set up Live and Repeat label sizes
sub setupLabels()
boundingRect = m.top.findNode("isLiveText").boundingRect()
isLiveBackground = m.top.findNode("isLiveBackground")
isLiveBackground.width = boundingRect.width + 16
isLiveBackground.height = boundingRect.height + 8
m.episodeDetailsGroup.removeChildIndex(0)
boundingRect = m.top.findNode("isRepeatText").boundingRect()
isRepeatBackground = m.top.findNode("isRepeatBackground")
isRepeatBackground.width = boundingRect.width + 16
isRepeatBackground.height = boundingRect.height + 8
m.episodeDetailsGroup.removeChildIndex(0)
m.viewChannelLabel.text = tr("View Channel")
2020-11-23 17:13:57 +00:00
boundingRect = m.viewChannelButton.boundingRect()
2022-01-05 03:36:21 +00:00
viewButtonBackground = m.top.findNode("viewChannelButtonBackground")
viewButtonBackground.width = boundingRect.width + 20
viewButtonBackground.height = boundingRect.height + 20
m.viewChannelOutline.width = viewButtonBackground.width
m.viewChannelOutline.height = viewButtonBackground.height
m.recordLabel.text = tr("Record")
2022-01-05 03:36:21 +00:00
boundingRect = m.recordButton.boundingRect()
2022-01-09 05:50:53 +00:00
recordButtonBackground = m.top.findNode("recordButtonBackground")
2022-01-05 03:36:21 +00:00
recordButtonBackground.width = boundingRect.width + 20
2022-01-09 05:50:53 +00:00
recordButtonBackground.height = boundingRect.height + 20
m.recordOutline.width = recordButtonBackground.width
m.recordOutline.height = recordButtonBackground.height
m.recordSeriesLabel.text = tr("Record Series")
boundingRect = m.recordSeriesButton.boundingRect()
2022-01-09 05:50:53 +00:00
recordSeriesButtonBackground = m.top.findNode("recordSeriesButtonBackground")
recordSeriesButtonBackground.width = boundingRect.width + 20
2022-01-09 05:50:53 +00:00
recordSeriesButtonBackground.height = boundingRect.height + 20
m.recordSeriesOutline.width = recordSeriesButtonBackground.width
m.recordSeriesOutline.height = recordSeriesButtonBackground.height
m.userCanRecord = m.global.session.user.settings["livetv.canrecord"]
2023-06-24 14:33:41 +00:00
if m.userCanRecord = false
m.recordButton.visible = false
m.recordSeriesButton.visible = false
end if
2020-11-23 17:13:57 +00:00
end sub
2022-01-09 05:43:17 +00:00
sub updateLabels(recordText = "Record", recordSeriesText = "Record Series")
m.recordLabel.text = tr(recordText)
m.recordSeriesLabel.text = tr(recordSeriesText)
boundingRect = m.recordButton.boundingRect()
2022-01-09 05:50:53 +00:00
recordButtonBackground = m.top.findNode("recordButtonBackground")
recordButtonBackground.width = boundingRect.width
recordButtonBackground.height = boundingRect.height
m.recordOutline.width = recordButtonBackground.width
m.recordOutline.height = recordButtonBackground.height
2022-01-09 05:43:17 +00:00
boundingRect = m.recordSeriesButton.boundingRect()
2022-01-09 05:50:53 +00:00
recordSeriesButtonBackground = m.top.findNode("recordSeriesButtonBackground")
recordSeriesButtonBackground.width = boundingRect.width
recordSeriesButtonBackground.height = boundingRect.height
m.recordSeriesOutline.width = recordSeriesButtonBackground.width
m.recordSeriesOutline.height = recordSeriesButtonBackground.height
2022-01-09 05:43:17 +00:00
end sub
sub channelUpdated()
2021-07-09 20:08:32 +00:00
if m.top.channel = invalid
m.top.findNode("noInfoChannelName").text = ""
m.channelName.text = ""
2021-07-09 20:08:32 +00:00
else
m.top.findNode("noInfoChannelName").text = m.top.channel.Title
2021-07-09 20:08:32 +00:00
m.channelName.text = m.top.channel.Title
if m.top.programDetails = invalid
m.image.uri = m.top.channel.posterURL
end if
2022-05-14 10:13:28 +00:00
m.favorite.visible = m.top.channel.favorite
end if
end sub
2020-11-23 17:13:57 +00:00
sub programUpdated()
m.top.watchSelectedChannel = false
2022-01-05 03:50:45 +00:00
m.top.recordSelectedChannel = false
m.top.recordSeriesSelectedChannel = false
2020-11-23 17:13:57 +00:00
m.overview.maxLines = m.maxDetailLines
prog = m.top.programDetails
' If no program selected, hide details view
if prog = invalid
channelUpdated()
2020-11-23 17:13:57 +00:00
m.detailsView.visible = "false"
m.noInfoView.visible = "true"
2020-11-23 17:13:57 +00:00
return
end if
m.programName.text = prog.Title
m.overview.text = prog.description
m.episodeDetailsGroup.removeChildrenIndex(m.episodeDetailsGroup.getChildCount(), 0)
if prog.isLive
2020-11-23 17:13:57 +00:00
m.episodeDetailsGroup.appendChild(m.isLiveGroup)
else if prog.isRepeat
2020-11-23 17:13:57 +00:00
m.episodeDetailsGroup.appendChild(m.isRepeatGroup)
end if
' Episode Number
if prog.seasonNumber > 0 and prog.episodeNumber > 0
2020-11-23 17:13:57 +00:00
m.episodeNumber.text = "S" + StrI(prog.seasonNumber).trim() + ":E" + StrI(prog.episodeNumber).trim()
if prog.episodeTitle <> "" then m.episodeNumber.text = m.episodeNumber.text + " -" ' Add a Dash if showing Episode Number and Title
m.episodeDetailsGroup.appendChild(m.episodeNumber)
end if
if prog.episodeTitle <> invalid and prog.episodeTitle <> ""
2020-11-23 17:13:57 +00:00
m.episodeTitle.text = prog.episodeTitle
m.episodeTitle.visible = true
m.episodeDetailsGroup.appendChild(m.episodeTitle)
end if
m.duration.text = getDurationStringFromSeconds(prog.PlayDuration)
' Calculate Broadcast Details
now = createObject("roDateTime")
startDate = createObject("roDateTime")
endDate = createObject("roDateTime")
startDate.FromISO8601String(prog.StartDate)
endDate.FromISO8601String(prog.EndDate)
day = getRelativeDayName(startDate)
' Get Start Date in local timezone for display to user
localStartDate = createObject("roDateTime")
localStartDate.FromISO8601String(prog.StartDate)
localStartDate.ToLocalTime()
if startDate.AsSeconds() < now.AsSeconds() and endDate.AsSeconds() > now.AsSeconds()
if day = "today"
m.broadcastDetails.text = tr("Started at") + " " + formatTime(localStartDate)
2020-11-23 17:13:57 +00:00
else
m.broadcastDetails.text = tr("Started") + " " + tr(day) + ", " + formatTime(localStartDate)
2020-11-23 17:13:57 +00:00
end if
else if startDate.AsSeconds() > now.AsSeconds()
if day = "today"
m.broadcastDetails.text = tr("Starts at") + " " + formatTime(localStartDate)
2020-11-23 17:13:57 +00:00
else
m.broadcastDetails.text = tr("Starts") + " " + tr(day) + ", " + formatTime(localStartDate)
2020-11-23 17:13:57 +00:00
end if
else
if day = "today"
m.broadcastDetails.text = tr("Ended at") + " " + formatTime(localStartDate)
2020-11-23 17:13:57 +00:00
else
m.broadcastDetails.text = tr("Ended") + " " + tr(day) + ", " + formatTime(localStartDate)
2020-11-23 17:13:57 +00:00
end if
end if
m.image.uri = prog.PosterURL
2022-01-09 05:43:17 +00:00
' If currently being recorded, change button to "Stop Recording"
if prog.json.TimerId <> invalid
2022-01-09 05:49:05 +00:00
if prog.json.SeriesTimerId <> invalid
updateLabels("Cancel Recording", "Cancel Series Recording")
2022-01-09 05:43:17 +00:00
else
updateLabels("Cancel Recording", "Record Series")
end if
else
updateLabels()
end if
2020-11-23 17:13:57 +00:00
2022-01-11 00:11:54 +00:00
' If not a series, hide Record Series button
2022-01-11 00:12:55 +00:00
if prog.json.isSeries <> true ' could be invalid or false
2022-01-11 00:11:54 +00:00
m.recordSeriesButton.visible = false
else
m.recordSeriesButton.visible = true
end if
2020-11-23 17:13:57 +00:00
m.detailsView.visible = "true"
m.noInfoView.visible = "false"
2020-11-23 17:13:57 +00:00
m.top.height = m.detailsView.boundingRect().height
m.overview.maxLines = m.maxPreviewLines
end sub
'
' Get relative date name for a date (yesterday, today, tomorrow, or otherwise weekday name )
function getRelativeDayName(date) as string
now = createObject("roDateTime")
' Check for Today
if now.AsDateString("short-date-dashes") = date.AsDateString("short-date-dashes")
2020-11-23 17:13:57 +00:00
return "today"
end if
' Check for Yesterday
2023-01-25 17:44:38 +00:00
todayMidnight = now.AsSeconds() - (now.AsSeconds() mod 86400)
dateMidnight = date.AsSeconds() - (date.AsSeconds() mod 86400)
2020-11-23 17:13:57 +00:00
if todayMidnight - dateMidnight = 86400
2020-11-23 17:13:57 +00:00
return "yesterday"
end if
if dateMidnight - todayMidnight = 86400
2020-11-23 17:13:57 +00:00
return "tomorrow"
end if
return date.GetWeekday()
end function
'
' Get program duration string (e.g. 1h 20m)
2020-11-23 17:13:57 +00:00
function getDurationStringFromSeconds(seconds) as string
hours = 0
minutes = seconds / 60.0
if minutes > 60
2023-01-25 17:44:38 +00:00
hours = (minutes - (minutes mod 60)) / 60
minutes = minutes mod 60
2020-11-23 17:13:57 +00:00
end if
if hours > 0
2020-11-23 17:13:57 +00:00
return "%1h %2m".Replace("%1", StrI(hours).trim()).Replace("%2", StrI(minutes).trim())
else
return "%1m".Replace("%1", StrI(minutes).trim())
end if
end function
'
' Show view channel button when item has Focus
sub focusChanged()
2021-07-09 20:08:32 +00:00
if m.top.hasFocus = true
2020-11-23 17:13:57 +00:00
m.overview.maxLines = m.maxDetailLines
2022-01-05 03:36:21 +00:00
m.viewChannelFocusAnimationOpacity.keyValue = [0, 1]
m.recordFocusAnimationOpacity.keyValue = [0, 1]
m.recordSeriesFocusAnimationOpacity.keyValue = [0, 1]
2022-01-05 03:36:21 +00:00
m.viewChannelButton.setFocus(true)
m.viewChannelOutline.visible = true
2022-01-09 05:43:17 +00:00
m.recordOutline.visible = false
m.recordSeriesOutline.visible = false
2022-01-16 14:12:58 +00:00
m.viewChannelButtonBackground.blendColor = "#006fab"
m.recordButtonBackground.blendColor = "#000000"
m.recordSeriesButtonBackground.blendColor = "#000000"
2020-11-23 17:13:57 +00:00
else
m.top.watchSelectedChannel = false
2022-01-05 03:50:45 +00:00
m.top.recordSelectedChannel = false
m.top.recordSeriesSelectedChannel = false
2022-01-05 03:36:21 +00:00
m.viewChannelFocusAnimationOpacity.keyValue = [1, 0]
m.recordFocusAnimationOpacity.keyValue = [1, 0]
m.recordSeriesFocusAnimationOpacity.keyValue = [1, 0]
2020-11-23 17:13:57 +00:00
end if
m.focusAnimation.control = "start"
end sub
2021-07-09 20:08:32 +00:00
sub onAnimationComplete()
if m.focusAnimation.state = "stopped" and m.top.hasFocus = false
2020-11-23 17:13:57 +00:00
m.overview.maxLines = m.maxPreviewLines
end if
end sub
function onKeyEvent(key as string, press as boolean) as boolean
if not press then return false
2022-01-05 03:36:21 +00:00
if key = "OK" and m.viewChannelButton.hasFocus()
2020-11-23 17:13:57 +00:00
m.top.watchSelectedChannel = true
return true
2022-01-05 03:50:45 +00:00
else if key = "OK" and m.recordButton.hasFocus()
m.top.recordSelectedChannel = true
return true
else if key = "OK" and m.recordSeriesButton.hasFocus()
2022-01-09 05:50:53 +00:00
m.top.recordSeriesSelectedChannel = true
return true
2020-11-23 17:13:57 +00:00
end if
2023-11-19 23:22:50 +00:00
if m.userCanRecord = true
if key = "right" and m.viewChannelButton.hasFocus()
m.recordButton.setFocus(true)
m.viewChannelOutline.visible = false
m.recordOutline.visible = true
2022-01-16 14:12:58 +00:00
m.viewChannelButtonBackground.blendColor = "#000000"
m.recordButtonBackground.blendColor = "#006fab"
m.recordSeriesButtonBackground.blendColor = "#000000"
return true
else if key = "right" and m.recordButton.hasFocus()
m.recordSeriesButton.setFocus(true)
m.recordOutline.visible = false
m.recordSeriesOutline.visible = true
2022-01-16 14:12:58 +00:00
m.viewChannelButtonBackground.blendColor = "#000000"
m.recordButtonBackground.blendColor = "#000000"
m.recordSeriesButtonBackground.blendColor = "#006fab"
2022-01-11 00:11:54 +00:00
return true
else if key = "left" and m.recordSeriesButton.hasFocus()
m.recordButton.setFocus(true)
m.recordOutline.visible = true
m.recordSeriesOutline.visible = false
2022-01-16 14:12:58 +00:00
m.viewChannelButtonBackground.blendColor = "#000000"
m.recordButtonBackground.blendColor = "#006fab"
m.recordSeriesButtonBackground.blendColor = "#000000"
2022-01-11 00:11:54 +00:00
return true
else if key = "left" and m.recordButton.hasFocus()
m.viewChannelButton.setFocus(true)
m.viewChannelOutline.visible = true
m.recordOutline.visible = false
2022-01-16 14:12:58 +00:00
m.viewChannelButtonBackground.blendColor = "#006fab"
m.recordButtonBackground.blendColor = "#000000"
m.recordSeriesButtonBackground.blendColor = "#000000"
return true
end if
2022-01-05 03:36:21 +00:00
end if
if key = "up" or key = "down"
2020-11-23 17:13:57 +00:00
return true
end if
return false
end function