commit fb8149a7614cd5dca2025988590999cffd068b02
parent 91dc7da9bd2c5d23d84d2a874249fd79ee40e5fe
Author: Brian C. Lane <bcl@brianlane.com>
Date: Mon, 14 Nov 2022 18:39:25 -0800
Add Video Player
Diffstat:
2 files changed, 77 insertions(+), 5 deletions(-)
diff --git a/HMS/components/MainScene.brs b/HMS/components/MainScene.brs
@@ -13,6 +13,8 @@ sub Init()
' Validate the url
RunValidateURLTask(url)
end if
+
+ SetupVideoPlayer()
end sub
@@ -70,8 +72,11 @@ end sub
sub OnMetadataLoaded()
print "MainScene->OnMetadataLoaded()"
- print "Got "; m.metadataTask.metadata.Count(); " items."
m.metadata = m.metadataTask.metadata
+ if m.metadata = invalid then
+ return
+ end if
+ print "Got "; m.metadataTask.metadata.Count(); " items."
' Create one GridPanel and one PosterGrid, then reuse them for each category
' This may not be quite right, but it works for now.
@@ -91,7 +96,7 @@ sub OnMetadataLoaded()
m.posterGrid.caption1NumLines = "1"
m.posterGrid.numColumns = "7"
m.posterGrid.numRows = "3"
- m.posterGrid.ObserveField("itemSelected", "OnPostedSelected")
+ m.posterGrid.ObserveField("itemSelected", "OnPosterSelected")
m.posterGrid.ObserveField("itemFocused", "OnPosterFocused")
m.gridPanel.appendChild(m.PosterGrid)
@@ -111,15 +116,32 @@ sub OnMetadataLoaded()
end sub
sub OnPosterSelected()
- print "MainScene->OnPosterGridSelected()"
+ print "MainScene->OnPosterSelected()"
print m.posterGrid.itemSelected
- print m.metadata[m.posterGrid.itemSelected].ShortDescriptionLine1
+
+ item = m.metadata[m.posterGrid.itemSelected]
+ print item.ShortDescriptionLine1
+
+ content = CreateObject("roSGNode", "ContentNode")
+ content.HDPosterUrl = item.HDPosterUrl
+ content.SDPosterUrl = item.SDPosterUrl
+ content.Title = item.ShortDescriptionLine1
+ ' TODO fix the category metadata
+ content.Url = item.StreamURLS[0]
+
+ ' Play the selected video
+ m.video.content = content
+ m.video.visible = true
+ m.video.SetFocus(true)
+ m.video.control = "play"
end sub
sub OnPosterFocused()
- print "MainScene->OnPosterGridSelected()"
+ print "MainScene->OnPosterFocused()"
print m.posterGrid.itemFocused
print m.metadata[m.posterGrid.itemFocused].ShortDescriptionLine1
+
+ ' TODO update something at the top with the full name of the video
end sub
sub OnLabelListSelected()
@@ -165,3 +187,52 @@ sub OnSetupServerURL()
RunValidateURLTask(m.serverDialog.serverurl)
end sub
+
+sub SetupVideoPlayer()
+ ' Setup the video player
+ m.video = m.top.FindNode("player")
+ m.Video.observeField("state", "OnVideoStateChange")
+ m.Video.observeField("position", "OnVideoPositionChange")
+ m.Video.notificationInterval = 1
+ ' map of events that should be handled on state change
+ m.statesToHandle = {
+ finished: ""
+ error: ""
+ }
+end sub
+
+sub OnVideoStateChanged()
+ print "MainScene->OnVideoStateChanged()"
+ ? "video state: " + m.Video.state
+ if m.Video.content <> invalid AND m.statesToHandle[m.Video.state] <> invalid
+ m.timer = CreateObject("roSgnode", "Timer")
+ m.timer.observeField("fire", "CloseVideoPlayer")
+ m.timer.duration = 0.3
+ m.timer.control = "start"
+ end if
+end sub
+
+sub CloseVideoPlayer()
+ print "MainScene->CloseVideoPlayer()"
+ m.Video.visible = false
+ m.Video.control = "stop"
+ m.posterGrid.SetFocus(true)
+end sub
+
+sub OnVideoPositionChange()
+ print "MainScene->OnVideoPositionChange()"
+ ' TODO save position to keystore at intervals
+end sub
+
+function onKeyEvent(key as String, press as Boolean) as Boolean
+ if press
+ if key = "back" 'If the back button is pressed
+ if m.Video.visible
+ CloseVideoPlayer()
+ return true
+ else
+ return false
+ end if
+ end if
+ end if
+end Function
diff --git a/HMS/components/MainScene.xml b/HMS/components/MainScene.xml
@@ -10,5 +10,6 @@
</interface>
<children>
<PanelSet id="panels" translation="[0, 0]" />
+ <Video id="player" width="1920" height="1080" visible="false"/>
</children>
</component>