Example #1
0
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)
Example #2
0
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()
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
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)
Example #6
0
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)
Example #7
0
 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)
Example #8
0
    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)
Example #9
0
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()
Example #10
0
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()
Example #11
0
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()
Example #12
0
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)
Example #14
0
 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)
Example #15
0
 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)
Example #16
0
	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)
Example #17
0
 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)
Example #18
0
	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"))
Example #19
0
    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)
Example #20
0
	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"))
Example #21
0
    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)
Example #22
0
	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)
Example #23
0
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()
Example #24
0
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)
Example #25
0
    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)
Example #26
0
    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)
Example #27
0
 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)
Example #29
0
 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)
Example #30
0
 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[:]
Example #31
0
	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)
Example #32
0
	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)		
Example #34
0
	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)
Example #36
0
 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)
Example #37
0
	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)
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)
Example #39
0
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)
Example #41
0
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
Example #42
0
	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)
Example #43
0
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
Example #44
0
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
Example #45
0
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))