class LiveStreamingLinks(Screen): LIST_NAME = 0 LIST_CAT = 1 LIST_TYPE = 2 LIST_URL = 3 LEVEL_FILES = 0 LEVEL_XML = 1 DIR_ENIGMA2 = '/etc/enigma2/' URL_BASE = 'http://et-live-links.googlecode.com/svn/trunk/' skin = """ <screen position="c-300,c-210" size="600,420" title=""> <widget name="list" position="10,10" size="e-20,205" scrollbarMode="showOnDemand" /> <widget source="info" render="Label" position="10,215" size="e-20,200" halign="center" valign="top" font="Regular;17" /> <ePixmap pixmap="skin_default/buttons/red.png" position="c-150,e-45" size="140,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/green.png" position="c-0,e-45" size="140,40" alphatest="on" /> <widget source="key_red" render="Label" position="c-150,e-45" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> <widget source="key_green" render="Label" position="c-0,e-45" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> </screen>""" def __init__(self, session): self.skin = LiveStreamingLinks.skin Screen.__init__(self, session) self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("Download")) self["actions"] = ActionMap(["SetupActions", "ColorActions"], { "ok": self.keyOk, "save": self.keyGo, "cancel": self.keyCancel, "green": self.keyGo, "red": self.keyCancel, }, -2) self.list = SelectionList() self["list"] = self.list self["info"] = StaticText("") self.doExit = False self.level = self.LEVEL_FILES self.subMenuName = '' self.subMenuDescrName = '' self.xmlFiles = [] self.xmlCategories = [] self.lastchanged = '' self.lastchanges = '' self.onLayoutFinish.append(self.createTopMenu) def initSelectionList(self): list = [] self.list.setList(list) def createTopMenu(self): self.setTitle(_("ET-Livestream importer")) self.initSelectionList() self.subMenuName = '' self.subMenuDescrName = '' self.level = self.LEVEL_FILES self.readMainXml() count = 0 for x in self.xmlFiles: self.list.addSelection(x[self.LIST_CAT], x[self.LIST_NAME], count, False) count += 1 self["info"].setText("") def readXmlSubFile(self, fileName, descrName): self.initSelectionList() self.xmlList = [] self.subMenuName = fileName self.subMenuDescrName = descrName self.level = self.LEVEL_XML self.readChannelXml(self.xmlList, fileName) tmp = _('Last update') + ': %s\n\n%s' % (self.lastchanged, self.lastchanges) self["info"].setText(tmp) count = 0 for x in self.xmlCategories: self.list.addSelection(x, x, count, False) count += 1 def keyOk(self): if self.level == self.LEVEL_FILES: self.keyGo() elif self.level == self.LEVEL_XML: if len(self.xmlCategories) > 0: self.list.toggleSelection() def keyGo(self): if self.level == self.LEVEL_FILES: self.readXmlSubFile(self.xmlFiles[self.list.getSelectedIndex()][self.LIST_NAME], self.xmlFiles[self.list.getSelectedIndex()][self.LIST_CAT]) return self.doExit = False tmpList = [] tmpList = self.list.getSelectionsList() if len(tmpList) == 0: self.session.openWithCallback(self.infoCallback, MessageBox, _("Nothing selected"), MessageBox.TYPE_INFO) return self.xmlList.sort() tvFileList = [] radioFileList = [] for item in tmpList: if self.createUserBouquetFile(item[1], 'tv') > 0: tvFileList.append((item[1])) if self.createUserBouquetFile(item[1], 'radio') > 0: radioFileList.append((item[1])) if len(tvFileList) > 0: self.createBouquetFile(tvFileList, 'tv') if len(radioFileList) > 0: self.createBouquetFile(radioFileList, 'radio') db = eDVBDB.getInstance() db.reloadServicelist() db.reloadBouquets() self.doExit = True self.session.openWithCallback(self.infoCallback, MessageBox, _("Finished import"), MessageBox.TYPE_INFO) def infoCallback(self, confirmed): if self.doExit: self.createTopMenu() def createBouquetFile(self, catNames, fileType): newFileContent = '' fileContent = self.readFile(self.DIR_ENIGMA2 + 'bouquets.' + fileType) if fileContent == '': return for x in fileContent: x = self.stripLineEndings(x) isFound = False for cat in catNames: if '\"userbouquet.streamlinks' + self.convertToFileName(self.subMenuName + cat) in x: isFound = True break if not isFound: newFileContent += x + '\n' for cat in catNames: newFileContent += '#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET \"userbouquet.streamlinks' + self.convertToFileName(self.subMenuName + cat) + '.' + fileType +'\" ORDER BY bouquet\n' fp = open(self.DIR_ENIGMA2 + 'bouquets.' + fileType, 'w') fp.write(newFileContent) fp.close() def createUserBouquetFile(self, catName, fileType): ret = 0 newChannelList = [] newChannelList.append('#NAME Livestream ' + self.subMenuDescrName + ' ' + catName) for x in self.xmlList: if x[self.LIST_CAT] == catName and x[self.LIST_TYPE] == fileType: newChannelList.append('#SERVICE 4097:0:0:0:0:0:0:0:0:0:%s:%s' % (quote(x[self.LIST_URL]), quote(x[self.LIST_NAME]))) ret += 1 if ret > 0: fp = open(self.DIR_ENIGMA2 + 'userbouquet.streamlinks' + self.convertToFileName(self.subMenuName + catName) + '.' + fileType, 'w') for x in newChannelList: fp.write(x + '\n') fp.close() return ret def keyCancel(self): if self.level == self.LEVEL_FILES: self.close() elif self.level == self.LEVEL_XML: self.createTopMenu() def wgetUrl(self, target): std_headers = { 'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100627 Firefox/3.6.6', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-us,en;q=0.5', } outtxt = Request(target, None, std_headers) try: outtxt = urlopen(target).read() except (URLError, HTTPException), err: return '' return outtxt
class IPTVStreams(Screen): LIST_NAME = 0 LIST_CAT = 1 LIST_TYPE = 2 LIST_URL = 3 LEVEL_FILES = 0 LEVEL_XML = 1 DIR_ENIGMA2 = '/etc/enigma2/' url2 = 'http://et-live-links.googlecode.com/svn/trunk/' main1 = 'http://' main2 = 'livestream' main3 = '.et-view-support.com' main4 = '/testing/' skin = '''<screen position="c-300,c-210" size="600,420" title=""> <widget name="list" position="10,10" size="e-20,210" scrollbarMode="showOnDemand" /> <widget source="info" render="Label" position="10,250" size="e-20,80" halign="center" valign="top" font="Regular;17" /> <ePixmap pixmap="skin_default/buttons/green.png" position="c-150,e-45" size="140,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/yellow.png" position="c-0,e-45" size="140,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/red.png" position="c-300,e-45" size="140,40" alphatest="on" /> <widget source="key_green" render="Label" position="c-150,e-45" zPosition="1" size="140,40" font="Regular;16" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> <widget source="key_red" render="Label" position="c-300,e-45" zPosition="1" size="140,40" font="Regular;16" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> <widget source="key_yellow" render="Label" position="c-0,e-45" zPosition="1" size="140,40" font="Regular;16" halign="center" valign="center" backgroundColor="#a58b00" transparent="1" /> </screen>''' def __init__(self, session): self.skin = IPTVStreams.skin Screen.__init__(self, session) self['key_red'] = StaticText(_('Cancel')) self['key_yellow'] = StaticText(_('Change\nStreams')) self['key_green'] = StaticText(_('Download')) self['actions'] = ActionMap( ['SetupActions', 'NumberActions', 'ColorActions'], { 'ok': self.keyOk, 'save': self.keyGo, 'cancel': self.keyCancel, 'yellow': self.changeMenu, 'green': self.keyGo, 'red': self.keyCancel }, -2) self.list = SelectionList() self['list'] = self.list self['info'] = StaticText('') self.doExit = False self.level = self.LEVEL_FILES self.subMenuName = '' self.subMenuDescrName = '' self.xmlFiles = [] self.xmlCategories = [] self.lastchanged = '' self.lastchanges = '' self.onLayoutFinish.append(self.createTopMenu) def changeMenu(self): global STREAM if STREAM == 1: self.createTopMenu2() elif STREAM == 2: self.createTopMenu3() elif STREAM == 3: self.createTopMenu() def initSelectionList(self): list = [] self.list.setList(list) def createTopMenu(self): global STREAM STREAM = 1 self.setTitle(_('IPTV Streams')) self.initSelectionList() self.subMenuName = '' self.subMenuDescrName = '' self.level = self.LEVEL_FILES self.readMainXml() count = 0 for x in self.xmlFiles: self.list.addSelection(x[self.LIST_CAT], x[self.LIST_NAME], count, False) count += 1 self['info'].setText('Streamlinks 1') def createTopMenu2(self): global STREAM STREAM = 2 self.setTitle(_('IPTV Streams')) self.initSelectionList() self.subMenuName = '' self.subMenuDescrName = '' self.level = self.LEVEL_FILES self.readMainXml2() count = 0 for x in self.xmlFiles: self.list.addSelection(x[self.LIST_CAT], x[self.LIST_NAME], count, False) count += 1 self['info'].setText('Streamslinks 2') def createTopMenu3(self): global STREAM STREAM = 3 self.setTitle(_('My Local Streams')) self.initSelectionList() self.subMenuName = '' self.subMenuDescrName = '' self.level = self.LEVEL_FILES self.readMainXml3() count = 0 for x in self.xmlFiles: self.list.addSelection(x[self.LIST_CAT], x[self.LIST_NAME], count, False) count += 1 self['info'].setText( 'Streamlinks Local:\n/usr/lib/enigma2/python/Plugins/Extensions/IPTVStreams/url/' ) def readXmlSubFile(self, fileName, descrName): self.initSelectionList() self.xmlList = [] self.subMenuName = fileName self.subMenuDescrName = descrName self.level = self.LEVEL_XML print 'self.LEVEL_XML =', self.LEVEL_XML print 'fileName =', fileName print 'descrName =', descrName print 'self.xmlList =', self.xmlList if STREAM == 1: self.readChannelXml(self.xmlList, fileName) print 'self.xmlList 1=', self.xmlList elif STREAM == 2: self.readChannelXml2(self.xmlList, fileName) print 'self.xmlList 2=', self.xmlList elif STREAM == 3: self.readChannelXml3(self.xmlList, fileName) print 'self.xmlList 3=', self.xmlList tmp = _('Last update') + ': %s\n\n%s' % (self.lastchanged, self.lastchanges) self['info'].setText(tmp) count = 0 for x in self.xmlCategories: self.list.addSelection(x, x, count, False) count += 1 def readXmlSubFile2(self, fileName, descrName): self.initSelectionList() self.xmlList = [] self.subMenuName = fileName self.subMenuDescrName = descrName self.level = self.LEVEL_XML self.readChannelXml3(self.xmlList, fileName) tmp = _('Last update') + ': %s\n\n%s' % (self.lastchanged, self.lastchanges) self['info'].setText(tmp) count = 0 for x in self.xmlCategories: self.list.addSelection(x, x, count, False) count += 1 def wgetUrl2(self, url2): std_headers = { 'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100627 Firefox/3.6.6', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-us,en;q=0.5' } outtxt = Request(url2, None, std_headers) try: outtxt = urlopen(url2).read() except (URLError, HTTPException) as err: return '' return outtxt def keyOk(self): if self.level == self.LEVEL_FILES: print 'in Keyok 1' self.keyGo() elif self.level == self.LEVEL_XML: print 'in Keyok 2' if len(self.xmlCategories) > 0: self.list.toggleSelection() def keyGo(self): if self.level == self.LEVEL_FILES: self.readXmlSubFile( self.xmlFiles[self.list.getSelectedIndex()][self.LIST_NAME], self.xmlFiles[self.list.getSelectedIndex()][self.LIST_CAT]) return self.doExit = False tmpList = [] tmpList = self.list.getSelectionsList() if len(tmpList) == 0: self.session.openWithCallback(self.infoCallback, MessageBox, _('Nothing selected'), MessageBox.TYPE_INFO) return self.xmlList.sort() tvFileList = [] radioFileList = [] for item in tmpList: if self.createUserBouquetFile(item[1], 'tv') > 0: tvFileList.append(item[1]) if self.createUserBouquetFile(item[1], 'radio') > 0: radioFileList.append(item[1]) if len(tvFileList) > 0: self.createBouquetFile(tvFileList, 'tv') if len(radioFileList) > 0: self.createBouquetFile(radioFileList, 'radio') db = eDVBDB.getInstance() db.reloadServicelist() db.reloadBouquets() self.doExit = True self.session.openWithCallback( self.infoCallback, MessageBox, _('Successfully Imported:\nChannels Now Available in your bouquet/Favorite list' ), MessageBox.TYPE_INFO) def infoCallback(self, confirmed): if self.doExit: self.createTopMenu() def createBouquetFile(self, catNames, fileType): newFileContent = '' fileContent = self.readFile(self.DIR_ENIGMA2 + 'bouquets.' + fileType) if fileContent == '': return for x in fileContent: x = self.stripLineEndings(x) isFound = False for cat in catNames: if '"userbouquet.streams_' + self.convertToFileName( self.subMenuName + cat) in x: isFound = True break if not isFound: newFileContent += x + '\n' for cat in catNames: newFileContent += '#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.streams_' + self.convertToFileName( self.subMenuName + cat) + '.' + fileType + '" ORDER BY bouquet\n' fp = open(self.DIR_ENIGMA2 + 'bouquets.' + fileType, 'w') fp.write(newFileContent) fp.close() def createUserBouquetFile(self, catName, fileType): ret = 0 newChannelList = [] newChannelList.append('#NAME Stream ' + self.subMenuDescrName + ' ' + catName) for x in self.xmlList: if x[self.LIST_CAT] == catName and x[self.LIST_TYPE] == fileType: newChannelList.append( '#SERVICE 4097:0:0:0:0:0:0:0:0:0:%s:%s' % (quote(x[self.LIST_URL]), quote(x[self.LIST_NAME]))) ret += 1 if ret > 0: fp = open( self.DIR_ENIGMA2 + 'userbouquet.streams_' + self.convertToFileName(self.subMenuName + catName) + '.' + fileType, 'w') for x in newChannelList: fp.write(x + '\n') fp.close() return ret def keyCancel(self): if self.level == self.LEVEL_FILES: self.close() elif self.level == self.LEVEL_XML: self.createTopMenu() def wgetUrl(self, url): std_headers = { 'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100627 Firefox/3.6.6', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-us,en;q=0.5' } outtxt = Request(url, None, std_headers) try: mickey = 'live' mouse = 'balu' skin = urllib2.HTTPPasswordMgrWithDefaultRealm() skin.add_password(None, url, mickey, mouse) skinner = urllib2.HTTPBasicAuthHandler(skin) opener = urllib2.build_opener(skinner) urllib2.install_opener(opener) outtxt = urllib2.urlopen(url).read() except (URLError, HTTPException) as err: return '' return outtxt def readFile(self, name): try: lines = open(name).readlines() return lines except: return '' def convertToFileName(self, name): return name.replace(' ', '_') def stripLineEndings(self, buf): return buf.strip('\r\n').strip('\n').strip('\t') def getText(self, nodelist): rc = [] for node in nodelist: if node.nodeType == node.TEXT_NODE: rc.append(node.data) return str(''.join(rc)) def readMainXml(self): xmlnode = [] pro = self.main1 + self.main2 + self.main3 + self.main4 + 'livestreams.xml' print pro lines = self.wgetUrl(pro) if lines == '': return xmlnode = parseString(lines) self.xmlFiles = [] tmp = xmlnode.getElementsByTagName('xmlfile') for i in range(len(tmp)): name = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('name')[0].childNodes)) cat = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('descr')[0].childNodes)) self.xmlFiles.append((name, cat)) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('description')[0].childNodes)) def readMainXml2(self): xmlnode = [] pro2 = self.url2 + 'livestreams.xml' print pro2 lines = self.wgetUrl2(pro2) if lines == '': return xmlnode = parseString(lines) self.xmlFiles = [] tmp = xmlnode.getElementsByTagName('xmlfile') for i in range(len(tmp)): name = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('name')[0].childNodes)) cat = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('descr')[0].childNodes)) self.xmlFiles.append((name, cat)) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('description')[0].childNodes)) def readMainXml3(self): xmlnode = [] path = '/usr/lib/enigma2/python/Plugins/Extensions/IPTVStreams/url/main.xml' pro2 = open(path).read() lines = pro2 if lines == '': return xmlnode = parseString(lines) self.xmlFiles = [] tmp = xmlnode.getElementsByTagName('xmlfile') for i in range(len(tmp)): name = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('name')[0].childNodes)) cat = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('descr')[0].childNodes)) self.xmlFiles.append((name, cat)) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('description')[0].childNodes)) def readChannelXml(self, tmpList, fileName): xmlnode = [] pro = self.main1 + self.main2 + self.main3 + self.main4 + fileName + '.xml' lines = self.wgetUrl(pro) if lines == '': return xmlnode = parseString(lines) self.xmlCategories = [] tmp = xmlnode.getElementsByTagName('stream') for i in range(len(tmp)): name = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('name')[0].childNodes)) url = self.stripLineEndings( self.getText(tmp[i].getElementsByTagName('url')[0].childNodes)) cat = self.stripLineEndings( self.getText(tmp[i].getElementsByTagName('cat')[0].childNodes)) type = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('type')[0].childNodes)) tmpList.append((name, cat, type, url)) foundCat = False for x in self.xmlCategories: if x == cat: foundCat = True break if not foundCat: self.xmlCategories.append(cat) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('description')[0].childNodes)) def readChannelXml2(self, tmpList, fileName): xmlnode = [] pro = self.url2 + fileName + '.xml' lines = self.wgetUrl2(pro) if lines == '': return xmlnode = parseString(lines) self.xmlCategories = [] tmp = xmlnode.getElementsByTagName('stream') for i in range(len(tmp)): name = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('name')[0].childNodes)) url = self.stripLineEndings( self.getText(tmp[i].getElementsByTagName('url')[0].childNodes)) cat = self.stripLineEndings( self.getText(tmp[i].getElementsByTagName('cat')[0].childNodes)) type = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('type')[0].childNodes)) tmpList.append((name, cat, type, url)) foundCat = False for x in self.xmlCategories: if x == cat: foundCat = True break if not foundCat: self.xmlCategories.append(cat) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('description')[0].childNodes)) def readChannelXml3(self, tmpList, fileName): xmlnode = [] PATH = '/usr/lib/enigma2/python/Plugins/Extensions/IPTVStreams/url/' lines = open(PATH + fileName + '.xml').read() print 'lines 3=', lines if lines == '': return xmlnode = parseString(lines) self.xmlCategories = [] tmp = xmlnode.getElementsByTagName('stream') for i in range(len(tmp)): name = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('name')[0].childNodes)) url = self.stripLineEndings( self.getText(tmp[i].getElementsByTagName('url')[0].childNodes)) cat = self.stripLineEndings( self.getText(tmp[i].getElementsByTagName('cat')[0].childNodes)) type = self.stripLineEndings( self.getText( tmp[i].getElementsByTagName('type')[0].childNodes)) tmpList.append((name, cat, type, url)) foundCat = False for x in self.xmlCategories: if x == cat: foundCat = True break if not foundCat: self.xmlCategories.append(cat) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings( self.getText( tmp[0].getElementsByTagName('description')[0].childNodes))
class StreamingChannelFromServerScreen(Screen): skin = '\n\t\t<screen name="StreamingChannelFromServerScreen" position="center,center" size="550,450" >\n\t\t\t<ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />\n\t\t\t<ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />\n\t\t\t<ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />\n\t\t\t<ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />\n\t\t\t<widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />\n\t\t\t<widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />\n\t\t\t<widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />\n\t\t\t<widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />\n\t\t\t<widget name="list" position="5,50" size="540,360" />\n\t\t\t<ePixmap pixmap="skin_default/div-h.png" position="0,410" zPosition="10" size="560,2" transparent="1" alphatest="on" />\n\t\t\t<widget source="statusbar" render="Label" position="5,420" zPosition="10" size="550,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />\n\t\t</screen>' def __init__(self, session): Screen.__init__(self, session) Screen.setTitle(self, _('Select bouquets to convert')) self.session = session self.workList = [] self.readIndex = 0 self.working = False self.hasFiles = False self.list = SelectionList() self['list'] = self.list self['key_red'] = StaticText(_('Close')) self['key_green'] = StaticText('') self['key_yellow'] = StaticText(_('Set server IP')) self['key_blue'] = StaticText('') self['statusbar'] = StaticText(_('Select a remote server IP first')) self['actions'] = ActionMap(['OkCancelActions', 'ColorActions'], {'ok': self.keyOk, 'cancel': self.close, 'red': self.close, 'green': self.keyGreen, 'yellow': self.keyYellow, 'blue': self.keyBlue}, -1) def keyOk(self): if self.working: return if self.readIndex > 0: self.list.toggleSelection() def keyBlue(self): if not self.hasFiles or self.working: return if self.readIndex > 0: try: self.list.toggleAllSelection() except AttributeError: self.list.toggleSelection() def keyYellow(self): if not self.hasFiles: self.session.openWithCallback(self.setRemoteIpCallback, ServerEditor) def setRemoteIpCallback(self, ret = False): if ret: self['statusbar'].setText(_('Testing remote connection')) timeout = 3000 self.currentLength = 0 self.total = 0 self.working = True creator = ClientCreator(reactor, FTPClient, config.plugins.RemoteStreamConverter.username.value, config.plugins.RemoteStreamConverter.password.value, config.plugins.RemoteStreamConverter.passive.value) creator.connectTCP(self.getRemoteAdress(), config.plugins.RemoteStreamConverter.port.value, timeout).addCallback(self.controlConnectionMade).addErrback(self.connectionFailed) def controlConnectionMade(self, ftpclient): self['statusbar'].setText(_('Connection to remote IP ok')) ftpclient.quit() self.fetchRemoteBouqets() def connectionFailed(self, *args): self.working = False self['statusbar'].setText(_('Could not connect to remote IP')) def fetchRemoteBouqets(self): self['statusbar'].setText(_('Downloading remote services')) self.readIndex = 0 self.workList = [] self.workList.append('bouquets.tv') self.workList.append('bouquets.radio') self.download(self.workList[0]).addCallback(self.fetchRemoteBouqetsFinished).addErrback(self.fetchRemoteBouqetsFailed) def fetchRemoteBouqetsFailed(self, string): self.working = False self['statusbar'].setText(_('Download from remote failed')) def fetchRemoteBouqetsFinished(self, string): self.readIndex += 1 if self.readIndex < len(self.workList): self.download(self.workList[self.readIndex]).addCallback(self.fetchRemoteBouqetsFinished).addErrback(self.fetchRemoteBouqetsFailed) else: self.parseBouqets() def parserWork(self, list, name): file = open(name) lines = file.readlines() file.close() if len(lines) > 0: for line in lines: if line.startswith('#SERVICE'): line = line.replace('\n', '').replace('\r', '').split() if not int(line[1].split(':')[1]) & eServiceReference.isInvisible: if len(line) > 3 and line[2] == 'BOUQUET' and (line[3].find('.tv') != -1 or line[3].find('.radio')): tmp = line[3].replace('"', '') if len(tmp) > 1 and tmp not in list: list.append(tmp) elif line[1].find('0:0:0:0:0:0:0:'): tmp = line[1].split('0:0:0:0:0:0:0:') if tmp[1] not in list: list.append(tmp[1]) def parseBouqets(self): list = [] self.parserWork(list, DIR_TMP + 'bouquets.tv') self.parserWork(list, DIR_TMP + 'bouquets.radio') self.readIndex = 0 self.workList = [] for listindex in range(len(list)): self.workList.append(list[listindex]) self.workList.append('lamedb') self.download(self.workList[0]).addCallback(self.fetchUserBouquetsFinished).addErrback(self.fetchUserBouquetsFailed) def fetchUserBouquetsFailed(self, string): print 'string', string if self.readIndex < len(self.workList) and self.readIndex > 0: self.workList.remove(self.workList[self.readIndex]) self.readIndex -= 1 self.fetchUserBouquetsFinished('') self.working = False self['statusbar'].setText(_('Download from remote failed')) def fetchUserBouquetsFinished(self, string): self.readIndex += 1 if self.readIndex < len(self.workList): self['statusbar'].setText(_('FTP reading bouquets %d of %d') % (self.readIndex, len(self.workList) - 1)) self.download(self.workList[self.readIndex]).addCallback(self.fetchUserBouquetsFinished).addErrback(self.fetchUserBouquetsFailed) elif len(self.workList) > 0: self.findAlternatives() self.alternativesCounter = 0 if len(self.alternatives) > 0: self.download(self.alternatives[self.alternativesCounter]).addCallback(self.downloadAlternativesCallback).addErrback(self.downloadAlternativesErrback) self['statusbar'].setText(_('Make your selection')) self.editBouquetNames() bouquetFilesContents = '' for suffix in ['tv', 'radio']: fp = open(DIR_ENIGMA2 + 'bouquets.' + suffix) bouquetFilesContents += fp.read() fp.close() for listindex in range(len(self.workList) - 1): truefalse = self.workList[listindex] in bouquetFilesContents name = self.readBouquetName(DIR_TMP + self.workList[listindex]) self.list.addSelection(name, self.workList[listindex], listindex, truefalse) self.removeFiles(DIR_TMP, 'bouquets.') self.working = False self.hasFiles = True self['key_green'].setText(_('Download')) self['key_blue'].setText(_('Invert')) self['key_yellow'].setText('') def download(self, file, contextFactory = None, *args, **kwargs): client = FTPDownloader(self.getRemoteAdress(), config.plugins.RemoteStreamConverter.port.value, (DIR_ENIGMA2 + file), (DIR_TMP + file), config.plugins.RemoteStreamConverter.username.value, config.plugins.RemoteStreamConverter.password.value, *args, **kwargs) return client.deferred def convertBouquets(self): self.readIndex = 0 while True: if 'lamedb' not in self.workList[self.readIndex]: filename = DIR_TMP + self.workList[self.readIndex] fp = open(DIR_ENIGMA2 + self.workList[self.readIndex], 'w') try: fp2 = open(filename) lines = fp2.readlines() fp2.close() was_html = False for line in lines: if was_html and '#DESCRIPTION' in line: was_html = False continue if '#NAME' in line: txt = _('remote of') line = '%s (%s %s) \n' % (line.rstrip('\n'), txt, self.getRemoteAdress()) was_html = False if 'http' in line: was_html = True continue elif '#SERVICE' in line: if int(line.split()[1].split(':')[1]) & eServiceReference.mustDescent: line = self.getAlternativeLine(line) if line == None: continue line = line.strip('\r\n') line = line.strip('\n') tmp = line.split('#SERVICE') if '::' in tmp[1]: desc = tmp[1].split('::') if len(desc) == 2: tmp2 = tmp[1].split('::') service_ref = ServiceReference(tmp2[0] + ':') tag = tmp2[0][1:] else: tag = tmp[1][1:-1] service_ref = ServiceReference(tag) out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + ':' + service_ref.getServiceName() + '\n' else: out = line fp.write(out) except: pass fp.close() self.readIndex += 1 if self.readIndex == len(self.workList): break self.removeFilesByPattern(DIR_TMP, '[.](tv|radio)$') return def getTransponders(self, fp): step = 0 fp2 = open(DIR_TMP + 'lamedb') lines = fp2.readlines() fp2.close() for line in lines: if step == 0: if 'transponders' in line: step = 1 elif step == 1: if 'end' in line[:3]: fp.write(line) break else: fp.write(line) def getServices(self, fp): step = 0 fp2 = open(DIR_TMP + 'lamedb') lines = fp2.readlines() fp2.close() for line in lines: if step == 0: if 'services' in line[:8]: step = 1 elif step == 1: if 'end' in line[:3]: fp.write(line) break else: fp.write(line) def createBouquetFile(self, target, source, matchstr, typestr): tmpFile = [] prefix = '%s%s.' % (RCSC_PREFIX, self.getRemoteAdress().replace('.', '_')) self.removeFiles(DIR_ENIGMA2, prefix) fp = open(target, 'w') try: fp2 = open(source) lines = fp2.readlines() fp2.close() for line in lines: if prefix not in line: tmpFile.append(line) fp.write(line) for item in self.workList: if typestr in item: tmp = matchstr + item + '" ORDER BY bouquet\n' match = False for x in tmpFile: if tmp in x: match = True if match is not True: fp.write(tmp) fp.close() self.copyFile(target, source) except: pass def keyGreen(self): if not self.hasFiles: return self.workList = [] tmpList = [] tmpList = self.list.getSelectionsList() if len(tmpList) == 0: self['statusbar'].setText(_('No bouquets selected')) return for item in tmpList: self.workList.append(item[1]) fileValid = False state = 0 fp = open(DIR_TMP + 'tmp_lamedb', 'w') try: fp2 = open(DIR_ENIGMA2 + 'lamedb') lines = fp2.readlines() fp2.close() for line in lines: if 'eDVB services' in line: fileValid = True if state == 0: if 'transponders' in line[:12]: fp.write(line) elif 'end' in line[:3]: self.getTransponders(fp) state = 1 else: fp.write(line) elif state == 1: if 'services' in line[:8]: fp.write(line) elif 'end' in line[:3]: self.getServices(fp) state = 2 else: fp.write(line) elif state == 2: fp.write(line) except: pass fp.close() if fileValid is not True: self.copyFile(DIR_TMP + 'lamedb', DIR_TMP + 'tmp_lamedb') tv = False radio = False for item in self.workList: if '.tv' in item: tv = True if '.radio' in item: radio = True if radio or tv: if tv: self.createBouquetFile(DIR_TMP + 'tmp_bouquets.tv', DIR_ENIGMA2 + 'bouquets.tv', '#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "', '.tv') if radio: self.createBouquetFile(DIR_TMP + 'tmp_bouquets.radio', DIR_ENIGMA2 + 'bouquets.radio', '#SERVICE 1:7:2:0:0:0:0:0:0:0:FROM BOUQUET "', '.radio') self.copyFile(DIR_TMP + 'tmp_lamedb', DIR_ENIGMA2 + 'lamedb') db = eDVBDB.getInstance() db.reloadServicelist() self.convertBouquets() self.removeFiles(DIR_TMP, 'tmp_') self.removeFiles(DIR_TMP, 'lamedb') db = eDVBDB.getInstance() db.reloadServicelist() db.reloadBouquets() self.close() def getRemoteAdress(self): if config.plugins.RemoteStreamConverter.address.value != '': return config.plugins.RemoteStreamConverter.address.value else: return '%d.%d.%d.%d' % (config.plugins.RemoteStreamConverter.ip.value[0], config.plugins.RemoteStreamConverter.ip.value[1], config.plugins.RemoteStreamConverter.ip.value[2], config.plugins.RemoteStreamConverter.ip.value[3]) def readBouquetName(self, filename): try: fp = open(filename) lines = fp.readlines() fp.close() for line in lines: if '#NAME' in line: tmp = line.split('#NAME ') if '\r' in tmp[1]: bouquetname = tmp[1].split('\r\n')[0] else: bouquetname = tmp[1].split('\n')[0] return bouquetname except: pass return '' def readBouquetList(self, list, rootstr): bouquet_root = eServiceReference(rootstr) if bouquet_root is not None: serviceHandler = eServiceCenter.getInstance() if serviceHandler is not None: servicelist = serviceHandler.list(bouquet_root) if servicelist is not None: while True: service = servicelist.getNext() if not service.valid(): break tmp = service.toString() if len(tmp) > 1 and len(tmp[1]) > 0: tmp2 = tmp.split()[2].replace('"', '') name = self.readBouquetName(DIR_ENIGMA2 + tmp2) list.append((name, tmp2)) return def removeFiles(self, targetdir, target): targetLen = len(target) for root, dirs, files in os.walk(targetdir): for name in files: if target in name[:targetLen]: os.remove(os.path.join(root, name)) def removeFilesByPattern(self, targetdir, target): for root, dirs, files in os.walk(targetdir): for name in files: if re.search(target, name) is not None: os.remove(os.path.join(root, name)) return def copyFile(self, source, dest): import shutil shutil.copy2(source, dest) def editBouquetNames(self): self.removeFiles(DIR_TMP, RCSC_PREFIX) tmp_workList = [] for filename in self.workList: if filename.startswith(RCSC_PREFIX): continue if filename == 'lamedb': tmp_workList.append(filename) if filename.endswith('.tv') or filename.endswith('.radio'): newFilename = '%s%s.%s' % (RCSC_PREFIX, self.getRemoteAdress().replace('.', '_'), filename) os.rename(DIR_TMP + filename, DIR_TMP + newFilename) tmp_workList.append(newFilename) self.workList = tmp_workList def findAlternatives(self): self['statusbar'].setText(_('Checking for alternatives')) self.alternatives = [] for filename in self.workList: if filename != 'lamedb': try: fp = open(DIR_TMP + filename) lines = fp.readlines() fp.close() for line in lines: if '#SERVICE' in line and int(line.split()[1].split(':')[1]) & eServiceReference.mustDescent: if int(line.split()[1].split(':')[1]) & eServiceReference.mustDescent: result = re.match('^.*FROM BOUQUET "(.+)" ORDER BY.*$', line) or re.match('[#]SERVICE[:] (?:[0-9a-f]+[:])+([^:]+[.](?:tv|radio))$', line, re.IGNORECASE) if result is None: continue self.alternatives.append(result.group(1)) except: pass return def downloadAlternativesCallback(self, string): self.alternativesCounter += 1 if self.alternativesCounter < len(self.alternatives): self['statusbar'].setText(_('FTP reading alternatives %d of %d') % (self.alternativesCounter, len(self.alternatives) - 1)) self.download(self.alternatives[self.alternativesCounter]).addCallback(self.downloadAlternativesCallback).addErrback(self.downloadAlternativesErrback) else: self['statusbar'].setText(_('Make your selection')) def downloadAlternativesErrback(self, string): print "[RCSC] error downloading alternative: '%s', error: %s" % (self.alternatives[self.alternativesCounter], string) self.downloadAlternativesCallback(string) def getAlternativeLine(self, line): result = re.match('^.*FROM BOUQUET "(.+)" ORDER BY.*$', line) or re.match('[#]SERVICE[:] (?:[0-9a-f]+[:])+([^:]+[.](?:tv|radio))$', line, re.IGNORECASE) if result is None: return else: filename = result.group(1) if filename in self.alternatives: try: fp = open(DIR_TMP + filename) lines = fp.readlines() fp.close() for line in lines: if '#SERVICE' in line: return line except: pass return
class StreamingChannelFromServerScreen(Screen): skin = """ <screen name="StreamingChannelFromServerScreen" position="center,center" size="550,450" > <ePixmap pixmap="buttons/red.png" position="0,0" size="140,40" alphatest="on" /> <ePixmap pixmap="buttons/green.png" position="140,0" size="140,40" alphatest="on" /> <ePixmap pixmap="buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> <ePixmap pixmap="buttons/blue.png" position="420,0" size="140,40" alphatest="on" /> <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> <widget name="list" position="5,50" size="540,360" /> <ePixmap pixmap="div-h.png" position="0,410" zPosition="10" size="560,2" transparent="1" alphatest="on" /> <widget source="statusbar" render="Label" position="5,420" zPosition="10" size="550,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> </screen>""" def __init__(self, session): Screen.__init__(self, session) Screen.setTitle(self, _("Select bouquets to convert")) self.session = session self.workList = [] self.readIndex = 0 self.working = False self.hasFiles = False self.list = SelectionList() self["list"] = self.list self["key_red"] = StaticText(_("Close")) self["key_green"] = StaticText("") self["key_yellow"] = StaticText(_("Set server IP")) self["key_blue"] = StaticText("") self["statusbar"] = StaticText(_("Select a remote server IP first")) self["actions"] = ActionMap( ["OkCancelActions", "ColorActions"], { "ok": self.keyOk, "cancel": self.close, "red": self.close, "green": self.keyGreen, "yellow": self.keyYellow, "blue": self.keyBlue }, -1) def keyOk(self): if self.working: return if self.readIndex > 0: self.list.toggleSelection() def keyBlue(self): if not self.hasFiles or self.working: return if self.readIndex > 0: try: self.list.toggleAllSelection() except AttributeError: self.list.toggleSelection() def keyYellow(self): if not self.hasFiles: self.session.openWithCallback(self.setRemoteIpCallback, ServerEditor) def setRemoteIpCallback(self, ret=False): if ret: self["statusbar"].setText(_("Testing remote connection")) timeout = 3000 self.currentLength = 0 self.total = 0 self.working = True creator = ClientCreator( reactor, FTPClient, config.plugins.RemoteStreamConverter.username.value, config.plugins.RemoteStreamConverter.password.value, config.plugins.RemoteStreamConverter.passive.value) creator.connectTCP(self.getRemoteAdress(), config.plugins.RemoteStreamConverter.port.value, timeout).addCallback( self.controlConnectionMade).addErrback( self.connectionFailed) def controlConnectionMade(self, ftpclient): self["statusbar"].setText(_("Connection to remote IP ok")) ftpclient.quit() self.fetchRemoteBouqets() def connectionFailed(self, *args): self.working = False self["statusbar"].setText(_("Could not connect to remote IP")) def fetchRemoteBouqets(self): self["statusbar"].setText(_("Downloading remote services")) self.readIndex = 0 self.workList = [] self.workList.append('bouquets.tv') self.workList.append('bouquets.radio') self.download(self.workList[0]).addCallback( self.fetchRemoteBouqetsFinished).addErrback( self.fetchRemoteBouqetsFailed) def fetchRemoteBouqetsFailed(self, string): self.working = False self["statusbar"].setText(_("Download from remote failed")) def fetchRemoteBouqetsFinished(self, string): self.readIndex += 1 if self.readIndex < len(self.workList): self.download(self.workList[self.readIndex]).addCallback( self.fetchRemoteBouqetsFinished).addErrback( self.fetchRemoteBouqetsFailed) else: self.parseBouqets() def parserWork(self, list, name): file = open(name) lines = file.readlines() file.close() if len(lines) > 0: for line in lines: if line.startswith('#SERVICE'): line = line.replace('\n', '').replace('\r', '').split() if not int(line[1].split(":") [1]) & eServiceReference.isInvisible: if len(line) > 3 and line[2] == 'BOUQUET' and ( line[3].find('.tv') != -1 or line[3].find('.radio')): tmp = line[3].replace('"', '') if len(tmp) > 1 and tmp not in list: list.append(tmp) elif line[1].find('0:0:0:0:0:0:0:'): tmp = line[1].split('0:0:0:0:0:0:0:') if tmp[1] not in list: list.append(tmp[1]) def parseBouqets(self): list = [] self.parserWork(list, DIR_TMP + 'bouquets.tv') self.parserWork(list, DIR_TMP + 'bouquets.radio') self.readIndex = 0 self.workList = [] for listindex in range(len(list)): self.workList.append(list[listindex]) self.workList.append('lamedb') self.download(self.workList[0]).addCallback( self.fetchUserBouquetsFinished).addErrback( self.fetchUserBouquetsFailed) def fetchUserBouquetsFailed(self, string): print "string", string if self.readIndex < len(self.workList) and self.readIndex > 0: self.workList.remove(self.workList[self.readIndex]) self.readIndex -= 1 self.fetchUserBouquetsFinished('') self.working = False self["statusbar"].setText(_("Download from remote failed")) def fetchUserBouquetsFinished(self, string): self.readIndex += 1 if self.readIndex < len(self.workList): self["statusbar"].setText( _("FTP reading bouquets %d of %d") % (self.readIndex, len(self.workList) - 1)) self.download(self.workList[self.readIndex]).addCallback( self.fetchUserBouquetsFinished).addErrback( self.fetchUserBouquetsFailed) else: if len(self.workList) > 0: # Download alternatives files where services have alternatives self.findAlternatives() self.alternativesCounter = 0 if len(self.alternatives) > 0: self.download(self.alternatives[ self.alternativesCounter]).addCallback( self.downloadAlternativesCallback).addErrback( self.downloadAlternativesErrback) self["statusbar"].setText(_("Make your selection")) self.editBouquetNames() bouquetFilesContents = '' for suffix in ['tv', 'radio']: fp = open(DIR_ENIGMA2 + "bouquets." + suffix) bouquetFilesContents += fp.read() fp.close() for listindex in range(len(self.workList) - 1): truefalse = self.workList[ listindex] in bouquetFilesContents name = self.readBouquetName(DIR_TMP + self.workList[listindex]) self.list.addSelection(name, self.workList[listindex], listindex, truefalse) self.removeFiles(DIR_TMP, "bouquets.") self.working = False self.hasFiles = True self["key_green"].setText(_("Download")) self["key_blue"].setText(_("Invert")) self["key_yellow"].setText("") def download(self, file, contextFactory=None, *args, **kwargs): client = FTPDownloader( self.getRemoteAdress(), config.plugins.RemoteStreamConverter.port.value, DIR_ENIGMA2 + file, DIR_TMP + file, config.plugins.RemoteStreamConverter.username.value, config.plugins.RemoteStreamConverter.password.value, *args, **kwargs) return client.deferred def convertBouquets(self): self.readIndex = 0 while True: if 'lamedb' not in self.workList[self.readIndex]: filename = DIR_TMP + self.workList[self.readIndex] fp = open(DIR_ENIGMA2 + self.workList[self.readIndex], 'w') try: fp2 = open(filename) lines = fp2.readlines() fp2.close() was_html = False for line in lines: if was_html and '#DESCRIPTION' in line: was_html = False continue if '#NAME' in line: txt = _("remote of") line = "%s (%s %s) \n" % (line.rstrip('\n'), txt, self.getRemoteAdress()) was_html = False if 'http' in line: was_html = True continue elif '#SERVICE' in line: # alternative services that cannot be fed directly into the "play"-handler. if int(line.split()[1].split(":") [1]) & eServiceReference.mustDescent: line = self.getAlternativeLine(line) if line == None: continue # normal services line = line.strip('\r\n') line = line.strip('\n') tmp = line.split('#SERVICE') if '::' in tmp[1]: desc = tmp[1].split("::") if (len(desc)) == 2: tmp2 = tmp[1].split('::') service_ref = ServiceReference(tmp2[0] + ':') tag = tmp2[0][1:] else: tag = tmp[1][1:-1] service_ref = ServiceReference(tag) out = '#SERVICE ' + tag + ':' + quote( 'http://' + self.getRemoteAdress() + ':8001/' + tag) + ':' + service_ref.getServiceName( ) + '\n' else: out = line fp.write(out) except: pass fp.close() self.readIndex += 1 if self.readIndex == len(self.workList): break self.removeFilesByPattern(DIR_TMP, "[.](tv|radio)$") def getTransponders(self, fp): step = 0 fp2 = open(DIR_TMP + 'lamedb') lines = fp2.readlines() fp2.close() for line in lines: if step == 0: if 'transponders' in line: step = 1 elif step == 1: if 'end' in line[:3]: fp.write(line) break else: fp.write(line) def getServices(self, fp): step = 0 fp2 = open(DIR_TMP + 'lamedb') lines = fp2.readlines() fp2.close() for line in lines: if step == 0: if 'services' in line[:8]: step = 1 elif step == 1: if 'end' in line[:3]: fp.write(line) break else: fp.write(line) def createBouquetFile(self, target, source, matchstr, typestr): tmpFile = [] prefix = "%s%s." % (RCSC_PREFIX, self.getRemoteAdress().replace( '.', '_')) self.removeFiles(DIR_ENIGMA2, prefix) fp = open(target, 'w') try: fp2 = open(source) lines = fp2.readlines() fp2.close() for line in lines: if prefix not in line: tmpFile.append(line) fp.write(line) for item in self.workList: if typestr in item: tmp = matchstr + item + '\" ORDER BY bouquet\n' match = False for x in tmpFile: if tmp in x: match = True if match is not True: fp.write(tmp) fp.close() self.copyFile(target, source) except: pass def keyGreen(self): if not self.hasFiles: return self.workList = [] tmpList = [] tmpList = self.list.getSelectionsList() if len(tmpList) == 0: self["statusbar"].setText(_("No bouquets selected")) return for item in tmpList: self.workList.append(item[1]) fileValid = False state = 0 fp = open(DIR_TMP + 'tmp_lamedb', 'w') try: fp2 = open(DIR_ENIGMA2 + 'lamedb') lines = fp2.readlines() fp2.close() for line in lines: if 'eDVB services' in line: fileValid = True if state == 0: if 'transponders' in line[:12]: fp.write(line) elif 'end' in line[:3]: self.getTransponders(fp) state = 1 else: fp.write(line) elif state == 1: if 'services' in line[:8]: fp.write(line) elif 'end' in line[:3]: self.getServices(fp) state = 2 else: fp.write(line) elif state == 2: fp.write(line) except: pass fp.close() if fileValid is not True: self.copyFile(DIR_TMP + 'lamedb', DIR_TMP + 'tmp_lamedb') tv = False radio = False for item in self.workList: if '.tv' in item: tv = True if '.radio' in item: radio = True if radio or tv: if tv: self.createBouquetFile( DIR_TMP + 'tmp_bouquets.tv', DIR_ENIGMA2 + 'bouquets.tv', '#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET \"', '.tv') if radio: self.createBouquetFile( DIR_TMP + 'tmp_bouquets.radio', DIR_ENIGMA2 + 'bouquets.radio', '#SERVICE 1:7:2:0:0:0:0:0:0:0:FROM BOUQUET \"', '.radio') self.copyFile(DIR_TMP + 'tmp_lamedb', DIR_ENIGMA2 + 'lamedb') db = eDVBDB.getInstance() db.reloadServicelist() self.convertBouquets() self.removeFiles(DIR_TMP, "tmp_") self.removeFiles(DIR_TMP, "lamedb") db = eDVBDB.getInstance() db.reloadServicelist() db.reloadBouquets() self.close() def getRemoteAdress(self): if config.plugins.RemoteStreamConverter.address.value != "": return config.plugins.RemoteStreamConverter.address.value else: return '%d.%d.%d.%d' % ( config.plugins.RemoteStreamConverter.ip.value[0], config.plugins.RemoteStreamConverter.ip.value[1], config.plugins.RemoteStreamConverter.ip.value[2], config.plugins.RemoteStreamConverter.ip.value[3]) def readBouquetName(self, filename): try: fp = open(filename) lines = fp.readlines() fp.close() for line in lines: if '#NAME' in line: tmp = line.split('#NAME ') if '\r' in tmp[1]: bouquetname = tmp[1].split('\r\n')[0] else: bouquetname = tmp[1].split('\n')[0] return bouquetname except: pass return "" def readBouquetList(self, list, rootstr): bouquet_root = eServiceReference(rootstr) if not bouquet_root is None: serviceHandler = eServiceCenter.getInstance() if not serviceHandler is None: servicelist = serviceHandler.list(bouquet_root) if not servicelist is None: while True: service = servicelist.getNext() if not service.valid(): break tmp = service.toString() if len(tmp) > 1 and len(tmp[1]) > 0: tmp2 = tmp.split()[2].replace('"', '') name = self.readBouquetName(DIR_ENIGMA2 + tmp2) list.append((name, tmp2)) def removeFiles(self, targetdir, target): targetLen = len(target) for root, dirs, files in os.walk(targetdir): for name in files: if target in name[:targetLen]: os.remove(os.path.join(root, name)) def removeFilesByPattern(self, targetdir, target): for root, dirs, files in os.walk(targetdir): for name in files: if re.search(target, name) is not None: os.remove(os.path.join(root, name)) def copyFile(self, source, dest): import shutil shutil.copy2(source, dest) def editBouquetNames(self): self.removeFiles(DIR_TMP, RCSC_PREFIX) tmp_workList = [] for filename in self.workList: if filename.startswith(RCSC_PREFIX): continue if filename == 'lamedb': tmp_workList.append(filename) if filename.endswith('.tv') or filename.endswith('.radio'): newFilename = "%s%s.%s" % (RCSC_PREFIX, self.getRemoteAdress().replace( '.', '_'), filename) os.rename(DIR_TMP + filename, DIR_TMP + newFilename) tmp_workList.append(newFilename) self.workList = tmp_workList def findAlternatives(self): self["statusbar"].setText(_("Checking for alternatives")) self.alternatives = [] for filename in self.workList: if filename != "lamedb": try: fp = open(DIR_TMP + filename) lines = fp.readlines() fp.close() for line in lines: if '#SERVICE' in line and int(line.split()[1].split( ":")[1]) & eServiceReference.mustDescent: if int(line.split()[1].split(":") [1]) & eServiceReference.mustDescent: result = re.match( "^.*FROM BOUQUET \"(.+)\" ORDER BY.*$", line ) or re.match( "[#]SERVICE[:] (?:[0-9a-f]+[:])+([^:]+[.](?:tv|radio))$", line, re.IGNORECASE) if result is None: continue self.alternatives.append(result.group(1)) except: pass def downloadAlternativesCallback(self, string): self.alternativesCounter += 1 if self.alternativesCounter < len(self.alternatives): self["statusbar"].setText( _("FTP reading alternatives %d of %d") % (self.alternativesCounter, len(self.alternatives) - 1)) self.download( self.alternatives[self.alternativesCounter]).addCallback( self.downloadAlternativesCallback).addErrback( self.downloadAlternativesErrback) else: self["statusbar"].setText(_("Make your selection")) def downloadAlternativesErrback(self, string): print "[RCSC] error downloading alternative: '%s', error: %s" % ( self.alternatives[self.alternativesCounter], string) self.downloadAlternativesCallback(string) def getAlternativeLine(self, line): result = re.match( "^.*FROM BOUQUET \"(.+)\" ORDER BY.*$", line) or re.match( "[#]SERVICE[:] (?:[0-9a-f]+[:])+([^:]+[.](?:tv|radio))$", line, re.IGNORECASE) if result is None: return None filename = result.group(1) if filename in self.alternatives: try: fp = open(DIR_TMP + filename) lines = fp.readlines() fp.close() for line in lines: if '#SERVICE' in line: return line except: pass return None
class IPTVStreams(Screen): LIST_NAME = 0 LIST_CAT = 1 LIST_TYPE = 2 LIST_URL = 3 LEVEL_FILES = 0 LEVEL_XML = 1 DIR_ENIGMA2 = '/etc/enigma2/' url2 = 'http://et-live-links.googlecode.com/svn/trunk/' main1 = 'http://' main2 = 'livestream' main3 = '.et-view-support.com' main4 = '/testing/' skin = '''<screen position="c-300,c-210" size="600,420" title=""> <widget name="list" position="10,10" size="e-20,210" scrollbarMode="showOnDemand" /> <widget source="info" render="Label" position="10,250" size="e-20,80" halign="center" valign="top" font="Regular;17" /> <ePixmap pixmap="skin_default/buttons/green.png" position="c-150,e-45" size="140,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/yellow.png" position="c-0,e-45" size="140,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/red.png" position="c-300,e-45" size="140,40" alphatest="on" /> <widget source="key_green" render="Label" position="c-150,e-45" zPosition="1" size="140,40" font="Regular;16" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> <widget source="key_red" render="Label" position="c-300,e-45" zPosition="1" size="140,40" font="Regular;16" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> <widget source="key_yellow" render="Label" position="c-0,e-45" zPosition="1" size="140,40" font="Regular;16" halign="center" valign="center" backgroundColor="#a58b00" transparent="1" /> </screen>''' def __init__(self, session): self.skin = IPTVStreams.skin Screen.__init__(self, session) self['key_red'] = StaticText(_('Cancel')) self['key_yellow'] = StaticText(_('Change\nStreams')) self['key_green'] = StaticText(_('Download')) self['actions'] = ActionMap(['SetupActions', 'NumberActions', 'ColorActions'], {'ok': self.keyOk, 'save': self.keyGo, 'cancel': self.keyCancel, 'yellow': self.changeMenu, 'green': self.keyGo, 'red': self.keyCancel}, -2) self.list = SelectionList() self['list'] = self.list self['info'] = StaticText('') self.doExit = False self.level = self.LEVEL_FILES self.subMenuName = '' self.subMenuDescrName = '' self.xmlFiles = [] self.xmlCategories = [] self.lastchanged = '' self.lastchanges = '' self.onLayoutFinish.append(self.createTopMenu) def changeMenu(self): global STREAM if STREAM == 1: self.createTopMenu2() elif STREAM == 2: self.createTopMenu3() elif STREAM == 3: self.createTopMenu() def initSelectionList(self): list = [] self.list.setList(list) def createTopMenu(self): global STREAM STREAM = 1 self.setTitle(_('IPTV Streams')) self.initSelectionList() self.subMenuName = '' self.subMenuDescrName = '' self.level = self.LEVEL_FILES self.readMainXml() count = 0 for x in self.xmlFiles: self.list.addSelection(x[self.LIST_CAT], x[self.LIST_NAME], count, False) count += 1 self['info'].setText('Streamlinks 1') def createTopMenu2(self): global STREAM STREAM = 2 self.setTitle(_('IPTV Streams')) self.initSelectionList() self.subMenuName = '' self.subMenuDescrName = '' self.level = self.LEVEL_FILES self.readMainXml2() count = 0 for x in self.xmlFiles: self.list.addSelection(x[self.LIST_CAT], x[self.LIST_NAME], count, False) count += 1 self['info'].setText('Streamslinks 2') def createTopMenu3(self): global STREAM STREAM = 3 self.setTitle(_('My Local Streams')) self.initSelectionList() self.subMenuName = '' self.subMenuDescrName = '' self.level = self.LEVEL_FILES self.readMainXml3() count = 0 for x in self.xmlFiles: self.list.addSelection(x[self.LIST_CAT], x[self.LIST_NAME], count, False) count += 1 self['info'].setText('Streamlinks Local:\n/usr/lib/enigma2/python/Plugins/Extensions/IPTVStreams/url/') def readXmlSubFile(self, fileName, descrName): self.initSelectionList() self.xmlList = [] self.subMenuName = fileName self.subMenuDescrName = descrName self.level = self.LEVEL_XML print 'self.LEVEL_XML =', self.LEVEL_XML print 'fileName =', fileName print 'descrName =', descrName print 'self.xmlList =', self.xmlList if STREAM == 1: self.readChannelXml(self.xmlList, fileName) print 'self.xmlList 1=', self.xmlList elif STREAM == 2: self.readChannelXml2(self.xmlList, fileName) print 'self.xmlList 2=', self.xmlList elif STREAM == 3: self.readChannelXml3(self.xmlList, fileName) print 'self.xmlList 3=', self.xmlList tmp = _('Last update') + ': %s\n\n%s' % (self.lastchanged, self.lastchanges) self['info'].setText(tmp) count = 0 for x in self.xmlCategories: self.list.addSelection(x, x, count, False) count += 1 def readXmlSubFile2(self, fileName, descrName): self.initSelectionList() self.xmlList = [] self.subMenuName = fileName self.subMenuDescrName = descrName self.level = self.LEVEL_XML self.readChannelXml3(self.xmlList, fileName) tmp = _('Last update') + ': %s\n\n%s' % (self.lastchanged, self.lastchanges) self['info'].setText(tmp) count = 0 for x in self.xmlCategories: self.list.addSelection(x, x, count, False) count += 1 def wgetUrl2(self, url2): std_headers = {'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100627 Firefox/3.6.6', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-us,en;q=0.5'} outtxt = Request(url2, None, std_headers) try: outtxt = urlopen(url2).read() except (URLError, HTTPException) as err: return '' return outtxt def keyOk(self): if self.level == self.LEVEL_FILES: print 'in Keyok 1' self.keyGo() elif self.level == self.LEVEL_XML: print 'in Keyok 2' if len(self.xmlCategories) > 0: self.list.toggleSelection() def keyGo(self): if self.level == self.LEVEL_FILES: self.readXmlSubFile(self.xmlFiles[self.list.getSelectedIndex()][self.LIST_NAME], self.xmlFiles[self.list.getSelectedIndex()][self.LIST_CAT]) return self.doExit = False tmpList = [] tmpList = self.list.getSelectionsList() if len(tmpList) == 0: self.session.openWithCallback(self.infoCallback, MessageBox, _('Nothing selected'), MessageBox.TYPE_INFO) return self.xmlList.sort() tvFileList = [] radioFileList = [] for item in tmpList: if self.createUserBouquetFile(item[1], 'tv') > 0: tvFileList.append(item[1]) if self.createUserBouquetFile(item[1], 'radio') > 0: radioFileList.append(item[1]) if len(tvFileList) > 0: self.createBouquetFile(tvFileList, 'tv') if len(radioFileList) > 0: self.createBouquetFile(radioFileList, 'radio') db = eDVBDB.getInstance() db.reloadServicelist() db.reloadBouquets() self.doExit = True self.session.openWithCallback(self.infoCallback, MessageBox, _('Successfully Imported:\nChannels Now Available in your bouquet/Favorite list'), MessageBox.TYPE_INFO) def infoCallback(self, confirmed): if self.doExit: self.createTopMenu() def createBouquetFile(self, catNames, fileType): newFileContent = '' fileContent = self.readFile(self.DIR_ENIGMA2 + 'bouquets.' + fileType) if fileContent == '': return for x in fileContent: x = self.stripLineEndings(x) isFound = False for cat in catNames: if '"userbouquet.streams_' + self.convertToFileName(self.subMenuName + cat) in x: isFound = True break if not isFound: newFileContent += x + '\n' for cat in catNames: newFileContent += '#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.streams_' + self.convertToFileName(self.subMenuName + cat) + '.' + fileType + '" ORDER BY bouquet\n' fp = open(self.DIR_ENIGMA2 + 'bouquets.' + fileType, 'w') fp.write(newFileContent) fp.close() def createUserBouquetFile(self, catName, fileType): ret = 0 newChannelList = [] newChannelList.append('#NAME Stream ' + self.subMenuDescrName + ' ' + catName) for x in self.xmlList: if x[self.LIST_CAT] == catName and x[self.LIST_TYPE] == fileType: newChannelList.append('#SERVICE 4097:0:0:0:0:0:0:0:0:0:%s:%s' % (quote(x[self.LIST_URL]), quote(x[self.LIST_NAME]))) ret += 1 if ret > 0: fp = open(self.DIR_ENIGMA2 + 'userbouquet.streams_' + self.convertToFileName(self.subMenuName + catName) + '.' + fileType, 'w') for x in newChannelList: fp.write(x + '\n') fp.close() return ret def keyCancel(self): if self.level == self.LEVEL_FILES: self.close() elif self.level == self.LEVEL_XML: self.createTopMenu() def wgetUrl(self, url): std_headers = {'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100627 Firefox/3.6.6', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-us,en;q=0.5'} outtxt = Request(url, None, std_headers) try: mickey = 'live' mouse = 'balu' skin = urllib2.HTTPPasswordMgrWithDefaultRealm() skin.add_password(None, url, mickey, mouse) skinner = urllib2.HTTPBasicAuthHandler(skin) opener = urllib2.build_opener(skinner) urllib2.install_opener(opener) outtxt = urllib2.urlopen(url).read() except (URLError, HTTPException) as err: return '' return outtxt def readFile(self, name): try: lines = open(name).readlines() return lines except: return '' def convertToFileName(self, name): return name.replace(' ', '_') def stripLineEndings(self, buf): return buf.strip('\r\n').strip('\n').strip('\t') def getText(self, nodelist): rc = [] for node in nodelist: if node.nodeType == node.TEXT_NODE: rc.append(node.data) return str(''.join(rc)) def readMainXml(self): xmlnode = [] pro = self.main1 + self.main2 + self.main3 + self.main4 + 'livestreams.xml' print pro lines = self.wgetUrl(pro) if lines == '': return xmlnode = parseString(lines) self.xmlFiles = [] tmp = xmlnode.getElementsByTagName('xmlfile') for i in range(len(tmp)): name = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('name')[0].childNodes)) cat = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('descr')[0].childNodes)) self.xmlFiles.append((name, cat)) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('description')[0].childNodes)) def readMainXml2(self): xmlnode = [] pro2 = self.url2 + 'livestreams.xml' print pro2 lines = self.wgetUrl2(pro2) if lines == '': return xmlnode = parseString(lines) self.xmlFiles = [] tmp = xmlnode.getElementsByTagName('xmlfile') for i in range(len(tmp)): name = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('name')[0].childNodes)) cat = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('descr')[0].childNodes)) self.xmlFiles.append((name, cat)) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('description')[0].childNodes)) def readMainXml3(self): xmlnode = [] path = '/usr/lib/enigma2/python/Plugins/Extensions/IPTVStreams/url/main.xml' pro2 = open(path).read() lines = pro2 if lines == '': return xmlnode = parseString(lines) self.xmlFiles = [] tmp = xmlnode.getElementsByTagName('xmlfile') for i in range(len(tmp)): name = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('name')[0].childNodes)) cat = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('descr')[0].childNodes)) self.xmlFiles.append((name, cat)) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('description')[0].childNodes)) def readChannelXml(self, tmpList, fileName): xmlnode = [] pro = self.main1 + self.main2 + self.main3 + self.main4 + fileName + '.xml' lines = self.wgetUrl(pro) if lines == '': return xmlnode = parseString(lines) self.xmlCategories = [] tmp = xmlnode.getElementsByTagName('stream') for i in range(len(tmp)): name = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('name')[0].childNodes)) url = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('url')[0].childNodes)) cat = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('cat')[0].childNodes)) type = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('type')[0].childNodes)) tmpList.append((name, cat, type, url)) foundCat = False for x in self.xmlCategories: if x == cat: foundCat = True break if not foundCat: self.xmlCategories.append(cat) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('description')[0].childNodes)) def readChannelXml2(self, tmpList, fileName): xmlnode = [] pro = self.url2 + fileName + '.xml' lines = self.wgetUrl2(pro) if lines == '': return xmlnode = parseString(lines) self.xmlCategories = [] tmp = xmlnode.getElementsByTagName('stream') for i in range(len(tmp)): name = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('name')[0].childNodes)) url = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('url')[0].childNodes)) cat = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('cat')[0].childNodes)) type = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('type')[0].childNodes)) tmpList.append((name, cat, type, url)) foundCat = False for x in self.xmlCategories: if x == cat: foundCat = True break if not foundCat: self.xmlCategories.append(cat) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('description')[0].childNodes)) def readChannelXml3(self, tmpList, fileName): xmlnode = [] PATH = '/usr/lib/enigma2/python/Plugins/Extensions/IPTVStreams/url/' lines = open(PATH + fileName + '.xml').read() print 'lines 3=', lines if lines == '': return xmlnode = parseString(lines) self.xmlCategories = [] tmp = xmlnode.getElementsByTagName('stream') for i in range(len(tmp)): name = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('name')[0].childNodes)) url = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('url')[0].childNodes)) cat = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('cat')[0].childNodes)) type = self.stripLineEndings(self.getText(tmp[i].getElementsByTagName('type')[0].childNodes)) tmpList.append((name, cat, type, url)) foundCat = False for x in self.xmlCategories: if x == cat: foundCat = True break if not foundCat: self.xmlCategories.append(cat) tmp = xmlnode.getElementsByTagName('comments') if len(tmp) == 1: self.lastchanged = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('lastchange')[0].childNodes)) self.lastchanges = self.stripLineEndings(self.getText(tmp[0].getElementsByTagName('description')[0].childNodes))
class RemoteTunerServerDownloader(Screen): skin = """ <screen name="RemoteTunerServerDownloader" position="center,center" size="550,450" title="Select bouquets to convert" > <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" /> <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> <widget name="config" position="5,50" size="540,360" /> <ePixmap pixmap="skin_default/div-h.png" position="0,410" zPosition="10" size="560,2" transparent="1" alphatest="on" /> <widget name="text" position="5,420" zPosition="10" size="550,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> </screen>""" def __init__(self, session): Screen.__init__(self, session) self.session = session self.workList = [] self.readIndex = 0 self.working = False self.hasFiles = False self.list = SelectionList() self["config"] = self.list self["key_red"] = StaticText(_("Back")) self["key_green"] = StaticText("") self["key_yellow"] = StaticText("") self["key_blue"] = StaticText("") self["text"] = Label() self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], { "ok": self.keyOk, "cancel": self.keyExit, "red": self.keyExit, "green": self.keyGreen, "blue": self.keyBlue }, -1) self.setTitle(_("Select favorite bouqets to import")) self.setRemoteIpCallback(True) def keyOk(self): if self.working: return if self.readIndex > 0: self.list.toggleSelection() def keyBlue(self): if not self.hasFiles or self.working: return if self.readIndex > 0: try: self.list.toggleAllSelection() except AttributeError: self.list.toggleSelection() def setRemoteIpCallback(self, ret = False): if ret: self["text"].setText(_("Testing remote connection")) timeout = 3000 self.currentLength = 0 self.total = 0 self.working = True creator = ClientCreator(reactor, FTPClient, config.plugins.RemoteStreamConverter.username.value, config.plugins.RemoteStreamConverter.password.value, config.plugins.RemoteStreamConverter.passive.value) creator.connectTCP(self.getRemoteAdress(), config.plugins.RemoteStreamConverter.port.value, timeout).addCallback(self.controlConnectionMade).addErrback(self.connectionFailed) def controlConnectionMade(self, ftpclient): self["text"].setText(_("Connection to remote IP ok")) ftpclient.quit() self.fetchRemoteBouqets() def connectionFailed(self, *args): self.working = False self["text"].setText(_("Could not connect to remote server IP")) def fetchRemoteBouqets(self): self["text"].setText(_("Downloading remote services")) self.readIndex = 0 self.workList = [] self.workList.append('bouquets.tv') self.workList.append('bouquets.radio') self.download(self.workList[0]).addCallback(self.fetchRemoteBouqetsFinished).addErrback(self.fetchRemoteBouqetsFailed) def fetchRemoteBouqetsFailed(self, string): self.working = False self["text"].setText(_("Download from remote server failed")) def fetchRemoteBouqetsFinished(self, string): self.readIndex += 1 if self.readIndex < len(self.workList): self.download(self.workList[self.readIndex]).addCallback(self.fetchRemoteBouqetsFinished).addErrback(self.fetchRemoteBouqetsFailed) else: self.parseBouqets() def parserWork(self, list, name): try: lines = open(name).readlines() for line in lines: tmp = line.split('userbouquet.') if len(tmp) > 1: if '\"' in line: tmp2 = tmp[1].split('\"') else: tmp2 = tmp[1].split('\n') list.append(tmp2[0]) except: pass def parseBouqets(self): list = [] self.parserWork(list, DIR_TMP + 'bouquets.tv') self.parserWork(list, DIR_TMP + 'bouquets.radio') self.readIndex = 0 self.workList = [] for listindex in range(len(list)): self.workList.append('userbouquet.' + list[listindex]) self.workList.append('lamedb') self.download(self.workList[0]).addCallback(self.fetchUserBouquetsFinished).addErrback(self.fetchUserBouquetsFailed) def fetchUserBouquetsFailed(self, string): if self.readIndex < len(self.workList) and self.readIndex > 0: self.workList.remove(self.workList[self.readIndex]) self.readIndex -= 1 self.fetchUserBouquetsFinished('') self.working = False self["text"].setText(_("Download from remote server failed")) def fetchUserBouquetsFinished(self, string): self.readIndex += 1 if self.readIndex < len(self.workList): self["text"].setText(_("Reading remote server services %d of %d") % (self.readIndex, len(self.workList)-1)) self.download(self.workList[self.readIndex]).addCallback(self.fetchUserBouquetsFinished).addErrback(self.fetchUserBouquetsFailed) else: if len(self.workList) > 0: self["text"].setText(_("Select favorites bouqets to import by pressing OK")) for listindex in range(len(self.workList) - 1): name = self.readBouquetName(DIR_TMP + self.workList[listindex]) self.list.addSelection(name, self.workList[listindex], listindex, False) self.removeFiles(DIR_TMP, "bouquets.") self.working = False self.hasFiles = True self["key_green"].setText(_("Download")) self["key_blue"].setText(_("Invert")) self["key_yellow"].setText("") self.keyBlue() def download(self, file, contextFactory = None, *args, **kwargs): client = FTPDownloader( self.getRemoteAdress(), config.plugins.RemoteStreamConverter.port.value, DIR_ENIGMA2 + file, DIR_TMP + file, config.plugins.RemoteStreamConverter.username.value, config.plugins.RemoteStreamConverter.password.value, *args, **kwargs ) return client.deferred def convertBouquets(self): self.readIndex = 0 while True: if 'lamedb' not in self.workList[self.readIndex]: filename = DIR_TMP + self.workList[self.readIndex] hasRemoteTag = False if self.checkBouquetAllreadyInList(self.workList[self.readIndex], self.workList[self.readIndex]) is True: self.workList[self.readIndex] = self.workList[self.readIndex].replace('userbouquet.', 'userbouquet.remote_') hasRemoteTag = True fp = open(DIR_ENIGMA2 + self.workList[self.readIndex], 'w') try: lines = open(filename).readlines() was_html = False for line in lines: if was_html and '#DESCRIPTION' in line: was_html = False continue if '#NAME' in line and hasRemoteTag: hasRemoteTag = False line = line.replace('#NAME ', '#NAME remote_') was_html = False if 'http' in line: was_html = True continue elif '#SERVICE' in line: line = line.strip('\r\n') line = line.strip('\n') tmp = line.split('#SERVICE') if '::' in tmp[1]: desc = tmp[1].split("::") if (len(desc)) == 2: tmp2 = tmp[1].split('::') service_ref = ServiceReference(tmp2[0] + ':') tag = tmp2[0][1:] else: tag = tmp[1][1:-1] service_ref = ServiceReference(tag) if config.plugins.RemoteStreamConverter.transcoding.value: bitrate = config.plugins.RemoteStreamConverter.bitrate.value resolution = config.plugins.RemoteStreamConverter.resolution.value (width, height) = tuple(resolution.split('x')) framrate = config.plugins.RemoteStreamConverter.framerate.value aspectratio = config.plugins.RemoteStreamConverter.aspectratio.value interlaced = config.plugins.RemoteStreamConverter.interlaced.value args = "?bitrate=%s?width=%s?height=%s?aspectratio=%s?interlaced=%s:" % (bitrate, width, height, aspectratio, interlaced) out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + "%3A" + args + service_ref.getServiceName() + '\n' else: out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + ':' + service_ref.getServiceName() + '\n' else: out = line fp.write(out) except: pass fp.close() self.readIndex += 1 if self.readIndex == len(self.workList): break self.removeFiles(DIR_TMP, "userbouquet.") def getTransponders(self, fp): step = 0 lines = open(DIR_TMP + 'lamedb').readlines() for line in lines: if step == 0: if 'transponders' in line: step =1 elif step == 1: if 'end' in line[:3]: fp.write(line) break else: fp.write(line) def getServices(self, fp): step = 0 lines = open(DIR_TMP + 'lamedb').readlines() for line in lines: if step == 0: if 'services' in line[:8]: step =1 elif step == 1: if 'end' in line[:3]: fp.write(line) break else: fp.write(line) def checkBouquetAllreadyInList(self, typestr, item): item = item.replace('userbouquet.', '') list = [] if '.tv' in typestr: self.readBouquetList(list, '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.tv" ORDER BY bouquet') else: self.readBouquetList(list, '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.radio" ORDER BY bouquet') if len(list) > 0: for x in list: if item in x: return True return False def createBouquetFile(self, target, source, matchstr, typestr): tmpFile = [] fp = open(target, 'w') try: lines = open(source).readlines() for line in lines: tmpFile.append(line) fp.write(line) for item in self.workList: if typestr in item: if self.checkBouquetAllreadyInList(typestr, item) is True: item = item.replace('userbouquet.', 'userbouquet.remote_') tmp = matchstr + item + '\" ORDER BY bouquet\n' match = False for x in tmpFile: if tmp in x: match = True if match is not True: fp.write(tmp) fp.close() self.copyFile(target, source) except: pass def keyGreen(self): if not self.hasFiles: return self.workList = [] tmpList = [] tmpList = self.list.getSelectionsList() if len(tmpList) == 0: self["text"].setText(_("No bouquets selected")) return for item in tmpList: self.workList.append(item[1]) fileValid = False state = 0 fp = open(DIR_TMP + 'tmp_lamedb', 'w') try: lines = open(DIR_ENIGMA2 + 'lamedb').readlines() for line in lines: if 'eDVB services' in line: fileValid = True if state == 0: if 'transponders' in line[:12]: fp.write(line) elif 'end' in line[:3]: self.getTransponders(fp) state = 1 else: fp.write(line) elif state == 1: if 'services' in line[:8]: fp.write(line) elif 'end' in line[:3]: self.getServices(fp) state = 2 else: fp.write(line) elif state == 2: fp.write(line) except: pass fp.close() if fileValid is not True: self.copyFile(DIR_TMP + 'lamedb', DIR_TMP + 'tmp_lamedb') tv = False radio = False for item in self.workList: if '.tv' in item: tv = True if '.radio' in item: radio = True if radio or tv: if tv: self.createBouquetFile(DIR_TMP + 'tmp_bouquets.tv', DIR_ENIGMA2 + 'bouquets.tv', '#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET \"', '.tv') if radio: self.createBouquetFile(DIR_TMP + 'tmp_bouquets.radio', DIR_ENIGMA2 + 'bouquets.radio', '#SERVICE 1:7:2:0:0:0:0:0:0:0:FROM BOUQUET \"', '.radio') self.copyFile(DIR_TMP + 'tmp_lamedb', DIR_ENIGMA2 + 'lamedb') db = eDVBDB.getInstance() db.reloadServicelist() self.convertBouquets() self.removeFiles(DIR_TMP, "tmp_") self.removeFiles(DIR_TMP, "lamedb") db = eDVBDB.getInstance() db.reloadServicelist() db.reloadBouquets() self.keyExit(True) def getRemoteAdress(self): if config.plugins.RemoteStreamConverter.address.value != "": return config.plugins.RemoteStreamConverter.address.value else: return '%d.%d.%d.%d' % (config.plugins.RemoteStreamConverter.ip.value[0], config.plugins.RemoteStreamConverter.ip.value[1], config.plugins.RemoteStreamConverter.ip.value[2], config.plugins.RemoteStreamConverter.ip.value[3]) def readBouquetName(self, filename): try: lines = open(filename).readlines() for line in lines: if '#NAME' in line: tmp = line.split('#NAME ') if '\r' in tmp[1]: bouquetname = tmp[1].split('\r\n')[0] else: bouquetname = tmp[1].split('\n')[0] return bouquetname except: pass return "" def readBouquetList(self, list, rootstr): bouquet_root = eServiceReference(rootstr) if not bouquet_root is None: serviceHandler = eServiceCenter.getInstance() if not serviceHandler is None: servicelist = serviceHandler.list(bouquet_root) if not servicelist is None: while True: service = servicelist.getNext() if not service.valid(): break tmp = service.toString().split('userbouquet.') if len(tmp[1]) > 0: tmp2 = tmp[1].split('\"') name = self.readBouquetName(DIR_ENIGMA2 + 'userbouquet.' + tmp2[0]) list.append((name, tmp2[0])) def removeFiles(self, targetdir, target): import os targetLen = len(target) for root, dirs, files in os.walk(targetdir): for name in files: if target in name[:targetLen]: os.remove(os.path.join(root, name)) def copyFile(self, source, dest): import shutil shutil.copy2(source, dest) def keyExit(self, ret = False): if ret: print "[RemoteTunerServerEditor] keyExit TRUE" self.close(True) else: print "[RemoteTunerServerEditor] keyExit FALSE" self.close(False)
class StreamingChannelFromServerScreen(Screen): window_title = _("Select bouquets to convert") skin = """ <screen name="StreamingChannelFromServerScreen" position="center,center" size="550,450" title="%s" > <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" /> <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" /> <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" /> <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" /> <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" /> <widget name="list" position="5,50" size="540,360" /> <ePixmap pixmap="skin_default/div-h.png" position="0,410" zPosition="10" size="560,2" transparent="1" alphatest="on" /> <widget source="statusbar" render="Label" position="5,420" zPosition="10" size="550,30" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" /> </screen>""" % (window_title) def __init__(self, session): Screen.__init__(self, session) self.session = session self.workList = [] self.readIndex = 0 self.working = False self.hasFiles = False self.list = SelectionList() self["list"] = self.list self["key_red"] = StaticText(_("Close")) self["key_green"] = StaticText("") self["key_yellow"] = StaticText(_("Set server IP")) self["key_blue"] = StaticText("") self["statusbar"] = StaticText(_("Select a remote server IP first")) self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], { "ok": self.keyOk, "cancel": self.close, "red": self.close, "green": self.keyGreen, "yellow": self.keyYellow, "blue": self.keyBlue }, -1) def keyOk(self): if self.working: return if self.readIndex > 0: self.list.toggleSelection() def keyBlue(self): if not self.hasFiles or self.working: return if self.readIndex > 0: try: self.list.toggleAllSelection() except AttributeError: self.list.toggleSelection() def keyYellow(self): if not self.hasFiles: self.session.openWithCallback(self.setRemoteIpCallback, ServerEditor) def setRemoteIpCallback(self, ret = False): if ret: self["statusbar"].setText(_("Testing remote connection")) timeout = 3000 self.currentLength = 0 self.total = 0 self.working = True creator = ClientCreator(reactor, FTPClient, config.plugins.RemoteStreamConverter.username.value, config.plugins.RemoteStreamConverter.password.value, config.plugins.RemoteStreamConverter.passive.value) creator.connectTCP(self.getRemoteAdress(), config.plugins.RemoteStreamConverter.port.value, timeout).addCallback(self.controlConnectionMade).addErrback(self.connectionFailed) def controlConnectionMade(self, ftpclient): self["statusbar"].setText(_("Connection to remote IP ok")) ftpclient.quit() self.fetchRemoteBouqets() def connectionFailed(self, *args): self.working = False self["statusbar"].setText(_("Could not connect to remote IP")) def fetchRemoteBouqets(self): self["statusbar"].setText(_("Downloading remote services")) self.readIndex = 0 self.workList = [] self.workList.append('bouquets.tv') self.workList.append('bouquets.radio') self.download(self.workList[0]).addCallback(self.fetchRemoteBouqetsFinished).addErrback(self.fetchRemoteBouqetsFailed) def fetchRemoteBouqetsFailed(self, string): self.working = False self["statusbar"].setText(_("Download from remote failed")) def fetchRemoteBouqetsFinished(self, string): self.readIndex += 1 if self.readIndex < len(self.workList): self.download(self.workList[self.readIndex]).addCallback(self.fetchRemoteBouqetsFinished).addErrback(self.fetchRemoteBouqetsFailed) else: self.parseBouqets() def parserWork(self, list, name): try: lines = open(name).readlines() for line in lines: tmp = line.split('userbouquet.') if len(tmp) > 1: if '\"' in line: tmp2 = tmp[1].split('\"') else: tmp2 = tmp[1].split('\n') list.append(tmp2[0]) except: pass def parseBouqets(self): list = [] self.parserWork(list, DIR_TMP + 'bouquets.tv') self.parserWork(list, DIR_TMP + 'bouquets.radio') self.readIndex = 0 self.workList = [] for listindex in range(len(list)): self.workList.append('userbouquet.' + list[listindex]) self.workList.append('lamedb') self.download(self.workList[0]).addCallback(self.fetchUserBouquetsFinished).addErrback(self.fetchUserBouquetsFailed) def fetchUserBouquetsFailed(self, string): if self.readIndex < len(self.workList) and self.readIndex > 0: self.workList.remove(self.workList[self.readIndex]) self.readIndex -= 1 self.fetchUserBouquetsFinished('') self.working = False self["statusbar"].setText(_("Download from remote failed")) def fetchUserBouquetsFinished(self, string): self.readIndex += 1 if self.readIndex < len(self.workList): self["statusbar"].setText(_("FTP reading file %d of %d") % (self.readIndex, len(self.workList))) self.download(self.workList[self.readIndex]).addCallback(self.fetchUserBouquetsFinished).addErrback(self.fetchUserBouquetsFailed) else: if len(self.workList) > 0: self["statusbar"].setText(_("Make your selection")) for listindex in range(len(self.workList) - 1): name = self.readBouquetName(DIR_TMP + self.workList[listindex]) self.list.addSelection(name, self.workList[listindex], listindex, False) self.removeFiles(DIR_TMP, "bouquets.") self.working = False self.hasFiles = True self["key_green"].setText(_("Download")) self["key_blue"].setText(_("Invert")) self["key_yellow"].setText("") def download(self, file, contextFactory = None, *args, **kwargs): client = FTPDownloader( self.getRemoteAdress(), config.plugins.RemoteStreamConverter.port.value, DIR_ENIGMA2 + file, DIR_TMP + file, config.plugins.RemoteStreamConverter.username.value, config.plugins.RemoteStreamConverter.password.value, *args, **kwargs ) return client.deferred def convertBouquets(self): self.readIndex = 0 while True: if 'lamedb' not in self.workList[self.readIndex]: filename = DIR_TMP + self.workList[self.readIndex] hasRemoteTag = False if self.checkBouquetAllreadyInList(self.workList[self.readIndex], self.workList[self.readIndex]) is True: self.workList[self.readIndex] = self.workList[self.readIndex].replace('userbouquet.', 'userbouquet.remote_') hasRemoteTag = True fp = open(DIR_ENIGMA2 + self.workList[self.readIndex], 'w') try: lines = open(filename).readlines() was_html = False for line in lines: if was_html and '#DESCRIPTION' in line: was_html = False continue if '#NAME' in line and hasRemoteTag: hasRemoteTag = False line = line.replace('#NAME ', '#NAME remote_') was_html = False if 'http' in line: was_html = True continue elif '#SERVICE' in line: line = line.strip('\r\n') line = line.strip('\n') tmp = line.split('#SERVICE') if '::' in tmp[1]: desc = tmp[1].split("::") if (len(desc)) == 2: tmp2 = tmp[1].split('::') service_ref = ServiceReference(tmp2[0] + ':') tag = tmp2[0][1:] else: tag = tmp[1][1:-1] service_ref = ServiceReference(tag) out = '#SERVICE ' + tag + ':' + quote('http://' + self.getRemoteAdress() + ':8001/' + tag) + ':' + service_ref.getServiceName() + '\n' else: out = line fp.write(out) except: pass fp.close() self.readIndex += 1 if self.readIndex == len(self.workList): break self.removeFiles(DIR_TMP, "userbouquet.") def getTransponders(self, fp): step = 0 lines = open(DIR_TMP + 'lamedb').readlines() for line in lines: if step == 0: if 'transponders' in line: step =1 elif step == 1: if 'end' in line[:3]: fp.write(line) break else: fp.write(line) def getServices(self, fp): step = 0 lines = open(DIR_TMP + 'lamedb').readlines() for line in lines: if step == 0: if 'services' in line[:8]: step =1 elif step == 1: if 'end' in line[:3]: fp.write(line) break else: fp.write(line) def checkBouquetAllreadyInList(self, typestr, item): item = item.replace('userbouquet.', '') list = [] if '.tv' in typestr: self.readBouquetList(list, '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.tv" ORDER BY bouquet') else: self.readBouquetList(list, '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.radio" ORDER BY bouquet') if len(list) > 0: for x in list: if item in x: return True return False def createBouquetFile(self, target, source, matchstr, typestr): tmpFile = [] fp = open(target, 'w') try: lines = open(source).readlines() for line in lines: tmpFile.append(line) fp.write(line) for item in self.workList: if typestr in item: if self.checkBouquetAllreadyInList(typestr, item) is True: item = item.replace('userbouquet.', 'userbouquet.remote_') tmp = matchstr + item + '\" ORDER BY bouquet\n' match = False for x in tmpFile: if tmp in x: match = True if match is not True: fp.write(tmp) fp.close() self.copyFile(target, source) except: pass def keyGreen(self): if not self.hasFiles: return self.workList = [] tmpList = [] tmpList = self.list.getSelectionsList() if len(tmpList) == 0: self["statusbar"].setText(_("No bouquets selected")) return for item in tmpList: self.workList.append(item[1]) fileValid = False state = 0 fp = open(DIR_TMP + 'tmp_lamedb', 'w') try: lines = open(DIR_ENIGMA2 + 'lamedb').readlines() for line in lines: if 'eDVB services' in line: fileValid = True if state == 0: if 'transponders' in line[:12]: fp.write(line) elif 'end' in line[:3]: self.getTransponders(fp) state = 1 else: fp.write(line) elif state == 1: if 'services' in line[:8]: fp.write(line) elif 'end' in line[:3]: self.getServices(fp) state = 2 else: fp.write(line) elif state == 2: fp.write(line) except: pass fp.close() if fileValid is not True: self.copyFile(DIR_TMP + 'lamedb', DIR_TMP + 'tmp_lamedb') tv = False radio = False for item in self.workList: if '.tv' in item: tv = True if '.radio' in item: radio = True if radio or tv: if tv: self.createBouquetFile(DIR_TMP + 'tmp_bouquets.tv', DIR_ENIGMA2 + 'bouquets.tv', '#SERVICE 1:7:1:0:0:0:0:0:0:0:FROM BOUQUET \"', '.tv') if radio: self.createBouquetFile(DIR_TMP + 'tmp_bouquets.radio', DIR_ENIGMA2 + 'bouquets.radio', '#SERVICE 1:7:2:0:0:0:0:0:0:0:FROM BOUQUET \"', '.radio') self.copyFile(DIR_TMP + 'tmp_lamedb', DIR_ENIGMA2 + 'lamedb') db = eDVBDB.getInstance() db.reloadServicelist() self.convertBouquets() self.removeFiles(DIR_TMP, "tmp_") self.removeFiles(DIR_TMP, "lamedb") db = eDVBDB.getInstance() db.reloadServicelist() db.reloadBouquets() self.close() def getRemoteAdress(self): if config.plugins.RemoteStreamConverter.address.value != "": return config.plugins.RemoteStreamConverter.address.value else: return '%d.%d.%d.%d' % (config.plugins.RemoteStreamConverter.ip.value[0], config.plugins.RemoteStreamConverter.ip.value[1], config.plugins.RemoteStreamConverter.ip.value[2], config.plugins.RemoteStreamConverter.ip.value[3]) def readBouquetName(self, filename): try: lines = open(filename).readlines() for line in lines: if '#NAME' in line: tmp = line.split('#NAME ') if '\r' in tmp[1]: bouquetname = tmp[1].split('\r\n')[0] else: bouquetname = tmp[1].split('\n')[0] return bouquetname except: pass return "" def readBouquetList(self, list, rootstr): bouquet_root = eServiceReference(rootstr) if not bouquet_root is None: serviceHandler = eServiceCenter.getInstance() if not serviceHandler is None: servicelist = serviceHandler.list(bouquet_root) if not servicelist is None: while True: service = servicelist.getNext() if not service.valid(): break tmp = service.toString().split('userbouquet.') if len(tmp[1]) > 0: tmp2 = tmp[1].split('\"') name = self.readBouquetName(DIR_ENIGMA2 + 'userbouquet.' + tmp2[0]) list.append((name, tmp2[0])) def removeFiles(self, targetdir, target): import os targetLen = len(target) for root, dirs, files in os.walk(targetdir): for name in files: if target in name[:targetLen]: os.remove(os.path.join(root, name)) def copyFile(self, source, dest): import shutil shutil.copy2(source, dest)