--- /dev/null
+from Plugins.Plugin import PluginDescriptor
+
+import os
+from xml.etree.cElementTree import fromstring, ElementTree
+
+from enigma import gFont, eTimer, eConsoleAppContainer, ePicLoad, loadPNG, getDesktop, eServiceReference, iPlayableService, eListboxPythonMultiContent, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER, RT_VALIGN_CENTER
+
+from Screens.Screen import Screen
+from Screens.ChoiceBox import ChoiceBox
+from Screens.MessageBox import MessageBox
+from Screens.InfoBarGenerics import InfoBarNotifications
+
+from Components.Button import Button
+from Components.Label import Label
+from Components.ConfigList import ConfigListScreen
+from Components.Sources.StaticText import StaticText
+from Components.ActionMap import NumberActionMap, ActionMap
+from Components.config import config, ConfigSelection, getConfigListEntry, ConfigText, ConfigDirectory, ConfigYesNo, ConfigSelection
+from Components.FileList import FileList, FileEntryComponent
+from Components.MenuList import MenuList
+from Components.Pixmap import Pixmap, MovingPixmap
+from Components.AVSwitch import AVSwitch
+from Components.ServiceEventTracker import ServiceEventTracker
+
+from Tools.Directories import fileExists, resolveFilename, SCOPE_PLUGINS
+
+PLUGIN_PATH = resolveFilename(SCOPE_PLUGINS, "Extensions/StreamTV")
+
+class StreamTVPlayer(Screen, InfoBarNotifications):
+ skin = """
+ <screen name="StreamTVPlayer" flags="wfNoBorder" position="0,570" size="1280,190" title="StreamTV Player" backgroundColor="#41000000" >
+ <ePixmap position="80,25" size="117,72" pixmap="%s/channel_background.png" zPosition="-1" transparent="1" alphatest="blend" />
+ <widget name="channel_icon" position="121,43" zPosition="10" size="35,35" backgroundColor="#41000000" />
+ <widget name="channel_name" position="250,20" size="650,40" font="Regular;36" halign="left" valign="center" foregroundColor="#ffffff" backgroundColor="#41000000" />
+ <widget name="channel_uri" position="250,70" size="950,60" font="Regular;22" halign="left" valign="top" foregroundColor="#ffffff" backgroundColor="#41000000" />
+ <widget source="session.CurrentService" render="Label" position="805,20" size="300,40" font="Regular;30" halign="right" valign="center" foregroundColor="#f4df8d" backgroundColor="#41000000" transparent="1" >
+ <convert type="ServicePosition">Position</convert>
+ </widget>
+ </screen>
+ """ % (PLUGIN_PATH)
+
+ PLAYER_IDLE = 0
+ PLAYER_PLAYING = 1
+ PLAYER_PAUSED = 2
+ def __init__(self, session, service, cbServiceCommand, chName, chURL, chIcon):
+ Screen.__init__(self, session)
+ InfoBarNotifications.__init__(self)
+
+ isEmpty = lambda x: x is None or len(x)==0 or x == 'None'
+ if isEmpty(chName): chName = 'Unknown'
+ if isEmpty(chURL): chURL = 'Unknown'
+ if isEmpty(chIcon): chIcon = 'default.png'
+ chIcon = '%s/icons/%s'%(PLUGIN_PATH,chIcon)
+ self.session = session
+ self.service = service
+ self.cbServiceCommand = cbServiceCommand
+ self["actions"] = ActionMap(["OkCancelActions", "InfobarSeekActions", "MediaPlayerActions", "MovieSelectionActions"], {
+ "ok": self.doInfoAction,
+ "cancel": self.doExit,
+ "stop": self.doExit,
+ "playpauseService": self.playpauseService,
+ }, -2)
+
+ self.__event_tracker = ServiceEventTracker(screen = self, eventmap = {
+ iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged,
+ iPlayableService.evStart: self.__serviceStarted,
+ iPlayableService.evEOF: self.__evEOF,
+ })
+
+ self.hidetimer = eTimer()
+ self.hidetimer.timeout.get().append(self.doInfoAction)
+
+ self.state = self.PLAYER_PLAYING
+ self.lastseekstate = self.PLAYER_PLAYING
+ self.__seekableStatusChanged()
+
+ self.onClose.append(self.__onClose)
+ self.doPlay()
+
+ self['channel_icon'] = Pixmap()
+ self['channel_name'] = Label(chName)
+ self['channel_uri'] = Label(chURL)
+
+ self.picload = ePicLoad()
+ self.scale = AVSwitch().getFramebufferScale()
+ self.picload.PictureData.get().append(self.cbDrawChannelIcon)
+ print self.scale[0]
+ print self.scale[1]
+ self.picload.setPara((35, 35, self.scale[0], self.scale[1], False, 0, "#00000000"))
+ self.picload.startDecode(chIcon)
+
+ self.bypassExit = False
+ self.cbServiceCommand(('docommand',self.doCommand))
+
+ def doCommand(self, cmd):
+ if cmd == 'bypass_exit':
+ self.bypassExit = True
+
+ def cbDrawChannelIcon(self, picInfo=None):
+ ptr = self.picload.getData()
+ if ptr != None:
+ self["channel_icon"].instance.setPixmap(ptr.__deref__())
+ self["channel_icon"].show()
+
+ def __onClose(self):
+ self.session.nav.stopService()
+
+ def __seekableStatusChanged(self):
+ service = self.session.nav.getCurrentService()
+ if service is not None:
+ seek = service.seek()
+ if seek is None or not seek.isCurrentlySeekable():
+ self.setSeekState(self.PLAYER_PLAYING)
+
+ def __serviceStarted(self):
+ self.state = self.PLAYER_PLAYING
+ self.__seekableStatusChanged()
+
+ def __evEOF(self):
+ if self.bypassExit:
+ return
+ self.doExit()
+
+ def __setHideTimer(self):
+ self.hidetimer.start(5000)
+
+ def doExit(self):
+ list = ((_("Yes"), "y"), (_("No"), "n"),)
+ self.session.openWithCallback(self.cbDoExit, ChoiceBox, title=_("Stop playing this stream?"), list=list)
+
+ def cbDoExit(self, answer):
+ answer = answer and answer[1]
+ if answer == "y":
+ self.cbServiceCommand()
+ self.close()
+
+ def setSeekState(self, wantstate):
+ service = self.session.nav.getCurrentService()
+ if service is None:
+ print "No Service found"
+ return
+
+ pauseable = service.pause()
+ if pauseable is not None:
+ if wantstate == self.PLAYER_PAUSED:
+ pauseable.pause()
+ self.state = self.PLAYER_PAUSED
+ if not self.shown:
+ self.hidetimer.stop()
+ self.show()
+ elif wantstate == self.PLAYER_PLAYING:
+ pauseable.unpause()
+ self.state = self.PLAYER_PLAYING
+ if self.shown:
+ self.__setHideTimer()
+ else:
+ self.state = self.PLAYER_PLAYING
+
+ def doInfoAction(self):
+ if self.shown:
+ self.hidetimer.stop()
+ self.hide()
+ else:
+ self.show()
+ if self.state == self.PLAYER_PLAYING:
+ self.__setHideTimer()
+
+ def doPlay(self):
+ if self.state == self.PLAYER_PAUSED:
+ if self.shown:
+ self.__setHideTimer()
+ self.state = self.PLAYER_PLAYING
+ self.session.nav.playService(self.service)
+ if self.shown:
+ self.__setHideTimer()
+
+ def playpauseService(self):
+ if self.state == self.PLAYER_PLAYING:
+ self.setSeekState(self.PLAYER_PAUSED)
+ elif self.state == self.PLAYER_PAUSED:
+ self.setSeekState(self.PLAYER_PLAYING)
+
+class StreamURIParser:
+ def __init__(self, xml):
+ self.xml = xml
+
+ def parseStreamList(self):
+ tvlist = []
+ tree = ElementTree()
+ tree.parse(self.xml)
+
+ for iptv in tree.findall('iptv'):
+ n = str(iptv.findtext('name'))
+ i = str(iptv.findtext('icon'))
+ u = str(iptv.findtext('uri'))
+ t = str(iptv.findtext('type'))
+ tvlist.append({'name':n, 'icon':i, 'type':t, 'uri':self.parseStreamURI(u)})
+ return tvlist
+
+ def parseStreamURI(self, uri):
+ uriInfo = {}
+ splitedURI = uri.split()
+ uriInfo['URL'] = splitedURI[0]
+ for x in splitedURI[1:]:
+ i = x.find('=')
+ uriInfo[x[:i].upper()] = str(x[i+1:])
+ return uriInfo
+
+def streamListEntry(entry):
+ #print entry
+ uriInfo = entry[1].get('uri')
+ return [entry,
+ (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 1, 35, 35, loadPNG('%s/icons/%s' % (PLUGIN_PATH, str(entry[1].get('icon'))) )),
+ (eListboxPythonMultiContent.TYPE_TEXT,45,7,200,37,0,RT_HALIGN_LEFT,entry[0]),
+ (eListboxPythonMultiContent.TYPE_TEXT,250,7,310,37,1,RT_HALIGN_LEFT,str(uriInfo.get('URL')))
+ ]
+
+class StreamTVList(Screen):
+ skin = """
+ <screen name="StreamTVList" position="center,center" size="600,350" title="StreamTV List">
+ <widget name="streamlist" position="0,0" size="600,350" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
+ </screen>
+ """
+ def __init__(self, session):
+ self.session = session
+ Screen.__init__(self, session)
+ self["actions"] = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", "SetupActions", "NumberActions", "MenuActions"], {
+ "ok" : self.keyOK,
+ "cancel": self.keyCancel,
+ "up" : self.keyUp,
+ "down" : self.keyDown,
+ "left" : self.keyLeft,
+ "right" : self.keyRight,
+ }, -1)
+
+ self.streamBin = resolveFilename(SCOPE_PLUGINS, "Extensions/StreamTV/rtmpdump")
+ self.streamFile = resolveFilename(SCOPE_PLUGINS, "Extensions/StreamTV/stream.xml")
+
+ self.streamList = []
+ self.makeStreamList()
+
+ self.streamMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+ self.streamMenuList.l.setFont(0, gFont('Regular', 22))
+ self.streamMenuList.l.setFont(1, gFont('Regular', 18))
+ self.streamMenuList.l.setItemHeight(37)
+ self['streamlist'] = self.streamMenuList
+ self.streamMenuList.setList(map(streamListEntry, self.streamList))
+
+ self.onLayoutFinish.append(self.layoutFinished)
+
+ self.rtmpConsole = None
+ self.beforeService = None
+ self.currentService = None
+ self.playerStoped = False
+ self.serviceDoCommand = None
+
+ self.keyLocked = False
+
+ def layoutFinished(self):
+ rc = os.popen('ps -ef | grep rtmpdump | grep -v grep').read()
+ print "a process already running :", rc
+ if rc is not None:
+ if rc.strip() != '':
+ os.system('killall -INT rtmpdump')
+ def keyLeft(self):
+ if self.keyLocked:
+ return
+ self['streamlist'].pageUp()
+
+ def keyRight(self):
+ if self.keyLocked:
+ return
+ self['streamlist'].pageDown()
+
+ def keyUp(self):
+ if self.keyLocked:
+ return
+ self['streamlist'].up()
+
+ def keyDown(self):
+ if self.keyLocked:
+ return
+ self['streamlist'].down()
+
+ def keyCancel(self):
+ self.cbAppClosed(True)
+ self.close()
+
+ def keyOK(self):
+ if self.keyLocked:
+ return
+ self.keyLocked = True
+ self.rtmpConsole = None
+ self.beforeService = None
+ self.currentService = None
+ self.playerStoped = False
+ self.serviceDoCommand = None
+
+ streamInfo = self["streamlist"].getCurrent()[0][1]
+ uriInfo = streamInfo.get('uri')
+ typeInfo = streamInfo.get('type').split(':')
+
+ protocol = typeInfo[0]
+ url = uriInfo.get('URL')
+ if protocol == 'rtmp':
+ self.layoutFinished()
+ self.rtmpConsole = eConsoleAppContainer()
+ self.rtmpConsole.dataAvail.append(self.cbDataAvail)
+ self.rtmpConsole.appClosed.append(self.cbAppClosed)
+ self.rtmpConsole.execute(self.makeCommand(uriInfo))
+ elif protocol in ('rtsp', 'http', 'hls'):
+ serviceType = typeInfo[1]
+ bufferSize = typeInfo[2]
+ self.doStreamAction(url, serviceType, bufferSize)
+
+ def doStreamAction(self, url=None, serviceType='4097', bufferSize=None):
+ if url is None:
+ url='/tmp/stream.avi'
+ self.streamPlayerTimer.stop()
+ #if os.path.exists(url):
+ # os.unlink(url)
+ try:
+ serviceType = int(serviceType)
+ except: serviceType = 4097
+ try:
+ bufferSize = int(bufferSize)
+ except: bufferSize = None
+
+ service = eServiceReference(serviceType, 0, url)
+ #if bufferSize is not None:
+ # service.setData(2, bufferSize*1024)
+
+ streamInfo = self["streamlist"].getCurrent()[0][1]
+ uriInfo = streamInfo.get('uri')
+ self.beforeService = self.session.nav.getCurrentlyPlayingServiceReference()
+ self.currentService = self.session.openWithCallback(self.cbFinishedStream,
+ StreamTVPlayer,
+ service,
+ cbServiceCommand=self.cbServiceCommand,
+ chName=str(streamInfo.get('name')),
+ chURL =str(uriInfo.get('URL')),
+ chIcon=str(streamInfo.get('icon')))
+
+ def cbServiceCommand(self, params=None):
+ if params is None:
+ self.playerStoped = True
+ return
+ if params[0] == 'docommand':
+ self.serviceDoCommand = params[1]
+
+ def cbAppClosed(self, ret):
+ print ret
+ self.doConsoleStop()
+ if self.currentService is not None and not self.playerStoped:
+ self.serviceDoCommand('bypass_exit')
+ message = "The connection was terminated from the stream server."
+ self.session.open(MessageBox, message, type=MessageBox.TYPE_INFO)
+ self.currentService.close()
+ self.currentService = None
+ self.serviceDoCommand = None
+
+ def cbDataAvail(self, data):
+ print data
+ if str(data) == 'Connected...':
+ self.streamPlayerTimer = eTimer()
+ self.streamPlayerTimer.timeout.get().append(self.doStreamAction)
+ self.streamPlayerTimer.start(1000)
+
+ def cbFinishedStream(self):
+ self.doConsoleStop()
+ print 'done!!'
+
+ def doConsoleStop(self):
+ self.keyLocked = False
+ if self.rtmpConsole is not None:
+ self.rtmpConsole.sendCtrlC()
+ self.rtmpConsole = None
+
+ def makeCommand(self, uriInfo):
+ def appendCommand(key, option):
+ try:
+ d = uriInfo.get(key)
+ if d is not None:
+ return "-%s %s " %(option, d)
+ except: pass
+ return ''
+ command = '%s -v ' % (self.streamBin)
+ command += appendCommand('URL', 'r')
+ command += appendCommand('PLAYPATH', 'y')
+ command += appendCommand('SWFURL', 'W')
+ return command
+
+ def makeStreamList(self):
+ streamDB = StreamURIParser(self.streamFile).parseStreamList()
+ self.streamList = []
+ for x in streamDB:
+ self.streamList.append((x.get('name'), x))
+
+def main(session, **kwargs):
+ session.open(StreamTVList)
+
+def Plugins(**kwargs):
+ return PluginDescriptor(name=_("StreamTVPalyer"), description="Watching IPTV implemented by RTSP/RTMP protocol.", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main)
+
+
--- /dev/null
+<?xml version="1.0"?>
+<stream>
+<iptv>
+ <name>ALFA</name>
+ <icon>alfa.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://fms.zulu.mk/zulu/alfa_1</uri>
+</iptv>
+<iptv>
+ <name>MTB1</name>
+ <icon>default.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://fms.zulu.mk/zulu/mtv1_1</uri>
+</iptv>
+<iptv>
+ <name>A2</name>
+ <icon>default.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://fms.zulu.mk/zulu/a2_1</uri>
+</iptv>
+<iptv>
+ <name>KANAL5</name>
+ <icon>kanal5.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://fms.zulu.mk/zulu/kanal5_1</uri>
+</iptv>
+<iptv>
+ <name>TELMA</name>
+ <icon>telma.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://fms.zulu.mk/zulu/telma_1</uri>
+</iptv>
+<iptv>
+ <name>HAWATB</name>
+ <icon>default.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://fms.zulu.mk/zulu/nasatv_1</uri>
+</iptv>
+<iptv>
+ <name>ALSAT</name>
+ <icon>alsat.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://fms.zulu.mk/zulu/alsat_1</uri>
+</iptv>
+<iptv>
+ <name>SITEL3</name>
+ <icon>sitel3.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://fms.zulu.mk/zulu/sitel3_1</uri>
+</iptv>
+<iptv>
+ <name>KANAL5+</name>
+ <icon>kanal5.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://fms.zulu.mk/zulu/kanal5plus_1</uri>
+</iptv>
+<iptv>
+ <name>BTR</name>
+ <icon>btr.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://fms.zulu.mk/zulu/btr_1</uri>
+</iptv>
+<iptv>
+ <name>HDextreme</name>
+ <icon>hdextreme.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://hdimages.cdnvideo.ru/rr/HDextremeCDN</uri>
+</iptv>
+<iptv>
+ <name>HDprocess</name>
+ <icon>hdprocess.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://hdimages.cdnvideo.ru/rr/HDprocessCDN</uri>
+</iptv>
+<iptv>
+ <name>HDtravel</name>
+ <icon>hdtravel.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://hdimages.cdnvideo.ru/rr/HDtravelCDN</uri>
+</iptv>
+<iptv>
+ <name>NOVA</name>
+ <icon>nova.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://94.156.248.42/nova_live_q1.wmv/video;seq=34017;rtptime=0</uri>
+</iptv>
+<iptv>
+ <name>REDUTA</name>
+ <icon>reduta.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://s1.media-planet.sk/live/reduta</uri>
+</iptv>
+<iptv>
+ <name>TV Biznes (Польша)</name>
+ <icon>tvbiznes.png</icon>
+ <type>http:4097:512</type>
+ <uri>http://193.111.38.242/streams/o2/TVBiznes/TVbiznes.livx</uri>
+</iptv>
+<iptv>
+ <name>ORT+2 TV</name>
+ <icon>ort.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://iptv.karelia.ru/ort.sdp</uri>
+</iptv>
+<iptv>
+ <name>K1</name>
+ <icon>k1.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://62.149.26.237:1935/tv/_definst_/k1</uri>
+</iptv>
+<iptv>
+ <name>Euronews</name>
+ <icon>euronews.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://iptv.karelia.ru/euro.sdp</uri>
+</iptv>
+<iptv>
+ <name>shaber2</name>
+ <icon>shaber.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://media2.kure.tv:1935/live/shaber2</uri>
+</iptv>
+<iptv>
+ <name>yumurcak2</name>
+ <icon>yumurcak.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://media2.kure.tv:1935/live/yumurcak2</uri>
+</iptv>
+<iptv>
+ <name>inter</name>
+ <icon>intertv.png</icon>
+ <type>rtsp:4097:512</type>
+ <uri>rtsp://62.149.26.237:1935/tv/_definst_/inter</uri>
+</iptv>
+<iptv>
+ <name>eUroticTV</name>
+ <icon>urotictv.png</icon>
+ <type>hls:4097:</type>
+ <uri>http://174.121.228.234/hls-live/livepkgr/_definst_/liveevent/etv-livestream_2.m3u86</uri>
+</iptv>
+<iptv>
+ <name>BBC World News</name>
+ <icon>bbcworldnews.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://media2.lsops.net/live/ playpath=bbcworld1_en_high.sdp swfUrl=http://www.livestation.com/flash/player/5.4/player.swf pageUrl=http://www.livestation.com/channels/66-cnn-international swfVfy=true live=true</uri>
+</iptv>
+<iptv>
+ <name>Euro Sport</name>
+ <icon>eurosport.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://cp108478.live.edgefcs.net/live playpath=eurosport_1_800@45515 swfURL=http://www.wilmaa.com/player/main_v3.334.swf swfVfy=true live=true</uri>
+</iptv>
+
+<iptv>
+ <name>Bloomberg TV</name>
+ <icon>bloombergtv.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmpt://cp87869.live.edgefcs.net:1935/live/ playpath=us_300@21006 swfURL=http://cdn.gotraffic.net/v/20110210_153738//flash/BloombergMediaPlayer.swf</uri>
+</iptv>
+<iptv>
+ <name>Legend</name>
+ <icon>legend.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://fms.105.net:1935/live/ swfurl=http://www.freeetv.com/modules/Video_Stream/plugins/akaim/liveplayer.swf playpath=legend1 live=true</uri>
+</iptv>
+<iptv>
+ <name>Playme</name>
+ <icon>playme.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://cp107974.live.edgefcs.net/live/ playpath=beep-flash-live@34654 live=true</uri>
+</iptv>
+<iptv>
+ <name>Sky TG24</name>
+ <icon>skytg24.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://cp49989.live.edgefcs.net/live/ swfurl=http://www.freeetv.com/modules/Video_Stream/plugins/akaim/liveplayer.swf playpath=streamRM1@2564 live=true</uri>
+</iptv>
+
+<iptv>
+ <name>Italy TV</name>
+ <icon>italytv.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://fms.105.net:1935/live playpath=italytv1</uri>
+</iptv>
+<iptv>
+ <name>Radio105 TV</name>
+ <icon>radio105.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://fms.105.net:1935/live playpath=105Test1</uri>
+</iptv>
+<iptv>
+ <name>For Music</name>
+ <icon>formusic.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://wowza1.top-ix.org/quartaretetv1 playpath=formusicweb</uri>
+</iptv>
+<iptv>
+ <name>Radio Montecarlo</name>
+ <icon>radiomontecarlo.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://fms.105.net:1935/live playpath=rmc1</uri>
+</iptv>
+<iptv>
+ <name>Top40</name>
+ <icon>ustop40.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://fms.105.net:1935/live playpath=charts1</uri>
+</iptv>
+<iptv>
+ <name>BBC Persian</name>
+ <icon>bbcpersian.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://media2.lsops.net/bbc playpath=ptv_live@3585 swfUrl=http://www.livestation.com/flash/player/5.4/player.swf pageUrl=http://www.livestation.com/channels/71-bbc-persian-tv-persian swfVfy=true live=true</uri>
+</iptv>
+<iptv>
+ <name>Euro News-UK</name>
+ <icon>euronews_uk.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://media2.lsops.net/live/ playpath=euronews_es_high.sdp swfUrl=http://www.livestation.com/flash/player/5.4/player.swf swfVfy=true live=true</uri>
+</iptv>
+<iptv>
+ <name>UNIP Brasil</name>
+ <icon>unipbrasil.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://67.228.212.5/ponto38/mixtv swfUrl=http://www.assistatvonline.com/fucku2.swf pageUrl=http://www.assistatvonline.com/canais/mixtv.php live=true</uri>
+</iptv>
+<iptv>
+ <name>SIC Noticias</name>
+ <icon>sicnoticias.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://213.13.26.12/live/sicnoticias.flv swfUrl=http://www.tvdez.com/player2.swf pageURL=http://www.tvdez.com/sicnoticias swfVfy=true live=true</uri>
+</iptv>
+<iptv>
+ <name>Fresh TV</name>
+ <icon>freshtv.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://www.planeta-online.tv:1936/live playpath=channel_4 swfUrl=http://www.planeta-online.tv/planeta_player.swf?ver=1345585527 pageUrl=http://www.planeta-online.tv/?ch=4 live=true</uri>
+</iptv>
+<iptv>
+ <name>Premiere TV-RU</name>
+ <icon>premieretvru.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://www.planeta-online.tv:1936/live playpath=channel_5 swfUrl=http://www.planeta-online.tv/planeta_player.swf?ver=1110761474 pageUrl=http://www.planeta-online.tv/?ch=5 live=true</uri>
+</iptv>
+<iptv>
+ <name>PikTV.com</name>
+ <icon>piktvcom.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://wms002.pik-tv.com/live/ playpath=piktv3pik3tv swfUrl=http://pik-tv.com/players/uppod/uppod.swf pageUrl=http://pik-tv.com/ live=true</uri>
+</iptv>
+<iptv>
+ <name>Rusia Today</name>
+ <icon>rusiatoday.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://rt.fms.visionip.tv/live/ app=live swfUrl=http://actualidad.rt.com/swf/player.swf pageUrl=http://actualidad.rt.com/mas/envivo/ playpath=RT_Spanish_3 live=true swfVfy=true</uri>
+</iptv>
+<iptv>
+ <name>Barb2</name>
+ <icon>barb2.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://www.planeta-online.tv:1936/live playpath=channel_6 swfUrl=http://www.planeta-online.tv/planeta_player.swf?ver=2095379291 pageUrl=http://www.planeta-online.tv/?ch=6 live=true</uri>
+</iptv>
+<iptv>
+ <name>Antenna Latina</name>
+ <icon>antennalatina.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://mek2.mekstream.com/antenalatina playpath=live3 swfUrl=http://www.mekstream.com/clients/antenalatina/player-licensed.swf pageUrl=http://www.antenalatina7.com/streaming7/str.html swfVfy=true live=true</uri>
+</iptv>
+<iptv>
+ <name>Teltemadrid Sat</name>
+ <icon>teltemadridsat.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://cp118140.live.edgefcs.net/live/ playpath=TSAtelemadridsat@47720 swfUrl=http://jonas.do.am/player.swf pageUrl=http://jonas.do.am swfVfy=true live=true</uri>
+</iptv>
+<iptv>
+ <name>InterEconomia.biz</name>
+ <icon>intereconomiabiz.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://media.intereconomia.com/live/business1</uri>
+</iptv>
+<iptv>
+ <name>Kontra Channel</name>
+ <icon>kontrachannel.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://flashcloud.mediacdn.com/live/kontratv swfUrl=http://wwitv.com/player/player15.swf pageURL=http://www.kontrachannel.gr/ swfVfy=true live=true</uri>
+</iptv>
+<iptv>
+ <name>NHK World</name>
+ <icon>nhkworld.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://ny-1.net.fivecool.org/2e2cd/ pageUrl=http://www3.nhk.or.jp/ swfUrl=http://www3.nhk.or.jp/nhkworld/r/movie/streamhub_player_20110429.swf Playpath=nhkworldglobalhigh1.sdp</uri>
+</iptv>
+<iptv>
+ <name>HGTV</name>
+ <icon>hgtv.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://fms3.tikilive.com:1935/view/25503_122/stream25503</uri>
+</iptv>
+<iptv>
+ <name>Nasa HD</name>
+ <icon>nasahd.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://cp76072.live.edgefcs.net/live/ pageUrl=http://www.nasa.gov/multimedia/nasatv/media_flash.html swfUrl=http://www.nasa.gov/templateimages/redesign/flash_player/swf/4.5/player.swf Playpath=MED-HQ-Flash@42814 live=true</uri>
+</iptv>
+<iptv>
+ <name>Sun News</name>
+ <icon>sunnews.png</icon>
+ <type>rtmp:4097:</type>
+ <uri>rtmp://cp39414.live.edgefcs.net/live/argent@9751 swfUrl=http://www.freeetv.com/modules/Video_Stream/plugins/akaim/liveplayer.swf</uri>
+</iptv>
+</stream>