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")
|
2020-11-29 10:19:10 +00:00
|
|
|
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")
|
|
|
|
|
|
|
|
m.focusAnimationOpacity = m.top.findNode("focusAnimationOpacity")
|
|
|
|
m.focusAnimation = m.top.findNode("focusAnimation")
|
|
|
|
|
|
|
|
m.viewChannelButton = m.top.findNode("viewChannelButton")
|
|
|
|
|
|
|
|
m.focusAnimation.observeField("state", "onAnimationComplete")
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
boundingRect = m.viewChannelButton.boundingRect()
|
|
|
|
buttonBackground = m.top.findNode("viewChannelButtonBackground")
|
|
|
|
buttonBackground.width = boundingRect.width + 20
|
|
|
|
buttonBackground.height = boundingRect.height + 20
|
|
|
|
end sub
|
|
|
|
|
2020-11-29 10:19:10 +00:00
|
|
|
sub channelUpdated()
|
|
|
|
if m.top.channel = invalid
|
|
|
|
m.top.findNode("noInfoChannelName").text = ""
|
|
|
|
m.channelName.text = ""
|
|
|
|
else
|
|
|
|
m.top.findNode("noInfoChannelName").text = m.top.channel.Title
|
|
|
|
m.channelName.text= m.top.channel.Title
|
2021-06-26 13:52:16 +00:00
|
|
|
if m.top.programDetails = invalid
|
2020-11-29 10:19:10 +00:00
|
|
|
m.image.uri = m.top.channel.posterURL
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
end sub
|
|
|
|
|
2020-11-23 17:13:57 +00:00
|
|
|
sub programUpdated()
|
|
|
|
|
|
|
|
m.top.watchSelectedChannel = false
|
|
|
|
m.overview.maxLines = m.maxDetailLines
|
|
|
|
prog = m.top.programDetails
|
|
|
|
|
|
|
|
' If no program selected, hide details view
|
2021-06-26 13:52:16 +00:00
|
|
|
if prog = invalid
|
2020-11-29 10:19:10 +00:00
|
|
|
channelUpdated()
|
2020-11-23 17:13:57 +00:00
|
|
|
m.detailsView.visible = "false"
|
2020-11-29 10:19:10 +00:00
|
|
|
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)
|
|
|
|
|
2021-06-26 13:52:16 +00:00
|
|
|
if prog.isLive
|
2020-11-23 17:13:57 +00:00
|
|
|
m.episodeDetailsGroup.appendChild(m.isLiveGroup)
|
2021-06-26 13:52:16 +00:00
|
|
|
else if prog.isRepeat
|
2020-11-23 17:13:57 +00:00
|
|
|
m.episodeDetailsGroup.appendChild(m.isRepeatGroup)
|
|
|
|
end if
|
|
|
|
|
|
|
|
' Episode Number
|
2021-06-26 13:52:16 +00:00
|
|
|
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
|
|
|
|
|
2021-06-26 13:52:16 +00:00
|
|
|
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)
|
|
|
|
|
2021-04-04 10:57:28 +00:00
|
|
|
' Get Start Date in local timezone for display to user
|
|
|
|
localStartDate = createObject("roDateTime")
|
|
|
|
localStartDate.FromISO8601String(prog.StartDate)
|
|
|
|
localStartDate.ToLocalTime()
|
|
|
|
|
2021-06-26 13:52:16 +00:00
|
|
|
if startDate.AsSeconds() < now.AsSeconds() and endDate.AsSeconds() > now.AsSeconds()
|
|
|
|
if day = "today"
|
2021-04-04 10:57:28 +00:00
|
|
|
m.broadcastDetails.text = tr("Started at") + " " + formatTime(localStartDate)
|
2020-11-23 17:13:57 +00:00
|
|
|
else
|
2021-04-04 10:57:28 +00:00
|
|
|
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()
|
2021-06-26 13:52:16 +00:00
|
|
|
if day = "today"
|
2021-04-04 10:57:28 +00:00
|
|
|
m.broadcastDetails.text = tr("Starts at") + " " + formatTime(localStartDate)
|
2020-11-23 17:13:57 +00:00
|
|
|
else
|
2021-04-04 10:57:28 +00:00
|
|
|
m.broadcastDetails.text = tr("Starts") + " " + tr(day) + ", " + formatTime(localStartDate)
|
2020-11-23 17:13:57 +00:00
|
|
|
end if
|
|
|
|
else
|
2021-06-26 13:52:16 +00:00
|
|
|
if day = "today"
|
2021-04-04 10:57:28 +00:00
|
|
|
m.broadcastDetails.text = tr("Ended at") + " " + formatTime(localStartDate)
|
2020-11-23 17:13:57 +00:00
|
|
|
else
|
2021-04-04 10:57:28 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
m.detailsView.visible = "true"
|
2020-11-29 10:19:10 +00:00
|
|
|
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
|
2021-06-26 13:52:16 +00:00
|
|
|
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
|
|
|
|
todayMidnight = now.AsSeconds() - (now.AsSeconds() MOD 86400)
|
|
|
|
dateMidnight = date.AsSeconds() - (date.AsSeconds() MOD 86400)
|
|
|
|
|
2021-06-26 13:52:16 +00:00
|
|
|
if todayMidnight - dateMidnight = 86400
|
2020-11-23 17:13:57 +00:00
|
|
|
return "yesterday"
|
|
|
|
end if
|
|
|
|
|
2021-06-26 13:52:16 +00:00
|
|
|
if dateMidnight - todayMidnight = 86400
|
2020-11-23 17:13:57 +00:00
|
|
|
return "tomorrow"
|
|
|
|
end if
|
|
|
|
|
|
|
|
return date.GetWeekday()
|
|
|
|
|
|
|
|
end function
|
|
|
|
|
|
|
|
'
|
2020-11-24 08:15:32 +00:00
|
|
|
' 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
|
|
|
|
|
2021-06-26 13:52:16 +00:00
|
|
|
if minutes > 60
|
2020-11-23 17:13:57 +00:00
|
|
|
hours = (minutes - (minutes MOD 60)) / 60
|
|
|
|
minutes = minutes MOD 60
|
|
|
|
end if
|
|
|
|
|
2021-06-26 13:52:16 +00:00
|
|
|
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-06-26 13:52:16 +00:00
|
|
|
if m.top.hasFocus = true
|
2020-11-23 17:13:57 +00:00
|
|
|
m.overview.maxLines = m.maxDetailLines
|
|
|
|
m.focusAnimationOpacity.keyValue = [0, 1]
|
|
|
|
else
|
|
|
|
m.top.watchSelectedChannel = false
|
|
|
|
m.focusAnimationOpacity.keyValue = [1, 0]
|
|
|
|
end if
|
|
|
|
|
|
|
|
m.focusAnimation.control = "start"
|
|
|
|
|
|
|
|
end sub
|
|
|
|
|
|
|
|
sub onAnimationComplete()
|
2021-06-26 13:52:16 +00:00
|
|
|
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
|
|
|
|
|
2021-06-26 13:52:16 +00:00
|
|
|
if key = "OK"
|
2020-11-23 17:13:57 +00:00
|
|
|
m.top.watchSelectedChannel = true
|
|
|
|
return true
|
|
|
|
end if
|
|
|
|
|
2021-06-26 13:52:16 +00:00
|
|
|
if key = "left" or key = "right" or key = "up" or key = "down"
|
2020-11-23 17:13:57 +00:00
|
|
|
return true
|
|
|
|
end if
|
|
|
|
|
|
|
|
return false
|
|
|
|
end function
|
|
|
|
|