class IpkgInstaller(Screen): def __init__(self, session, list): Screen.__init__(self, session) Screen.setTitle(self, _("IPK Installer")) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if not list[listindex].split('/')[-1].startswith('._'): self.list.addSelection(list[listindex].split('/')[-1], list[listindex], listindex, False) self["key_red"] = StaticText(_("Close")) self["key_green"] = StaticText(_("Install")) self["key_yellow"] = StaticText() self["key_blue"] = StaticText(_("Invert")) self["introduction"] = StaticText( _("Press OK to toggle the selection.")) self["actions"] = ActionMap( ["OkCancelActions", "ColorActions"], { "ok": self.list.toggleSelection, "cancel": self.close, "red": self.close, "green": self.install, "blue": self.list.toggleAllSelection }, -1) def install(self): list = self.list.getSelectionsList() cmdList = [] for item in list: cmdList.append((IpkgComponent.CMD_INSTALL, {"package": item[1]})) self.session.open(Ipkg, cmdList=cmdList)
class CAidSelect(Screen): skin = '\n\t\t<screen name="CAidSelect" position="center,center" size="450,440" title="select CAId\'s" >\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<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 name="list" position="5,50" size="440,330" scrollbarMode="showOnDemand" />\n\t\t\t<ePixmap pixmap="skin_default/div-h.png" position="0,390" zPosition="1" size="450,2" />\n\t\t\t<widget source="introduction" render="Label" position="0,400" size="450,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />\n\t\t</screen>' def __init__(self, session, list, selected_caids): Screen.__init__(self, session) self.list = SelectionList() self['list'] = self.list for listindex in range(len(list)): if find_in_list(selected_caids, list[listindex][0], 0): self.list.addSelection(list[listindex][0], list[listindex][1], listindex, True) else: self.list.addSelection(list[listindex][0], list[listindex][1], listindex, False) self['key_red'] = StaticText(_('Cancel')) self['key_green'] = StaticText(_('Save')) self['introduction'] = StaticText(_('Press OK to select/deselect a CAId.')) self['actions'] = ActionMap(['ColorActions', 'SetupActions'], {'ok': self.list.toggleSelection, 'cancel': self.cancel, 'green': self.greenPressed, 'red': self.cancel}, -1) self.onShown.append(self.setWindowTitle) def setWindowTitle(self): self.setTitle(_("select CAId's")) def greenPressed(self): list = self.list.getSelectionsList() print list self.close(list) def cancel(self): self.close()
def __init__(self, session, list, selected_caids): Screen.__init__(self, session) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if find_in_list(selected_caids, list[listindex][0], 0): self.list.addSelection(list[listindex][0], list[listindex][1], listindex, True) else: self.list.addSelection(list[listindex][0], list[listindex][1], listindex, False) self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("Save")) self["introduction"] = StaticText( _("Press OK to select/deselect a CAId.")) self["actions"] = ActionMap( ["ColorActions", "SetupActions"], { "ok": self.list.toggleSelection, "cancel": self.cancel, "green": self.greenPressed, "red": self.cancel }, -1) self.onShown.append(self.setWindowTitle)
def __init__(self, session, list): Screen.__init__(self, session) Screen.setTitle(self, _("IPK installer")) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if not list[listindex].split('/')[-1].startswith('._'): self.list.addSelection(list[listindex].split('/')[-1], list[listindex], listindex, False) self["key_red"] = StaticText(_("Close")) self["key_green"] = StaticText(_("Install")) self["key_yellow"] = StaticText() self["key_blue"] = StaticText(_("Invert")) self["introduction"] = StaticText( _("Press OK to toggle the selection.")) self["actions"] = ActionMap( ["OkCancelActions", "ColorActions"], { "ok": self.list.toggleSelection, "cancel": self.close, "red": self.close, "green": self.install, "blue": self.list.toggleAllSelection }, -1)
class IpkgInstaller(Screen): def __init__(self, session, list): Screen.__init__(self, session) Screen.setTitle(self, _("IPK Installer")) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if not list[listindex].split('/')[-1].startswith('._'): self.list.addSelection(list[listindex].split('/')[-1], list[listindex], listindex, False) self["key_red"] = StaticText(_("Close")) self["key_green"] = StaticText(_("Install")) self["key_yellow"] = StaticText() self["key_blue"] = StaticText(_("Invert")) self["introduction"] = StaticText(_("Press OK to toggle the selection.")) self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], { "ok": self.list.toggleSelection, "cancel": self.close, "red": self.close, "green": self.install, "blue": self.list.toggleAllSelection }, -1) def install(self): list = self.list.getSelectionsList() cmdList = [] for item in list: cmdList.append((IpkgComponent.CMD_INSTALL, {"package": item[1]})) self.session.open(Ipkg, cmdList=cmdList)
class IpkgInstaller(Screen): def __init__(self, session, list): Screen.__init__(self, session) Screen.setTitle(self, _('IPK Installer')) self.list = SelectionList() self['list'] = self.list for listindex in range(len(list)): if not list[listindex].split('/')[-1].startswith('._'): self.list.addSelection(list[listindex].split('/')[-1], list[listindex], listindex, False) self['key_red'] = StaticText(_('Close')) self['key_green'] = StaticText(_('Install')) self['key_yellow'] = StaticText() self['key_blue'] = StaticText(_('Invert')) self['introduction'] = StaticText(_('Press OK to toggle the selection.')) self['actions'] = ActionMap(['OkCancelActions', 'ColorActions'], {'ok': self.list.toggleSelection, 'cancel': self.close, 'red': self.close, 'green': self.install, 'blue': self.list.toggleAllSelection}, -1) def install(self): list = self.list.getSelectionsList() cmdList = [] for item in list: cmdList.append((IpkgComponent.CMD_INSTALL, {'package': item[1]})) self.session.open(Ipkg, cmdList=cmdList)
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 __init__(self, session, pkl_paths): Screen.__init__(self, session) self.setTitle(_("Directories with local setting")) self.skinName = ["pklMovieManager", "Setup"] self["key_red"] = Button(_("Cancel")) self["key_green"] = Button() self["key_blue"] = Button() self["key_yellow"] = Button() self.list = SelectionList([]) self.pklPaths = pkl_paths self.reloadList() self["description"] = Label() self["actions"] = ActionMap( ["OkCancelActions", "ColorActions"], { "cancel": self.exit, "ok": self.list.toggleSelection, "red": self.exit, "blue": self.list.toggleAllSelection, "yellow": self.remove, }) text = _( "Remove current item or select items with 'OK' or 'Inversion' and then use remove." ) self["description"].setText(text)
class CAidSelect(Screen): skin = """ <screen name="CAidSelect" position="center,120" size="820,520" title="select CAId's"> <ePixmap pixmap="skin_default/buttons/red.png" position="10,5" size="200,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/green.png" position="210,5" size="200,40" alphatest="on" /> <widget source="key_red" render="Label" position="10,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" shadowColor="black" shadowOffset="-2,-2" /> <widget source="key_green" render="Label" position="210,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" shadowColor="black" shadowOffset="-2,-2" /> <eLabel position="10,50" size="800,1" backgroundColor="grey" /> <widget name="list" position="10,55" size="800,420" enableWrapAround="1" scrollbarMode="showOnDemand" /> <eLabel position="10,480" size="800,1" backgroundColor="grey" /> <widget source="introduction" render="Label" position="10,488" size="800,25" font="Regular;22" halign="center" /> </screen>""" def __init__(self, session, list, selected_caids): Screen.__init__(self, session) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if find_in_list(selected_caids, list[listindex][0], 0): self.list.addSelection(list[listindex][0], list[listindex][1], listindex, True) else: self.list.addSelection(list[listindex][0], list[listindex][1], listindex, False) self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("Save")) self["introduction"] = StaticText( _("Press OK to select/deselect a CAId.")) self["actions"] = ActionMap( ["ColorActions", "SetupActions"], { "ok": self.list.toggleSelection, "cancel": self.cancel, "green": self.greenPressed, "red": self.cancel }, -1) self.onShown.append(self.setWindowTitle) def setWindowTitle(self): self.setTitle(_("select CAId's")) def greenPressed(self): list = self.list.getSelectionsList() print list self.close(list) def cancel(self): self.close()
class CAidSelect(Screen): skin = """ <screen name="CAidSelect" position="center,center" size="450,440" title="select CAId's" > <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" /> <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 name="list" position="5,50" size="440,330" scrollbarMode="showOnDemand" /> <ePixmap pixmap="div-h.png" position="0,390" zPosition="1" size="450,2" /> <widget source="introduction" render="Label" position="0,400" size="450,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" /> </screen>""" def __init__(self, session, list, selected_caids): Screen.__init__(self, session) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if find_in_list(selected_caids, list[listindex][0], 0): self.list.addSelection(list[listindex][0], list[listindex][1], listindex, True) else: self.list.addSelection(list[listindex][0], list[listindex][1], listindex, False) self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("Save")) self["introduction"] = StaticText( _("Press OK to select/deselect a CAId.")) self["actions"] = ActionMap( ["ColorActions", "SetupActions"], { "ok": self.list.toggleSelection, "cancel": self.cancel, "green": self.greenPressed, "red": self.cancel }, -1) self.onShown.append(self.setWindowTitle) def setWindowTitle(self): self.setTitle(_("select CAId's")) def greenPressed(self): list = self.list.getSelectionsList() self.close(list) def cancel(self): self.close()
class CAidSelect(Screen): skin = """ <screen name="CAidSelect" position="center,120" size="820,520" title="select CAId's"> <ePixmap pixmap="skin_default/buttons/red.png" position="10,5" size="200,40" alphatest="on" /> <ePixmap pixmap="skin_default/buttons/green.png" position="210,5" size="200,40" alphatest="on" /> <widget source="key_red" render="Label" position="10,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" shadowColor="black" shadowOffset="-2,-2" /> <widget source="key_green" render="Label" position="210,5" size="200,40" zPosition="1" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" shadowColor="black" shadowOffset="-2,-2" /> <eLabel position="10,50" size="800,1" backgroundColor="grey" /> <widget name="list" position="10,55" size="800,420" enableWrapAround="1" scrollbarMode="showOnDemand" /> <eLabel position="10,480" size="800,1" backgroundColor="grey" /> <widget source="introduction" render="Label" position="10,488" size="800,25" font="Regular;22" halign="center" /> </screen>""" def __init__(self, session, list, selected_caids): Screen.__init__(self, session) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if find_in_list(selected_caids,list[listindex][0],0): self.list.addSelection(list[listindex][0], list[listindex][1], listindex, True) else: self.list.addSelection(list[listindex][0], list[listindex][1], listindex, False) self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("Save")) self["introduction"] = StaticText(_("Press OK to select/deselect a CAId.")) self["actions"] = ActionMap(["ColorActions","SetupActions"], { "ok": self.list.toggleSelection, "cancel": self.cancel, "green": self.greenPressed, "red": self.cancel }, -1) self.onShown.append(self.setWindowTitle) def setWindowTitle(self): self.setTitle(_("select CAId's")) def greenPressed(self): list = self.list.getSelectionsList() print list self.close(list) def cancel(self): self.close()
class OpkgInstaller(Screen): skin = """ <screen name="OpkgInstaller" 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="introduction" 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, list): Screen.__init__(self, session) Screen.setTitle(self, _("IPK installer")) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if not list[listindex].split('/')[-1].startswith('._'): self.list.addSelection(list[listindex].split('/')[-1], list[listindex], listindex, False) self["key_red"] = StaticText(_("Close")) self["key_green"] = StaticText(_("Install")) self["key_yellow"] = StaticText() self["key_blue"] = StaticText(_("Invert")) self["introduction"] = StaticText( _("Press OK to toggle the selection.")) self["actions"] = ActionMap( ["OkCancelActions", "ColorActions"], { "ok": self.list.toggleSelection, "cancel": self.close, "red": self.close, "green": self.install, "blue": self.list.toggleAllSelection }, -1) def install(self): list = self.list.getSelectionsList() cmdList = [] for item in list: cmdList.append((OpkgComponent.CMD_INSTALL, {"package": item[1]})) self.session.open(Opkg, cmdList=cmdList)
def __init__(self, session): Screen.__init__(self, session) HelpableScreen.__init__(self) # Initialize widgets self["key_green"] = StaticText(_("OK")) self["key_red"] = StaticText(_("Cancel")) self["key_yellow"] = StaticText("") self["key_blue"] = StaticText(_("Run")) self["plugins"] = StaticText(_("Plugins")) self["extensions"] = StaticText(_("Extensions")) self["eventinfo"] = StaticText(_("Eventinfo")) self["tabbar"] = MultiPixmap() self["list"] = SelectionList([]) self.selectedList = LIST_PLUGINS self.updateList() self["PluginHiderSetupActions"] = HelpableActionMap(self, "PluginHiderSetupActions", { "ok": (self["list"].toggleSelection, _("toggle selection")), "cancel": (self.cancel, _("end editing")), "green": (self.save, _("save")), "blue": (self.run, _("run selected plugin")), "next": (self.next, _("select next tab")), "previous": (self.previous, _("select previous tab")), }, -1 ) self.onLayoutFinish.append(self.setCustomTitle)
def __init__(self, session): self.session = session Screen.__init__(self, session) self.setup_title = _("XMLTV Import Sources") Screen.setTitle(self, self.setup_title) self["key_red"] = Button(_("Cancel")) self["key_green"] = Button(_("Ok")) self["key_yellow"] = Button() # _("Import now")) self["key_blue"] = Button() self.onChangedEntry = [] filter = config.plugins.xmltvimport.sources.getValue().split("|") sources = [ # (description, value, index, selected) SelectionEntryComponent(x.description, x.description, 0, (filter is None) or (x.description in filter)) for x in XMLTVConfig.enumSources(CONFIG_PATH, filter=None) ] self["list"] = SelectionList(sources) self["setupActions"] = ActionMap( ["SetupActions", "ColorActions", "MenuActions"], { "red": self.cancel, "green": self.save, "yellow": self.doimport, "save": self.save, "cancel": self.cancel, "ok": self["list"].toggleSelection, "menu": self.cancel, }, -2)
def __init__(self, session): self.session = session Screen.__init__(self, session) self["key_red"] = Button(_("Cancel")) self["key_green"] = Button(_("Ok")) self["key_yellow"] = Button() # _("Import now")) self["key_blue"] = Button() cfg = EPGConfig.loadUserSettings() filter = cfg["sources"] sources = [ # (description, value, index, selected) SelectionEntryComponent(x.description, x.description, 0, (filter is None) or (x.description in filter)) for x in EPGConfig.enumSources(CONFIG_PATH, filter=None) ] self["list"] = SelectionList(sources) self["setupActions"] = ActionMap( ["SetupActions", "ColorActions"], { "red": self.cancel, "green": self.save, "yellow": self.doimport, "save": self.save, "cancel": self.cancel, "ok": self["list"].toggleSelection, }, -2)
def __init__(self, session, list, selected_caids): Screen.__init__(self, session) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if find_in_list(selected_caids,list[listindex][0],0): self.list.addSelection(list[listindex][0], list[listindex][1], listindex, True) else: self.list.addSelection(list[listindex][0], list[listindex][1], listindex, False) self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("Save")) self["introduction"] = StaticText(_("Press OK to select/deselect a CAId.")) self["actions"] = ActionMap(["ColorActions","SetupActions"], { "ok": self.list.toggleSelection, "cancel": self.cancel, "green": self.greenPressed, "red": self.cancel }, -1) self.onShown.append(self.setWindowTitle)
def __init__(self, session, tags, txt=None, parent=None): Screen.__init__(self, session, parent=parent) self.skinName = SkinTools.appendResolution("AdvancedMovieSelectionTagEditor") self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("Save/Close")) self["key_yellow"] = StaticText(_("Create new Tag")) self["key_blue"] = StaticText("") self["key_blue"] = StaticText(_("Load Tag(s) from movies")) self["info"] = StaticText(_("Use the OK Button for the selection.")) self["list"] = SelectionList() self.TimerEntry = TimerEntry allTags = self.loadTagsFile() self.joinTags(allTags, tags) self.updateMenuList(allTags, tags) self.ghostlist = tags[:] self.ghosttags = allTags[:] self.origtags = allTags[:] self.tags = allTags self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "MenuActions"], { "ok": self["list"].toggleSelection, "cancel": self.cancel, "red": self.cancel, "green": self.accept, "yellow": self.addCustom, "blue": self.loadFromHdd, "menu": self.showMenu }, -1) self.defaulttaglist(tags) self.setCustomTitle(tags)
def __init__(self, session, userSatlist=""): Screen.__init__(self, session) self["key_red"] = Button(_("Cancel")) self["key_green"] = Button(_("Save")) self["key_yellow"] = Button(_("Sort by")) self["key_blue"] = Button(_("Select all")) self["hint"] = Label(_("Press OK to toggle the selection")) SatList = [] if not isinstance(userSatlist, str): userSatlist = "" else: userSatlist = userSatlist.replace("]", "").replace("[", "") for sat in nimmanager.getSatList(): selected = False sat_str = str(sat[0]) if userSatlist and ("," not in userSatlist and sat_str == userSatlist) or ((', ' + sat_str + ',' in userSatlist) or (userSatlist.startswith(sat_str + ',')) or (userSatlist.endswith(', ' + sat_str))): selected = True SatList.append((sat[0], sat[1], sat[2], selected)) sat_list = [SelectionEntryComponent(x[1], x[0], x[2], x[3]) for x in SatList] self["list"] = SelectionList(sat_list, enableWrapAround=True) self["setupActions"] = ActionMap(["SetupActions", "ColorActions"], { "red": self.cancel, "green": self.save, "yellow": self.sortBy, "blue": self["list"].toggleAllSelection, "save": self.save, "cancel": self.cancel, "ok": self["list"].toggleSelection, }, -2) self.setTitle(_("Select satellites"))
def __init__(self, session, title, item_descr, selected_items): Screen.__init__(self, session) HelpableScreen.__init__(self) SkinResolutionHelper.__init__(self) self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("Save/Close")) self["list"] = SelectionList([]) self.selected_items = selected_items for l in item_descr: selected = False for x in selected_items: if l[0] in x: selected = True self["list"].addSelection(l[1], l[0], 0, selected) self["OkCancelActions"] = HelpableActionMap( self, "OkCancelActions", { "ok": (self["list"].toggleSelection, _("Toggle selected")), "cancel": (self.cancel, _("Cancel")), }) self["ColorActions"] = HelpableActionMap( self, "ColorActions", { "red": (self.cancel, _("Cancel")), "green": (self.accept, _("Save/Close")) }) self.setTitle(title)
def __init__(self, session, userSatlist=[]): Screen.__init__(self, session) self["key_red"] = Button(_("Cancel")) self["key_green"] = Button(_("Save")) self["key_yellow"] = Button(_("Sort by")) self["key_blue"] = Button(_("Select all")) self["hint"] = Label(_("Press OK to toggle the selection")) SatList = [] for sat in nimmanager.getSatList(): selected = False if isinstance(userSatlist, str) and str(sat[0]) in userSatlist: selected = True SatList.append((sat[0], sat[1], sat[2], selected)) sat_list = [SelectionEntryComponent(x[1], x[0], x[2], x[3]) for x in SatList] self["list"] = SelectionList(sat_list, enableWrapAround=True) self["setupActions"] = ActionMap(["SetupActions", "ColorActions"], { "red": self.cancel, "green": self.save, "yellow": self.sortBy, "blue": self["list"].toggleAllSelection, "save": self.save, "cancel": self.cancel, "ok": self["list"].toggleSelection, }, -2) self.setTitle(_("Select satellites"))
def __init__(self, session, tags, txt=None, args=0, parent=None): Screen.__init__(self, session, parent=parent) # Initialize Buttons self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("OK")) self["key_yellow"] = StaticText(_("New")) self["key_blue"] = StaticText(_("Load")) self["list"] = SelectionList() allTags = self.loadTagsFile() self.joinTags(allTags, tags) self.updateMenuList(allTags, tags) self.ghostlist = tags[:] self.ghosttags = allTags[:] self.origtags = allTags[:] self.tags = allTags # Define Actions self["actions"] = ActionMap( ["OkCancelActions", "ColorActions", "MenuActions"], { "ok": self["list"].toggleSelection, "cancel": self.cancel, "red": self.cancel, "green": self.accept, "yellow": self.addCustom, "blue": self.loadFromHdd, "menu": self.showMenu }, -1) self.onLayoutFinish.append(self.setCustomTitle)
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)
class CAidSelect(Screen): skin = """ <screen name="CAidSelect" position="center,center" size="450,440" title="select CAId's" > <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" /> <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 name="list" position="5,50" size="440,330" scrollbarMode="showOnDemand" /> <ePixmap pixmap="div-h.png" position="0,390" zPosition="1" size="450,2" /> <widget source="introduction" render="Label" position="0,400" size="450,40" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" /> </screen>""" def __init__(self, session, list, selected_caids): Screen.__init__(self, session) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if find_in_list(selected_caids,list[listindex][0],0): self.list.addSelection(list[listindex][0], list[listindex][1], listindex, True) else: self.list.addSelection(list[listindex][0], list[listindex][1], listindex, False) self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("Save")) self["introduction"] = StaticText(_("Press OK to select/deselect a CAId.")) self["actions"] = ActionMap(["ColorActions","SetupActions"], { "ok": self.list.toggleSelection, "cancel": self.cancel, "green": self.greenPressed, "red": self.cancel }, -1) self.onShown.append(self.setWindowTitle) def setWindowTitle(self): self.setTitle(_("select CAId's")) def greenPressed(self): list = self.list.getSelectionsList() self.close(list) def cancel(self): self.close()
class IpkgInstaller(Screen): skin = """ <screen name="IpkgInstaller" position="center,center" size="550,450" title="Install extensions"> <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="introduction" 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, list): Screen.__init__(self, session) Screen.setTitle(self, _("IPK Installer")) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if not list[listindex].split('/')[-1].startswith('._'): self.list.addSelection(list[listindex].split('/')[-1], list[listindex], listindex, False) self["key_red"] = StaticText(_("Close")) self["key_green"] = StaticText(_("Install")) self["key_yellow"] = StaticText() self["key_blue"] = StaticText(_("Invert")) self["introduction"] = StaticText(_("Press OK to toggle the selection.")) self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], { "ok": self.list.toggleSelection, "cancel": self.close, "red": self.close, "green": self.install, "blue": self.list.toggleAllSelection }, -1) def install(self): list = self.list.getSelectionsList() cmdList = [] for item in list: cmdList.append((IpkgComponent.CMD_INSTALL, {"package": item[1]})) self.session.open(Ipkg, cmdList=cmdList)
def __init__(self, session, list, selected_caids): Screen.__init__(self, session) self.list = SelectionList() self['list'] = self.list for listindex in range(len(list)): if find_in_list(selected_caids, list[listindex][0], 0): self.list.addSelection(list[listindex][0], list[listindex][1], listindex, True) else: self.list.addSelection(list[listindex][0], list[listindex][1], listindex, False) self['key_red'] = StaticText(_('Cancel')) self['key_green'] = StaticText(_('Save')) self['introduction'] = StaticText(_('Press OK to select/deselect a CAId.')) self['actions'] = ActionMap(['ColorActions', 'SetupActions'], {'ok': self.list.toggleSelection, 'cancel': self.cancel, 'green': self.greenPressed, 'red': self.cancel}, -1) self.onShown.append(self.setWindowTitle)
def __init__(self, session, list): Screen.__init__(self, session) Screen.setTitle(self, _('IPK Installer')) self.list = SelectionList() self['list'] = self.list for listindex in range(len(list)): if not list[listindex].split('/')[-1].startswith('._'): self.list.addSelection(list[listindex].split('/')[-1], list[listindex], listindex, False) self['key_red'] = StaticText(_('Close')) self['key_green'] = StaticText(_('Install')) self['key_yellow'] = StaticText() self['key_blue'] = StaticText(_('Invert')) self['introduction'] = StaticText(_('Press OK to toggle the selection.')) self['actions'] = ActionMap(['OkCancelActions', 'ColorActions'], {'ok': self.list.toggleSelection, 'cancel': self.close, 'red': self.close, 'green': self.install, 'blue': self.list.toggleAllSelection}, -1)
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 __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 __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 __init__(self, session, tags=None, service=None, parent=None): Screen.__init__(self, session, parent=parent) HelpableScreen.__init__(self) TagManager.__init__(self) self.setTitle(_("Tag Editor")) if isinstance(service, eServiceReference): tags = eServiceCenter.getInstance().info(service).getInfoString( service, iServiceInformation.sTags) tags = tags.split(" ") if tags else [] elif tags is None: tags = [] elif isinstance(tags, list): pass elif isinstance(tags, str): tags = [x.strip() for x in tags.split(",")] if "," in tags else [tags] else: raise TypeError( "[TagEditor] Error: Must be called with a service as a movie service reference or a tag list!" ) self.service = service self["actions"] = HelpableActionMap( self, ["OkCancelActions", "ColorActions", "MenuActions"], { "cancel": (self.keyCancel, _("Cancel any changed tags and exit")), "save": (self.keySave, _("Save all changed tags and exit")), "ok": (self.toggleSelection, _("Toggle selection of the current tag")), "red": (self.keyCancel, _("Cancel any changed tags and exit")), "green": (self.keySave, _("Save all changed tags and exit")), "yellow": (self.addNewTag, _("Add a new tag")), "blue": (self.loadFromData, _("Load tags from the timer and recordings")), "menu": (self.showMenu, _("Display the tags context menu")) }, prio=0, description=_("Tag Editor Actions")) self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("Save")) self["key_yellow"] = StaticText(_("New")) self["key_blue"] = StaticText(_("Load")) self["key_menu"] = StaticText(_("MENU")) self["taglist"] = SelectionList(enableWrapAround=True) self.tags = self.mergeTags(tags) self.updateMenuList(self.tags, extraSelected=tags) self.ghostList = tags[:] self.ghostTags = self.tags[:]
def __init__(self, session, menu_path="", userSatlist=""): Screen.__init__(self, session) screentitle = _("Select satellites") if config.usage.show_menupath.value == 'large': menu_path += screentitle title = menu_path self["menu_path_compressed"] = StaticText("") elif config.usage.show_menupath.value == 'small': title = screentitle self["menu_path_compressed"] = StaticText(menu_path + " >" if not menu_path.endswith(' / ') else menu_path[:-3] + " >" or "") else: title = screentitle self["menu_path_compressed"] = StaticText("") Screen.setTitle(self, title) self["key_red"] = Button(_("Cancel")) self["key_green"] = Button(_("Save")) self["key_yellow"] = Button(_("Sort by")) self["key_blue"] = Button(_("Select all")) self["hint"] = Label(_("Press OK to toggle the selection")) SatList = [] if not isinstance(userSatlist, str): userSatlist = "" else: userSatlist = userSatlist.replace("]", "").replace("[", "") for sat in nimmanager.getSatList(): selected = False sat_str = str(sat[0]) if userSatlist and ("," not in userSatlist and sat_str == userSatlist) or ((', ' + sat_str + ',' in userSatlist) or (userSatlist.startswith(sat_str + ',')) or (userSatlist.endswith(', ' + sat_str))): selected = True SatList.append((sat[0], sat[1], sat[2], selected)) sat_list = [SelectionEntryComponent(x[1], x[0], x[2], x[3]) for x in SatList] self["list"] = SelectionList(sat_list, enableWrapAround=True) self["setupActions"] = ActionMap(["SetupActions", "ColorActions"], { "red": self.cancel, "green": self.save, "yellow": self.sortBy, "blue": self["list"].toggleAllSelection, "save": self.save, "cancel": self.cancel, "ok": self["list"].toggleSelection, }, -2)
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 __init__(self, session): self.session = session Screen.__init__(self, session) self.setup_title = _("EPG Import Filter") + " v" + VERSION + " by Acds" self.setTitle(self.setup_title) #cfg = EPGConfig.loadUserSettings() #filter = cfg["sources"] self.offerToSave = False self.callback = None bouquets = getBouquetList() filter = epgWorker.bouquets sources = [ # (description, value, index, selected) SelectionEntryComponent(x[0], x[1], 0, (filter is None) or (x[0] in filter)) for x in bouquets ] self["statusbar"] = Label() self["status"] = Label() self["list"] = SelectionList(sources) self["setActions"] = ActionMap(["OkCancelActions", "ColorActions", "TimerEditActions"], { "cancel": self.cancel, "red": self.uninstall, "green": self.selectAll, "yellow": self.advanced, "blue": self.install, "ok": self.toggle }, -2) self["key_red"] = Label(_("Uninstall")) self["key_green"] = Label(_("Select All")) self["key_yellow"] = Label(_("Advanced")) self["key_blue"] = Label(_("Install")) self.updateTimer = enigma.eTimer() self.updateTimer.callback.append(self.updateStatus) self.updateStatus() self.updateTimer.start(2000)
def __init__(self, session, list): Screen.__init__(self, session) Screen.setTitle(self, _("IPK Installer")) self.list = SelectionList() self["list"] = self.list for listindex in range(len(list)): if not list[listindex].split('/')[-1].startswith('._'): self.list.addSelection(list[listindex].split('/')[-1], list[listindex], listindex, False) self["key_red"] = StaticText(_("Close")) self["key_green"] = StaticText(_("Install")) self["key_blue"] = StaticText(_("Invert")) self["introduction"] = StaticText(_("Press OK to toggle the selection.")) self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], { "ok": self.list.toggleSelection, "cancel": self.close, "red": self.close, "green": self.install, "blue": self.list.toggleAllSelection }, -1)
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 __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)
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)
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 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
def __init__(self, session, autotimer, name, begin, end, disabled, sref, afterEvent, justplay, dirname, tags): Screen.__init__(self, session) # Keep AutoTimer self.autotimer = autotimer # Initialize Buttons self["key_red"] = StaticText(_("Cancel")) self["key_green"] = StaticText(_("OK")) self["key_yellow"] = StaticText() self["key_blue"] = StaticText() entries = [] append = entries.append if disabled is not None: append( SelectionEntryComponent( ': '.join((_("Enabled"), {True: _("disable"), False: _("enable")}[bool(disabled)])), not disabled, 0, True )) if name != "": append( SelectionEntryComponent( _("Match title: %s") % (name), name, 1, True )) append( SelectionEntryComponent( _("Exact match"), True, 8, True )) if begin and end: begin = localtime(begin) end = localtime(end) append( SelectionEntryComponent( _("Match Timespan: %02d:%02d - %02d:%02d") % (begin[3], begin[4], end[3], end[4]), ((begin[3], begin[4]), (end[3], end[4])), 2, True )) append( SelectionEntryComponent( _("Only on Weekday: %s") % (weekdays[begin.tm_wday][1],), # XXX: the lookup is dirty but works :P str(begin.tm_wday), 9, True )) if sref: append( SelectionEntryComponent( _("Only on Service: %s") % (sref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '')), str(sref), 3, True )) if afterEvent is not None: append( SelectionEntryComponent( ': '.join((_("After event"), afterevent[afterEvent])), afterEvent, 4, True )) if justplay is not None: append( SelectionEntryComponent( ': '.join((_("Timer type"), {0: _("record"), 1: _("zap")}[int(justplay)])), int(justplay), 5, True )) if dirname is not None: append( SelectionEntryComponent( ': '.join((_("Location"), dirname or "/hdd/movie/")), dirname, 6, True )) if tags: append( SelectionEntryComponent( ': '.join((_("Tags"), ', '.join(tags))), tags, 7, True )) self["list"] = SelectionList(entries) # Define Actions self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], { "ok": self["list"].toggleSelection, "cancel": self.cancel, "red": self.cancel, "green": self.accept }, -1) self.onLayoutFinish.append(self.setCustomTitle)
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))