Customer Sign In

upLynk

Testing upLynk Content on Roku

Tutorial thumbnail

Summary Modify the existing “simplevideoplayer” example channel from Roku’s Developer SDK to play your upLynk content.

Skill level required Basic familiarity with scripting languages

Time to complete 15 minutes

Things you’ll need
  • Roku Player in developer mode, connected to a display
  • Roku Developer SDK
  • An upLynk Playback URL for an asset that has had DRM disabled. (See Embedding the upLynk Player Part 2 for a walkthrough on how to disable DRM.)

Introduction

The Roku family of streaming set-top players support playback of upLynk content. Roku devices are a great way to reach subscribers wanting to view your content in the comfort of their living room, etc. We will modify the existing “simplevideoplayer” example channel from Roku’s Developer SDK to play your upLynk content.

Step 1. Edit appMain.brs to play your test asset

Using your text editor locate an open appMain.brs. It is located in the source directory of the simplevideoplayer example channel. In our version of the Roku SDK its path is:

[roku_sdk_root]/examples/source/simplevideoplayer/source/appMain.brs

You can ignore the majority of the code in this channel for now. The code in red suggests additions or edits you should make to your appMain.brs.

' ********************************************************************
' **  Sample PlayVideo App
' **  Copyright (c) 2009 Roku Inc. All Rights Reserved.
' ********************************************************************

Sub Main(args As Dynamic)
    'initialize theme attributes like titles, logos and overhang color
    initTheme()

    if type(args) = "roAssociativeArray" and type(args.url) = "roString" then
        displayVideo(args)
    end if
    print "Type args = "; type(args)
    print "Type args.url = "; type(args.url)

    'has to live for the duration of the whole app to prevent flashing
    'back to the roku home screen.
    screenFacade = CreateObject("roPosterScreen")
    screenFacade.show()

    itemMpeg4 = {   ContentType:"episode"
               SDPosterUrl:"file://pkg:/images/DanGilbert.jpg"
               HDPosterUrl:"file://pkg:/images/DanGilbert.jpg"
               IsHD:False
               HDBranded:False
               ShortDescriptionLine1:"Dan Gilbert asks, Why are we happy?"
               ShortDescriptionLine2:""
               Description:"Harvard psychologist Dan Gilbert says our beliefs about what will make us happy are often wrong -- a premise he supports with intriguing research, and explains in his accessible and unexpectedly funny book, Stumbling on Happiness."
               Rating:"NR"
               StarRating:"80"
               Length:1280
               Categories:["Technology","Talk"]
               Title:"Dan Gilbert asks, Why are we happy?"
               }

    itemVenter = { ContentType:"episode"
               SDPosterUrl:"file://pkg:/images/CraigVenter-2008.jpg"
               HDPosterUrl:"file://pkg:/images/CraigVenter-2008.jpg"
               IsHD:False
               HDBranded:False
               ShortDescriptionLine1:"Can we create new life out of our digital universe?"
               ShortDescriptionLine2:""
               Description:"He walks the TED2008 audience through his latest research into fourth-generation fuels -- biologically created fuels with CO2 as their feedstock. His talk covers the details of creating brand-new chromosomes using digital technology, the reasons why we would want to do this, and the bioethics of synthetic life. A fascinating Q&A with TED's Chris Anderson follows."
               Rating:"NR"
               StarRating:"80"
               Length:1972
               Categories:["Technology","Talk"]
               Title:"Craig Venter asks, Can we create new life out of our digital universe?"
               }

    item = {   ContentType:"episode"
               SDPosterUrl:"file://pkg:/images/BigBuckBunny.jpg"
               HDPosterUrl:"file://pkg:/images/BigBuckBunny.jpg"
               IsHD:true
               HDBranded:true
               ShortDescriptionLine1:"Big Buck Bunny"
               ShortDescriptionLine2:""
               Description:"Big Buck Bunny is being served using a Wowza server running on Amazon EC2 cloud services. The video is transported via HLS HTTP Live Streaming. A team of small artists from the Blender community produced this open source content..."
               Rating:"NR"
               StarRating:"80"
               Length:600
               Categories:["Technology","Cartoon"]
               Title:"Big Buck Bunny"
            }

    'showSpringboardScreen(itemVenter) 'comment out this line 
    'showSpringboardScreen(itemMpeg4)  'uncomment this line and comment out the next to see the old mpeg4 example
    showSpringboardScreen(item)       'uncomment this line to see the BigBuckBunny example

    'exit the app gently so that the screen doesn't flash to black
    screenFacade.showMessage("")
    sleep(25)
End Sub

'*************************************************************
'** Set the configurable theme attributes for the application
'**
'** Configure the custom overhang and Logo attributes
'*************************************************************

Sub initTheme()

    app = CreateObject("roAppManager")
    theme = CreateObject("roAssociativeArray")

    theme.OverhangPrimaryLogoOffsetSD_X = "72"
    theme.OverhangPrimaryLogoOffsetSD_Y = "15"
    theme.OverhangSliceSD = "pkg:/images/Overhang_BackgroundSlice_SD43.png"
    theme.OverhangPrimaryLogoSD  = "pkg:/images/Logo_Overhang_SD43.png"

    theme.OverhangPrimaryLogoOffsetHD_X = "123"
    theme.OverhangPrimaryLogoOffsetHD_Y = "20"
    theme.OverhangSliceHD = "pkg:/images/Overhang_BackgroundSlice_HD.png"
    theme.OverhangPrimaryLogoHD  = "pkg:/images/Logo_Overhang_HD.png"

    'this is an optional theme attribute. the default subtitle color is yellow.
    theme.SubtitleColor = "#dc00dc"

    app.SetTheme(theme)

End Sub


'*************************************************************
'** showSpringboardScreen()
'*************************************************************

Function showSpringboardScreen(item as object) As Boolean
    port = CreateObject("roMessagePort")
    screen = CreateObject("roSpringboardScreen")

    print "showSpringboardScreen"

    screen.SetMessagePort(port)
    screen.AllowUpdates(false)
    if item <> invalid and type(item) = "roAssociativeArray"
        screen.SetContent(item)
    endif

    screen.SetDescriptionStyle("generic") 'audio, movie, video, generic
                                        ' generic+episode=4x3,
    screen.ClearButtons()
    screen.AddButton(1,"Play")
    screen.AddButton(2,"Go Back")
    screen.SetStaticRatingEnabled(false)
    screen.AllowUpdates(true)
    screen.Show()

    downKey=3
    selectKey=6
    while true
        msg = wait(0, screen.GetMessagePort())
        if type(msg) = "roSpringboardScreenEvent"
            if msg.isScreenClosed()
                print "Screen closed"
                exit while
            else if msg.isButtonPressed()
                    print "Button pressed: "; msg.GetIndex(); " " msg.GetData()
                    if msg.GetIndex() = 1
                         displayVideo("")
                    else if msg.GetIndex() = 2
                         return true
                    endif
            else
                print "Unknown event: "; msg.GetType(); " msg: "; msg.GetMessage()
            endif
        else
            print "wrong type.... type=";msg.GetType(); " msg: "; msg.GetMessage()
        endif
    end while


    return true
End Function


'*************************************************************
'** displayVideo()
'*************************************************************

Function displayVideo(args As Dynamic)
    print "Displaying video: "
    p = CreateObject("roMessagePort")
    video = CreateObject("roVideoScreen")
    video.setMessagePort(p)

    bitrates  = [0]          ' 0 = no dots, adaptive bitrate
    'bitrates  = [348]    ' <500 Kbps = 1 dot
    'bitrates  = [664]    ' <800 Kbps = 2 dots
    'bitrates  = [996]    ' <1.1Mbps  = 3 dots
    'bitrates  = [2048]    ' >=1.1Mbps = 4 dots


    'comment out this entry and uncomment the big buck bunny entry
    'Swap the commented values below to play different video clips...
    'urls = ["http://video.ted.com/talks/podcast/CraigVenter_2008_480.mp4"]
    'qualities = ["HD"]
    'StreamFormat = "mp4"
    'title = "Craig Venter Synthetic Life"
    'srt = "file://pkg:/source/craigventer.srt"

    'urls = ["http://video.ted.com/talks/podcast/DanGilbert_2004_480.mp4"]
    'qualities = ["HD"]
    'StreamFormat = "mp4"
    'title = "Dan Gilbert asks, Why are we happy?"

    ' Apple's HLS test stream
    'urls = ["http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"]
    'qualities = ["SD"]
    'streamformat = "hls"
    'title = "Apple BipBop Test Stream"


    ' Uncomment this entry. Replace urls with the red urls assignment using your Playback URL from the upLynk CMS.
    ' Change qualities to HD.  Add the srt = "" to avoid a missing assignment error in Roku's code.
    ' Big Buck Bunny test stream from upLynk
    urls = ["http://content.uplynk.com/your_playback_url.m3u8"]
    qualities = ["HD"]
    streamformat = "hls"
    title = "Big Buck Bunny"
    srt = "" ' Added this line to work around a Roku channel bug

    if type(args) = "roAssociativeArray"
        if type(args.url) = "roString" and args.url <> "" then
            urls[0] = args.url
        end if
        if type(args.StreamFormat) = "roString" and args.StreamFormat <> "" then
            StreamFormat = args.StreamFormat
        end if
        if type(args.title) = "roString" and args.title <> "" then
            title = args.title
        else
            title = ""
        end if
        if type(args.srt) = "roString" and args.srt <> "" then
            srt = args.StreamFormat
        else
            srt = ""
        end if
    end if

    videoclip = CreateObject("roAssociativeArray")
    videoclip.StreamBitrates = bitrates
    videoclip.StreamUrls = urls
    videoclip.StreamQualities = qualities
    videoclip.StreamFormat = StreamFormat
    videoclip.Title = title
    ' Explicitly declare the Switching Strategy
    videoclip.SwitchingStrategy = "full-adaptation"
    print "srt = ";srt
    if srt <> invalid and srt <> "" then
        videoclip.SubtitleUrl = srt
    end if

    video.SetContent(videoclip)
    ' The following lines of code work around Roku's HTTPS request issues
    video.SetCertificatesFile("common:/certs/ca-bundle.crt")
    video.SetCertificatesDepth(3)
    video.show()

    lastSavedPos   = 0
    statusInterval = 10 'position must change by more than this number of seconds before saving

    while true
        msg = wait(0, video.GetMessagePort())
        if type(msg) = "roVideoScreenEvent"
            if msg.isScreenClosed() then 'ScreenClosed event
                print "Closing video screen"
                exit while
            else if msg.isPlaybackPosition() then
                nowpos = msg.GetIndex()
                if nowpos > 10000

                end if
                if nowpos > 0
                    if abs(nowpos - lastSavedPos) > statusInterval
                        lastSavedPos = nowpos
                    end if
                end if
            else if msg.isRequestFailed()
                print "play failed: "; msg.GetMessage()
            else
                print "Unknown event: "; msg.GetType(); " msg: "; msg.GetMessage()
            endif
        end if
    end while
End Function
        

Step 2. Package up your Roku Test Channel

To package your channel create a .ZIP archive with the contents of the simplevideoplayer directory. DO NOT zip the directory itself, only the contents. For example, the manifest file needs to be in the base path of the ZIP archive, not included in a folder.

Step 3. Install your channel on your Roku Player

We need the IP Address of our device in order to browse to the development channel install page. On our Roku2 device the IP Address can be found in the Roku Player Settings Channel by selecting "About".

Open your browser the IP Address of your Roku Player. The installation screen will load. Click browse and find the .ZIP archive you created.

If you don't see the installation screen when you browse to the IP Address of your Roku Player, you may need to enable developer mode. Refer to the Roku Developer Documentation, to enable developer mode on your version of the device.

Congratulations!

Now you're ready to move on to building your production channel and create or modify your content management system to serve up playback URLs for your content. Don't forget to consider authorization tokens for securing access to your content. You may want to read through our tutorial Embedding the upLynk Player Part 3, which walks you through generating authorization tokens for playback URLs.