Roku Developer Program

Developers and content creators—a complete solution for growing an audience directly.
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Level 10

Help With Deep Linking

Having trouble getting deep linking to work in my Roku channel.

I've done a lot of reading on the Roku SDK (particularly their Deep Linking Doc) and a variety of forums. However, I'm just not making any headway.

Currently, my channel uses the Simple Grid with Details template, which serves video content via RSS files.

Here's the beginning of my main.brs file:

sub Main(args as Dynamic) as Void


if (args.mediaType <> invalid) and (args.contentID <> invalid)
if (args.mediaType = "movie" or args.mediaType = "episode" or args.mediaType = "short-form" or args.mediaType = "series" or args.mediaType = "special")
   'play content directly
   'deep linking issue such as a contentID not matching any content in the partner's catalog
   'display an appropriate error message for the user
end if
'launch channel normally
end if

end sub

Sub RunUserInterface()
screen = CreateObject("roSGScreen")
scene = screen.CreateScene("HomeScene")
port = CreateObject("roMessagePort")

oneRow = GetApiArray1()
twoRow = GetApiArray2()
threeRow = GetApiArray3()
fourRow = GetApiArray4()

list = [
   TITLE : "Watch Our Services Live"
   ContentList : oneRow
   TITLE : "Without Ceasing: A Series On Prayer"
   ContentList : twoRow
   TITLE : "The Least Of These: Hope, Help, Heal"
   ContentList : threeRow
   TITLE : "The Bible: Learning To Live It"
   ContentList : fourRow

scene.gridContent = ParseXMLContent(list)

while true
   msg = wait(0, port)
   print "------------------"
   print "msg = "; msg
end while

if screen <> invalid then
   screen = invalid
end if
End Sub

Function ParseXMLContent(list As Object)
RowItems = createObject("RoSGNode","ContentNode")

for each rowAA in list
'for index = 0 to 1
   row = createObject("RoSGNode","ContentNode")
   row.Title = rowAA.Title

   for each itemAA in rowAA.ContentList
       item = createObject("RoSGNode","ContentNode")
       ' We don't use item.setFields(itemAA) as doesn't cast
streamFormat to proper value
       for each key in itemAA
           item[key] = itemAA[key]
       end for
   end for
end for

return RowItems
End Function

Function GetApiArray1()
url = CreateObject("roUrlTransfer")
rsp = url.GetToString()

responseXML = ParseXML(rsp)
responseXML = responseXML.GetChildElements()
responseArray = responseXML.GetChildElements()

result = []

for each xmlItem in responseArray
   if xmlItem.getName() = "item"
       itemAA = xmlItem.GetChildElements()
       if itemAA <> invalid
           item = {}
           for each xmlItem in itemAA
               item[xmlItem.getName()] = xmlItem.getText()
               if xmlItem.getName() = "media:content"
          = {url : xmlItem.url}
                   item.url = xmlItem.getAttributes().url
                   item.streamFormat = "hls"

                   mediaContent = xmlItem.GetChildElements()
                   for each mediaContentItem in mediaContent
                       if mediaContentItem.getName() =
                           item.HDPosterUrl =
                           item.hdBackgroundImageUrl =
                       end if
                   end for
               end if
           end for
       end if
   end if
end for

return result
End Function

Then an example of an entry in my RSS feed is:

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:media="" version="2.0">
   <title>Bright Light Church</title>
   <link />
   <description>Live and Archived Bible Studies</description>
   <pubDate>Wed, 26 Apr 2017 12:00:00 PT</pubDate>
   <category>TV &amp; Film</category>
       <title>The Bible</title>
   <title>Prayer Pressure</title>
   <description>David brings big requests to God and receives a big revelation.</description>
   <pubDate>Sun, 05 Mar 2017 10:15:00 PT</pubDate>
   <guid isPermaLink="false">ch001</guid>
   <media:content channels="2" type="special" isDefault="true" id="ch001"  url="">
   <media:description>David brings big requests to God and receives a big revelation.</media:description>
   <media:keywords>church, bible study, expository sermon</media:keywords>
   <media:thumbnail url="" />
   <media:title>Prayer Pressure</media:title>

When I use the Deep Link Tester it just opens my channel to the home screen, it doesn't launch the specific video.

Any insight would be appreciated.
0 Kudos
5 Replies
Level 11

Re: Help With Deep Linking

where you have 'play content directly' you need to replace with code to launch the player, most likely the same way it would've been launched had the user navigated to that video, so that when they exit the video, they will land on a page where they could re-launch the same video.  I'm not familiar with "Simple Grid with Details template" but you may need to customize so that it can receive the video id as passed in on the deeplink and launch the appropriate video.
hope it may help
0 Kudos
Level 10

Re: Help With Deep Linking

Thanks for the reply. I guess I'm just not grasping this concept. I've been trying to follow the SDK and the various suggestions on this forum, Stack Overflow, etc, yet nothing is really yielding results. 

I don't get why Roku's sample channels don't have Deep Linking built in for us to see when they're going to require it of every public channel. 
0 Kudos
Level 11

Re: Help With Deep Linking

do you have a link to the sample channel you're using? 
0 Kudos
Level 10

Re: Help With Deep Linking

0 Kudos
Level 7

Re: Help With Deep Linking

I almost agree with the first answer of joetesta. When your channel start and get the list of video from your feed, you need to index all of your video. When you finish, you look for video's indexed id that matches the args.contentID (and args.mediaType). Once you find out that video, just start it as normally.
By indexing, you are able to support the read/write video bookmark which is also a requirement for every video longer than 15s when publishing the channel.
0 Kudos