This getting started guide gets you familiar with Roku and the THEOplayer Roku SDK. Upon completion of this guide, you'll have integrated the THEOplayer SDK in Roku's Hello World! sample project, configured a video, and used an event listener.
If you're looking for our Roku API reference, you can find them here.
Consider using the quickstart guide if you're looking for a recap because you already went through this article.
Introduction
Building channel
The THEOplayer Roku SDK is designed specifically for the Roku platform. It is a custom video component allowing your channel to embed the video player easily.
This guide is created to help you get started with including the THEOplayer Roku SDK inside a Roku channel. This article will show you how to include, load, and create an instance of the THEOplayer Roku SDK. It will also explain how to play a video, and how you can add an event listener.
To start this guide you need the following items:
Roku keeps all devices up-to-date by issuing automatic updates. We aim to support all the up to date Roku devices. At the moment the newest Roku OS version is 11.5 (Oct 2022).
There are certification updates that may affect THEOplayer and channels using THEOplayer. Updates regarding certification are announced two times a year. Every update is announced 6 months before the date of implementation.
After announcing changes, we may need to update the THEOplayer Roku SDK to fulfill these new certification criteria.
Our main focus is to support the two latest versions of Roku OS. Support for older versions might be limited.
In this section, we will go through the process of creating a Roku channel and using the THEOplayer Roku SDK.
First of all, we need to create a Roku channel. You can either create a new Roku project in eclipse or start from the Roku “Hello world” channel example (Here is some extra documentation about the “hello world” example).
When you have created a Roku channel, you can copy the THEOplayer Roku SDK (“THEOplayerSDK.pkg“) into the directory of your project.
To include the THEOplayer SDK into the channel, follow these steps:
Load the THEOplayer SDK as a component library.
To do this we have to add the following line into the helloworld.xml
file, between the <childen>
tags.
<ComponentLibrary id="THEOsdk" uri="pkg:/THEOplayer.pkg"/>
It is worth mentioning that the "URI" field can also be an HTTPS link to the THEOplayer package. (In Our case, we will add it to the: "pkg:\components\MainScene\MainScene.xml" file.)
Add the THEOplayerContainer group.
We will need this group to append THEOplayer into our channel.
In our case, we will add it to the helloworld.xml
file, next to the <ComponentLibrary>
node.
<Group id="THEOplayerContainer"></Group>
Wait until THEOplayer SDK is loaded.
We just want to be sure that THEOplayer is loaded correctly.
We add the following code to our BrightScript <script>
.
function init()
m.THEOsdk = m.top.findNode("THEOsdk")
m.THEOsdk.observeField("loadStatus", "THEOsdkLoaded")
end function
function THEOsdkLoaded()
' this is the moment when THEOplayer is fully included on your channel
end function
It is worth mentioning that "m" works like the "this" keyword from other languages. "m" keyword points to the current component local namespace. So if you want to have access to variables across different functions inside the same component, use "m" to do so.
After these 3 steps, your helloworld.xml
should resemble the following snippet:
<?xml version="1.0" encoding="utf-8" ?>
<component name="HelloWorld" extends="Scene">
<children>
<ComponentLibrary id="THEOsdk" uri="pkg:/THEOplayer.pkg"/>
<Group id="THEOplayerContainer"></Group>
</children>
<script type="text/brightscript" >
<![CDATA[
function init()
m.THEOsdk = m.top.findNode("THEOsdk")
m.THEOsdk.observeField("loadStatus", "THEOsdkLoaded")
end function
function THEOsdkLoaded()
' this is moment when theo player is fully included to Your channel
end function
]]>
</script>
</component>
When you deploy this app to your local Roku device, it should still be an empty, gray channel.
In this simple example we will create an instance inside the THEOsdkLoaded
function, but remember that once the component library is loaded, you can use it across the whole channel.
There is also no need to load this component again. (In our case we will add it to the "pkg:\components\MainScene\MainScene.brs" file.)
function THEOsdkLoaded()
m.THEOplayer = CreateObject("RoSGNode","THEOsdk:THEOplayer")
m.playerContainer = m.top.findNode("THEOPlayerContainer")
m.playerContainer.appendChild(m.THEOplayer)
end function
When you deploy your project to your local Roku device, the channel should now be a plain black background. (It's now black because it's an empty video player container.)
Make sure your files resemble this:
pkg:/source/main.brs:
sub Main()
print "in showChannelSGScreen"
'Indicate this is a Roku SceneGraph application'
screen = CreateObject("roSGScreen")
m.port = CreateObject("roMessagePort")
screen.setMessagePort(m.port)
'Create a scene and load /components/helloworld.xml'
scene = screen.CreateScene("HelloWorld")
screen.show()
while(true)
msg = wait(0, m.port)
msgType = type(msg)
if msgType = "roSGScreenEvent"
if msg.isScreenClosed() then return
end if
end while
end sub
pkg:/manifest file:
## Channel Details
title=Hello World
major_version=1
minor_version=0
build_version=00001
## Channel Assets
### Main Menu Icons / Channel Poster Artwork
#### Image sizes are FHD: 540x405px | HD: 290x218px | SD: 214x144px
mm_icon_focus_fhd=pkg:/images/channel-poster_fhd.png
mm_icon_focus_hd=pkg:/images/channel-poster_hd.png
mm_icon_focus_sd=pkg:/images/channel-poster_sd.png
### Splash Screen + Loading Screen Artwork
#### Image sizes are FHD: 1920x1080px | HD: 1280x720px | SD: 720x480px
splash_screen_fhd=pkg:/images/splash-screen_fhd.jpg
splash_screen_hd=pkg:/images/splash-screen_hd.jpg
splash_screen_sd=pkg:/images/splash-screen_sd.jpg
splash_color=#000000
splash_min_time=1
pkg:/components/helloworld.xml:
<?xml version="1.0" encoding="utf-8" ?>
<component name="HelloWorld" extends="Scene">
<children>
<ComponentLibrary id="THEOsdk" uri="pkg:/THEOplayerSDK.pkg"/>
<Group id="THEOplayerContainer"></Group>
</children>
<script type="text/brightscript" >
<![CDATA[
function Init()
m.THEOsdk = m.top.findNode("THEOsdk")
m.THEOsdk.observeField("loadStatus", "THEOsdkLoaded")
end function
function THEOsdkLoaded()
m.THEOplayer = CreateObject("RoSGNode","THEOsdk:THEOplayer")
m.playerContainer = m.top.findNode("THEOplayerContainer")
m.playerContainer.appendChild(m.THEOplayer)
end function
]]>
</script>
</component>
Great! You have included the THEOplayer SDK into your channel now! If you run this channel, you will only see a black screen because we did not set any source and we did not start the playback. Follow the next sections to start video playback.
There is an alternative way to include the THEOplayer SDK. You can include the component library using only XML. In this approach, you want to make sure that the component library is fully loaded before including the component into the scene graph.
An example of this approach is demonstrated through our basic-playback-app project on Github.
In this project, MainScene.xml
loads the SDK, and the instance is created through (for example) <THEOsdk:THEOplayer id="VideoPlayerChromefull" controls="true" />
in ChromefullView.xml
.
You need to configure your THEOplayer Roku SDK license value through the following snippet:
m.THEOplayer.configuration = {
"license": "your-license"
}
Add these 3 lines after m.playerContainer.appendChild(m.THEOplayer)
.
Note that you have to replace your-license
with your actual license value as specified on the THEOplayer Development Portal for your THEOplayer Roku SDK.
To play videos using the THEOplayer SDK, we need to take a few steps:
Set a player source. To accomplish this we will edit the THEOsdkLoaded
function. (Added later in the "Using the THEOplayer SDK" section.)
function THEOsdkLoaded()
m.THEOplayer = CreateObject("RoSGNode","THEOsdk:THEOplayer")
m.playerContainer = m.top.findNode("THEOplayerContainer")
m.playerContainer.appendChild(m.THEOplayer)
m.THEOplayer.configuration = {
"license": "your-license"
}
m.THEOplayer.source = {
"sources": [
{
"src": "http://cdn.theoplayer.com/video/star_wars_episode_vii-the_force_awakens_official_comic-con_2015_reel_(2015)/index.m3u8",
"type": "application/x-mpegURL"
}
]
}
end function
Set focus to the THEOplayer SDK to make sure that remote controls will work properly.
function THEOsdkLoaded()
m.THEOplayer = CreateObject("RoSGNode","THEOsdk:THEOplayer")
m.playerContainer = m.top.findNode("THEOplayerContainer")
m.playerContainer.appendChild(m.THEOplayer)
m.THEOplayer.configuration = {
"license": "your-license"
}
m.THEOplayer.source = {
"sources": [
{
"src": "http://cdn.theoplayer.com/video/star_wars_episode_vii-the_force_awakens_official_comic-con_2015_reel_(2015)/index.m3u8",
"type": "application/x-mpegURL"
}
]
}
m.THEOplayer.setFocus(true)
end function
Play a video with the "play" method.
function THEOsdkLoaded()
m.THEOplayer = CreateObject("RoSGNode","THEOsdk:THEOplayer")
m.playerContainer = m.top.findNode("THEOplayerContainer")
m.playerContainer.appendChild(m.THEOplayer)
m.THEOplayer.configuration = {
"license": "your-license"
}
m.THEOplayer.source = {
"sources": [
{
"src": "http://cdn.theoplayer.com/video/star_wars_episode_vii-the_force_awakens_official_comic-con_2015_reel_(2015)/index.m3u8",
"type": "application/x-mpegURL"
}
]
}
m.THEOplayer.setFocus(true)
m.THEOplayer.callFunc("play")
end function
After these 4 steps, your helloworld.xml
file should resemble the following snippet:
<?xml version="1.0" encoding="utf-8" ?>
<component name="HelloWorld" extends="Scene">
<children>
<ComponentLibrary id="THEOsdk" uri="pkg:/THEOplayerSDK.pkg"/>
<Group id="THEOplayerContainer"></Group>
</children>
<script type="text/brightscript" >
<![CDATA[
function Init()
m.THEOsdk = m.top.findNode("THEOsdk")
m.THEOsdk.observeField("loadStatus", "THEOsdkLoaded")
end function
function THEOsdkLoaded()
m.THEOplayer = CreateObject("RoSGNode","THEOsdk:THEOplayer")
m.playerContainer = m.top.findNode("THEOplayerContainer")
m.playerContainer.appendChild(m.THEOplayer)
m.THEOplayer.configuration = {
"license": "your-license"
}
m.THEOplayer.source = {
"sources": [
{
"src": "https://cdn.theoplayer.com/video/star_wars_episode_vii-the_force_awakens_official_comic-con_2015_reel_(2015)/index.m3u8",
"type": "application/x-mpegURL"
}
]
}
m.THEOplayer.setFocus(true)
m.THEOplayer.callFunc("play")
end function
]]>
</script>
</component>
Deploying this app should result in the start-up of your configured video, as demonstrated by the screenshot below.
Adding an event listener in the Roku THEOplayer SDK is straightforward. All you have to do is follow these steps:
Create Callback function
This code will be executed when the event will be propagated. (In this example we will add the function to the helloworld.xml
file.)
function onPlaying(params)
print("I am playing")
print(params)
end function
Add the callback function to the component interface. (In this example we will edit the helloworld.xml
file.)
<?xml version="1.0" encoding="utf-8" ?>
<component name="HelloWorld" extends="Scene">
<interface>
<function name="onPlaying"/>
</interface>
<children>
<ComponentLibrary id="THEOsdk" uri="pkg:/THEOplayerSDK.pkg"/>
<Group id="THEOplayerContainer"></Group>
</children>
</component>
Set a listener and call the addEventListener
method. (In this example we will edit the helloworld.xml
file, and add two lines inside the THEOsdkLoaded
function.)
m.THEOplayer.listener = m.top
m.THEOplayer.callFunc("addEventListener", "playing", "onPlaying")
Now You will be able to see the following output in the debug console. (How to use the debug console in Roku.)
I am playing
<Component: roAssociativeArray> =
{
currentTime: 0
date: "2020-09-08T11:06:09Z"
type: "playing"
}
Check your code and make sure pkg:/components/helloworld.xml
resembles the following snippet:
<?xml version="1.0" encoding="utf-8" ?>
<component name="HelloWorld" extends="Scene">
<interface>
<function name="onPlaying"/>
</interface>
<children>
<ComponentLibrary id="THEOsdk" uri="pkg:/THEOplayerSDK.pkg"/>
<Group id="THEOplayerContainer"></Group>
</children>
<script type="text/brightscript">
<![CDATA[
function Init()
m.THEOsdk = m.top.findNode("THEOsdk")
m.THEOsdk.observeField("loadStatus", "THEOsdkLoaded")
end function
function THEOsdkLoaded()
m.THEOplayer = CreateObject("RoSGNode","THEOsdk:THEOplayer")
m.playerContainer = m.top.findNode("THEOplayerContainer")
m.playerContainer.appendChild(m.THEOplayer)
m.THEOplayer.configuration = {
"license": "your-license"
}
m.THEOplayer.source = {
"sources": [
{
"src": "https://cdn.theoplayer.com/video/star_wars_episode_vii-the_force_awakens_official_comic-con_2015_reel_(2015)/index.m3u8",
"type": "application/x-mpegURL"
}
]
}
m.THEOplayer.setFocus(true)
m.THEOplayer.listener = m.top
m.THEOplayer.callFunc("addEventListener", "playing", "onPlaying")
m.THEOplayer.callFunc("play")
end function
function onPlaying(params)
print("I am playing")
print(params)
end function
]]>
</script>
</component>
In order to remove an event listener, call the line below:
m.THEOplayer.callFunc("removeEventListener", "playing", "onPlaying")
You can put this line anywhere you want.
Just make sure that m.THEOplayer
is used in the proper context. For example, in pkg:/components/helloworld.xml
you can do something like this:
<?xml version="1.0" encoding="utf-8" ?>
<component name="HelloWorld" extends="Scene">
<interface>
<function name="onPlaying"/>
</interface>
<children>
<ComponentLibrary id="THEOsdk" uri="pkg:/THEOplayerSDK.pkg"/>
<Group id="THEOplayerContainer"></Group>
</children>
<script type="text/brightscript">
<![CDATA[
function Init()
m.THEOsdk = m.top.findNode("THEOsdk")
m.THEOsdk.observeField("loadStatus", "THEOsdkLoaded")
end function
function THEOsdkLoaded()
m.THEOplayer = CreateObject("RoSGNode","THEOsdk:THEOplayer")
m.playerContainer = m.top.findNode("THEOplayerContainer")
m.playerContainer.appendChild(m.THEOplayer)
m.THEOplayer.configuration = {
"license": "your-license"
}
m.THEOplayer.source = {
"sources": [
{
"src": "https://cdn.theoplayer.com/video/star_wars_episode_vii-the_force_awakens_official_comic-con_2015_reel_(2015)/index.m3u8",
"type": "application/x-mpegURL"
}
]
}
m.THEOplayer.setFocus(true)
m.THEOplayer.listener = m.top
m.THEOplayer.callFunc("addEventListener", "playing", "onPlaying")
m.THEOplayer.callFunc("play")
end function
function onPlaying(params)
print("I am playing")
print(params)
m.THEOplayer.callFunc("removeEventListener", "playing", "onPlaying")
end function
]]>
</script>
</component>
In this example, the onPlaying
callback will be executed only once,
because we have called removeEventListener
inside of the onPlaying
function.
Use this section if you are already familiar with setting up the THEOplayer Roku SDK.
hello-world
sample project.hello-world
project.source/components/helloworld.xml
with this gist.license
in your updated source/components/helloworld.xml
with your actual license value according to https://portal.theoplayer.com.The following video playlist demonstrates these six steps.
Consider the following actions to improve your knowledge on the THEOplayer Roku SDK: