End of play
What you learn​
You're instantiating DIVA Player in your Roku app and relying on DIVA Back Office as the video streaming source.
The goal of this article is to build the simplest Roku app to stream a video from the DIVA Back Office with, at the end, some additional content.

Before starting​
-
Ensure
Diva Player lib
andDIVA Back Office Adapter lib
downloaded (Setup > Step 13). -
Ask your video engineers team the
<video id>
and the related<settings URL>
. -
According to your End-of-Play experience, ensure the VideoMetadata contains the End-of-Play properties for:
-
Ensure the VideoMetadata contains the endOfPlay properties.
Instantiation​
Write the Basic instantiation code. There's no additional code to write, unless you need to overwrite the autoplay behavior that the VideoMetadata contains and overwrite Disable Autoplay in Settings file.
End of play configuration​
Write the App() function to read the VideoMetadata as in the folllowing example, and set the endOfPlay
properties:
{
"countdownToAutoplay": <number> 'milliseconds, default 10000, 0 or negative means disabled,
}
In the settings file, the general section must contain "timeToDisableAutoplay": 5400000, like in the following example:
{
...
"general": {
"timeToDisableAutoplay": <number> 'milliseconds, default 0, 0 or negative means disabled
}
}
Working sample code (.brs).​
sub init()
initScreen()
end sub
sub initScreen()
loadLibs()
end sub
sub loadLibs()
'Init of loading the Diva Player lib
loadPlayer()
'Init of loading the DIVA Back Office Adapter lib
loadBOAdapter()
end sub
sub loadPlayer()
' Creates the ComponentLibrary (the DivaPlayerSDK in this case)
m.divaPlayerSDK = CreateObject("roSGNode", "ComponentLibrary")
m.divaPlayerSDK.id = "DivaPlayerSDK"
m.divaPlayerSDK.uri = "<Diva Player lib path>"
' Adding the ComponentLibrary node to the scene will start the download of the library
m.top.appendChild(m.divaPlayerSDK)
m.divaPlayerSDK.observeField("loadStatus", "onDivaPlayerLoadStatusChanged")
end sub
sub loadBOAdapter()
' Creates the ComponentLibrary (the DIVA Back Office Adapter in this case)
m.divaBOAdapter = CreateObject("roSGNode", "ComponentLibrary")
m.divaBOAdapter.id = "DivaBOAdapter"
m.divaBOAdapter.uri = "<DIVA Back Office Adapter lib path>"
' Adding the ComponentLibrary node to the scene will start the download of the library
m.top.appendChild(m.divaBOAdapter)
m.divaBOAdapter.observeField("loadStatus", "onDivaPlayerLoadStatusChanged")
end sub
sub onDivaPlayerLoadStatusChanged()
if m.divaPlayerSDK.loadStatus = "ready"
if m.divaBOAdapter <> invalid and m.divaBOAdapter.loadStatus = "ready"
launchBOAdapter()
end if
end if
end sub
sub launchBOAdapter()
m.boAdapterNode = CreateObject("roSGNode", "DivaBOAdapter:DivaBOAdapter")
m.boAdapterNode.initData = {
"settingId": "<settings URL>"
"videoId": "<video id>"
"dictionaryId": "en_GB"
}
' Observe DIVA Back Office Adapter DiveLaunchParams
m.boAdapterNode.observeField("divaLaunchParams", "onBOAdapterDivaLaunchParamsHandler")
' Observe DIVA Back Office Adapter Dictionary
m.boAdapterNode.observeField("dictionary", "onBOAdapterDictionaryHandler")
' Observe DIVA Back Office Adapter VideoMetaDataNode
m.boAdapterNode.observeField("videoDataNode", "onBOAdapterVideoDataNodeHandler")
' Observe DIVA Back Office Adapter Entitlement Data
m.boAdapterNode.observeField("entitlementData", "onEntitlementDataHandler")
' Observe DIVA Back Office Adapter Settings
m.boAdapterNode.observeField("settingsNode", "onSettingsHandler")
' Observe DIVA Back Office Adapter when all necessary data for launching the Diva Player was loaded
' After getting this event you can launch the Diva Player
m.boAdapterNode.observeField("boAdapterReady", "onBOAdapterReady")
'Diva Player Utils Node
m.dpUtilsNode = getDivaPlayerUtilsNode()
' Observe Diva Player exit call
m.dpUtilsNode.observeField("divaPlayerExit", "onDivaPlayerExitHandler")
' Observe Diva Player actions
' Observe Diva Metadata update call
m.dpUtilsNode.observeField("metaDataUpdate", "onMetadataUpdateHandler")
' Get a request from the Diva Player on making the Entitlement request to the BE
m.dpUtilsNode.observeField("entitlementRequest", "onEntitlementHandler")
' Getting Diva Player Node
m.divaPlayer = m.dpUtilsNode.callFunc("getPlayer")
' Adding Diva Player for the visualisation
screensStack = m.getScreensStack()
screensStack.appendChild(m.divaPlayer)
m.divaPlayer.setFocus(true)
end sub
function getDivaPlayerUtilsNode() as dynamic
if NOT isValid(m.dpUtilsNode)
m.dpUtilsNode = CreateObject("roSGNode", "DivaPlayerSDK:DPUtilsNode")
end if
return m.dpUtilsNode
end function
sub onBOAdapterDivaLaunchParamsHandler(evt as dynamic)
data = evt.getData()
' Setup Diva Player launch parameters
m.dpUtilsNode.callFunc("setLaunchParams", data)
end sub
sub onBOAdapterDictionaryHandler(evt as dynamic)
data = evt.getData()
' Setup Diva Player dictionary
m.dpUtilsNode.callFunc("setDictionary", data)
end sub
sub onBOAdapterVideoDataNodeHandler(evt as dynamic)
data = evt.getData()
data.addFields({
"behaviour": {
"endOfPlay": {
"countdownToAutoplay": 20000 'milliseconds, default 10000, 0 or negative means disabled
},
}
})
' Setup Diva Player Metadata
m.dpUtilsNode.callFunc("setMetaData", data)
end sub
sub onSettingsHandler(evt as dynamic)
data = evt.getData()
if data.general = invalid
data.addFields({general:{}})
end if
general = data.general
general.AddReplace("timeToDisableAutoplay", 5400000) 'milliseconds, default 0, 0 or negative means disabled
data.general = general
' Setup Diva Player Settings
m.dpUtilsNode.callFunc("setSettings", data)
end sub
sub onEntitlementDataHandler(evt as dynamic)
' Set to the Diva Player response from Entitlement Service
m.dpUtilsNode.callFunc("setEntitlementData", evt.getData())
end sub
sub onBOAdapterReady(evt as dynamic)
m.dpUtilsNode.callFunc("runPlayer")
end sub
sub destroyBOAdapter()
if m.boAdapterNode <> invalid
m.boAdapterNode.unobserveField("error")
m.boAdapterNode.destroy = true
m.boAdapterNode = invalid
end if
end sub
sub onMetadataUpdateHandler(evt as dynamic)
data = evt.getData()
m.boAdapterNode.requestMetaDataUpdate = data
end sub
sub onEntitlementHandler(evt as dynamic)
data = evt.getData()
m.boAdapterNode.entitlementRequest = data
end sub
sub onDivaPlayerExitHandler()
m.dpUtilsNode = invalid
'Destroy DIVA Back Office Adapter Node
destroyBOAdapter()
end sub