Youtube contents in a private channel ?

Hello All,

I plan to make a private channel. Some of contents are from youtube. Is it possible technically and legal to include Youtube contents in a private channel. Thanks.

I believe it is very much legal to create a private channel that include your own videos.

“bking007” wrote:
I believe it is very much legal to create a private channel that include your own videos.Legal, yes. However it might be a violation of the YouTube Terms of Service to use their hosting in a manner not approved by them. They give the hosting away for free because they can attach ads to videos displayed on the website and embedded on other sites. Some devices, like Apple TV, display Youtube without ads, but my understanding is this is possible because the device manufacturer had negotiated a contract with Google to pay for access to it.

Thank you. I intend to develop a channel as a library of my media (some are video files but some have been shared on Youtube). Please suggest me the command or script that I should start with to insert the youtube link in the private channel.

astromo, I have a channel in development that will do just that. I hope to make it available for beta testing in the coming weeks.

What is a basic script to add the content in the videoscreen? And what is the URL to be used for pointing to youtube contents?

“astromo” wrote:
What is a basic script to add the content in the videoscreen? And what is the URL to be used for pointing to youtube contents?

“astromo” wrote:
And what is the URL to be used for pointing to youtube contents?

You could try this function:


'**********************************************************************************************************************
' ytGetMP4Url - Retrieve a list of MP4 urls from YouTube for the specified video id
'
' Example usage:
'
'   videoId = "S2wAMaM2OYQ"                     ' (required) YouTube Video Id
'                                               '   Alternatively, the full Url of the YouTube video may be specified here
'   timeout = 60000                             ' (optional) Timeout in milliseconds (default: 0 => wait forever)
'   loginCookie = ""                            ' (optional) YouTube login cookie - only required if video requires a login,
'                                               '   e.g. Private or R-Rated videos (default: "")
'                                               '   The login cookie can be obtained by calling ytLoginYouTube
'   mp4VideoList = ytGetMP4Url (videoId, timeout, loginCookie)
'   if mp4VideoList <> Invalid                  ' Invalid returned if no MP4 streams detected
'       sdUrl = mp4VideoList.sdUrl
'       hdUrl = mp4VideoList.hdUrl              ' Will be empty string if no HD MP4 found
'       hd1080pUrl = mp4VideoList.hd1080pUrl    ' Will be empty string if no 1080p MP4 found
'       hlsUrl = mp4VideoList.hlsUrl            ' If an HLS stream is found, set to its index file's Url
'   endif
'**********************************************************************************************************************
function ytGetMP4Url (videoIdOrUrl as string, timeout = 0 as integer, loginCookie = "" as string) as object
    mp4VideoList = {sdUrl: "", hdUrl: "", hd1080pUrl: "", hlsUrl: ""}
    if Left (LCase (videoIdOrUrl), 4) = "http"
        url = videoIdOrUrl
    else
        url = "http://www.youtube.com/get_video_info?hl=en&el=detailpage&video_id=" + videoIdOrUrl
    endif
    
    '
    ' Get the web page containing video information
    '
    htmlString = ""
    port = CreateObject ("roMessagePort")
    ut = CreateObject ("roUrlTransfer")
    ut.SetPort (port)
    ut.AddHeader ("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0 (gzip)")
    if loginCookie <> ""
        ut.AddHeader ("Cookie", loginCookie)
    endif
    ut.SetCertificatesFile ("common:/certs/ca-bundle.crt")
    ut.InitClientCertificates ()
    ut.EnableEncodings (true)
    ut.SetUrl (url)
    if ut.AsyncGetToString ()
        while true
            msg = Wait (timeout, port)
            if type (msg) = "roUrlEvent"
                status = msg.GetResponseCode ()
                print "ytGetMP4Url. MP4 Url Request: Url = " + url + ". status = " + status.ToStr () + ". failureReason = " + msg.GetFailureReason () 
                if status = 200
                    htmlString = msg.GetString ()
                    print "htmlString=" + htmlString
                endif
                exit while
            else if type (msg) = "Invalid"
                ut.AsyncCancel ()
                print "ytGetMP4Url. Timeout"
                exit while
            endif
        end while
    endif
    
    '
    ' urlEncodedFmtStreamMap contains any mp4 urls
    ' TODO: Check if 1080p support has been discontinued
    '
    urlEncodedFmtStreamMap = CreateObject ("roRegex", "\x22url_encoded_fmt_stream_map\x22:\x22([^\x22]+)\x22", "").Match (htmlString)
    if urlEncodedFmtStreamMap.Count () > 1
        commaSplit = CreateObject ("roRegex", ",", "").Split (urlEncodedFmtStreamMap [1])
        for each commaItem in commaSplit
            maVideoUrl = CreateObject ("roRegex", "url=(.+)", "").Match (commaItem)
            if maVideoUrl.Count () = 2
                videoUrl = ut.Unescape (maVideoUrl [1])
                print "videoUrl: " + videoUrl
                pair = {itag: ""}
                ampersandSplit = CreateObject ("roRegex", "&", "").Split (videoUrl)
                for each ampersandItem in ampersandSplit
                    equalsSplit = CreateObject ("roRegex", "=", "").Split (ampersandItem)
                    if equalsSplit.Count () = 2
                        pair [equalsSplit [0]] = equalsSplit [1]
                    endif
                end for
                if Left (LCase (videoUrl), 4) = "http"
                    urlDecoded = ut.Unescape (videoUrl)
                    if pair.itag = "18"
                        mp4VideoList.sdUrl = urlDecoded
                    else if pair.itag = "22"
                        mp4VideoList.hdUrl = urlDecoded
                    else if pair.itag = "37"
                        mp4VideoList.hd1080pUrl = urlDecoded
                    endif
                endif
            endif
        end for
    endif
    
    '
    ' If no mp4 urls, check for live (HLS) feed in the hlsvp attribute
    '
    if mp4VideoList.sdUrl = "" and mp4VideoList.hdUrl = "" and mp4VideoList.hd1080pUrl = ""
        ' If no mp4 video streams were found, search for a live stream HLS manifest (.m3u8) file
        hlsvp = CreateObject ("roRegex", "hlsvp=([^(" + Chr(34) + "|&|$)]*)", "").Match (htmlString)
        if hlsvp.Count () > 1
            hlsUrlDecoded = ut.Unescape (ut.Unescape (hlsvp [1]))
            mp4VideoList.hlsUrl = hlsUrlDecoded
        endif
        if mp4VideoList.hlsUrl = ""
            mp4VideoList = Invalid
        endif
    endif
    
    if mp4VideoList <> invalid
        print "ytGetMP4Url. sdUrl="      + mp4VideoList.sdUrl
        print "ytGetMP4Url. hdUrl="      + mp4VideoList.hdUrl
        print "ytGetMP4Url. hd1080pUrl=" + mp4VideoList.hd1080pUrl
        print "ytGetMP4Url. hlsUrl="     + mp4VideoList.hlsUrl
    else
        print "ytGetMP4Url. No Video Streams Found"
    endif
    
    return mp4VideoList
end function

belltown, thank you so much. I can start from there.

Belltown, ditto. Thanks. I’ve been pounding my head trying to understand how other channels did this. I’m trying to go to the next step. I’m trying to integrate your function to the simplevideoplayer.

Function displayVideo(args As Dynamic)
....
url = "http://youtu.be/nGeKSiCQkPw"   ' The URL for the video
mp4Urls = getMP4Url (url)             ' Get a list of all MP4 URLs
sdUrl = mp4Urls.sdUrl
....
'Swap the commented values below to play different video clips...
 urls = [ sdUrl ]
 qualities = ["SD"]
 StreamFormat = "mp4"
....etc.

I get a bug when running this. (I don’t have Roku access while I type this message - I’ll update this post later).

I did notice that the generated sdUrl variable seems to be correct because I can cut-and-paste the URL to a web-browser to test.

I do notice that the URL contains ampersands “&” . Do I need to replace these with “&” i nthe brightscript code?

Buenafe, this is my script that works. You will need to remove some commands to process the SRT subtitle which causes an error.


'*************************************************************
'** 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

    'video 
	
	url = "http://www.youtube.com/watch?v=RfOSqpZ0jEM&feature=youtube_gdata"   ' The URL for the video
	mp4Urls = getMP4Url (url)             ' Get a list of all MP4 URLs
	sdUrl = mp4Urls.sdUrl
	hdUrl = mp4Urls.hdUrl                 ' Will be empty string if no HD MP4 found
	hd1080pUrl = mp4Urls.hd1080pUrl       ' Will be empty string if no 1080p MP4 found
	
    urls = [sdUrl]
    qualities = ["SD"]
    StreamFormat = "mp4"
    title = "Youtube"
		
    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
    end if
    
    videoclip = CreateObject("roAssociativeArray")
    videoclip.StreamBitrates = bitrates
    videoclip.StreamUrls = urls
    videoclip.StreamQualities = qualities
    videoclip.StreamFormat = StreamFormat
    videoclip.Title = title
    
    video.SetContent(videoclip)
    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

Tried it on simplevideoplayer and not working. Can you post all the code in appMain.brs?

@astromo - thanks. I can’t to try this when I get home

I would have never come up with @belltown 's function to get that elusive mp4 link. I unsuccessfully tried to understand a python youtube-dl code which did similar thing. I wonder how these guys do it so easily. So much to learn.

This is my code. Make sure you the image files are the same as those in your folder.

' ********************************************************************
' **  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()

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

    item = { ContentType:"episode"
               SDPosterUrl:"file://pkg:/images/MainMenu_Icon_Center_HD.png"
               HDPosterUrl:"file://pkg:/images/MainMenu_Icon_Center_HD.png"
               IsHD:True
               HDBranded:True
               ShortDescriptionLine1:""
               ShortDescriptionLine2:""
               Description:""
               Rating:"NR"
               StarRating:"80"
               Length:1972
               Categories:["Technology","Talk"]
               Title:" "
               }

    showSpringboardScreen(item)  
    
    '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"
    
    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

    'video 
	
	url = "http://www.youtube.com/watch?v=RfOSqpZ0jEM&feature=youtube_gdata"   ' The URL for the video
	mp4Urls = getMP4Url (url)             ' Get a list of all MP4 URLs
	sdUrl = mp4Urls.sdUrl
	hdUrl = mp4Urls.hdUrl                 ' Will be empty string if no HD MP4 found
	hd1080pUrl = mp4Urls.hd1080pUrl       ' Will be empty string if no 1080p MP4 found
	
    urls = [sdUrl]
    qualities = ["SD"]
    StreamFormat = "mp4"
    title = "Youtube"
		
    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
    end if
    
    videoclip = CreateObject("roAssociativeArray")
    videoclip.StreamBitrates = bitrates
    videoclip.StreamUrls = urls
    videoclip.StreamQualities = qualities
    videoclip.StreamFormat = StreamFormat
    videoclip.Title = title
    
    video.SetContent(videoclip)
    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

function getMP4Url (urlParam as string) as object
   mp4VideoList = {sdUrl: "", hdUrl: "", hd1080pUrl: ""}
   urlTransferObject = CreateObject ("roUrlTransfer")
   urlTransferObject.SetPort (CreateObject ("roMessagePort"))
   urlTransferObject.SetUrl (urlParam)
   htmlString = urlTransferObject.GetToString ()
   urlEncodedFmtStreamMap = CreateObject ("roRegex", "url_encoded_fmt_stream_map=([^(" + Chr (34) + "|&|$)]*)", "").Match (htmlString)
   if urlEncodedFmtStreamMap.Count () < 2 then return mp4VideoList
   urlEncodedFmtStreamList = CreateObject ("roRegex", "%2C", "").Split (urlEncodedFmtStreamMap [1])
   for each urlEncodedFmtStream in urlEncodedFmtStreamList
      urlStreamMatches = CreateObject ("roRegex", "url%3D(http.*?)%26", "").Match (urlEncodedFmtStream)
      if urlStreamMatches.Count () > 1
         urlDecoded = CreateObject ("roUrlTransfer").Unescape (CreateObject ("roUrlTransfer").Unescape (urlStreamMatches [1]))
         if CreateObject ("roRegex", "itag=18\D", "").IsMatch (urlDecoded)
            mp4VideoList.sdUrl = urlDecoded
         else if CreateObject ("roRegex", "itag=22\D", "").IsMatch (urlDecoded)
            mp4VideoList.hdUrl = urlDecoded
         else if CreateObject ("roRegex", "itag=37\D", "").IsMatch (urlDecoded)
            mp4VideoList.hd1080pUrl = urlDecoded
         endif
      endif
   end for
   return mp4VideoList
end function

Your the Man. It works. This is a first that I know of that someone can share the complete code when asked a question. Building my library little by little.
How would I make a list of various urls to select from on a PosterScreen? Lets say I want to see 5 of my youtube videos and want to select which one to play?

Thank You…

DA

@bandal I’m looking at making something similar. Did you ever get it figured out?

@koopakid08
I have 1 feed working from the script post above, but I am my other developer will create one that we can update with an xml file and place content we want with more selections that we want with our custom graphics and descriptions. I want to integrate this into my videoplayer app that is working now. I cannot say how long yet as we are doing the registration and web services links at the moment.

DA

Hi everyone.

I’m using this script to play yt video on Roku, but the buffering really slow. Anyone else having the same problem? Or are there better solutions than this one? (the thread is quite old, sorry for using it).

Thanks to everyone who can/will help.