Im working on getting my channel to run with ads
' ********** Copyright 2016 Roku Corp. All Rights Reserved. **********
' 1st function that runs for the scene component on channel startup
sub init()
'To see print statements/debug info, telnet on port 8089
m.Image = m.top.findNode("Image")
m.Details = m.top.findNode("Details")
m.Title = m.top.findNode("Title")
m.Video = m.top.findNode("Video")
m.SpringDetails = m.top.findNode("SpringBoardDetails")
m.LabelList = m.top.findNode("LabelList")
m.CategoryLabel = m.top.findNode("CategoryLabel")
m.RuntimeLabel = m.top.findNode("RuntimeLabel")
m.Video.ObserveField("state","OnVideoPlayerStateChange")
m.Title.font.size = 40
m.CategoryLabel.color = "#333333"
m.Title.color = "#333333"
m.Details.color = "#444444"
m.RuntimeLabel.color = "#333333"
end sub
' set proper focus to buttons if Details opened and stops Video if Details closed
Sub onVisibleChange()
? "[DetailsScreen] onVisibleChange"
if m.top.visible = true then
m.buttons.jumpToItem = 0
m.buttons.setFocus(true)
else if m.videoPlayer <> invalid
m.videoPlayer.visible = false
m.videoPlayer.control = "stop"
m.poster.uri=""
m.background.uri=""
end if
End Sub
' set proper focus to Buttons in case if return from Video PLayer
Sub OnFocusedChildChange()
if m.top.isInFocusChain() and not m.buttons.hasFocus() and not m.videoPlayer.hasFocus() then
m.buttons.setFocus(true)
end if
End Sub
' set proper focus on buttons and stops video if return from Playback to details
Sub onVideoVisibleChange()
if m.videoPlayer.visible = false and m.top.visible = true
m.buttons.setFocus(true)
m.videoPlayer.control = "stop"
'clear video player content, for proper start of next video player
m.videoPlayer.content = invalid
'remove video player
m.top.removeChild(m.videoPlayer)
end if
End Sub
' event handler of Video player msg
Sub OnVideoPlayerStateChange()
if m.videoPlayer.state = "error"
' error handling
m.videoPlayer.visible = false
else if m.videoPlayer.state = "playing"
' playback handling
playContent()
else if m.videoPlayer.state = "finished"
m.videoPlayer.visible = false
end if
End Sub
sub playContent()
content = m.buttons.content
if content <> invalid then
m.video.content = content
m.video.visible = false
m.PlayerTask = CreateObject("roSGNode", "PlayerTask")
m.PlayerTask.observeField("state", "taskStateChanged")
m.PlayerTask.video = m.video
m.PlayerTask.control = "RUN"
end if
end sub
sub taskStateChanged(event as Object)
print "Player: taskStateChanged(), id = "; event.getNode(); ", "; event.getField(); " = "; event.getData()
state = event.GetData()
if state = "done" or state = "stop"
exitPlayer()
end if
end sub
' on Button press handler
Sub onItemSelected()
' first button is Play
if m.top.itemSelected = 0
m.videoPlayer = CreateObject("roSGNode", "Video")
m.videoPlayer.id="videoPlayer"
m.videoPlayer.translation="[0, 0]"
m.videoPlayer.width="1280"
m.videoPlayer.height="720"
m.videoPlayer.content = m.top.content
'show video player
m.top.AppendChild(m.videoPlayer)
m.videoPlayer.visible = true
m.videoPlayer.setFocus(true)
m.videoPlayer.control = "play"
m.videoPlayer.observeField("state", "OnVideoPlayerStateChange")
m.videoPlayer.observeField("visible", "onVideoVisibleChange")
end if
End Sub
' Content change handler
Sub OnContentChange()
m.description.content = m.top.content
m.description.Description.width = "770"
m.poster.uri = m.top.content.hdBackgroundImageUrl
m.background.uri = m.top.content.hdBackgroundImageUrl
End Sub
'///////////////////////////////////////////'
' Helper function convert AA to Node
Function ContentList2SimpleNode(contentList as Object, nodeType = "ContentNode" as String) as Object
result = createObject("roSGNode",nodeType)
if result <> invalid
for each itemAA in contentList
item = createObject("roSGNode", nodeType)
item.setFields(itemAA)
result.appendChild(item)
end for
end if
return result
End Function
Function OnkeyEvent(key, press) as Boolean
? ">>> Details >> OnkeyEvent"
result = false
if press AND key = "back" AND m.videoPlayer <> invalid AND m.videoPlayer.visible
m.videoPlayer.visible = false
result = true
end if
return result
End Function
Yet I keep getting these errors
Invalid value for left-side of expression. (runtime error &he4) in pkg:/components/SpringBoard.brs(117) 117: m.description.content = m.top.content
It looks like you have overlooked defining `
m.description
probably in the init() you need to add
m.description = m.top.findNode(“description”)
I managed to get around it
' ********** Copyright 2016 Roku Corp. All Rights Reserved. **********
' 1st function that runs for the scene component on channel startup
sub init()
'To see print statements/debug info, telnet on port 8089
m.Image = m.top.findNode("Image")
m.Details = m.top.findNode("Details")
m.Title = m.top.findNode("Title")
m.Video = m.top.findNode("Video")
m.SpringDetails = m.top.findNode("SpringBoardDetails")
m.LabelList = m.top.findNode("LabelList")
m.CategoryLabel = m.top.findNode("CategoryLabel")
m.RuntimeLabel = m.top.findNode("RuntimeLabel")
m.Video.ObserveField("state","OnVideoPlayerStateChange")
m.Title.font.size = 40
m.CategoryLabel.color = "#333333"
m.Title.color = "#333333"
m.Details.color = "#444444"
m.RuntimeLabel.color = "#333333"
end sub
Sub OnVideoPlayerStateChange()
print "SpringBoard.brs - [OnVideoPlayerStateChange]"
if m.Video.state = "error"
' error handling
m.Video.visible = false
else if m.Video.state = "playing"
' playback handling
else if m.Video.state = "finished"
m.video.visible = false
m.SpringDetails.Visible=true
m.LabelList.setFocus(true)
end if
End Sub
sub onContentChange(event as object)
print "onContentChange"
content = event.getdata()
runtime = content.shortdescriptionline2.toInt()
minutes = runtime \ 60
seconds = runtime MOD 60
m.Image.uri = content.hdposterurl
m.Title.text = content.title
m.Details.text = content.description
x = m.Details.localBoundingRect()
m.RuntimeLabel.text = "Length: " + minutes.toStr() + " minutes " + seconds.toStr() + " seconds"
translation = [m.RuntimeLabel.translation[0], m.Details.translation[1] + x.height + 30]
m.RuntimeLabel.translation = translation
m.CategoryLabel.text = content.categories
ContentNode = CreateObject("roSGNode", "ContentNode")
ContentNode.streamFormat = content.streamformat
ContentNode.url = content.url
ContentNode.Title = content.title
ContentNode.Description = content.Description
ContentNode.ShortDescriptionLine1 = content.title
ContentNode.StarRating = 80
ContentNode.Length = 1972
ContentNode.subtitleConfig = {Trackname: "pkg:/source/CraigVenter.srt" }
m.Video.content = ContentNode
end sub
sub onItemSelected(event as object)
print "onItemSelected"
m.Video.control = "play"
if event.getData() <> 0 then m.Video.seek = m.top.seekposition
m.SpringDetails.visible = false
m.Video.visible = true
m.Video.setFocus(true)
end sub
' Called when a key on the remote is pressed
function onKeyEvent(key as String, press as Boolean) as Boolean
print "in SimpleVideoScene.xml onKeyEvent ";key;" "; press
if press then
if key = "back"
print "------ [back pressed] ------"
if m.Video.visible
m.Video.control = "pause"
m.Video.visible = false
m.SpringDetails.visible = true
position = m.Video.position
if position > 0
if m.LabelList.content.getChildCount() > 1 then m.LabelList.content.removeChildIndex(1)
minutes = position \ 60
seconds = position MOD 60
contentNode = createObject("roSGNode","ContentNode")
contentNode.title = "Resume Video (" + minutes.toStr() + " min " + seconds.toStr() + " sec)"
m.LabelList.content.appendChild(contentNode)
'Write position to registry so that re-opening the channel works
m.global.registryTask.write = {
contentid: m.top.content.episodenumber,
position: position.toStr()
}
m.top.seekposition = position
else
print "Do nothing"
end if
m.LabelList.setFocus(true)
return true
else
return false
end if
else if key = "OK"
print "------- [ok pressed] -------"
else
return false
end if
end if
return false
end function
It wont show the ad as it was stuck on the retrieving screen so I checked what’s wrong with it and this error popped up
Interface not a member of BrightScript Component (runtime error &hf3) in pkg:/components/SpringBoard.brs(46)
Assuming that line 46 is
m.Details.text = content.description
Then I’m going to suggest you pay attention to my earlier reply. good luck.
I added it on this code
' ********** Copyright 2016 Roku Corp. All Rights Reserved. **********
' inits details screen
' sets all observers
' configures buttons for Details screen
Function Init()
? "[DetailsScreen] init"
m.top.observeField("visible", "onVisibleChange")
m.top.observeField("focusedChild", "OnFocusedChildChange")
m.buttons = m.top.findNode("Buttons")
m.Player = m.top.findNode("VideoPlayer")
m.poster = m.top.findNode("Poster")
m.description = m.top.findNode("Description")
m.background = m.top.findNode("Background")
' create buttons
result = []
for each button in ["Play"]
result.push({title : button})
end for
m.buttons.content = ContentList2SimpleNode(result)
End Function
' set proper focus to buttons if Details opened and stops Video if Details closed
Sub onVisibleChange()
? "[DetailsScreen] onVisibleChange"
if m.top.visible = true then
m.buttons.jumpToItem = 0
m.buttons.setFocus(true)
else
m.Player.visible = false
m.Player.control = "stop"
m.poster.uri=""
m.background.uri=""
end if
End Sub
' set proper focus to Buttons in case if return from Video PLayer
Sub OnFocusedChildChange()
if m.top.isInFocusChain() and not m.buttons.hasFocus() and not m.Player.hasFocus() then
m.buttons.setFocus(true)
end if
End Sub
' set proper focus on buttons and stops video if return from Playback to details
Sub onVideoVisibleChange()
if m.Player.visible = false and m.top.visible = true
m.buttons.setFocus(true)
m.Player.control = "stop"
end if
End Sub
' event handler of Video player msg
Sub OnVideoPlayerStateChange()
if m.Player.state = "error"
' error handling
m.Player.visible = false
else if m.Player.state = "playing"
playContent()
' playback handling
else if m.Player.state = "finished"
m.Player.visible = false
end if
End Sub
sub playContent()
content = m.buttons.content
if content <> invalid then
m.video.content = content
m.video.visible = false
m.PlayerTask = CreateObject("roSGNode", "PlayerTask")
m.PlayerTask.observeField("state", "taskStateChanged")
m.PlayerTask.video = m.video
m.PlayerTask.control = "RUN"
end if
end sub
' on Button press handler
Sub onItemSelected()
' first button is Play
if m.top.itemSelected = 0
m.Player = CreateObject("roSGNode", "Video")
m.Player.id="videoPlayer"
m.Player.translation="[0, 0]"
m.Player.width="1280"
m.Player.height="720"
m.Player.content = m.top.content
'show video player
m.top.AppendChild(m.videoPlayer)
m.Player.visible = true
m.Player.setFocus(true)
m.Player.control = "play"
m.Player.observeField("state", "OnVideoPlayerStateChange")
m.Player.observeField("visible", "onVideoVisibleChange")
end if
End Sub
' Content change handler
Sub OnContentChange()
m.description.content = m.top.content
m.description.Description.width = "770"
m.Player.content = m.top.content
m.top.streamUrl = m.top.content.url
m.poster.uri = m.top.content.hdBackgroundImageUrl
m.background.uri = m.top.content.hdBackgroundImageUrl
End Sub
'///////////////////////////////////////////'
' Helper function convert AA to Node
Function ContentList2SimpleNode(contentList as Object, nodeType = "ContentNode" as String) as Object
result = createObject("roSGNode",nodeType)
if result <> invalid
for each itemAA in contentList
item = createObject("roSGNode", nodeType)
item.setFields(itemAA)
result.appendChild(item)
end for
end if
return result
End Function
I keep geting this error
Current Function: 070: sub playContent() 071: content = m.buttons.content 072: if content <> invalid then 073:* m.video.content = content 074: m.video.visible = false 075: 076: m.PlayerTask = CreateObject(“roSGNode”, “PlayerTask”) 077: m.PlayerTask.observeField(“state”, “taskStateChanged”) Invalid value for left-side of expression. (runtime error &he4) in pkg:/components/screens/DetailsScreen/DetailsScreen.brs(73) 073: m.video.content = content
I fixed that problem by reworking PlayerTask
Library "Roku_Ads.brs"
sub init()
m.top.functionName = "playContentWithAds"
m.top.id = "PlayerTask"
end sub
sub playContentWithAds()
' `view` is the node under which RAF should display its UI (passed as 3rd argument of showAds())
view = videoPlayer.getParent()
RAF = Roku_Ads()
'RAF.clearAdBufferScreenLayers() ' in case it was set earlier
'RAF.enableAdBufferMessaging(true, true) ' could have been cleared by custom screen
'RAF.setAdBufferScreenContent({})
content = video.content
RAF.setAdUrl(content.ad_url)
' for generic measurements api
RAF.enableAdMeasurements(true)
RAF.setContentGenre(content.categories) 'if unset, ContentNode has it as []
RAF.setContentLength(content.length)
' log tracking events
' logObj = {
' log : Function(evtType = invalid as Dynamic, ctx = invalid as Dynamic)
' if GetInterface(evtType, "ifString") <> invalid
' print "*** tracking event " + evtType + " fired."
' if ctx.companion = true then
' print "***** companion = true"
' end if
' if ctx.errMsg <> invalid then print "***** Error message: " + ctx.errMsg
' if ctx.adIndex <> invalid then print "***** Ad Index: " + ctx.adIndex.ToStr()
' if ctx.ad <> invalid and ctx.ad.adTitle <> invalid then print "***** Ad Title: " + ctx.ad.adTitle
' else if ctx <> invalid and ctx.time <> invalid
' print "*** checking tracking events for ad progress: " + ctx.time.ToStr()
' end if
' End Function
' }
' logFunc = Function(obj = Invalid as Dynamic, evtType = invalid as Dynamic, ctx = invalid as Dynamic)
' obj.log(evtType, ctx)
' End Function
' RAF.setTrackingCallback(logFunc, logObj)
adPods = RAF.getAds() 'array of ad pods
keepPlaying = true 'gets set to `false` when showAds() was exited via Back button
' show the pre-roll ads, if any
if adPods <> invalid and adPods.count() > 0
keepPlaying = RAF.showAds(adPods, invalid, view)
end if
port = CreateObject("roMessagePort")
if keepPlaying then
videoPlayer.observeField("position", port)
videoPlayer.observeField("state", port)
videoPlayer.visible = true
videoPlayer.control = "play"
videoPlayer.setFocus(true) 'so we can handle a Back key interruption
end if
curPos = 0
adPods = invalid
isPlayingPostroll = false
while keepPlaying
msg = wait(0, port)
if type(msg) = "roSGNodeEvent"
if msg.GetField() = "position" then
' keep track of where we reached in content
curPos = msg.GetData()
' check for mid-roll ads
adPods = RAF.getAds(msg)
if adPods <> invalid and adPods.count() > 0
print "PlayerTask: mid-roll ads, stopping video"
'ask the video to stop - the rest is handled in the state=stopped event below
videoPlayer.control = "stop"
end if
else if msg.GetField() = "state" then
curState = msg.GetData()
print "PlayerTask: state = "; curState
if curState = "stopped" then
if adPods = invalid or adPods.count() = 0 then
exit while
end if
print "PlayerTask: playing midroll/postroll ads"
keepPlaying = RAF.showAds(adPods, invalid, view)
adPods = invalid
if isPlayingPostroll then
exit while
end if
if keepPlaying then
print "PlayerTask: mid-roll finished, seek to "; stri(curPos)
videoPlayer.visible = true
videoPlayer.seek = curPos
videoPlayer.control = "play"
videoPlayer.setFocus(true) 'important: take the focus back (RAF took it above)
end if
else if curState = "finished" then
print "PlayerTask: main content finished"
' render post-roll ads
adPods = RAF.getAds(msg)
if adPods = invalid or adPods.count() = 0 then
exit while
end if
print "PlayerTask: has postroll ads"
isPlayingPostroll = true
' stop the video, the post-roll would show when the state changes to "stopped" (above)
videoPlayer.control = "stop"
end if
end if
end if
end while
print "PlayerTask: exiting playContentWithAds()"
end sub
Now I got this problem
016: sub playContentWithAds() 017: 018: 019: ’ view is the node under which RAF should display its UI (passed as 3rd argument of showAds()) 020:* view = videoPlayer.getParent() 021: 022: RAF = Roku_Ads() 023: 'RAF.clearAdBufferScreenLayers() ’ in case it was set earlier 024: 'RAF.enableAdBufferMessaging(true, true) ’ could have been cleared by custom screen ‘Dot’ Operator attempted with invalid BrightScript Component or interface reference. (runtime error &hec) in pkg:/components/PlayerTask.brs(20) 020: view = videoPlayer.getParent() Backtrace: #0 Function playcontentwithads() As Void file/line: pkg:/components/PlayerTask.brs(20)