For a private channel this would be all you need - replace the url.
For a public channel, Roku wants you to display some contact information if your stream goes down, and add a bit more to it to look nice on failure.
Sub Main()
port=CreateObject("roMessagePort")
screen=CreateObject("roVideoScreen")
screen.SetMessagePort(port)
z=CreateObject("roAssociativeArray")
z.Title="Live Feed"
z.ContentType="episode"
z.ContentQuality="SD"
z.StreamFormat="hls"
z.StreamQualities=[]
z.StreamQualities.Push("SD")
z.StreamBitrates=[]
z.StreamBitrates.Push("0")
z.StreamUrls=[]
z.StreamUrls.Push("http://server/playlist.m3u8") 'stream url
screen.SetContent(z)
screen.Show()
While TRUE
msg=Wait(0,port)
If Type(msg)="roVideoScreenEvent"
If msg.isRequestFailed()
Print"MSG = ";msg.getMessage()
Print"INDEX = ";msg.GetIndex()
Print"TYPE = ";msg.GetType()
Print"DATA = ";msg.GetData()
Print"INFO = ";msg.GetInfo()
Else If msg.isStatusMessage()
Print"Video status: ";msg.GetIndex();" ";msg.GetData()
Else If msg.isButtonPressed()
Print"Button pressed: ";msg.GetIndex();" ";msg.GetData()
Else If msg.isScreenClosed()
Exit While
Else
Print"Unexpected event type: ";msg.GetType()
End If
Else
Print"Unexpected message class: ";Type(msg)
End If
End While
End Sub