2019-10-12 21:00:07 +00:00
|
|
|
sub init()
|
2021-09-05 02:43:00 +00:00
|
|
|
m.playbackTimer = m.top.findNode("playbackTimer")
|
|
|
|
m.bufferCheckTimer = m.top.findNode("bufferCheckTimer")
|
2020-05-24 09:33:07 +00:00
|
|
|
m.top.observeField("state", "onState")
|
2021-09-05 02:43:00 +00:00
|
|
|
m.playbackTimer.observeField("fire", "ReportPlayback")
|
2021-07-09 20:08:32 +00:00
|
|
|
m.bufferPercentage = 0 ' Track whether content is being loaded
|
2021-09-05 02:43:00 +00:00
|
|
|
m.playReported = false
|
2021-06-12 15:03:47 +00:00
|
|
|
m.top.transcodeReasons = []
|
2022-05-11 15:56:33 +00:00
|
|
|
m.bufferCheckTimer.duration = 10
|
2021-07-09 20:08:32 +00:00
|
|
|
|
2019-10-12 21:00:07 +00:00
|
|
|
end sub
|
2020-03-28 20:04:57 +00:00
|
|
|
|
2020-05-24 09:33:07 +00:00
|
|
|
'
|
|
|
|
' When Video Player state changes
|
2021-07-09 20:08:32 +00:00
|
|
|
sub onState(msg)
|
2020-05-24 09:33:07 +00:00
|
|
|
|
|
|
|
' When buffering, start timer to monitor buffering process
|
2021-06-26 13:52:16 +00:00
|
|
|
if m.top.state = "buffering" and m.bufferCheckTimer <> invalid
|
2020-05-30 08:44:22 +00:00
|
|
|
|
2020-05-24 09:33:07 +00:00
|
|
|
' start timer
|
|
|
|
m.bufferCheckTimer.control = "start"
|
|
|
|
m.bufferCheckTimer.ObserveField("fire", "bufferCheck")
|
2021-06-26 13:52:16 +00:00
|
|
|
else if m.top.state = "error"
|
2020-05-30 08:44:22 +00:00
|
|
|
' If an error was encountered, Display dialog
|
|
|
|
dialog = createObject("roSGNode", "Dialog")
|
|
|
|
dialog.title = tr("Error During Playback")
|
|
|
|
dialog.buttons = [tr("OK")]
|
|
|
|
dialog.message = tr("An error was encountered while playing this item.")
|
|
|
|
dialog.observeField("buttonSelected", "dialogClosed")
|
|
|
|
m.top.getScene().dialog = dialog
|
|
|
|
|
|
|
|
' Stop playback and exit player
|
|
|
|
m.top.control = "stop"
|
|
|
|
m.top.backPressed = true
|
2021-09-05 02:43:00 +00:00
|
|
|
else if m.top.state = "playing"
|
|
|
|
if m.playReported = false
|
|
|
|
ReportPlayback("start")
|
|
|
|
m.playReported = true
|
|
|
|
else
|
|
|
|
m.playbackTimer.control = "start"
|
|
|
|
ReportPlayback()
|
|
|
|
end if
|
|
|
|
else if m.top.state = "paused"
|
|
|
|
m.playbackTimer.control = "stop"
|
|
|
|
ReportPlayback()
|
|
|
|
else if m.top.state = "stopped"
|
|
|
|
m.playbackTimer.control = "stop"
|
|
|
|
ReportPlayback("stop")
|
|
|
|
m.playReported = false
|
|
|
|
end if
|
|
|
|
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Report playback to server
|
|
|
|
sub ReportPlayback(state = "update" as string)
|
|
|
|
|
|
|
|
if m.top.position = invalid then return
|
|
|
|
|
|
|
|
params = {
|
2022-05-30 12:59:24 +00:00
|
|
|
"ItemId": m.top.id,
|
2021-09-05 02:43:00 +00:00
|
|
|
"PlaySessionId": m.top.PlaySessionId,
|
|
|
|
"PositionTicks": int(m.top.position) * 10000000&, 'Ensure a LongInteger is used
|
|
|
|
"IsPaused": (m.top.state = "paused"),
|
|
|
|
}
|
|
|
|
if m.top.content.live
|
|
|
|
params.append({
|
|
|
|
"MediaSourceId": m.top.transcodeParams.MediaSourceId,
|
|
|
|
"LiveStreamId": m.top.transcodeParams.LiveStreamId
|
|
|
|
})
|
2022-05-11 15:56:33 +00:00
|
|
|
m.bufferCheckTimer.duration = 30
|
2020-05-24 09:33:07 +00:00
|
|
|
end if
|
|
|
|
|
2021-09-05 02:43:00 +00:00
|
|
|
' Report playstate via worker task
|
|
|
|
playstateTask = m.global.playstateTask
|
|
|
|
playstateTask.setFields({ status: state, params: params })
|
|
|
|
playstateTask.control = "RUN"
|
2020-05-24 09:33:07 +00:00
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Check the the buffering has not hung
|
|
|
|
sub bufferCheck(msg)
|
|
|
|
|
|
|
|
if m.top.state <> "buffering"
|
|
|
|
' If video is not buffering, stop timer
|
|
|
|
m.bufferCheckTimer.control = "stop"
|
|
|
|
m.bufferCheckTimer.unobserveField("fire")
|
|
|
|
return
|
|
|
|
end if
|
2021-06-26 13:52:16 +00:00
|
|
|
if m.top.bufferingStatus <> invalid
|
2020-05-24 09:33:07 +00:00
|
|
|
|
|
|
|
' Check that the buffering percentage is increasing
|
2021-06-26 13:52:16 +00:00
|
|
|
if m.top.bufferingStatus["percentage"] > m.bufferPercentage
|
2020-05-24 09:33:07 +00:00
|
|
|
m.bufferPercentage = m.top.bufferingStatus["percentage"]
|
2022-05-11 15:56:33 +00:00
|
|
|
else if m.top.content.live = true
|
|
|
|
m.top.callFunc("refresh")
|
2020-05-24 09:33:07 +00:00
|
|
|
else
|
|
|
|
' If buffering has stopped Display dialog
|
|
|
|
dialog = createObject("roSGNode", "Dialog")
|
|
|
|
dialog.title = tr("Error Retrieving Content")
|
|
|
|
dialog.buttons = [tr("OK")]
|
|
|
|
dialog.message = tr("There was an error retrieving the data for this item from the server.")
|
|
|
|
dialog.observeField("buttonSelected", "dialogClosed")
|
|
|
|
m.top.getScene().dialog = dialog
|
|
|
|
|
|
|
|
' Stop playback and exit player
|
|
|
|
m.top.control = "stop"
|
|
|
|
m.top.backPressed = true
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Clean up on Dialog Closed
|
|
|
|
sub dialogClosed(msg)
|
|
|
|
sourceNode = msg.getRoSGNode()
|
|
|
|
sourceNode.unobserveField("buttonSelected")
|
|
|
|
sourceNode.close = true
|
|
|
|
end sub
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-03-28 20:04:57 +00:00
|
|
|
function onKeyEvent(key as string, press as boolean) as boolean
|
2021-07-09 20:08:32 +00:00
|
|
|
if not press then return false
|
2020-03-28 20:04:57 +00:00
|
|
|
|
2021-07-09 20:08:32 +00:00
|
|
|
if m.top.Subtitles.count() and key = "down"
|
|
|
|
m.top.selectSubtitlePressed = true
|
|
|
|
return true
|
|
|
|
end if
|
2020-03-28 20:04:57 +00:00
|
|
|
|
2021-07-09 20:08:32 +00:00
|
|
|
return false
|
2020-03-28 20:04:57 +00:00
|
|
|
end function
|