Ejemplo n.º 1
0
class UnpackInfoScreen(Screen):
	skin = """
		<screen position="40,80" size="1200,600" title="" >
			<widget name="list_left_head" position="10,10" size="1180,60" font="Regular;20" foregroundColor="#00fff000"/>
			<widget name="list_left" position="10,85" size="1180,470" scrollbarMode="showOnDemand"/>
			<widget name="key_red" position="100,570" size="260,25" transparent="1" font="Regular;20"/>
			<widget name="key_green" position="395,570" size="260,25"  transparent="1" font="Regular;20"/>
			<widget name="key_yellow" position="690,570" size="260,25" transparent="1" font="Regular;20"/>
			<widget name="key_blue" position="985,570" size="260,25" transparent="1" font="Regular;20"/>
			<ePixmap position="70,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_red.png" transparent="1" alphatest="on"/>
			<ePixmap position="365,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_green.png" transparent="1" alphatest="on"/>
			<ePixmap position="660,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_yellow.png" transparent="1" alphatest="on"/>
			<ePixmap position="955,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_blue.png" transparent="1" alphatest="on"/>
		</screen>"""

	def __init__(self, session, list, sourceDir, filename):
		self.session = session
		self.list = list
		self.sourceDir = sourceDir
		self.filename = filename
		Screen.__init__(self, session)

		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20))
		self.chooseMenuList.l.setItemHeight(25)
		self['list_left'] = self.chooseMenuList
		
		self["list_left_head"] = Label("%s%s" % (self.sourceDir, self.filename))
		
		self["key_red"] = Label(_("cancel"))
		self["key_green"] = Label(_("ok"))
		self["key_yellow"] = Label("")
		self["key_blue"] = Label("")

		self["setupActions"] = ActionMap(["SetupActions"],
		{
			"red": self.cancel,
			"green": self.cancel,
			"cancel": self.cancel,
			"ok": self.cancel,
		}, -2)

		self.onLayoutFinish.append(self.onLayout)

	def onLayout(self):
		self.setTitle(pname)
		if len(self.list) != 0:
			self.chooseMenuList.setList(map(self.ListEntry, self.list))

	def ListEntry(self, entry):
		return [entry,
			(eListboxPythonMultiContent.TYPE_TEXT, 10, 0, 1180, 25, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, entry[0])
			]

	def cancel(self):
		self.close()
Ejemplo n.º 2
0
class infoHelper():
    def __init__(self):
        self.infoLabel = MenuList([],
                                  enableWrapAround=True,
                                  content=eListboxPythonMultiContent)
        self.infoLabel.l.setFont(0, gFont('Vpn', int(27 / skinFactor)))
        self.infoLabel.l.setItemHeight(int(42 / skinFactor))
        self['myInfoLabel'] = self.infoLabel

        self.updateTimer = eTimer()
        self.updateTimer.callback.append(self.load_info)

        self.onLayoutFinish.append(self.load_info)

    def load_info(self):
        info = [("OpenVPN Autostart:", config.vpnmanager.autostart.value,
                 True), ("Resolv conf:", config.vpnmanager.resolv.value, True)]

        if os.path.isfile("/etc/resolv.conf"):
            with open("/etc/resolv.conf", "r") as resolv_conf:
                x = 1
                for line in resolv_conf.readlines():
                    if "nameserver" in line:
                        dns = "DNS %s:" % str(x)
                        text = re.sub("nameserver", "", line).strip()
                        info.append((dns, text, False))
                        x = x + 1

        if os.path.isfile(STATUS):
            stat = open(STATUS, "r")
            for line in stat.readlines():
                cols = line.split(',')
                if len(cols) == 2:
                    if is_number(cols[1].replace("\n", "")):
                        item = cols[0].replace("bytes", "").strip()
                        item_info = byte2str(int(cols[1].replace("\n", "")))
                        info.append((item, item_info, False))

        self.infoLabel.setList(map(set_info_label, info))
        self['myInfoLabel'].selectionEnabled(0)
        if not self.StatusSpinner:
            self.updateTimer.start(12000, True)
class serienRecMainChannelEdit(Screen, HelpableScreen):
	def __init__(self, session):
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.session = session
		self.serienRecChannelList = []
		self.stbChannelList = []
		self.selected_sender = None
		self.skin = None
		self.displayMode = 2
		self.displayTimer = eTimer()
		self.displayTimer_conn = None
		self.chooseMenuList = None
		self.chooseMenuList_popup = None
		self.chooseMenuList_popup2 = None

		from difflib import SequenceMatcher
		self.sequenceMatcher = SequenceMatcher(" ".__eq__, "", "")
		
		self["actions"] = HelpableActionMap(self, "SerienRecorderActions", {
			"ok"       : (self.keyOK, "Popup-Fenster zur Auswahl des STB-Sender öffnen"),
			"cancel"   : (self.keyCancel, "zurück zur Serienplaner-Ansicht"),
			"red"	   : (self.keyRed, "umschalten ausgewählter Sender für Timererstellung aktiviert/deaktiviert"),
			"red_long" : (self.keyRedLong, "ausgewählten Sender aus der Channelliste endgültig löschen"),
			"green"    : (self.keyGreen, "Sender-Zuordnung aktualisieren"),
			"blue"     : (self.keyBlue, "Automatische Sender-Zuordnung"),
			"menu"     : (self.channelSetup, "Menü für Sender-Einstellungen öffnen"),
			"menu_long": (self.recSetup, "Menü für globale Einstellungen öffnen"),
			"left"     : (self.keyLeft, "zur vorherigen Seite blättern"),
			"right"    : (self.keyRight, "zur nächsten Seite blättern"),
			"up"       : (self.keyUp, "eine Zeile nach oben"),
			"down"     : (self.keyDown, "eine Zeile nach unten"),
			"startTeletext"       : (self.youtubeSearch, "Trailer zum ausgewählten Sender auf YouTube suchen"),
			"startTeletext_long"  : (self.WikipediaSearch, "Informationen zum ausgewählten Sender auf Wikipedia suchen"),
			"0"		   : (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
			"3"		   : (self.showProposalDB, "Liste der Serien/Staffel-Starts anzeigen"),
			"6"		   : (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
			"7"		   : (self.showWishlist, "Merkzettel (vorgemerkte Folgen) anzeigen"),
		}, -1)
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["SerienRecorderActions",], {
			"displayHelp"      : self.showHelp,
			"displayHelp_long" : self.showManual,
		}, 0)

		self.setupSkin()

		self.modus = "list"
		self.changesMade = False

		self.timer_default = eTimer()
		if isDreamboxOS:
			self.timer_default_conn = self.timer_default.timeout.connect(self.showChannels)
		else:
			self.timer_default.callback.append(self.showChannels)

		# cCursor = SerienRecorder.dbSerRec.cursor()
		# cCursor.execute("SELECT * FROM Channels")
		# row = cCursor.fetchone()
		# if row:
		# 	cCursor.close()
		# 	self.onLayoutFinish.append(self.showChannels)
		# else:
		# 	cCursor.close()
		# 	if config.plugins.serienRec.selectBouquets.value:
		# 		self.stbChannelList = STBHelpers.buildSTBChannelList(config.plugins.serienRec.MainBouquet.value)
		# 	else:
		# 		self.stbChannelList = STBHelpers.buildSTBChannelList()
		# 	self.onLayoutFinish.append(self.readWebChannels)

		self.onLayoutFinish.append(self.setSkinProperties)
		self.onLayoutFinish.append(self.__onLayoutFinished)
		self.onClose.append(self.__onClose)

	def callHelpAction(self, *args):
		HelpableScreen.callHelpAction(self, *args)

	def setSkinProperties(self):
		setSkinProperties(self)

		self['text_green'].setText("Aktualisieren")
		self['text_ok'].setText("Sender auswählen")

		self.num_bt_text[4][0] = buttonText_na
		if longButtonText:
			self['text_red'].setText("An/Aus (lang: Löschen)")
			self.num_bt_text[4][2] = "Setup Sender (lang: global)"
		else:
			self['text_red'].setText("(De)aktivieren/Löschen")
			self.num_bt_text[4][2] = "Setup Sender/global"

		self['text_blue'].setText("Auto-Zuordnung")

		self.displayTimer = None
		global showAllButtons
		if showAllButtons:
			Skin1_Settings(self)
		else:
			self.displayMode = 2
			self.updateMenuKeys()

			self.displayTimer = eTimer()
			if isDreamboxOS:
				self.displayTimer_conn = self.displayTimer.timeout.connect(self.updateMenuKeys)
			else:
				self.displayTimer.callback.append(self.updateMenuKeys)
			self.displayTimer.start(config.plugins.serienRec.DisplayRefreshRate.value * 1000)

	def setupSkin(self):
		self.skin = None
		InitSkin(self)

		# normal
		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList.l.setItemHeight(int(25*skinFactor))
		self['list'] = self.chooseMenuList
		self['list'].show()

		# popup
		self.chooseMenuList_popup = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList_popup.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList_popup.l.setItemHeight(int(25*skinFactor))
		self['popup_list'] = self.chooseMenuList_popup
		self['popup_list'].hide()

		# popup2
		self.chooseMenuList_popup2 = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList_popup2.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList_popup2.l.setItemHeight(int(25*skinFactor))
		self['popup_list2'] = self.chooseMenuList_popup2
		self['popup_list2'].hide()

		self['title'].setText("Lade Web-Sender / STB-Sender...")

		self['Web_Channel'].setText("Web-Sender")
		self['STB_Channel'].setText("STB-Sender")
		self['alt_STB_Channel'].setText("alt. STB-Sender")

		self['Web_Channel'].show()
		self['STB_Channel'].show()
		self['alt_STB_Channel'].show()
		self['separator'].show()

		global showAllButtons
		if not showAllButtons:
			self['bt_red'].show()
			self['bt_green'].show()
			self['bt_blue'].show()
			self['bt_ok'].show()
			self['bt_exit'].show()
			self['bt_text'].show()
			self['bt_info'].show()
			self['bt_menu'].show()

			self['text_red'].show()
			self['text_green'].show()
			self['text_blue'].show()
			self['text_ok'].show()
			self['text_0'].show()
			self['text_1'].show()
			self['text_2'].show()
			self['text_3'].show()
			self['text_4'].show()

	def updateMenuKeys(self):
		updateMenuKeys(self)

	def channelSetup(self):
		webSender = self['list'].getCurrent()[0][0]
		self.session.open(SerienRecorder.serienRecChannelSetup, webSender)

	def readLogFile(self):
		self.session.open(SerienRecorder.serienRecReadLog)

	def showProposalDB(self):
		self.session.open(SerienRecorder.serienRecShowSeasonBegins)

	def showConflicts(self):
		self.session.open(SerienRecorder.serienRecShowConflicts)

	def showWishlist(self):
		self.session.open(SerienRecorder.serienRecWishlist)

	def youtubeSearch(self):
		if SerienRecorder.epgTranslatorInstalled:
			check = self['list'].getCurrent()
			if check is None:
				return

			sender_name = self['list'].getCurrent()[0][0]
			from Plugins.Extensions.EPGTranslator.plugin import searchYouTube
			self.session.open(searchYouTube, sender_name)
		else:
			self.session.open(MessageBox, "Um diese Funktion nutzen zu können muss das Plugin '%s' installiert sein." % "EPGTranslator von Kashmir", MessageBox.TYPE_INFO, timeout = 10)

	def WikipediaSearch(self):
		if SerienRecorder.WikipediaInstalled:
			check = self['list'].getCurrent()
			if check is None:
				return

			sender_name = self['list'].getCurrent()[0][0]
			from Plugins.Extensions.Wikipedia.plugin import wikiSearch
			self.session.open(wikiSearch, sender_name)
		else:
			self.session.open(MessageBox, "Um diese Funktion nutzen zu können muss das Plugin '%s' installiert sein." % "Wikipedia von Kashmir", MessageBox.TYPE_INFO, timeout = 10)

	def showManual(self):
		if SerienRecorder.OperaBrowserInstalled:
			self.session.open(SerienRecorder.Browser, SerienRecorder.SR_OperatingManual, True)
		elif SerienRecorder.DMMBrowserInstalled:
			self.session.open(SerienRecorder.Browser, True, SerienRecorder.SR_OperatingManual)
		else:
			self.session.open(MessageBox, "Um diese Funktion nutzen zu können muss das Plugin '%s' installiert sein." % "Webbrowser", MessageBox.TYPE_INFO, timeout = 10)

	def showAbout(self):
		self.session.open(serienRecAboutScreen)

	def recSetup(self):
		self.session.openWithCallback(self.setupClose, SerienRecorder.serienRecSetup)

	def setupClose(self, result):
		if not result[2]:
			self.close()
		else:
			if result[0]:
				if config.plugins.serienRec.timeUpdate.value:
					SerienRecorder.serienRecCheckForRecording(self.session, False)

			if result[1]:
				self.showChannels()

	def __onLayoutFinished(self):
		self['title'].setText("Lade Web-Sender / STB-Sender...")
		self.timer_default.start(0)

	def showChannels(self):
		self.timer_default.stop()
		self.serienRecChannelList = []
		cCursor = SerienRecorder.dbSerRec.cursor()
		cCursor.execute("SELECT WebChannel, STBChannel, ServiceRef, alternativSTBChannel, alternativServiceRef, Erlaubt FROM Channels ORDER BY LOWER(WebChannel)")
		for row in cCursor:
			(webSender, servicename, serviceref, altservicename, altserviceref, status) = row
			self.serienRecChannelList.append((webSender, servicename, altservicename, status))
		cCursor.close()

		if len(self.serienRecChannelList) != 0:
			self['title'].setText("Sender zuordnen")
			self.chooseMenuList.setList(map(self.buildList, self.serienRecChannelList))
		else:
			self.channelReset(True)

	def readWebChannels(self):
		print "[SerienRecorder] call webpage.."
		self['title'].setText("Lade Web-Sender...")
		try:
			self.createWebChannels(SeriesServer().doGetWebChannels(), False)
		except:
			self['title'].setText("Fehler beim Laden der Web-Sender")

	def createWebChannels(self, webChannelList, autoMatch):
		if webChannelList:
			webChannelList.sort(key=lambda x: x.lower())
			self.serienRecChannelList = []
			if len(webChannelList) != 0:
				self['title'].setText("Erstelle Sender-Liste...")
				cCursor = SerienRecorder.dbSerRec.cursor()
				sql = "INSERT OR IGNORE INTO Channels (WebChannel, STBChannel, ServiceRef, Erlaubt) VALUES (?, ?, ?, ?)"
				if autoMatch:
					# Get existing channels from database
					cCursor.execute("SELECT WebChannel, STBChannel FROM Channels")
					dbChannels = cCursor.fetchall()

					missingWebChannels = self.getMissingWebChannels(webChannelList, dbChannels)
					for webChannel in missingWebChannels:
						# Unmapped web channel
						(servicename, serviceref) = self.findWebChannelInSTBChannels(webChannel)
						if servicename and serviceref:
							cCursor.execute(sql, (webChannel, servicename, serviceref, 1))
							self.serienRecChannelList.append((webChannel, servicename, "", "1"))
						else:
							cCursor.execute(sql, (webChannel, "", "", 0))
							self.serienRecChannelList.append((webChannel, "", "", "0"))

						self.changesMade = True
						global runAutocheckAtExit
						runAutocheckAtExit = True
				else:
					for webChannel in webChannelList:
						cCursor.execute(sql, (webChannel, "", "", 0))
						self.serienRecChannelList.append((webChannel, "", "", "0"))

				SerienRecorder.dbSerRec.commit()
				cCursor.close()
			else:
				print "[SerienRecorder] webChannel list leer.."

			if len(self.serienRecChannelList) != 0:
				self.chooseMenuList.setList(map(self.buildList, self.serienRecChannelList))
			else:
				print "[SerienRecorder] Fehler bei der Erstellung der SerienRecChlist.."

		else:
			print "[SerienRecorder] get webChannel error.."

		self['title'].setText("Web-Sender / STB-Sender")

	@staticmethod
	def getMissingWebChannels(webChannels, dbChannels):
		result = []

		# append missing
		for webChannel in webChannels:
			if not [item for item in dbChannels if webChannel.lower() in [dbWebChannel.lower() for dbWebChannel in item]]:
				result.append(webChannel)

		return result

	def findWebChannelInSTBChannels(self, webChannel):
		result = (None, None)

		# First try to find the HD version
		webChannelHD = webChannel + " HD"
		for servicename,serviceref in self.stbChannelList:
			self.sequenceMatcher.set_seqs(webChannelHD.lower(), servicename.lower())
			ratio = self.sequenceMatcher.ratio()
			if ratio >= 0.98:
				result = (servicename, serviceref)
				break

		if not result:
			for servicename,serviceref in self.stbChannelList:
				self.sequenceMatcher.set_seqs(webChannel.lower(), servicename.lower())
				ratio = self.sequenceMatcher.ratio()
				if ratio >= 0.98:
					result = (servicename, serviceref)
					break

		return result

	@staticmethod
	def buildList(entry):
		(webSender, stbSender, altstbSender, status) = entry
		if int(status) == 0:
			imageStatus = "%simages/minus.png" % serienRecMainPath
		else:
			imageStatus = "%simages/plus.png" % serienRecMainPath

		return [entry,
			(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 7 * skinFactor, 16 * skinFactor, 16 * skinFactor, loadPNG(imageStatus)),
			(eListboxPythonMultiContent.TYPE_TEXT, 40 * skinFactor, 0, 300 * skinFactor, 26 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, webSender),
			(eListboxPythonMultiContent.TYPE_TEXT, 350 * skinFactor, 0, 250 * skinFactor, 26 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, stbSender),
			(eListboxPythonMultiContent.TYPE_TEXT, 600 * skinFactor, 0, 250 * skinFactor, 26 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, altstbSender, parseColor('yellow').argb())
			]

	@staticmethod
	def buildList_popup(entry):
		(servicename,serviceref) = entry
		return [entry,
			(eListboxPythonMultiContent.TYPE_TEXT, 5, 1, 250 * skinFactor, 25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, servicename)
			]

	def keyOK(self):
		global runAutocheckAtExit
		if self.modus == "list":
			self.modus = "popup_list"
			self['popup_list'].show()
			self['popup_bg'].show()
			if config.plugins.serienRec.selectBouquets.value:
				self.stbChannelList = STBHelpers.buildSTBChannelList(config.plugins.serienRec.MainBouquet.value)
			else:
				self.stbChannelList = STBHelpers.buildSTBChannelList()
			self.stbChannelList.insert(0, ("", ""))
			self.chooseMenuList_popup.setList(map(self.buildList_popup, self.stbChannelList))
			idx = 0
			cCursor = SerienRecorder.dbSerRec.cursor()
			cCursor.execute("SELECT STBChannel, alternativSTBChannel FROM Channels WHERE LOWER(WebChannel)=?", (self['list'].getCurrent()[0][0].lower(),))
			row = cCursor.fetchone()
			if row:
				(stbChannel, altstbChannel) = row
				if stbChannel:
					try:
						idx = zip(*self.stbChannelList)[0].index(stbChannel)
					except:
						pass
			cCursor.close()
			self['popup_list'].moveToIndex(idx)
			self['title'].setText("Standard STB-Sender für %s:" % self['list'].getCurrent()[0][0])
		elif config.plugins.serienRec.selectBouquets.value:
			if self.modus == "popup_list":
				self.modus = "popup_list2"
				self['popup_list'].hide()
				self['popup_list2'].show()
				self['popup_bg'].show()
				self.stbChannelList = STBHelpers.buildSTBChannelList(config.plugins.serienRec.AlternativeBouquet.value)
				self.stbChannelList.insert(0, ("", ""))
				self.chooseMenuList_popup2.setList(map(self.buildList_popup, self.stbChannelList))
				idx = 0
				cCursor = SerienRecorder.dbSerRec.cursor()
				cCursor.execute("SELECT STBChannel, alternativSTBChannel FROM Channels WHERE LOWER(WebChannel)=?", (self['list'].getCurrent()[0][0].lower(),))
				row = cCursor.fetchone()
				if row:
					(stbChannel, altstbChannel) = row
					if stbChannel:
						try:
							idx = zip(*self.stbChannelList)[0].index(altstbChannel)
						except:
							pass
				cCursor.close()
				self['popup_list2'].moveToIndex(idx)
				self['title'].setText("alternativer STB-Sender für %s:" % self['list'].getCurrent()[0][0])
			else:
				self.modus = "list"
				self['popup_list'].hide()
				self['popup_list2'].hide()
				self['popup_bg'].hide()

				check = self['list'].getCurrent()
				if check is None:
					print "[SerienRecorder] Sender-Liste leer (list)."
					return

				check = self['popup_list'].getCurrent()
				if check is None:
					print "[SerienRecorder] Sender-Liste leer (popup_list)."
					return

				chlistSender = self['list'].getCurrent()[0][0]
				stbSender = self['popup_list'].getCurrent()[0][0]
				stbRef = self['popup_list'].getCurrent()[0][1]
				altstbSender = self['popup_list2'].getCurrent()[0][0]
				altstbRef = self['popup_list2'].getCurrent()[0][1]
				print "[SerienRecorder] select:", chlistSender, stbSender, stbRef, altstbSender, altstbRef
				cCursor = SerienRecorder.dbSerRec.cursor()
				sql = "UPDATE OR IGNORE Channels SET STBChannel=?, ServiceRef=?, alternativSTBChannel=?, alternativServiceRef=?, Erlaubt=? WHERE LOWER(WebChannel)=?"
				if stbSender != "" or altstbSender != "":
					cCursor.execute(sql, (stbSender, stbRef, altstbSender, altstbRef, 1, chlistSender.lower()))
				else:
					cCursor.execute(sql, (stbSender, stbRef, altstbSender, altstbRef, 0, chlistSender.lower()))
				self.changesMade = True
				runAutocheckAtExit = True
				SerienRecorder.dbSerRec.commit()
				cCursor.close()
				self['title'].setText("Sender zuordnen")
				self.showChannels()
		else:
			self.modus = "list"
			self['popup_list'].hide()
			self['popup_list2'].hide()
			self['popup_bg'].hide()

			if self['list'].getCurrent() is None:
				print "[SerienRecorder] Sender-Liste leer (list)."
				return

			if self['popup_list'].getCurrent() is None:
				print "[SerienRecorder] Sender-Liste leer (popup_list)."
				return

			chlistSender = self['list'].getCurrent()[0][0]
			stbSender = self['popup_list'].getCurrent()[0][0]
			stbRef = self['popup_list'].getCurrent()[0][1]
			print "[SerienRecorder] select:", chlistSender, stbSender, stbRef
			cCursor = SerienRecorder.dbSerRec.cursor()
			sql = "UPDATE OR IGNORE Channels SET STBChannel=?, ServiceRef=?, Erlaubt=? WHERE LOWER(WebChannel)=?"
			if stbSender != "":
				cCursor.execute(sql, (stbSender, stbRef, 1, chlistSender.lower()))
			else:
				cCursor.execute(sql, (stbSender, stbRef, 0, chlistSender.lower()))
			self.changesMade = True
			runAutocheckAtExit = True
			SerienRecorder.dbSerRec.commit()
			cCursor.close()
			self['title'].setText("Sender zuordnen")
			self.showChannels()

	def keyRed(self):
		global runAutocheckAtExit
		if self['list'].getCurrent() is None:
			print "[SerienRecorder] Sender-Liste leer."
			return

		if self.modus == "list":
			chlistSender = self['list'].getCurrent()[0][0]
			sender_status = self['list'].getCurrent()[0][2]
			print sender_status

			cCursor = SerienRecorder.dbSerRec.cursor()
			cCursor.execute("SELECT WebChannel, STBChannel, ServiceRef, Erlaubt FROM Channels WHERE LOWER(WebChannel)=?", (chlistSender.lower(),))
			row = cCursor.fetchone()
			if row:
				(webSender, servicename, serviceref, status) = row
				sql = "UPDATE OR IGNORE Channels SET Erlaubt=? WHERE LOWER(WebChannel)=?"
				if int(status) == 0:
					cCursor.execute(sql, (1, chlistSender.lower()))
					print "[SerienRecorder] change to:", webSender, servicename, serviceref, "1"
					self['title'].instance.setForegroundColor(parseColor("red"))
					self['title'].setText("")
					self['title'].setText("Sender '- %s -' wurde aktiviert." % webSender)
				else:
					cCursor.execute(sql, (0, chlistSender.lower()))
					print "[SerienRecorder] change to:",webSender, servicename, serviceref, "0"
					self['title'].instance.setForegroundColor(parseColor("red"))
					self['title'].setText("")
					self['title'].setText("Sender '- %s -' wurde deaktiviert." % webSender)
				self.changesMade = True
				runAutocheckAtExit = True
				SerienRecorder.dbSerRec.commit()

			cCursor.close()
			self['title'].instance.setForegroundColor(parseColor("foreground"))
			self.showChannels()

	def keyGreen(self):
		self.session.openWithCallback(self.channelReset, MessageBox, "Senderliste aktualisieren?", MessageBox.TYPE_YESNO)

	def channelReset(self, execute):
		if execute:
			print "[SerienRecorder] channel-list reset..."

			if config.plugins.serienRec.selectBouquets.value:
				self.stbChannelList = STBHelpers.buildSTBChannelList(config.plugins.serienRec.MainBouquet.value)
			else:
				self.stbChannelList = STBHelpers.buildSTBChannelList()
			self['title'].setText("Lade Web-Sender...")
			try:
				self.createWebChannels(SeriesServer().doGetWebChannels(), False)
			except:
				self['title'].setText("Fehler beim Laden der Web-Sender")
		else:
			print "[SerienRecorder] channel-list ok."

	def keyBlue(self):
		self.session.openWithCallback(self.autoMatch, MessageBox, "Automatische Zuordnung durchführen?\n\nDieser Vorgang kann je nach Umfang der Senderliste einige Zeit dauern?", MessageBox.TYPE_YESNO)

	def autoMatch(self, execute):
		if execute:
			if config.plugins.serienRec.selectBouquets.value:
				self.stbChannelList = STBHelpers.buildSTBChannelList(config.plugins.serienRec.MainBouquet.value)
			else:
				self.stbChannelList = STBHelpers.buildSTBChannelList()
			self['title'].setText("Versuche automatische Zuordnung...")
			try:
				self.createWebChannels(SeriesServer().doGetWebChannels(), True)
			except:
				self['title'].setText("Fehler beim Laden der Web-Sender")

	def keyRedLong(self):
		check = self['list'].getCurrent()
		if check is None:
			print "[SerienRecorder] Serien Marker leer."
			return
		else:
			self.selected_sender = self['list'].getCurrent()[0][0]
			cCursor = SerienRecorder.dbSerRec.cursor()
			cCursor.execute("SELECT * FROM Channels WHERE LOWER(WebChannel)=?", (self.selected_sender.lower(),))
			row = cCursor.fetchone()
			if row:
				print "gefunden."
				if config.plugins.serienRec.confirmOnDelete.value:
					self.session.openWithCallback(self.channelDelete, MessageBox, "Soll '%s' wirklich entfernt werden?" % self.selected_sender, MessageBox.TYPE_YESNO, default = False)
				else:
					self.channelDelete(True)
			cCursor.close()

	def channelDelete(self, answer):
		if not answer:
			return
		cCursor = SerienRecorder.dbSerRec.cursor()
		cCursor.execute("DELETE FROM NeuerStaffelbeginn WHERE LOWER(Sender)=?", (self.selected_sender.lower(),))
		cCursor.execute("DELETE FROM SenderAuswahl WHERE LOWER(ErlaubterSender)=?", (self.selected_sender.lower(),))
		cCursor.execute("DELETE FROM Channels WHERE LOWER(WebChannel)=?", (self.selected_sender.lower(),))
		SerienRecorder.dbSerRec.commit()
		cCursor.close()
		self.changesMade = True
		self['title'].instance.setForegroundColor(parseColor("red"))
		self['title'].setText("Sender '- %s -' entfernt." % self.selected_sender)
		self.showChannels()

	def keyLeft(self):
		self[self.modus].pageUp()

	def keyRight(self):
		self[self.modus].pageDown()

	def keyDown(self):
		self[self.modus].down()

	def keyUp(self):
		self[self.modus].up()

	def __onClose(self):
		if self.displayTimer:
			self.displayTimer.stop()
			self.displayTimer = None

	def keyCancel(self):
		if self.modus == "popup_list":
			self.modus = "list"
			self['popup_list'].hide()
			self['popup_bg'].hide()
		elif self.modus == "popup_list2":
			self.modus = "list"
			self['popup_list2'].hide()
			self['popup_bg'].hide()
		else:
			if config.plugins.serienRec.refreshViews.value:
				self.close(self.changesMade)
			else:
				self.close(False)
Ejemplo n.º 4
0
class TwitchMain(Screen):
	ITEM_LIVESTREAMS = "livestreams"
	ITEM_TOP_GAMES = "topgames"
	ITEM_FAVORITES = "favorites"
	ITEM_SEARCH_CHANNEL = "search_channel"
	ITEM_FOLLOWED_CHANNELS = "followed_channels"
	ITEM_SETUP = "setup"

	def __init__(self, session):
		Screen.__init__(self, session)
		self.setup_title = _("TwitchTV")

		self._list = MenuList(list)
		self["list"] = self._list
		self.createSetup()

		self.twitch = Twitch()

		self["myActionMap"] = ActionMap(["SetupActions"],
		{
			"ok": self.go,
			"cancel": self.close
		}, -1)

		self.onLayoutFinish.append(self.layoutFinished)

	def layoutFinished(self):
		self.setTitle(_("TwitchTV"))

	def createSetup(self):
		items = [
			(_("Livestreams"), self.ITEM_LIVESTREAMS),
			(_("Top Games"), self.ITEM_TOP_GAMES),
			(_("Favorites"), self.ITEM_FAVORITES),
		]
		if config.plugins.twitchtv.user.value:
			items.append((_("Followed Channels"), self.ITEM_FOLLOWED_CHANNELS))
		items.extend([
			(_("Search for channel"), self.ITEM_SEARCH_CHANNEL),
			(_("Setup"), self.ITEM_SETUP),
		])
		self._list.setList(items)

	def go(self):
		selection = self["list"].getCurrent()
		selection = selection and selection[1]
		if not selection:
			return

		if selection == self.ITEM_LIVESTREAMS:
			self.session.open(TwitchLiveStreams)
		elif selection == self.ITEM_TOP_GAMES:
			self.session.open(TwitchGamesGrid)
		elif selection == self.ITEM_FAVORITES:
			self.session.open(TwitchChannelList)
		elif selection == self.ITEM_SEARCH_CHANNEL:
			self.session.openWithCallback(self.callbackSearchChannel, TwitchInputBox, title=_("Enter the name of the channel you're searching for"), text="")
		elif selection == self.ITEM_FOLLOWED_CHANNELS:
			self.session.toastManager.showToast(_("Loading followed channels for %s") %(config.plugins.twitchtv.user.value,), duration=3)
			self.twitch.followedChannels(config.plugins.twitchtv.user.value, self._onFollowedChannelsResult)
		elif selection == self.ITEM_SETUP:
			self.session.openWithCallback(self.callbackSetupUser, TwitchInputBox, title=_("Enter your twitch user"), text=config.plugins.twitchtv.user.value)

	def callbackSetupUser(self, user):
		Log.w(user)
		config.plugins.twitchtv.user.value = user or ""
		config.plugins.twitchtv.save()
		config.save()
		self.createSetup()

	def callbackSearchChannel(self, needle):
		if not needle:
			return
		boundCallback = boundFunction(self._onSearchChannelResult, needle)
		self.session.toastManager.showToast(_("Searching for channels containing '%s'") %(needle,))
		self.twitch.searchChannel(needle, boundCallback)

	def _onSearchChannelResult(self, needle, channels):
		if channels:
			self.session.open(TwitchChannelList, channels=channels, windowTitle=_("%s results for '%s'") %(len(channels), needle))
		else:
			self.session.toastManager.showToast(_("Nothing found for '%s'...") %(needle,))

	def _onFollowedChannelsResult(self, channels):
		if channels:
			self.session.open(TwitchChannelList, channels=channels, windowTitle=_("%s folllows %s channels") %(config.plugins.twitchtv.user.value, len(channels)))
		else:
			self.session.toastManager.showToast(_("%s does not follow any channel") %(config.plugins.twitchtv.user.value,))
Ejemplo n.º 5
0
class serienRecTimerListScreen(serienRecBaseScreen, Screen, HelpableScreen):
    def __init__(self, session):
        serienRecBaseScreen.__init__(self, session)
        Screen.__init__(self, session)
        HelpableScreen.__init__(self)
        self.skin = None
        self.session = session
        self.picload = ePicLoad()
        self.piconLoader = PiconLoader()
        self.WochenTag = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
        self.database = SRDatabase(getDataBaseFilePath())
        self.channelList = STBHelpers.buildSTBChannelList()
        self.lastSelectedWLID = None

        self["actions"] = HelpableActionMap(
            self, "SerienRecorderActions", {
                "ok": (self.keyOK, "Liste der erstellten Timer bearbeiten"),
                "cancel": (self.keyCancel, "zurück zur Serienplaner-Ansicht"),
                "left": (self.keyLeft, "zur vorherigen Seite blättern"),
                "right": (self.keyRight, "zur nächsten Seite blättern"),
                "up": (self.keyUp, "eine Zeile nach oben"),
                "down": (self.keyDown, "eine Zeile nach unten"),
                "red": (self.keyRed, "ausgewählten Timer löschen"),
                "green": (self.viewChange, "Sortierung ändern"),
                "yellow":
                (self.keyYellow, "umschalten alle/nur aktive Timer anzeigen"),
                "blue": (self.keyBlue, "alle noch ausstehenden Timer löschen"),
                "menu":
                (self.recSetup, "Menü für globale Einstellungen öffnen"),
                "startTeletext":
                (self.wunschliste,
                 "Informationen zur ausgewählten Serie auf Wunschliste anzeigen"
                 ),
                "0":
                (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
                "3": (self.showProposalDB,
                      "Liste der Serien/Staffel-Starts anzeigen"),
                "4": (self.serieInfo,
                      "Informationen zur ausgewählten Serie anzeigen"),
                "6":
                (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
                "7": (self.showWishlist,
                      "Merkzettel (vorgemerkte Folgen) anzeigen"),
                "8": (self.cleanUp, "Timerliste bereinigen"),
                "9":
                (self.dropAllTimer, "Alle Timer aus der Datenbank löschen"),
            }, -1)
        self.helpList[0][2].sort()

        self["helpActions"] = ActionMap(
            [
                "SerienRecorderActions",
            ],
            {
                # "ok"    : self.keyOK,
                "displayHelp": self.showHelp,
                "displayHelp_long": self.showManual,
            },
            0)

        self.setupSkin()

        self.changesMade = False
        self.filter = True

        self.onLayoutFinish.append(self.readTimer)
        self.onClose.append(self.__onClose)
        self.onLayoutFinish.append(self.setSkinProperties)

    def callHelpAction(self, *args):
        HelpableScreen.callHelpAction(self, *args)

    def setSkinProperties(self):
        super(self.__class__, self).setSkinProperties()

        self['text_red'].setText("Timer löschen")
        if config.plugins.serienRec.recordListView.value == 0:
            self['text_green'].setText("Neueste zuerst")
        elif config.plugins.serienRec.recordListView.value == 1:
            self['text_green'].setText("Älteste zuerst")
        self['text_ok'].setText("Liste bearbeiten")
        self['text_yellow'].setText("Zeige auch alte Timer")
        self['text_blue'].setText("Lösche neue Timer")
        self.num_bt_text[3][1] = "Bereinigen"
        self.num_bt_text[4][1] = "Datenbank leeren"

        super(self.__class__, self).startDisplayTimer()

    def setupSkin(self):
        InitSkin(self)

        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.chooseMenuList.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList.l.setItemHeight(int(50 * skinFactor))
        self['menu_list'] = self.chooseMenuList
        self['menu_list'].show()

        if config.plugins.serienRec.showCover.value:
            self['cover'].show()

        if not config.plugins.serienRec.showAllButtons.value:
            self['bt_red'].show()
            self['bt_green'].show()
            self['bt_ok'].show()
            self['bt_yellow'].show()
            self['bt_blue'].show()
            self['bt_exit'].show()
            self['bt_text'].show()
            self['bt_info'].show()
            self['bt_menu'].show()

            self['text_red'].show()
            self['text_green'].show()
            self['text_ok'].show()
            self['text_yellow'].show()
            self['text_blue'].show()
            self['text_0'].show()
            self['text_1'].show()
            self['text_2'].show()
            self['text_3'].show()
            self['text_4'].show()

    def updateMenuKeys(self):
        updateMenuKeys(self)

    def getCurrentSelection(self):
        if self['menu_list'].getCurrent() is None:
            return None, None, None

        serien_name = self['menu_list'].getCurrent()[0][0]
        serien_fsid = self['menu_list'].getCurrent()[0][10]
        serien_wlid = self.database.getMarkerWLID(serien_fsid)
        return serien_name, serien_wlid, serien_fsid

    def serieInfo(self):
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        if serien_name and serien_wlid:
            from .SerienRecorderSeriesInfoScreen import serienRecShowInfo
            self.session.open(serienRecShowInfo, serien_name, serien_wlid,
                              serien_fsid)

    def wunschliste(self):
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        if serien_wlid:
            super(self.__class__, self).wunschliste(serien_wlid)

    def setupClose(self, result):
        super(self.__class__, self).setupClose(result)
        if result[1]:
            self.readTimer()

    def viewChange(self):
        if config.plugins.serienRec.recordListView.value == 1:
            config.plugins.serienRec.recordListView.value = 0
            self['text_green'].setText("Neueste zuerst")
        else:
            config.plugins.serienRec.recordListView.value = 1
            self['text_green'].setText("Älteste zuerst")
        config.plugins.serienRec.recordListView.save()
        configfile.save()
        self.readTimer()

    def readTimer(self, showTitle=True):
        current_time = int(time.time())
        self['title'].setText("Lade Timer-Liste...")

        def loadTimer():
            print("[SerienRecorder] loadAllTimer")
            database = SRDatabase(getDataBaseFilePath())
            return database.getAllTimer(current_time if self.filter else None)

        def onLoadTimerSuccessful(timers):
            completedTimer = 0
            timerList = []
            self['title'].instance.setForegroundColor(parseColor("foreground"))

            for timer in timers:
                (row_id, serie, staffel, episode, title, start_time, stbRef,
                 webChannel, eit, activeTimer, serien_fsid) = timer
                if int(start_time) < int(current_time):
                    completedTimer += 1
                    timerList.append(
                        (serie, staffel, episode, title, start_time, stbRef,
                         webChannel, True, 0, bool(activeTimer), serien_fsid))
                else:
                    timerList.append(
                        (serie, staffel, episode, title,
                         start_time, stbRef, webChannel, False, eit,
                         bool(activeTimer), serien_fsid))

            if showTitle:
                if self.filter:
                    self['title'].setText("Timer-Liste: %s ausstehende Timer" %
                                          len(timerList))
                else:
                    self['title'].setText(
                        "Timer-Liste: %s abgeschlossene und %s ausstehende Timer"
                        % (completedTimer, len(timerList) - completedTimer))

            if config.plugins.serienRec.recordListView.value == 0:
                timerList.sort(key=lambda t: t[4])
            elif config.plugins.serienRec.recordListView.value == 1:
                timerList.sort(key=lambda t: t[4])
                timerList.reverse()

            self.chooseMenuList.setList(list(map(self.buildList, timerList)))
            if len(timerList) == 0:
                if showTitle:
                    self['title'].setText("Timer-Liste: 0 ausstehende Timer")

            self.getCover()

        import twisted.python.runtime
        if twisted.python.runtime.platform.supportsThreads():
            from twisted.internet.threads import deferToThread
            deferToThread(loadTimer).addCallback(onLoadTimerSuccessful)
        else:
            timers = loadTimer()
            onLoadTimerSuccessful(timers)

    def buildList(self, entry):
        (serie, staffel, episode, title, start_time, stbRef, webChannel,
         completed, eit, activeTimer, serien_fsid) = entry
        xtime = ''
        if start_time > 0:
            xtime = time.strftime(
                self.WochenTag[time.localtime(int(start_time)).tm_wday] +
                ", %d.%m.%Y - %H:%M", time.localtime(int(start_time)))

        if start_time == 0 or title == 'dump':
            title = '(Manuell hinzugefügt !!)'
        xtitle = "S%sE%s - %s" % (str(staffel).zfill(2), str(episode).zfill(2),
                                  title)

        imageNone = "%s/images/black.png" % os.path.dirname(__file__)

        imageTimer = imageNone

        channelName = webChannel
        if stbRef:
            channelName = STBHelpers.getChannelByRef(self.channelList, stbRef)

        if activeTimer:
            SerieColor = None
        else:
            SerieColor = parseColor("red").argb()

        foregroundColor = parseColor("foreground").argb()

        picon = loadPNG(imageNone)

        if not completed:
            imageTimer = "%s/images/timer.png" % os.path.dirname(__file__)

            if stbRef and config.plugins.serienRec.showPicons.value != "0":
                # Get picon by reference or by name
                piconPath = self.piconLoader.getPicon(stbRef)
                if piconPath:
                    self.picloader = PicLoader(80 * skinFactor,
                                               40 * skinFactor)
                    picon = self.picloader.load(piconPath)
                    self.picloader.destroy()

        return [
            entry,
            (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 5,
             80 * skinFactor, 40 * skinFactor, picon),
            (eListboxPythonMultiContent.TYPE_TEXT, 100 * skinFactor, 3,
             250 * skinFactor, 26 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, channelName, SerieColor,
             SerieColor),
            (eListboxPythonMultiContent.TYPE_TEXT, 100 * skinFactor,
             27 * skinFactor, 220 * skinFactor, 18 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, xtime, foregroundColor,
             foregroundColor),
            (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST,
             315 * skinFactor, 30 * skinFactor, 30 * skinFactor,
             22 * skinFactor, loadPNG(imageTimer)),
            (eListboxPythonMultiContent.TYPE_TEXT, 350 * skinFactor, 3,
             500 * skinFactor, 26 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, serie, SerieColor, SerieColor),
            (eListboxPythonMultiContent.TYPE_TEXT, 350 * skinFactor,
             29 * skinFactor, 500 * skinFactor, 18 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, xtitle, foregroundColor,
             foregroundColor)
        ]

    def keyOK(self):
        self.session.open(serienRecModifyAdded, False)

    def callDeleteSelectedTimer(self, answer):
        if answer:
            serien_name = self['menu_list'].getCurrent()[0][0]
            staffel = self['menu_list'].getCurrent()[0][1]
            episode = self['menu_list'].getCurrent()[0][2]
            serien_title = self['menu_list'].getCurrent()[0][3]
            serien_time = self['menu_list'].getCurrent()[0][4]
            serien_channel = self['menu_list'].getCurrent()[0][6]
            serien_eit = self['menu_list'].getCurrent()[0][8]
            serien_fsid = self['menu_list'].getCurrent()[0][10]
            self.removeTimer(self.database, serien_name, serien_fsid, staffel,
                             episode, serien_title, serien_time,
                             serien_channel, serien_eit)
            self.changesMade = True
            self.readTimer(False)
            self['title'].instance.setForegroundColor(parseColor("red"))
            self['title'].setText("Timer '- %s -' gelöscht." % serien_name)
        else:
            return

    @staticmethod
    def removeTimer(database,
                    serien_name,
                    serien_fsid,
                    staffel,
                    episode,
                    serien_title,
                    serien_time,
                    serien_channel,
                    serien_eit=0):

        markerType = database.getMarkerType(serien_fsid)
        if markerType is None:
            markerType = 1
        else:
            markerType = int(markerType)

        from .SerienRecorderTimer import serienRecTimer
        title = serienRecTimer.getTimerName(serien_name, staffel, episode,
                                            serien_title, markerType)

        from .SerienRecorderTimer import serienRecBoxTimer
        removed = serienRecBoxTimer.removeTimerEntry(title, serien_time,
                                                     serien_eit)
        if not removed:
            print("[SerienRecorder] enigma2 NOOOTTT removed")
        else:
            print("[SerienRecorder] enigma2 Timer removed.")

        database.removeTimer(serien_fsid, staffel, episode, None, serien_time,
                             serien_channel)
        seasonEpisodeString = "S%sE%s" % (str(staffel).zfill(2),
                                          str(episode).zfill(2))
        SRLogger.writeLogFilter(
            "timerDebug", "Timer gelöscht: ' %s - %s - %s '" %
            (serien_name, seasonEpisodeString, serien_title))

    def keyRed(self):
        if self['menu_list'].getCurrent() is None:
            print("[SerienRecorder] Angelegte Timer Tabelle leer.")
            return

        serien_name = self['menu_list'].getCurrent()[0][0]
        staffel = self['menu_list'].getCurrent()[0][1]
        episode = self['menu_list'].getCurrent()[0][2]
        serien_title = self['menu_list'].getCurrent()[0][3]
        serien_time = self['menu_list'].getCurrent()[0][4]
        serien_channel = self['menu_list'].getCurrent()[0][6]
        serien_eit = self['menu_list'].getCurrent()[0][8]
        serien_fsid = self['menu_list'].getCurrent()[0][10]

        #print(self['menu_list'].getCurrent()[0])

        if config.plugins.serienRec.confirmOnDelete.value:
            self.session.openWithCallback(
                self.callDeleteSelectedTimer,
                MessageBox,
                "Soll der Timer für '%s - S%sE%s - %s' wirklich gelöscht werden?"
                %
                (serien_name, str(staffel).zfill(2), str(episode).zfill(2),
                 re.sub("\Adump\Z", "(Manuell hinzugefügt !!)", serien_title)),
                MessageBox.TYPE_YESNO,
                default=False)
        else:
            self.removeTimer(self.database, serien_name, serien_fsid, staffel,
                             episode, serien_title, serien_time,
                             serien_channel, serien_eit)
            self.changesMade = True
            self.readTimer(False)
            self['title'].instance.setForegroundColor(parseColor("red"))
            self['title'].setText("Timer '- %s -' gelöscht." % serien_name)

    def keyYellow(self):
        if self.filter:
            self['text_yellow'].setText("Zeige nur neue Timer")
            self.filter = False
        else:
            self['text_yellow'].setText("Zeige auch alte Timer")
            self.filter = True
        self.readTimer()

    def keyBlue(self):
        if config.plugins.serienRec.confirmOnDelete.value:
            self.session.openWithCallback(
                self.removeRemainingTimerFromDB,
                MessageBox,
                "Sollen wirklich alle noch ausstehenden Timer von der Box und aus der Datenbank gelöscht werden?",
                MessageBox.TYPE_YESNO,
                default=False)
        else:
            self.removeRemainingTimerFromDB(True)

    def removeRemainingTimerFromDB(self, answer):
        if answer:
            current_time = int(time.time())
            timers = self.database.getAllTimer(current_time)
            for timer in timers:
                (row_id, serie, staffel, episode, title, start_time, stbRef,
                 webChannel, eit, activeTimer, serien_fsid) = timer
                self.removeTimer(self.database, serie, serien_fsid, staffel,
                                 episode, title, start_time, webChannel, eit)

            self.changesMade = True
            self.readTimer(False)
            self['title'].instance.setForegroundColor(parseColor("red"))
            self['title'].setText(
                "Alle noch ausstehenden Timer wurden gelöscht.")
        else:
            return

    def removeOldTimerFromDB(self, answer):
        if answer:
            self.database.removeAllOldTimer()
            self.database.rebuild()

            self.readTimer(False)
            self['title'].instance.setForegroundColor(parseColor("red"))
            self['title'].setText("Alle alten Timer wurden gelöscht.")
        else:
            return

    def dropAllTimer(self):
        if config.plugins.serienRec.confirmOnDelete.value:
            self.session.openWithCallback(
                self.removeOldTimerFromDB,
                MessageBox,
                "Sollen wirklich alle alten Timer aus der Datenbank gelöscht werden?",
                MessageBox.TYPE_YESNO,
                default=False)
        else:
            self.removeOldTimerFromDB(True)

    def cleanUp(self):
        numberOfOrphanTimers = self.database.countOrphanTimers()
        self.session.openWithCallback(
            self.removeOrphanTimerFromDB,
            MessageBox,
            "Es wurden %d Einträge in der Timer-Liste gefunden, für die kein Serien-Marker vorhanden ist, sollen diese Einträge gelöscht werden?"
            % numberOfOrphanTimers,
            MessageBox.TYPE_YESNO,
            default=False)

    def removeOrphanTimerFromDB(self, answer):
        if answer:
            self.database.removeOrphanTimers()
            self.database.rebuild()
        else:
            return

    def getCover(self):
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        if serien_name and serien_wlid and serien_fsid and self.lastSelectedWLID != serien_wlid:
            getCover(self, serien_name, serien_wlid, serien_fsid)
            # Avoid flickering while scrolling through timers of same series
            self.lastSelectedWLID = serien_wlid

    def keyLeft(self):
        self['menu_list'].pageUp()
        self.getCover()

    def keyRight(self):
        self['menu_list'].pageDown()
        self.getCover()

    def keyDown(self):
        self['menu_list'].down()
        self.getCover()

    def keyUp(self):
        self['menu_list'].up()
        self.getCover()

    def __onClose(self):
        self.stopDisplayTimer()

    def keyCancel(self):
        self.close(self.changesMade)
Ejemplo n.º 6
0
class StreamTVList(Screen):
	skin = 	"""
		<screen name="StreamTVList" position="center,120" size="600,380" title="StreamTV List">
			<widget name="streamlist" position="0,0" size="600,350" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
			<widget name="infolabel" position="0,360" size="50,20" font="Regular;18" halign="left" />
			<widget name="infomation" position="50,360" size="550,20" font="Regular;18" halign="left" />
	        </screen>
		"""
	def __init__(self, session):
		self.session = session
		Screen.__init__(self, session)
		self["actions"]  = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", "SetupActions", "NumberActions", "MenuActions"], {
			"ok"    : self.keyOK,
			"cancel": self.keyCancel,
			"up"    : self.keyUp,
			"down"  : self.keyDown,
			"left"  : self.keyLeft,
			"right" : self.keyRight,
		}, -1)

		self.streamFile = resolveFilename(SCOPE_PLUGINS, "Extensions/StreamTV/stream.xml")

		self.streamList = []
		self.makeStreamList()

		self.streamMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.streamMenuList.l.setFont(0, gFont('Regular', 22))
		self.streamMenuList.l.setFont(1, gFont('Regular', 18))
		self.streamMenuList.l.setItemHeight(37) 
		self['streamlist'] = self.streamMenuList
		self.streamMenuList.setList(map(streamListEntry, self.streamList))

		self["infolabel"] = Label("URL :")
		self["infomation"] = Label(" ")
		self.updateInfomation()

		self.onLayoutFinish.append(self.layoutFinished)

		self.beforeService  = None
		self.currentService = None
		self.playerStoped   = False
		self.serviceDoCommand = None

		self.keyLocked = False

	def layoutFinished(self):
		rc = os.popen('ps -ef | grep rtmpdump | grep -v grep').read()
		print "a process already running :", rc
		if rc is not None:
			if rc.strip() != '':
				os.system('killall -INT rtmpdump')

	def updateInfomation(self):
		infomation = ''
		try:
			streamInfo = self["streamlist"].getCurrent()[0][1]
			infomation = streamInfo.get('uri').split()[0]
		except:	infomation = ' '
		self["infomation"].setText(infomation)

	def keyLeft(self):
		if self.keyLocked:
			return
		self['streamlist'].pageUp()
		self.updateInfomation()

	def keyRight(self):
		if self.keyLocked:
			return
		self['streamlist'].pageDown()
		self.updateInfomation()

	def keyUp(self):
		if self.keyLocked:
			return
		self['streamlist'].up()
		self.updateInfomation()

	def keyDown(self):
		if self.keyLocked:
			return
		self['streamlist'].down()
		self.updateInfomation()

	def keyCancel(self):
		self.close()

	def keyOK(self):
		if self.keyLocked:
			return
		self.keyLocked = True
		self.beforeService  = None
		self.currentService = None
		self.playerStoped   = False
		self.serviceDoCommand = None

		streamInfo = self["streamlist"].getCurrent()[0][1]
		uri = streamInfo.get('uri')
		typeInfo = streamInfo.get('type').split(':')

		serviceType = typeInfo[1]
		bufferSize  = typeInfo[2]
		self.doStreamAction(uri, serviceType, bufferSize)

	def doStreamAction(self, uri=None, serviceType='4097', bufferSize=None):
		try:
			serviceType = int(serviceType)
		except:	serviceType = 4097
		try:
			bufferSize = int(bufferSize)
		except:	bufferSize = None

		streamInfo = self["streamlist"].getCurrent()[0][1]
		serviceRef = "%(TYPE)d:0:1:0:0:0:0:0:0:0:%(URI)s:%(NAME)s" % {
			'TYPE' :serviceType,
			'URI'  :uri.replace(':','%3a'),
			'NAME' :streamInfo.get('name')
		}
		service = eServiceReference(serviceRef)
		#if bufferSize is not None:
		#	service.setData(2, bufferSize*1024)

		self.beforeService  = self.session.nav.getCurrentlyPlayingServiceReference()
		self.currentService = self.session.openWithCallback(self.cbFinishedStream, 
								    StreamTVPlayer, 
								    service, 
								    cbServiceCommand=self.cbServiceCommand,
								    chName=str(streamInfo.get('name')),
								    chURL =str(streamInfo.get('uri')),
								    chIcon=str(streamInfo.get('icon'))
		)

	def cbServiceCommand(self, params=None):
		if params is None:
			self.playerStoped = True
			return
		if params[0] == 'docommand':
			self.serviceDoCommand = params[1]

	def cbFinishedStream(self):
		self.keyLocked = False
		self.session.nav.playService(self.beforeService)
		print 'player done!!'

	def makeStreamList(self):
		streamDB = parseStreamDB(self.streamFile)
		self.streamList = []
		for x in streamDB:
			self.streamList.append((x.get('name'), x))
Ejemplo n.º 7
0
class PiconManagerScreen(Screen, HelpableScreen):
	skin = 	"""
	<screen name="PiconManager" title="PiconManager" position="center,center" size="1160,650">
		<widget name="piconpath" position="20,10" size="690,60" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="piconpath2" position="200,10" size="500,60" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="piconspace" position="20,40" size="690,60" font="Regular;20" foregroundColor="#00fff000" transparent="1" zPosition="1" halign="left" />
		<widget name="piconcount" position="20,70" size="690,60" font="Regular;20" foregroundColor="#00fff000" transparent="1" zPosition="1" halign="left" />
		<widget name="picondownload" position="20,100" size="690,60" font="Regular;20" foregroundColor="#00fff000" transparent="1" zPosition="1" halign="left" />
		<widget name="piconerror" position="20,130" size="690,60" font="Regular;20" foregroundColor="#00fff000" transparent="1" zPosition="1" halign="left" />
		<widget name="piconslidername" position="20,160" size="690,60" font="Regular;20" foregroundColor="#00fff000" transparent="1" zPosition="1" halign="left" />
		<widget name="selectedname" position="20,190" size="160,40" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="selected" position="180,190" size="200,40" noWrap="1" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="creatorname" position="20,220" size="160,40" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="creator" position="180,220" size="200,40" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="sizename" position="390,190" size="160,40" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="size" position="520,190" size="160,40" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="bitname" position="390,220" size="160,40" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="bit" position="520,220" size="160,40" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="spiconname" position="20,250" size="690,40" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="spicon" position="180,250" size="690,40" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="piconslider" position="280,164" size="180,20" zPosition="2" transparent="0" />
		<widget name="picon" position="738,10" size="400,240" zPosition="4" transparent="1" borderWidth="0" borderColor="#0000000" alphatest="blend" />
		<widget name="list" position="10,300" size="1130,295" zPosition="1" foregroundColor="#00ffffff" foregroundColorSelected="#00fff000" scrollbarMode="showOnDemand" transparent="1" />
		<widget name="key_red" position="42,615" size="300,25" transparent="1" font="Regular;20"/>
		<widget name="key_green" position="285,615" size="300,25" transparent="1" font="Regular;20"/>
		<widget name="key_yellow" position="451,615" size="300,25" transparent="1" font="Regular;20"/>
		<widget name="key_blue" position="734,615" size="300,25" transparent="1" font="Regular;20"/>
		<ePixmap position="10,615" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_red.png" transparent="1" alphatest="on"/>
		<ePixmap position="257,615" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_green.png" transparent="1" alphatest="on"/>
		<ePixmap position="421,615" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_yellow.png" transparent="1" alphatest="on"/>
		<ePixmap position="701,615" size="263,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_blue.png" transparent="1" alphatest="on"/>
		<ePixmap position="916,610" size="260,35" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_info.png" transparent="1" alphatest="on"/>
		<ePixmap position="977,610" size="260,35" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_menu.png" transparent="1" alphatest="on"/>
		<ePixmap position="1038,610" size="260,35" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_channel.png" transparent="1" alphatest="on"/>
		<ePixmap position="1095,610" size="260,35" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_help.png" transparent="1" alphatest="on"/>
	</screen>"""

	def __init__(self, session):
		self.session = session
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.server_url = config.plugins.piconmanager.server.value
		self.piconname = config.plugins.piconmanager.piconname.value
		self.picondir = config.plugins.piconmanager.savetopath.value
		self.piconfolder = "%s%s/" % (self.picondir, self.piconname)
		self.picon_name = ""
		self.piconlist = []
		self.tried_mirrors = []
		self.art_list = []
		self.prev_sel = None
		self.spicon_name = ""
		self['piconpath'] = Label(_("Picon folder: "))
		self['piconpath2'] = Label(self.piconfolder)	
		self['piconspace'] = Label(_(" "))
		self['piconcount'] = Label(_("Reading Channels..."))
		self['picondownload'] = Label(_("Loaded Picons: "))
		self['piconerror'] = Label(_("Not found Picons: "))
		self['piconslidername'] = Label(_("Download progress: "))
		self['selectedname'] = Label(_("Show group: "))
		self['selected'] = Label()
		self['creatorname'] = Label(_("Creator: "))
		self['creator'] = Label()
		self['sizename'] = Label(_("Size: "))
		self['size'] = Label()
		self['bitname'] = Label(_("Color depth: "))
		self['bit'] = Label()
		self['spiconname'] = Label(_("Standard picon: "))
		self['spicon'] = Label()
		self.chlist = buildChannellist()
		self.getFreeSpace()
		self.countchlist = len(self.chlist)
		self.activityslider = Slider(0, self.countchlist)
		self["piconslider"] = self.activityslider
		self['key_red'] = Label(_("Select drive"))
		self['key_green'] = Label(_("Download picons"))
		self['key_yellow'] = Label(_("Select path"))
		self['key_blue'] = Label(_("Create folder"))
		self['picon'] = Pixmap()
		self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
		{
			"ok": (self.keyOK, _("Show random Picon")),
			"cancel": (self.keyCancel, _("Exit")),
			}, -2)

		self["SetupActions"] = HelpableActionMap(self, "SetupActions",
			{
				"1": (self.sel_creator_back, _("Previous picon creator")),
				"3": (self.sel_creator_next, _("Next picon creator")),
				"4": (self.sel_size_back, _("Previous picon size")),
				"6": (self.sel_size_next, _("Next picon size")),
				"7": (self.sel_bit_back, _("Previous color depth")),
				"9": (self.sel_bit_next, _("Next color depth")),
			}
		)
		self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions",
		{
			"input_date_time": (self.settings, _("More selections")),
			"nextBouquet": (self.sel_satpos_next, _("Next Group")),
			"prevBouquet": (self.sel_satpos_back, _("Previous Group")),
			"info": (self.set_picon, _("Set / clear standard Picon")),
			"red": (self.changeDrive, _("Select drive")),
			"timerAdd": (self.downloadPicons, _("Download picons")),
			"yellow": (self.keyYellow, _("Select path")),
			"blue": (self.changePiconName, _("Create folder")),
			}, -2)
		self.channelMenuList = MenuList([], enableWrapAround = True, content = eListboxPythonMultiContent)
		font, size = skin.parameters.get("PiconManagerListFont", ('Regular',22))
		self.channelMenuList.l.setFont(0, gFont(font, size))
		self.channelMenuList.l.setItemHeight(25)
		self.setTitle(pname + " " * 3 + _("V") + " %s" % pversion)
		self['list'] = self.channelMenuList
		self['list'].onSelectionChanged.append(self.showPic)
		self.keyLocked = True
		self.piconTempDir = picon_tmp_dir
		if not os.path.exists(self.piconTempDir):
			os.mkdir(self.piconTempDir)
		self.onLayoutFinish.append(self.getPiconList)

	def settings(self):
		if self.piconlist and self.art_list:
			self.session.openWithCallback(self.makeList, pm_conf)

	def set_picon(self):
		if config.plugins.piconmanager.spicon.value == "":
			self.session.openWithCallback(self.got_picon, SimpleChannelSelection, _("Select service for preferred picon"))
		else:
			self.got_picon()

	def got_picon(self, service = ""):
		service_name = ""
		if isinstance(service, eServiceReference):
			service_name = ServiceReference(service).getServiceName()
			service = service.toString().replace(':','_').rstrip('_') + ".png"
		if service == "":
			config.plugins.piconmanager.spicon.value = service
		else:
			config.plugins.piconmanager.spicon.value = service + "|" + service_name
		config.plugins.piconmanager.spicon.save()
		self['spicon'].setText(service_name)
		try:
			shutil.rmtree(self.piconTempDir)
			os.mkdir(self.piconTempDir)
		except OSError:
			pass
		self.getPiconList()

	def sel_creator_next(self):
		self.change_filter_mode(+1, 0)

	def sel_creator_back(self):
		self.change_filter_mode(-1, 0)

	def sel_bit_next(self):
		self.change_filter_mode(+1, 1)

	def sel_bit_back(self):
		self.change_filter_mode(-1, 1)

	def sel_size_next(self):
		self.change_filter_mode(+1, 2)

	def sel_size_back(self):
		self.change_filter_mode(-1, 2)

	def sel_satpos_next(self):
		self.change_filter_mode(+1, 3)

	def sel_satpos_back(self):
		self.change_filter_mode(-1, 3)

	def change_filter_mode(self, direction, filter_type):
		if filter_type == 0:
			if config.plugins.piconmanager.creator.value in self.creator_list:
				idx = self.creator_list.index(config.plugins.piconmanager.creator.value) + direction
			else:
				idx = 0
			if idx < 0:
				idx = len(self.creator_list) - 1
			elif idx > len(self.creator_list) - 1:
				idx = 0
			if len(self.creator_list):
				config.plugins.piconmanager.creator.value = self.creator_list[idx]
				self['creator'].setText(_(str(config.plugins.piconmanager.creator.value)))
				config.plugins.piconmanager.creator.save()
		elif filter_type == 1:
			if config.plugins.piconmanager.bit.value in self.bit_list:
				idx = self.bit_list.index(config.plugins.piconmanager.bit.value) + direction
			else:
				idx = 0
			if idx < 0:
				idx = len(self.bit_list) - 1
			elif idx > len(self.bit_list) - 1:
				idx = 0
			if len(self.bit_list):
				config.plugins.piconmanager.bit.value = self.bit_list[idx]
				self['bit'].setText(_(str(config.plugins.piconmanager.bit.value)))
				config.plugins.piconmanager.bit.save()
		elif filter_type == 2:
			if config.plugins.piconmanager.size.value in self.size_list:
				idx = self.size_list.index(config.plugins.piconmanager.size.value) + direction
			else:
				idx = 0
			if idx < 0:
				idx = len(self.size_list) - 1
			elif idx > len(self.size_list) - 1:
				idx = 0
			if len(self.size_list):
				config.plugins.piconmanager.size.value = self.size_list[idx]
				self['size'].setText(_(str(config.plugins.piconmanager.size.value)))
				config.plugins.piconmanager.size.save()
		elif filter_type == 3:
			if config.plugins.piconmanager.selected.value in self.art_list:
				idx = self.art_list.index(config.plugins.piconmanager.selected.value) + direction
			else:
				idx = 0
			if idx < 0:
				idx = len(self.art_list) - 1
			elif idx > len(self.art_list) - 1:
				idx = 0
			if len(self.art_list):
				config.plugins.piconmanager.selected.value = self.art_list[idx]
				self['selected'].setText(str(config.plugins.piconmanager.selected.value).replace("+", " ").replace("-", " "))
				config.plugins.piconmanager.selected.save()
		self.makeList(config.plugins.piconmanager.creator.value, config.plugins.piconmanager.size.value, config.plugins.piconmanager.bit.value, config.plugins.piconmanager.server.value, True, False)

	def getFreeSpace(self):
		if os.path.isdir(self.picondir):
			which = "MB"
			free = 0
			statvfs = os.statvfs(self.picondir)
			free = (statvfs.f_frsize * statvfs.f_bfree) / 1024 / 1024
			if free > 1024:
				free = free / 1024
				which = "GB"
			self['piconspace'].setText(_("FreeSpace:")+" %s %s" % (str(free), which))
		else:
			self['piconspace'].setText(_("FreeSpace: Drive Not Found !"))

	def showPic(self):
		self["picon"].hide()
		if len(self.piconlist) and self['list'].getCurrent() and len(self['list'].getCurrent()[0]) >= 3:
			self.auswahl = self['list'].getCurrent()[0][2]
			picon_name = os.path.basename(self.auswahl)
			if config.plugins.piconmanager.spicon.value != "":
				picon_sname = txt = config.plugins.piconmanager.spicon.value.split('|')[0]
				self.auswahl = self.auswahl.replace(picon_name, picon_sname)
			self.downloadPiconPath = os.path.join(self.piconTempDir, self['list'].getCurrent()[0][4] + ".png")
			if not os.path.exists(self.downloadPiconPath):
				downloadPage(self.auswahl, self.downloadPiconPath).addCallback(self.showPiconFile, self.downloadPiconPath).addErrback(self.dataError)
			else: 
				self.showPiconFile(None,self.downloadPiconPath)

	def getPiconList(self):
		print "[PiconManager] started ..."
		self['piconcount'].setText(_("Channels:")+" %s" % str(self.countchlist))
		self['selected'].setText(_(str(config.plugins.piconmanager.selected.value ).replace("_",", ").replace("+"," ").replace("-"," ")))
		if config.plugins.piconmanager.spicon.value != "":
			txt = config.plugins.piconmanager.spicon.value.split('|')
			if len(txt) == 2:
				txt = txt[1]
			else:
				txt = txt[0]
		else:
			txt = ""
		self['spicon'].setText(txt)
		url = self.server_url + picon_info_file
		print "[PiconManager] Server: %s" % self.server_url
		if config.plugins.piconmanager.selected.value == _("All"):
			config.plugins.piconmanager.selected.setValue("All")
			config.plugins.piconmanager.selected.save()
		self.channelMenuList.setList(map(ListEntry, [(_("Loading, please wait..."),)]))
		getPage(url,method = 'GET').addCallback(self.parsePiconList).addErrback(self.dataError2)

	def parsePiconList(self, data):
		print "[PiconManager] parsing ..."
		self.size_list = ["All"]
		self.bit_list = ["All"]
		self.creator_list = ["All"]
		self.piconlist = []
		self.art_list = ["All"]
		picon_data = data.split("\n")
		if picon_data:
			for picon_info in picon_data:
				if len(picon_info) and not picon_info.startswith('<meta'):
					info_list = picon_info.split(';')
					if len(info_list) >= 9:
						dirUrl = os.path.join(self.server_url, info_list[0]).replace(" ", "%20")
						picUrl = os.path.join(self.server_url, info_list[0], info_list[1]).replace(" ", "%20")
						cur_dir = info_list[0]
						p_date = info_list[2]
						p_name = info_list[3]
						p_pos = info_list[4]
						p_creator = info_list[5]
						p_bit = (info_list[6].replace(' ', '').lower()).replace('bit', ' bit')
						p_size = info_list[7].replace(' ', '').lower()
						p_uploader = info_list[8]
						if p_size not in self.size_list:
							self.size_list.append(p_size)
						if p_bit not in self.bit_list:
							self.bit_list.append(p_bit)
						if p_creator not in self.creator_list:
							self.creator_list.append(p_creator)
						if p_pos not in self.art_list:
							self.art_list.append(p_pos)
						p_identifier = str(uuid.uuid4())
						p_name = "%s | %s - %s | %s | %s | %s | %s" % (p_pos, p_creator, p_name, p_size, p_bit, p_date, p_uploader)
						self.piconlist.append((p_name, dirUrl, picUrl, (p_creator, p_size, p_bit, p_pos), p_identifier, cur_dir))
			if config.plugins.piconmanager.selected.value not in self.art_list:
				config.plugins.piconmanager.selected.setValue("All")
				self['selected'].setText(_("All"))
			if not len(self.piconlist):
				self.dataError2(None)
			else:
				self.size_list.sort()
				self.bit_list.sort()
				self.creator_list.sort()
				self.art_list.sort()
				self.piconlist.sort(key=lambda x: x[0].lower())
				self.keyLocked = False
				prev_value = None
				if hasattr(config.plugins.piconmanager, "bit"):
					prev_value = config.plugins.piconmanager.bit.value
				config.plugins.piconmanager.bit = ConfigSelection(default = "All", choices = self.createChoiceList(self.bit_list, [("All", _("All"))]))
				if prev_value:
					config.plugins.piconmanager.bit.value = prev_value
				prev_value = None
				if hasattr(config.plugins.piconmanager, "size"):
					prev_value = config.plugins.piconmanager.size.value
				config.plugins.piconmanager.size = ConfigSelection(default = "All", choices = self.createChoiceList(self.size_list, [("All", _("All"))]))
				if prev_value:
					config.plugins.piconmanager.size.value = prev_value
				prev_value = None
				if hasattr(config.plugins.piconmanager, "creator"):
					prev_value = config.plugins.piconmanager.creator.value
				config.plugins.piconmanager.creator = ConfigSelection(default = "All", choices = self.createChoiceList(self.creator_list, [("All", _("All"))]))
				if prev_value:
					config.plugins.piconmanager.creator.value = prev_value
				self['creator'].setText(_(str(config.plugins.piconmanager.creator.value )))
				self['size'].setText(_(str(config.plugins.piconmanager.size.value )))
				self['bit'].setText(_(str(config.plugins.piconmanager.bit.value )))
				self.makeList(config.plugins.piconmanager.creator.value, config.plugins.piconmanager.size.value, config.plugins.piconmanager.bit.value, self.server_url, True, False)

	def createChoiceList(self, choicelist, default_choice):
		ret = default_choice
		if len(choicelist):
			for x in choicelist:
				ret.append((x, _("%s") % x))
		return ret

	def makeList(self, creator = "All", size = "All", bit = "All", server = config.plugins.piconmanager.server.value, update = True, reload_picons = False):
		if reload_picons:
			self.server_url = server
			self.channelMenuList.setList([])
			self.getPiconList()
		else:
			if update:
				new_list = []
				art = config.plugins.piconmanager.selected.value
				for x in self.piconlist:
					if (art != "All" and x[3][3] != art) or (creator != "All" and x[3][0] != creator) or (size != "All" and x[3][1] != size) or (bit != "All" and x[3][2] != bit):
						continue
					else:
						new_list.append((x[0], x[1], x[2], x[3], x[4], x[5]))
				if len(new_list):
					self.channelMenuList.setList(map(ListEntry, new_list))
				else:
					self.channelMenuList.setList(map(ListEntry, [(_("No search results, please change filter options ..."),)]))

	def keyOK(self):
		if len(self.piconlist) > 0 and not self.keyLocked:
			if self['list'].getCurrent() is not None:
				if len(self['list'].getCurrent()[0]) >= 6:
					self.auswahl = self['list'].getCurrent()[0][4]
					self.cur_selected_dir = self['list'].getCurrent()[0][5]
					self.picon_list_file = self.piconTempDir + self.auswahl + "_list"
					if os.path.exists(self.picon_list_file):
						self.getPiconFiles()
					else:
						url = self.server_url + self.cur_selected_dir + "/" + picon_list_file
						downloadPage(url, self.picon_list_file).addCallback(self.getPiconFiles).addErrback(self.dataError)

	def getPiconFiles(self, data = None):
		if os.path.exists(self.picon_list_file):
			if self.prev_sel != self.picon_list_file:
				self.prev_sel = self.picon_list_file
				with open(self.picon_list_file) as f:
					self.picon_files = f.readlines()
			self.picon_name = random.choice(self.picon_files)
			downloadPiconUrl = self.server_url + self.cur_selected_dir + "/" + self.picon_name
			downloadPiconUrl = downloadPiconUrl.replace(" ", "%20")
			self.downloadPiconPath = self.piconTempDir + self.auswahl
			self.keyLocked = False
			downloadPage(downloadPiconUrl, self.downloadPiconPath).addCallback(self.showPiconFile, self.downloadPiconPath).addErrback(self.dataError)

	def keyCancel(self):
		config.plugins.piconmanager.savetopath.value = self.picondir
		config.plugins.piconmanager.savetopath.save()
		config.plugins.piconmanager.piconname.value = self.piconname
		config.plugins.piconmanager.piconname.save()
		self.channelMenuList.setList([])
		try:
			shutil.rmtree(self.piconTempDir)
		except OSError:
			pass
		self.close()

	def keyYellow(self):
		self.session.openWithCallback(self.selectedMediaFile, PiconManagerFolderScreen, self.picondir)
		
	def selectedMediaFile(self, res):
		if res is not None:
			self.piconfolder = res
			self.piconname=res.split("/")[-2]
			self['piconpath2'].setText(self.piconfolder)

	def changeDrive(self):
		if re.search("/usr/share/enigma2/", self.piconfolder, re.S|re.I):
			self.picondir = "/media/usb/"
		elif re.search("/media/usb/", self.piconfolder, re.S|re.I):
			self.picondir = "/media/hdd/"
		elif re.search("/media/hdd/", self.piconfolder, re.S|re.I):
			self.picondir = "/usr/share/enigma2/"
		self.piconfolder = "%s%s/" % (self.picondir, self.piconname)
		self['piconpath2'].setText(self.piconfolder)
		print "[PiconManager] set picon path to: %s" % self.piconfolder
		self.getFreeSpace()

	def changePiconName(self):
		self.session.openWithCallback(self.gotNewPiconName, VirtualKeyBoard, title = (_("Enter Picon Dir:")), text = self.piconname)

	def gotNewPiconName(self, name):
		if name is not None:
			self.piconname = name
			self.piconfolder = "%s%s/" % (self.picondir, self.piconname)
			self['piconpath2'].setText(self.piconfolder)
			print "[PiconManager] set picon path to: %s" % self.piconfolder

	def downloadPicons(self):
		no_drive = False
		if self['list'].getCurrent():
			if not os.path.isdir(self.picondir):
				txt = "%s\n" % self.picondir + _("is not installed.")
				self.session.open(MessageBox, txt, MessageBox.TYPE_INFO, timeout = 3)
				no_drive = True

		if not no_drive:
			if not os.path.isdir(self.piconfolder):
				print "[PiconManager] create folder %s" % self.piconfolder
				os.makedirs(self.piconfolder)

			urls = []
			if int(self.countchlist) > 0 and not self.keyLocked and self['list'].getCurrent():
				if len(self['list'].getCurrent()[0]) >= 2:
					self.auswahl = self['list'].getCurrent()[0][1]+"/"
					for channel in self.chlist:
						downloadPiconUrl = channel.replace(':', '_')
						downloadPiconUrl = downloadPiconUrl[:-1] + ".png"
						downloadPiconPath = self.piconfolder + downloadPiconUrl
						downloadPiconUrl = self.auswahl + downloadPiconUrl
						urls.append((downloadPiconUrl, downloadPiconPath))

			if len(urls) > 0:
				self.countload = 0
				self.counterrors = 0
				ds = defer.DeferredSemaphore(tokens = 10)
				downloads = [ds.run(self.download, downloadPiconUrl, downloadPiconPath).addCallback(self.downloadDone).addErrback(self.downloadError) for downloadPiconUrl, downloadPiconPath in urls]
				finished = defer.DeferredList(downloads).addErrback(self.dataError)

	def download(self, downloadPiconUrl, downloadPiconPath):
		return downloadPage(downloadPiconUrl, downloadPiconPath)

	def downloadError(self, error):
		self.counterrors += 1
		self['piconerror'].setText(_("Not found Picons:")+" %s" % str(self.counterrors))
		total = self.countload+self.counterrors
		self["piconslider"].setValue(total)

	def downloadDone(self, data):
		self.countload += 1
		self['picondownload'].setText(_("Loaded Picons:")+" %s" % str(self.countload))
		total = self.countload+self.counterrors
		self["piconslider"].setValue(total)
		if self.countchlist == total:
			self['piconpath2'].setText(_("Download finished !"))
			self.getFreeSpace()

	def dataError2(self, error = None):
		if hasattr(self, "server_url"):
			errorWrite(str(self.server_url)+"\n")
			self.tried_mirrors.append(self.server_url)
			all_mirrors = True
			for x in server_choices:
				if x[0] not in self.tried_mirrors:
					self.server_url = x[0]
					all_mirrors = False
					break
			if all_mirrors:
				self.channelMenuList.setList(map(ListEntry, [(_("Sorry, service is temporarily unavailable" ),)]))
			else:
				self.getPiconList()

	def dataError(self, error):
		print "[PiconManager] ERROR", error
		try:
			if "500 Internal Server Error" in error:
				self.session.open(MessageBox, _("Server temporarily unavailable" ), MessageBox.TYPE_ERROR, timeout=10)
		except TypeError:
			pass
		errorWrite(str(len(self.auswahl)) +" - "+str(self.auswahl)+"\n"+str(error)+"\n")
		self["picon"].hide()

	def showPiconFile(self, data, picPath):
		if os.path.exists(picPath):
			self["picon"].show()
			if picPath is not None:
				self["picon"].instance.setPixmapFromFile(picPath)
class serienRecShowConflicts(serienRecBaseScreen, Screen, HelpableScreen):
	def __init__(self, session):
		serienRecBaseScreen.__init__(self, session)
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.skin = None
		self.conflictsListe = []
		self.session = session
		self.database = SRDatabase(SerienRecorder.serienRecDataBaseFilePath)

		self["actions"] = HelpableActionMap(self, "SerienRecorderActions", {
			"cancel": (self.keyCancel, "zurück zur vorherigen Ansicht"),
			"left": (self.keyLeft, "zur vorherigen Seite blättern"),
			"right": (self.keyRight, "zur nächsten Seite blättern"),
			"up": (self.keyUp, "eine Zeile nach oben"),
			"down": (self.keyDown, "eine Zeile nach unten"),
			"red": (self.keyCancel, "zurück zur vorherigen Ansicht"),
			"blue": (self.keyBlue, "alle Einträge aus der Liste endgültig löschen"),
			"menu": (self.recSetup, "Menü für globale Einstellungen öffnen"),
			"0"	: (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
			"3"		: (self.showProposalDB, "Liste der Serien/Staffel-Starts anzeigen"),
			"7"		: (self.showWishlist, "Merkzettel (vorgemerkte Folgen) anzeigen"),
		}, -1)
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["SerienRecorderActions" ,], {
			"displayHelp"      : self.showHelp,
			"displayHelp_long" : self.showManual,
		}, 0)

		self.setupSkin()

		self.onLayoutFinish.append(self.readConflicts)
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.setSkinProperties)

	def callHelpAction(self, *args):
		HelpableScreen.callHelpAction(self, *args)

	def setSkinProperties(self):
		super(self.__class__, self).setSkinProperties()

		self['text_red'].setText("Abbrechen")
		self['text_blue'].setText("Liste leeren")
		self.num_bt_text[1][1] = buttonText_na
		self.num_bt_text[4][0] = buttonText_na

		super(self.__class__, self).startDisplayTimer()

	def setupSkin(self):
		InitSkin(self)

		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList.l.setItemHeight(int(25 *skinFactor))
		self['menu_list'] = self.chooseMenuList
		self['menu_list'].show()

		self['title'].setText("Timer-Konflikte")

		if not config.plugins.serienRec.showAllButtons.value:
			self['bt_red'].show()
			self['bt_blue'].show()
			self['bt_exit'].show()
			self['bt_info'].show()
			self['bt_menu'].show()

			self['text_red'].show()
			self['text_blue'].show()
			self['text_0'].show()
			self['text_1'].show()
			self['text_2'].show()
			self['text_3'].show()
			self['text_4'].show()

	def updateMenuKeys(self):
		updateMenuKeys(self)

	def setupClose(self, result):
		super(self.__class__, self).setupClose(result)
		if result[1]:
			self.readConflicts()

	def readConflicts(self):
		conflicts = self.database.getTimerConflicts()
		for conflict in conflicts:
			(zeile, start_time, webChannel) = conflict
			data = zeile.split('/')
			if data:
				self.conflictsListe.append(("%s" % data[0].strip()))
				self.conflictsListe.append(("    @ %s (%s) in Konflikt mit:" %
				(webChannel, time.strftime("%d.%m.%Y - %H:%M", time.localtime(start_time)))))
				data = data[1:]
				for row2 in data:
					self.conflictsListe.append(("            -> %s" % row2.strip()))
				self.conflictsListe.append(("-" * 100))
				self.conflictsListe.append("")
		self.chooseMenuList.setList(map(self.buildList, self.conflictsListe))

	@staticmethod
	def buildList(entry):
		(zeile) = entry
		return [entry, (eListboxPythonMultiContent.TYPE_TEXT, 00, 00, 850 * skinFactor, 20 * skinFactor, 0,
		                RT_HALIGN_LEFT | RT_VALIGN_CENTER, zeile)]

	def keyLeft(self):
		self['menu_list'].pageUp()

	def keyRight(self):
		self['menu_list'].pageDown()

	def keyDown(self):
		self['menu_list'].down()

	def keyUp(self):
		self['menu_list'].up()

	def keyBlue(self):
		check = self['menu_list'].getCurrent()
		if check is None:
			print "[SerienRecorder] Conflict-List leer."
			return
		else:
			if config.plugins.serienRec.confirmOnDelete.value:
				self.session.openWithCallback(self.callDeleteMsg, MessageBox, "Soll die Liste wirklich geleert werden?",
				                              MessageBox.TYPE_YESNO, default=False)
			else:
				self.callDeleteMsg(True)

	def callDeleteMsg(self, answer):
		if answer:
			self.database.removeAllTimerConflicts()
			self.readConflicts()
		else:
			return

	def __onClose(self):
		self.stopDisplayTimer()

	def keyCancel(self):
		self.close()
class serienRecMainChannelEdit(Screen, HelpableScreen):
	def __init__(self, session):
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.session = session
		self.serienRecChlist = []
		self.selected_sender = None
		self.skin = None
		self.displayMode = 2
		self.displayTimer = eTimer()
		self.displayTimer_conn = None
		self.chooseMenuList = None
		self.chooseMenuList_popup = None
		self.chooseMenuList_popup2 = None

		self["actions"] = HelpableActionMap(self, "SerienRecorderActions", {
			"ok"       : (self.keyOK, "Popup-Fenster zur Auswahl des STB-Channels öffnen"),
			"cancel"   : (self.keyCancel, "zurück zur Serienplaner-Ansicht"),
			"red"	   : (self.keyRed, "umschalten ausgewählter Sender für Timererstellung aktiviert/deaktiviert"),
			"red_long" : (self.keyRedLong, "ausgewählten Sender aus der Channelliste endgültig löschen"),
			"green"    : (self.keyGreen, "Sender-Zuordnung aktualisieren"),
			"menu"     : (self.channelSetup, "Menü für Sender-Einstellungen öffnen"),
			"menu_long": (self.recSetup, "Menü für globale Einstellungen öffnen"),
			"left"     : (self.keyLeft, "zur vorherigen Seite blättern"),
			"right"    : (self.keyRight, "zur nächsten Seite blättern"),
			"up"       : (self.keyUp, "eine Zeile nach oben"),
			"down"     : (self.keyDown, "eine Zeile nach unten"),
			"startTeletext"       : (self.youtubeSearch, "Trailer zum ausgewählten Sender auf YouTube suchen"),
			"startTeletext_long"  : (self.WikipediaSearch, "Informationen zum ausgewählten Sender auf Wikipedia suchen"),
			"0"		   : (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
			"3"		   : (self.showProposalDB, "Liste der Serien/Staffel-Starts anzeigen"),
			"6"		   : (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
			"7"		   : (self.showWishlist, "Merkzettel (vorgemerkte Folgen) anzeigen"),
		}, -1)
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["SerienRecorderActions",], {
			"displayHelp"      : self.showHelp,
			"displayHelp_long" : self.showManual,
		}, 0)

		self.setupSkin()

		self.modus = "list"
		self.changesMade = False

		cCursor = SerienRecorder.dbSerRec.cursor()
		cCursor.execute("SELECT * FROM Channels")
		row = cCursor.fetchone()
		if row:
			cCursor.close()
			self.onLayoutFinish.append(self.showChannels)
		else:
			cCursor.close()
			if config.plugins.serienRec.selectBouquets.value:
				self.stbChlist = STBHelpers.buildSTBChannelList(config.plugins.serienRec.MainBouquet.value)
			else:
				self.stbChlist = STBHelpers.buildSTBChannelList()
			self.onLayoutFinish.append(self.readWebChannels)

		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.setSkinProperties)

	def callHelpAction(self, *args):
		HelpableScreen.callHelpAction(self, *args)

	def setSkinProperties(self):
		setSkinProperties(self)

		self['text_green'].setText("Aktualisieren")
		self['text_ok'].setText("Sender auswählen")

		self.num_bt_text[4][0] = buttonText_na
		if longButtonText:
			self['text_red'].setText("An/Aus (lang: Löschen)")
			self.num_bt_text[4][2] = "Setup Sender (lang: global)"
		else:
			self['text_red'].setText("(De)aktivieren/Löschen")
			self.num_bt_text[4][2] = "Setup Sender/global"

		self.displayTimer = None
		if showAllButtons:
			Skin1_Settings(self)
		else:
			self.displayMode = 2
			self.updateMenuKeys()

			self.displayTimer = eTimer()
			if isDreamboxOS:
				self.displayTimer_conn = self.displayTimer.timeout.connect(self.updateMenuKeys)
			else:
				self.displayTimer.callback.append(self.updateMenuKeys)
			self.displayTimer.start(config.plugins.serienRec.DisplayRefreshRate.value * 1000)

	def setupSkin(self):
		self.skin = None
		InitSkin(self)

		# normal
		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList.l.setItemHeight(int(25*skinFactor))
		self['list'] = self.chooseMenuList
		self['list'].show()

		# popup
		self.chooseMenuList_popup = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList_popup.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList_popup.l.setItemHeight(int(25*skinFactor))
		self['popup_list'] = self.chooseMenuList_popup
		self['popup_list'].hide()

		# popup2
		self.chooseMenuList_popup2 = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList_popup2.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList_popup2.l.setItemHeight(int(25*skinFactor))
		self['popup_list2'] = self.chooseMenuList_popup2
		self['popup_list2'].hide()

		self['title'].setText("Lade Web-Channel / STB-Channels...")

		self['Web_Channel'].setText("Web-Channel")
		self['STB_Channel'].setText("STB-Channel")
		self['alt_STB_Channel'].setText("alt. STB-Channel")

		self['Web_Channel'].show()
		self['STB_Channel'].show()
		self['alt_STB_Channel'].show()
		self['separator'].show()

		if not showAllButtons:
			self['bt_red'].show()
			self['bt_green'].show()
			self['bt_ok'].show()
			self['bt_exit'].show()
			self['bt_text'].show()
			self['bt_info'].show()
			self['bt_menu'].show()

			self['text_red'].show()
			self['text_green'].show()
			self['text_ok'].show()
			self['text_0'].show()
			self['text_1'].show()
			self['text_2'].show()
			self['text_3'].show()
			self['text_4'].show()

	def updateMenuKeys(self):
		updateMenuKeys(self)

	def channelSetup(self):
		webSender = self['list'].getCurrent()[0][0]
		self.session.open(SerienRecorder.serienRecChannelSetup, webSender)

	def readLogFile(self):
		self.session.open(SerienRecorder.serienRecReadLog)

	def showProposalDB(self):
		self.session.open(SerienRecorder.serienRecShowSeasonBegins)

	def showConflicts(self):
		self.session.open(SerienRecorder.serienRecShowConflicts)

	def showWishlist(self):
		self.session.open(SerienRecorder.serienRecWishlist)

	def youtubeSearch(self):
		if SerienRecorder.epgTranslatorInstalled:
			check = self['list'].getCurrent()
			if check is None:
				return

			sender_name = self['list'].getCurrent()[0][0]
			from Plugins.Extensions.EPGTranslator.plugin import searchYouTube
			self.session.open(searchYouTube, sender_name)
		else:
			self.session.open(MessageBox, "Um diese Funktion nutzen zu können muss das Plugin '%s' installiert sein." % "EPGTranslator von Kashmir", MessageBox.TYPE_INFO, timeout = 10)

	def WikipediaSearch(self):
		if SerienRecorder.WikipediaInstalled:
			check = self['list'].getCurrent()
			if check is None:
				return

			sender_name = self['list'].getCurrent()[0][0]
			from Plugins.Extensions.Wikipedia.plugin import wikiSearch
			self.session.open(wikiSearch, sender_name)
		else:
			self.session.open(MessageBox, "Um diese Funktion nutzen zu können muss das Plugin '%s' installiert sein." % "Wikipedia von Kashmir", MessageBox.TYPE_INFO, timeout = 10)

	def showManual(self):
		if SerienRecorder.OperaBrowserInstalled:
			self.session.open(SerienRecorder.Browser, SerienRecorder.SR_OperatingManual, True)
		elif SerienRecorder.DMMBrowserInstalled:
			self.session.open(SerienRecorder.Browser, True, SerienRecorder.SR_OperatingManual)
		else:
			self.session.open(MessageBox, "Um diese Funktion nutzen zu können muss das Plugin '%s' installiert sein." % "Webbrowser", MessageBox.TYPE_INFO, timeout = 10)

	def showAbout(self):
		self.session.open(serienRecAboutScreen)

	def recSetup(self):
		self.session.openWithCallback(self.setupClose, SerienRecorder.serienRecSetup)

	def setupClose(self, result):
		if not result[2]:
			self.close()
		else:
			if result[0]:
				if config.plugins.serienRec.update.value:
					SerienRecorder.serienRecCheckForRecording(self.session, False)
				elif config.plugins.serienRec.timeUpdate.value:
					SerienRecorder.serienRecCheckForRecording(self.session, False)

			if result[1]:
				self.showChannels()

	def showChannels(self):
		self.serienRecChlist = []
		cCursor = SerienRecorder.dbSerRec.cursor()
		cCursor.execute("SELECT WebChannel, STBChannel, ServiceRef, alternativSTBChannel, alternativServiceRef, Erlaubt FROM Channels ORDER BY LOWER(WebChannel)")
		for row in cCursor:
			(webSender, servicename, serviceref, altservicename, altserviceref, status) = row
			self.serienRecChlist.append((webSender, servicename, altservicename, status))

		if len(self.serienRecChlist) != 0:
			self['title'].setText("Sender zuordnen")
			self.chooseMenuList.setList(map(self.buildList, self.serienRecChlist))
		else:
			print "[SerienRecorder] Fehler bei der Erstellung der SerienRecChlist.."
		cCursor.close()

	def readWebChannels(self):
		print "[SerienRecorder] call webpage.."
		self['title'].setText("Lade Web-Channels...")

		#from WebChannels import WebChannels
		#WebChannels(self.createWebChannels, self.dataError).request()
		self.createWebChannels(SeriesServer().doGetWebChannels())

	def createWebChannels(self, web_chlist):
		if web_chlist:
			from difflib import SequenceMatcher
			sequenceMatcher = SequenceMatcher(" ".__eq__, "", "")

			web_chlist.sort(key=lambda x: x.lower())
			print web_chlist
			self.serienRecChlist = []
			if len(web_chlist) != 0:
				self['title'].setText("erstelle Channels-List...")
				cCursor = SerienRecorder.dbSerRec.cursor()
				sql = "INSERT OR IGNORE INTO Channels (WebChannel, STBChannel, ServiceRef, Erlaubt) VALUES (?, ?, ?, ?)"
				for webSender in web_chlist:
					cCursor.execute("SELECT * FROM Channels WHERE LOWER(WebChannel)=?", (webSender.lower(),))
					row = cCursor.fetchone()
					if not row:
						found = False
						for servicename,serviceref in self.stbChlist:
							#if re.search(webSender.lower(), servicename.lower(), re.S):
							#if re.search("\A%s\Z" % webSender.lower().replace('+','\+').replace('.','\.'), servicename.lower(), re.S):
							sequenceMatcher.set_seqs(webSender.lower(), servicename.lower())
							ratio = sequenceMatcher.ratio()
							if ratio == 1:
								cCursor.execute(sql, (webSender, servicename, serviceref, 1))
								self.serienRecChlist.append((webSender, servicename, "", "1"))
								found = True
								break
						if not found:
							cCursor.execute(sql, (webSender, "", "", 0))
							self.serienRecChlist.append((webSender, "", "", "0"))
						self.changesMade = True
						global runAutocheckAtExit
						runAutocheckAtExit = True
				SerienRecorder.dbSerRec.commit()
				cCursor.close()
			else:
				print "[SerienRecorder] webChannel list leer.."

			if len(self.serienRecChlist) != 0:
				self.chooseMenuList.setList(map(self.buildList, self.serienRecChlist))
			else:
				print "[SerienRecorder] Fehler bei der Erstellung der SerienRecChlist.."

		else:
			print "[SerienRecorder] get webChannel error.."

		self['title'].setText("Web-Channel / STB-Channels.")

	@staticmethod
	def buildList(entry):
		(webSender, stbSender, altstbSender, status) = entry
		if int(status) == 0:
			imageStatus = "%simages/minus.png" % serienRecMainPath
		else:
			imageStatus = "%simages/plus.png" % serienRecMainPath

		return [entry,
			(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 7 * skinFactor, 16 * skinFactor, 16 * skinFactor, loadPNG(imageStatus)),
			(eListboxPythonMultiContent.TYPE_TEXT, 40 * skinFactor, 0, 300 * skinFactor, 26 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, webSender),
			(eListboxPythonMultiContent.TYPE_TEXT, 350 * skinFactor, 0, 250 * skinFactor, 26 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, stbSender),
			(eListboxPythonMultiContent.TYPE_TEXT, 600 * skinFactor, 0, 250 * skinFactor, 26 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, altstbSender, parseColor('yellow').argb())
			]

	@staticmethod
	def buildList_popup(entry):
		(servicename,serviceref) = entry
		return [entry,
			(eListboxPythonMultiContent.TYPE_TEXT, 5, 1, 250 * skinFactor, 25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, servicename)
			]

	def keyOK(self):
		global runAutocheckAtExit
		if self.modus == "list":
			self.modus = "popup_list"
			self['popup_list'].show()
			self['popup_bg'].show()
			if config.plugins.serienRec.selectBouquets.value:
				self.stbChlist = STBHelpers.buildSTBChannelList(config.plugins.serienRec.MainBouquet.value)
			else:
				self.stbChlist = STBHelpers.buildSTBChannelList()
			self.stbChlist.insert(0, ("", ""))
			self.chooseMenuList_popup.setList(map(self.buildList_popup, self.stbChlist))
			idx = 0
			cCursor = SerienRecorder.dbSerRec.cursor()
			cCursor.execute("SELECT STBChannel, alternativSTBChannel FROM Channels WHERE LOWER(WebChannel)=?", (self['list'].getCurrent()[0][0].lower(),))
			row = cCursor.fetchone()
			if row:
				(stbChannel, altstbChannel) = row
				if stbChannel:
					try:
						idx = zip(*self.stbChlist)[0].index(stbChannel)
					except:
						pass
			cCursor.close()
			self['popup_list'].moveToIndex(idx)
			self['title'].setText("Standard STB-Channel für %s:" % self['list'].getCurrent()[0][0])
		elif config.plugins.serienRec.selectBouquets.value:
			if self.modus == "popup_list":
				self.modus = "popup_list2"
				self['popup_list'].hide()
				self['popup_list2'].show()
				self['popup_bg'].show()
				self.stbChlist = STBHelpers.buildSTBChannelList(config.plugins.serienRec.AlternativeBouquet.value)
				self.stbChlist.insert(0, ("", ""))
				self.chooseMenuList_popup2.setList(map(self.buildList_popup, self.stbChlist))
				idx = 0
				cCursor = SerienRecorder.dbSerRec.cursor()
				cCursor.execute("SELECT STBChannel, alternativSTBChannel FROM Channels WHERE LOWER(WebChannel)=?", (self['list'].getCurrent()[0][0].lower(),))
				row = cCursor.fetchone()
				if row:
					(stbChannel, altstbChannel) = row
					if stbChannel:
						try:
							idx = zip(*self.stbChlist)[0].index(altstbChannel)
						except:
							pass
				cCursor.close()
				self['popup_list2'].moveToIndex(idx)
				self['title'].setText("alternativer STB-Channels für %s:" % self['list'].getCurrent()[0][0])
			else:
				self.modus = "list"
				self['popup_list'].hide()
				self['popup_list2'].hide()
				self['popup_bg'].hide()

				check = self['list'].getCurrent()
				if check is None:
					print "[SerienRecorder] Channel-List leer (list)."
					return

				check = self['popup_list'].getCurrent()
				if check is None:
					print "[SerienRecorder] Channel-List leer (popup_list)."
					return

				chlistSender = self['list'].getCurrent()[0][0]
				stbSender = self['popup_list'].getCurrent()[0][0]
				stbRef = self['popup_list'].getCurrent()[0][1]
				altstbSender = self['popup_list2'].getCurrent()[0][0]
				altstbRef = self['popup_list2'].getCurrent()[0][1]
				print "[SerienRecorder] select:", chlistSender, stbSender, stbRef, altstbSender, altstbRef
				cCursor = SerienRecorder.dbSerRec.cursor()
				sql = "UPDATE OR IGNORE Channels SET STBChannel=?, ServiceRef=?, alternativSTBChannel=?, alternativServiceRef=?, Erlaubt=? WHERE LOWER(WebChannel)=?"
				if stbSender != "" or altstbSender != "":
					cCursor.execute(sql, (stbSender, stbRef, altstbSender, altstbRef, 1, chlistSender.lower()))
				else:
					cCursor.execute(sql, (stbSender, stbRef, altstbSender, altstbRef, 0, chlistSender.lower()))
				self.changesMade = True
				runAutocheckAtExit = True
				SerienRecorder.dbSerRec.commit()
				cCursor.close()
				self['title'].setText("Sender zuordnen")
				self.showChannels()
		else:
			self.modus = "list"
			self['popup_list'].hide()
			self['popup_list2'].hide()
			self['popup_bg'].hide()

			if self['list'].getCurrent() is None:
				print "[SerienRecorder] Channel-List leer (list)."
				return

			if self['popup_list'].getCurrent() is None:
				print "[SerienRecorder] Channel-List leer (popup_list)."
				return

			chlistSender = self['list'].getCurrent()[0][0]
			stbSender = self['popup_list'].getCurrent()[0][0]
			stbRef = self['popup_list'].getCurrent()[0][1]
			print "[SerienRecorder] select:", chlistSender, stbSender, stbRef
			cCursor = SerienRecorder.dbSerRec.cursor()
			sql = "UPDATE OR IGNORE Channels SET STBChannel=?, ServiceRef=?, Erlaubt=? WHERE LOWER(WebChannel)=?"
			if stbSender != "":
				cCursor.execute(sql, (stbSender, stbRef, 1, chlistSender.lower()))
			else:
				cCursor.execute(sql, (stbSender, stbRef, 0, chlistSender.lower()))
			self.changesMade = True
			runAutocheckAtExit = True
			SerienRecorder.dbSerRec.commit()
			cCursor.close()
			self['title'].setText("Sender zuordnen")
			self.showChannels()

	def keyRed(self):
		global runAutocheckAtExit
		if self['list'].getCurrent() is None:
			print "[SerienRecorder] Channel-List leer."
			return

		if self.modus == "list":
			chlistSender = self['list'].getCurrent()[0][0]
			sender_status = self['list'].getCurrent()[0][2]
			print sender_status

			cCursor = SerienRecorder.dbSerRec.cursor()
			cCursor.execute("SELECT WebChannel, STBChannel, ServiceRef, Erlaubt FROM Channels WHERE LOWER(WebChannel)=?", (chlistSender.lower(),))
			row = cCursor.fetchone()
			if row:
				(webSender, servicename, serviceref, status) = row
				sql = "UPDATE OR IGNORE Channels SET Erlaubt=? WHERE LOWER(WebChannel)=?"
				if int(status) == 0:
					cCursor.execute(sql, (1, chlistSender.lower()))
					print "[SerienRecorder] change to:", webSender, servicename, serviceref, "1"
					self['title'].instance.setForegroundColor(parseColor("red"))
					self['title'].setText("")
					self['title'].setText("Sender '- %s -' wurde aktiviert." % webSender)
				else:
					cCursor.execute(sql, (0, chlistSender.lower()))
					print "[SerienRecorder] change to:",webSender, servicename, serviceref, "0"
					self['title'].instance.setForegroundColor(parseColor("red"))
					self['title'].setText("")
					self['title'].setText("Sender '- %s -' wurde deaktiviert." % webSender)
				self.changesMade = True
				runAutocheckAtExit = True
				SerienRecorder.dbSerRec.commit()

			cCursor.close()
			self['title'].instance.setForegroundColor(parseColor("foreground"))
			self.showChannels()

	def keyGreen(self):
		self.session.openWithCallback(self.channelReset, MessageBox, "Sender-Liste zurücksetzen ?", MessageBox.TYPE_YESNO)

	def channelReset(self, answer):
		if answer:
			print "[SerienRecorder] channel-list reset..."

			if config.plugins.serienRec.selectBouquets.value:
				self.stbChlist = STBHelpers.buildSTBChannelList(config.plugins.serienRec.MainBouquet.value)
			else:
				self.stbChlist = STBHelpers.buildSTBChannelList()
			self.readWebChannels()
		else:
			print "[SerienRecorder] channel-list ok."

	def keyRedLong(self):
		check = self['list'].getCurrent()
		if check is None:
			print "[SerienRecorder] Serien Marker leer."
			return
		else:
			self.selected_sender = self['list'].getCurrent()[0][0]
			cCursor = SerienRecorder.dbSerRec.cursor()
			cCursor.execute("SELECT * FROM Channels WHERE LOWER(WebChannel)=?", (self.selected_sender.lower(),))
			row = cCursor.fetchone()
			if row:
				print "gefunden."
				if config.plugins.serienRec.confirmOnDelete.value:
					self.session.openWithCallback(self.channelDelete, MessageBox, "Soll '%s' wirklich entfernt werden?" % self.selected_sender, MessageBox.TYPE_YESNO, default = False)
				else:
					self.channelDelete(True)
			cCursor.close()

	def channelDelete(self, answer):
		if not answer:
			return
		cCursor = SerienRecorder.dbSerRec.cursor()
		cCursor.execute("DELETE FROM NeuerStaffelbeginn WHERE LOWER(Sender)=?", (self.selected_sender.lower(),))
		cCursor.execute("DELETE FROM SenderAuswahl WHERE LOWER(ErlaubterSender)=?", (self.selected_sender.lower(),))
		cCursor.execute("DELETE FROM Channels WHERE LOWER(WebChannel)=?", (self.selected_sender.lower(),))
		SerienRecorder.dbSerRec.commit()
		cCursor.close()
		self.changesMade = True
		self['title'].instance.setForegroundColor(parseColor("red"))
		self['title'].setText("Sender '- %s -' entfernt." % self.selected_sender)
		self.showChannels()

	def keyLeft(self):
		self[self.modus].pageUp()

	def keyRight(self):
		self[self.modus].pageDown()

	def keyDown(self):
		self[self.modus].down()

	def keyUp(self):
		self[self.modus].up()

	def __onClose(self):
		if self.displayTimer:
			self.displayTimer.stop()
			self.displayTimer = None

	def keyCancel(self):
		if self.modus == "popup_list":
			self.modus = "list"
			self['popup_list'].hide()
			self['popup_bg'].hide()
		elif self.modus == "popup_list2":
			self.modus = "list"
			self['popup_list2'].hide()
			self['popup_bg'].hide()
		else:
			if config.plugins.serienRec.refreshViews.value:
				self.close(self.changesMade)
			else:
				self.close(False)

	@staticmethod
	def dataError(error, url=None):
		if url:
			writeErrorLog("   serienRecMainChannelEdit(): %s\n   Url: %s" % (error, url))
		else:
			writeErrorLog("   serienRecMainChannelEdit(): %s" % error)
		print error
Ejemplo n.º 10
0
class GreekStreamTVList(Screen):
    skin = '\n \t\t<screen name="GreekStreamTVList" position="center,center" size="800,400" title="GreekStreamTV List (Livestreamer) v3.2">\n\t\t\t<widget name="streamlist" position="0,0" size="800,360" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />\n\t\t\t<widget name="info" position="0,365" zPosition="2" size="800,35" font="Regular;22" foregroundColor="#ffffff" transparent="1" halign="center" valign="center" />\n\t\t</screen>\n           '

    def __init__(self, session, streamFile = None):
        self.session = session
        Screen.__init__(self, session)
        self['info'] = Label('...')
        self['actions'] = ActionMap(['OkCancelActions',
         'ShortcutActions',
         'WizardActions',
         'ColorActions',
         'SetupActions',
         'NumberActions',
         'MenuActions'], {'ok': self.keyOK,
         'cancel': self.keyCancel,
         'up': self.keyUp,
         'down': self.keyDown,
         'left': self.keyLeft,
         'right': self.keyRight}, -1)
        self.streamBin = '/usr/bin/rtmpdump'
        self.streamPipe = '/tmp/greekstreamtv.avi'
        if not streamFile:
            self.streamFile = resolveFilename(SCOPE_PLUGINS, 'Extensions/GreekStreamTV/stream.xml')
        else:
            self.streamFile = streamFile
        self.lvstreamer = Livestreamer()
        self.streamList = []
        self.makeStreamList()
        self.streamMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
        self.streamMenuList.l.setFont(0, gFont('Regular', 22))
        self.streamMenuList.l.setFont(1, gFont('Regular', 18))
        self.streamMenuList.l.setItemHeight(37)
        self['streamlist'] = self.streamMenuList
        self.streamMenuList.setList(map(streamListEntry, self.streamList))
        self.onLayoutFinish.append(self.layoutFinished)
        self.beforeService = None
        self.currentService = None
        self.playerStoped = False
        self.keyLocked = False
        self.pd = None
        self.qsel = None
        return

    def layoutFinished(self):
        os.system('killall -9 rtmpdump')
        self.showName()

    def keyLeft(self):
        if self.keyLocked:
            return
        self['streamlist'].pageUp()
        self.showName()

    def keyRight(self):
        if self.keyLocked:
            return
        self['streamlist'].pageDown()
        self.showName()

    def keyUp(self):
        if self.keyLocked:
            return
        self['streamlist'].up()
        self.showName()

    def keyDown(self):
        if self.keyLocked:
            return
        self['streamlist'].down()
        self.showName()

    def keyCancel(self):
        self.LivestreamerStop()
        if '/usr/lib/enigma2/python/Plugins/Extensions/GreekStreamTV' in path:
            path.remove('/usr/lib/enigma2/python/Plugins/Extensions/GreekStreamTV')
        self.close()

    def showName(self):
        try:
            tmpName = self['streamlist'].getCurrent()[0][1].get('name')
        except:
            tmpName = '...'

        self['info'].setText(tmpName)

    def keyOK(self):
        print '[GreekStreamTVList::keyOK]'
        if self.keyLocked:
            return
        uriName = self['streamlist'].getCurrent()[0][1].get('name')
        self['info'].setText('Starting %s Please Wait...' % uriName)
        self.timer = eTimer()
        self.timer.callback.append(self.StartStream)
        self.timer.start(100, 1)

    def StartStream(self):
        self.timer.stop()
        self.keyLocked = True
        self.beforeService = None
        self.currentService = None
        self.playerStoped = False
        self.pd = None
        streamInfo = self['streamlist'].getCurrent()[0][1]
        uriInfo = streamInfo.get('uri')
        typeInfo = streamInfo.get('type').split(':')
        protocol = typeInfo[0]
        serviceType = typeInfo[1]
        bufferSize = typeInfo[2]
        url = uriInfo.get('URL')
        if protocol == 'rtmp':
            url += ' '
            url += ' '.join([ '%s=%s' % (key, value) for key, value in uriInfo.items() if key != 'URL' ])
            url = ' '.join(url.split())
            print '[GreekStreamTVList::keyOK] URL is ', url, ' URI is ', uriInfo
            self.doStreamAction(url, serviceType, bufferSize)
        elif protocol in ('rtsp', 'http'):
            self.doStreamAction(url, serviceType, bufferSize)
        elif protocol == 'livestreamer':
            channel = None
            streams = None
            try:
                url += ' '
                url += ' '.join([ '%s=%s' % (key, value) for key, value in uriInfo.items() if key != 'URL' ])
                url = ' '.join(url.split())
                print '[GreekStreamTVList::keyOK] URL is ', url, ' URI is ', uriInfo
                channel = self.lvstreamer.resolve_url(url)
                streams = channel.get_streams()
                print '[GreekStreamTVList::keyOK] Streams: ', streams.keys()
                print '[GreekStreamTVList::keyOK] Streams: ', streams.items()
                if len(streams) == 3 and 'best' in streams and 'worst' in streams:
                    self.streamPreBuffer(streams['best'])
                elif len(streams) == 0:
                    raise Exception('No Streams Found')
                else:
                    self.qsel = self.session.openWithCallback(self.QualitySelClosed, SelectQuality, streams, self.streamPreBuffer)
            except Exception as err:
                print '[GreekStreamTVList::keyOK::Exception] Error: ', err
                tmpMessage = 'An Error Occured: ' + str(err)[:200] + '...'
                self.session.openWithCallback(self.stopPlayer, MessageBox, tmpMessage, type=MessageBox.TYPE_ERROR, timeout=20)

        else:
            print '[GreekStreamTVList::keyOK] Unknown Protocol: ', protocol
            tmpMessage = 'Unknown Protocol: ' + protocol
            self.session.openWithCallback(self.stopPlayer, MessageBox, tmpMessage, type=MessageBox.TYPE_WARNING, timeout=20)
        return

    def QualitySelClosed(self, recursive):
        if self.qsel:
            self.qsel.close()
        self.qsel = None
        self.stopPlayer()
        return

    def streamPreBuffer(self, stream):
        fd = None
        try:
            fd = stream.open()
            prebuffer = fd.read(1049088)
            if len(prebuffer) == 0:
                raise Exception('No Data Received From Stream Server')
            start_new_thread(self.streamCopy, (fd, prebuffer))
            sleep(1.5)
            self.doStreamAction(self.streamPipe)
        except Exception as err:
            if fd and hasattr(fd, 'close'):
                fd.close()
            print '[GreekStreamTVList::streamPreBuffer::Exception] Error: ', err
            tmpMessage = 'An Error Occured while buffering: ' + str(err)[:200] + '...'
            self.session.openWithCallback(self.stopPlayer, MessageBox, tmpMessage, type=MessageBox.TYPE_ERROR, timeout=20)

        return

    def streamCopy(self, fd, prebuffer):
        print '[GreekStreamTVList::streamCopy]'
        if os.access(self.streamPipe, os.F_OK):
            os.remove(self.streamPipe)
        os.mkfifo(self.streamPipe)
        self.pd = open(self.streamPipe, 'wb')
        try:
            self.pd.write(prebuffer)
            while self is not None and self.session is not None and not self.playerStoped:
                data = fd.read(8192)
                if len(data) == 0:
                    break
                self.pd.write(data)

            print '[GreekStreamTVList:streamCopy] playerStoped'
            self.pd.close()
            if hasattr(fd, 'close'):
                fd.close()
            fd = None
        except Exception as err:
            print '[GreekStreamTVList::streamCopy] Exception: ', err
        finally:
            self.playerStoped = True
            if fd and hasattr(fd, 'close'):
                fd.close()

        return

    def LivestreamerStop(self):
        print '[GreekStreamTVList::LivestreamStop]'
        self['info'].setText('...')
        self.keyLocked = False
        self.playerStoped = True
        os.system('killall -9 rtmpdump')
        sleep(0.5)
        if self.pd:
            try:
                self.pd.close()
            except:
                sleep(0.5)
                try:
                    self.pd.close()
                except:
                    pass

        if self.qsel is not None:
            self.qsel.close(False)
        self.pd = None
        self.qsel = None
        return

    def doStreamAction(self, url = None, serviceType = 4097, bufferSize = None):
        if url is None:
            url = self.streamPipe
            self.streamPlayerTimer.stop()
        try:
            serviceType = int(serviceType)
        except:
            serviceType = 4097

        try:
            bufferSize = int(bufferSize)
        except:
            bufferSize = None

        service = eServiceReference(serviceType, 0, url)
        streamInfo = self['streamlist'].getCurrent()[0][1]
        service.setName(str(streamInfo.get('name')))
        uriInfo = streamInfo.get('uri')
        self.beforeService = self.session.nav.getCurrentlyPlayingServiceReference()
        self.currentService = self.session.openWithCallback(self.onStreamFinished, GreekStreamTVPlayer, service, stopPlayer=self.stopPlayer, chName=str(streamInfo.get('name')), chURL=str(uriInfo.get('URL')), chIcon=str(streamInfo.get('icon')))
        return

    def stopPlayer(self, params = None):
        print '[GreekStreamTV::stopPlayer]'
        if params is None or isinstance(params, bool):
            self.playerStoped = True
            self.LivestreamerStop()
            return
        else:
            return

    def onStreamFinished(self):
        print '[GreekStreamTV::onStreamFinished]'
        self.LivestreamerStop()
        self.session.nav.playService(self.beforeService)
        print '[GreekStreamTV::onStreamFinished] player done!!'

    def makeStreamList(self):
        try:
            streamDB = StreamURIParser(self.streamFile).parseStreamList()
        except Exception as err:
            print '[GreekStreamTV::makeStreamList] Error: ', err
            streamDB = []

        self.streamList = [ (x.get('name'), x) for x in streamDB ]
Ejemplo n.º 11
0
class Favscreen(Screen):
    try:
        sz_w = getDesktop(0).size().width()
        if sz_w == 1280:
            HD_Res = True
        else:
            HD_Res = False
    except:
        HD_Res = False

    if HD_Res:
        skin = '\n\t\t<screen flags="wfNoBorder" position="0,0" size="1280,720" title="Greek Net Radio " >\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,80" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,120" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,160" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,200" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,240" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,280" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,320" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,360" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,400" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,440" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,480" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,520" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,560" size="40,40" zPosition="-1"/>\n\t\t<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,600" size="40,40" zPosition="-1"/>\n\t    <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/stations.png" position="0,0" size="1280,720"  zPosition="-2"/>\n\t    <widget name="ButtonGeentext" position="200,630" size="1200,30" valign="left" halign="left" zPosition="10" font="Regular;23" transparent="1" foregroundColor="green"  />\n\t    <widget name="ButtonGeen" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/buttons/green.png" position="60,645" zPosition="10" size="100,60" transparent="1" alphatest="on" />\n\t\t<widget name="stationmenu" itemHeight="40" position="100,80" size="520,560" selectionPixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/barreb.png" transparent="1" scrollbarMode="showNever" zPosition="9"/>\n\t    </screen>'
    else:
        skin = '\n            <screen position="center,center" size="600,500" title="Greek NetRadio" >\n            <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/stations.png" position="0,0" size="620,500"/>\n            <widget name="ButtonGeentext" position="80,430" size="500,60" valign="center" halign="center" zPosition="10" font="Regular;21" transparent="1" foregroundColor="green" />\n            <widget name="ButtonGeen" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/buttons/green.png" position="0,440" zPosition="10" size="100,60" transparent="1" alphatest="on" />\n            <widget name="stationmenu" position="10,80" size="590,380" scrollbarMode="showOnDemand" selectionPixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/barreb.png" transparent="1" zPosition="4" />\n            </screen>'

    def __init__(self, session):
        self.session = session
        self.skin = Favscreen.skin
        Screen.__init__(self, session)
        self['key_red'] = Button(_('Exit'))
        self['key_green'] = Button(_('Delete'))
        self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference(
        )
        try:
            self.session.nav.stopService()
        except:
            pass

        self.onClose.append(self.__onClose)
        self['actions'] = ActionMap(
            ['SetupActions', 'ColorActions'], {
                'ok': self.ok,
                'green': self.Delselected,
                'red': self.close,
                'cancel': self.close
            }, -2)
        self.list = MenuList([])
        self['ButtonGeen'] = Pixmap()
        self['ButtonGeentext'] = Label(
            _('Press OK to Play, Green to delete,  or EXIT'))
        self['stationmenu'] = self.list
        lst = lsSelected()
        self.list.setList(lst)

    def Delselected(self):
        try:
            sel = self['stationmenu'].getSelectedIndex()
            config.plugins.Cradio.stations_count.value = config.plugins.Cradio.stations_count.value - 1
            config.plugins.Cradio.stations_count.save()
            del config.plugins.Cradio.stations[sel]
            config.plugins.Cradio.stations.save()
            config.plugins.Cradio.save()
            configfile.save()
            lst = []
            lst = lsSelected()
            self['stationmenu'].setList(lst)
            if config.plugins.Cradio.stations_count.value == 0:
                self['key_green'].hide()
            else:
                self['key_green'].show()
        except:
            pass

    def playServiceStream(self, url):
        try:
            self.session.nav.stopService()
            sref = eServiceReference(4097, 0, url)
            self.session.nav.playService(sref)
            self.currentStreamingURL = url
        except:
            pass

    def ok(self):
        try:
            station = self.list.getSelectionIndex()
            currentindex = station
            cname = config.plugins.Cradio.stations[station].code.value
            tup1 = cname.split(',')
            cstation = tup1[0]
            curl = tup1[1]
            self.currentStreamingURL = ''
            self.currentStreamingStation = ''
            self.session.nav.stopService()
            self.currentStreamingStation = cstation
            self.playServiceStream(curl)
            currentservice = self.CurrentService
            self.session.open(Playscreen, cstation, currentservice,
                              currentindex)
        except:
            pass

    def playServiceStream(self, url):
        try:
            self.session.nav.stopService()
            sref = eServiceReference(4097, 0, url)
            self.session.nav.playService(sref)
            self.currentStreamingURL = url
        except:
            pass

    def __onClose(self):
        self.session.nav.playService(self.CurrentService)
class serienRecModifyAdded(serienRecBaseScreen, Screen, HelpableScreen):
	def __init__(self, session, skip=True):
		serienRecBaseScreen.__init__(self, session)
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.session = session
		self.picload = ePicLoad()
		self.database = SRDatabase(SerienRecorder.serienRecDataBaseFilePath)
		self.chooseMenuList_popup = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)

		self["actions"] = HelpableActionMap(self, "SerienRecorderActions", {
			"ok": (self.keyOK, "für die ausgewählte Serien neue Einträge hinzufügen"),
			"cancel": (self.keyCancel, "alle Änderungen verwerfen und zurück zur vorherigen Ansicht"),
			"left": (self.keyLeft, "zur vorherigen Seite blättern"),
			"right": (self.keyRight, "zur nächsten Seite blättern"),
			"up": (self.keyUp, "eine Zeile nach oben"),
			"down": (self.keyDown, "eine Zeile nach unten"),
			"red": (self.keyRed, "ausgewählten Eintrag löschen"),
			"green": (self.keyGreen, "alle Änderungen speichern und zurück zur vorherigen Ansicht"),
			"yellow": (self.keyYellow, "umschalten Sortierung ein/aus"),
			"menu": (self.recSetup, "Menü für globale Einstellungen öffnen"),
			"0"	: (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
			"3"		: (self.showProposalDB, "Liste der Serien/Staffel-Starts anzeigen"),
			"4"		: (self.serieInfo, "Informationen zur ausgewählten Serie anzeigen"),
			"6"		: (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
			"7"		: (self.showWishlist, "Merkzettel (vorgemerkte Folgen) anzeigen"),
		}, -1)
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["SerienRecorderActions" ,], {
			"displayHelp"      : self.showHelp,
			"displayHelp_long" : self.showManual,
		}, 0)

		self.setupSkin()

		self.delAdded = False
		self.addedlist = []
		self.addedlist_tmp = []
		self.dbData = []
		self.modus = "menu_list"
		self.aSerie = ""
		self.aStaffel = "0"
		self.aFromEpisode = 0
		self.aToEpisode = 0

		if skip:
			self.onShown.append(self.functionWillBeDeleted)
		else:
			self.onLayoutFinish.append(self.readAdded)
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.setSkinProperties)

	def functionWillBeDeleted(self):
		from SerienRecorderMarkerScreen import serienRecMarker
		self.session.open(serienRecMarker)
		self.hide()
		self.session.open(MessageBox, "WICHTIGER Hinweis:\n\n"
		                              "Dieser Funktionsaufruf wird ab dem nächsten Update nicht mehr zur Verfügung stehen!!\n\n"
		                              "Die manuelle Bearbeitung der Timer-Liste, d.h. Hinzufügen und Löschen einzelner Episoden "
		                              "kann in der Episoden-Liste der jeweiligen Serie erfolgen. Dazu in der Serien-Marker Ansicht die gewünschte Serie auswählen, "
		                              "und mit der Taste 5 die Episoden-Liste öffnen. Danach können mit der grünen Taste einzelne Episoden für die Timererstellung "
		                              "gesperrt oder wieder freigegeben werden.", MessageBox.TYPE_INFO)
		self.close()

	def callHelpAction(self, *args):
		HelpableScreen.callHelpAction(self, *args)

	def setSkinProperties(self):
		super(self.__class__, self).setSkinProperties()

		self['text_red'].setText("Eintrag löschen")
		self['text_green'].setText("Speichern")
		self['text_ok'].setText("Neuer Eintrag")
		if config.plugins.serienRec.addedListSorted.value:
			self['text_yellow'].setText("unsortierte Liste")
		else:
			self['text_yellow'].setText("Sortieren")
		self.num_bt_text[1][0] = buttonText_na

		super(self.__class__, self).startDisplayTimer()

	def setupSkin(self):
		self.skin = None
		InitSkin(self)

		# normal
		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList.l.setItemHeight(int(25 *skinFactor))
		self['menu_list'] = self.chooseMenuList
		self['menu_list'].show()

		# popup
		self.chooseMenuList_popup = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList_popup.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList_popup.l.setItemHeight(int(25 *skinFactor))
		self['popup_list'] = self.chooseMenuList_popup
		self['popup_list'].hide()

		if config.plugins.serienRec.showCover.value:
			self['cover'].show()

		if not config.plugins.serienRec.showAllButtons.value:
			self['bt_red'].show()
			self['bt_green'].show()
			self['bt_ok'].show()
			self['bt_yellow'].show()
			self['bt_exit'].show()
			#self['bt_text'].show()
			self['bt_info'].show()
			self['bt_menu'].show()

			self['text_red'].show()
			self['text_green'].show()
			self['text_ok'].show()
			self['text_yellow'].show()
			self['text_0'].show()
			self['text_1'].show()
			self['text_2'].show()
			self['text_3'].show()
			self['text_4'].show()

	def updateMenuKeys(self):
		updateMenuKeys(self)

	def serieInfo(self):
		if self.modus == "menu_list":
			check = self['menu_list'].getCurrent()
			if check is None:
				return
			serien_name = self['menu_list'].getCurrent()[0][1]
		else:
			check = self['popup_list'].getCurrent()
			if check is None:
				return
			serien_name = self['popup_list'].getCurrent()[0][0]

		serien_id = None
		url = self.database.getMarkerURL(serien_name)
		if url:
			serien_id = url

		from SerienRecorderSeriesInfoScreen import serienRecShowInfo
		self.session.open(serienRecShowInfo, serien_name, serien_id)

	def setupClose(self, result):
		super(self.__class__, self).setupClose(result)
		if result[1]:
			self.readAdded()

	def readAdded(self):
		self.addedlist = []
		timers = self.database.getAllTimer(None)
		for timer in timers:
			(Serie, Staffel, Episode, title, start_time, stbRef, webChannel, eit, active) = timer
			zeile = "%s - S%sE%s - %s" % (Serie, str(Staffel).zfill(2), str(Episode).zfill(2), title)
			self.addedlist.append((zeile.replace(" - dump", " - %s" % "(Manuell hinzugefügt !!)"), Serie, Staffel, Episode, title, start_time, webChannel))

		self['title'].instance.setForegroundColor(parseColor("red"))
		self['title'].setText("Für diese Episoden werden keine Timer mehr erstellt !")
		self.addedlist_tmp = self.addedlist[:]
		if config.plugins.serienRec.addedListSorted.value:
			self.addedlist_tmp.sort()
		self.chooseMenuList.setList(map(self.buildList, self.addedlist_tmp))
		self.getCover()

	@staticmethod
	def buildList(entry):
		(zeile, Serie, Staffel, Episode, title, start_time, webChannel) = entry
		foregroundColor = parseColor('foreground').argb()
		return [entry,
		        (eListboxPythonMultiContent.TYPE_TEXT, 20, 00, 1280 * skinFactor, 25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, zeile, foregroundColor)
		        ]

	@staticmethod
	def buildList_popup(entry):
		(Serie,) = entry
		foregroundColor = parseColor('foreground').argb()
		return [entry,
		        (eListboxPythonMultiContent.TYPE_TEXT, 5, 0, 560 * skinFactor, 25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, Serie, foregroundColor)
		        ]

	def answerStaffel(self, aStaffel):
		self.aStaffel = aStaffel
		if self.aStaffel is None or self.aStaffel == "":
			return
		self.session.openWithCallback(self.answerFromEpisode, NTIVirtualKeyBoard, title = "von Episode:")

	def answerFromEpisode(self, aFromEpisode):
		self.aFromEpisode = aFromEpisode
		if self.aFromEpisode is None or self.aFromEpisode == "":
			return
		self.session.openWithCallback(self.answerToEpisode, NTIVirtualKeyBoard, title = "bis Episode:")

	def answerToEpisode(self, aToEpisode):
		self.aToEpisode = aToEpisode
		if self.aToEpisode == "":
			self.aToEpisode = self.aFromEpisode

		if self.aToEpisode is None: # or self.aFromEpisode is None or self.aStaffel is None:
			return
		else:
			print "[SerienRecorder] Staffel: %s" % self.aStaffel
			print "[SerienRecorder] von Episode: %s" % self.aFromEpisode
			print "[SerienRecorder] bis Episode: %s" % self.aToEpisode

			if self.aStaffel.startswith('0') and len(self.aStaffel) > 1:
				self.aStaffel = self.aStaffel[1:]

			if self.database.addToTimerList(self.aSerie, self.aFromEpisode, self.aToEpisode, self.aStaffel, "dump", int(time.time()), "", "", 0, 1):
				self.readAdded()

	def keyOK(self):
		if self.modus == "menu_list":
			self.modus = "popup_list"
			self['popup_list'].show()
			self['popup_bg'].show()
			self['menu_list'].hide()
			l = self.database.getMarkerNames()
			self.chooseMenuList_popup.setList(map(self.buildList_popup, l))
			self['popup_list'].moveToIndex(0)
		else:
			self.modus = "menu_list"
			self['menu_list'].show()
			self['popup_list'].hide()
			self['popup_bg'].hide()

			if self['popup_list'].getCurrent() is None:
				print "[SerienRecorder] Marker-Liste leer."
				return

			self.aSerie = self['popup_list'].getCurrent()[0][0]
			self.aStaffel = "0"
			self.aFromEpisode = 0
			self.aToEpisode = 0
			self.session.openWithCallback(self.answerStaffel, NTIVirtualKeyBoard, title = "%s: Staffel eingeben:" % self.aSerie)

	def keyRed(self):
		check = None
		if self.modus == "menu_list":
			check = self['menu_list'].getCurrent()
		if check is None:
			print "[SerienRecorder] Added-File leer."
			return
		else:
			zeile = self['menu_list'].getCurrent()[0]
			(txt, serie, staffel, episode, title, start_time, webChannel) = zeile
			self.dbData.append((serie.lower(), str(staffel).lower(), episode.lower(), title.lower(), start_time, webChannel.lower()))
			self.addedlist_tmp.remove(zeile)
			self.addedlist.remove(zeile)
			self.chooseMenuList.setList(map(self.buildList, self.addedlist_tmp))
			self.delAdded = True

	def keyGreen(self):
		if self.modus == "menu_list" and self.delAdded:
			self.database.removeTimers(self.dbData)
		self.close()

	def keyYellow(self):
		if self.modus == "menu_list" and len(self.addedlist_tmp) != 0:
			if config.plugins.serienRec.addedListSorted.value:
				self.addedlist_tmp = self.addedlist[:]
				self['text_yellow'].setText("Sortieren")
				config.plugins.serienRec.addedListSorted.setValue(False)
			else:
				self.addedlist_tmp.sort()
				self['text_yellow'].setText("unsortierte Liste")
				config.plugins.serienRec.addedListSorted.setValue(True)
			config.plugins.serienRec.addedListSorted.save()
			SerienRecorder.configfile.save()

			self.chooseMenuList.setList(map(self.buildList, self.addedlist_tmp))
			self.getCover()

	def getCover(self):
		if self.modus == "menu_list":
			check = self['menu_list'].getCurrent()
			if check is None:
				return
			serien_name = self['menu_list'].getCurrent()[0][1]
		else:
			check = self['popup_list'].getCurrent()
			if check is None:
				return
			serien_name = self['popup_list'].getCurrent()[0][0]

		serien_id = None
		url = self.database.getMarkerURL(serien_name)
		if url:
			serien_id = url

		SerienRecorder.getCover(self, serien_name, serien_id)

	def keyLeft(self):
		self[self.modus].pageUp()
		self.getCover()

	def keyRight(self):
		self[self.modus].pageDown()
		self.getCover()

	def keyDown(self):
		self[self.modus].down()
		self.getCover()

	def keyUp(self):
		self[self.modus].up()
		self.getCover()

	def __onClose(self):
		self.stopDisplayTimer()

	def callDeleteMsg(self, answer):
		if answer:
			self.keyGreen()
		self.close()

	def keyCancel(self):
		if self.delAdded:
			self.session.openWithCallback(self.callDeleteMsg, MessageBox, "Sollen die Änderungen gespeichert werden?", MessageBox.TYPE_YESNO, default = True)
		else:
			self.close()
class serienRecRunAutoCheckScreen(serienRecBaseScreen, Screen, HelpableScreen):
	def __init__(self, session, withTVPlanner=False):
		serienRecBaseScreen.__init__(self, session)
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.session = session
		self.withTVPlanner = withTVPlanner
		print "[SerienRecorder] 0__init__ withTVPlanner:", withTVPlanner
		self.autoCheckRunning = False

		self["actions"] = HelpableActionMap(self, "SerienRecorderActions", {
			"red": (self.keyCancel, "zurück zur vorherigen Ansicht"),
			"cancel": (self.keyCancel, "zurück zur vorherigen Ansicht"),
			"menu": (self.recSetup, "Menü für globale Einstellungen öffnen"),
			"3"	: (self.showProposalDB, "Liste der Serien/Staffel-Starts anzeigen"),
			"6"		: (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
			"7"		: (self.showWishlist, "Merkzettel (vorgemerkte Folgen) anzeigen"),
		}, -1)
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["SerienRecorderActions" ,], {
			"displayHelp"      : self.showHelp,
			"displayHelp_long" : self.showManual,
		}, 0)

		self.setupSkin()
		self.logliste = []
		self.points = ""

		self.readLogTimer = eTimer()
		self.readLogTimer_conn = None

		self.onLayoutFinish.append(self.setSkinProperties)
		self.onLayoutFinish.append(self.startCheck)
		self.onClose.append(self.__onClose)

	def callHelpAction(self, *args):
		HelpableScreen.callHelpAction(self, *args)

	def setSkinProperties(self):
		super(self.__class__, self).setSkinProperties()

		self['text_red'].setText("Abbrechen")
		self.num_bt_text[0][0] = buttonText_na
		self.num_bt_text[4][0] = buttonText_na

		super(self.__class__, self).startDisplayTimer()

	def setupSkin(self):
		self.skin = None
		InitSkin(self)

		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		if config.plugins.serienRec.logWrapAround.value:
			self.chooseMenuList.l.setItemHeight(int(70 *skinFactor))
		else:
			self.chooseMenuList.l.setItemHeight(int(25 *skinFactor))
		self['log'] = self.chooseMenuList
		self['log'].show()

		self['title'].setText("Suche nach neuen Timern läuft...")
		if not config.plugins.serienRec.showAllButtons.value:
			self['bt_red'].show()
			self['bt_exit'].show()
			self['bt_info'].show()
			self['bt_menu'].show()

			self['text_red'].show()
			self['text_0'].show()
			self['text_1'].show()
			self['text_2'].show()
			self['text_3'].show()
			self['text_4'].show()

	def updateMenuKeys(self):
		updateMenuKeys(self)

	def setupClose(self, result):
		super(self.__class__, self).setupClose(result)
		if result[1]:
			self.startCheck()

	def startCheck(self):
		# Log Reload Timer
		print "[SerienRecorder] startCheck timer"
		SerienRecorder.autoCheckFinished = False
		self.autoCheckRunning = False
		if isDreamOS():
			self.readLogTimer_conn = self.readLogTimer.timeout.connect(self.readLog)
		else:
			self.readLogTimer.callback.append(self.readLog)
		self.readLogTimer.start(2500)

	def executeAutoCheck(self):
		if not self.autoCheckRunning:
			self.autoCheckRunning = True
			SerienRecorder.serienRecCheckForRecording(self.session, True, self.withTVPlanner)

	def readLog(self):
		print "[SerienRecorder] readLog called"
		if SerienRecorder.autoCheckFinished:
			if self.readLogTimer:
				self.readLogTimer.stop()
				self.readLogTimer = None
			print "[SerienRecorder] update log reader stopped."
			self['title'].setText("Auto-Check fertig !")

			from SerienRecorderLogWriter import SRLogger
			logFileHandle = open(SRLogger.getLogFilePath(), "r")
			for zeile in logFileHandle.readlines():
				if (not config.plugins.serienRec.logWrapAround.value) or (len(zeile.strip()) > 0):
					self.logliste.append(zeile)
			logFileHandle.close()
			self.chooseMenuList.setList(map(self.buildList, self.logliste))
			if config.plugins.serienRec.logScrollLast.value:
				count = len(self.logliste)
				if count != 0:
					self['log'].moveToIndex(int(count - 1))
			SerienRecorder.autoCheckRunning = False
		else:
			print "[SerienRecorder] waiting"
			self.points += " ."
			self['title'].setText("Suche nach neuen Timern läuft.%s" % self.points)
			self.executeAutoCheck()

	@staticmethod
	def buildList(entry):
		(zeile) = entry
		width = 850
		if config.plugins.serienRec.SkinType.value == "":
			width = 1240

		if config.plugins.serienRec.logWrapAround.value:
			return [entry, (eListboxPythonMultiContent.TYPE_TEXT, 00, 00, width * skinFactor, 65 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER | RT_WRAP, zeile)]
		else:
			return [entry,
			(eListboxPythonMultiContent.TYPE_TEXT, 00, 2 * skinFactor, width * skinFactor, 20 * skinFactor, 0,
			RT_HALIGN_LEFT | RT_VALIGN_CENTER, zeile)]

	def pageUp(self):
		self['log'].pageUp()

	def pageDown(self):
		self['log'].pageDown()

	def __onClose(self):
		if self.readLogTimer:
			self.readLogTimer.stop()
			self.readLogTimer = None
			self.readLogTimer_conn = None

		self.stopDisplayTimer()

	def keyCancel(self):
		if SerienRecorder.autoCheckFinished:
			self.close(config.plugins.serienRec.refreshViews.value)
class serienRecTimerListScreen(serienRecBaseScreen, Screen, HelpableScreen):
	def __init__(self, session):
		serienRecBaseScreen.__init__(self, session)
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.skin = None
		self.session = session
		self.picload = ePicLoad()
		self.WochenTag = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
		self.database = SRDatabase(SerienRecorder.serienRecDataBaseFilePath)

		self["actions"] = HelpableActionMap(self, "SerienRecorderActions", {
			"ok": (self.keyOK, "Liste der erstellten Timer bearbeiten"),
			"cancel": (self.keyCancel, "zurück zur Serienplaner-Ansicht"),
			"left": (self.keyLeft, "zur vorherigen Seite blättern"),
			"right": (self.keyRight, "zur nächsten Seite blättern"),
			"up": (self.keyUp, "eine Zeile nach oben"),
			"down": (self.keyDown, "eine Zeile nach unten"),
			"red": (self.keyRed, "ausgewählten Timer löschen"),
			"green": (self.viewChange, "Sortierung ändern"),
			"yellow": (self.keyYellow, "umschalten alle/nur aktive Timer anzeigen"),
			"blue": (self.keyBlue, "alle noch ausstehenden Timer löschen"),
			"menu": (self.recSetup, "Menü für globale Einstellungen öffnen"),
			"startTeletext": (self.wunschliste, "Informationen zur ausgewählten Serie auf Wunschliste anzeigen"),
			"0"	: (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
			"3"		: (self.showProposalDB, "Liste der Serien/Staffel-Starts anzeigen"),
			"4"		: (self.serieInfo, "Informationen zur ausgewählten Serie anzeigen"),
			"6"		: (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
			"7"		: (self.showWishlist, "Merkzettel (vorgemerkte Folgen) anzeigen"),
			"9"		: (self.dropAllTimer, "Alle Timer aus der Datenbank löschen"),
		}, -1)
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["SerienRecorderActions" ,], {
			# "ok"    : self.keyOK,
			"displayHelp"      : self.showHelp,
			"displayHelp_long" : self.showManual,
		}, 0)

		self.setupSkin()

		self.changesMade = False
		self.filter = True

		self.onLayoutFinish.append(self.readTimer)
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.setSkinProperties)

	def callHelpAction(self, *args):
		HelpableScreen.callHelpAction(self, *args)

	def setSkinProperties(self):
		super(self.__class__, self).setSkinProperties()

		self['text_red'].setText("Entferne Timer")
		if config.plugins.serienRec.recordListView.value == 0:
			self['text_green'].setText("Zeige neueste Timer zuerst")
		elif config.plugins.serienRec.recordListView.value == 1:
			self['text_green'].setText("Zeige früheste Timer zuerst")
		self['text_ok'].setText("Liste bearbeiten")
		self['text_yellow'].setText("Zeige auch alte Timer")
		self['text_blue'].setText("Entferne neue Timer")
		self.num_bt_text[4][1] = "Datenbank leeren"

		super(self.__class__, self).startDisplayTimer()

	def setupSkin(self):
		InitSkin(self)

		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList.l.setItemHeight(int(50 *skinFactor))
		self['menu_list'] = self.chooseMenuList
		self['menu_list'].show()

		if config.plugins.serienRec.showCover.value:
			self['cover'].show()

		if not config.plugins.serienRec.showAllButtons.value:
			self['bt_red'].show()
			self['bt_green'].show()
			self['bt_ok'].show()
			self['bt_yellow'].show()
			self['bt_blue'].show()
			self['bt_exit'].show()
			self['bt_text'].show()
			self['bt_info'].show()
			self['bt_menu'].show()

			self['text_red'].show()
			self['text_green'].show()
			self['text_ok'].show()
			self['text_yellow'].show()
			self['text_blue'].show()
			self['text_0'].show()
			self['text_1'].show()
			self['text_2'].show()
			self['text_3'].show()
			self['text_4'].show()

	def updateMenuKeys(self):
		updateMenuKeys(self)

	def serieInfo(self):
		check = self['menu_list'].getCurrent()
		if check is None:
			return

		serien_name = self['menu_list'].getCurrent()[0][0]
		url = self.database.getMarkerURL(serien_name)
		if url:
			serien_id = url
			if serien_id:
				from SerienRecorderSeriesInfoScreen import serienRecShowInfo
				self.session.open(serienRecShowInfo, serien_name, serien_id)

	def wunschliste(self):
		serien_name = self['menu_list'].getCurrent()[0][0]
		url = self.database.getMarkerURL(serien_name)
		serien_id = url
		super(self.__class__, self).wunschliste(serien_id)

	def setupClose(self, result):
		super(self.__class__, self).setupClose(result)
		if result[1]:
			self.readTimer()

	def viewChange(self):
		if config.plugins.serienRec.recordListView.value == 1:
			config.plugins.serienRec.recordListView.value = 0
			self['text_green'].setText("Zeige neueste Timer zuerst")
		else:
			config.plugins.serienRec.recordListView.value = 1
			self['text_green'].setText("Zeige früheste Timer zuerst")
		config.plugins.serienRec.recordListView.save()
		SerienRecorder.configfile.save()
		self.readTimer()

	def readTimer(self, showTitle=True):
		current_time = int(time.time())
		deltimer = 0
		timerList = []

		timers = self.database.getAllTimer(current_time if self.filter else None)
		for timer in timers:
			(serie, staffel, episode, title, start_time, stbRef, webChannel, eit, activeTimer) = timer
			if int(start_time) < int(current_time):
				deltimer += 1
				timerList.append((serie, staffel, episode, title, start_time, webChannel, "1", 0, bool(activeTimer)))
			else:
				timerList.append((serie, staffel, episode, title, start_time, webChannel, "0", eit, bool(activeTimer)))

		if showTitle:
			self['title'].instance.setForegroundColor(parseColor("foreground"))
			if self.filter:
				self['title'].setText("Timer-Liste: %s ausstehende Timer" % len(timerList))
			else:
				self['title'].setText("Timer-Liste: %s abgeschlossene und %s ausstehende Timer" % (deltimer, len(timerList ) -deltimer))

		if config.plugins.serienRec.recordListView.value == 0:
			timerList.sort(key=lambda t : t[4])
		elif config.plugins.serienRec.recordListView.value == 1:
			timerList.sort(key=lambda t : t[4])
			timerList.reverse()

		self.chooseMenuList.setList(map(self.buildList, timerList))
		if len(timerList) == 0:
			if showTitle:
				self['title'].instance.setForegroundColor(parseColor("foreground"))
				self['title'].setText("Serien Timer - 0 Serien in der Aufnahmeliste.")

		self.getCover()

	def buildList(self, entry):
		(serie, staffel, episode, title, start_time, webChannel, foundIcon, eit, activeTimer) = entry
		xtime = time.strftime(self.WochenTag[time.localtime(int(start_time)).tm_wday ] +", %d.%m.%Y - %H:%M", time.localtime(int(start_time)))
		xtitle = "S%sE%s - %s" % (str(staffel).zfill(2), str(episode).zfill(2), title)

		if int(foundIcon) == 1:
			imageFound = "%simages/found.png" % SerienRecorder.serienRecMainPath
		else:
			imageFound = "%simages/black.png" % SerienRecorder.serienRecMainPath

		if activeTimer:
			SerieColor = None
		else:
			SerieColor = parseColor('red').argb()

		foregroundColor = parseColor('foreground').argb()

		return [entry,
		        (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 8 * skinFactor, 32 * skinFactor, 32 * skinFactor, loadPNG(imageFound)),
		        (eListboxPythonMultiContent.TYPE_TEXT, 40, 3, 200 * skinFactor, 26 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, webChannel, SerieColor),
		        (eListboxPythonMultiContent.TYPE_TEXT, 40, 29 * skinFactor, 250 * skinFactor, 18 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, xtime, foregroundColor, foregroundColor),
		        (eListboxPythonMultiContent.TYPE_TEXT, 300 * skinFactor, 3, 500 * skinFactor, 26 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, serie, SerieColor),
		        (eListboxPythonMultiContent.TYPE_TEXT, 300 * skinFactor, 29 * skinFactor, 500 * skinFactor, 18 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, re.sub("(?<= - )dump\Z", "(Manuell hinzugefügt !!)", xtitle), foregroundColor, foregroundColor)
		        ]

	def keyOK(self):
		self.session.open(serienRecModifyAdded, False)

	def callDeleteSelectedTimer(self, answer):
		if answer:
			serien_name = self['menu_list'].getCurrent()[0][0]
			staffel = self['menu_list'].getCurrent()[0][1]
			episode = self['menu_list'].getCurrent()[0][2]
			serien_title = self['menu_list'].getCurrent()[0][3]
			serien_time = self['menu_list'].getCurrent()[0][4]
			serien_channel = self['menu_list'].getCurrent()[0][5]
			serien_eit = self['menu_list'].getCurrent()[0][7]
			self.removeTimer(serien_name, staffel, episode, serien_title, serien_time, serien_channel, serien_eit)
		else:
			return

	def removeTimer(self, serien_name, staffel, episode, serien_title, serien_time, serien_channel, serien_eit=0):
		if config.plugins.serienRec.TimerName.value == "1":  # "<Serienname>"
			title = serien_name
		elif config.plugins.serienRec.TimerName.value == "2":  # "SnnEmm - <Episodentitel>"
			title = "S%sE%s - %s" % (str(staffel).zfill(2), str(episode).zfill(2), serien_title)
		else:  # "<Serienname> - SnnEmm - <Episodentitel>"
			title = "%s - S%sE%s - %s" % (serien_name, str(staffel).zfill(2), str(episode).zfill(2), serien_title)

		from SerienRecorderTimer import serienRecBoxTimer
		removed = serienRecBoxTimer.removeTimerEntry(title, serien_time, serien_eit)
		if not removed:
			print "[SerienRecorder] enigma2 NOOOTTT removed"
		else:
			print "[SerienRecorder] enigma2 Timer removed."

		self.database.removeTimer(serien_name, staffel, episode, None, serien_time, serien_channel, (serien_eit if serien_eit > 0 else None))

		self.changesMade = True
		self.readTimer(False)
		self['title'].instance.setForegroundColor(parseColor("red"))
		self['title'].setText("Timer '- %s -' entfernt." % serien_name)

	def keyRed(self):
		check = self['menu_list'].getCurrent()
		if check is None:
			print "[SerienRecorder] Serien Timer leer."
			return
		else:
			serien_name = self['menu_list'].getCurrent()[0][0]
			staffel = self['menu_list'].getCurrent()[0][1]
			episode = self['menu_list'].getCurrent()[0][2]
			serien_title = self['menu_list'].getCurrent()[0][3]
			serien_time = self['menu_list'].getCurrent()[0][4]
			serien_channel = self['menu_list'].getCurrent()[0][5]
			serien_eit = self['menu_list'].getCurrent()[0][7]

			print self['menu_list'].getCurrent()[0]

			if config.plugins.serienRec.confirmOnDelete.value:
				self.session.openWithCallback(self.callDeleteSelectedTimer, MessageBox, "Soll '%s - S%sE%s - %s' wirklich entfernt werden?" %
				                              (serien_name, str(staffel).zfill(2), str(episode).zfill(2),
				                              re.sub("\Adump\Z", "(Manuell hinzugefügt !!)", serien_title)),
				                              MessageBox.TYPE_YESNO, default=False)
			else:
				self.removeTimer(serien_name, staffel, episode, serien_title, serien_time, serien_channel, serien_eit)

	def keyYellow(self):
		if self.filter:
			self['text_yellow'].setText("Zeige nur neue Timer")
			self.filter = False
		else:
			self['text_yellow'].setText("Zeige auch alte Timer")
			self.filter = True
		self.readTimer()

	def keyBlue(self):
		if config.plugins.serienRec.confirmOnDelete.value:
			self.session.openWithCallback(self.removeNewTimerFromDB, MessageBox,
			                              "Sollen wirklich alle noch ausstehenden Timer von der Box und aus der Datenbank entfernt werden?",
			                              MessageBox.TYPE_YESNO, default=False)
		else:
			self.removeNewTimerFromDB(True)

	def removeNewTimerFromDB(self, answer):
		if answer:
			current_time = int(time.time())
			timers = self.database.getAllTimer(current_time)
			for timer in timers:
				(serie, staffel, episode, title, start_time, stbRef, webChannel, eit, activeTimer) = timer
				self.removeTimer(serie, staffel, episode, title, start_time, webChannel, eit)

			self.readTimer(False)
			self['title'].instance.setForegroundColor(parseColor("red"))
			self['title'].setText("Alle noch ausstehenden Timer wurden entfernt.")
		else:
			return

	def removeOldTimerFromDB(self, answer):
		if answer:
			self.database.removeAllOldTimer()
			self.database.rebuild()

			self.readTimer(False)
			self['title'].instance.setForegroundColor(parseColor("red"))
			self['title'].setText("Alle alten Timer wurden entfernt.")
		else:
			return

	def dropAllTimer(self):
		if config.plugins.serienRec.confirmOnDelete.value:
			self.session.openWithCallback(self.removeOldTimerFromDB, MessageBox,
			                              "Sollen wirklich alle alten Timer aus der Datenbank entfernt werden?",
			                              MessageBox.TYPE_YESNO,
			                              default=False)
		else:
			self.removeOldTimerFromDB(True)

	def getCover(self):
		check = self['menu_list'].getCurrent()
		if check is None:
			return

		serien_name = self['menu_list'].getCurrent()[0][0]
		serien_id = None
		url = self.database.getMarkerURL(serien_name)
		if url:
			serien_id = url
		SerienRecorder.getCover(self, serien_name, serien_id)

	def keyLeft(self):
		self['menu_list'].pageUp()
		self.getCover()

	def keyRight(self):
		self['menu_list'].pageDown()
		self.getCover()

	def keyDown(self):
		self['menu_list'].down()
		self.getCover()

	def keyUp(self):
		self['menu_list'].up()
		self.getCover()

	def __onClose(self):
		self.stopDisplayTimer()

	def keyCancel(self):
		if config.plugins.serienRec.refreshViews.value:
			self.close(self.changesMade)
		else:
			self.close(False)
Ejemplo n.º 15
0
class StreamTVList(Screen):
    skin = """
		<screen name="StreamTVList" position="center,center" size="600,350" title="StreamTV List">
			<widget name="streamlist" position="0,0" size="600,350" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
	        </screen>
		"""

    def __init__(self, session):
        self.session = session
        Screen.__init__(self, session)
        self["actions"] = ActionMap(
            [
                "OkCancelActions",
                "ShortcutActions",
                "WizardActions",
                "ColorActions",
                "SetupActions",
                "NumberActions",
                "MenuActions",
            ],
            {
                "ok": self.keyOK,
                "cancel": self.keyCancel,
                "up": self.keyUp,
                "down": self.keyDown,
                "left": self.keyLeft,
                "right": self.keyRight,
            },
            -1,
        )

        self.streamBin = resolveFilename(SCOPE_PLUGINS, "Extensions/StreamTV/rtmpdump")
        self.streamFile = resolveFilename(SCOPE_PLUGINS, "Extensions/StreamTV/stream.xml")

        self.streamList = []
        self.makeStreamList()

        self.streamMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
        self.streamMenuList.l.setFont(0, gFont("Regular", 22))
        self.streamMenuList.l.setFont(1, gFont("Regular", 18))
        self.streamMenuList.l.setItemHeight(37)
        self["streamlist"] = self.streamMenuList
        self.streamMenuList.setList(map(streamListEntry, self.streamList))

        self.onLayoutFinish.append(self.layoutFinished)

        self.rtmpConsole = None
        self.beforeService = None
        self.currentService = None
        self.playerStoped = False
        self.serviceDoCommand = None

        self.keyLocked = False

    def layoutFinished(self):
        rc = os.popen("ps -ef | grep rtmpdump | grep -v grep").read()
        print "a process already running :", rc
        if rc is not None:
            if rc.strip() != "":
                os.system("killall -INT rtmpdump")

    def keyLeft(self):
        if self.keyLocked:
            return
        self["streamlist"].pageUp()

    def keyRight(self):
        if self.keyLocked:
            return
        self["streamlist"].pageDown()

    def keyUp(self):
        if self.keyLocked:
            return
        self["streamlist"].up()

    def keyDown(self):
        if self.keyLocked:
            return
        self["streamlist"].down()

    def keyCancel(self):
        self.cbAppClosed(True)
        self.close()

    def keyOK(self):
        if self.keyLocked:
            return
        self.keyLocked = True
        self.rtmpConsole = None
        self.beforeService = None
        self.currentService = None
        self.playerStoped = False
        self.serviceDoCommand = None

        streamInfo = self["streamlist"].getCurrent()[0][1]
        uriInfo = streamInfo.get("uri")
        typeInfo = streamInfo.get("type").split(":")

        protocol = typeInfo[0]
        url = uriInfo.get("URL")
        if protocol == "rtmp":
            self.layoutFinished()
            self.rtmpConsole = eConsoleAppContainer()
            self.rtmpConsole.dataAvail.append(self.cbDataAvail)
            self.rtmpConsole.appClosed.append(self.cbAppClosed)
            self.rtmpConsole.execute(self.makeCommand(uriInfo))
        elif protocol in ("rtsp", "http", "hls"):
            serviceType = typeInfo[1]
            bufferSize = typeInfo[2]
            self.doStreamAction(url, serviceType, bufferSize)

    def doStreamAction(self, url=None, serviceType="4097", bufferSize=None):
        if url is None:
            url = "/tmp/stream.avi"
            self.streamPlayerTimer.stop()
            # if os.path.exists(url):
            # 	os.unlink(url)
        try:
            serviceType = int(serviceType)
        except:
            serviceType = 4097
        try:
            bufferSize = int(bufferSize)
        except:
            bufferSize = None

        service = eServiceReference(serviceType, 0, url)
        # if bufferSize is not None:
        # 	service.setData(2, bufferSize*1024)

        streamInfo = self["streamlist"].getCurrent()[0][1]
        uriInfo = streamInfo.get("uri")
        self.beforeService = self.session.nav.getCurrentlyPlayingServiceReference()
        self.currentService = self.session.openWithCallback(
            self.cbFinishedStream,
            StreamTVPlayer,
            service,
            cbServiceCommand=self.cbServiceCommand,
            chName=str(streamInfo.get("name")),
            chURL=str(uriInfo.get("URL")),
            chIcon=str(streamInfo.get("icon")),
        )

    def cbServiceCommand(self, params=None):
        if params is None:
            self.playerStoped = True
            return
        if params[0] == "docommand":
            self.serviceDoCommand = params[1]

    def cbAppClosed(self, ret):
        print ret
        self.doConsoleStop()
        if self.currentService is not None and not self.playerStoped:
            self.serviceDoCommand("bypass_exit")
            message = "The connection was terminated from the stream server."
            self.session.open(MessageBox, message, type=MessageBox.TYPE_INFO)
            self.currentService.close()
            self.currentService = None
            self.serviceDoCommand = None

    def cbDataAvail(self, data):
        print data
        if str(data) == "Connected...":
            self.streamPlayerTimer = eTimer()
            self.streamPlayerTimer.timeout.get().append(self.doStreamAction)
            self.streamPlayerTimer.start(1000)

    def cbFinishedStream(self):
        self.doConsoleStop()
        self.session.nav.playService(self.beforeService)
        print "player done!!"

    def doConsoleStop(self):
        self.keyLocked = False
        if self.rtmpConsole is not None:
            self.rtmpConsole.sendCtrlC()
            self.rtmpConsole = None

    def makeCommand(self, uriInfo):
        def appendCommand(key, option):
            try:
                d = uriInfo.get(key)
                if d is not None:
                    return "-%s %s " % (option, d)
            except:
                pass
            return ""

        command = "%s -v " % (self.streamBin)
        command += appendCommand("URL", "r")
        command += appendCommand("PLAYPATH", "y")
        command += appendCommand("SWFURL", "W")
        return command

    def makeStreamList(self):
        streamDB = StreamURIParser(self.streamFile).parseStreamList()
        self.streamList = []
        for x in streamDB:
            self.streamList.append((x.get("name"), x))
Ejemplo n.º 16
0
class SkyAddedEdit(Screen):
	
	def __init__(self, session):
		self.session = session
		
		path = "%s/skins/%s/screen_added_edit.xml" % (getPluginPath(), config.plugins.skyrecorder.anytime_skin.value)
		with open(path, "r") as f:
			self.skin = f.read()
			f.close()
			
		Screen.__init__(self, session)
		
		pluginName = config.plugins.skyrecorder.pluginname.value
		contentSize = config.plugins.skyrecorder.contentsize.value

		self["actions"]  = ActionMap(["OkCancelActions", "ShortcutActions", "EPGSelectActions", "WizardActions", "ColorActions", "NumberActions", "MenuActions", "MoviePlayerActions"], {
			"cancel": self.keyCancel,
			"green" : self.keyDel,
			"red" : self.keyDelAll,
		}, -1)
		
		self['title'] = Label(pluginName)
		self['head'] = Label("gemerkte Timer")
		
		self.addededit_list = []
		self.streamMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.streamMenuList.l.setFont(0, gFont('Regular', contentSize))
		self.streamMenuList.l.setItemHeight(25)
		self['addededit'] = self.streamMenuList
		
		self.last_index = 0	
	
		self.onLayoutFinish.append(self.readAdded)
	
	
	def skyAddedEditListEntry(self,entry):
		if str(entry[5]) == "Hidden":
			infostr = str(entry[5]) + ": " + str(entry[1]) + " - " + str(entry[2]) 
		else:
			infostr = str(entry[5])
		return [entry,(eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 750, 25, 0, RT_HALIGN_LEFT, infostr)]
	
	def readAdded(self):
		try:
			sql.cur.execute('SELECT SQLITE_VERSION()')
		except Exception:
			sys.exc_clear()
			try:
				sql.connect()
			except Exception:
				return
		
		self.addededit_list = []
		# possible fields are:
		# id_added,title,description,id_channel,id_genre,recordedfile,begin
		rows = sql.readAddedEdit()
		resultCount = len(rows)
		
		for t_row in rows:
			row = list(t_row)
			self.addededit_list.append(row)
		
		#self.addededit_list.sort()
		self.addededit_list = sorted(self.addededit_list, key=lambda x: x[6], reverse=True)
		self.streamMenuList.setList(map(self.skyAddedEditListEntry, self.addededit_list))
		if self.last_index < resultCount:
			self['addededit'].moveToIndex(self.last_index)
	
#	def removeTimer(self):
#		entry_dict = None
#		entry_dict = {}
#		entry_dict['name'] = title
#		entry_dict['description'] = desc
#		entry_dict['timer_starttime'] = timer_starttime
#		entry_dict['channelref'] = channelref
#			
#		retval = SkyTimerRec.removeTimerEntry(entry_dict)
#		if retval:
#			sql.updateEventListStatus(self.id_events,starttime,"False")
#			if config.plugins.skyrecorder.silent_timer_mode.value == False:
#				message = self.session.open(MessageBox, _("Timer gelöscht!"), MessageBox.TYPE_INFO, timeout=3)
#		self.getTimerEventList()
#		return
			
	def keyDel(self):
		exist = self['addededit'].getCurrent()
		if exist == None:
			return
		id_added = self['addededit'].getCurrent()[0][0]
		self.last_index = self['addededit'].getSelectionIndex()
		sql.resetAdded(id_added)
		print "[skyrecorder] deleted id_added: %s" % id_added
		self.readAdded()

	def keyDelAll(self):
		exist = self['addededit'].getCurrent()
		if exist == None:
			return
		id_added = self['addededit'].getCurrent()[0][0]
		sql.resetAdded()
		print "[skyrecorder] truncated table added"
		self.readAdded()
					
	def keyCancel(self):
		self.close()
Ejemplo n.º 17
0
class StreamTVList(Screen):
	skin = 	"""
		<screen name="StreamTVList" position="center,120" size="600,380" title="StreamTV List">
			<widget name="streamlist" position="0,0" size="600,350" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
			<widget name="infolabel" position="0,360" size="50,20" font="Regular;18" halign="left" />
			<widget name="infomation" position="50,360" size="550,20" font="Regular;18" halign="left" />
	        </screen>
		"""
	def __init__(self, session):
		self.session = session
		Screen.__init__(self, session)
		self["actions"]  = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", "SetupActions", "NumberActions", "MenuActions"], {
			"ok"    : self.keyOK,
			"cancel": self.keyCancel,
			"up"    : self.keyUp,
			"down"  : self.keyDown,
			"left"  : self.keyLeft,
			"right" : self.keyRight,
		}, -1)

		self.streamFile = resolveFilename(SCOPE_PLUGINS, "Extensions/StreamTV/stream.xml")

		self.streamList = []
		self.makeStreamList()

		self.streamMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.streamMenuList.l.setFont(0, gFont('Regular', 22))
		self.streamMenuList.l.setFont(1, gFont('Regular', 18))
		self.streamMenuList.l.setItemHeight(37) 
		self['streamlist'] = self.streamMenuList
		self.streamMenuList.setList(map(streamListEntry, self.streamList))

		self["infolabel"] = Label("URL :")
		self["infomation"] = Label(" ")
		self.updateInfomation()

		self.onLayoutFinish.append(self.layoutFinished)

		self.beforeService  = None
		self.currentService = None
		self.playerStoped   = False
		self.serviceDoCommand = None

		self.keyLocked = False

	def layoutFinished(self):
		rc = os.popen('ps -ef | grep rtmpdump | grep -v grep').read()
		print "a process already running :", rc
		if rc is not None:
			if rc.strip() != '':
				os.system('killall -INT rtmpdump')

	def updateInfomation(self):
		infomation = ''
		try:
			streamInfo = self["streamlist"].getCurrent()[0][1]
			infomation = streamInfo.get('uri').split()[0]
		except:	infomation = ' '
		self["infomation"].setText(infomation)

	def keyLeft(self):
		if self.keyLocked:
			return
		self['streamlist'].pageUp()
		self.updateInfomation()

	def keyRight(self):
		if self.keyLocked:
			return
		self['streamlist'].pageDown()
		self.updateInfomation()

	def keyUp(self):
		if self.keyLocked:
			return
		self['streamlist'].up()
		self.updateInfomation()

	def keyDown(self):
		if self.keyLocked:
			return
		self['streamlist'].down()
		self.updateInfomation()

	def keyCancel(self):
		self.close()

	def keyOK(self):
		if self.keyLocked:
			return
		self.keyLocked = True
		self.beforeService  = None
		self.currentService = None
		self.playerStoped   = False
		self.serviceDoCommand = None

		streamInfo = self["streamlist"].getCurrent()[0][1]
		uri = streamInfo.get('uri')
		typeInfo = streamInfo.get('type').split(':')

		serviceType = typeInfo[1]
		bufferSize  = typeInfo[2]
		self.doStreamAction(uri, serviceType, bufferSize)

	def doStreamAction(self, uri=None, serviceType='4097', bufferSize=None):
		try:
			serviceType = int(serviceType)
		except:	serviceType = 4097
		try:
			bufferSize = int(bufferSize)
		except:	bufferSize = None

		streamInfo = self["streamlist"].getCurrent()[0][1]
		serviceRef = "%(TYPE)d:0:1:0:0:0:0:0:0:0:%(URI)s:%(NAME)s" % {
			'TYPE' :serviceType,
			'URI'  :uri.replace(':','%3a'),
			'NAME' :streamInfo.get('name')
		}
		service = eServiceReference(serviceRef)
		#if bufferSize is not None:
		#	service.setData(2, bufferSize*1024)

		self.beforeService  = self.session.nav.getCurrentlyPlayingServiceReference()
		self.currentService = self.session.openWithCallback(self.cbFinishedStream, 
								    StreamTVPlayer, 
								    service, 
								    cbServiceCommand=self.cbServiceCommand,
								    chName=str(streamInfo.get('name')),
								    chURL =str(streamInfo.get('uri')),
								    chIcon=str(streamInfo.get('icon'))
		)

	def cbServiceCommand(self, params=None):
		if params is None:
			self.playerStoped = True
			return
		if params[0] == 'docommand':
			self.serviceDoCommand = params[1]

	def cbFinishedStream(self):
		self.keyLocked = False
		self.session.nav.playService(self.beforeService)
		print 'player done!!'

	def makeStreamList(self):
		streamDB = parseStreamDB(self.streamFile)
		self.streamList = []
		for x in streamDB:
			self.streamList.append((x.get('name'), x))
Ejemplo n.º 18
0
class Favscreen(Screen):
    def __init__(self, session):
        self.session = session
        if DESKHEIGHT < 1000:
            skin = '/usr/lib/enigma2/python/Plugins/Extensions/SatVenusPanel/Skin/radiofavHD.xml'
        else:
            skin = '/usr/lib/enigma2/python/Plugins/Extensions/SatVenusPanel/Skin/radiofavFHD.xml'
        f = open(skin, 'r')
        self.skin = f.read()
        f.close()
        Screen.__init__(self, session)
        self['key_red'] = Button(_('Exit'))
        self['key_yellow'] = Button(_('Delete'))
        self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference(
        )
        try:
            self.session.nav.stopService()
        except:
            pass

        self.onClose.append(self.__onClose)
        self['actions'] = ActionMap(
            ['SetupActions', 'ColorActions'], {
                'ok': self.ok,
                'green': self.ok,
                'yellow': self.Delselected,
                'red': self.close,
                'cancel': self.close
            }, -2)
        self.list = MenuList([])
        self['ButtonGreen'] = Pixmap()
        self['ButtonGreentext'] = Label(_('Play'))
        self['ButtonYellow'] = Pixmap()
        self['ButtonYellowtext'] = Label(_('Delete'))
        self['ButtonRed'] = Pixmap()
        self['ButtonRedtext'] = Label(_('Exit'))
        self['stationmenu'] = self.list
        lst = lsSelected()
        self.list.setList(lst)

    def Delselected(self):
        try:
            sel = self['stationmenu'].getSelectedIndex()
            config.plugins.Cradio.stations_count.value = config.plugins.Cradio.stations_count.value - 1
            config.plugins.Cradio.stations_count.save()
            del config.plugins.Cradio.stations[sel]
            config.plugins.Cradio.stations.save()
            config.plugins.Cradio.save()
            configfile.save()
            lst = []
            lst = lsSelected()
            self['stationmenu'].setList(lst)
            if config.plugins.Cradio.stations_count.value == 0:
                self['key_green'].hide()
            else:
                self['key_green'].show()
        except:
            pass

    def playServiceStream(self, url):
        try:
            self.session.nav.stopService()
            sref = eServiceReference(4097, 0, url)
            self.session.nav.playService(sref)
            self.currentStreamingURL = url
        except:
            pass

    def ok(self):
        try:
            station = self.list.getSelectionIndex()
            currentindex = station
            cname = config.plugins.Cradio.stations[station].code.value
            tup1 = cname.split(',')
            cstation = tup1[0]
            curl = tup1[1]
            self.currentStreamingURL = ''
            self.currentStreamingStation = ''
            self.session.nav.stopService()
            self.currentStreamingStation = cstation
            self.playServiceStream(curl)
            currentservice = self.CurrentService
            self.session.open(Playscreen, cstation, currentservice,
                              currentindex)
        except:
            pass

    def playServiceStream(self, url):
        try:
            self.session.nav.stopService()
            sref = eServiceReference(4097, 0, url)
            self.session.nav.playService(sref)
            self.currentStreamingURL = url
        except:
            pass

    def __onClose(self):
        self.session.nav.playService(self.CurrentService)
Ejemplo n.º 19
0
class serienRecSearchResultScreen(serienRecBaseScreen, Screen, HelpableScreen):
    def __init__(self, session, serien_name):
        serienRecBaseScreen.__init__(self, session)
        Screen.__init__(self, session)
        HelpableScreen.__init__(self)

        self.displayTimer = None
        self.displayMode = 2
        self.session = session
        self.picload = ePicLoad()
        self.serien_name = serien_name
        self.serienlist = []
        self.skin = None
        self.displayTimer_conn = None

        self["actions"] = HelpableActionMap(
            self, "SerienRecorderActions", {
                "ok": (self.keyOK, "Marker für ausgewählte Serie hinzufügen"),
                "cancel": (self.keyCancel, "zurück zur vorherigen Ansicht"),
                "left": (self.keyLeft, "zur vorherigen Seite blättern"),
                "right": (self.keyRight, "zur nächsten Seite blättern"),
                "up": (self.keyUp, "eine Zeile nach oben"),
                "down": (self.keyDown, "eine Zeile nach unten"),
                "red": (self.keyRed, "zurück zur vorherigen Ansicht"),
                "blue": (self.keyBlue, "Serie manuell suchen"),
                "menu":
                (self.recSetup, "Menü für globale Einstellungen öffnen"),
                "startTeletext":
                (self.wunschliste,
                 "Informationen zur ausgewählten Serie auf Wunschliste anzeigen"
                 ),
                "0":
                (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
                "3": (self.showProposalDB,
                      "Liste der Serien/Staffel-Starts anzeigen"),
                "4": (self.serieInfo,
                      "Informationen zur ausgewählten Serie anzeigen"),
                "6":
                (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
                "7": (self.showWishlist,
                      "Merkzettel (vorgemerkte Folgen) anzeigen"),
            }, -1)
        self.helpList[0][2].sort()

        self["helpActions"] = ActionMap([
            "SerienRecorderActions",
        ], {
            "displayHelp": self.showHelp,
            "displayHelp_long": self.showManual,
        }, 0)

        self.setupSkin()

        self.loading = True

        self.onLayoutFinish.append(self.searchSerie)
        self.onClose.append(self.__onClose)
        self.onLayoutFinish.append(self.setSkinProperties)

    def callHelpAction(self, *args):
        HelpableScreen.callHelpAction(self, *args)

    def setSkinProperties(self):
        super(self.__class__, self).setSkinProperties()

        self['text_red'].setText("Abbrechen")
        self['text_ok'].setText("Marker hinzufügen")
        self['text_blue'].setText("Suche wiederholen")

        super(self.__class__, self).startDisplayTimer()

    def setupSkin(self):
        self.skin = None
        InitSkin(self)

        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.chooseMenuList.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList.l.setItemHeight(int(25 * skinFactor))
        self['menu_list'] = self.chooseMenuList
        self['menu_list'].show()

        if config.plugins.serienRec.showCover.value:
            self['cover'].show()

        if not config.plugins.serienRec.showAllButtons.value:
            self['bt_red'].show()
            self['bt_ok'].show()
            self['bt_blue'].show()
            self['bt_exit'].show()
            self['bt_text'].show()
            self['bt_info'].show()
            self['bt_menu'].show()

            self['text_red'].show()
            self['text_ok'].show()
            self['text_blue'].show()
            self['text_0'].show()
            self['text_1'].show()
            self['text_2'].show()
            self['text_3'].show()
            self['text_4'].show()

    def updateMenuKeys(self):
        updateMenuKeys(self)

    def serieInfo(self):
        if self.loading or self['menu_list'].getCurrent() is None:
            return

        serien_name = self['menu_list'].getCurrent()[0][0]
        serien_wlid = self['menu_list'].getCurrent()[0][2]
        serien_fsid = self['menu_list'].getCurrent()[0][3]
        from .SerienRecorderSeriesInfoScreen import serienRecShowInfo
        self.session.open(serienRecShowInfo, serien_name, serien_wlid,
                          serien_fsid)

    def setupClose(self, result):
        super(self.__class__, self).setupClose(result)
        if result[1]:
            self.searchSerie()

    def searchSerie(self, start=0):
        print("[SerienRecorder] suche ' %s '" % self.serien_name)
        self['title'].setText("Suche nach ' %s '" % self.serien_name)
        self['title'].instance.setForegroundColor(parseColor("foreground"))
        if start == 0:
            self.serienlist = []

        searchResults = downloadSearchResults(self.serien_name, start)
        searchResults.start()
        searchResults.join()

        self.results(searchResults.getData())

    def results(self, serienlist):
        (startOffset, moreResults, searchResults) = serienlist
        self.serienlist.extend(searchResults)
        self['title'].setText("Die Suche nach ' %s ' ergab %s Treffer." %
                              (self.serien_name, str(len(self.serienlist))))
        self['title'].instance.setForegroundColor(parseColor("foreground"))

        # deep copy list
        resultList = self.serienlist[:]

        if moreResults > 0:
            resultList.append(("", "", "", ""))
            resultList.append(
                ("=> Weitere Ergebnisse laden?", str(moreResults), "-1", ""))
        self.chooseMenuList.setList(list(map(self.buildList, resultList)))
        self['menu_list'].moveToIndex(startOffset)
        self.loading = False
        self.getCover()

    @staticmethod
    def buildList(entry):
        (serien_name, serien_info, serien_wlid, serien_fsid) = entry

        # weitere Ergebnisse Eintrag
        if serien_wlid == "-1":
            serien_info = ""

        # name_Serie = doReplaces(name_Serie)

        return [
            entry,
            (eListboxPythonMultiContent.TYPE_TEXT, 40, 0, 500 * skinFactor,
             25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER,
             serien_name),
            (eListboxPythonMultiContent.TYPE_TEXT, 600 * skinFactor, 0,
             350 * skinFactor, 25 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, serien_info)
        ]

    @staticmethod
    def createMarker(serien_wlid, serien_name, serien_info, serien_fsid):
        result = False

        database = SRDatabase(SerienRecorder.serienRecDataBaseFilePath)
        if config.plugins.serienRec.activateNewOnThisSTBOnly.value:
            boxID = None
        else:
            boxID = config.plugins.serienRec.BoxID.value

        if database.addMarker(str(serien_wlid), serien_name, serien_info,
                              serien_fsid, boxID, 0):
            from .SerienRecorderLogWriter import SRLogger
            SRLogger.writeLog(
                "Ein Serien-Marker für '%s (%s)' wurde angelegt" %
                (serien_name, serien_info), True)
            result = True

        return result

    def keyOK(self):
        if self.loading or self['menu_list'].getCurrent() is None:
            return

        serien_name = self['menu_list'].getCurrent()[0][0]
        serien_info = self['menu_list'].getCurrent()[0][1]
        serien_wlid = self['menu_list'].getCurrent()[0][2]
        serien_fsid = self['menu_list'].getCurrent()[0][3]
        #print(serien_name, serien_info, serien_wlid, serien_fsid)

        if serien_wlid == "":
            return

        if serien_wlid == "-1":
            self.chooseMenuList.setList([])
            self.searchSerie(int(serien_info))
            return

        self.serien_name = ""
        if serienRecSearchResultScreen.createMarker(serien_wlid, serien_name,
                                                    serien_info, serien_fsid):
            self['title'].setText("Marker '%s (%s)' wurde angelegt." %
                                  (serien_name, serien_info))
            self['title'].instance.setForegroundColor(parseColor("green"))

            from .SerienRecorder import getCover
            getCover(self, serien_name, serien_wlid, serien_fsid, False, True)

            if config.plugins.serienRec.openMarkerScreen.value:
                self.close(str(serien_wlid))
        else:
            self['title'].setText("Marker '%s (%s)' ist schon vorhanden." %
                                  (serien_name, serien_info))
            self['title'].instance.setForegroundColor(parseColor("red"))

    def keyRed(self):
        self.close()

    def keyBlue(self):
        self.session.openWithCallback(self.wSearch,
                                      NTIVirtualKeyBoard,
                                      title="Serien Titel eingeben:",
                                      text=self.serien_name)

    def wSearch(self, serien_name):
        if serien_name:
            #print(serien_name)
            self.chooseMenuList.setList([])
            self['title'].setText("")
            self['title'].instance.setForegroundColor(parseColor("foreground"))
            self.serien_name = serien_name
            self.serienlist = []
            self.searchSerie()

    def keyLeft(self):
        self['menu_list'].pageUp()
        self.getCover()

    def keyRight(self):
        self['menu_list'].pageDown()
        self.getCover()

    def keyDown(self):
        self['menu_list'].down()
        self.getCover()

    def keyUp(self):
        self['menu_list'].up()
        self.getCover()

    def wunschliste(self):
        serien_id = self['menu_list'].getCurrent()[0][2]
        super(self.__class__, self).wunschliste(serien_id)

    def getCover(self):
        if self.loading or self['menu_list'].getCurrent() is None:
            return

        serien_name = self['menu_list'].getCurrent()[0][0]
        serien_id = self['menu_list'].getCurrent()[0][2]
        serien_fsid = self['menu_list'].getCurrent()[0][3]
        SerienRecorder.getCover(self, serien_name, serien_id, serien_fsid)

    def __onClose(self):
        self.stopDisplayTimer()

    def keyCancel(self):
        self['title'].instance.setForegroundColor(parseColor("foreground"))
        self.close()
Ejemplo n.º 20
0
class SkyChannelEditor(Screen):
	
	def __init__(self, session, last_index):
		self.session = session
		self.last_index = last_index
		
		path = "%s/skins/%s/screen_channel_editor.xml" % (getPluginPath(), config.plugins.skyrecorder.anytime_skin.value)
		with open(path, "r") as f:
			self.skin = f.read()
			f.close()
			
		Screen.__init__(self, session)
		
		pluginName = config.plugins.skyrecorder.pluginname.value
		contentSize = config.plugins.skyrecorder.contentsize.value
		
		self.sky_chlist = buildSkyChannellist()

		self["actions"]  = ActionMap(["OkCancelActions", "ShortcutActions", "ColorActions", "MenuActions"], {
			"ok"    : self.keyOK,
			"cancel": self.keyCancel
		}, -1)
		
		self['title'] = Label(pluginName)
		self['head'] = Label("Skiplist")
		
		self.channellist = []
		self.streamMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.streamMenuList.l.setFont(0, gFont('Regular', contentSize))
		self.streamMenuList.l.setItemHeight(25)
		self['channeledit'] = self.streamMenuList
		
		self.sky_skipwords_path = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/sky_skipwords"
		self.sky_skipwords_path_tmp = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/sky_skipwords.tmp"
				
		self.onShown.append(self.readChannellist)
		#self.onLayoutFinish.append(self.readChannellist)
	
	
	def skyChannellistSelectListEntry(self,entry):
		# check, if channel_stb was found in servicelist
		if entry[3]:
			pic = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/plus.png"
		else:
			pic = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/minus.png"

		icon = LoadPixmap(pic)
		
		return [entry,
				(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 15, 5, 20, 18, icon),
				(eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 275, 25, 0, RT_HALIGN_LEFT, str(entry[1])),
				(eListboxPythonMultiContent.TYPE_TEXT, 325, 0, 550, 25, 0, RT_HALIGN_LEFT, str(entry[2]))
				]

	
	def readChannellist(self):
		try:
			sql.cur.execute('SELECT SQLITE_VERSION()')
		except Exception:
			sys.exc_clear()
			try:
				sql.connect()
			except Exception:
				return
				
		self.channellist = []

		for (id_channel,channel,channel_stb,status,position,channel_id_sky) in sql.readChannelAll():
			# check, if channel_stb was found in servicelist
			if not channel_stb:
				continue
			if self.checkChannelByName(channel_stb):
				self.channellist.append((id_channel,channel,channel_stb,True))
			else:
				self.channellist.append((id_channel,channel,channel_stb,False))

		print "[skyrecorder] reload channellist."

		self.streamMenuList.setList(map(self.skyChannellistSelectListEntry, sorted(self.channellist, key=lambda s_channel: s_channel[1])))
		if self.last_index < len(self.channellist):
			self['channeledit'].moveToIndex(self.last_index)
			
	
	def checkChannelByName(self, channel):
		for (channelname,channelref) in self.sky_chlist:
			if channelname.lower() == channel.lower():
				return True
		return False
	
	def keyOK(self):
		exist = self['channeledit'].getCurrent()
		if exist == None:
			return
		self.id_channel = self['channeledit'].getCurrent()[0][0]
		channel_stb = self['channeledit'].getCurrent()[0][2]
		self.last_index = self['channeledit'].getSelectionIndex()
		if not channel_stb:
			return
		print channel_stb
		self.session.openWithCallback(self.changeChannelName, VirtualKeyBoard, title = ("Sendername eingeben, wie er\nin der STB-Kanalliste benannt ist:"), text = channel_stb)


	def changeChannelName(self, word):
		if not self.id_channel:
			return
		if word and len(word) > 0:
			sql.updateChannelnameSTB(self.id_channel,word)
			print "[skyrecorder] channel_stb changed: %s" % word
		self.readChannellist()

			
	def keyCancel(self):
		self.close()
class ArchiverInfoScreen(Screen):
    skin = """
		<screen position="40,80" size="1200,600" title="" >
			<widget name="list_left_head" position="10,10" size="1180,60" font="Regular;20" foregroundColor="#00fff000"/>
			<widget name="list_left" position="10,85" size="1180,470" scrollbarMode="showOnDemand"/>
			<widget source="key_red" render="Label" position="100,570" size="260,25" transparent="1" font="Regular;20"/>
			<widget source="key_green" render="Label" position="395,570" size="260,25"  transparent="1" font="Regular;20"/>
			<widget source="key_yellow" render="Label" position="690,570" size="260,25" transparent="1" font="Regular;20"/>
			<widget source="key_blue" render="Label" position="985,570" size="260,25" transparent="1" font="Regular;20"/>
			<ePixmap position="70,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_red.png" transparent="1" alphatest="on"/>
			<ePixmap position="365,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_green.png" transparent="1" alphatest="on"/>
			<ePixmap position="660,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_yellow.png" transparent="1" alphatest="on"/>
			<ePixmap position="955,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_blue.png" transparent="1" alphatest="on"/>
		</screen>"""

    def __init__(self, session, list, sourceDir, filename):
        self.session = session

        self.pname = pname
        self.pdesc = pdesc
        self.pversion = pversion

        self.list = list
        self.sourceDir = sourceDir
        self.filename = filename
        Screen.__init__(self, session)

        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        font = skin.fonts.get("FileList", ("Regular", 20, 25))
        self.chooseMenuList.l.setFont(0, gFont(font[0], font[1]))
        self.chooseMenuList.l.setItemHeight(font[2])
        self['list_left'] = self.chooseMenuList

        self["list_left_head"] = Label("%s%s" %
                                       (self.sourceDir, self.filename))

        self["key_red"] = StaticText(_("Cancel"))
        self["key_green"] = StaticText(_("OK"))
        self["key_yellow"] = StaticText("")
        self["key_blue"] = StaticText("")

        self["setupActions"] = ActionMap(["SetupActions"], {
            "cancel": self.cancel,
            "save": self.cancel,
            "ok": self.cancel,
        }, -2)

        self.onLayoutFinish.append(self.onLayout)

    def onLayout(self):
        self.setTitle(self.pname)
        if len(self.list) != 0:
            self.chooseMenuList.setList(map(self.ListEntry, self.list))

    def ListEntry(self, entry):
        x, y, w, h = skin.parameters.get("FileListName", (10, 0, 1180, 25))
        x = 10
        w = self['list_left'].l.getItemSize().width()
        flags = RT_HALIGN_LEFT
        if 'Plugins.Extensions.FileCommander.addons.unzip.UnpackInfoScreen' in self:
            flags = RT_HALIGN_LEFT | RT_VALIGN_CENTER
            y *= 2
        return [
            entry,
            MultiContentEntryText(pos=(x, int(y)),
                                  size=(w - x, h),
                                  font=0,
                                  flags=flags,
                                  text=entry[0])
        ]

    def cancel(self):
        self.close()
class serienRecMarker(serienRecBaseScreen, Screen, HelpableScreen):
    def __init__(self, session, toBeSelect=None):
        serienRecBaseScreen.__init__(self, session)
        Screen.__init__(self, session)
        HelpableScreen.__init__(self)
        self.session = session
        self.picload = ePicLoad()
        self.skin = None
        self.displayMode = 0
        self.displayTimer = None
        self.displayTimer_conn = None
        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.chooseMenuList_popup = MenuList(
            [], enableWrapAround=True, content=eListboxPythonMultiContent)
        self.database = SRDatabase(serienRecDataBaseFilePath)
        self.staffel_liste = []
        self.sender_liste = []
        self.AbEpisode = 0
        self.columnWidth = int(
            config.plugins.serienRec.markerColumnWidth.value)

        if config.plugins.serienRec.firstscreen.value == "0":
            self.showMainScreen = True
        else:
            self.showMainScreen = False

        actions = {
            "ok": (self.keyOK, "Zur Staffelauswahl"),
            "cancel": (self.keyCancel, "Zurück zur Serienplaner-Ansicht"),
            "red": (self.keyRed,
                    "Ausgewählten Serien-Marker aktivieren/deaktivieren"),
            "red_long":
            (self.keyRedLong, "Ausgewählten Serien-Marker löschen"),
            "green": (self.keyGreen, "Zur Senderauswahl"),
            "yellow":
            (self.keyYellow, "Sendetermine für ausgewählte Serie anzeigen"),
            "yellow_long": (self.resetTransmissions,
                            "Sendetermine für ausgewählte Serie zurücksetzen"),
            "blue": (self.keyBlue, "Ansicht Timer-Liste öffnen"),
            "info": (self.keyCheck, "Suchlauf für Timer starten"),
            "left": (self.keyLeft, "Zur vorherigen Seite blättern"),
            "right": (self.keyRight, "Zur nächsten Seite blättern"),
            "up": (self.keyUp, "Eine Zeile nach oben"),
            "down": (self.keyDown, "Eine Zeile nach unten"),
            "menu": (self.markerSetup, "Menü für Serien-Einstellungen öffnen"),
            "menu_long":
            (self.recSetup, "Menü für globale Einstellungen öffnen"),
            "startTeletext":
            (self.wunschliste,
             "Informationen zur ausgewählten Serie auf Wunschliste anzeigen"),
            "0": (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
            "1": (self.searchSeries, "Serie manuell suchen"),
            "2": (self.changeTVDBID, "TVDB-ID ändern"),
            "3": (self.showProposalDB,
                  "Liste der Serien/Staffel-Starts anzeigen"),
            "4": (self.serieInfo,
                  "Informationen zur ausgewählten Serie anzeigen"),
            "5": (self.episodeList,
                  "Episoden der ausgewählten Serie anzeigen"),
            "6": (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
            "7": (self.showWishlist,
                  "Merkzettel (vorgemerkte Folgen) anzeigen"),
            "8": (self.updateMarkers, "Serien-Marker aktualisieren"),
            "9": (self.disableAll,
                  "Alle Serien-Marker für diese Box-ID deaktivieren"),
        }

        if not self.showMainScreen:
            actions["cancel_long"] = (self.keyExit,
                                      "zurück zur Serienplaner-Ansicht")

        self["actions"] = HelpableActionMap(self, "SerienRecorderActions",
                                            actions, -1)
        self.helpList[0][2].sort()

        self["helpActions"] = ActionMap([
            "SerienRecorderActions",
        ], {
            "displayHelp": self.showHelp,
            "displayHelp_long": self.showManual,
        }, 0)

        self.setupSkin()

        self.modus = "menu_list"
        self.changesMade = False
        self.loading = True
        self.selected_serien_wlid = toBeSelect

        self.onLayoutFinish.append(self.setSkinProperties)
        self.onLayoutFinish.append(self.readSerienMarker)
        self.onClose.append(self.__onClose)

    def callHelpAction(self, *args):
        HelpableScreen.callHelpAction(self, *args)

    def setSkinProperties(self):
        super(self.__class__, self).setSkinProperties()

        self['text_green'].setText("Sender auswählen")
        self['text_ok'].setText("Staffel(n) auswählen")
        self['text_yellow'].setText("Sendetermine")
        self.num_bt_text[1][0] = "Serie suchen"
        self.num_bt_text[2][0] = "TVDB-ID ändern"
        self.num_bt_text[0][1] = "Episoden-Liste"
        self.num_bt_text[2][2] = "Timer suchen"
        self.num_bt_text[3][1] = "Marker aktualisieren"
        self.num_bt_text[4][1] = "Alle deaktivieren"
        self.num_bt_text[4][2] = "Setup Serie/global"
        self['text_red'].setText("Ein/Löschen")
        self['text_blue'].setText("Timer-Liste")
        if not self.showMainScreen:
            self.num_bt_text[0][2] = "Exit/Serienplaner"

        super(self.__class__, self).startDisplayTimer()

    def setupSkin(self):
        self.skin = None
        InitSkin(self)

        #normal
        self.chooseMenuList.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList.l.setItemHeight(int(70 * skinFactor))
        self['menu_list'] = self.chooseMenuList
        self['menu_list'].show()

        # popup
        self.chooseMenuList_popup.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList_popup.l.setItemHeight(int(25 * skinFactor))
        self['popup_list'] = self.chooseMenuList_popup
        self['popup_list'].hide()

        if config.plugins.serienRec.showCover.value:
            self['cover'].show()

        if not config.plugins.serienRec.showAllButtons.value:
            self['bt_red'].show()
            self['bt_green'].show()
            self['bt_ok'].show()
            self['bt_yellow'].show()
            self['bt_blue'].show()
            self['bt_exit'].show()
            self['bt_text'].show()
            self['bt_epg'].show()
            self['bt_info'].show()
            self['bt_menu'].show()

            self['text_red'].show()
            self['text_green'].show()
            self['text_ok'].show()
            self['text_yellow'].show()
            self['text_blue'].show()
            self['text_0'].show()
            self['text_1'].show()
            self['text_2'].show()
            self['text_3'].show()
            self['text_4'].show()

    def markerSetup(self):
        if self['menu_list'].getCurrent() is None:
            return
        serien_id = self['menu_list'].getCurrent()[0][0]
        serien_name = self['menu_list'].getCurrent()[0][1]
        self.selected_serien_wlid = self['menu_list'].getCurrent()[0][2]
        serien_fsid = self['menu_list'].getCurrent()[0][13]
        self.session.openWithCallback(self.setupFinished, serienRecMarkerSetup,
                                      serien_name, self.selected_serien_wlid,
                                      serien_id, serien_fsid)

    def setupFinished(self, result):
        if result:
            self.changesMade = True
        self.readSerienMarker(self.selected_serien_wlid)
        return

    def getCurrentSelection(self):
        serien_name = self['menu_list'].getCurrent()[0][1]
        serien_wlid = self['menu_list'].getCurrent()[0][2]
        serien_fsid = self['menu_list'].getCurrent()[0][13]
        return serien_name, serien_wlid, serien_fsid

    def updateMarkers(self):
        self.session.openWithCallback(
            self.executeUpdateMarkers, MessageBox,
            "Sollen die Namen der Serien-Marker aktualisieren werden?",
            MessageBox.TYPE_YESNO)

    def executeUpdateMarkers(self, execute):
        if execute:
            updatedMarkers = self.database.updateSeriesMarker(True)
            self.readSerienMarker()
            message = "Es musste kein Serien-Marker aktualisiert werden."
            if len(updatedMarkers) > 0:
                message = "Es wurden %d Serien-Marker aktualisiert.\n\nEine Liste der geänderten Marker wurde ins Log geschrieben." % len(
                    updatedMarkers)

            self.session.open(MessageBox,
                              message,
                              MessageBox.TYPE_INFO,
                              timeout=10)

    def changeTVDBID(self):
        if self.loading:
            return

        from .SerienRecorderScreenHelpers import EditTVDBID
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        editTVDBID = EditTVDBID(self, self.session, serien_name, serien_wlid,
                                serien_fsid)
        editTVDBID.changeTVDBID()

    def serieInfo(self):
        if self.loading or self['menu_list'].getCurrent() is None:
            return

        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        if serien_wlid:
            from .SerienRecorderSeriesInfoScreen import serienRecShowInfo
            self.session.open(serienRecShowInfo, serien_name, serien_wlid,
                              serien_fsid)
            #self.session.open(MessageBox, "Diese Funktion steht in dieser Version noch nicht zur Verfügung!",
            #				  MessageBox.TYPE_INFO, timeout=10)

    def episodeList(self):
        if self.modus == "menu_list" and self['menu_list'].getCurrent():
            (serien_name, serien_wlid,
             serien_fsid) = self.getCurrentSelection()
            if serien_wlid:
                self.session.open(serienRecEpisodes, serien_name, serien_wlid)

    def wunschliste(self):
        if self['menu_list'].getCurrent() is None:
            return
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        super(self.__class__, self).wunschliste(serien_wlid)

    def resetTransmissions(self):
        if self['menu_list'].getCurrent() is None:
            return
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        if serien_wlid:
            if SeriesServer().resetLastEPGUpdate(serien_wlid):
                self.session.open(
                    MessageBox,
                    "Die Sendetermine für ' %s ' wurden zurückgesetzt." %
                    serien_name,
                    MessageBox.TYPE_INFO,
                    timeout=5)
            else:
                self.session.open(
                    MessageBox,
                    "Fehler beim Zurücksetzen der Sendetermine für ' %s '." %
                    serien_name,
                    MessageBox.TYPE_ERROR,
                    timeout=5)

    def setupClose(self, result):
        super(self.__class__, self).setupClose(result)

        if result[1]:
            self.readSerienMarker()

    def getCover(self):
        if self.loading or self['menu_list'].getCurrent() is None:
            return

        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        from .SerienRecorder import getCover
        getCover(self, serien_name, serien_wlid, serien_fsid)

    def readSerienMarker(self, selectedSeriesWLID=None):
        if selectedSeriesWLID:
            self.selected_serien_wlid = selectedSeriesWLID

        numberOfDeactivatedSeries, markerList = self.getMarkerList(
            self.database)
        self['title'].setText(
            "Serien-Marker - %d/%d Serien vorgemerkt." %
            (len(markerList) - numberOfDeactivatedSeries, len(markerList)))
        if len(markerList) != 0:
            self.chooseMenuList.setList(list(map(self.buildList, markerList)))
            if self.selected_serien_wlid:
                try:
                    idx = list(zip(*markerList))[2].index(
                        str(self.selected_serien_wlid))
                    self['menu_list'].moveToIndex(idx)
                except Exception:
                    pass
            self.loading = False
            self.setMenuKeyText()
            self.getCover()

    @staticmethod
    def getMarkerList(database):
        markerList = []
        numberOfDeactivatedSeries = 0

        markers = database.getAllMarkers(True if config.plugins.serienRec.
                                         markerSort.value == '1' else False)
        for marker in markers:
            (ID, Serie, Info, Url, AufnahmeVerzeichnis, AlleStaffelnAb,
             alleSender, Vorlaufzeit, Nachlaufzeit, AnzahlAufnahmen,
             preferredChannel, useAlternativeChannel, AbEpisode,
             TimerForSpecials, ErlaubteSTB, ErlaubteStaffelCount,
             fsID) = marker
            if alleSender:
                sender = [
                    'Alle',
                ]
            else:
                sender = database.getMarkerChannels(Url, False)

            if AlleStaffelnAb == -2:  # 'Manuell'
                staffeln = [
                    'Manuell',
                ]
            elif AlleStaffelnAb == 0:  # 'Alle'
                staffeln = [
                    'Alle',
                ]
            else:
                staffeln = []
                if ErlaubteStaffelCount > 0:
                    staffeln = database.getAllowedSeasons(ID, AlleStaffelnAb)
                    staffeln.sort()
                if AlleStaffelnAb < 999999:
                    staffeln.append('ab %s' % AlleStaffelnAb)
                if AbEpisode > 0:
                    staffeln.insert(0, '0 ab E%s' % AbEpisode)
                if bool(TimerForSpecials):
                    staffeln.insert(0, 'Specials')

            if useAlternativeChannel == -1:
                useAlternativeChannel = config.plugins.serienRec.useAlternativeChannel.value

            SerieAktiviert = True
            if ErlaubteSTB is not None and not (
                    ErlaubteSTB &
                (1 << (int(config.plugins.serienRec.BoxID.value) - 1))):
                numberOfDeactivatedSeries += 1
                SerieAktiviert = False

            staffeln = ', '.join(str(staffel) for staffel in staffeln)
            sender = ', '.join(sender)

            if not AufnahmeVerzeichnis:
                AufnahmeVerzeichnis = config.plugins.serienRec.savetopath.value

            if not AnzahlAufnahmen:
                AnzahlAufnahmen = config.plugins.serienRec.NoOfRecords.value
            elif AnzahlAufnahmen < 1:
                AnzahlAufnahmen = 1

            if Vorlaufzeit is None:
                Vorlaufzeit = config.plugins.serienRec.margin_before.value
            elif Vorlaufzeit < 0:
                Vorlaufzeit = 0

            if Nachlaufzeit is None:
                Nachlaufzeit = config.plugins.serienRec.margin_after.value
            elif Nachlaufzeit < 0:
                Nachlaufzeit = 0

            markerList.append(
                (ID, Serie, Url, staffeln, sender, AufnahmeVerzeichnis,
                 AnzahlAufnahmen, Vorlaufzeit, Nachlaufzeit, preferredChannel,
                 bool(useAlternativeChannel), SerieAktiviert, Info, fsID))

        return numberOfDeactivatedSeries, markerList

    def buildList(self, entry):
        (ID, serie, url, staffeln, sender, AufnahmeVerzeichnis,
         AnzahlAufnahmen, Vorlaufzeit, Nachlaufzeit, preferredChannel,
         useAlternativeChannel, SerieAktiviert, info, fsID) = entry

        if preferredChannel == 1:
            senderText = "Std."
            if useAlternativeChannel:
                senderText = "%s, Alt." % senderText
        else:
            senderText = "Alt."
            if useAlternativeChannel:
                senderText = "%s, Std." % senderText

        if SerieAktiviert:
            serieColor = None
        else:
            serieColor = parseColor('red').argb()

        foregroundColor = parseColor('foreground').argb()

        senderText = "Sender (%s): %s" % (senderText, sender)
        staffelText = "Staffel: %s" % staffeln
        infoText = "Wdh./Vorl./Nachl.: %s / %s / %s" % (
            int(AnzahlAufnahmen) - 1, int(Vorlaufzeit), int(Nachlaufzeit))
        folderText = "Dir: %s" % AufnahmeVerzeichnis

        return [
            entry,
            (eListboxPythonMultiContent.TYPE_TEXT,
             int(config.plugins.serienRec.markerNameInset.value), 3,
             (410 + self.columnWidth) * skinFactor, 26 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, serie, serieColor, serieColor),
            (eListboxPythonMultiContent.TYPE_TEXT,
             (470 + self.columnWidth) * skinFactor, 3,
             (380 + self.columnWidth) * skinFactor, 26 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, info, serieColor, serieColor),
            (eListboxPythonMultiContent.TYPE_TEXT, 40, 29 * skinFactor,
             (410 + self.columnWidth) * skinFactor, 18 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, staffelText, foregroundColor,
             foregroundColor),
            (eListboxPythonMultiContent.TYPE_TEXT,
             (470 + self.columnWidth) * skinFactor, 29 * skinFactor,
             (380 + self.columnWidth) * skinFactor, 18 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, senderText, foregroundColor,
             foregroundColor),
            (eListboxPythonMultiContent.TYPE_TEXT, 40, 49 * skinFactor,
             (410 + self.columnWidth) * skinFactor, 18 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, infoText, foregroundColor,
             foregroundColor),
            (eListboxPythonMultiContent.TYPE_TEXT,
             (470 + self.columnWidth) * skinFactor, 49 * skinFactor,
             (380 + self.columnWidth) * skinFactor, 18 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, folderText, foregroundColor,
             foregroundColor)
        ]

    def keyCheck(self):
        if self['menu_list'].getCurrent() is None:
            print("[SerienRecorder] Serien-Marker Tabelle leer.")
            return
        if self.modus == "menu_list":
            from .SerienRecorderAutoCheckScreen import serienRecRunAutoCheckScreen
            self.session.openWithCallback(self.readSerienMarker,
                                          serienRecRunAutoCheckScreen, False)

    def keyOK(self):
        if self.modus == "popup_list":  # Staffel
            self.selected_serien_wlid = self['menu_list'].getCurrent()[0][2]
            select_staffel = self['popup_list'].getCurrent()[0][0]
            select_mode = self['popup_list'].getCurrent()[0][1]
            select_index = self['popup_list'].getCurrent()[0][2]
            print(select_staffel, select_mode)
            if select_mode == 0:
                select_mode = 1
            else:
                select_mode = 0

            self.staffel_liste[select_index] = list(
                self.staffel_liste[select_index])
            self.staffel_liste[select_index][1] = select_mode

            if select_mode == 1:
                deselectRange = None
                if select_index == 0:  # 'Manuell'
                    # Disable all other special rows
                    deselectRange = list(range(1, 3))
                if select_index == 1:  # Alle
                    # Disable 'Manuell' and 'folgende'
                    deselectRange = [0, 3]
                if select_index == 2:  # Specials
                    # Disable 'Manuell' and 'Alle'
                    deselectRange = [0, 1]
                if select_index == 4:  # 0
                    # Disable 'Manuell', 'Alle' and 'folgende'
                    deselectRange = [0, 1, 3]

                if deselectRange:
                    for index in deselectRange:
                        self.staffel_liste[index] = list(
                            self.staffel_liste[index])
                        self.staffel_liste[index][1] = 0

                if select_index == 0 or select_index == 1 or select_index == 4:  # 'Manuell', 'Alle' or '0'
                    for index in range((5 if select_index == 4 else 4),
                                       len(self.staffel_liste)):
                        # Disable all other season rows
                        self.staffel_liste[index] = list(
                            self.staffel_liste[index])
                        self.staffel_liste[index][1] = 0

                if select_index >= 3:  # Any season
                    for index in [0, 1]:
                        # Disable 'Manuell' and 'Alle'
                        self.staffel_liste[index] = list(
                            self.staffel_liste[index])
                        self.staffel_liste[index][1] = 0

            self.chooseMenuList_popup.setList(
                list(map(self.buildList2, self.staffel_liste)))
        elif self.modus == "popup_list2":  # Sender
            self.selected_serien_wlid = self['menu_list'].getCurrent()[0][2]
            select_sender = self['popup_list'].getCurrent()[0][0]
            select_mode = self['popup_list'].getCurrent()[0][1]
            select_index = self['popup_list'].getCurrent()[0][2]
            print(select_sender, select_mode)
            if select_mode == 0:
                select_mode = 1
            else:
                select_mode = 0
            self.sender_liste[select_index] = list(
                self.sender_liste[select_index])
            self.sender_liste[select_index][1] = select_mode
            if select_mode == 1:
                if select_index == 0:  # 'Alle'
                    # Disable any other channels
                    for index in range(1, len(self.sender_liste)):
                        # Disable all other season rows
                        self.sender_liste[index] = list(
                            self.sender_liste[index])
                        self.sender_liste[index][1] = 0
                if select_index >= 1:  # Any channel
                    # Disable 'Alle'
                    self.sender_liste[0] = list(self.sender_liste[0])
                    self.sender_liste[0][1] = 0
            self.chooseMenuList_popup.setList(
                list(map(self.buildList2, self.sender_liste)))
        else:
            self.staffelSelect()

    def staffelSelect(self):
        if self.modus == "menu_list":
            if self['menu_list'].getCurrent() is None:
                print("[SerienRecorder] Serien-Marker Tabelle leer.")
                return

            self.modus = "popup_list"
            self.selected_serien_wlid = self['menu_list'].getCurrent()[0][2]
            self['popup_list'].show()
            self['popup_bg'].show()

            staffeln = [
                "Manuell", "Alle (inkl. Specials)", "Specials", "Staffeln ab"
            ]
            staffeln.extend(
                list(range(config.plugins.serienRec.max_season.value + 1)))
            mode_list = [
                0,
            ] * len(staffeln)
            index_list = list(range(len(staffeln)))
            (ID, AlleStaffelnAb, self.AbEpisode,
             TimerForSpecials) = self.database.getMarkerSeasonSettings(
                 self.selected_serien_wlid)

            if AlleStaffelnAb == -2:  # 'Manuell'
                mode_list[0] = 1
            else:
                if AlleStaffelnAb == 0:  # 'Alle'
                    mode_list[1] = 1
                else:
                    if bool(TimerForSpecials):
                        mode_list[2] = 1
                    cStaffelList = self.database.getAllowedSeasons(
                        ID, AlleStaffelnAb)
                    if AlleStaffelnAb >= 999999:
                        for staffel in cStaffelList:
                            mode_list[staffel + 4] = 1
                    elif (AlleStaffelnAb > 0) and (AlleStaffelnAb <=
                                                   (len(staffeln) - 4)):
                        mode_list[AlleStaffelnAb + 4] = 1
                        mode_list[3] = 1
                        for staffel in cStaffelList:
                            mode_list[staffel + 4] = 1
                            if (staffel + 1) == AlleStaffelnAb:
                                mode_list[AlleStaffelnAb + 4] = 0
                                AlleStaffelnAb = staffel

                    if self.AbEpisode > 0:
                        mode_list[4] = 1

            if mode_list.count(1) == 0:
                mode_list[0] = 1
            self.staffel_liste = list(zip(staffeln, mode_list, index_list))
            self.chooseMenuList_popup.setList(
                list(map(self.buildList2, self.staffel_liste)))

    @staticmethod
    def buildList2(entry):
        (staffel, mode, index) = entry
        serienRecMainPath = os.path.dirname(__file__)
        if int(mode) == 0:
            imageMode = "%s/images/minus.png" % serienRecMainPath
        else:
            imageMode = "%s/images/plus.png" % serienRecMainPath

        return [
            entry,
            (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5,
             7 * skinFactor, 30 * skinFactor, 17 * skinFactor,
             loadPNG(imageMode)),
            (eListboxPythonMultiContent.TYPE_TEXT, 40 * skinFactor, 0,
             500 * skinFactor, 26 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, str(staffel).zfill(2))
        ]

    def keyGreen(self):
        if self.modus == "menu_list":
            if self['menu_list'].getCurrent() is None:
                print("[SerienRecorder] Serien-Marker Tabelle leer.")
                return

            activeChannels = self.database.getActiveChannels()
            if len(activeChannels) != 0:
                self.modus = "popup_list2"
                self['popup_list'].show()
                self['popup_bg'].show()
                self.selected_serien_wlid = self['menu_list'].getCurrent(
                )[0][2]

                activeChannels.insert(0, 'Alle')
                mode_list = [
                    0,
                ] * len(activeChannels)
                index_list = list(range(len(activeChannels)))
                channels = self.database.getMarkerChannels(
                    self.selected_serien_wlid, False)
                if len(channels) > 0:
                    for channel in channels:
                        if channel in activeChannels:
                            idx = activeChannels.index(channel)
                            mode_list[idx] = 1
                else:
                    # No channels assigned to marker => Alle
                    mode_list[0] = 1

                self.sender_liste = list(
                    zip(activeChannels, mode_list, index_list))
                self.chooseMenuList_popup.setList(
                    list(map(self.buildList2, self.sender_liste)))

    def callTimerAdded(self, answer):
        if answer:
            self.changesMade = True

    def keyYellow(self):
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        if serien_name and serien_wlid:
            from .SerienRecorderTransmissionsScreen import serienRecSendeTermine
            self.session.openWithCallback(self.callTimerAdded,
                                          serienRecSendeTermine, serien_name,
                                          serien_wlid, serien_fsid)

    def callDisableAll(self, answer):
        if answer:
            self.database.disableAllMarkers(
                config.plugins.serienRec.BoxID.value)
            self.readSerienMarker()
        else:
            return

    def callSaveMsg(self, answer):
        if answer:
            (serien_name, serien_wlid,
             serien_fsid) = self.getCurrentSelection()
            serien_info = self['menu_list'].getCurrent()[0][12]
            self.session.openWithCallback(
                self.callDelMsg,
                MessageBox,
                "Die Timer Einträge für '%s (%s)' auch aus der Datenbank löschen?"
                % (serien_name, serien_info),
                MessageBox.TYPE_YESNO,
                default=False)
        else:
            return

    def callDelMsg(self, answer):
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        self.removeSerienMarker(serien_fsid, serien_name, answer)

    def removeSerienMarker(self, serien_fsid, serien_name, answer):
        serien_info = self['menu_list'].getCurrent()[0][12]
        serienRecMarker.doRemoveSerienMarker(serien_fsid, serien_name,
                                             serien_info, answer)
        self.changesMade = True
        self['title'].instance.setForegroundColor(parseColor("red"))
        self['title'].setText("Marker für '%s (%s)' wurde gelöscht." %
                              (serien_name, serien_info))
        self.readSerienMarker()

    @staticmethod
    def doRemoveSerienMarker(serien_fsid, serien_name, serien_info, withTimer):
        from .SerienRecorderDatabase import SRDatabase
        from .SerienRecorder import serienRecDataBaseFilePath
        database = SRDatabase(serienRecDataBaseFilePath)
        database.removeMarker(serien_fsid, withTimer)
        from .SerienRecorderLogWriter import SRLogger
        SRLogger.writeLog(
            "Der Serien-Marker für '%s (%s)' wurde gelöscht" %
            (serien_name, serien_info), True)

    def keyRed(self):
        if self.modus == "menu_list":
            if self['menu_list'].getCurrent() is None:
                print("[SerienRecorder] Serien-Marker Tabelle leer.")
                return
            else:
                self.selected_serien_wlid = self['menu_list'].getCurrent(
                )[0][2]
                self.database.changeMarkerStatus(
                    self.selected_serien_wlid,
                    config.plugins.serienRec.BoxID.value)
                self.readSerienMarker(self.selected_serien_wlid)

    def keyRedLong(self):
        if self.modus == "menu_list":
            if self['menu_list'].getCurrent() is None:
                print("[SerienRecorder] Serien-Marker Tabelle leer.")
                return
            else:
                self.selected_serien_wlid = None
                serien_name = self['menu_list'].getCurrent()[0][1]
                serien_info = self['menu_list'].getCurrent()[0][12]
                if config.plugins.serienRec.confirmOnDelete.value:
                    self.session.openWithCallback(
                        self.callSaveMsg,
                        MessageBox,
                        "Den Serien-Marker für '%s (%s)' wirklich löschen?" %
                        (serien_name, serien_info),
                        MessageBox.TYPE_YESNO,
                        default=False)
                else:
                    self.session.openWithCallback(
                        self.callDelMsg,
                        MessageBox,
                        "Die Timer Einträge für '%s (%s)' auch aus der Datenbank löschen?"
                        % (serien_name, serien_info),
                        MessageBox.TYPE_YESNO,
                        default=False)

    def disableAll(self):
        if self.modus == "menu_list":
            if self['menu_list'].getCurrent() is None:
                print("[SerienRecorder] Serien-Marker Tabelle leer.")
                return
            else:
                self.session.openWithCallback(
                    self.callDisableAll,
                    MessageBox,
                    "Alle Serien-Marker für diese Box deaktivieren?",
                    MessageBox.TYPE_YESNO,
                    default=False)

    def insertStaffelMarker(self):
        (ID, AlleStaffelnAb, AbEpisode,
         TimerForSpecials) = self.database.getMarkerSeasonSettings(
             self.selected_serien_wlid)
        if ID:
            self.database.removeAllMarkerSeasons(self.selected_serien_wlid)
            liste = self.staffel_liste[1:]
            print("[SerienRecorder] insertStaffelMarker")
            #print(liste)
            liste = list(zip(*liste))
            #print(liste)
            if 1 in liste[1]:
                TimerForSpecials = 0
                AlleStaffelnAb = 999999
                #staffel_liste = ['Manuell','Alle','Specials','folgende',...]
                for row in self.staffel_liste:
                    (staffel, mode, index) = row
                    if mode == 1:
                        if index == 0:  # 'Manuell'
                            AlleStaffelnAb = -2
                            AbEpisode = 0
                            TimerForSpecials = 0
                            break
                        if index == 1:  # 'Alle'
                            AlleStaffelnAb = 0
                            AbEpisode = 0
                            TimerForSpecials = 0
                            break
                        if index == 2:  #'Specials'
                            TimerForSpecials = 1
                        if index == 3:  #'folgende'
                            liste = self.staffel_liste[5:]
                            liste.reverse()
                            liste = list(zip(*liste))
                            if 1 in liste[1]:
                                idx = liste[1].index(1)
                                AlleStaffelnAb = liste[0][idx]
                        if index > 4:
                            if staffel != AlleStaffelnAb:
                                self.database.setMarkerSeason(ID, staffel)
                    else:
                        if index == 4:
                            AbEpisode = 0

            else:
                AlleStaffelnAb = -2
                AbEpisode = 0

            if AlleStaffelnAb == -2:  # 'Manuell'
                self.session.open(
                    MessageBox,
                    "Mit dieser Einstellung ('Manuell') werden für diesen\nSerien-Marker keine Timer mehr automatisch angelegt!",
                    MessageBox.TYPE_INFO,
                    timeout=10)

        self.database.updateMarkerSeasonsSettings(self.selected_serien_wlid,
                                                  AlleStaffelnAb, AbEpisode,
                                                  TimerForSpecials)

        self.changesMade = True
        self.readSerienMarker()

    def insertMarkerChannels(self):
        alleSender = 0
        self.database.removeAllMarkerChannels(self.selected_serien_wlid)
        markerID = self.database.getMarkerID(self.selected_serien_wlid)
        liste = self.sender_liste[1:]
        liste = list(zip(*liste))
        data = []
        if 1 in liste[1]:
            for row in self.sender_liste:
                (sender, mode, index) = row
                if (index == 0) and (mode == 1):  # 'Alle'
                    alleSender = 1
                    break
                elif mode == 1:  # Sender erlaubt
                    data.append((markerID, sender))
            self.database.setMarkerChannels(data)
        else:
            alleSender = 1

        self.database.setAllChannelsToMarker(self.selected_serien_wlid,
                                             alleSender)

        self.changesMade = True
        self.readSerienMarker()

    def keyBlue(self):
        if self.modus == "menu_list":
            from .SerienRecorderTimerListScreen import serienRecTimerListScreen
            self.session.openWithCallback(self.readSerienMarker,
                                          serienRecTimerListScreen)

    def searchSeries(self):
        if self.modus == "menu_list":
            self.session.openWithCallback(self.wSearch,
                                          NTIVirtualKeyBoard,
                                          title="Serien Titel eingeben:")

    def wSearch(self, serien_name):
        if serien_name:
            #print serien_name
            self.changesMade = True
            from .SerienRecorderSearchResultScreen import serienRecSearchResultScreen
            self.session.openWithCallback(self.readSerienMarker,
                                          serienRecSearchResultScreen,
                                          serien_name)

    def setMenuKeyText(self):
        active = self['menu_list'].getCurrent()[0][11]
        if active:
            self['text_red'].setText("Aus/Löschen")
        else:
            self['text_red'].setText("Ein/Löschen")

    def keyLeft(self):
        if self.modus == "popup_list2":
            self["popup_list"].pageUp()
        else:
            self[self.modus].pageUp()
            self.getCover()
            self.setMenuKeyText()

    def keyRight(self):
        if self.modus == "popup_list2":
            self["popup_list"].pageDown()
        else:
            self[self.modus].pageDown()
            self.getCover()
            self.setMenuKeyText()

    def keyDown(self):
        if self.modus == "popup_list2":
            self["popup_list"].down()
        else:
            self[self.modus].down()
            self.getCover()
            self.setMenuKeyText()

    def keyUp(self):
        if self.modus == "popup_list2":
            self["popup_list"].up()
        else:
            self[self.modus].up()
            self.getCover()
            self.setMenuKeyText()

    def selectEpisode(self, episode):
        if str(episode).isdigit():
            self.database.setMarkerEpisode(self.selected_serien_wlid, episode)
        self.insertStaffelMarker()

    def __onClose(self):
        if self.displayTimer:
            self.displayTimer.stop()
            self.displayTimer = None

    def keyExit(self):
        if self.modus == "popup_list" or self.modus == "popup_list2":
            self.keyCancel()
        else:
            print("[SerienRecorder] MarkerScreen exit")
            from . import SerienRecorderMainScreen
            SerienRecorderMainScreen.showMainScreen = True
            self.close(self.changesMade)

    def keyCancel(self):
        if self.modus == "popup_list":
            self.modus = "menu_list"
            self['popup_list'].hide()
            self['popup_bg'].hide()
            if (self.staffel_liste[0][1]
                    == 0) and (self.staffel_liste[1][1] == 0) and (
                        self.staffel_liste[4][1]
                        == 1):  # nicht ('Manuell' oder 'Alle') und '00'
                self.session.openWithCallback(
                    self.selectEpisode,
                    NTIVirtualKeyBoard,
                    title=
                    "Die Episode eingeben ab der Timer erstellt werden sollen:",
                    text=str(self.AbEpisode))
            else:
                self.insertStaffelMarker()
        elif self.modus == "popup_list2":
            self.modus = "menu_list"
            self['popup_list'].hide()
            self['popup_bg'].hide()
            self.insertMarkerChannels()
        else:
            self.close(self.changesMade)
Ejemplo n.º 23
0
class ChannelEditor(Screen, HelpableScreen, ChannelsBase):
	
	skinfile = os.path.join( resolveFilename(SCOPE_PLUGINS), "Extensions/SeriesPlugin/skinChannelEditor.xml" )
	skin = open(skinfile).read()
	
	def __init__(self, session):
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		ChannelsBase.__init__(self)
		
		self.session = session
		
		self.skinName = [ "SeriesPluginChannelEditor" ]
		
		from plugin import NAME, VERSION
		self.setup_title = NAME + " " + _("Channel Editor") + " " + VERSION
		
		# Buttons
		self["key_red"] = Button(_("Cancel"))
		self["key_green"] = Button(_("OK"))
		self["key_blue"] = Button(_("Remove"))
		self["key_yellow"] = Button(_("Auto match"))
		
		# Define Actions
		self["actions_1"] = HelpableActionMap(self, "SetupActions", {
			"ok"       : (self.keyAdd, _("Show popup to add Stb Channel")),
			"cancel"   : (self.keyCancel, _("Cancel and close")),
			"deleteForward"   : (self.keyResetChannelMapping, _("Reset channels")),
		}, -1)
		self["actions_2"] = HelpableActionMap(self, "DirectionActions", {
			"left"     : (self.keyLeft, _("Previeous page")),
			"right"    : (self.keyRight, _("Next page")),
			"up"       : (self.keyUp, _("One row up")),
			"down"     : (self.keyDown, _("One row down")),
		}, -1)
		self["actions_3"] = HelpableActionMap(self, "ColorActions", {
			"red"      : (self.keyCancel, _("Cancel and close")),
			"green"    : (self.keySave, _("Save and close")),
			"blue"     : (self.keyRemove, _("Remove channel")),
			"yellow"   : (self.tryToMatchChannels, _("Auto match")),
		}, -2) # higher priority
		
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["HelpActions",], {
			"displayHelp"      : self.showHelp
		}, 0)

		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 ))
		self.chooseMenuList.l.setItemHeight(25)
		self['list'] = self.chooseMenuList
		self['list'].show()

		self.stbChlist = []
		self.webChlist = []
		self.stbToWebChlist = []
		
		self.onLayoutFinish.append(self.readChannels)

	def readChannels(self):
		self.setTitle(_("Load Web-Channels..."))
		
		self.stbToWebChlist = []
		
		if not self.stbChlist:
			self.stbChlist = buildSTBchannellist(config.plugins.seriesplugin.bouquet_main.value)
		
		if not self.webChlist:
			from WebChannels import WebChannels
			WebChannels(self.setWebChannels).request()
		else:
			self.showChannels()

	def setWebChannels(self, data):
		#data.sort()
		temp = [ (x,unifyChannel(x)) for x in data]
		self.webChlist = sorted(temp, key=lambda tup: tup[0])
		self.showChannels()

	def showChannels(self):
		if len(self.stbChlist) != 0:
			for servicename,serviceref,uservicename in self.stbChlist:
				#splog("SPC: servicename", servicename, uservicename)
				
				webSender = self.lookupChannelByReference(serviceref)
				if webSender is not False:
					self.stbToWebChlist.append((servicename, webSender, serviceref, "1"))
					
				else:
					self.stbToWebChlist.append((servicename, "", serviceref, "0"))
		
		if len(self.stbToWebChlist) != 0:
			self.chooseMenuList.setList(map(self.buildList, self.stbToWebChlist))
		else:
			splog("SPC: Error creating webChlist..")
			self.setTitle(_("Error check log file"))
	
	def tryToMatchChannels(self):
		self.setTitle(_("Channel matching..."))
		self.stbToWebChlist = []
		sequenceMatcher = SequenceMatcher(" ".__eq__, "", "")
		
		if len(self.stbChlist) != 0:
			for servicename,serviceref,uservicename in self.stbChlist:
				#splog("SPC: servicename", servicename, uservicename)
				
				webSender = self.lookupChannelByReference(serviceref)
				if webSender is not False:
					self.stbToWebChlist.append((servicename, webSender, serviceref, "1"))
					
				else:
					if len(self.webChlist) != 0:
						match = ""
						ratio = 0
						for webSender, uwebSender in self.webChlist:
							#splog("SPC: webSender", webSender, uwebSender)
							if uwebSender in uservicename or uservicename in uwebSender:
								
								sequenceMatcher.set_seqs(uservicename, uwebSender)
								newratio = sequenceMatcher.ratio()
								if newratio > ratio:
									splog("SPC: possible match", servicename, uservicename, webSender, uwebSender, ratio)
									ratio = newratio
									match = webSender
						
						if ratio > 0:
							splog("SPC: match", servicename, uservicename, match, ratio)
							self.stbToWebChlist.append((servicename, match, serviceref, "1"))
							self.addChannel(serviceref, servicename, match)
						
						else:
							self.stbToWebChlist.append((servicename, "", serviceref, "0"))
							
					else:
						self.stbToWebChlist.append((servicename, "", serviceref, "0"))
						
		if len(self.stbToWebChlist) != 0:
			self.chooseMenuList.setList(map(self.buildList, self.stbToWebChlist))
		else:
			splog("SPC: Error creating webChlist..")
			self.setTitle(_("Error check log file"))
		
	def buildList(self, entry):
		self.setTitle(_("STB-Channels / Web-Channel"))
		
		(stbSender, webSender, serviceref, status) = entry
		if int(status) == 0:		
			imageStatus = path = os.path.join(PIXMAP_PATH, "minus.png")
		else:
			imageStatus = path = os.path.join(PIXMAP_PATH, "plus.png")
			
		return [entry,
			(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 8, 16, 16, loadPNG(imageStatus)),
			(eListboxPythonMultiContent.TYPE_TEXT, 35, 3, 300, 26, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, stbSender),
			(eListboxPythonMultiContent.TYPE_TEXT, 350, 3, 250, 26, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, webSender),
			(eListboxPythonMultiContent.TYPE_TEXT, 600, 3, 250, 26, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, "", colorYellow)
			]

	def getIndexOfWebSender(self, webSender):
		for pos,webCh in enumerate(self.webChlist):
			if(webCh[0] == webSender):
				return pos
		return 0
	
	def keyAdd(self):
		check = self['list'].getCurrent()
		if check == None:
			splog("SPC: list empty")
			return
		else:
			idx = 0
			(servicename, webSender, serviceref, state) = self['list'].getCurrent()[0]
			idx = 0
			if webSender:
				idx = self.getIndexOfWebSender(self.webChlist)
			splog("SPC: keyAdd webSender", webSender, idx)
			self.session.openWithCallback( boundFunction(self.addConfirm, servicename, serviceref, webSender), ChoiceBox,_("Add Web Channel"), self.webChlist, None, idx)
	
	def getIndexOfServiceref(self, serviceref):
		for pos,stbWebChl in enumerate(self.stbToWebChlist):
			if(stbWebChl[2] == serviceref):
				return pos
		return False
	
	def addConfirm(self, servicename, serviceref, webSender, result):
		if not result:
			return
		remote = result[0]
		if webSender and remote == webSender:
			splog("SPC: addConfirm skip already set", servicename, serviceref, remote, webSender)
		elif servicename and serviceref and remote and not webSender:
			idx = self.getIndexOfServiceref(serviceref)
			splog("SPC: addConfirm", servicename, serviceref, remote, idx)
			if idx is not False:
				self.setTitle(_("Channel '- %(servicename)s - %(remote)s -' added.") % {'servicename': servicename, 'remote':remote } )
				self.addChannel(serviceref, servicename, remote)
				self.stbToWebChlist[idx] = (servicename, remote, serviceref, "1")
				self.chooseMenuList.setList(map(self.buildList, self.stbToWebChlist))
		elif servicename and serviceref and remote and webSender:
			splog("SPC: add or replace", servicename, serviceref, remote, webSender)
			self.session.openWithCallback( boundFunction(self.addOrReplace, servicename, serviceref, webSender, remote), MessageBox,_("Add channel (Yes) or replace it (No)"), MessageBox.TYPE_YESNO, default = False)

	def addOrReplace(self, servicename, serviceref, webSender, remote, result):
		idx = self.getIndexOfServiceref(serviceref)
		splog("SPC: addOrReplace", servicename, serviceref, remote, webSender, idx)
		if idx is False:
			return
		
		if result:
			splog("SPC: add", servicename, serviceref, remote, webSender)
			self.setTitle(_("Channel '- %(servicename)s - %(remote)s -' added.") % {'servicename': servicename, 'remote':remote } )
			self.addChannel(serviceref, servicename, remote)
			self.stbToWebChlist[idx] = (servicename, webSender+" / "+remote, serviceref, "1")
			
		else:
			splog("SPC: replace", servicename, serviceref, remote, webSender)
			self.setTitle(_("Channel '- %(servicename)s - %(remote)s -' replaced.") % {'servicename': servicename, 'remote':remote } )
			self.replaceChannel(serviceref, servicename, remote)
			self.stbToWebChlist[idx] = (servicename, remote, serviceref, "1")
			
		self.chooseMenuList.setList(map(self.buildList, self.stbToWebChlist))

	def keyRemove(self):
		check = self['list'].getCurrent()
		if check == None:
			splog("SPC: keyRemove list empty")
			return
		else:
			(servicename, webSender, serviceref, state) = self['list'].getCurrent()[0]
			splog("SPC: keyRemove", servicename, webSender, serviceref, state)
			if serviceref:
				#TODO handle multiple links/alternatives - show a choicebox
				self.session.openWithCallback( boundFunction(self.removeConfirm, servicename, serviceref), MessageBox, _("Remove '%s'?") % servicename, MessageBox.TYPE_YESNO, default = False)

	def removeConfirm(self, servicename, serviceref, answer):
		if not answer:
			return
		if serviceref:
			idx = self.getIndexOfServiceref(serviceref)
			if idx is not False:
				splog("SPC: removeConfirm", servicename, serviceref, idx)
				self.setTitle(_("Channel '- %s -' removed.") % servicename)
				self.removeChannel(serviceref)
				self.stbToWebChlist[idx] = (servicename, "", serviceref, "0")
				self.chooseMenuList.setList(map(self.buildList, self.stbToWebChlist))

	def keyResetChannelMapping(self):
		self.session.openWithCallback(self.channelReset, MessageBox, _("Reset channel list?"), MessageBox.TYPE_YESNO)

	def channelReset(self, answer):
		if answer:
			splog("SPC: channel-list reset...")
			self.resetChannels()
			self.stbChlist = []
			self.webChlist = []
			self.stbToWebChlist = []
			self.readChannels()

	def keyLeft(self):
		self['list'].pageUp()

	def keyRight(self):
		self['list'].pageDown()

	def keyDown(self):
		self['list'].down()

	def keyUp(self):
		self['list'].up()
	
	def keySave(self):
		self.close(ChannelsBase.channels_changed)

	def keyCancel(self):
		self.close(False)

	def hideHelpWindow(self):
		current = self["config"].getCurrent()
		if current and hasattr(current[1], "help_window"):
			help_window = current[1].help_window
			if help_window:
				help_window.hide()
Ejemplo n.º 24
0
class SkyTimer(Screen):
    def __init__(self, session, id_events, id_channel, id_genre):
        self.session = session

        path = "%s/skins/%s/screen_timer_select.xml" % (getPluginPath(), config.plugins.skyrecorder.anytime_skin.value)
        with open(path, "r") as f:
            self.skin = f.read()
            f.close()

        Screen.__init__(self, session)

        self.id_events = str(id_events)
        self.id_channel = id_channel
        self.id_genre = id_genre

        self.nonHDeventList = nonHDeventList()
        self.sky_chlist = buildSkyChannellist()

        self.pluginName = config.plugins.skyrecorder.pluginname.value
        self.contentSize = config.plugins.skyrecorder.contentsize.value

        self["actions"] = ActionMap(
            [
                "OkCancelActions",
                "ShortcutActions",
                "EPGSelectActions",
                "WizardActions",
                "ColorActions",
                "NumberActions",
                "MenuActions",
                "MoviePlayerActions",
            ],
            {
                "ok": self.keyOK,
                "cancel": self.keyCancel,
                "nextBouquet": self.keyPageUp,
                "prevBouquet": self.keyPageDown,
            },
            -1,
        )

        self["title"] = Label(self.pluginName)
        try:
            self["head"] = Label("Sendetermine")
        except Exception:
            sys.exc_clear()
        self["name"] = Label("Timer Auswahl")
        self["handlung"] = Label(" ")
        self["image"] = Pixmap()
        self["image"].hide()

        self["hd"] = Pixmap()
        self["hd"].hide()

        self["169"] = Pixmap()
        self["169"].hide()

        self["dolby"] = Pixmap()
        self["dolby"].hide()

        self["dualch"] = Pixmap()
        self["dualch"].hide()

        self["sub"] = Pixmap()
        self["sub"].hide()

        self.keyLocked = True
        self.streamMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
        self.streamMenuList.l.setFont(0, gFont("Regular", self.contentSize))
        self.streamMenuList.l.setItemHeight(25)
        self["filmliste"] = self.streamMenuList

        self.onLayoutFinish.append(self.getTimerEventList)

    def skyAnytimerListEntry(self, entry):
        if entry[5] == "True":
            icon = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/neu.png"
        elif entry[5] == "Done":
            icon = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/neu_blue.png"
        elif entry[5] == "Hidden":
            icon = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/neu_grau.png"
        else:
            icon = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/neu_green.png"
            # FIXME
        stime = getTimeFromTimestamp(entry[2])
        etime = getTimeFromTimestamp(entry[3])

        new = LoadPixmap(icon)
        return [
            entry,
            (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 20, 4, 28, 17, new),
            (eListboxPythonMultiContent.TYPE_TEXT, 70, 0, 150, 25, 0, RT_HALIGN_LEFT, entry[0]),
            (eListboxPythonMultiContent.TYPE_TEXT, 200, 0, 130, 25, 0, RT_HALIGN_LEFT, entry[1]),
            (eListboxPythonMultiContent.TYPE_TEXT, 330, 0, 100, 25, 0, RT_HALIGN_LEFT, stime),
            (eListboxPythonMultiContent.TYPE_TEXT, 430, 0, 100, 25, 0, RT_HALIGN_LEFT, etime),
            (eListboxPythonMultiContent.TYPE_TEXT, 530, 0, 230, 25, 0, RT_HALIGN_LEFT, entry[4]),
        ]

    def getTimerEventList(self):
        # eventslist.dayname, eventslist.datum, eventslist.starttime, eventslist.endtime,
        # channel.channel, eventslist.status, events.title, events.description, eventslist.id_events
        try:
            sql.cur.execute("SELECT SQLITE_VERSION()")
        except Exception:
            sys.exc_clear()
            try:
                sql.connect()
            except Exception:
                return

        myList = None
        myList = []

        self["name"].setText("Timer Auswahl")

        rows = sql.getEventsTimer(self.id_events, "ASC", getCurrentTimestamp())
        resultCount = len(rows)
        if resultCount > 0:
            for row in rows:
                myList.append(row)

            self["handlung"].setText("Titel: \t" + myList[0][6] + "\nBeschreibung: \t" + myList[0][7])
            self.streamMenuList.setList(map(self.skyAnytimerListEntry, sorted(myList, key=lambda stime: stime[2])))
            # self['filmliste'].moveToIndex = 0
        try:
            self["head"].setText("%s Sendetermine" % str(resultCount))
        except Exception:
            sys.exc_clear()

    def getChannelref(self, channel):
        for (channelname, channelref) in self.sky_chlist:
            if channelname.lower() == channel.lower():
                return channelref

    def keyPageDown(self):
        self["filmliste"].pageDown()

    def keyPageUp(self):
        self["filmliste"].pageUp()

    def keyOK(self):
        print "ok"
        datum = self["filmliste"].getCurrent()[0][1]
        starttime = self["filmliste"].getCurrent()[0][2]
        endtime = self["filmliste"].getCurrent()[0][3]
        channel = self["filmliste"].getCurrent()[0][4]
        title = self["filmliste"].getCurrent()[0][6]
        desc = self["filmliste"].getCurrent()[0][7]
        status = self["filmliste"].getCurrent()[0][5]

        dirname = None
        recordings_base_folder = None
        try:
            if config.plugins.skyrecorder.anytimefolder.value:
                recordings_base_folder = config.plugins.skyrecorder.anytimefolder.value
        except Exception:
            sys.exc_clear()
            recordings_base_folder = None

            # use settings "margin_before" and "margin_after"
            # for the timers starttime and endtime adjustment
        timer_starttime = starttime - config.plugins.skyrecorder.margin_before.value * 60
        timer_endtime = endtime + config.plugins.skyrecorder.margin_after.value * 60

        stb_channel = sql.getChannelFromChannel(channel, stb=True)
        channelref = self.getChannelref(stb_channel)

        print datum, starttime, endtime, stb_channel, channelref

        # try to delete this timerentry
        if status == "True":
            entry_dict = None
            entry_dict = {}
            entry_dict["name"] = title
            entry_dict["description"] = desc
            entry_dict["timer_starttime"] = timer_starttime
            entry_dict["channelref"] = channelref

            retval = SkyTimerRec.removeTimerEntry(entry_dict)
            # id_added = sql.checkAdded(title.lower(), desc.lower(), self.id_channel, self.id_genre)
            # if id_added:
            # 	sql.resetAdded(id_added)
            if retval:
                sql.updateEventListStatus(self.id_events, starttime, "False")
                if config.plugins.skyrecorder.silent_timer_mode.value == False:
                    message = self.session.open(MessageBox, _("Timer gelöscht!"), MessageBox.TYPE_INFO, timeout=3)
            self.getTimerEventList()
            return

        if channelref != None:
            justplay = False
            if config.plugins.skyrecorder.timer_mode.value == "1":
                justplay = True

            if recordings_base_folder:
                if not config.plugins.skyrecorder.create_dirtree.value:
                    dirname = recordings_base_folder
                else:
                    # get our groupfoldername
                    a_dir = sql.getGenregroupByGenreId(self.id_genre)
                    if a_dir:
                        group_dir = os.path.join(recordings_base_folder, a_dir + "/")
                        if not os.path.exists(group_dir):
                            try:
                                os.makedirs(group_dir, mode=0777)
                                dirname = group_dir
                            except Exception:
                                sys.exc_clear()
                        else:
                            dirname = group_dir

            result = SkyTimerRec.addTimer(
                self.session,
                channelref,
                timer_starttime,
                timer_endtime,
                title,
                desc,
                0,
                justplay,
                3,
                dirname,
                None,
                0,
                None,
                eit=0,
            )
            if result["result"]:
                sql.updateEventListStatus(self.id_events, starttime, status="True")

                # added by einfall
                # begin_date = time.strftime("%Y%m%d %H%M", time.localtime(starttime))
                file = getRecordFilename(
                    title, desc, timer_starttime, stb_channel
                )  # "%s - %s - %s.ts" % (begin_date,channel,title)

                # id_added,title,description,id_channel,id_genre,begin,end,serviceref,location,recordedfile
                if not sql.checkAdded(title.lower(), desc.lower(), self.id_channel, self.id_genre):
                    sql.addAdded(
                        title,
                        desc,
                        self.id_channel,
                        self.id_genre,
                        timer_starttime,
                        timer_endtime,
                        channelref,
                        dirname,
                        file,
                    )

                self.getTimerEventList()
                # self.close()
            else:
                message = self.session.open(
                    MessageBox, _("Fehler!\n%s") % (result["message"]), MessageBox.TYPE_INFO, timeout=-1
                )

    def keyCancel(self):
        self.close()
Ejemplo n.º 25
0
class OpenIPTVList(Screen):
	skin = 	"""
		<screen name="OpenIPTV List" position="center,center" size="600,350" title="OpenIPTV List">
			<widget name="streamlist" position="0,0" size="600,350" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
	        </screen>
		"""
	def __init__(self, session):
		self.session = session
		Screen.__init__(self, session)
		self["actions"]  = ActionMap(["OkCancelActions", "ShortcutActions", "WizardActions", "ColorActions", "SetupActions", "NumberActions", "MenuActions"], {
			"ok"    : self.keyOK,
			"cancel": self.keyCancel,
			"up"    : self.keyUp,
			"down"  : self.keyDown,
			"left"  : self.keyLeft,
			"right" : self.keyRight,
		}, -1)

		self.streamBin  = resolveFilename(SCOPE_PLUGINS, "usr/bin/rtmpdump")
		self.streamFile = resolveFilename(SCOPE_PLUGINS, "Extensions/OpenIPTV/chanels.xml")

		self.streamList = []
		self.makeStreamList()

		self.streamMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.streamMenuList.l.setFont(0, gFont('Regular', 22))
		self.streamMenuList.l.setFont(1, gFont('Regular', 18))
		self.streamMenuList.l.setItemHeight(37) 
		self['streamlist'] = self.streamMenuList
		self.streamMenuList.setList(map(streamListEntry, self.streamList))

		self.onLayoutFinish.append(self.layoutFinished)

		self.rtmpConsole    = None
		self.beforeService  = None
		self.currentService = None
		self.playerStoped   = False
		self.serviceDoCommand = None

		self.keyLocked = False

	def layoutFinished(self):
		rc = os.popen('ps -ef | grep rtmpdump | grep -v grep').read()
		print "a process already running :", rc
		if rc is not None:
			if rc.strip() != '':
				os.system('killall -INT rtmpdump')
	def keyLeft(self):
		if self.keyLocked:
			return
		self['streamlist'].pageUp()

	def keyRight(self):
		if self.keyLocked:
			return
		self['streamlist'].pageDown()

	def keyUp(self):
		if self.keyLocked:
			return
		self['streamlist'].up()

	def keyDown(self):
		if self.keyLocked:
			return
		self['streamlist'].down()

	def keyCancel(self):
		self.cbAppClosed(True)
		self.close()

	def keyOK(self):
		if self.keyLocked:
			return
		self.keyLocked = True
		self.rtmpConsole    = None
		self.beforeService  = None
		self.currentService = None
		self.playerStoped   = False
		self.serviceDoCommand = None

		streamInfo = self["streamlist"].getCurrent()[0][1]
		uriInfo    = streamInfo.get('uri')
		typeInfo   = streamInfo.get('type').split(':')

		protocol = typeInfo[0]
		url      = uriInfo.get('URL')
		if protocol == 'rtmp':
			self.layoutFinished()
			self.rtmpConsole = eConsoleAppContainer()
			self.rtmpConsole.dataAvail.append(self.cbDataAvail)
			self.rtmpConsole.appClosed.append(self.cbAppClosed)
			self.rtmpConsole.execute(self.makeCommand(uriInfo))
		elif protocol in ('rtsp', 'http', 'hls'):
			serviceType = typeInfo[1]
			bufferSize  = typeInfo[2]
			self.doStreamAction(url, serviceType, bufferSize)

	def doStreamAction(self, url=None, serviceType='4097', bufferSize=None):
		if url is None:
			url='/tmp/stream.avi'
			self.streamPlayerTimer.stop()
		try:
			serviceType = int(serviceType)
		except:	serviceType = 4097
		try:
			bufferSize = int(bufferSize)
		except:	bufferSize = None

		service = eServiceReference(serviceType, 0, url)

		streamInfo = self["streamlist"].getCurrent()[0][1]
		uriInfo    = streamInfo.get('uri')
		self.beforeService  = self.session.nav.getCurrentlyPlayingServiceReference()
		self.currentService = self.session.openWithCallback(self.cbFinishedStream, 
								    OpenIPTVPlayer, 
								    service, 
								    cbServiceCommand=self.cbServiceCommand,
								    chName=str(streamInfo.get('name')),
								    chURL =str(uriInfo.get('URL')),
								    chIcon=str(streamInfo.get('icon')))

	def cbServiceCommand(self, params=None):
		if params is None:
			self.playerStoped = True
			return
		if params[0] == 'docommand':
			self.serviceDoCommand = params[1]

	def cbAppClosed(self, ret):
		print ret
		self.doConsoleStop()
		if self.currentService is not None and not self.playerStoped:
			self.serviceDoCommand('bypass_exit')
			message = "The connection was terminated from the stream server."
			self.session.open(MessageBox, message, type=MessageBox.TYPE_INFO)
			self.currentService.close()
			self.currentService = None
			self.serviceDoCommand = None

	def cbDataAvail(self, data):
		print data
		if str(data) == 'Connected...':
			self.streamPlayerTimer = eTimer()
			self.streamPlayerTimer.timeout.get().append(self.doStreamAction)
			self.streamPlayerTimer.start(1000)

	def cbFinishedStream(self):
		self.doConsoleStop()
		self.session.nav.playService(self.beforeService)
		print 'player done!!'

	def doConsoleStop(self):
		self.keyLocked = False
		if self.rtmpConsole is not None:
			self.rtmpConsole.sendCtrlC()
			self.rtmpConsole = None

	def makeCommand(self, uriInfo):
		def appendCommand(key, option):
			try:
				d = uriInfo.get(key)
				if d is not None:
					return "-%s %s " %(option, d)
			except: pass
			return ''
		command  = '%s -v ' % (self.streamBin)
		command += appendCommand('URL', 'r')
		command += appendCommand('PLAYPATH', 'y')
		command += appendCommand('SWFURL', 'W')
		return command

	def makeStreamList(self):
		streamDB = StreamURIParser(self.streamFile).parseStreamList()
		self.streamList = []
		for x in streamDB:
			self.streamList.append((x.get('name'), x))
class serienRecRunAutoCheckScreen(serienRecBaseScreen, Screen, HelpableScreen):
	def __init__(self, session, withTVPlanner=False):
		serienRecBaseScreen.__init__(self, session)
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.session = session
		self.withTVPlanner = withTVPlanner
		self.autoCheckRunning = False

		self["actions"] = HelpableActionMap(self, "SerienRecorderActions", {
			"red": (self.keyCancel, "zurück zur vorherigen Ansicht"),
			"cancel": (self.keyCancel, "zurück zur vorherigen Ansicht"),
			"menu": (self.recSetup, "Menü für globale Einstellungen öffnen"),
			"3"	: (self.showProposalDB, "Liste der Serien/Staffel-Starts anzeigen"),
			"6"		: (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
			"7"		: (self.showWishlist, "Merkzettel (vorgemerkte Folgen) anzeigen"),
		}, -1)
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["SerienRecorderActions" ,], {
			"displayHelp"      : self.showHelp,
			"displayHelp_long" : self.showManual,
		}, 0)

		self.setupSkin()
		self.logliste = []
		self.points = ""

		self.readLogTimer = eTimer()
		self.readLogTimer_conn = None

		self.onLayoutFinish.append(self.setSkinProperties)
		self.onFirstExecBegin.append(self.askForExecute)
		#self.onLayoutFinish.append(self.startCheck)
		#self.onLayoutFinish.append(self.readLog)
		self.onClose.append(self.__onClose)

	def callHelpAction(self, *args):
		HelpableScreen.callHelpAction(self, *args)

	def setSkinProperties(self):
		super(self.__class__, self).setSkinProperties()

		self['text_red'].setText("Abbrechen")
		self.num_bt_text[0][0] = buttonText_na
		self.num_bt_text[4][0] = buttonText_na

		super(self.__class__, self).startDisplayTimer()

	def setupSkin(self):
		self.skin = None
		InitSkin(self)

		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		if config.plugins.serienRec.logWrapAround.value:
			self.chooseMenuList.l.setItemHeight(int(70 *skinFactor))
		else:
			self.chooseMenuList.l.setItemHeight(int(25 *skinFactor))
		self['log'] = self.chooseMenuList
		self['log'].show()

		self['title'].setText("Suche nach neuen Timern läuft...")
		if not config.plugins.serienRec.showAllButtons.value:
			self['bt_red'].show()
			self['bt_exit'].show()
			self['bt_info'].show()
			self['bt_menu'].show()

			self['text_red'].show()
			self['text_0'].show()
			self['text_1'].show()
			self['text_2'].show()
			self['text_3'].show()
			self['text_4'].show()

	def updateMenuKeys(self):
		updateMenuKeys(self)

	def setupClose(self, result):
		super(self.__class__, self).setupClose(result)
		# if result[1]:
		# 	self.startCheck()

	def askForExecute(self):
		if config.plugins.serienRec.tvplaner.value:
			self.session.openWithCallback(self.executeAutoCheck, MessageBox, "Bei 'ja' wird der Suchlauf für TV-Planer Timer gestartet, bei 'nein' wird ein voller Suchlauf durchgeführt.", MessageBox.TYPE_YESNO)
		else:
			self.session.openWithCallback(self.executeFullAutoCheck, MessageBox, "Soll ein Suchlauf für Timer gestartet werden?", MessageBox.TYPE_YESNO)

	def executeAutoCheck(self, withTVPlaner):
		print("[SerienRecorder] ExecuteAutocCheck: %s" % str(withTVPlaner))
		self.withTVPlanner = withTVPlaner
		self.startCheck()

	def executeFullAutoCheck(self, execute):
		print("[SerienRecorder] ExecuteFullAutoCheck: %s" % str(execute))
		if execute:
			self.withTVPlanner = False
			self.startCheck()
		else:
			self.close()

	def startCheck(self):
		# Log Reload Timer
		print("[SerienRecorder] startCheck timer")
		checkForRecordingInstance.setAutoCheckFinished(False)
		self.autoCheckRunning = False
		if isDreamOS():
			self.readLogTimer_conn = self.readLogTimer.timeout.connect(self.readLog)
		else:
			self.readLogTimer.callback.append(self.readLog)
		self.readLogTimer.start(2000)

	def runAutoCheck(self):
		if not self.autoCheckRunning:
			self.autoCheckRunning = True
			checkForRecordingInstance.initialize(self.session, True, self.withTVPlanner)

	def readLog(self):
		print("[SerienRecorder] readLog called")
		if checkForRecordingInstance.isAutoCheckFinished():
			if self.readLogTimer:
				self.readLogTimer.stop()
				self.readLogTimer = None
			print("[SerienRecorder] update log reader stopped.")
			self['title'].setText("Timer-Suchlauf abgeschlossen")

			from .SerienRecorderLogWriter import SRLogger
			logFileHandle = open(SRLogger.getLogFilePath(), "r")
			for zeile in logFileHandle.readlines():
				if (not config.plugins.serienRec.logWrapAround.value) or (len(zeile.strip()) > 0):
					self.logliste.append(zeile)
			logFileHandle.close()
			self.chooseMenuList.setList(list(map(self.buildList, self.logliste)))
			if config.plugins.serienRec.logScrollLast.value:
				count = len(self.logliste)
				if count != 0:
					self['log'].moveToIndex(int(count - 1))
			self.autoCheckRunning = False
		else:
			print("[SerienRecorder] waiting")
			self.points += " ."
			self['title'].setText("Suche nach neuen Timern läuft.%s" % self.points)
			self.runAutoCheck()

	@staticmethod
	def buildList(entry):
		(zeile) = entry
		width = 850
		if config.plugins.serienRec.SkinType.value == "":
			width = 1240

		if config.plugins.serienRec.logWrapAround.value:
			return [entry, (eListboxPythonMultiContent.TYPE_TEXT, 00, 00, width * skinFactor, 65 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER | RT_WRAP, zeile)]
		else:
			return [entry,
			(eListboxPythonMultiContent.TYPE_TEXT, 00, 2 * skinFactor, width * skinFactor, 20 * skinFactor, 0,
			RT_HALIGN_LEFT | RT_VALIGN_CENTER, zeile)]

	def pageUp(self):
		self['log'].pageUp()

	def pageDown(self):
		self['log'].pageDown()

	def __onClose(self):
		if self.readLogTimer:
			self.readLogTimer.stop()
			self.readLogTimer = None
			self.readLogTimer_conn = None

		self.stopDisplayTimer()

	def keyCancel(self):
		self.close(True)
Ejemplo n.º 27
0
class TwitchGamesGrid(TwitchStreamGrid):
	TMP_PREVIEW_FILE_PATH = "/tmp/twitch_game_cover.jpg"
	SKIN_COMPONENT_KEY = "TwitchGamesGrid"
	SKIN_COMPONENT_HEADER_HEIGHT = "headerHeight"
	SKIN_COMPONENT_FOOTER_HEIGHT = "footerHeight"
	SKIN_COMPONENT_ITEM_PADDING = "itemPadding"

	def __init__(self, session):
		TwitchStreamGrid.__init__(self, session, windowTitle=_("Top Games"))
		self.skinName = "TwitchGameGrid"
		sizes = componentSizes[TwitchGamesGrid.SKIN_COMPONENT_KEY]
		self._itemWidth = sizes.get(ComponentSizes.ITEM_WIDTH, 185)
		self._itemHeight = sizes.get(ComponentSizes.ITEM_HEIGHT, 258)
		self._bannerHeight = sizes.get(TwitchGamesGrid.SKIN_COMPONENT_HEADER_HEIGHT, 30)
		self._footerHeight = sizes.get(TwitchGamesGrid.SKIN_COMPONENT_FOOTER_HEIGHT, 60)
		self._itemPadding = sizes.get(TwitchGamesGrid.SKIN_COMPONENT_ITEM_PADDING, 5)
		#one-off calculations
		pad = self._itemPadding * 2
		self._contentWidth = self._itemWidth - pad
		self._contentHeight = self._itemHeight - pad
		self._footerOffset = self._itemHeight - self._itemPadding - self._footerHeight

		self._items = []
		self._list = MenuList(self._items, mode=eListbox.layoutGrid, content=eListboxPythonMultiContent, itemWidth=self._itemWidth, itemHeight=self._itemHeight)
		self["list"] = self._list

		tlf = TemplatedListFonts()
		self._list.l.setFont(0, gFont(tlf.face(tlf.MEDIUM), tlf.size(tlf.MEDIUM)))
		self._list.l.setFont(1, gFont(tlf.face(tlf.SMALLER), tlf.size(tlf.SMALL)))
		self._list.l.setBuildFunc(self._buildFunc, True)

		self._picload.setPara((self._itemWidth, self._itemHeight, self._itemWidth, self._itemHeight, False, 0, '#000000'))

	def _loadContent(self):
		self.twitch.topGames(self._onAllGames)

	def _onAllGames(self, games):
		self._items = []
		for game in games:
			self._items.append((game,))
		self._list.setList(self._items)
		if self._list.instance:
			self.validateCache(True)

	def _buildFunc(self, game, selected):
		if game == "loading":
			return [None,
				MultiContentEntryText(pos = (self._itemPadding, self._itemPadding), size = (self._contentWidth, self._contentHeight), font = 0, backcolor = 0x000000, backcolor_sel=0x000000, flags = RT_HALIGN_CENTER | RT_VALIGN_CENTER, text=_("Loading...")),
			]

		pixmap = self._pixmapCache.get(game.preview, self._defaultPixmap)

		content = [game,
			MultiContentEntryText(pos = (self._itemPadding, self._itemPadding), size = (self._contentWidth, self._contentHeight), font = 0, backcolor = 0, text=""),
			MultiContentEntryPixmapAlphaBlend(pos = (self._itemPadding, self._itemPadding), size = (self._contentWidth, self._contentHeight), png = pixmap, backcolor = 0x000000, backcolor_sel=0x000000, scale_flags = SCALE_ASPECT),
			MultiContentEntryTextAlphaBlend(pos = (self._itemPadding, self._itemPadding), size = (self._contentWidth, self._bannerHeight), font = 1, backcolor = 0x50000000, backcolor_sel=0x50000000, flags = RT_HALIGN_CENTER | RT_VALIGN_CENTER, text="%s" %(game.viewers,)),
			MultiContentEntryTextAlphaBlend(pos = (self._itemPadding, self._footerOffset), size = (self._contentWidth, self._footerHeight), font = 1, backcolor = 0x50000000, backcolor_sel=0x50000000, flags = RT_HALIGN_CENTER | RT_VALIGN_CENTER | RT_WRAP, text=game.name),
		]
		if not selected:
			content.append(MultiContentEntryTextAlphaBlend(pos = (self._itemPadding, self._itemPadding), size = (self._contentWidth, self._contentHeight), font = 0, backcolor = 0x80000000, text=""))
		return content

	def _onOk(self):
		game = self.current
		if not game:
			return
		self.session.open(TwitchLiveStreams, game=game, windowTitle=_("%s - Livestreams") %(game.name,))
Ejemplo n.º 28
0
class Favscreen(Screen):
        try:
		sz_w = getDesktop(0).size().width()
		if sz_w == 1280:
			HD_Res = True
		else:
			HD_Res = False
	except:
		HD_Res = False

	if HD_Res:
	    skin = """
		<screen flags="wfNoBorder" position="0,0" size="1280,720" title="Greek Net Radio " >
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,80" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,120" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,160" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,200" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,240" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,280" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,320" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,360" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,400" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,440" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,480" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,520" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,560" size="40,40" zPosition="-1"/>
		<ePixmap alphatest="on" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/musique.png" position="60,600" size="40,40" zPosition="-1"/>
	    <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/stations.png" position="0,0" size="1280,720"  zPosition="-2"/>
	    <widget name="ButtonGeentext" position="200,630" size="1200,30" valign="left" halign="left" zPosition="10" font="Regular;23" transparent="1" foregroundColor="green"  />
	    <widget name="ButtonGeen" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/buttons/green.png" position="60,645" zPosition="10" size="100,60" transparent="1" alphatest="on" />
		<widget name="stationmenu" itemHeight="40" position="100,80" size="520,560" selectionPixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/barreb.png" transparent="1" scrollbarMode="showNever" zPosition="9"/>
	    </screen>"""

	else:
            skin = """
            <screen position="center,center" size="600,500" title="Greek NetRadio" >
            <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/stations.png" position="0,0" size="620,500"/>
            <widget name="ButtonGeentext" position="80,430" size="500,60" valign="center" halign="center" zPosition="10" font="Regular;21" transparent="1" foregroundColor="green" />
            <widget name="ButtonGeen" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/buttons/green.png" position="0,440" zPosition="10" size="100,60" transparent="1" alphatest="on" />
            <widget name="stationmenu" position="10,80" size="590,380" scrollbarMode="showOnDemand" selectionPixmap="/usr/lib/enigma2/python/Plugins/Extensions/GreekNetRadio/icons/barreb.png" transparent="1" zPosition="4" />
            </screen>"""

	def __init__(self, session):
	        self.session=session
		self.skin = Favscreen.skin
		Screen.__init__(self,session)
                self["key_red"] = Button(_("Exit"))
	        self["key_green"] = Button(_("Delete"))
	        self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference()
		try:
                   self.session.nav.stopService()
                except:
                   pass
		self.onClose.append(self.__onClose)

		self["actions"] = ActionMap(["SetupActions", "ColorActions"],
		{

			"ok"  	  :     self.ok,
			"green"   :     self.Delselected,
			"red"     :     self.close,
			"cancel"  :	self.close,
		}, -2)

		self.list = MenuList([])
		self["ButtonGeen"] = Pixmap()
		self["ButtonGeentext"] = Label(_("Press OK to Play, Green to delete,  or EXIT"))
		self["stationmenu"] = self.list
		lst = lsSelected()
		self.list.setList(lst)
        def Delselected(self):
            try:
                sel = self["stationmenu"].getSelectedIndex()
		config.plugins.Cradio.stations_count.value = config.plugins.Cradio.stations_count.value - 1
		config.plugins.Cradio.stations_count.save()
		del config.plugins.Cradio.stations[sel]
		config.plugins.Cradio.stations.save()
		config.plugins.Cradio.save()
		configfile.save()
		lst=[]
		lst = lsSelected()
	        self["stationmenu"].setList(lst)
	        if config.plugins.Cradio.stations_count.value == 0:
                  self["key_green"].hide()
                else:
                  self["key_green"].show()
            except:
                pass
        def playServiceStream(self, url):
          try:
            self.session.nav.stopService()
            sref = eServiceReference(4097, 0, url)
            self.session.nav.playService(sref)
            self.currentStreamingURL = url
          except:
            pass
        def ok(self):
            try:
		 station = self.list.getSelectionIndex()
		 currentindex=station
	         cname=config.plugins.Cradio.stations[station].code.value
		 tup1= cname.split(",")
		 cstation=tup1[0]
		 curl=tup1[1]
		 self.currentStreamingURL = ""
	         self.currentStreamingStation = ""
	 	 self.session.nav.stopService()
	         self.currentStreamingStation = cstation
		 self.playServiceStream(curl)
		 currentservice=self.CurrentService
                 self.session.open(Playscreen,cstation,currentservice,currentindex)
            except:
                 pass
        def playServiceStream(self, url):
          try:
            self.session.nav.stopService()
            sref = eServiceReference(4097, 0, url)
            self.session.nav.playService(sref)
            self.currentStreamingURL = url
          except:
            pass
        def __onClose(self):
          self.session.nav.playService(self.CurrentService)
class serienRecWishlistScreen(serienRecBaseScreen, Screen, HelpableScreen):
	def __init__(self, session):
		serienRecBaseScreen.__init__(self, session)
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.session = session
		self.picload = ePicLoad()
		self.database = SRDatabase(SerienRecorder.serienRecDataBaseFilePath)
		self.chooseMenuList_popup = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)

		self["actions"] = HelpableActionMap(self, "SerienRecorderActions", {
			"ok"    : (self.keyOK, "für die ausgewählte Serien neue Einträge hinzufügen"),
			"cancel": (self.keyCancel, "zurück zur vorherigen Ansicht"),
			"left"  : (self.keyLeft, "zur vorherigen Seite blättern"),
			"right" : (self.keyRight, "zur nächsten Seite blättern"),
			"up"    : (self.keyUp, "eine Zeile nach oben"),
			"down"  : (self.keyDown, "eine Zeile nach unten"),
			"red"	: (self.keyRed, "ausgewählten Eintrag löschen"),
			"green" : (self.keyGreen, "alle Änderungen speichern und zurück zur vorherigen Ansicht"),
			"yellow": (self.keyYellow, "umschalten Sortierung ein/aus"),
			"blue"	: (self.keyBlue, "alle Einträge aus der Liste endgültig löschen"),
			"menu"  : (self.recSetup, "Menü für globale Einstellungen öffnen"),
			"0"		: (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
			"3"		: (self.showProposalDB, "Liste der Serien/Staffel-Starts anzeigen"),
			"4"		: (self.serieInfo, "Informationen zur ausgewählten Serie anzeigen"),
			"6"		: (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
		}, -1)
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["SerienRecorderActions" ,], {
			"displayHelp"      : self.showHelp,
			"displayHelp_long" : self.showManual,
		}, 0)

		self.setupSkin()

		self.delAdded = False
		self.wishlist = []
		self.wishlist_tmp = []
		self.dbData = []
		self.modus = "menu_list"
		self.aSerie = ""
		self.aStaffel = 0
		self.aFromEpisode = 0
		self.aToEpisode = 0

		self.onLayoutFinish.append(self.readWishlist)
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.setSkinProperties)

	def callHelpAction(self, *args):
		HelpableScreen.callHelpAction(self, *args)

	def setSkinProperties(self):
		super(self.__class__, self).setSkinProperties()

		self['text_red'].setText("Eintrag löschen")
		self['text_green'].setText("Speichern")
		self['text_ok'].setText("Eintrag anlegen")
		if config.plugins.serienRec.wishListSorted.value:
			self['text_yellow'].setText("unsortierte Liste")
		else:
			self['text_yellow'].setText("Sortieren")
		self['text_blue'].setText("Liste leeren")
		self.num_bt_text[2][1] = buttonText_na

		super(self.__class__, self).startDisplayTimer()

	def setupSkin(self):
		self.skin = None
		InitSkin(self)

		# normal
		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList.l.setItemHeight(int(25 *skinFactor))
		self['menu_list'] = self.chooseMenuList
		self['menu_list'].show()

		# popup
		self.chooseMenuList_popup = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList_popup.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList_popup.l.setItemHeight(int(25 *skinFactor))
		self['popup_list'] = self.chooseMenuList_popup
		self['popup_list'].hide()

		self['title'].setText("Diese Episoden sind zur Aufnahme vorgemerkt")

		if config.plugins.serienRec.showCover.value:
			self['cover'].show()

		if not config.plugins.serienRec.showAllButtons.value:
			self['bt_red'].show()
			self['bt_green'].show()
			self['bt_ok'].show()
			self['bt_yellow'].show()
			self['bt_blue'].show()
			self['bt_exit'].show()
			#self['bt_text'].show()
			self['bt_info'].show()
			self['bt_menu'].show()

			self['text_red'].show()
			self['text_green'].show()
			self['text_ok'].show()
			self['text_yellow'].show()
			self['text_blue'].show()
			self['text_0'].show()
			self['text_1'].show()
			self['text_2'].show()
			self['text_3'].show()
			self['text_4'].show()

	def updateMenuKeys(self):
		updateMenuKeys(self)

	def serieInfo(self):
		if self.modus == "menu_list":
			check = self['menu_list'].getCurrent()
			if check is None:
				return
			serien_name = self['menu_list'].getCurrent()[0][1]
		else:
			check = self['popup_list'].getCurrent()
			if check is None:
				return
			serien_name = self['popup_list'].getCurrent()[0][0]

		serien_id = None
		url = self.database.getMarkerURL(serien_name)
		if url:
			serien_id = url
		if serien_id:
			from SerienRecorderSeriesInfoScreen import serienRecShowInfo
			self.session.open(serienRecShowInfo, serien_name, serien_id)

	def setupClose(self, result):
		super(self.__class__, self).setupClose(result)
		if result[1]:
			self.readWishlist()

	def readWishlist(self):
		self.wishlist = []
		bookmarks = self.database.getBookmarks()
		for bookmark in bookmarks:
			(Serie, Staffel, Episode, numberOfRecordings) = bookmark
			zeile = "%s S%sE%s" % (Serie, str(Staffel).zfill(2), str(Episode).zfill(2))
			self.wishlist.append((zeile, Serie, Staffel, Episode))

		self.wishlist_tmp = self.wishlist[:]
		if config.plugins.serienRec.wishListSorted.value:
			self.wishlist_tmp.sort()
		self.chooseMenuList.setList(map(self.buildList, self.wishlist_tmp))
		self.getCover()

	@staticmethod
	def buildList(entry):
		(zeile, Serie, Staffel, Episode) = entry
		return [entry,
		        (eListboxPythonMultiContent.TYPE_TEXT, 20, 00, 1280 * skinFactor, 25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, zeile)
		        ]

	@staticmethod
	def buildList_popup(entry):
		(Serie,) = entry
		return [entry,
		        (eListboxPythonMultiContent.TYPE_TEXT, 5, 0, 560 * skinFactor, 25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, Serie)
		        ]

	def answerStaffel(self, aStaffel):
		self.aStaffel = aStaffel
		if self.aStaffel is None or self.aStaffel == "":
			return
		self.session.openWithCallback(self.answerFromEpisode, NTIVirtualKeyBoard, title = "von Episode:")

	def answerFromEpisode(self, aFromEpisode):
		self.aFromEpisode = aFromEpisode
		if self.aFromEpisode is None or self.aFromEpisode == "":
			return
		self.session.openWithCallback(self.answerToEpisode, NTIVirtualKeyBoard, title = "bis Episode:")

	def answerToEpisode(self, aToEpisode):
		self.aToEpisode = aToEpisode
		print "[SerienRecorder] Staffel: %s" % self.aStaffel
		print "[SerienRecorder] von Episode: %s" % self.aFromEpisode
		print "[SerienRecorder] bis Episode: %s" % self.aToEpisode

		if self.aToEpisode is None or self.aFromEpisode is None or self.aStaffel is None or self.aToEpisode == "":
			return
		else:
			self.database.addBookmark(self.aSerie, self.aFromEpisode, self.aToEpisode, self.aStaffel, int(config.plugins.serienRec.NoOfRecords.value))
			self.readWishlist()

	def keyOK(self):
		if self.modus == "menu_list":
			self.modus = "popup_list"
			self['popup_list'].show()
			self['popup_bg'].show()
			self['menu_list'].hide()
			l = self.database.getMarkerNames()
			self.chooseMenuList_popup.setList(map(self.buildList_popup, l))
			self['popup_list'].moveToIndex(0)
		else:
			self.modus = "menu_list"
			self['menu_list'].show()
			self['popup_list'].hide()
			self['popup_bg'].hide()

			if self['popup_list'].getCurrent() is None:
				print "[SerienRecorder] Marker-Liste leer."
				return

			self.aSerie = self['popup_list'].getCurrent()[0][0]
			self.aStaffel = 0
			self.aFromEpisode = 0
			self.aToEpisode = 0
			self.session.openWithCallback(self.answerStaffel, NTIVirtualKeyBoard, title = "%s: Staffel eingeben:" % self.aSerie)

	def keyRed(self):
		check = self['menu_list'].getCurrent()
		if check is None:
			print "[SerienRecorder] Merkzettel ist leer."
			return
		else:
			zeile = self['menu_list'].getCurrent()[0]
			(title, serie, staffel, episode) = zeile
			self.dbData.append((serie.lower(), str(staffel).lower(), episode.lower()))
			self.wishlist_tmp.remove(zeile)
			self.wishlist.remove(zeile)
			self.chooseMenuList.setList(map(self.buildList, self.wishlist_tmp))
			self.delAdded = True

	def keyGreen(self):
		if self.delAdded:
			self.database.removeBookmarks(self.dbData)
		self.close()

	def keyYellow(self):
		if len(self.wishlist_tmp) != 0:
			if config.plugins.serienRec.wishListSorted.value:
				self.wishlist_tmp = self.wishlist[:]
				self['text_yellow'].setText("Sortieren")
				config.plugins.serienRec.wishListSorted.setValue(False)
			else:
				self.wishlist_tmp.sort()
				self['text_yellow'].setText("unsortierte Liste")
				config.plugins.serienRec.wishListSorted.setValue(True)
			config.plugins.serienRec.wishListSorted.save()
			SerienRecorder.configfile.save()

			self.chooseMenuList.setList(map(self.buildList, self.wishlist_tmp))
			self.getCover()

	def keyBlue(self):
		check = self['menu_list'].getCurrent()
		if check is None:
			print "[SerienRecorder] Merkzettel ist leer."
			return
		else:
			if config.plugins.serienRec.confirmOnDelete.value:
				self.session.openWithCallback(self.callClearListMsg, MessageBox, "Soll die Liste wirklich geleert werden?", MessageBox.TYPE_YESNO, default = False)
			else:
				self.callClearListMsg(True)

	def callClearListMsg(self, answer):
		if answer:
			self.database.removeAllBookmarks()
			self.readWishlist()
		else:
			return

	def getCover(self):
		if self.modus == "menu_list":
			check = self['menu_list'].getCurrent()
			if check is None:
				return
			serien_name = self['menu_list'].getCurrent()[0][1]
		else:
			check = self['popup_list'].getCurrent()
			if check is None:
				return
			serien_name = self['popup_list'].getCurrent()[0][0]

		serien_id = None
		url = self.database.getMarkerURL(serien_name)
		if url:
			serien_id = url

		SerienRecorder.getCover(self, serien_name, serien_id)

	def keyLeft(self):
		self[self.modus].pageUp()
		self.getCover()

	def keyRight(self):
		self[self.modus].pageDown()
		self.getCover()

	def keyDown(self):
		self[self.modus].down()
		self.getCover()

	def keyUp(self):
		self[self.modus].up()
		self.getCover()

	def __onClose(self):
		self.stopDisplayTimer()

	def callDeleteMsg(self, answer):
		if answer:
			self.keyGreen()
		self.close()

	def keyCancel(self):
		if self.delAdded:
			self.session.openWithCallback(self.callDeleteMsg, MessageBox, "Sollen die Änderungen gespeichert werden?", MessageBox.TYPE_YESNO, default = True)
		else:
			self.close()
Ejemplo n.º 30
0
class serienRecMainScreen(serienRecBaseScreen, Screen, HelpableScreen):
    def __init__(self, session):
        serienRecBaseScreen.__init__(self, session)
        Screen.__init__(self, session)
        HelpableScreen.__init__(self)
        self.session = session
        self.picload = ePicLoad()
        self.picloader = None
        self.skin = None
        self.chooseMenuList = None
        self.chooseMenuList_popup = None
        self.popup_list = []
        self.piconLoader = PiconLoader()
        self.database = None
        self.singleTimer_conn = None
        self.displayTimer_conn = None

        self["actions"] = HelpableActionMap(
            self, "SerienRecorderActions", {
                "ok":
                (self.keyOK, "Marker für die ausgewählte Serie hinzufügen"),
                "cancel": (self.keyCancel, "SerienRecorder beenden"),
                "left": (self.keyLeft, "zur vorherigen Seite blättern"),
                "right": (self.keyRight, "zur nächsten Seite blättern"),
                "up": (self.keyUp, "eine Zeile nach oben"),
                "down": (self.keyDown, "eine Zeile nach unten"),
                "red": (self.keyRed, "Anzeige-Modus auswählen"),
                "green": (self.keyGreen, "Ansicht Sender-Zuordnung öffnen"),
                "yellow": (self.keyYellow, "Ansicht Serien-Marker öffnen"),
                "blue": (self.keyBlue, "Ansicht Timer-Liste öffnen"),
                "info": (self.keyCheck, "Suchlauf für Timer starten"),
                "menu":
                (self.recSetup, "Menü für globale Einstellungen öffnen"),
                "nextBouquet":
                (self.nextPage, "Serienplaner des nächsten Tages laden"),
                "prevBouquet":
                (self.backPage, "Serienplaner des vorherigen Tages laden"),
                "startTeletext":
                (self.wunschliste,
                 "Informationen zur ausgewählten Serie auf Wunschliste anzeigen"
                 ),
                "0":
                (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
                "1": (self.searchSeries, "Serie manuell suchen"),
                "2": (self.changeTVDBID, "TVDB-ID ändern"),
                "3": (self.showProposalDB,
                      "Liste der Serien/Staffel-Starts anzeigen"),
                "4": (self.serieInfo,
                      "Informationen zur ausgewählten Serie anzeigen"),
                "6":
                (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
                "7": (self.showWishlist,
                      "Merkzettel (vorgemerkte Folgen) anzeigen"),
                "8": (self.reloadSerienplaner, "Serienplaner neu laden"),
            }, -1)
        self.helpList[0][2].sort()

        self["helpActions"] = ActionMap([
            "SerienRecorderActions",
        ], {
            "displayHelp": self.showHelp,
            "displayHelp_long": self.showManual,
        }, 0)

        ReadConfigFile()

        if not os.path.exists(config.plugins.serienRec.piconPath.value):
            config.plugins.serienRec.showPicons.value = False

        self.setupSkin()

        global showMainScreen
        if config.plugins.serienRec.firstscreen.value == "0":
            showMainScreen = True
        else:
            showMainScreen = False

        self.pRegional = 0
        self.pPaytv = 1
        self.pPrime = 1
        self.page = 0
        self.modus = "list"
        self.loading = True
        self.daylist = [[]]
        self.displayTimer = None
        self.displayMode = 1
        self.serviceRefs = None

        self.onLayoutFinish.append(self.setSkinProperties)
        self.onClose.append(self.__onClose)

        self.onFirstExecBegin.append(self.showSplashScreen)
        self.onFirstExecBegin.append(self.checkForUpdate)

        if config.plugins.serienRec.showStartupInfoText.value:
            if fileExists("%s/StartupInfoText" % os.path.dirname(__file__)):
                self.onFirstExecBegin.append(self.showInfoText)
            else:
                self.onFirstExecBegin.append(self.startScreen)
        else:
            self.onFirstExecBegin.append(self.startScreen)

    def showInfoText(self):
        from .SerienRecorderStartupInfoScreen import ShowStartupInfo
        self.session.openWithCallback(self.startScreen, ShowStartupInfo)

    def showSplashScreen(self):
        from .SerienRecorderSplashScreen import ShowSplashScreen
        self.session.openWithCallback(self.checkForUpdate, ShowSplashScreen)

    def checkForUpdate(self):
        if config.plugins.serienRec.Autoupdate.value:
            from .SerienRecorderUpdateScreen import checkGitHubUpdate
            checkGitHubUpdate(self.session).checkForUpdate()

        self.startScreen()

    def callHelpAction(self, *args):
        HelpableScreen.callHelpAction(self, *args)

    def setSkinProperties(self):
        super(self.__class__, self).setSkinProperties()

        self['text_red'].setText("Anzeige-Modus")
        self['text_green'].setText("Sender zuordnen")
        self['text_ok'].setText("Marker hinzufügen")
        self['text_yellow'].setText("Serien-Marker")
        self['text_blue'].setText("Timer-Liste")
        self.num_bt_text[1][0] = "Serie suchen"
        self.num_bt_text[2][0] = "TVDB-ID ändern"
        self.num_bt_text[2][2] = "Timer suchen"
        self.num_bt_text[3][1] = "Neu laden"

        super(self.__class__, self).startDisplayTimer()

    def setupSkin(self):
        self.skin = None
        InitSkin(self)

        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.chooseMenuList.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList.l.setItemHeight(int(50 * skinFactor))
        self['menu_list'] = self.chooseMenuList
        self['menu_list'].show()

        # popup
        self.chooseMenuList_popup = MenuList(
            [], enableWrapAround=True, content=eListboxPythonMultiContent)
        self.chooseMenuList_popup.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList_popup.l.setItemHeight(int(30 * skinFactor))
        self['popup_list'] = self.chooseMenuList_popup
        self['popup_list'].hide()

        self['title'].setText("Lade infos from Web...")

        if config.plugins.serienRec.showCover.value:
            self['cover'].show()

        if not config.plugins.serienRec.showAllButtons.value:
            self['bt_red'].show()
            self['bt_green'].show()
            self['bt_ok'].show()
            self['bt_yellow'].show()
            self['bt_blue'].show()
            self['bt_exit'].show()
            self['bt_text'].show()
            self['bt_epg'].show()
            self['bt_info'].show()
            self['bt_menu'].show()

            self['text_red'].show()
            self['text_green'].show()
            self['text_ok'].show()
            self['text_yellow'].show()
            self['text_blue'].show()
            self['text_0'].show()
            self['text_1'].show()
            self['text_2'].show()
            self['text_3'].show()
            self['text_4'].show()

    def updateMenuKeys(self):
        updateMenuKeys(self)

    def changeTVDBID(self):
        from .SerienRecorderScreenHelpers import EditTVDBID
        (serien_name, serien_wlid, serien_fsid,
         serien_info) = self.getCurrentSelection()
        editTVDBID = EditTVDBID(self, self.session, serien_name, serien_wlid,
                                serien_fsid)
        editTVDBID.changeTVDBID()

    def reloadSerienplaner(self):
        # lt = datetime.datetime.now()
        # lt += datetime.timedelta(days=self.page)
        # key = time.strftime('%d.%m.%Y', lt.timetuple())
        # cache = serienRecMainScreen.loadPlanerData(config.plugins.serienRec.screenplaner.value)
        # if key in cache:
        # 	del cache[key]
        self.readPlanerData(True)

    def readLogFile(self):
        from .SerienRecorderLogScreen import serienRecReadLog
        self.session.open(serienRecReadLog)

    def showProposalDB(self):
        from .SerienRecorderSeasonBeginsScreen import serienRecShowSeasonBegins
        self.session.openWithCallback(self.readPlanerData,
                                      serienRecShowSeasonBegins)

    def searchSeries(self):
        if self.modus == "list":
            self.session.openWithCallback(self.wSearch,
                                          NTIVirtualKeyBoard,
                                          title="Serien Titel eingeben:")

    def wSearch(self, serien_name):
        if serien_name:
            from .SerienRecorderSearchResultScreen import serienRecSearchResultScreen
            self.session.openWithCallback(self.handleSeriesSearchEnd,
                                          serienRecSearchResultScreen,
                                          serien_name)

    def handleSeriesSearchEnd(self, serien_wlid=None):
        if serien_wlid:
            from .SerienRecorderMarkerScreen import serienRecMarker
            self.session.openWithCallback(self.readPlanerData, serienRecMarker,
                                          serien_wlid)
        else:
            self.readPlanerData(False)

    def serieInfo(self):
        if self.loading or self['menu_list'].getCurrent() is None:
            return

        (serien_name, serien_wlid, serien_fsid,
         serien_info) = self.getCurrentSelection()
        from .SerienRecorderSeriesInfoScreen import serienRecShowInfo
        self.session.open(serienRecShowInfo, serien_name, serien_wlid,
                          serien_fsid)

    def wunschliste(self):
        (serien_name, serien_wlid, serien_fsid,
         serien_info) = self.getCurrentSelection()
        super(self.__class__, self).wunschliste(serien_wlid)

    def setHeadline(self):
        if int(config.plugins.serienRec.screenplaner.value) == 1:
            self['headline'].setText("Serien-Planer (Serien Tagesübersicht)")
            self['text_red'].setText("Top 30")
        elif int(config.plugins.serienRec.screenplaner.value) == 2:
            self['headline'].setText("Top 30 SerienRecorder Serien")
            self['text_red'].setText("Tagesübersicht")

        self['headline'].instance.setForegroundColor(parseColor("red"))

    def recSetup(self):
        from .SerienRecorderSetupScreen import serienRecSetup
        self.session.openWithCallback(self.setupClose, serienRecSetup)

    def setupClose(self, result):
        super(self.__class__, self).setupClose(result)
        if result[1]:
            self.readPlanerData()

    def startScreen(self):
        print("[SerienRecorder] version %s is running..." %
              config.plugins.serienRec.showversion.value)

        from .SerienRecorderCheckForRecording import checkForRecordingInstance, refreshTimer, initDB

        if not refreshTimer:
            if config.plugins.serienRec.timeUpdate.value:
                checkForRecordingInstance.initialize(self.session, False,
                                                     False)

        if not initDB():
            print("[SerienRecorder] initDB failed")
            super(self.__class__, self).close()
        else:
            self.database = SRDatabase(serienRecDataBaseFilePath)
            if not self.database.hasChannels():
                print("[SerienRecorder] Channellist is empty !")
                from .SerienRecorderChannelScreen import serienRecMainChannelEdit
                self.session.openWithCallback(self.readPlanerData,
                                              serienRecMainChannelEdit)
            else:
                from .SerienRecorderChannelScreen import checkChannelListTimelineness
                self.serviceRefs = self.database.getActiveServiceRefs()
                channelListUpToDate = True
                if config.plugins.serienRec.channelUpdateNotification.value == '0':
                    channelListUpToDate = checkChannelListTimelineness(
                        self.database)

                if channelListUpToDate:
                    self.switchStartScreen()
                else:
                    self.session.openWithCallback(
                        self.handleChannelListUpdate, MessageBox,
                        "Die Senderliste wurde auf dem Server aktualisiert.\nSie muss auch im SerienRecorder aktualisiert werden.\nWechseln Sie zur Senderzuordnung und aktualisieren Sie die Senderliste mit der grünen Taste.\n\nZur Senderzuordnung wechseln?",
                        MessageBox.TYPE_YESNO)

    def handleChannelListUpdate(self, showChannelEdit=False):
        if showChannelEdit:
            from .SerienRecorderChannelScreen import serienRecMainChannelEdit
            self.session.openWithCallback(self.switchStartScreen,
                                          serienRecMainChannelEdit)
        else:
            self.switchStartScreen()

    def switchStartScreen(self, unused=None):
        if not showMainScreen:
            from .SerienRecorderMarkerScreen import serienRecMarker
            self.session.openWithCallback(self.readPlanerData, serienRecMarker)
        else:
            self.readPlanerData(False)

    def readPlanerData(self, clearCache=True):
        print("[SerienRecorder] readPlanerData - Clear cache =", clearCache)
        if not showMainScreen:
            self.keyCancel()
            self.close()
            return

        self.setHeadline()
        self['title'].instance.setForegroundColor(parseColor("foreground"))

        self.loading = True
        self['title'].setText("Lade Infos aus dem Speicher...")
        cache = serienRecSeriesPlanner.loadPlannerData(
            config.plugins.serienRec.screenplaner.value)

        if clearCache:
            cache.clear()

        lt = datetime.datetime.now()
        if config.plugins.serienRec.screenplaner.value == 1:
            lt += datetime.timedelta(days=self.page)
        key = time.strftime('%d.%m.%Y', lt.timetuple())
        if key in cache:
            try:
                if config.plugins.serienRec.screenplaner.value == 1:
                    self.processPlanerData(cache[key], True)
                else:
                    self.processTopThirty(cache[key], True)
            except:
                SRLogger.writeLog(
                    "Fehler beim Lesen und Verarbeiten der Serien-Planer bzw. Top30 Daten aus dem Cache.\n",
                    True)
        else:
            self['title'].setText("Lade Infos vom Web...")
            webChannels = self.database.getActiveChannels()

            def cacheData():
                if config.plugins.serienRec.screenplaner.value == 1:
                    result = SeriesServer().doGetPlannerData(
                        int(self.page), webChannels)
                else:
                    result = SeriesServer().doGetTopThirty()
                return result

            def onCacheDataSuccessful(result):
                if config.plugins.serienRec.screenplaner.value == 1:
                    self.processPlanerData(result, False)
                else:
                    self.processTopThirty(result, False)

            def onCacheDataFailed():
                SRLogger.writeLog(
                    "Fehler beim Abrufen und Verarbeiten der Serien-Planer bzw. Top30 Daten vom SerienServer.\n",
                    True)

            import twisted.python.runtime
            if twisted.python.runtime.platform.supportsThreads():
                from twisted.internet.threads import deferToThread
                deferToThread(cacheData).addCallback(
                    onCacheDataSuccessful).addErrback(onCacheDataFailed)
            else:
                try:
                    data = cacheData()
                    onCacheDataSuccessful(data)
                except:
                    onCacheDataFailed()

    def processPlanerData(self, data, useCache=False):
        if not data or len(data) == 0:
            self['title'].setText(
                "Fehler beim Abrufen der Serien-Planer Daten")
            return
        if useCache:
            (headDate, self.daylist) = data
        else:
            markers = self.database.getAllMarkerStatusForBoxID(
                config.plugins.serienRec.BoxID.value)

            seriesPlanner = serienRecSeriesPlanner()
            (headDate, self.daylist) = seriesPlanner.processPlannerData(
                data, markers, self.page)

        self.loading = False

        if len(self.daylist[0]) != 0:
            if headDate:
                self['title'].setText(
                    "Für %s werden %s Episode(n) vorgeschlagen." %
                    (headDate[0], len(self.daylist[0])))
                self['title'].instance.setForegroundColor(
                    parseColor("foreground"))
            else:
                self['title'].setText(
                    "Für heute werden %s Episode(n) vorgeschlagen." %
                    len(self.daylist[0]))
                self['title'].instance.setForegroundColor(
                    parseColor("foreground"))
            self.chooseMenuList.setList(
                list(map(self.buildPlanerList, self.daylist[0])))
            self.getCover()
        else:
            if int(self.page) < 1 and not int(self.page) == 0:
                self.page -= 1
            self['title'].setText(
                "Für heute werden %s Episode(n) vorgeschlagen." %
                len(self.daylist[0]))
            self['title'].instance.setForegroundColor(parseColor("foreground"))
            print(
                "[SerienRecorder] Wunschliste Serien-Planer -> LISTE IST LEER !!!!"
            )
            self.chooseMenuList.setList(
                list(map(self.buildPlanerList, self.daylist[0])))

    def processTopThirty(self, data, useCache=False):
        if not data or len(data) == 0:
            self['title'].setText(
                "Fehler beim Abrufen der Serien-Planer Daten")
            return
        if useCache:
            (headDate, self.daylist) = data
        else:
            self.daylist = [[]]
            headDate = [data["date"]]

            markers = self.database.getAllMarkerStatusForBoxID(
                config.plugins.serienRec.BoxID.value)

            rank = 0
            for serie in data["series"]:
                serien_name = toStr(serie["name"])
                serien_wlid = int(serie["id"])
                serien_fsid = serie["fs_id"]
                serien_info = serie["info"]
                average = serie["average"]

                # 0 = no marker, 1 = active marker, 2 = deactive marker
                serieAdded = 0
                if serien_wlid in markers:
                    serieAdded = 1 if markers[serien_wlid] else 2

                rank += 1
                self.daylist[0].append(
                    (serien_name, average, serien_wlid, serieAdded, rank,
                     serien_fsid, serien_info))

            if headDate:
                d = headDate[0].split(',')
                d.reverse()
                key = d[0].strip()
                cache = serienRecSeriesPlanner.loadPlannerData(2)
                cache.update({key: (headDate, self.daylist)})
                serienRecSeriesPlanner.writePlannerData(2, cache)

        self.loading = False
        self['title'].setText("")
        self.chooseMenuList.setList(
            list(map(self.buildTopThirtyList, self.daylist[0])))
        self.getCover()

    def buildPlanerList(self, entry):
        (regional, paytv, neu, prime, transmissionTime, serien_name, sender,
         staffel, episode, title, aufnahme, serieAdded, bereits_vorhanden,
         serien_wlid, serien_fsid, serien_info) = entry

        serienRecMainPath = os.path.dirname(__file__)
        imageNone = "%s/images/black.png" % serienRecMainPath
        imageNeu = "%s/images/neu.png" % serienRecMainPath
        imageTimer = "%s/images/timer.png" % serienRecMainPath
        imageHDD = "%s/images/hdd_icon.png" % serienRecMainPath

        if serieAdded == 1:
            seriesColor = parseColor('green').argb()
        elif serieAdded == 2:
            seriesColor = parseColor('red').argb()
        else:
            seriesColor = None
        if aufnahme:
            seriesColor = parseColor('blue').argb()

        titleColor = timeColor = parseColor('foreground').argb()

        if int(neu) == 0:
            imageNeu = imageNone

        if bereits_vorhanden:
            imageHDDTimer = imageHDD
        elif aufnahme:
            imageHDDTimer = imageTimer
        else:
            imageHDDTimer = imageNone

        if config.plugins.serienRec.showPicons.value != "0":
            picon = loadPNG(imageNone)
            if sender and self.serviceRefs.get(sender):
                # Get picon by reference or name
                piconPath = self.piconLoader.getPicon(
                    self.serviceRefs.get(sender)[0] if config.plugins.
                    serienRec.showPicons.value ==
                    "1" else self.serviceRefs.get(sender)[1])
                if piconPath:
                    self.picloader = PicLoader(80 * skinFactor,
                                               40 * skinFactor)
                    picon = self.picloader.load(piconPath)
                    self.picloader.destroy()

            return [
                entry,
                (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5,
                 5 * skinFactor, 80 * skinFactor, 40 * skinFactor, picon),
                (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST,
                 330 * skinFactor, 7 * skinFactor, 30 * skinFactor,
                 22 * skinFactor, loadPNG(imageNeu)),
                (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST,
                 330 * skinFactor, 30 * skinFactor, 30 * skinFactor,
                 22 * skinFactor, loadPNG(imageHDDTimer)),
                (eListboxPythonMultiContent.TYPE_TEXT, 100 * skinFactor, 3,
                 230 * skinFactor, 26 * skinFactor, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, sender),
                (eListboxPythonMultiContent.TYPE_TEXT, 100 * skinFactor,
                 29 * skinFactor, 150 * skinFactor, 18 * skinFactor, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, transmissionTime,
                 timeColor, timeColor),
                (eListboxPythonMultiContent.TYPE_TEXT, 365 * skinFactor, 3,
                 500 * skinFactor, 26 * skinFactor, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, serien_name, seriesColor,
                 seriesColor),
                (eListboxPythonMultiContent.TYPE_TEXT, 365 * skinFactor,
                 29 * skinFactor, 500 * skinFactor, 18 * skinFactor, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, title, titleColor,
                 titleColor)
            ]
        else:
            return [
                entry,
                (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 7,
                 30 * skinFactor, 22 * skinFactor, loadPNG(imageNeu)),
                (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5,
                 30 * skinFactor, 30 * skinFactor, 22 * skinFactor,
                 loadPNG(imageHDDTimer)),
                (eListboxPythonMultiContent.TYPE_TEXT, 40 * skinFactor, 3,
                 280 * skinFactor, 26 * skinFactor, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, sender),
                (eListboxPythonMultiContent.TYPE_TEXT, 40 * skinFactor,
                 29 * skinFactor, 150 * skinFactor, 18 * skinFactor, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, transmissionTime,
                 timeColor, timeColor),
                (eListboxPythonMultiContent.TYPE_TEXT, 340 * skinFactor, 3,
                 520 * skinFactor, 26 * skinFactor, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, serien_name, seriesColor,
                 seriesColor),
                (eListboxPythonMultiContent.TYPE_TEXT, 340 * skinFactor,
                 29 * skinFactor, 520 * skinFactor, 18 * skinFactor, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, title, titleColor,
                 titleColor)
            ]

    @staticmethod
    def buildTopThirtyList(entry):
        (serien_name, average, serien_wlid, serieAdded, rank, serien_fsid,
         serien_info) = entry

        if serieAdded == 1:
            seriesColor = parseColor('green').argb()
        elif serieAdded == 2:
            seriesColor = parseColor('red').argb()
        else:
            seriesColor = None

        rank = "%d." % rank
        title = "%s (%s)" % (serien_name, serien_info)
        subTitle = "%d Abrufe/Tag" % average
        subTitleColor = parseColor('foreground').argb()

        return [
            entry,
            (eListboxPythonMultiContent.TYPE_TEXT, 5 * skinFactor, 3,
             40 * skinFactor, 26 * skinFactor, 0,
             RT_HALIGN_RIGHT | RT_VALIGN_CENTER, rank, subTitleColor,
             subTitleColor),
            (eListboxPythonMultiContent.TYPE_TEXT, 70 * skinFactor, 3,
             520 * skinFactor, 26 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, title, seriesColor,
             seriesColor),
            (eListboxPythonMultiContent.TYPE_TEXT, 70 * skinFactor,
             29 * skinFactor, 520 * skinFactor, 18 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, subTitle, subTitleColor,
             subTitleColor)
        ]

    def keyOK(self):
        if self.modus == "list":
            if self.loading or self['menu_list'].getCurrent() is None:
                return

            (serien_name, serien_wlid, serien_fsid,
             serien_info) = self.getCurrentSelection()
            self.session.openWithCallback(
                self.addMarker, MessageBox,
                "Soll für die Serie '%s' ein Serien-Marker angelegt werden?" %
                serien_name, MessageBox.TYPE_YESNO)

    def addMarker(self, add):
        if add:
            (serien_name, serien_wlid, serien_fsid,
             serien_info) = self.getCurrentSelection()
            if config.plugins.serienRec.activateNewOnThisSTBOnly.value:
                boxID = None
            else:
                boxID = config.plugins.serienRec.BoxID.value

            if self.database.addMarker(str(serien_wlid), serien_name,
                                       serien_info, serien_fsid, boxID, 0):
                SRLogger.writeLog(
                    "Ein Serien-Marker für '%s (%s)' wurde angelegt" %
                    (serien_name, serien_info), True)
                self['title'].setText("Marker '%s (%s)' wurde angelegt." %
                                      (serien_name, serien_info))
                self['title'].instance.setForegroundColor(parseColor("green"))

                from .SerienRecorder import getCover
                getCover(self, serien_name, serien_wlid, serien_fsid, False,
                         True)

                if config.plugins.serienRec.openMarkerScreen.value:
                    from .SerienRecorderMarkerScreen import serienRecMarker
                    self.session.open(serienRecMarker, serien_wlid)
            else:
                self['title'].setText(
                    "Marker für '%s (%s)' ist bereits vorhanden." %
                    (serien_name, serien_info))
                self['title'].instance.setForegroundColor(parseColor("red"))

    def getCover(self):
        if self.loading or self['menu_list'].getCurrent() is None:
            return

        (serien_name, serien_wlid, serien_fsid,
         serien_info) = self.getCurrentSelection()
        from .SerienRecorder import getCover
        getCover(self, serien_name, serien_wlid, serien_fsid)

    def keyRed(self):
        if self.modus == "list":
            if config.plugins.serienRec.screenplaner.value == 1:
                config.plugins.serienRec.screenplaner.value = 2
            else:
                config.plugins.serienRec.screenplaner.value = 1
            config.plugins.serienRec.screenplaner.save()
            configfile.save()
            self.readPlanerData(False)

    def getCurrentSelection(self):
        if config.plugins.serienRec.screenplaner.value == 1:
            serien_name = self['menu_list'].getCurrent()[0][5]
            serien_wlid = self['menu_list'].getCurrent()[0][13]
            serien_fsid = self['menu_list'].getCurrent()[0][14]
            serien_info = self['menu_list'].getCurrent()[0][15]
        else:
            serien_name = self['menu_list'].getCurrent()[0][0]
            serien_wlid = self['menu_list'].getCurrent()[0][2]
            serien_fsid = self['menu_list'].getCurrent()[0][5]
            serien_info = self['menu_list'].getCurrent()[0][6]

        return serien_name, serien_wlid, serien_fsid, serien_info

    def keyGreen(self):
        from .SerienRecorderChannelScreen import serienRecMainChannelEdit
        self.session.openWithCallback(self.readPlanerData,
                                      serienRecMainChannelEdit)

    def keyYellow(self):
        from .SerienRecorderMarkerScreen import serienRecMarker
        self.session.openWithCallback(self.readPlanerData, serienRecMarker)

    def keyBlue(self):
        from .SerienRecorderTimerListScreen import serienRecTimerListScreen
        self.session.openWithCallback(self.readPlanerData,
                                      serienRecTimerListScreen)

    def keyCheck(self):
        from .SerienRecorderAutoCheckScreen import serienRecRunAutoCheckScreen
        self.session.openWithCallback(self.readPlanerData,
                                      serienRecRunAutoCheckScreen, False)

    def keyLeft(self):
        if self.modus == "list":
            self['menu_list'].pageUp()
            self.getCover()

    def keyRight(self):
        if self.modus == "list":
            self['menu_list'].pageDown()
            self.getCover()

    def keyDown(self):
        if self.modus == "list":
            self['menu_list'].down()
            self.getCover()

    def keyUp(self):
        if self.modus == "list":
            self['menu_list'].up()
            self.getCover()

    def nextPage(self):
        if config.plugins.serienRec.screenplaner.value == 1 and self.page < 4:
            self.page += 1
            self.chooseMenuList.setList(list(map(self.buildPlanerList, [])))
            self.readPlanerData(False)

    def backPage(self):
        if config.plugins.serienRec.screenplaner.value == 1 and not self.page < 1:
            self.page -= 1
        self.chooseMenuList.setList(list(map(self.buildPlanerList, [])))
        self.readPlanerData(False)

    def __onClose(self):
        self.stopDisplayTimer()

    def keyCancel(self):
        if self.modus == "list":
            self.stopDisplayTimer()
            self.close()
Ejemplo n.º 31
0
class serienRecModifyAdded(serienRecBaseScreen, Screen, HelpableScreen):
    def __init__(self, session, skip=True):
        serienRecBaseScreen.__init__(self, session)
        Screen.__init__(self, session)
        HelpableScreen.__init__(self)
        self.session = session
        self.picload = ePicLoad()
        self.database = SRDatabase(getDataBaseFilePath())
        self.chooseMenuList_popup = MenuList(
            [], enableWrapAround=True, content=eListboxPythonMultiContent)

        self["actions"] = HelpableActionMap(
            self, "SerienRecorderActions", {
                "ok": (self.keyOK,
                       "für die ausgewählte Serien neue Einträge hinzufügen"),
                "cancel":
                (self.keyCancel,
                 "alle Änderungen verwerfen und zurück zur vorherigen Ansicht"
                 ),
                "left": (self.keyLeft, "zur vorherigen Seite blättern"),
                "right": (self.keyRight, "zur nächsten Seite blättern"),
                "up": (self.keyUp, "eine Zeile nach oben"),
                "down": (self.keyDown, "eine Zeile nach unten"),
                "red": (self.keyRed, "ausgewählten Eintrag löschen"),
                "green":
                (self.keyGreen,
                 "alle Änderungen speichern und zurück zur vorherigen Ansicht"
                 ),
                "yellow": (self.keyYellow, "umschalten Sortierung ein/aus"),
                "menu":
                (self.recSetup, "Menü für globale Einstellungen öffnen"),
                "0":
                (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
                "3": (self.showProposalDB,
                      "Liste der Serien/Staffel-Starts anzeigen"),
                "4": (self.serieInfo,
                      "Informationen zur ausgewählten Serie anzeigen"),
                "6":
                (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
                "7": (self.showWishlist,
                      "Merkzettel (vorgemerkte Folgen) anzeigen"),
                "nextBouquet":
                (self.previousSeries, "zur vorherigen Serie springen"),
                "prevBouquet":
                (self.nextSeries, "zur nächsten Serie springen"),
            }, -1)
        self.helpList[0][2].sort()

        self["helpActions"] = ActionMap([
            "SerienRecorderActions",
        ], {
            "displayHelp": self.showHelp,
            "displayHelp_long": self.showManual,
        }, 0)

        self.setupSkin()

        self.delAdded = False
        self.addedlist = []
        self.addedlist_tmp = []
        self.rowIDsToBeDeleted = []
        self.modus = "menu_list"
        self.aSerie = ""
        self.aSerieFSID = None
        self.aStaffel = "0"
        self.aFromEpisode = 0
        self.aToEpisode = 0

        self.onLayoutFinish.append(self.readAdded)
        self.onClose.append(self.__onClose)
        self.onLayoutFinish.append(self.setSkinProperties)

    def callHelpAction(self, *args):
        HelpableScreen.callHelpAction(self, *args)

    def setSkinProperties(self):
        super(self.__class__, self).setSkinProperties()

        self['text_red'].setText("Eintrag löschen")
        self['text_green'].setText("Speichern")
        self['text_ok'].setText("Neuer Eintrag")
        if config.plugins.serienRec.addedListSorted.value:
            self['text_yellow'].setText("Chronologisch")
        else:
            self['text_yellow'].setText("Alphabetisch")
        self.num_bt_text[1][0] = buttonText_na

        super(self.__class__, self).startDisplayTimer()

    def setupSkin(self):
        self.skin = None
        InitSkin(self)

        # normal
        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.chooseMenuList.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList.l.setItemHeight(int(25 * skinFactor))
        self['menu_list'] = self.chooseMenuList
        self['menu_list'].show()

        # popup
        self.chooseMenuList_popup = MenuList(
            [], enableWrapAround=True, content=eListboxPythonMultiContent)
        self.chooseMenuList_popup.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList_popup.l.setItemHeight(int(25 * skinFactor))
        self['popup_list'] = self.chooseMenuList_popup
        self['popup_list'].hide()

        if config.plugins.serienRec.showCover.value:
            self['cover'].show()

        if not config.plugins.serienRec.showAllButtons.value:
            self['bt_red'].show()
            self['bt_green'].show()
            self['bt_ok'].show()
            self['bt_yellow'].show()
            self['bt_exit'].show()
            #self['bt_text'].show()
            self['bt_info'].show()
            self['bt_menu'].show()

            self['text_red'].show()
            self['text_green'].show()
            self['text_ok'].show()
            self['text_yellow'].show()
            self['text_0'].show()
            self['text_1'].show()
            self['text_2'].show()
            self['text_3'].show()
            self['text_4'].show()

    def updateMenuKeys(self):
        updateMenuKeys(self)

    def getCurrentSelection(self):
        if self.modus == "menu_list":
            if self['menu_list'].getCurrent() is None:
                return None, None, None
            serien_name = self['menu_list'].getCurrent()[0][2]
            serien_fsid = self['menu_list'].getCurrent()[0][8]
        else:
            if self['popup_list'].getCurrent() is None:
                return None, None, None
            serien_name = self['popup_list'].getCurrent()[0][0]
            serien_fsid = self['popup_list'].getCurrent()[0][3]
        serien_wlid = self.database.getMarkerWLID(serien_fsid)
        return serien_name, serien_wlid, serien_fsid

    def serieInfo(self):
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        if serien_name and serien_wlid:
            from .SerienRecorderSeriesInfoScreen import serienRecShowInfo
            self.session.open(serienRecShowInfo, serien_name, serien_wlid,
                              serien_fsid)

    def setupClose(self, result):
        super(self.__class__, self).setupClose(result)
        if result[1]:
            self.readAdded()

    def readAdded(self):
        self.addedlist = []
        series = []

        def loadAllTimer():
            print("[SerienRecorder] loadAllTimer")
            database = SRDatabase(getDataBaseFilePath())
            return database.getAllTimer(None)

        def onLoadAllTimerSuccessful(timers):
            for timer in timers:
                (row_id, Serie, Staffel, Episode, title, start_time, stbRef,
                 webChannel, eit, active, serien_fsid) = timer
                series.append(Serie)
                zeile = "%s - S%sE%s - %s" % (Serie, str(Staffel).zfill(2),
                                              str(Episode).zfill(2), title)
                self.addedlist.append(
                    (zeile.replace(" - dump",
                                   " - %s" % "(Manuell hinzugefügt !!)"),
                     row_id, Serie, Staffel, Episode, title, start_time,
                     webChannel, serien_fsid))

            self.addedlist_tmp = self.addedlist[:]
            number_of_series = len(set(series))
            self['title'].instance.setForegroundColor(parseColor("red"))
            self['title'].setText(
                "Keine weiteren Timer für %d Episoden aus %d Serien" %
                (len(self.addedlist_tmp), number_of_series))

            if config.plugins.serienRec.addedListSorted.value:
                self.addedlist_tmp.sort(key=lambda x: (
                    x[2].lower(), int(x[3]) if x[3].isdigit() else x[3].lower(
                    ), int(x[4]) if x[4].isdigit() else x[4].lower()))
            self.chooseMenuList.setList(
                list(map(self.buildList, self.addedlist_tmp)))
            self.getCover()

        def onLoadAllTimerFailed(exception):
            print("[SerienRecorder]: Laden aller Timer fehlgeschlagen: " +
                  str(exception))

        self['title'].setText("Lade Liste aller Timer...")

        import twisted.python.runtime
        if twisted.python.runtime.platform.supportsThreads():
            from twisted.internet.threads import deferToThread
            deferToThread(loadAllTimer).addCallback(
                onLoadAllTimerSuccessful).addErrback(onLoadAllTimerFailed)
        else:
            allTimers = loadAllTimer()
            onLoadAllTimerSuccessful(allTimers)

    @staticmethod
    def buildList(entry):
        (zeile, row_id, Serie, Staffel, Episode, title, start_time, webChannel,
         serien_fsid) = entry
        foregroundColor = parseColor('foreground').argb()
        return [
            entry,
            (eListboxPythonMultiContent.TYPE_TEXT, 20, 00, 1280 * skinFactor,
             25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, zeile,
             foregroundColor)
        ]

    @staticmethod
    def buildList_popup(entry):
        (Serie, Url, info, fsID) = entry
        foregroundColor = parseColor('foreground').argb()
        return [
            entry,
            (eListboxPythonMultiContent.TYPE_TEXT, 5, 0, 560 * skinFactor,
             25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, Serie,
             foregroundColor),
            (eListboxPythonMultiContent.TYPE_TEXT, 600 * skinFactor, 0,
             350 * skinFactor, 25 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, info, foregroundColor)
        ]

    def answerStaffel(self, aStaffel):
        self.aStaffel = aStaffel
        if self.aStaffel is None or self.aStaffel == "":
            return
        self.session.openWithCallback(self.answerFromEpisode,
                                      NTIVirtualKeyBoard,
                                      title="von Episode:")

    def answerFromEpisode(self, aFromEpisode):
        self.aFromEpisode = aFromEpisode
        if self.aFromEpisode is None or self.aFromEpisode == "":
            return
        self.session.openWithCallback(self.answerToEpisode,
                                      NTIVirtualKeyBoard,
                                      title="bis Episode:")

    def answerToEpisode(self, aToEpisode):
        self.aToEpisode = aToEpisode
        if self.aToEpisode == "":
            self.aToEpisode = self.aFromEpisode

        if self.aToEpisode is None:  # or self.aFromEpisode is None or self.aStaffel is None:
            return
        else:
            print("[SerienRecorder] Staffel: %s" % self.aStaffel)
            print("[SerienRecorder] von Episode: %s" % self.aFromEpisode)
            print("[SerienRecorder] bis Episode: %s" % self.aToEpisode)

            if self.aStaffel.startswith('0') and len(self.aStaffel) > 1:
                self.aStaffel = self.aStaffel[1:]

            if self.database.addToTimerList(self.aSerie, self.aSerieFSID,
                                            self.aFromEpisode, self.aToEpisode,
                                            self.aStaffel, "dump",
                                            int(time.time()), "", "", 0, 1):
                self.readAdded()

    def keyOK(self):
        if self.modus == "menu_list":
            self.modus = "popup_list"
            self['popup_list'].show()
            self['popup_bg'].show()
            self['menu_list'].hide()
            l = self.database.getMarkerNames()
            self.chooseMenuList_popup.setList(
                list(map(self.buildList_popup, l)))
            self['popup_list'].moveToIndex(0)
        else:
            self.modus = "menu_list"
            self['menu_list'].show()
            self['popup_list'].hide()
            self['popup_bg'].hide()

            if self['popup_list'].getCurrent() is None:
                print("[SerienRecorder] Marker-Liste leer.")
                return

            self.aSerie = self['popup_list'].getCurrent()[0][0]
            self.aSerieFSID = self['popup_list'].getCurrent()[0][3]
            self.aStaffel = "0"
            self.aFromEpisode = 0
            self.aToEpisode = 0
            self.session.openWithCallback(self.answerStaffel,
                                          NTIVirtualKeyBoard,
                                          title="%s: Staffel eingeben:" %
                                          self.aSerie)

    def keyRed(self):
        if self.modus == "menu_list":
            if self['menu_list'].getCurrent() is None:
                return

            zeile = self['menu_list'].getCurrent()[0]
            (txt, row_id, serie, staffel, episode, title, start_time,
             webChannel, serien_fsid) = zeile
            self.rowIDsToBeDeleted.append(row_id)
            self.addedlist_tmp.remove(zeile)
            self.addedlist.remove(zeile)
            self.chooseMenuList.setList(
                list(map(self.buildList, self.addedlist_tmp)))
            self.delAdded = True

    def keyGreen(self):
        if self.modus == "menu_list" and self.delAdded:
            self.database.removeTimers(self.rowIDsToBeDeleted)
        self.close()

    def keyYellow(self):
        if self.modus == "menu_list" and len(self.addedlist_tmp) != 0:
            if config.plugins.serienRec.addedListSorted.value:
                self.addedlist_tmp = self.addedlist[:]
                self['text_yellow'].setText("Alphabetisch")
                config.plugins.serienRec.addedListSorted.setValue(False)
            else:
                self.addedlist_tmp.sort(
                    key=lambda x: (x[2].lower(), x[3].lower(), x[4].lower()))
                self['text_yellow'].setText("Chronologisch")
                config.plugins.serienRec.addedListSorted.setValue(True)
            config.plugins.serienRec.addedListSorted.save()
            configfile.save()

            self.chooseMenuList.setList(
                list(map(self.buildList, self.addedlist_tmp)))
            self.getCover()

    def previousSeries(self):
        (selected_serien_name, selected_serien_wlid,
         selected_serien_fsid) = self.getCurrentSelection()
        selectedIndex = self['menu_list'].getSelectedIndex()
        print("[SerienRecorder] selectedIndex = %d" % selectedIndex)
        for i, (txt, row_id, serie, staffel, episode, title, start_time,
                webChannel, serien_fsid) in reversed(
                    list(enumerate(self.addedlist_tmp[:selectedIndex]))):
            if serien_fsid != selected_serien_fsid or i == 0:
                print("[SerienRecorder] index = %d" % i)
                self['menu_list'].moveToIndex(i)
                break
        self.getCover()

    def nextSeries(self):
        (selected_serien_name, selected_serien_wlid,
         selected_serien_fsid) = self.getCurrentSelection()
        selectedIndex = self['menu_list'].getSelectedIndex()
        for i, (txt, row_id, serie, staffel, episode, title, start_time,
                webChannel, serien_fsid) in list(
                    enumerate(self.addedlist_tmp[selectedIndex:])):
            if serien_fsid != selected_serien_fsid or selectedIndex + i == len(
                    self.addedlist_tmp):
                self['menu_list'].moveToIndex(selectedIndex + i)
                break
        self.getCover()

    def getCover(self):
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        if serien_name and serien_wlid:
            getCover(self, serien_name, serien_wlid, serien_fsid)

    def keyLeft(self):
        self[self.modus].pageUp()
        self.getCover()

    def keyRight(self):
        self[self.modus].pageDown()
        self.getCover()

    def keyDown(self):
        self[self.modus].down()
        self.getCover()

    def keyUp(self):
        self[self.modus].up()
        self.getCover()

    def __onClose(self):
        self.stopDisplayTimer()

    def callDeleteMsg(self, answer):
        if answer:
            self.keyGreen()
        self.close()

    def keyCancel(self):
        if self.delAdded:
            self.session.openWithCallback(
                self.callDeleteMsg,
                MessageBox,
                "Sollen die Änderungen gespeichert werden?",
                MessageBox.TYPE_YESNO,
                default=True)
            self.close()
        else:
            self.close()
Ejemplo n.º 32
0
class SkyGenreSelect(Screen, ConfigListScreen):
    def __init__(self, session):
        self.session = session

        path = "%s/skins/%s/screen_genre_select.xml" % (
            getPluginPath(), config.plugins.skyrecorder.anytime_skin.value)
        with open(path, "r") as f:
            self.skin = f.read()
            f.close()

        Screen.__init__(self, session)

        self.configlist = []
        ConfigListScreen.__init__(self, self.configlist, session=self.session)

        pluginName = config.plugins.skyrecorder.pluginname.value
        contentSize = config.plugins.skyrecorder.contentsize.value

        self["actions"] = ActionMap(
            [
                "OkCancelActions", "ShortcutActions", "EPGSelectActions",
                "WizardActions", "ColorActions", "NumberActions",
                "MenuActions", "MoviePlayerActions"
            ],
            {
                "ok": self.keyOK,
                "cancel": self.keyCancel,
                "up": self.keyUp,
                "down": self.keyDown,
                "left": self.keyLeft,
                "right": self.keyRight,
                "prevBouquet": self.keyPageDown,
                "nextBouquet": self.keyPageUp
                #"nextService" : self.keyLeft,
                #"prevService" : self.keyRight
                #"green" : self.keyAdd,
                #"red" : self.keyDel,
            },
            -1)

        self.channelliste = []
        self.streamMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.streamMenuList.l.setFont(0, gFont('Regular', 30))
        self.streamMenuList.l.setItemHeight(75)
        self['channelselect'] = self.streamMenuList

        self.onLayoutFinish.append(self.readGenre)

    def skyGenreSelectListEntry(self, entry):
        if entry[1] == "True":
            plus = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/plus.png"
            return [
                entry,
                (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 15, 5, 60,
                 18, LoadPixmap(plus)),
                (eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 1000, 45, 0,
                 RT_HALIGN_LEFT, str(entry[0]))
            ]
        else:
            minus = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/minus.png"
            return [
                entry,
                (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 15, 5, 60,
                 18, LoadPixmap(minus)),
                (eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 1000, 45, 0,
                 RT_HALIGN_LEFT, str(entry[0]))
            ]

    def readGenre(self):

        try:
            sql.cur.execute('SELECT SQLITE_VERSION()')
        except Exception:
            sys.exc_clear()
            try:
                sql.connect()
            except Exception:
                return

        self.genreliste = None
        self.genreliste = []
        #self.id_genregroup_list = None
        #self.id_genregroup_list = []
        self.configlist = None

        templist = None
        templist = sql.readGenreJoinGenregroup()
        templist = sorted(templist, key=lambda s_field: s_field[0])

        self.configlist = None
        self.configlist = []

        for (genre, status, id_genregroup, id_genre, id_groups) in templist:
            #self.id_genregroup_list.append(id_genregroup)
            self.configlist.append(
                getConfigListEntry(
                    "",
                    ConfigSelection(
                        default=id_groups,
                        choices=sql.readJoindGroupsShort(id_genregroup))))
            self.genreliste.append(
                (genre, status, id_genregroup, id_genre, id_groups))

        print "[skyrecorder] reload genrelist."
        self["config"].setList(self.configlist)
        self.streamMenuList.setList(
            map(self.skyGenreSelectListEntry, self.genreliste))

    def keyLeft(self):
        self["config"].handleKey(KEY_LEFT)
        id_genregroup = self['channelselect'].getCurrent()[0][2]
        id_groups_selected = (self["config"].getCurrent()[1]).value
        sql.updateGenregroup(id_genregroup, id_groups_selected, True)

    def keyRight(self):
        self["config"].handleKey(KEY_RIGHT)
        id_genregroup = self['channelselect'].getCurrent()[0][2]
        id_groups_selected = (self["config"].getCurrent()[1]).value
        sql.updateGenregroup(id_genregroup, id_groups_selected, True)

    def keyOK(self):
        exist = self['channelselect'].getCurrent()
        if exist == None:
            return
        genre_auswahl = self['channelselect'].getCurrent()[0][0]

        #id_genregroup = self['channelselect'].getCurrent()[0][2]
        #id_groups_selected = (self["config"].getCurrent()[1]).value
        #sql.updateGenregroup(id_genregroup, id_groups_selected)
        print genre_auswahl
        sql.changeGenre(genre_auswahl)

        self.readGenre()

    def keyPageDown(self):
        self['channelselect'].pageDown()
        self.last_index = self['channelselect'].getSelectionIndex()
        self['config'].setCurrentIndex(self.last_index)

    def keyPageUp(self):
        self['channelselect'].pageUp()
        self.last_index = self['channelselect'].getSelectionIndex()
        self['config'].setCurrentIndex(self.last_index)

    def keyUp(self):
        self['channelselect'].up()
        self.last_index = self['channelselect'].getSelectionIndex()
        self['config'].setCurrentIndex(self.last_index)

    def keyDown(self):
        self['channelselect'].down()
        self.last_index = self['channelselect'].getSelectionIndex()
        self['config'].setCurrentIndex(self.last_index)

    def keyCancel(self):
        #if not self['config'].getCurrent():
        #	self.close()
        #id_groups_list = []
        #for x in self["config"].list:
        #	id_groups_list.append(x[1].value)
        #
        #n = -1
        #for id_genregroup in self.id_genregroup_list:
        #	n += 1
        #	sql.updateGenregroup(id_genregroup, id_groups_list[n], False) # no commit to speed up things
        #sql.updateGenregroup(id_genregroup, id_groups_list[n], True) # one commit for all changes we made right now

        id_groups_list = None
        self.close()
Ejemplo n.º 33
0
class Browser(Screen, HelpableScreen):

	def __init__(self, session, fullscreen = False, url = None, isHbbtv = False, isTransparent = False, hbbtvMenu = None):
		size = getDesktop(0).size()
		width = int(size.width() * 0.9)
		fwidth = int(size.width())
		height = int(size.height() * 0.85)
		fheight = int(size.height())

		Browser.skin = """
			<screen name="Browser" position="center,center" size="%(w)d,%(h)d" title="Web Browser" backgroundColor="#FF000000">
				<widget name="cursor" position="0,0" size="19,30" zPosition="1" alphatest="on"/>
				<widget name="url" position="0,0" zPosition="2" size="%(w)d,25" font="Regular;20" halign="left" valign="bottom" backgroundColor="background"/>
				<widget name="loading" position="%(loadingX)d,0" zPosition="3" size="150,25" font="Regular;20" halign="right" valign="bottom" backgroundColor="background"/>
				<widget name="urlList" position="0,30" zPosition="2" size="%(w)d,150" backgroundColor="background"/>
				<widget name="text" position="%(textX)d,100" size="350,40" font="Regular;20"  zPosition="2" halign="center" valign="center" backgroundColor="background"/>
				<widget source="webnavigation" render="WebView" position="0,25" zPosition="0" size="%(w)d,%(mainH)d" transparent="1"/>
				<widget source="canvas" render="Canvas" position="0,25" zPosition="1" size="%(w)d,%(mainH)d" backgroundColor="#FF000000" transparent="1" alphatest="on"/>

				<group name="_buttonBar">
					<widget name="buttonBar" position="0,%(btnBarY)d" size="%(w)d,30" zPosition="0" backgroundColor="background" transparent="0" />
					<ePixmap pixmap="skin_default/buttons/button_red_off.png" position="5,%(btnY)d" size="15,16" alphatest="on" />
					<widget source="button_red" zPosition="2" render="Pixmap" pixmap="skin_default/buttons/button_red.png" position="5,%(btnY)d" size="15,16" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget name="red" position="25,%(btnTxtY)d" size="160,25" zPosition="1" font="Regular;18" halign="left" valign="top" backgroundColor="background" transparent="1" />

					<ePixmap pixmap="skin_default/buttons/button_green_off.png" position="195,%(btnY)d" size="15,16" alphatest="on" />
					<widget source="button_green" zPosition="2" render="Pixmap" pixmap="skin_default/buttons/button_green.png" position="195,%(btnY)d" size="15,16" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget name="green" position="215,%(btnTxtY)d" size="160,25" zPosition="1" font="Regular;18" halign="left" valign="top" backgroundColor="background" transparent="1"/>

					<ePixmap pixmap="skin_default/buttons/button_yellow_off.png" position="385,%(btnY)d" size="15,16" alphatest="on" />
					<widget source="button_yellow" zPosition="2" render="Pixmap" pixmap="skin_default/buttons/button_yellow.png" position="385,%(btnY)d" size="15,16" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget name="yellow" position="405,%(btnTxtY)d" size="160,25" zPosition="1" font="Regular;18" halign="left" valign="top" backgroundColor="background" transparent="1"/>

					<ePixmap pixmap="skin_default/buttons/button_blue_off.png" position="585,%(btnY)d" size="15,16" alphatest="on" />
					<widget source="button_blue" zPosition="2" render="Pixmap" pixmap="skin_default/buttons/button_blue.png" position="585,%(btnY)d" size="15,16" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget name="blue" position="605,%(btnTxtY)d" size="160,25" zPosition="1" font="Regular;18" halign="left" valign="top" backgroundColor="background" transparent="1"/>
				</group>
				<widget name="statuslabel" position="%(notifX)d,%(btnTxtY)d" size="350,20" font="Regular;18"  zPosition="3" halign="right" valign="center" backgroundColor="background" />
			</screen>
			""" %{	"w" : width,
					"h" : height,
					"loadingX" : width-150,
					"textX" : (width - 375) / 2,
					"mainH" : height-55,
					"btnY" : height-22,
					"btnTxtY" : height-24,
					"btnBarY" : height - 30,
					"notifX" : width-350
				}

		Browser.skinFullscreen = """
			<screen name="BrowserFullscreen" flags="wfNoBorder" position="center,center" size="%(w)d,%(h)d" title="Web Browser" backgroundColor="#FF000000">
				<widget name="cursor" position="0,0" size="19,30" zPosition="1" alphatest="on"/>
				<widget name="url" position="75,75" zPosition="2" size="%(urlW)d,25" font="Regular;20" halign="left" valign="bottom" backgroundColor="background"/>
				<widget name="loading" position="%(loadingX)d,%(loadingY)d" zPosition="2" size="200,50" font="Regular;20" halign="center" valign="center" backgroundColor="background"/>
				<widget name="urlList" position="75,100" zPosition="2" size="%(urlW)d,150" backgroundColor="background" transparent="0" />
				<widget name="text" position="%(textX)d,100" size="350,40" font="Regular;20"  zPosition="2" halign="center" valign="center" backgroundColor="background" transparent="0" />
				<widget source="webnavigation" render="WebView" position="0,0" zPosition="0" size="%(w)d,%(h)d" transparent="1"/>
				<widget source="canvas" render="Canvas" position="0,0" zPosition="1" size="%(w)d,%(h)d" backgroundColor="#FF000000" transparent="1" alphatest="on"/>

				<group name="_buttonBar">
					<widget name="buttonBar" position="%(btnBarX)d,%(btnBarY)d" size="200,110" zPosition="0" backgroundColor="background" transparent="0" />
					<widget source="button_red_off" render="Pixmap" pixmap="skin_default/buttons/button_red_off.png" position="%(btnX)d,%(btnRedY)d" size="15,16" zPosition="1" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget source="button_red" zPosition="2" render="Pixmap" pixmap="skin_default/buttons/button_red.png" position="%(btnX)d,%(btnRedY)d" size="15,16" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget name="red" position="%(btnTxtX)d,%(btnRedY)d" size="160,25" zPosition="1" font="Regular;18" halign="left" valign="top" backgroundColor="background" transparent="1"/>

					<widget source="button_green_off" render="Pixmap" pixmap="skin_default/buttons/button_green_off.png" position="%(btnX)d,%(btnGreenY)d" size="15,16" zPosition="1" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget source="button_green" zPosition="2" render="Pixmap" pixmap="skin_default/buttons/button_green.png" position="%(btnX)d,%(btnGreenY)d" size="15,16" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget name="green" position="%(btnTxtX)d,%(btnGreenY)d" size="160,25" zPosition="1" font="Regular;18" halign="left" valign="top" backgroundColor="background" transparent="1"/>

					<widget source="button_yellow_off" render="Pixmap" pixmap="skin_default/buttons/button_yellow_off.png" position="%(btnX)d,%(btnYellowY)d" size="15,16" zPosition="1" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget source="button_yellow" zPosition="2" render="Pixmap" pixmap="skin_default/buttons/button_yellow.png" position="%(btnX)d,%(btnYellowY)d" size="15,16" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget name="yellow" position="%(btnTxtX)d,%(btnYellowY)d" size="160,25" zPosition="1" font="Regular;18" halign="left" valign="top" backgroundColor="background" transparent="1"/>

					<widget source="button_blue_off" render="Pixmap" pixmap="skin_default/buttons/button_blue_off.png" position="%(btnX)d,%(btnBlueY)d" size="15,16" zPosition="1" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget source="button_blue" zPosition="2" render="Pixmap" pixmap="skin_default/buttons/button_blue.png" position="%(btnX)d,%(btnBlueY)d" size="15,16" alphatest="on">
						<convert type="ConditionalShowHide" />
					</widget>
					<widget name="blue" position="%(btnTxtX)d,%(btnBlueY)d" size="160,25" zPosition="1" font="Regular;18" halign="left" valign="top" backgroundColor="background" transparent="1"/>
				</group>

				<widget name="statuslabel" position="%(notifX)d,%(loadingY)d" size="350,50" zPosition="1" font="Regular;18" halign="center" valign="center" backgroundColor="background" transparent="0" />
			</screen>
			""" %{	"w" : fwidth,
					"h" : fheight,
					"urlW": fwidth - 150,
					"loadingY" : fheight - 125,
					"loadingX" : ( fwidth / 2 ) - 75,
					"textX" : (fwidth - 375) / 2,
					"mainH" : fheight-55,
					"btnBarX": fwidth - 75 - 200,
					"btnBarY": fheight - 75 - 108,
					"btnX" : fwidth - 75 - 190,
					"btnTxtX" : fwidth - 75 - 165,
					"btnRedY" : fheight - 75 - 100,
					"btnGreenY" : fheight - 75 - 75,
					"btnYellowY" : fheight - 75 - 50,
					"btnBlueY" : fheight - 75 - 25,
					"notifX" : ( fwidth / 2 ) - 175,
				}

		self.__isHbbtv = isHbbtv
		if self.__isHbbtv:
			isTransparent = fullscreen = True

		self.__hbbtvMenu = hbbtvMenu

		self.__isTransparent = isTransparent
		self.__fullscreen = fullscreen
		if self.__fullscreen:
			Browser.skin = Browser.skinFullscreen

		Screen.__init__(self, session)
		HelpableScreen.__init__(self)

		if self.__fullscreen:
			self.skinName = "BrowserFullscreen"

		self.__startUrl = url

		self["loading"] = Label("")

		self.urlInput = EnhancedInput()
		self["url"] = self.urlInput

		self.textInput = Input()
		self["text"] = self.textInput
		self.textInput.hide()

		self.statuslabel = Label("")
		self["statuslabel"] = self.statuslabel
		self.statuslabel.hide();

		self.urlInputEnabled = False

		self.webnavigation = WebNavigation()
		self.webnavigation.zoomFactor = 1.0
		self.__onStoragePathChanged()
		self["webnavigation"] = self.webnavigation

		self.__urlList = MenuList([], enableWrapAround = True, content = eListboxPythonStringContent)
		self["urlList"] = self.__urlList

		self.canvas =  CanvasSource()
		self["canvas"] = self.canvas

		self["buttonBar"] = Label("")
		self["button_red_off"] = Boolean(True)
		self["button_green_off"] = Boolean(True)
		self["button_yellow_off"] = Boolean(True)
		self["button_blue_off"] = Boolean(True)
		self["button_red"] = Boolean(True)
		self["button_green"] = Boolean(False)
		self["button_yellow"] = Boolean(True)
		self["button_blue"] = Boolean(True)
		self["red"] = Label(_("Mouse Off"))
		self["green"] = Label("")
		self["yellow"] = Label(_("Navigation"))
		self["blue"] = Label(_("Pagescroll"))

		self["cursor"] = Pixmap()
		self.__cursorPos = ePoint(50,50)
		self.__mouseMode = False

		self.__db = BrowserDB.getInstance()
		self.pageTitle = ""

		self.__urlSuggestionTimer = eTimer()
		self.__urlSuggestionTimer_conn = self.__urlSuggestionTimer.timeout.connect(self.__onSuggestionTimeout)
		self.__inputTimer = eTimer()
		self.__inputTimer_conn = self.__inputTimer.timeout.connect(self.onInputTimer)
		self.__statusTimer = eTimer()
		self.__statusTimer_conn = self.__statusTimer.timeout.connect(self.__hideStatus)

		self.__scrollMode = False
		self.__zoomMode = False
		self.__isInput = False
		self.__hasSslErrors = False
		self.__handledUnsupportedContent = False
		self.__currentPEM = None
		self.__currentUser = None
		self.__currentPass = None
		self.__currentRealm = None
		self.__keyboardMode = eRCInput.getInstance().getKeyboardMode()

		self.onFirstExecBegin.append(self.__onFirstExecBegin)
		self.onExecEnd = []
		self.onPageLoadFinished = []
		self.onActionTv = []
		self.onActionRecord = []
		self.onUrlChanged = []

		self["helpableactions"] = HelpableActionMap(self, "BrowserActions",
		{
			"exit": (self.__actionExit, _("Close the browser")),
			"url": (self.__actionEnterUrl, _("Enter web address or search term")),
			"back": self.__actionBack,
			"forward": self.__actionForward,
			"left": self.__actionLeft,
			"right": self.__actionRight,
			"up": self.__actionUp,
			"down": self.__actionDown,
			"pageUp": (self.__actionPageUp, _("Page Up / Zoom in")),
			"pageDown": (self.__actionPageDown, _("Page Down / Zoom out")),
			"seekBack": boundFunction(self.__actionNavigate, eWebView.navMediaRewind),
			"seekFwd": boundFunction(self.__actionNavigate, eWebView.navMediaFastForward),
			"tab": (boundFunction(self.__actionNavigate, eWebView.navTab), _("Tab")),
			"backspace": (self.__actionBackspace, _("Backspace / Navigate back")),
			"backtab": boundFunction(self.__actionNavigate, eWebView.navBacktab),
			"delete": (self.__actionDelete, _("Delete / Navigate forward")),
			"ascii": self.__actionAscii,
			"text" : (self.__actionVirtualAscii, _("Open Virtual Keyboard")),
			"ok" : self.__actionOk,
			"enter" : self.__actionEnter,
			"menu" : (self.__actionMenu, _("Menu")),
			"fullscreen" : self.__actionFullscreen,
			"play" : self.__actionPlay,
			"pause" : self.__actionPause,
			"playpause" : self.__actionPlayPause,
			"stop" : self.actionStop,
			"tv" : self.__actionTv,
			"record" : self.__actionRecord,
		}, -2)

		self["coloractions"] = ActionMap(["ColorActions"],
		{
			"red" : self.__actionRed,
			"green" : self.__actionGreen,
			"yellow" : self.__actionYellow,
			"blue" : self.__actionBlue,
		})

		self["numberactions"] = NumberActionMap(["NumberActions"],
		{
			"1": self.keyNumberGlobal,
			"2": self.keyNumberGlobal,
			"3": self.keyNumberGlobal,
			"4": self.keyNumberGlobal,
			"5": self.keyNumberGlobal,
			"6": self.keyNumberGlobal,
			"7": self.keyNumberGlobal,
			"8": self.keyNumberGlobal,
			"9": self.keyNumberGlobal,
			"0": self.keyNumberGlobal
		})

	def execEnd(self):
		Screen.execEnd(self)
		for fnc in self.onExecEnd:
			fnc()

	def setBackgroundTransparent(self, enabled):
		self.webnavigation.setBackgroundTransparent(enabled)

	def __setKeyBoardModeAscii(self):
		eRCInput.getInstance().setKeyboardMode(eRCInput.kmAscii)

	def __unsetKeyBoardModeAscii(self):
		eRCInput.getInstance().setKeyboardMode(self.__keyboardMode)

	def __setStatus(self, text):
		print "[Browser].__setStatus"
		self.statuslabel.setText(text)
		self.statuslabel.show()
		self.__statusTimer.startLongTimer(3)

	def __hideStatus(self):
		self["statuslabel"].hide()
		self.__statusTimer.stop()

	def __setMouseMode(self, enabled):
		self.__mouseMode = enabled
		if enabled:
			self.__setCursor()
			self["cursor"].show()
			self["red"].setText("Mouse On")
			self.__clearCanvas()
		else:
			self["cursor"].hide()
			self["red"].setText("Mouse Off")

	def __actionExit(self):
		if self.__isHbbtv:
			self.__actionExitCB(True)
			return
		self.session.openWithCallback(self.__actionExitCB, MessageBox, _("Do you really want to exit the browser?"), type = MessageBox.TYPE_YESNO)

	def __actionExitCB(self, confirmed):
		if confirmed:
			self.__urlSuggestionTimer.stop()
			self.__inputTimer.stop()
			if not self.__isHbbtv:
				config.plugins.WebBrowser.lastvisited.value = self.webnavigation.url
				config.plugins.WebBrowser.lastvisited.save()
			self.__persistCookies()
			self.close()

	def __onFirstExecBegin(self):
		self["cursor"].instance.setPixmapFromFile(resolveFilename(SCOPE_PLUGINS, "Extensions/Browser/cursor.png"))
		self.__setCursor()
		self.__setMouseMode(self.__mouseMode)

		#enable/disable transparent background
		self.setBackgroundTransparent(self.__isTransparent)
		#set Accept-Language header to current language
		lang = '-'.join(language.getLanguage().split('_'))
		self.webnavigation.setAcceptLanguage(lang)
		self.__registerCallbacks()
		self.__urlList.hide()
		self.__restoreCookies()
		if self.__fullscreen:
			self.__showHideBars(False)
			self.__showHideButtonBar(False)
		if self.__startUrl is None:
			if config.plugins.WebBrowser.startPage.value == "home":
				self.__actionHome()
			else:
				self.setUrl(config.plugins.WebBrowser.lastvisited.value)
		else:
			self.setUrl(self.__startUrl)

	def __clearCanvas(self):
		size = getDesktop(0).size()
		self.canvas.fill(0, 0, size.width(), size.height(), 0xFF000000)
		self.canvas.flush()

	def __onStoragePathChanged(self):
		if config.plugins.WebBrowser.storage.enabled.value:
			self.webnavigation.enablePersistentStorage(config.plugins.WebBrowser.storage.path.value)

	def __onMicroFocusChanged(self, x, y, w, h, isInput):
		if not self.__isHbbtv and not self.__mouseMode:
			self.__cursorPos.setX(x)
			self.__cursorPos.setY(y)

			if self.__isInput and not isInput:
				self.__unsetKeyBoardModeAscii()

			self.__isInput = isInput
			if self.__isInput:
				self.setKeyboardModeAscii()

			self.__clearCanvas()
			lw = 4 #line width
			y = y
			x = x - lw
			w = w + lw
			blo = y + h #bottom line offset
			color =0xFF9900 #line color

			self.canvas.fill(x, y, lw, h, color)#left line
			self.canvas.fill(x, blo, w, lw, color)#bottom line
			self.canvas.flush()#Done -> Flush

	def __onSuggestionTimeout(self):
		needle = self.urlInput.getText()
		if needle != "":
			list = self.__db.suggsetUrls(self.urlInput.getText())
			list.insert(0, needle)
			list.insert(1, _("Search for '%s'") %needle)
			self.__urlList.setList(list)
			self.__urlList.moveToIndex(0)
			self.__urlList.show()
		else:
			self.__urlList.hide()

	def __onAuthRequired(self, token, user, password, realm):
		if self.__currentUser != None and self.__currentPassword != None and realm == self.__currentRealm:
			d = eDict()
			d.setString("user", self.__currentUser)
			d.setString("password", self.__currentPassword)
			self.webnavigation.setDict(token, d)
			self.__currentUser = None
			self.__currentPassword = None
			self.__currentRealm = None
		else:
			msgbox = self.session.openWithCallback(self.__onAuthRequiredCB, HttpAuthenticationDialog, user, password, realm)
			msgbox.setTitle(_("Authentication required"))

	def __onAuthRequiredCB(self, dict):
		if dict != None:
			self.__currentUser = dict["user"]
			self.__currentPassword = dict["password"]
			self.__currentRealm = dict["realm"]
			self.setUrl(self.webnavigation.url)

	def __onProxyAuthRequired(self, token, user, password, realm):
		self.onAuthRequired(token, user, password, realm)

	def __onDownloadRequested(self, url):
		print "[Browser].__onDownloadRequested '%s'" %(url)
		filename = url_unquote(url).split("/")[-1]
		localfile = "%s/%s" %(config.plugins.WebBrowser.downloadpath.value, filename)
		downloadManager.AddJob(DownloadJob(url, localfile, filename))
		self.session.open(MessageBox, _("Download started..."), type = MessageBox.TYPE_INFO, timeout = 3)

	def __onUnsupportedContent(self, url, contentType):
		print "[Browser].__onUnsupportedContent 'url=%s; contentType='%s'" %(url, contentType)
		self.__handledUnsupportedContent = True
		if contentType.startswith("video") or contentType.startswith("audio"):
			list = [( _("Download"), ("download", url) ),
					( _("Play"), ("play", url) )]
			self.session.openWithCallback(self.__onUnsupportedContentCB, ChoiceBox, title=_("You've selected a media file what do you want to do?"), list = list)
		else:
			self.__onDownloadRequested(url)

	def __onUnsupportedContentCB(self, answer):
		if answer != None:
			answer = answer and answer[1]
			if answer[0] == "download":
				self.__onDownloadRequested(answer[1])
			else:
				service = eServiceReference(4097,0,answer[1])
				self.session.open(MoviePlayer, service)

	def __actionMenu(self):
		if self.__isHbbtv:
			if self.__hbbtvMenu is not None:
				self.__hbbtvMenu()
			return

		self.__urlSuggestionTimer.stop()
		self.__inputTimer.stop()
		self.__urlList.hide()
		self.__persistCookies()
		self.session.openWithCallback(self.__menuCB, BrowserMenu, self.pageTitle, self.webnavigation.url)

	def __menuCB(self, actions = None):
		if actions != None:
			for action in actions:
				if action[0] == BrowserMenu.ACTION_BOOKMARK:
					self.setUrl(action[1])
				elif action[0] == BrowserMenu.ACTION_COOKIES:
					self.__restoreCookies()
				elif action[0] == BrowserMenu.ACTION_STORAGE_PATH:
					self.__onStoragePathChanged()

		if self.skinName == "BrowserFullscreen" and not config.plugins.WebBrowser.fullscreen.value:
			self.__requireRestart()
		if self.skinName != "BrowserFullscreen" and config.plugins.WebBrowser.fullscreen.value:
			self.__requireRestart()

	def __requireRestart(self):
		text = _("Some of the configuration changes require a restart of the Browser.\nDo you want to restart the Browser now?")
		msgbox = self.session.openWithCallback(self.__requireRestartCB, MessageBox, text, type = MessageBox.TYPE_YESNO)
		msgbox.setTitle(_("Restart required"))

	def __requireRestartCB(self, confirmed):
		if confirmed:
			self.close(self.session, True, self.webnavigation.url)

	def __enableUrlInput(self):
		self.urlInputEnabled = True
		self.urlInput.markAll()
		self.__setKeyBoardModeAscii()
		if self.__fullscreen:
			self.__showHideBars()

	def __disableUrlInput(self, hide = True):
		self.urlInputEnabled = False
		self.__urlSuggestionTimer.stop()
		self.__urlList.hide()
		self.urlInput.markNone()
		if not self.__isInput:
			self.__unsetKeyBoardModeAscii()
		if self.__fullscreen and hide:
			self.__showHideBars(False)

	def __showHideButtonBar(self, visible = True):
		if visible:
			self["_buttonBar"].show()
		else:
			self["_buttonBar"].hide()
			
		used_buttons = ("button_red_off", "button_green_off", "button_yellow_off",
			"button_blue_off", "button_red", "button_yellow", "button_blue")
		for button in used_buttons:
			self[button].setBoolean(visible)
		#disable green
		self["button_green"].setBoolean(False)

	def __showHideBars(self, visible = True):
		if self.__fullscreen:
			if visible:
				self.urlInput.show()
			else:
				self.urlInput.hide()

			if not self.__isHbbtv:
				self.__showHideButtonBar(visible)

	def __registerCallbacks(self):
		print "[Browser].__registerCallbacks"
		self.webnavigation.onUrlChanged.append(self.__onUrlChanged)
		self.webnavigation.onTitleChanged.append(self.__onTitleChanged)
		self.webnavigation.onLoadProgress.append(self.__onLoadProgress)
		self.webnavigation.onLoadFinished.append(self.__onLoadFinished)
		self.webnavigation.onDownloadRequested.append(self.__onDownloadRequested)
		self.webnavigation.onUnsupportedContent.append(self.__onUnsupportedContent)
		self.webnavigation.onMicroFocusChanged.append(self.__onMicroFocusChanged)
		self.webnavigation.onWindowRequested.append(self.__onWindowRequested)
		self.webnavigation.onSslErrors.append(self.__onSslErrors)
		self.webnavigation.onAuthRequired.append(self.__onAuthRequired)
		self.webnavigation.onProxyAuthRequired.append(self.__onProxyAuthRequired)

	def __actionOk(self):
		if self.textInput.visible:
			self.onInputTimer()
		elif self.urlInputEnabled:
			if self.__urlList.visible and self.__urlList.getSelectedIndex() > 0:
				if self.__urlList.getSelectedIndex() == 1:
					self.__searchUsingCurrentUrlValue()
					self.__disableUrlInput(False)
				else:
					self.urlInput.setText(self.__urlList.getCurrent())
					self.urlInput.end()
					self.__urlList.hide()
			else:
				self.setUrl(self.urlInput.getText())
				self.__isInput = False
				self.__disableUrlInput(False)

		else:
			if self.__mouseMode:
				self.webnavigation.leftClick(self.__cursorPos)
			else:
				self.__actionNavigate(eWebView.navOpenLink)

	def __actionEnter(self):
		if self.textInput.visible or self.urlInputEnabled:
			self.__actionOk()
		else:
			if self.__mouseMode:
				self.webnavigation.leftClick(self.__cursorPos)
			else:
				self.__actionNavigate(eWebView.navOpenLink)

	def __actionPlay(self):
		self.__actionNavigate(eWebView.navMediaPlay)

	def __actionPause(self):
		self.__actionNavigate(eWebView.navMediaPause)

	def __actionPlayPause(self):
		self.__actionNavigate(eWebView.navMediaPlay) #playpause doesn't work anywhere, but play does (HBBTV)

	def actionStop(self):
		self.__actionNavigate(eWebView.navMediaStop)

	def __actionBack(self):
		if self.__isHbbtv:
			self.__actionNavigate(eWebView.navBack)
		else:
			self.__actionNavigate(eWebView.navBackExplicit)

	def __actionForward(self):
		if self.__isHbbtv:
			self.__actionNavigate(eWebView.navForward)
		else:
			self.__actionNavigate(eWebView.navForwardExplicit)

	def __actionBackspace(self):
		if self.textInput.visible:
			self.restartTimer()
			self.textInput.deleteBackward()
		elif self.urlInputEnabled:
			self.urlInput.deleteBackward()
			self.__onUrlInputChanged()
		else:
			if self.__isInput:
				self.__actionNavigate(eWebView.navBackspace)
			else:
				self.__actionBack()

	def __actionDelete(self):
		if self.textInput.visible:
			self.restartTimer()
			self.textInput.delete()
		elif self.urlInputEnabled:
			self.urlInput.delete()
			self.__onUrlInputChanged()
		else:
			if self.__isInput:
				self.__actionNavigate(eWebView.navDelete)
			else:
				self.__actionForward()

	def __moveCursor(self, x=0, y=0):
		if x != 0 or y != 0:
			wSize = self.webnavigation.size
			#horizontal
			if x != 0:
				x = self.__cursorPos.x() + x
				w = wSize.width()
				if x <= 2:
					x = 2
					self.__scroll(0-int(config.plugins.WebBrowser.scrollOffset.value), 0)
				elif x >= w-2:
					x = w-2
					self.__scroll(int(config.plugins.WebBrowser.scrollOffset.value), 0)
				self.__cursorPos.setX(x)
			#vertical
			if y != 0:
				y = self.__cursorPos.y() + y
				h = wSize.height()
				if y < 2:
					y = 2
					self.__scroll(0, 0-int(config.plugins.WebBrowser.scrollOffset.value))
				elif y > h-2:
					y = h-2
					self.__scroll(0, int(config.plugins.WebBrowser.scrollOffset.value))
				self.__cursorPos.setY(y)
		self.__setCursor()

	def __setCursor(self):
		wPos = self.webnavigation.position
		relPos = None
		if wPos.x() > 0 or wPos.y() > 0:
			relPos = ePoint(self.__cursorPos.x() + wPos.x(), self.__cursorPos.y() + wPos.y())
		else:
			relPos = self.__cursorPos
		self["cursor"].move(relPos)

	def __actionLeft(self):
		if self.urlInputEnabled:
			self.urlInput.left()
		elif self.__scrollMode:
			self.__scroll(0-int(config.plugins.WebBrowser.scrollOffset.value), 0)
		elif self.textInput.visible:
			self.restartTimer()
			self.textInput.left()
		else:
			if self.__mouseMode:
				self.__moveCursor(x=-10)
			else:
				self.__actionNavigate(eWebView.navLeft)

	def __actionRight(self):
		if self.urlInputEnabled:
			self.urlInput.right()
		elif self.__scrollMode:
			self.__scroll(int(config.plugins.WebBrowser.scrollOffset.value), 0)
		elif self.textInput.visible:
			self.restartTimer()
			self.textInput.right()
		else:
			if self.__mouseMode:
				self.__moveCursor(x=10)
			else:
				self.__actionNavigate(eWebView.navRight)

	def __actionUp(self):
		if self.urlInputEnabled:
			if self.__urlList.visible:
				self.__urlList.up()
		elif self.__scrollMode:
			self.__scroll(0, 0-int(config.plugins.WebBrowser.scrollOffset.value))
		elif self.textInput.visible:
			self.restartTimer()
			self.textInput.up()
		else:
			if self.__mouseMode:
				self.__moveCursor(y=-10)
			else:
				self.__actionNavigate(eWebView.navUp)

	def __actionDown(self):
		if self.urlInputEnabled:
			if self.__urlList.visible:
				self.__urlList.down()
			#else:
			#	self.urlInput.down()
		elif self.__scrollMode:
			self.__scroll(0, int(config.plugins.WebBrowser.scrollOffset.value))
		elif self.textInput.visible:
			self.restartTimer()
			self.textInput.down()
		else:
			if self.__mouseMode:
				self.__moveCursor(y=10)
			else:
				self.__actionNavigate(eWebView.navDown)

	def __actionTv(self):
		for fnc in self.onActionTv:
			if fnc() is True: #Function told us to stop handling
				return

	def __actionRecord(self):
		for fnc in self.onActionRecord:
			if fnc() is True: #Function told us to stop handling
				return

	def __scroll(self, dx, dy):
		self.webnavigation.scroll(dx, dy)

	def __actionRed(self):
		if self.__isHbbtv:
			self.__actionNavigate(eWebView.navRed)
		else:
			self.__setMouseMode(not self.__mouseMode)

	def __actionGreen(self):
		self.__actionNavigate(eWebView.navGreen)

	def __actionYellow(self):
		if self.__isHbbtv:
			self.__actionNavigate(eWebView.navYellow)
		else:
			self.__scrollMode = not self.__scrollMode
			enDis = _("disabled")
			mode = _("Navigation")
			if self.__scrollMode:
				enDis = _("enabled")
				mode = _("Scrolling")
			text = _("Scroll mode is now %s") %enDis
			self["yellow"].setText(mode)
			self.__setStatus(text)

	def __actionBlue(self):
		if self.__isHbbtv:
			self.__actionNavigate(eWebView.navBlue)
		else:
			self.__zoomMode = not self.__zoomMode
			enDis = _("disabled")
			mode = _("Pagescroll")
			if self.__zoomMode:
				enDis = _("enabled")
				mode = _("Zoom")
			text = _("Zoom mode is now %s") %enDis
			self["blue"].setText(mode)
			self.__setStatus(text)

	def restartTimer(self):
		self.__inputTimer.stop()
		self.__inputTimer.startLongTimer(5)

	def __onUrlChanged(self, url):
		if url != None:
			self.__clearCanvas()
			self.urlInput.setText(url)
			self.urlInput.markNone()
			if self.__fullscreen and not self.__isHbbtv:
				self.__showHideBars()

			for fnc in self.onUrlChanged:
				fnc(url)

	def __onTitleChanged(self, title):
		if title != None:
			self.pageTitle = title
			self.setTitle("Web Browser - %s" %self.pageTitle)

	def __onLoadProgress(self, progress):
		print "[Browser].__onLoadProgress %s" %progress
		if(progress < 100):
			self["loading"].show()
			self["loading"].setText(_("Loading... %s%%" %progress))
		else:
			self["loading"].hide()
			self["loading"].setText("")

	def __onLoadFinished(self, val):
		print "[Browser].__onLoadFinished %s" %val
		if val == 1:
			if not self.__isHbbtv:
				self.__db.addToHistory(HistoryItem(title = self.pageTitle, url = self.webnavigation.url));
			if self.__fullscreen:
				self.__showHideBars(False)
		else:
			if not self.__hasSslErrors and not self.__handledUnsupportedContent:
				self.__handledUnsupportedContent = False
		for fnc in self.onPageLoadFinished:
			fnc()

	def __searchUsingCurrentUrlValue(self):
		needle = self.urlInput.getText()
		if needle != "":
			needle = needle.replace("http://", "").replace("https://", "").replace("ftp://", "")
			self.__onSearchRequested(needle)

	def __onSearchRequested(self, needle):
		if needle != "" and needle != None:
			needle = url_quote_plus(needle)
			url = "%s%s" %(config.plugins.WebBrowser.searchProvider.value, needle)
			self.setUrl(url)

	def __onWindowRequested(self, url):
		print "[Browser].__onWindowRequested :: '%s'" %url
		self.setUrl(url)

	def __onSslErrors(self, token, errors, pems):
		print "[Browser].__onSslErrors :: 'token='%s', errors='%s'" %(token, errors)
		self.__hasSslErrors = True
		cnt = 0
		perrors = {}
		pems = list(pems)
		pems.sort()
		for bytes in pems:
			pem = "".join(map(chr, bytes))
			if pem.strip() != "":
				messages = perrors.get(pem, [])
				messages.append(errors[cnt])
				perrors[pem] = messages
				cnt += 1

		for pem, messages in perrors.iteritems():
			cert = Certificate(-1, self.__getCurrentNetloc(), pem)
			checkVal = self.__db.checkCert( cert ) == BrowserDB.CERT_UNKOWN
			if checkVal == BrowserDB.CERT_OK:
				print "[Browser].__onSslErrors :: netloc/pem combination known and trusted!"
				dict = eDict()
				dict.setFlag("ignore")
				self.webnavigation.setDict(token, dict)
			else:
				print "[Browser].__onSslErrors :: netloc/pem combination NOT known and/or trusted!"
				self.__currentPEM = pem

				errorstr = ""
				for m in messages:
					errorstr = "%s\n%s" %(m, errorstr)

				text = ""
				if checkVal == BrowserDB.CERT_UNKOWN:
					text = _("A certificate for the desired secure connection has the following errors:\n%s\nDo you want to add an exception for this certificate and accept connections to this host anyways?") %errorstr
				elif checkVal == BrowserDB.CERT_CHANGED:
					text = _("ATTENTION!\nPotential security breach detected!\nA certificate for the desired secure connection has CHANGED!\nIn addition it has the following errors:\n%s\nDo you want to add an exception for this certificate and accept connections to this host anyways?") %errorstr
				msgbox = self.session.openWithCallback( self.__onSslErrorCB, MessageBox, text, type = MessageBox.TYPE_YESNO)
				msgbox.setTitle(_("Certificate errors!"))

	def __onSslErrorCB(self, confirmed):
		self.__hasSslErrors = False
		if confirmed:
			print "[Browser].__onSslErrorCB :: loc='%s', PEM='%s'" %(self.__getCurrentNetloc(), self.__currentPEM)
			self.__db.addCert( Certificate(-1, self.__getCurrentNetloc(), self.__currentPEM) )
			self.setUrl(self.webnavigation.url)

	def __getCurrentNetloc(self):
		return self.__getNetloc(self.webnavigation.url)

	def __getNetloc(self, url):
		return urlparse(url).netloc

	def __actionHome(self):
		self.setUrl(config.plugins.WebBrowser.home.value)

	def __actionEnterUrl(self):
		if self.urlInputEnabled:
			self.__disableUrlInput()
		else:
			self.__enableUrlInput()

	def setUrl(self, url):
		if url != None:
			if url.find("://") == -1:
				url = "http://%s" %url
			if url:
				self.webnavigation.url = url

	def getUserAgent(self):
		return self.webnavigation.useragent

	def setUserAgent(self, useragent):
		self.webnavigation.useragent = useragent

	def __actionAscii(self):
		if self.urlInputEnabled:
			self.urlInput.handleAscii(getPrevAsciiCode())
			self.__onUrlInputChanged()
		elif self.__isInput:
			self.webnavigation.changed(WebNavigation.COMMAND_ASCII_INPUT, getPrevAsciiCode())
		else:
			self.__actionNavigateNumber(chr(getPrevAsciiCode()))

	def __actionNavigateNumber(self, char):
		print "[Browser].__actionNavigateNumber %s" %char
		nav = { '0' : eWebView.nav0,
				'1' : eWebView.nav1,
				'2' : eWebView.nav2,
				'3' : eWebView.nav3,
				'4' : eWebView.nav4,
				'5' : eWebView.nav5,
				'6' : eWebView.nav6,
				'7' : eWebView.nav7,
				'8' : eWebView.nav8,
				'9' : eWebView.nav9,
				}

		action = nav.get(str(char), None)
		if action != None:
			if self.__mouseMode:
				self.__actionMouseJump(char)
			else:
				self.__actionNavigate(action)

	def __actionMouseJump(self, char):
		size = self.webnavigation.size
		off = 100 #offset

		hcenter = size.width() / 2
		vcenter = size.height() / 2

		roff = size.width() - off #right offset
		boff = size.height() - off # bottom offset

		offsets = {
			'1' : [off,off],
			'2' : [hcenter, off],
			'3' : [roff, off],
			'4' : [off, vcenter],
			'5' : [hcenter, vcenter],
			'6' : [roff, vcenter],
			'7' : [off, boff],
			'8' : [hcenter, boff],
			'9' : [roff, boff],
			}
		offset = offsets.get(str(char), None)
		if offset:
			self.__cursorPos.setX(offset[0])
			self.__cursorPos.setY(offset[1])
			self.__setCursor()

	def __actionVirtualAscii(self):
		self.session.openWithCallback(self.sendTextAsAscii, VirtualKeyBoard, title="Browser Input")

	def __actionPageUp(self):
		if self.__zoomMode:
			self.webnavigation.zoomFactor += 0.1
		else:
			self.__actionNavigate(eWebView.navPageUp)

	def __actionPageDown(self):
		if self.__zoomMode:
			self.webnavigation.zoomFactor -= 0.1
		else:
			self.__actionNavigate(eWebView.navPageDown)

	def sendTextAsAscii(self, text):
		if text != None:
			for c in text:
				self.webnavigation.changed(WebNavigation.COMMAND_ASCII_INPUT, ord(c))

	def __actionNavigate(self, param):
		if not self.urlInputEnabled and not self.textInput.visible:
			self.webnavigation.changed(WebNavigation.COMMAND_NAVIGATE, param)

	def keyNumberGlobal(self, number):
		if self.urlInputEnabled:
			self.urlInput.number(number)
			self.__onUrlInputChanged()
		elif self.__isInput:
			self.textInput.show()
			self.restartTimer()
			self.textInput.number(number)
		else:
			self.__actionNavigateNumber(number)

	def __onUrlInputChanged(self):
		if not self.__urlSuggestionTimer.isActive():
			self.__urlSuggestionTimer.startLongTimer(1)

	def onInputTimer(self):
		self.__inputTimer.stop()
		self.textInput.hide()
		text = self.textInput.getText()
		self.textInput.setText("")
		if text != "" and text != None:
			self.sendTextAsAscii(text)

	def __actionFullscreen(self):
		self.webnavigation.size = (self.width, self.height)
		self.webnavigation.position = (0, 0)

	def __restoreCookies(self):
		cookies = self.__db.getCookies()
		print "[Browser].__restoreCookies ::: restoring %s cookies" %len(cookies)
		rawCookies = []
		for cookie in cookies:
			rawCookies.append( b64encode(cookie.raw) )
		self.webnavigation.cookies = ','.join(rawCookies)

	def __persistCookies(self):
		rawCookies = self.webnavigation.cookies
		if rawCookies.strip() != "":
			rawCookies = rawCookies.split(",")
			cookies = []
			cookie = None
			for rawCookie in rawCookies:
				cookie = Cookie.fromRawString(b64decode(rawCookie))
				if cookie != None:
					cookies.append( cookie )
			print "[Browser].__persistCookies ::: persisting %s cookies" %len(cookies)
			self.__db.persistCookies(cookies)
		else:
			print "[Browser].__persistCookies ::: NO cookies to be persisted"
class serienRecMainScreen(serienRecBaseScreen, Screen, HelpableScreen):
	def __init__(self, session):
		serienRecBaseScreen.__init__(self, session)
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.session = session
		self.picload = ePicLoad()
		self.picloader = None
		self.ErrorMsg = "unbekannt"
		self.skin = None
		self.chooseMenuList = None
		self.chooseMenuList_popup = None
		self.popup_list = []
		self.piconLoader = PiconLoader()
		self.database = None
		self.singleTimer_conn = None
		self.displayTimer_conn = None

		self["actions"] = HelpableActionMap(self, "SerienRecorderActions", {
			"ok"    : (self.keyOK, "Marker für die ausgewählte Serie hinzufügen"),
			"cancel": (self.keyCancel, "SerienRecorder beenden"),
			"left"  : (self.keyLeft, "zur vorherigen Seite blättern"),
			"right" : (self.keyRight, "zur nächsten Seite blättern"),
			"up"    : (self.keyUp, "eine Zeile nach oben"),
			"down"  : (self.keyDown, "eine Zeile nach unten"),
			"red"	: (self.keyRed, "Anzeige-Modus auswählen"),
			"green"	: (self.keyGreen, "Ansicht Sender-Zuordnung öffnen"),
			"yellow": (self.keyYellow, "Ansicht Serien-Marker öffnen"),
			"blue"	: (self.keyBlue, "Ansicht Timer-Liste öffnen"),
			"info" 	: (self.keyCheck, "Suchlauf für Timer starten"),
			"menu"	: (self.recSetup, "Menü für globale Einstellungen öffnen"),
			"nextBouquet" : (self.nextPage, "Serienplaner des nächsten Tages laden"),
			"prevBouquet" : (self.backPage, "Serienplaner des vorherigen Tages laden"),
			"startTeletext"  : (self.wunschliste, "Informationen zur ausgewählten Serie auf Wunschliste anzeigen"),
			"0"		: (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
			"1"		: (self.searchSeries, "Serie manuell suchen"),
			"2"		: (self.reloadSerienplaner, "Serienplaner neu laden"),
			"3"		: (self.showProposalDB, "Liste der Serien/Staffel-Starts anzeigen"),
			"4"		: (self.serieInfo, "Informationen zur ausgewählten Serie anzeigen"),
			"6"		: (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
			"7"		: (self.showWishlist, "Merkzettel (vorgemerkte Folgen) anzeigen"),
			"5"		: (self.imapTest, "IMAP Test"),
		}, -1)
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["SerienRecorderActions" ,], {
			"displayHelp"      : self.showHelp,
			"displayHelp_long" : self.showManual,
		}, 0)

		SerienRecorder.ReadConfigFile()

		if not os.path.exists(config.plugins.serienRec.piconPath.value):
			config.plugins.serienRec.showPicons.value = False

		self.setupSkin()

		if config.plugins.serienRec.updateInterval.value == 24:
			config.plugins.serienRec.timeUpdate.value = True
		elif config.plugins.serienRec.updateInterval.value == 0:
			config.plugins.serienRec.timeUpdate.value = False
		else:
			config.plugins.serienRec.timeUpdate.value = False

		global showMainScreen
		if config.plugins.serienRec.firstscreen.value == "0":
			showMainScreen = True
		else:
			showMainScreen = False

		self.pRegional = 0
		self.pPaytv = 1
		self.pPrime = 1
		self.page = 0
		self.modus = "list"
		self.loading = True
		self.daylist = [[]]
		self.displayTimer = None
		self.displayMode = 1
		self.serviceRefs = None

		self.onLayoutFinish.append(self.setSkinProperties)

		self.onFirstExecBegin.append(self.showSplashScreen)
		self.onFirstExecBegin.append(self.checkForUpdate)

		if config.plugins.serienRec.showStartupInfoText.value:
			if fileExists("%sStartupInfoText" % SerienRecorder.serienRecMainPath):
				self.onFirstExecBegin.append(self.showInfoText)
			else:
				self.onFirstExecBegin.append(self.startScreen)
		else:
			self.onFirstExecBegin.append(self.startScreen)
		self.onClose.append(self.__onClose)

	def imapTest(self):
		from SerienRecorderTVPlaner import imaptest
		imaptest(self.session)

	def showInfoText(self):
		from SerienRecorderStartupInfoScreen import ShowStartupInfo
		self.session.openWithCallback(self.startScreen, ShowStartupInfo)

	def showSplashScreen(self):
		from SerienRecorderSplashScreen import ShowSplashScreen
		self.session.openWithCallback(self.checkForUpdate, ShowSplashScreen, config.plugins.serienRec.showversion.value)

	def checkForUpdate(self):
		if config.plugins.serienRec.Autoupdate.value:
			from SerienRecorderUpdateScreen import checkGitHubUpdate
			checkGitHubUpdate(self.session).checkForUpdate()
		self.startScreen()

	def callHelpAction(self, *args):
		HelpableScreen.callHelpAction(self, *args)

	def setSkinProperties(self):
		super(self.__class__, self).setSkinProperties()

		self['text_red'].setText("Anzeige-Modus")
		self['text_green'].setText("Sender zuordnen")
		self['text_ok'].setText("Marker hinzufügen")
		self['text_yellow'].setText("Serien Marker")
		self['text_blue'].setText("Timer-Liste")
		self.num_bt_text[0][1] = "IMAP-Test"
		self.num_bt_text[1][0] = "Serie suchen"
		self.num_bt_text[2][0] = "Neu laden"
		self.num_bt_text[2][2] = "Timer suchen"

		super(self.__class__, self).startDisplayTimer()

	def setupSkin(self):
		self.skin = None
		InitSkin(self)

		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList.l.setItemHeight(int(50 * skinFactor))
		self['menu_list'] = self.chooseMenuList
		self['menu_list'].show()

		# popup
		self.chooseMenuList_popup = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList_popup.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList_popup.l.setItemHeight(int(30 * skinFactor))
		self['popup_list'] = self.chooseMenuList_popup
		self['popup_list'].hide()

		self['title'].setText("Lade infos from Web...")

		if config.plugins.serienRec.showCover.value:
			self['cover'].show()

		if not config.plugins.serienRec.showAllButtons.value:
			self['bt_red'].show()
			self['bt_green'].show()
			self['bt_ok'].show()
			self['bt_yellow'].show()
			self['bt_blue'].show()
			self['bt_exit'].show()
			self['bt_text'].show()
			self['bt_epg'].show()
			self['bt_info'].show()
			self['bt_menu'].show()

			self['text_red'].show()
			self['text_green'].show()
			self['text_ok'].show()
			self['text_yellow'].show()
			self['text_blue'].show()
			self['text_0'].show()
			self['text_1'].show()
			self['text_2'].show()
			self['text_3'].show()
			self['text_4'].show()

	def updateMenuKeys(self):
		updateMenuKeys(self)

	def test(self):
		i = 0

	def reloadSerienplaner(self):
		# lt = datetime.datetime.now()
		# lt += datetime.timedelta(days=self.page)
		# key = time.strftime('%d.%m.%Y', lt.timetuple())
		# cache = serienRecMainScreen.loadPlanerData(config.plugins.serienRec.screenplaner.value)
		# if key in cache:
		# 	del cache[key]
		self.readPlanerData(False)

	def readLogFile(self):
		from SerienRecorderLogScreen import serienRecReadLog
		self.session.open(serienRecReadLog)

	def showProposalDB(self):
		from SerienRecorderSeasonBeginsScreen import serienRecShowSeasonBegins
		self.session.openWithCallback(self.readPlanerData, serienRecShowSeasonBegins)

	def searchSeries(self):
		if self.modus == "list":
			self.session.openWithCallback(self.wSearch, NTIVirtualKeyBoard, title = "Serien Titel eingeben:")

	def wSearch(self, serien_name):
		if serien_name:
			from SerienRecorderSearchResultScreen import serienRecSearchResultScreen
			self.session.openWithCallback(self.handleSeriesSearchEnd, serienRecSearchResultScreen, serien_name)

	def handleSeriesSearchEnd(self, serien_name=None):
		if serien_name:
			from SerienRecorderMarkerScreen import serienRecMarker
			self.session.openWithCallback(self.readPlanerData, serienRecMarker, serien_name)
		else:
			self.readPlanerData(False)

	def serieInfo(self):
		if self.loading:
			return

		check = self['menu_list'].getCurrent()
		if check is None:
			return

		(serien_name, serien_id) = self.getSeriesNameID()
		from SerienRecorderSeriesInfoScreen import serienRecShowInfo
		self.session.open(serienRecShowInfo, serien_name, serien_id)

	def wunschliste(self):
		(serien_name, serien_id) = self.getSeriesNameID()
		super(self.__class__, self).wunschliste(serien_id)

	def setHeadline(self):
		if int(config.plugins.serienRec.screenplaner.value) == 1:
			self['headline'].setText("Serien-Planer (Serien Tagesübersicht)")
			self['text_red'].setText("Top 30")
		elif int(config.plugins.serienRec.screenplaner.value) == 2:
			self['headline'].setText("Top 30 SerienRecorder Serien")
			self['text_red'].setText("Tagesübersicht")

		self['headline'].instance.setForegroundColor(parseColor("red"))

	def recSetup(self):
		from SerienRecorderSetupScreen import serienRecSetup
		self.session.openWithCallback(self.setupClose, serienRecSetup)

	def setupClose(self, result):
		super(self.__class__, self).setupClose(result)
		if result[1]:
			self.readPlanerData()

	def startScreen(self):
		print "[SerienRecorder] version %s is running..." % config.plugins.serienRec.showversion.value

		if not SerienRecorder.refreshTimer:
			if config.plugins.serienRec.timeUpdate.value:
				SerienRecorder.serienRecCheckForRecording(self.session, False, False)

		if not SerienRecorder.initDB():
			self.keyCancel()
			self.close()
			return

		self.database = SRDatabase(SerienRecorder.serienRecDataBaseFilePath)
		if not self.database.hasChannels():
			print "[SerienRecorder] Channellist is empty !"
			from SerienRecorderChannelScreen import serienRecMainChannelEdit
			self.session.openWithCallback(self.readPlanerData, serienRecMainChannelEdit)
		else:
			self.serviceRefs = self.database.getActiveServiceRefs()
			if not showMainScreen:
				from SerienRecorderMarkerScreen import serienRecMarker
				self.session.openWithCallback(self.readPlanerData, serienRecMarker)
			else:
				self.readPlanerData(False)

	def readPlanerData(self, answer=True):
		print "[SerienRecorder] readPlanerData"
		if not showMainScreen:
			self.keyCancel()
			self.close()
			return

		self.loading = True
		cache = serienRecSeriesPlanner.loadPlanerData(config.plugins.serienRec.screenplaner.value)

		if answer:
			cache.clear()

		self.setHeadline()
		self['title'].instance.setForegroundColor(parseColor("foreground"))

		lt = datetime.datetime.now()
		if config.plugins.serienRec.screenplaner.value == 1:
			lt += datetime.timedelta(days=self.page)
		key = time.strftime('%d.%m.%Y', lt.timetuple())
		if key in cache:
			try:
				self['title'].setText("Lade Infos vom Speicher...")
				if config.plugins.serienRec.screenplaner.value == 1:
					self.processPlanerData(cache[key], True)
				else:
					self.processTopThirty(cache[key], True)
			except:
				SRLogger.writeLog("Fehler beim Abrufen und Verarbeiten der Daten\n", True)
		else:
			self['title'].setText("Lade Infos vom Web...")
			webChannels = self.database.getActiveChannels()
			try:
				if config.plugins.serienRec.screenplaner.value == 1:
					planerData = SeriesServer().doGetPlanerData(int(self.page), webChannels)
					self.processPlanerData(planerData, False)
				else:
					topThirtyData = SeriesServer().doGetTopThirty()
					self.processTopThirty(topThirtyData, False)
			except:
				SRLogger.writeLog("Fehler beim Abrufen und Verarbeiten der Daten\n", True)

	def processPlanerData(self, data, useCache=False):
		if not data or len(data) == 0:
			self['title'].setText("Fehler beim Abrufen der SerienPlaner-Daten")
			return
		if useCache:
			(headDate, self.daylist) = data
		else:
			self.daylist = [[]]
			headDate = [data["date"]]


			markers = self.database.getAllMarkerStatusForBoxID(config.plugins.serienRec.BoxID.value)
			timers = self.database.getTimer(self.page)

			for event in data["events"]:
				aufnahme = False
				serieAdded = 0
				start_h = event["time"][:+2]
				start_m = event["time"][+3:]
				start_time = TimeHelpers.getUnixTimeWithDayOffset(start_h, start_m, self.page)

				serien_name = event["name"].encode("utf-8")
				serien_name_lower = serien_name.lower()
				serien_id = int(event["id"])
				sender = event["channel"]
				title = event["title"].encode("utf-8")
				staffel = event["season"]
				episode = event["episode"]
				self.ErrorMsg = "%s - S%sE%s - %s (%s)" % \
				(serien_name, str(staffel).zfill(2), str(episode).zfill(2), title, sender)

				serienTimers = [timer for timer in timers if timer[0] == serien_name_lower]
				serienTimersOnChannel = [serienTimer for serienTimer in serienTimers if
				                         serienTimer[2] == sender.lower()]
				for serienTimerOnChannel in serienTimersOnChannel:
					if (int(serienTimerOnChannel[1]) >= (int(start_time) - 300)) and (
							int(serienTimerOnChannel[1]) < (int(start_time) + 300)):
						aufnahme = True

				# 0 = no marker, 1 = active marker, 2 = deactive marker
				if serien_id in markers:
					serieAdded = 1 if markers[serien_id] else 2

				staffel = str(staffel).zfill(2)
				episode = str(episode).zfill(2)

				##############################
				#
				# CHECK
				#
				# ueberprueft anhand des Seriennamen, Season, Episode ob die serie bereits auf der HDD existiert
				#
				seasonEpisodeString = "S%sE%s" % (str(staffel).zfill(2), str(episode).zfill(2))

				bereits_vorhanden = False
				if config.plugins.serienRec.sucheAufnahme.value:
					(dirname, dirname_serie) = getDirname(self.database, serien_name, staffel)
					if str(episode).isdigit():
						if int(episode) == 0:
							bereits_vorhanden = STBHelpers.countEpisodeOnHDD(dirname, seasonEpisodeString, serien_name,
							                                                 False, title) > 0 and True or False
						else:
							bereits_vorhanden = STBHelpers.countEpisodeOnHDD(dirname, seasonEpisodeString, serien_name,
							                                                 False) > 0 and True or False
					else:
						bereits_vorhanden = STBHelpers.countEpisodeOnHDD(dirname, seasonEpisodeString, serien_name,
						                                                 False) > 0 and True or False

				title = "%s - %s" % (seasonEpisodeString, title)
				regional = False
				paytv = False
				neu = event["new"]
				prime = False
				transmissionTime = event["time"]
				url = ''
				self.daylist[0].append((
				                       regional, paytv, neu, prime, transmissionTime, url, serien_name, sender, staffel,
				                       episode, title, aufnahme, serieAdded, bereits_vorhanden, serien_id))

			print "[SerienRecorder] Es wurden %s Serie(n) gefunden" % len(self.daylist[0])

			if headDate:
				d = headDate[0].split(',')
				d.reverse()
				key = d[0].strip()
				cache = serienRecSeriesPlanner.loadPlanerData(1)
				cache.update({key: (headDate, self.daylist)})
				if config.plugins.serienRec.planerCacheEnabled.value:
					serienRecSeriesPlanner.writePlanerData(1, cache)

		self.loading = False

		if len(self.daylist[0]) != 0:
			if headDate:
				self['title'].setText(
					"Es wurden für - %s - %s Serie(n) gefunden." % (headDate[0], len(self.daylist[0])))
				self['title'].instance.setForegroundColor(parseColor("foreground"))
			else:
				self['title'].setText("Es wurden für heute %s Serie(n) gefunden." % len(self.daylist[0]))
				self['title'].instance.setForegroundColor(parseColor("foreground"))
			self.chooseMenuList.setList(map(self.buildPlanerList, self.daylist[0]))
			self.ErrorMsg = "'getCover()'"
			self.getCover()
		else:
			if int(self.page) < 1 and not int(self.page) == 0:
				self.page -= 1
			self['title'].setText("Es wurden für heute %s Serie(n) gefunden." % len(self.daylist[0]))
			self['title'].instance.setForegroundColor(parseColor("foreground"))
			print "[SerienRecorder] Wunschliste Serien-Planer -> LISTE IST LEER !!!!"
			self.chooseMenuList.setList(map(self.buildPlanerList, self.daylist[0]))

	def processTopThirty(self, data, useCache=False):
		if not data or len(data) == 0:
			self['title'].setText("Fehler beim Abrufen der SerienPlaner-Daten")
			return
		if useCache:
			(headDate, self.daylist) = data
		else:
			self.daylist = [[]]
			headDate = [data["date"]]

			markers = self.database.getAllMarkerStatusForBoxID(config.plugins.serienRec.BoxID.value)

			rank = 0
			for serie in data["series"]:
				serien_name = serie["name"].encode("utf-8")
				serien_id = int(serie["id"])
				average = serie["average"]

				# 0 = no marker, 1 = active marker, 2 = deactive marker
				serieAdded = 0
				if serien_id in markers:
					serieAdded = 1 if markers[serien_id] else 2

				rank += 1
				self.daylist[0].append((serien_name, average, serien_id, serieAdded, rank))

			if headDate:
				d = headDate[0].split(',')
				d.reverse()
				key = d[0].strip()
				cache = serienRecSeriesPlanner.loadPlanerData(2)
				cache.update({key: (headDate, self.daylist)})
				if config.plugins.serienRec.planerCacheEnabled.value:
					serienRecSeriesPlanner.writePlanerData(2, cache)

		self.loading = False
		self['title'].setText("")
		self.chooseMenuList.setList(map(self.buildTopThirtyList, self.daylist[0]))
		self.ErrorMsg = "'getCover()'"
		self.getCover()

	def buildPlanerList(self, entry):
		(regional, paytv, neu, prime, transmissionTime, url, serien_name, sender, staffel, episode, title, aufnahme,
		 serieAdded, bereits_vorhanden, serien_id) = entry

		imageNone = "%simages/black.png" % SerienRecorder.serienRecMainPath
		imageNeu = "%simages/neu.png" % SerienRecorder.serienRecMainPath
		imageTimer = "%simages/timer.png" % SerienRecorder.serienRecMainPath
		imageHDD = "%simages/hdd_icon.png" % SerienRecorder.serienRecMainPath

		if serieAdded == 1:
			seriesColor = parseColor('green').argb()
		elif serieAdded == 2:
			seriesColor = parseColor('red').argb()
		else:
			seriesColor = None
		if aufnahme:
			seriesColor = parseColor('blue').argb()

		titleColor = timeColor = parseColor('foreground').argb()

		if int(neu) == 0:
			imageNeu = imageNone

		if bereits_vorhanden:
			imageHDDTimer = imageHDD
		elif aufnahme:
			imageHDDTimer = imageTimer
		else:
			imageHDDTimer = imageNone

		if config.plugins.serienRec.showPicons.value != "0":
			picon = loadPNG(imageNone)
			if sender and self.serviceRefs.get(sender):
				# Get picon by reference or name
				piconPath = self.piconLoader.getPicon(self.serviceRefs.get(sender)[0] if config.plugins.serienRec.showPicons.value == "1" else self.serviceRefs.get(sender)[1])
				if piconPath:
					self.picloader = PicLoader(80 * skinFactor, 40 * skinFactor)
					picon = self.picloader.load(piconPath)
					self.picloader.destroy()

			return [entry,
			        (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 5 * skinFactor, 80 * skinFactor,
			         40 * skinFactor, picon),
			        (
			        eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 330 * skinFactor, 7 * skinFactor, 30 * skinFactor,
			        22 * skinFactor, loadPNG(imageNeu)),
			        (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 330 * skinFactor, 30 * skinFactor,
			         30 * skinFactor, 22 * skinFactor, loadPNG(imageHDDTimer)),
			        (eListboxPythonMultiContent.TYPE_TEXT, 100 * skinFactor, 3, 200 * skinFactor, 26 * skinFactor, 0,
			         RT_HALIGN_LEFT | RT_VALIGN_CENTER, sender),
			        (eListboxPythonMultiContent.TYPE_TEXT, 100 * skinFactor, 29 * skinFactor, 150 * skinFactor,
			         18 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, transmissionTime, timeColor, timeColor),
			        (eListboxPythonMultiContent.TYPE_TEXT, 365 * skinFactor, 3, 500 * skinFactor, 26 * skinFactor, 0,
			         RT_HALIGN_LEFT | RT_VALIGN_CENTER, serien_name, seriesColor, seriesColor),
			        (eListboxPythonMultiContent.TYPE_TEXT, 365 * skinFactor, 29 * skinFactor, 500 * skinFactor,
			         18 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, title, titleColor, titleColor)
			        ]
		else:
			return [entry,
			        (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 7, 30 * skinFactor, 22 * skinFactor,
			         loadPNG(imageNeu)),
			        (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5, 30 * skinFactor, 30 * skinFactor,
			         22 * skinFactor, loadPNG(imageHDDTimer)),
			        (eListboxPythonMultiContent.TYPE_TEXT, 40 * skinFactor, 3, 280 * skinFactor, 26 * skinFactor, 0,
			         RT_HALIGN_LEFT | RT_VALIGN_CENTER, sender),
			        (eListboxPythonMultiContent.TYPE_TEXT, 40 * skinFactor, 29 * skinFactor, 150 * skinFactor,
			         18 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, transmissionTime, timeColor, timeColor),
			        (eListboxPythonMultiContent.TYPE_TEXT, 340 * skinFactor, 3, 520 * skinFactor, 26 * skinFactor, 0,
			         RT_HALIGN_LEFT | RT_VALIGN_CENTER, serien_name, seriesColor, seriesColor),
			        (eListboxPythonMultiContent.TYPE_TEXT, 340 * skinFactor, 29 * skinFactor, 520 * skinFactor,
			         18 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, title, titleColor, titleColor)
			        ]

	@staticmethod
	def buildTopThirtyList(entry):
		(serien_name, average, serien_id, serieAdded, rank) = entry

		if serieAdded == 1:
			seriesColor = parseColor('green').argb()
		elif serieAdded == 2:
			seriesColor = parseColor('red').argb()
		else:
			seriesColor = None

		title = "%d Abrufe/Tag" % average
		titleColor = parseColor('foreground').argb()

		rank = "%d." % rank

		return [entry,
		        (eListboxPythonMultiContent.TYPE_TEXT, 5 * skinFactor, 3, 40 * skinFactor, 26 * skinFactor, 0,
		         RT_HALIGN_RIGHT | RT_VALIGN_CENTER, rank, titleColor, titleColor),
		        (eListboxPythonMultiContent.TYPE_TEXT, 70 * skinFactor, 3, 520 * skinFactor, 26 * skinFactor, 0,
		         RT_HALIGN_LEFT | RT_VALIGN_CENTER, serien_name, seriesColor, seriesColor),
		        (eListboxPythonMultiContent.TYPE_TEXT, 70 * skinFactor, 29 * skinFactor, 520 * skinFactor,
		         18 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, title, titleColor, titleColor)
		        ]

	def keyOK(self):
		if self.modus == "list":
			if self.loading:
				return

			check = self['menu_list'].getCurrent()
			if check is None:
				return

			(serien_name, serien_id) = self.getSeriesNameID()
			if config.plugins.serienRec.activateNewOnThisSTBOnly.value:
				boxID = None
			else:
				boxID = config.plugins.serienRec.BoxID.value

			if self.database.addMarker(str(serien_id), serien_name, '', boxID, 0):
				SRLogger.writeLog("\nSerien Marker für ' %s ' wurde angelegt" % serien_name, True)
				self['title'].setText("Serie '- %s -' zum Serien Marker hinzugefügt." % serien_name)
				self['title'].instance.setForegroundColor(parseColor("green"))
				if config.plugins.serienRec.tvplaner_full_check.value:
					config.plugins.serienRec.tvplaner_last_full_check.value = int(0)
					config.plugins.serienRec.tvplaner_last_full_check.save()
					SerienRecorder.configfile.save()
				if config.plugins.serienRec.openMarkerScreen.value:
					from SerienRecorderMarkerScreen import serienRecMarker
					self.session.open(serienRecMarker, serien_name)
			else:
				self['title'].setText("Serie '- %s -' existiert bereits im Serien Marker." % serien_name)
				self['title'].instance.setForegroundColor(parseColor("red"))

	def getCover(self):
		if self.loading:
			return

		check = self['menu_list'].getCurrent()
		if check is None:
			return

		(serien_name, serien_id) = self.getSeriesNameID()
		self.ErrorMsg = "'getCover()'"
		SerienRecorder.getCover(self, serien_name, serien_id)

	def keyRed(self):
		if self.modus == "list":
			if config.plugins.serienRec.screenplaner.value == 1:
				config.plugins.serienRec.screenplaner.value = 2
			else:
				config.plugins.serienRec.screenplaner.value = 1
			config.plugins.serienRec.screenplaner.save()
			SerienRecorder.configfile.save()
			self.readPlanerData(False)

	def getSeriesNameID(self):
		if config.plugins.serienRec.screenplaner.value == 1:
			serien_name = self['menu_list'].getCurrent()[0][6]
			serien_id = self['menu_list'].getCurrent()[0][14]
		else:
			serien_name = self['menu_list'].getCurrent()[0][0]
			serien_id = self['menu_list'].getCurrent()[0][2]

		return serien_name, serien_id

	def keyGreen(self):
		from SerienRecorderChannelScreen import serienRecMainChannelEdit
		self.session.openWithCallback(self.readPlanerData, serienRecMainChannelEdit)

	def keyYellow(self):
		from SerienRecorderMarkerScreen import serienRecMarker
		self.session.openWithCallback(self.readPlanerData, serienRecMarker)

	def keyBlue(self):
		from SerienRecorderTimerListScreen import serienRecTimerListScreen
		self.session.openWithCallback(self.readPlanerData, serienRecTimerListScreen)

	def keyCheck(self):
		if config.plugins.serienRec.tvplaner.value:
			self.session.openWithCallback(self.executeAutoCheck, MessageBox, "Bei 'ja' wird der Suchlauf für TV-Planer Timer gestartet, bei 'nein' wird ein voller Suchlauf durchgeführt.", MessageBox.TYPE_YESNO)
		else:
			self.executeAutoCheck(False)

	def executeAutoCheck(self, withTVPlaner):
		from SerienRecorderAutoCheckScreen import serienRecRunAutoCheckScreen
		self.session.openWithCallback(self.readPlanerData, serienRecRunAutoCheckScreen, withTVPlaner)


	def keyLeft(self):
		if self.modus == "list":
			self['menu_list'].pageUp()
			self.getCover()

	def keyRight(self):
		if self.modus == "list":
			self['menu_list'].pageDown()
			self.getCover()

	def keyDown(self):
		if self.modus == "list":
			self['menu_list'].down()
			self.getCover()

	def keyUp(self):
		if self.modus == "list":
			self['menu_list'].up()
			self.getCover()

	def nextPage(self):
		if config.plugins.serienRec.screenplaner.value == 1 and self.page < 4:
			self.page += 1
			self.chooseMenuList.setList(map(self.buildPlanerList, []))
			self.readPlanerData(False)

	def backPage(self):
		if config.plugins.serienRec.screenplaner.value == 1 and not self.page < 1:
			self.page -= 1
		self.chooseMenuList.setList(map(self.buildPlanerList, []))
		self.readPlanerData(False)

	def __onClose(self):
		self.stopDisplayTimer()

	def keyCancel(self):
		if self.modus == "list":
			self.stopDisplayTimer()
			self.close()
Ejemplo n.º 35
0
class ChannelEditor(Screen, HelpableScreen, ChannelsBase):

    skinfile = os.path.join(resolveFilename(SCOPE_PLUGINS),
                            "Extensions/SeriesPlugin/skinChannelEditor.xml")
    skin = open(skinfile).read()

    def __init__(self, session):
        Screen.__init__(self, session)
        HelpableScreen.__init__(self)
        ChannelsBase.__init__(self)

        self.session = session

        self.skinName = ["SeriesPluginChannelEditor"]

        from plugin import NAME, VERSION
        self.setup_title = NAME + " " + _("Channel Editor") + " " + VERSION

        # Buttons
        self["key_red"] = Button(_("Cancel"))
        self["key_green"] = Button(_("OK"))
        self["key_blue"] = Button(_("Remove"))
        self["key_yellow"] = Button(_("Auto match"))

        # Define Actions
        self["actions_1"] = HelpableActionMap(
            self, "SetupActions", {
                "ok": (self.keyAdd, _("Show popup to add Stb Channel")),
                "cancel": (self.keyCancel, _("Cancel and close")),
                "deleteForward":
                (self.keyResetChannelMapping, _("Reset channels")),
            }, -1)
        self["actions_2"] = HelpableActionMap(
            self, "DirectionActions", {
                "left": (self.keyLeft, _("Previeous page")),
                "right": (self.keyRight, _("Next page")),
                "up": (self.keyUp, _("One row up")),
                "down": (self.keyDown, _("One row down")),
            }, -1)
        self["actions_3"] = HelpableActionMap(
            self, "ChannelSelectBaseActions", {
                "nextBouquet": (self.nextBouquet, _("Next bouquet")),
                "prevBouquet": (self.prevBouquet, _("Previous bouquet")),
            }, -1)
        self["actions_4"] = HelpableActionMap(
            self, "ColorActions", {
                "red": (self.keyCancel, _("Cancel and close")),
                "green": (self.keySave, _("Save and close")),
                "blue": (self.keyRemove, _("Remove channel")),
                "yellow": (self.tryToMatchChannels, _("Auto match")),
            }, -2)  # higher priority

        self.helpList[0][2].sort()

        self["helpActions"] = ActionMap([
            "HelpActions",
        ], {"displayHelp": self.showHelp}, 0)

        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        global TemplatedListFonts
        if TemplatedListFonts is not None:
            tlf = TemplatedListFonts()
            self.chooseMenuList.l.setFont(
                0, gFont(tlf.face(tlf.MEDIUM), tlf.size(tlf.MEDIUM)))
            self.chooseMenuList.l.setItemHeight(int(30 * skinFactor))
        else:
            self.chooseMenuList.l.setFont(0, gFont('Regular', 20))
            self.chooseMenuList.l.setItemHeight(25)
        self['list'] = self.chooseMenuList
        self['list'].show()

        self.stbChlist = []
        self.webChlist = []
        self.stbToWebChlist = []

        self.bouquet = None

        self.onLayoutFinish.append(self.readChannels)
        self.onShown.append(self.showMessage)

    def showMessage(self):
        if self.showMessage in self.onShown:
            self.onShown.remove(self.showMessage)
            self.session.open(
                MessageBox,
                _("You have to match SD and HD channels separately!"),
                MessageBox.TYPE_INFO)

    def readChannels(self, bouquet=None):
        self.stbToWebChlist = []

        if bouquet is None:
            self.bouquet = config.plugins.seriesplugin.bouquet_main.value
            self.stbChlist = []
        elif bouquet != self.bouquet:
            self.bouquet = bouquet
            self.stbChlist = []

        self.setTitle(_("Load channels for bouquet") + " " + self.bouquet)

        if not self.stbChlist:
            self.stbChlist = buildSTBchannellist(self.bouquet)

        if not self.webChlist:
            from WebChannels import WebChannels
            WebChannels(self.setWebChannels).request()
        else:
            self.showChannels()

    def setWebChannels(self, data):
        #data.sort()
        temp = [(x, unifyChannel(x)) for x in data]
        self.webChlist = sorted(temp, key=lambda tup: tup[0])
        self.showChannels()

    def showChannels(self):
        if len(self.stbChlist) != 0:
            for servicename, serviceref, uservicename in self.stbChlist:
                #logDebug("SPC: servicename", servicename, uservicename)

                webSender = self.lookupChannelByReference(serviceref)
                if webSender is not False:
                    self.stbToWebChlist.append(
                        (servicename, ' / '.join(webSender), serviceref, "1"))

                else:
                    self.stbToWebChlist.append(
                        (servicename, "", serviceref, "0"))

        if len(self.stbToWebChlist) != 0:
            self.chooseMenuList.setList(
                map(self.buildList, self.stbToWebChlist))
        else:
            logDebug("SPC: Error creating webChlist..")
            self.setTitle(_("Error check log file"))

    def tryToMatchChannels(self):
        self.setTitle(_("Channel matching..."))
        self.stbToWebChlist = []
        sequenceMatcher = SequenceMatcher(" ".__eq__, "", "")

        if len(self.stbChlist) != 0:
            for servicename, serviceref, uservicename in self.stbChlist:
                #logDebug("SPC: servicename", servicename, uservicename)

                webSender = self.lookupChannelByReference(serviceref)
                if webSender is not False:
                    self.stbToWebChlist.append(
                        (servicename, ' / '.join(webSender), serviceref, "1"))

                else:
                    if len(self.webChlist) != 0:
                        match = ""
                        ratio = 0
                        for webSender, uwebSender in self.webChlist:
                            #logDebug("SPC: webSender", webSender, uwebSender)
                            if uwebSender in uservicename or uservicename in uwebSender:

                                sequenceMatcher.set_seqs(
                                    uservicename, uwebSender)
                                newratio = sequenceMatcher.ratio()
                                if newratio > ratio:
                                    logDebug("SPC: possible match",
                                             servicename, uservicename,
                                             webSender, uwebSender, ratio)
                                    ratio = newratio
                                    match = webSender

                        if ratio > 0:
                            logDebug("SPC: match", servicename, uservicename,
                                     match, ratio)
                            self.stbToWebChlist.append(
                                (servicename, match, serviceref, "1"))
                            self.addChannel(serviceref, servicename, match)

                        else:
                            self.stbToWebChlist.append(
                                (servicename, "", serviceref, "0"))

                    else:
                        self.stbToWebChlist.append(
                            (servicename, "", serviceref, "0"))

        if len(self.stbToWebChlist) != 0:
            self.chooseMenuList.setList(
                map(self.buildList, self.stbToWebChlist))
        else:
            logDebug("SPC: Error creating webChlist..")
            self.setTitle(_("Error check log file"))

    def buildList(self, entry):
        self.setTitle(
            _("STB- / Web-Channel for bouquet:") + " " + self.bouquet)

        (stbSender, webSender, serviceref, status) = entry
        if int(status) == 0:
            imageStatus = path = os.path.join(PIXMAP_PATH, "minus.png")
        else:
            imageStatus = path = os.path.join(PIXMAP_PATH, "plus.png")

        global TemplatedListFonts
        if TemplatedListFonts is not None:
            l = [
                entry,
                (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 8,
                 16 * skinFactor, 16 * skinFactor, loadPNG(imageStatus)),
                (eListboxPythonMultiContent.TYPE_TEXT, 35 * skinFactor, 0,
                 400 * skinFactor, 30 * skinFactor, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, stbSender),
                (eListboxPythonMultiContent.TYPE_TEXT, 450 * skinFactor, 0,
                 450 * skinFactor, 30 * skinFactor, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, webSender),
                (eListboxPythonMultiContent.TYPE_TEXT, 900 * skinFactor, 0,
                 300 * skinFactor, 30 * skinFactor, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, "", colorYellow)
            ]
        else:
            l = [
                entry,
                (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 8, 16,
                 16, loadPNG(imageStatus)),
                (eListboxPythonMultiContent.TYPE_TEXT, 35, 3, 300, 26, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, stbSender),
                (eListboxPythonMultiContent.TYPE_TEXT, 350, 3, 250, 26, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, webSender),
                (eListboxPythonMultiContent.TYPE_TEXT, 600, 3, 250, 26, 0,
                 RT_HALIGN_LEFT | RT_VALIGN_CENTER, "", colorYellow)
            ]
        return l

    def getIndexOfWebSender(self, webSender):
        for pos, webCh in enumerate(self.webChlist):
            if (webCh[0] == webSender):
                return pos
        return 0

    def keyAdd(self):
        check = self['list'].getCurrent()
        if check == None:
            logDebug("SPC: list empty")
            return
        else:
            idx = 0
            (servicename, webSender, serviceref,
             state) = self['list'].getCurrent()[0]
            idx = 0
            if webSender:
                idx = self.getIndexOfWebSender(self.webChlist)
            logDebug("SPC: keyAdd webSender", webSender, idx)
            self.session.openWithCallback(
                boundFunction(self.addConfirm, servicename,
                              serviceref, webSender), ChoiceBox,
                _("Add Web Channel"), self.webChlist, None, idx)

    def getIndexOfServiceref(self, serviceref):
        for pos, stbWebChl in enumerate(self.stbToWebChlist):
            if (stbWebChl[2] == serviceref):
                return pos
        return False

    def addConfirm(self, servicename, serviceref, webSender, result):
        if not result:
            return
        remote = result[0]
        if webSender and remote == webSender:
            logDebug("SPC: addConfirm skip already set", servicename,
                     serviceref, remote, webSender)
        elif servicename and serviceref and remote and not webSender:
            idx = self.getIndexOfServiceref(serviceref)
            logDebug("SPC: addConfirm", servicename, serviceref, remote, idx)
            if idx is not False:
                self.setTitle(
                    _("Channel '- %(servicename)s - %(remote)s -' added.") % {
                        'servicename': servicename,
                        'remote': remote
                    })
                self.addChannel(serviceref, servicename, remote)
                self.stbToWebChlist[idx] = (servicename, remote, serviceref,
                                            "1")
                self.chooseMenuList.setList(
                    map(self.buildList, self.stbToWebChlist))
        elif servicename and serviceref and remote and webSender:
            logDebug("SPC: add or replace", servicename, serviceref, remote,
                     webSender)
            self.session.openWithCallback(
                boundFunction(self.addOrReplace, servicename, serviceref,
                              webSender, remote),
                MessageBox,
                _("Add channel (Yes) or replace it (No)"),
                MessageBox.TYPE_YESNO,
                default=False)

    def addOrReplace(self, servicename, serviceref, webSender, remote, result):
        idx = self.getIndexOfServiceref(serviceref)
        logDebug("SPC: addOrReplace", servicename, serviceref, remote,
                 webSender, idx)
        if idx is False:
            return

        if result:
            logDebug("SPC: add", servicename, serviceref, remote, webSender)
            self.setTitle(
                _("Channel '- %(servicename)s - %(remote)s -' added.") % {
                    'servicename': servicename,
                    'remote': remote
                })
            self.addChannel(serviceref, servicename, remote)
            self.stbToWebChlist[idx] = (servicename,
                                        webSender + " / " + remote, serviceref,
                                        "1")

        else:
            logDebug("SPC: replace", servicename, serviceref, remote,
                     webSender)
            self.setTitle(
                _("Channel '- %(servicename)s - %(remote)s -' replaced.") % {
                    'servicename': servicename,
                    'remote': remote
                })
            self.replaceChannel(serviceref, servicename, remote)
            self.stbToWebChlist[idx] = (servicename, remote, serviceref, "1")

        self.chooseMenuList.setList(map(self.buildList, self.stbToWebChlist))

    def keyRemove(self):
        check = self['list'].getCurrent()
        if check == None:
            logDebug("SPC: keyRemove list empty")
            return
        else:
            (servicename, webSender, serviceref,
             state) = self['list'].getCurrent()[0]
            logDebug("SPC: keyRemove", servicename, webSender, serviceref,
                     state)
            if serviceref:
                #TODO handle multiple links/alternatives - show a choicebox
                self.session.openWithCallback(boundFunction(
                    self.removeConfirm, servicename, serviceref),
                                              MessageBox,
                                              _("Remove '%s'?") % servicename,
                                              MessageBox.TYPE_YESNO,
                                              default=False)

    def removeConfirm(self, servicename, serviceref, answer):
        if not answer:
            return
        if serviceref:
            idx = self.getIndexOfServiceref(serviceref)
            if idx is not False:
                logDebug("SPC: removeConfirm", servicename, serviceref, idx)
                self.setTitle(_("Channel '- %s -' removed.") % servicename)
                self.removeChannel(serviceref)
                self.stbToWebChlist[idx] = (servicename, "", serviceref, "0")
                self.chooseMenuList.setList(
                    map(self.buildList, self.stbToWebChlist))

    def keyResetChannelMapping(self):
        self.session.openWithCallback(self.channelReset, MessageBox,
                                      _("Reset channel list?"),
                                      MessageBox.TYPE_YESNO)

    def channelReset(self, answer):
        if answer:
            logDebug("SPC: channel-list reset...")
            self.resetChannels()
            self.stbChlist = []
            self.webChlist = []
            self.stbToWebChlist = []
            self.readChannels()

    def keyLeft(self):
        self['list'].pageUp()

    def keyRight(self):
        self['list'].pageDown()

    def keyDown(self):
        self['list'].down()

    def keyUp(self):
        self['list'].up()

    def nextBouquet(self):
        tvbouquets = getTVBouquets()
        next = tvbouquets[0][1]
        for tvbouquet in reversed(tvbouquets):
            if tvbouquet[1] == self.bouquet:
                break
            next = tvbouquet[1]
        self.readChannels(next)

    def prevBouquet(self):
        tvbouquets = getTVBouquets()
        prev = tvbouquets[-1][1]
        for tvbouquet in tvbouquets:
            if tvbouquet[1] == self.bouquet:
                break
            prev = tvbouquet[1]
        self.readChannels(prev)

    def keySave(self):
        self.close(ChannelsBase.channels_changed)

    def keyCancel(self):
        self.close(False)

    def hideHelpWindow(self):
        current = self["config"].getCurrent()
        if current and hasattr(current[1], "help_window"):
            help_window = current[1].help_window
            if help_window:
                help_window.hide()
Ejemplo n.º 36
0
class serienRecSendeTermine(serienRecBaseScreen, Screen, HelpableScreen):
    def __init__(self, session, seriesName, seriesWLID, seriesFSID):
        serienRecBaseScreen.__init__(self, session)
        Screen.__init__(self, session)
        HelpableScreen.__init__(self)
        self.database = SRDatabase(serienRecDataBaseFilePath)
        self.session = session
        self.picload = ePicLoad()
        self.seriesName = seriesName
        self.addedEpisodes = self.database.getTimerForSeries(seriesFSID, False)
        self.seriesWLID = seriesWLID
        self.seriesFSID = seriesFSID
        self.skin = None

        self["actions"] = HelpableActionMap(
            self, "SerienRecorderActions", {
                "ok":
                (self.keyOK,
                 "umschalten ausgewählter Sendetermin aktiviert/deaktiviert"),
                "cancel": (self.keyCancel, "zurück zur Serien-Marker-Ansicht"),
                "left": (self.keyLeft, "zur vorherigen Seite blättern"),
                "right": (self.keyRight, "zur nächsten Seite blättern"),
                "up": (self.keyUp, "eine Zeile nach oben"),
                "down": (self.keyDown, "eine Zeile nach unten"),
                "red": (self.keyRed, "zurück zur Serien-Marker-Ansicht"),
                "green":
                (self.keyGreen, "Timer für aktivierte Sendetermine erstellen"),
                "yellow":
                (self.keyYellow,
                 "umschalten Filter (aktive Sender) aktiviert/deaktiviert"),
                "blue": (self.keyBlue, "Ansicht Timer-Liste öffnen"),
                "menu":
                (self.recSetup, "Menü für globale Einstellungen öffnen"),
                "startTeletext":
                (self.wunschliste,
                 "Informationen zur ausgewählten Serie auf Wunschliste anzeigen"
                 ),
                "0":
                (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
                "3": (self.showProposalDB,
                      "Liste der Serien/Staffel-Starts anzeigen"),
                "4": (self.serieInfo,
                      "Informationen zur ausgewählten Serie anzeigen"),
                "6":
                (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
                "7": (self.showWishlist,
                      "Merkzettel (vorgemerkte Folgen) anzeigen"),
            }, -1)
        self.helpList[0][2].sort()

        self["helpActions"] = ActionMap([
            "SerienRecorderActions",
        ], {
            "displayHelp": self.showHelp,
            "displayHelp_long": self.showManual,
        }, 0)

        self.filterMode = 1
        self.title_txt = "aktive Sender"

        self.changesMade = False

        self.setupSkin()

        self.sendetermine_list = []
        self.loading = True

        self.onLayoutFinish.append(self.searchEvents)
        self.onClose.append(self.__onClose)
        self.onLayoutFinish.append(self.setSkinProperties)

    def callHelpAction(self, *args):
        HelpableScreen.callHelpAction(self, *args)

    def setSkinProperties(self):
        super(self.__class__, self).setSkinProperties()

        self['text_red'].setText("Abbrechen")
        self['text_ok'].setText("Auswahl")
        if self.filterMode == 1:
            self['text_yellow'].setText("Filter umschalten")
            self.title_txt = "aktive Sender"
        elif self.filterMode == 2:
            self['text_yellow'].setText("Filter ausschalten")
            self.title_txt = "Marker Sender"
        else:
            self['text_yellow'].setText("Filter einschalten")
            self.title_txt = "alle"
        self['text_blue'].setText("Timer-Liste")

        super(self.__class__, self).startDisplayTimer()

    def setupSkin(self):
        self.skin = None
        InitSkin(self)

        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.chooseMenuList.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList.l.setItemHeight(int(50 * skinFactor))
        self['menu_list'] = self.chooseMenuList
        self['menu_list'].show()

        self['title'].setText("Lade Web-Sender / Box-Sender...")

        if config.plugins.serienRec.showCover.value:
            self['cover'].show()

        if not config.plugins.serienRec.showAllButtons.value:
            self['bt_red'].show()
            self['bt_green'].show()
            self['bt_ok'].show()
            self['bt_yellow'].show()
            self['bt_blue'].show()
            self['bt_exit'].show()
            self['bt_text'].show()
            self['bt_info'].show()
            self['bt_menu'].show()

            self['text_red'].show()
            self['text_green'].show()
            self['text_ok'].show()
            self['text_yellow'].show()
            self['text_blue'].show()
            self['text_0'].show()
            self['text_1'].show()
            self['text_2'].show()
            self['text_3'].show()
            self['text_4'].show()

    def serieInfo(self):
        if self.loading:
            return

        if self.seriesWLID:
            from .SerienRecorderSeriesInfoScreen import serienRecShowInfo
            self.session.open(serienRecShowInfo, self.seriesName,
                              self.seriesWLID, self.seriesFSID)

    # self.session.open(MessageBox, "Diese Funktion steht in dieser Version noch nicht zur Verfügung!",
    #				  MessageBox.TYPE_INFO, timeout=10)

    def wunschliste(self):
        serien_id = self.seriesWLID
        super(self.__class__, self).wunschliste(serien_id)

    def setupClose(self, result):
        if not result[2]:
            self.close()
        else:
            if result[0]:
                if config.plugins.serienRec.timeUpdate.value:
                    from .SerienRecorderCheckForRecording import checkFromRecordingSingleton
                    checkFromRecordingSingleton.initialize(
                        self.session, False, False)

            if result[1]:
                self.searchEvents()

    def searchEvents(self, result=None):
        self['title'].setText("Suche ' %s '" % self.seriesName)
        print("[SerienRecorder] suche ' %s '" % self.seriesName)
        print(self.seriesWLID)

        transmissions = None
        if self.seriesWLID:

            if self.seriesWLID != 0:
                print(self.seriesWLID)
                from .SerienRecorder import getCover
                getCover(self, self.seriesName, self.seriesWLID,
                         self.seriesFSID)

                if self.filterMode == 0:
                    webChannels = []
                elif self.filterMode == 1:
                    webChannels = self.database.getActiveChannels()
                else:
                    webChannels = self.database.getMarkerChannels(
                        self.seriesWLID)

                try:
                    transmissions = SeriesServer().doGetTransmissions(
                        self.seriesWLID, 0, webChannels)
                except:
                    transmissions = None
            else:
                transmissions = None

        self.resultsEvents(transmissions)

    def resultsEvents(self, transmissions):
        if transmissions is None:
            self['title'].setText(
                "Fehler beim Abrufen der Termine für ' %s '" % self.seriesName)
            return
        self.sendetermine_list = []

        # Update added list in case of made changes
        if self.changesMade:
            self.addedEpisodes = self.database.getTimerForSeries(
                self.seriesFSID, False)

        # build unique dir list by season
        dirList = {}
        # build unique margins
        marginList = {}

        SerieStaffel = None
        AbEpisode = None
        try:
            (serienTitle, SerieUrl, SerieStaffel, SerieSender, AbEpisode,
             AnzahlAufnahmen, SerieEnabled, excludedWeekdays, skipSeriesServer,
             markerType, fsID) = self.database.getMarkers(
                 config.plugins.serienRec.BoxID.value,
                 config.plugins.serienRec.NoOfRecords.value,
                 [self.seriesFSID])[0]
        except:
            SRLogger.writeLog("Fehler beim Filtern nach Staffel", True)

        for serien_name, sender, startzeit, endzeit, staffel, episode, title, status in transmissions:
            seasonAllowed = True
            if config.plugins.serienRec.seasonFilter.value:
                seasonAllowed = self.isSeasonAllowed(staffel, episode,
                                                     SerieStaffel, AbEpisode)

            if seasonAllowed:
                seasonEpisodeString = "S%sE%s" % (str(staffel).zfill(2),
                                                  str(episode).zfill(2))

                bereits_vorhanden = False
                if config.plugins.serienRec.sucheAufnahme.value:
                    if not staffel in dirList:
                        dirList[staffel] = getDirname(self.database,
                                                      serien_name,
                                                      self.seriesFSID, staffel)

                    (dirname, dirname_serie) = dirList[staffel]
                    if str(episode).isdigit():
                        if int(episode) == 0:
                            bereits_vorhanden = STBHelpers.countEpisodeOnHDD(
                                dirname, seasonEpisodeString, serien_name,
                                True, title) and True or False
                        else:
                            bereits_vorhanden = STBHelpers.countEpisodeOnHDD(
                                dirname, seasonEpisodeString, serien_name,
                                True) and True or False
                    else:
                        bereits_vorhanden = STBHelpers.countEpisodeOnHDD(
                            dirname, seasonEpisodeString, serien_name,
                            True) and True or False

                if bereits_vorhanden:
                    addedType = 1
                else:
                    if not sender in marginList:
                        marginList[sender] = self.database.getMargins(
                            self.seriesFSID, sender,
                            config.plugins.serienRec.margin_before.value,
                            config.plugins.serienRec.margin_after.value)

                    (margin_before, margin_after) = marginList[sender]

                    # check 2 (im timer file)
                    start_unixtime = startzeit - (int(margin_before) * 60)

                    if self.isTimerAdded(self.addedEpisodes, sender, staffel,
                                         episode, int(start_unixtime), title):
                        addedType = 2
                    elif self.isAlreadyAdded(self.addedEpisodes, staffel,
                                             episode, title):
                        addedType = 3
                    else:
                        addedType = 0

                if not config.plugins.serienRec.timerFilter.value or config.plugins.serienRec.timerFilter.value and addedType == 0:
                    self.sendetermine_list.append([
                        serien_name, sender, startzeit, endzeit, staffel,
                        episode, title, status, addedType
                    ])

        if len(self.sendetermine_list):
            self['text_green'].setText("Timer erstellen")

        self.chooseMenuList.setList(
            list(map(self.buildList_termine, self.sendetermine_list)))
        self.loading = False
        self['title'].setText(
            "%s Sendetermine für ' %s ' gefunden. (%s)" % (str(
                len(self.sendetermine_list)), self.seriesName, self.title_txt))

    @staticmethod
    def buildList_termine(entry):
        (serien_name, sender, start, end, staffel, episode, title, status,
         addedType) = entry

        # addedType: 0 = None, 1 = on HDD, 2 = Timer available, 3 = in DB
        seasonEpisodeString = "S%sE%s" % (str(staffel).zfill(2),
                                          str(episode).zfill(2))

        weekdays = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
        transmissionTime = time.localtime(start)
        datum = time.strftime(
            weekdays[transmissionTime.tm_wday] + ", %d.%m.%Y",
            transmissionTime)
        startTime = time.strftime("%H:%M", transmissionTime)

        serienRecMainPath = os.path.dirname(__file__)

        imageMinus = "%s/images/minus.png" % serienRecMainPath
        imagePlus = "%s/images/plus.png" % serienRecMainPath
        imageNone = "%s/images/black.png" % serienRecMainPath

        if int(status) == 0:
            leftImage = imageMinus
        else:
            leftImage = imagePlus

        imageHDD = imageNone
        imageTimer = imageNone
        if addedType == 1:
            titleColor = None
            imageHDD = "%simages/hdd_icon.png" % serienRecMainPath
        elif addedType == 2:
            titleColor = parseColor('blue').argb()
            imageTimer = "%simages/timer.png" % serienRecMainPath
        elif addedType == 3:
            titleColor = parseColor('green').argb()
        else:
            titleColor = parseColor('red').argb()

        foregroundColor = parseColor('foreground').argb()

        return [
            entry,
            (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 5,
             15 * skinFactor, 16 * skinFactor, 16 * skinFactor,
             loadPNG(leftImage)),
            (eListboxPythonMultiContent.TYPE_TEXT, 40 * skinFactor, 3,
             240 * skinFactor, 26 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, sender, foregroundColor,
             foregroundColor),
            (eListboxPythonMultiContent.TYPE_TEXT, 40 * skinFactor,
             29 * skinFactor, 230 * skinFactor, 18 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER,
             "%s - %s" % (datum, startTime)),
            (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST,
             265 * skinFactor, 7 * skinFactor, 30 * skinFactor,
             22 * skinFactor, loadPNG(imageTimer)),
            (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST,
             265 * skinFactor, 30 * skinFactor, 30 * skinFactor,
             22 * skinFactor, loadPNG(imageHDD)),
            (eListboxPythonMultiContent.TYPE_TEXT, 300 * skinFactor, 3,
             500 * skinFactor, 26 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, serien_name, foregroundColor,
             foregroundColor),
            (eListboxPythonMultiContent.TYPE_TEXT, 300 * skinFactor,
             29 * skinFactor, 498 * skinFactor, 18 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER,
             "%s - %s" % (seasonEpisodeString, title), titleColor, titleColor)
        ]

    @staticmethod
    def isAlreadyAdded(addedEpisodes, season, episode, title=None):
        result = False
        # Title is only relevant if season and episode is 0
        # this happen when Wunschliste has no episode and season information
        seasonEpisodeString = "S%sE%s" % (str(season).zfill(2),
                                          str(episode).zfill(2))
        if seasonEpisodeString != "S00E00":
            title = None
        if not title:
            for addedEpisode in addedEpisodes:
                if addedEpisode[0] == season and addedEpisode[1] == episode:
                    result = True
                    break
        else:
            for addedEpisode in addedEpisodes:
                if addedEpisode[0] == season and addedEpisode[
                        1] == episode and addedEpisode[2] == title:
                    result = True
                    break

        return result

    @staticmethod
    def isTimerAdded(addedEpisodes,
                     sender,
                     season,
                     episode,
                     start_unixtime,
                     title=None):
        result = False
        if not title:
            for addedEpisode in addedEpisodes:
                if addedEpisode[0] == season and addedEpisode[1] == episode and addedEpisode[
                 3] == sender.lower() and int(start_unixtime) - (int(STBHelpers.getEPGTimeSpan()) * 60) <= \
                  addedEpisode[4] <= int(start_unixtime) + (int(STBHelpers.getEPGTimeSpan()) * 60):
                    result = True
                    break
        else:
            for addedEpisode in addedEpisodes:
                if ((addedEpisode[0] == season and addedEpisode[1] == episode) or addedEpisode[2] == title) and \
                  addedEpisode[3] == sender.lower() and int(start_unixtime) - (
                  int(STBHelpers.getEPGTimeSpan()) * 60) <= addedEpisode[4] <= int(start_unixtime) + (
                  int(STBHelpers.getEPGTimeSpan()) * 60):
                    result = True
                    break

        return result

    def countSelectedTransmissionForTimerCreation(self):
        result = 0
        for serien_name, sender, start_unixtime, end_unixtime, staffel, episode, title, status, addedType in self.sendetermine_list:
            if int(status) == 1:
                result += 1

        return result

    def getTimes(self):
        changesMade = False
        if len(
                self.sendetermine_list
        ) != 0 and self.countSelectedTransmissionForTimerCreation() != 0:
            (activatedTimer,
             deactivatedTimer) = serienRecSendeTermine.prepareTimer(
                 self.database, self.filterMode, self.seriesWLID,
                 self.seriesFSID, self.sendetermine_list)

            # self.session.open(serienRecRunAutoCheck, False)
            from .SerienRecorderLogScreen import serienRecReadLog
            self.session.open(serienRecReadLog)
            if activatedTimer > 0 or deactivatedTimer > 0:
                changesMade = True

        else:
            self['title'].setText("Keine Sendetermine ausgewählt.")
            print("[SerienRecorder] keine Sendetermine ausgewählt.")

        return changesMade

    @staticmethod
    def createTimer(database, filterMode, wlid, fsid, params, force=True):
        activatedTimer = 0
        deactivatedTimer = 0

        if not force:
            return False, activatedTimer, deactivatedTimer
        else:
            (serien_name, sender, start_unixtime, margin_before, margin_after,
             end_unixtime, label_serie, staffel, episode, title, dirname,
             preferredChannel, useAlternativeChannel, vpsSettings, tags,
             addToDatabase, autoAdjust, epgSeriesName) = params
            # check sender
            (webChannel, stbChannel, stbRef, altstbChannel, altstbRef,
             status) = database.getChannelInfo(sender, wlid, filterMode)

            TimerOK = False
            if stbChannel == "":
                SRLogger.writeLog(
                    "' %s ' - Kein Box-Sender gefunden → ' %s '" %
                    (serien_name, webChannel))
            elif int(status) == 0:
                SRLogger.writeLog("' %s ' - Box-Sender deaktiviert → ' %s '" %
                                  (serien_name, webChannel))
            else:
                from .SerienRecorderTimer import serienRecTimer, serienRecBoxTimer
                timer = serienRecTimer()
                timer_name = serienRecTimer.getTimerName(
                    serien_name, staffel, episode, title, 0)
                timer_description = serienRecTimer.getTimerDescription(
                    serien_name, staffel, episode, title)

                if preferredChannel == 1:
                    timer_stbRef = stbRef
                    timer_altstbRef = altstbRef
                else:
                    timer_stbRef = altstbRef
                    timer_altstbRef = stbRef

                # try to get eventID (eit) from epgCache
                if len(epgSeriesName) == 0 or epgSeriesName == serien_name:
                    epgSeriesName = ""

                if database.getUpdateFromEPG(
                        fsid, config.plugins.serienRec.eventid.value):

                    eit, start_unixtime_eit, end_unixtime_eit = STBHelpers.getStartEndTimeFromEPG(
                        start_unixtime, end_unixtime, margin_before,
                        serien_name, epgSeriesName, timer_stbRef)
                    if eit > 0:
                        # Adjust the EPG start/end time with margins
                        start_unixtime_eit = int(start_unixtime_eit) - (
                            int(margin_before) * 60)
                        end_unixtime_eit = int(end_unixtime_eit) + (
                            int(margin_after) * 60)
                else:
                    eit = 0
                    start_unixtime_eit = start_unixtime
                    end_unixtime_eit = end_unixtime

                konflikt = ""

                # versuche timer anzulegen
                result = serienRecBoxTimer.addTimer(timer_stbRef,
                                                    str(start_unixtime_eit),
                                                    str(end_unixtime_eit),
                                                    timer_name,
                                                    timer_description, eit,
                                                    False, dirname,
                                                    vpsSettings, tags,
                                                    autoAdjust, None)
                if result["result"]:
                    timer.addTimerToDB(serien_name, wlid, fsid,
                                       staffel, episode, title,
                                       str(start_unixtime_eit), timer_stbRef,
                                       webChannel, eit, addToDatabase)
                    activatedTimer += 1
                    TimerOK = True
                else:
                    konflikt = result["message"]

                if not TimerOK and useAlternativeChannel:
                    # try to get eventID (eit) from epgCache
                    if len(epgSeriesName) == 0 or epgSeriesName == serien_name:
                        epgSeriesName = ""

                    if database.getUpdateFromEPG(
                            fsid, config.plugins.serienRec.eventid.value):
                        alt_eit, alt_start_unixtime_eit, alt_end_unixtime_eit = STBHelpers.getStartEndTimeFromEPG(
                            start_unixtime, end_unixtime, margin_before,
                            serien_name, epgSeriesName, timer_altstbRef)
                    else:
                        alt_eit = 0
                        alt_start_unixtime_eit = start_unixtime
                        alt_end_unixtime_eit = end_unixtime

                    alt_start_unixtime_eit = int(alt_start_unixtime_eit) - (
                        int(margin_before) * 60)
                    alt_end_unixtime_eit = int(alt_end_unixtime_eit) + (
                        int(margin_after) * 60)

                    # versuche timer anzulegen
                    result = serienRecBoxTimer.addTimer(
                        timer_altstbRef, str(alt_start_unixtime_eit),
                        str(alt_end_unixtime_eit), timer_name,
                        timer_description, alt_eit, False, dirname,
                        vpsSettings, tags, autoAdjust, None)
                    if result["result"]:
                        konflikt = None
                        timer.addTimerToDB(serien_name, wlid, fsid, staffel,
                                           episode, title,
                                           str(alt_start_unixtime_eit),
                                           timer_altstbRef, webChannel,
                                           alt_eit, addToDatabase)
                        activatedTimer += 1
                        TimerOK = True
                    else:
                        konflikt = result["message"]

                if (not TimerOK) and konflikt:
                    SRLogger.writeLog(
                        "' %s ' - ACHTUNG! → %s" % (label_serie, konflikt),
                        True)
                    dbMessage = result["message"].replace(
                        "In Konflikt stehende Timer vorhanden!", "").strip()

                    result = serienRecBoxTimer.addTimer(
                        timer_stbRef, str(start_unixtime_eit),
                        str(end_unixtime_eit), timer_name, timer_description,
                        eit, True, dirname, vpsSettings, tags, autoAdjust,
                        None)
                    if result["result"]:
                        timer.addTimerToDB(serien_name, wlid, fsid, staffel,
                                           episode, title,
                                           str(start_unixtime_eit),
                                           timer_stbRef, webChannel, eit,
                                           addToDatabase, False)
                        deactivatedTimer += 1
                        TimerOK = True
                        database.addTimerConflict(dbMessage,
                                                  start_unixtime_eit,
                                                  webChannel)

            return TimerOK, activatedTimer, deactivatedTimer

    @staticmethod
    def prepareTimer(database, filterMode, wlid, fsid, sendetermine):

        activatedTimer = 0
        deactivatedTimer = 0

        lt = time.localtime()
        uhrzeit = time.strftime("%d.%m.%Y - %H:%M:%S", lt)
        print(
            "---------' Manuelle Timererstellung aus Sendeterminen um %s '---------"
            % uhrzeit)
        SRLogger.writeLog(
            "\n---------' Manuelle Timererstellung aus Sendeterminen um %s '---------"
            % uhrzeit, True)
        for serien_name, sender, start_unixtime, end_unixtime, staffel, episode, title, status, addedType in sendetermine:
            if int(status) == 1:
                # initialize strings
                seasonEpisodeString = "S%sE%s" % (str(staffel).zfill(2),
                                                  str(episode).zfill(2))
                label_serie = "%s - %s - %s" % (serien_name,
                                                seasonEpisodeString, title)

                # setze die vorlauf/nachlauf-zeit
                (margin_before, margin_after) = database.getMargins(
                    fsid, sender, config.plugins.serienRec.margin_before.value,
                    config.plugins.serienRec.margin_after.value)
                start_unixtime = int(start_unixtime) - (int(margin_before) *
                                                        60)
                end_unixtime = int(end_unixtime) + (int(margin_after) * 60)

                # get VPS settings for channel
                vpsSettings = database.getVPS(fsid, sender)

                # get tags from marker
                tags = database.getTags(wlid)

                # get addToDatabase for marker
                addToDatabase = database.getAddToDatabase(wlid)

                # get autoAdjust for marker
                autoAdjust = database.getAutoAdjust(wlid, sender)

                # get alternative epg series name
                epgSeriesName = database.getMarkerEPGName(fsid)

                (dirname, dirname_serie) = getDirname(database, serien_name,
                                                      fsid, staffel)

                (NoOfRecords, preferredChannel,
                 useAlternativeChannel) = database.getPreferredMarkerChannels(
                     wlid,
                     config.plugins.serienRec.useAlternativeChannel.value,
                     config.plugins.serienRec.NoOfRecords.value)

                params = (serien_name, sender, start_unixtime, margin_before,
                          margin_after, end_unixtime, label_serie, staffel,
                          episode, title, dirname, preferredChannel,
                          bool(useAlternativeChannel), vpsSettings, tags,
                          addToDatabase, autoAdjust, epgSeriesName)

                timerExists = False
                if config.plugins.serienRec.selectBouquets.value and config.plugins.serienRec.preferMainBouquet.value:
                    (primary_bouquet_active, secondary_bouquet_active
                     ) = database.isBouquetActive(sender)
                    if str(episode).isdigit():
                        if int(episode) == 0:
                            (count_manually, count_primary_bouquet,
                             count_secondary_bouquet
                             ) = database.getNumberOfTimersByBouquet(
                                 fsid, str(staffel), str(episode), title)
                        else:
                            (count_manually, count_primary_bouquet,
                             count_secondary_bouquet
                             ) = database.getNumberOfTimersByBouquet(
                                 fsid, str(staffel), str(episode))
                    else:
                        (count_manually, count_primary_bouquet,
                         count_secondary_bouquet
                         ) = database.getNumberOfTimersByBouquet(
                             fsid, str(staffel), str(episode))
                    if count_manually >= NoOfRecords or (
                            count_primary_bouquet >= NoOfRecords or
                        (secondary_bouquet_active
                         and count_secondary_bouquet >= NoOfRecords) or
                        (primary_bouquet_active
                         and count_primary_bouquet >= NoOfRecords)):
                        timerExists = True
                else:
                    # überprüft anhand des Seriennamen, Season, Episode ob die serie bereits auf der HDD existiert
                    if str(episode).isdigit():
                        if int(episode) == 0:
                            bereits_vorhanden = database.getNumberOfTimers(
                                fsid,
                                str(staffel),
                                str(episode),
                                title,
                                searchOnlyActiveTimers=True)
                            bereits_vorhanden_HDD = STBHelpers.countEpisodeOnHDD(
                                dirname, seasonEpisodeString, serien_name,
                                False, title)
                        else:
                            bereits_vorhanden = database.getNumberOfTimers(
                                fsid,
                                str(staffel),
                                str(episode),
                                searchOnlyActiveTimers=True)
                            bereits_vorhanden_HDD = STBHelpers.countEpisodeOnHDD(
                                dirname, seasonEpisodeString, serien_name,
                                False)
                    else:
                        bereits_vorhanden = database.getNumberOfTimers(
                            fsid,
                            str(staffel),
                            str(episode),
                            searchOnlyActiveTimers=True)
                        bereits_vorhanden_HDD = STBHelpers.countEpisodeOnHDD(
                            dirname, seasonEpisodeString, serien_name, False)

                    if (bereits_vorhanden >= NoOfRecords) or (
                            bereits_vorhanden_HDD >= NoOfRecords):
                        timerExists = True

                if not timerExists:
                    (TimerDone, onTimer,
                     offTimer) = serienRecSendeTermine.createTimer(
                         database, filterMode, wlid, fsid, params)
                else:
                    SRLogger.writeLog(
                        "' %s ' → Staffel/Episode bereits vorhanden ' %s '" %
                        (serien_name, seasonEpisodeString))
                    (TimerDone, onTimer,
                     offTimer) = serienRecSendeTermine.createTimer(
                         database, filterMode, wlid, fsid, params,
                         config.plugins.serienRec.forceManualRecording.value)

                activatedTimer += onTimer
                deactivatedTimer += offTimer
                if TimerDone:
                    # erstellt das serien verzeichnis und kopiert das Cover in das Verzeichnis
                    STBHelpers.createDirectory(fsid, 0, dirname, dirname_serie)

        SRLogger.writeLog(
            "Es wurde(n) %s Timer erstellt." % str(activatedTimer), True)
        print("[SerienRecorder] Es wurde(n) %s Timer erstellt." %
              str(activatedTimer))
        if deactivatedTimer > 0:
            SRLogger.writeLog(
                "%s Timer wurde(n) wegen Konflikten deaktiviert erstellt!" %
                str(deactivatedTimer), True)
            print(
                "[SerienRecorder] %s Timer wurde(n) wegen Konflikten deaktiviert erstellt!"
                % str(deactivatedTimer))
        SRLogger.writeLog(
            "---------' Manuelle Timererstellung aus Sendeterminen beendet '---------",
            True)
        print(
            "---------' Manuelle Timererstellung aus Sendeterminen beendet '---------"
        )

        return activatedTimer, deactivatedTimer

    def isSeasonAllowed(self, season, episode, markerSeasons, fromEpisode):
        if not markerSeasons and not fromEpisode:
            return True

        allowed = False
        if -2 in markerSeasons:  # 'Manuell'
            allowed = False
        elif (-1 in markerSeasons) and (0 in markerSeasons):  # 'Alle'
            allowed = True
        elif str(season).isdigit():
            if int(season) == 0:
                if str(episode).isdigit():
                    if int(episode) < int(fromEpisode):
                        allowed = False
                    else:
                        allowed = True
            elif int(season) in markerSeasons:
                allowed = True
            elif -1 in markerSeasons:  # 'folgende'
                if int(season) >= max(markerSeasons):
                    allowed = True
        elif self.database.getSpecialsAllowed(self.seriesWLID):
            allowed = True

        return allowed

    def keyOK(self):
        if self.loading or self['menu_list'].getCurrent() is None:
            return

        sindex = self['menu_list'].getSelectedIndex()
        if len(self.sendetermine_list) != 0:
            if int(self.sendetermine_list[sindex][7]) == 0:
                self.sendetermine_list[sindex][7] = "1"
            else:
                self.sendetermine_list[sindex][7] = "0"
            self.chooseMenuList.setList(
                list(map(self.buildList_termine, self.sendetermine_list)))

    def keyLeft(self):
        self['menu_list'].pageUp()

    def keyRight(self):
        self['menu_list'].pageDown()

    def keyDown(self):
        self['menu_list'].down()

    def keyUp(self):
        self['menu_list'].up()

    def keyRed(self):
        self.close(self.changesMade)

    def keyGreen(self):
        self.changesMade = self.getTimes()
        if self.changesMade:
            self.searchEvents()

    def keyYellow(self):
        self.sendetermine_list = []
        self.loading = True
        self.chooseMenuList.setList(
            list(map(self.buildList_termine, self.sendetermine_list)))

        if self.filterMode == 0:
            self.filterMode = 1
            self['text_yellow'].setText("Filter umschalten")
            self.title_txt = "aktive Sender"
        elif self.filterMode == 1:
            self.filterMode = 2
            self['text_yellow'].setText("Filter ausschalten")
            self.title_txt = "Marker Sender"
        else:
            self.filterMode = 0
            self['text_yellow'].setText("Filter einschalten")
            self.title_txt = "alle"

        print("[SerienRecorder] suche ' %s '" % self.seriesName)
        self['title'].setText("Suche ' %s '" % self.seriesName)
        print(self.seriesWLID)

        if self.filterMode == 0:
            webChannels = []
        elif self.filterMode == 1:
            webChannels = self.database.getActiveChannels()
        else:
            webChannels = self.database.getMarkerChannels(self.seriesWLID)

        try:
            transmissions = SeriesServer().doGetTransmissions(
                self.seriesWLID, 0, webChannels)
        except:
            transmissions = None
        self.resultsEvents(transmissions)

    def keyBlue(self):
        from .SerienRecorderTimerListScreen import serienRecTimerListScreen
        self.session.openWithCallback(self.searchEvents,
                                      serienRecTimerListScreen)

    def __onClose(self):
        if self.displayTimer:
            self.displayTimer.stop()
            self.displayTimer = None

    def keyCancel(self):
        self.close(self.changesMade)
Ejemplo n.º 37
0
class PiconManagerScreen(Screen, HelpableScreen):
	skin = """
	<screen name="PiconManager" title="PiconManager" position="center,center" size="1160,650">
		<widget name="piconpath" position="20,10" size="690,60" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="piconpath2" position="200,10" size="500,60" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="piconspace" position="20,40" size="690,60" font="Regular;20" foregroundColor="#00fff000" transparent="1" zPosition="1" halign="left" />
		<widget name="piconcount" position="20,70" size="690,60" font="Regular;20" foregroundColor="#00fff000" transparent="1" zPosition="1" halign="left" />
		<widget name="picondownload" position="20,100" size="690,60" font="Regular;20" foregroundColor="#00fff000" transparent="1" zPosition="1" halign="left" />
		<widget name="piconerror" position="20,130" size="690,60" font="Regular;20" foregroundColor="#00fff000" transparent="1" zPosition="1" halign="left" />
		<widget name="piconslidername" position="20,160" size="690,60" font="Regular;20" foregroundColor="#00fff000" transparent="1" zPosition="1" halign="left" />
		<widget name="selectedname" position="20,190" size="160,40" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="selected" position="180,190" size="200,40" noWrap="1" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="creatorname" position="20,220" size="160,40" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="creator" position="180,220" size="200,40" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="sizename" position="390,190" size="160,40" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="size" position="580,190" size="160,40" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="bitname" position="390,220" size="160,40" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="bit" position="580,220" size="160,40" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="spiconname" position="20,250" size="690,40" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="spicon" position="180,250" size="690,40" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="altername" position="390,250" size="690,40" font="Regular;20" foregroundColor="#00fba207" transparent="1" zPosition="1" halign="left" />
		<widget name="alter" position="580,250" size="690,40" font="Regular;20" foregroundColor="#00f8f2e6" transparent="1" zPosition="1" halign="left" />
		<widget name="piconslider" position="280,164" size="180,20" zPosition="2" transparent="0" />
		<widget name="picon" position="738,10" size="400,240" zPosition="4" transparent="1" borderWidth="0" borderColor="#0000000" alphatest="blend" />
		<widget name="list" position="10,300" size="1130,295" zPosition="1" foregroundColor="#00ffffff" foregroundColorSelected="#00fff000" scrollbarMode="showOnDemand" transparent="1" />
		<widget name="key_red" position="42,615" size="300,25" transparent="1" font="Regular;20"/>
		<widget name="key_green" position="285,615" size="300,25" transparent="1" font="Regular;20"/>
		<widget name="key_yellow" position="451,615" size="300,25" transparent="1" font="Regular;20"/>
		<widget name="key_blue" position="734,615" size="300,25" transparent="1" font="Regular;20"/>
		<ePixmap position="10,615" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_red.png" transparent="1" alphatest="on"/>
		<ePixmap position="257,615" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_green.png" transparent="1" alphatest="on"/>
		<ePixmap position="421,615" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_yellow.png" transparent="1" alphatest="on"/>
		<ePixmap position="701,615" size="263,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_blue.png" transparent="1" alphatest="on"/>
		<ePixmap position="916,610" size="260,35" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_info.png" transparent="1" alphatest="on"/>
		<ePixmap position="977,610" size="260,35" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_menu.png" transparent="1" alphatest="on"/>
		<ePixmap position="1038,610" size="260,35" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_channel.png" transparent="1" alphatest="on"/>
		<ePixmap position="1095,610" size="260,35" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PiconManager/pic/button_help.png" transparent="1" alphatest="on"/>
	</screen>"""

	def __init__(self, session):
		self.session = session
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.server_url = config.plugins.piconmanager.server.value
		self.piconname = config.plugins.piconmanager.piconname.value
		self.picondir = config.plugins.piconmanager.savetopath.value
		self.alter = config.plugins.piconmanager.alter.value
		self.piconfolder = "%s%s/" % (self.picondir, self.piconname)
		self.picon_name = ""
		self.piconlist = []
		self.tried_mirrors = []
		self.art_list = []
		self.prev_sel = None
		self.spicon_name = ""
		self.aktdl_pico = None
		self['piconpath'] = Label(_("Picon folder: "))
		self['piconpath2'] = Label(self.piconfolder)
		self['piconspace'] = Label(_(" "))
		self['piconcount'] = Label(_("Reading Channels..."))
		self['picondownload'] = Label(_("Picons loaded: "))
		self['piconerror'] = Label(_("Picons not found: "))
		self['piconslidername'] = Label(_("Download progress: "))
		self['selectedname'] = Label(_("Show group: "))
		self['selected'] = Label()
		self['creatorname'] = Label(_("Creator: "))
		self['creator'] = Label()
		self['sizename'] = Label(_("Size: "))
		self['size'] = Label()
		self['bitname'] = Label(_("Color depth: "))
		self['bit'] = Label()
		self['altername'] = Label(_("Not older than X days: "))
		self['alter'] = Label(str(self.alter))
		self['spiconname'] = Label(_("Standard picon: "))
		self['spicon'] = Label()
		self.chlist = buildChannellist()
		self.getFreeSpace()
		self.countchlist = len(self.chlist)
		self.activityslider = Slider(0, self.countchlist)
		self["piconslider"] = self.activityslider
		self['key_red'] = Label(_("Select drive"))
		self['key_green'] = Label(_("Download picons"))
		self['key_yellow'] = Label(_("Select path"))
		self['key_blue'] = Label(_("Create folder"))
		self['picon'] = Pixmap()
		self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
		{
			"ok": (self.keyOK, _("Show random Picon")),
			"cancel": (self.keyCancel, _("Exit")),
		}, -2)

		self["SetupActions"] = HelpableActionMap(self, "SetupActions",
			{
				"1": (self.sel_creator_back, _("Previous picon creator")),
				"3": (self.sel_creator_next, _("Next picon creator")),
				"4": (self.sel_size_back, _("Previous picon size")),
				"6": (self.sel_size_next, _("Next picon size")),
				"7": (self.sel_bit_back, _("Previous color depth")),
				"9": (self.sel_bit_next, _("Next color depth")),
			}
		)
		self["EPGSelectActions"] = HelpableActionMap(self, "EPGSelectActions",
		{
			"menu": (self.settings, _("More selections")),
			"nextService": (self.sel_satpos_next, _("Next Group")),
			"prevServive": (self.sel_satpos_back, _("Previous Group")),
			"info": (self.set_picon, _("Set / clear standard Picon")),
			"red": (self.changeDrive, _("Select drive")),
			"timerAdd": (self.downloadPicons, _("Download picons")),
			"yellow": (self.keyYellow, _("Select path")),
			"blue": (self.changePiconName, _("Create folder")),
			}, -2)
		self.channelMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		font, size = skin.parameters.get("PiconManagerListFont", ('Regular', 22))
		self.channelMenuList.l.setFont(0, gFont(font, size))
		self.channelMenuList.l.setItemHeight(25)
		self.setTitle(pname + " " * 3 + _("V") + " %s" % pversion)
		self['list'] = self.channelMenuList
		self['list'].onSelectionChanged.append(self.showPic)
		self.keyLocked = True
		self.piconTempDir = picon_tmp_dir
		if not os.path.exists(self.piconTempDir):
			os.mkdir(self.piconTempDir)
		self.onLayoutFinish.append(self.getPiconList)

	def settings(self):
		if self.piconlist and self.art_list:
			self.session.openWithCallback(self.makeList, pm_conf)

	def set_picon(self):
		if config.plugins.piconmanager.spicon.value == "":
			self.session.openWithCallback(self.got_picon, SimpleChannelSelection, _("Select service for preferred picon"))
		else:
			self.got_picon()

	def got_picon(self, service=""):
		service_name = ""
		if isinstance(service, eServiceReference):
			service_name = ServiceReference(service).getServiceName()
			service2 = service.toString()
			service = service.toString().replace(':', '_').rstrip('_') + ".png"
		if service == "":
			config.plugins.piconmanager.spicon.value = service
		else:
			for channel in self.chlist:
				if channel[0] == service2:
					service_name = channel[1]
					break
			config.plugins.piconmanager.spicon.value = service + "|" + service_name
		config.plugins.piconmanager.spicon.save()
		self['spicon'].setText(service_name)
		try:
			shutil.rmtree(self.piconTempDir)
			os.mkdir(self.piconTempDir)
		except OSError:
			pass
		self.getPiconList()

	def sel_creator_next(self):
		self.change_filter_mode(+1, 0)

	def sel_creator_back(self):
		self.change_filter_mode(-1, 0)

	def sel_bit_next(self):
		self.change_filter_mode(+1, 1)

	def sel_bit_back(self):
		self.change_filter_mode(-1, 1)

	def sel_size_next(self):
		self.change_filter_mode(+1, 2)

	def sel_size_back(self):
		self.change_filter_mode(-1, 2)

	def sel_satpos_next(self):
		self.change_filter_mode(+1, 3)

	def sel_satpos_back(self):
		self.change_filter_mode(-1, 3)

	def change_filter_mode(self, direction, filter_type):
		if filter_type == 0:
			if config.plugins.piconmanager.creator.value in self.creator_list:
				idx = self.creator_list.index(config.plugins.piconmanager.creator.value) + direction
			else:
				idx = 0
			if idx < 0:
				idx = len(self.creator_list) - 1
			elif idx > len(self.creator_list) - 1:
				idx = 0
			if len(self.creator_list):
				config.plugins.piconmanager.creator.value = self.creator_list[idx]
				self['creator'].setText(_(str(config.plugins.piconmanager.creator.value)))
				config.plugins.piconmanager.creator.save()
		elif filter_type == 1:
			if config.plugins.piconmanager.bit.value in self.bit_list:
				idx = self.bit_list.index(config.plugins.piconmanager.bit.value) + direction
			else:
				idx = 0
			if idx < 0:
				idx = len(self.bit_list) - 1
			elif idx > len(self.bit_list) - 1:
				idx = 0
			if len(self.bit_list):
				config.plugins.piconmanager.bit.value = self.bit_list[idx]
				self['bit'].setText(_(str(config.plugins.piconmanager.bit.value)))
				config.plugins.piconmanager.bit.save()
		elif filter_type == 2:
			if config.plugins.piconmanager.size.value in self.size_list:
				idx = self.size_list.index(config.plugins.piconmanager.size.value) + direction
			else:
				idx = 0
			if idx < 0:
				idx = len(self.size_list) - 1
			elif idx > len(self.size_list) - 1:
				idx = 0
			if len(self.size_list):
				config.plugins.piconmanager.size.value = self.size_list[idx]
				self['size'].setText(_(str(config.plugins.piconmanager.size.value)))
				config.plugins.piconmanager.size.save()
		elif filter_type == 3:
			if config.plugins.piconmanager.selected.value in self.art_list:
				idx = self.art_list.index(config.plugins.piconmanager.selected.value) + direction
			else:
				idx = 0
			if idx < 0:
				idx = len(self.art_list) - 1
			elif idx > len(self.art_list) - 1:
				idx = 0
			if len(self.art_list):
				config.plugins.piconmanager.selected.value = self.art_list[idx]
				self['selected'].setText(str(config.plugins.piconmanager.selected.value).replace("+", " ").replace("-", " "))
				config.plugins.piconmanager.selected.save()
		alter = config.plugins.piconmanager.alter.value
		self.makeList(config.plugins.piconmanager.creator.value, config.plugins.piconmanager.size.value, config.plugins.piconmanager.bit.value, config.plugins.piconmanager.server.value, True, False, alter)

	def getFreeSpace(self):
		if os.path.isdir(self.picondir):
			which = "MB"
			free = 0
			statvfs = os.statvfs(self.picondir)
			free = (statvfs.f_frsize * statvfs.f_bfree) / 1024 / 1024
			if free > 1024:
				free = int(free / 1024.)
				which = "GB"
			self['piconspace'].setText(_("FreeSpace:") + " %s %s" % (str(free), which))
		else:
			self['piconspace'].setText(_("FreeSpace: Drive Not Found !"))

	def showPic(self):
		self["picon"].hide()
		if len(self.piconlist) and self['list'].getCurrent() and len(self['list'].getCurrent()[0]) >= 3:
			self.auswahl = self['list'].getCurrent()[0][2]
			picon_name = os.path.basename(self.auswahl)
			if config.plugins.piconmanager.spicon.value != "":
				if not "by name" in self['list'].getCurrent()[0][0].lower():
					picon_sname = txt = config.plugins.piconmanager.spicon.value.split('|')[0]
				else:
					picon_sname = txt = config.plugins.piconmanager.spicon.value.split('|')[1].replace(" ", "%20") + ".png"
				self.auswahl = self.auswahl.replace(picon_name, picon_sname)
			self.downloadPiconPath = os.path.join(self.piconTempDir, self['list'].getCurrent()[0][4] + ".png")
			if not os.path.exists(self.downloadPiconPath):
				try: # ignore codings like '\xc3\x90'
					downloadPage(six.ensure_binary(self.auswahl), self.downloadPiconPath).addCallback(self.showPiconFile, self.downloadPiconPath).addErrback(self.dataError)
				except ValueError:
					pass
			else:
				self.showPiconFile(None, self.downloadPiconPath)

	def getPiconList(self):
		print("[PiconManager] started ...")
		self['piconcount'].setText(_("Channels:") + " %s" % str(self.countchlist))
		self['selected'].setText(_(str(config.plugins.piconmanager.selected.value).replace("_", ", ").replace("+", " ").replace("-", " ")))
		if config.plugins.piconmanager.spicon.value != "":
			txt = config.plugins.piconmanager.spicon.value.split('|')
			if len(txt) == 2:
				txt = txt[1]
			else:
				txt = txt[0]
		else:
			txt = ""
		self['spicon'].setText(txt)
		url = self.server_url + picon_info_file
		url = six.ensure_binary(url)
		print("[PiconManager] Server: %s" % self.server_url)
		if config.plugins.piconmanager.selected.value == _("All"):
			config.plugins.piconmanager.selected.setValue("All")
			config.plugins.piconmanager.selected.save()
		self.channelMenuList.setList(list(map(ListEntry, [(_("Loading, please wait..."),)])))
		getPage(url, method=b'GET').addCallback(self.parsePiconList).addErrback(self.dataError2)

	def parsePiconList(self, data):
		print("[PiconManager] parsing ...")
		self.size_list = ["All"]
		self.bit_list = ["All"]
		self.creator_list = ["All"]
		self.piconlist = []
		self.art_list = ["All"]
		data = six.ensure_str(data).replace("\xc2\x86", "").replace("\xc2\x87", "")
		picon_data = data.split("\n")
		if picon_data:
			for picon_info in picon_data:
				if len(picon_info) and not picon_info.startswith('<meta'):
					info_list = picon_info.split(';')
					if len(info_list) >= 9:
						dirUrl = os.path.join(self.server_url, info_list[0]).replace(" ", "%20")
						picUrl = os.path.join(self.server_url, info_list[0], info_list[1]).replace(" ", "%20")
						cur_dir = info_list[0]
						p_date = info_list[2]
						p_name = info_list[3]
						p_pos = info_list[4]
						p_creator = info_list[5]
						p_bit = (info_list[6].replace(' ', '').lower()).replace('bit', ' bit')
						p_size = info_list[7].replace(' ', '').lower()
						p_uploader = info_list[8]
						if p_size not in self.size_list:
							self.size_list.append(p_size)
						if p_bit not in self.bit_list:
							self.bit_list.append(p_bit)
						if p_creator not in self.creator_list:
							self.creator_list.append(p_creator)
						if p_pos not in self.art_list:
							self.art_list.append(p_pos)
						p_identifier = str(uuid.uuid4())
						p_name = "%s | %s - %s | %s | %s | %s | %s" % (p_pos, p_creator, p_name, p_size, p_bit, p_date, p_uploader)
						self.piconlist.append((p_name, dirUrl, picUrl, (p_creator, p_size, p_bit, p_pos), p_identifier, cur_dir))
			if config.plugins.piconmanager.selected.value not in self.art_list:
				config.plugins.piconmanager.selected.setValue("All")
				self['selected'].setText(_("All"))
			if not len(self.piconlist):
				self.dataError2(None)
			else:
				self.size_list.sort()
				self.bit_list.sort()
				self.creator_list.sort()
				self.art_list.sort()
				self.piconlist.sort(key=lambda x: x[0].lower())
				self.keyLocked = False
				prev_value = None
				if hasattr(config.plugins.piconmanager, "bit"):
					prev_value = config.plugins.piconmanager.bit.value
				config.plugins.piconmanager.bit = ConfigSelection(default="All", choices=self.createChoiceList(self.bit_list, [("All", _("All"))]))
				if prev_value:
					config.plugins.piconmanager.bit.value = prev_value
				prev_value = None
				if hasattr(config.plugins.piconmanager, "size"):
					prev_value = config.plugins.piconmanager.size.value
				config.plugins.piconmanager.size = ConfigSelection(default="All", choices=self.createChoiceList(self.size_list, [("All", _("All"))]))
				if prev_value:
					config.plugins.piconmanager.size.value = prev_value
				prev_value = None
				if hasattr(config.plugins.piconmanager, "creator"):
					prev_value = config.plugins.piconmanager.creator.value
				config.plugins.piconmanager.creator = ConfigSelection(default="All", choices=self.createChoiceList(self.creator_list, [("All", _("All"))]))
				if prev_value:
					config.plugins.piconmanager.creator.value = prev_value
				self['creator'].setText(_(str(config.plugins.piconmanager.creator.value)))
				self['size'].setText(_(str(config.plugins.piconmanager.size.value)))
				self['bit'].setText(_(str(config.plugins.piconmanager.bit.value)))
				alter = config.plugins.piconmanager.alter.value
				self.makeList(config.plugins.piconmanager.creator.value, config.plugins.piconmanager.size.value, config.plugins.piconmanager.bit.value, self.server_url, True, False, alter)

	def createChoiceList(self, choicelist, default_choice):
		ret = default_choice
		if len(choicelist):
			for x in choicelist:
				ret.append((x, _("%s") % x))
		return ret

	def makeList(self, creator="All", size="All", bit="All", server=config.plugins.piconmanager.server.value, update=True, reload_picons=False, alter=0):
		if reload_picons:
			self.server_url = server
			self.channelMenuList.setList([])
			self.getPiconList()
		else:
			if update:
				new_list = []
				self['alter'].setText(str(alter))
				art = config.plugins.piconmanager.selected.value
				for x in self.piconlist:
					if alter:
						present = datetime.date.today()
						pdatestr = str(x[0]).split(" | ")[4]
						pdatestr = pdatestr.split(".")
						pdate = datetime.date(int(pdatestr[2]), int(pdatestr[1]), int(pdatestr[0]))
						diff = present - pdate
						if int(diff.days) > alter:
							continue
					if (art != "All" and x[3][3] != art) or (creator != "All" and x[3][0] != creator) or (size != "All" and x[3][1] != size) or (bit != "All" and x[3][2] != bit):
						continue
					else:
						new_list.append((x[0], x[1], x[2], x[3], x[4], x[5]))
				if len(new_list):
					self.channelMenuList.setList(list(map(ListEntry, new_list)))
				else:
					self.channelMenuList.setList(list(map(ListEntry, [(_("No search results, please change filter options ..."),)])))

	def keyOK(self):
		if len(self.piconlist) > 0 and not self.keyLocked:
			if self['list'].getCurrent() is not None:
				if len(self['list'].getCurrent()[0]) >= 6:
					self.auswahl = self['list'].getCurrent()[0][4]
					self.cur_selected_dir = self['list'].getCurrent()[0][5]
					self.picon_list_file = self.piconTempDir + self.auswahl + "_list"
					if os.path.exists(self.picon_list_file):
						self.getPiconFiles()
					else:
						url = self.server_url + self.cur_selected_dir + "/" + picon_list_file
						url = six.ensure_binary(url)
						downloadPage(url, self.picon_list_file).addCallback(self.getPiconFiles).addErrback(self.dataError)

	def getPiconFiles(self, data=None):
		if os.path.exists(self.picon_list_file):
			if self.prev_sel != self.picon_list_file:
				self.prev_sel = self.picon_list_file
				with open(self.picon_list_file) as f:
					self.picon_files = f.readlines()
			self.picon_name = random.choice(self.picon_files)
			downloadPiconUrl = self.server_url + self.cur_selected_dir + "/" + self.picon_name
			downloadPiconUrl = downloadPiconUrl.replace(" ", "%20")
			self.downloadPiconPath = self.piconTempDir + self.auswahl
			self.keyLocked = False
			downloadPiconUrl = six.ensure_binary(downloadPiconUrl)
			downloadPage(downloadPiconUrl, self.downloadPiconPath).addCallback(self.showPiconFile, self.downloadPiconPath).addErrback(self.dataError)

	def keyCancel(self):
		config.plugins.piconmanager.savetopath.value = self.picondir
		config.plugins.piconmanager.savetopath.save()
		config.plugins.piconmanager.piconname.value = self.piconname
		config.plugins.piconmanager.piconname.save()
		self.channelMenuList.setList([])
		try:
			shutil.rmtree(self.piconTempDir)
		except OSError:
			pass
		self.close()

	def keyYellow(self):
		self.session.openWithCallback(self.selectedMediaFile, PiconManagerFolderScreen, self.picondir)

	def selectedMediaFile(self, res):
		if res is not None:
			self.piconfolder = res
			self.piconname = res.split("/")[-2]
			self['piconpath2'].setText(self.piconfolder)

	def changeDrive(self):
		if re.search("/usr/share/enigma2/", self.piconfolder, re.S | re.I):
			self.picondir = "/media/usb/"
		elif re.search("/media/usb/", self.piconfolder, re.S | re.I):
			self.picondir = "/media/hdd/"
		elif re.search("/media/hdd/", self.piconfolder, re.S | re.I):
			self.picondir = "/usr/share/enigma2/"
		self.piconfolder = "%s%s/" % (self.picondir, self.piconname)
		self['piconpath2'].setText(self.piconfolder)
		print("[PiconManager] set picon path to: %s" % self.piconfolder)
		self.getFreeSpace()

	def changePiconName(self):
		self.session.openWithCallback(self.gotNewPiconName, VirtualKeyBoard, title=(_("Enter Picon Dir:")), text=self.piconname)

	def gotNewPiconName(self, name):
		if name is not None:
			self.piconname = name
			self.piconfolder = "%s%s/" % (self.picondir, self.piconname)
			self['piconpath2'].setText(self.piconfolder)
			print("[PiconManager] set picon path to: %s" % self.piconfolder)

	def downloadPicons(self):
		no_drive = False
		if self['list'].getCurrent():
			if not os.path.isdir(self.picondir):
				txt = "%s\n" % self.picondir + _("is not installed.")
				self.session.open(MessageBox, txt, MessageBox.TYPE_INFO, timeout=3)
				no_drive = True

		if not no_drive:
			if not os.path.isdir(self.piconfolder):
				print("[PiconManager] create folder %s" % self.piconfolder)
				os.makedirs(self.piconfolder)
			self['piconpath2'].setText(self.piconfolder)
			urls = []
			if int(self.countchlist) > 0 and not self.keyLocked and self['list'].getCurrent():
				if len(self['list'].getCurrent()[0]) >= 2:
					f = open("/tmp/picon_dl_err", "w")
					f.write(self['list'].getCurrent()[0][0] + "\n" + "#" * 50 + "\n")
					f.close()
					self['piconpath2'].setText(_("loading"))
					self.auswahl = self['list'].getCurrent()[0][1] + "/"
					for channel in self.chlist:
						downloadPiconUrl = None
						if "by name" in self['list'].getCurrent()[0][0].lower():
							downloadPiconUrl = quote(channel[1] + ".png")
							downloadPiconPath = self.piconfolder + channel[1] + ".png"
						else:
							downloadPiconUrl = channel[0]
							downloadPiconUrl = str(downloadPiconUrl).split("http")[0]
							downloadPiconUrl = str(downloadPiconUrl).split("rtmp")[0]
							downloadPiconUrl = downloadPiconUrl.replace(':', '_')
							downloadPiconUrl = downloadPiconUrl[:-1] + ".png"
							downloadPiconPath = self.piconfolder + downloadPiconUrl#.replace("%20"," ")
						if downloadPiconUrl:
							downloadPiconUrl = self.auswahl + downloadPiconUrl
							urls.append((downloadPiconUrl, downloadPiconPath))

			if len(urls) > 0:
				self.countload = 0
				self.counterrors = 0
				ds = defer.DeferredSemaphore(tokens=10)
				downloads = [ds.run(self.download, downloadPiconUrl, downloadPiconPath).addCallback(self.downloadDone).addErrback(self.downloadError) for downloadPiconUrl, downloadPiconPath in urls]
				finished = defer.DeferredList(downloads).addErrback(self.dataError)

	def download(self, downloadPiconUrl, downloadPiconPath):
		downloadPiconUrl = six.ensure_binary(downloadPiconUrl)
		self.aktdl_pico = os.path.splitext(os.path.basename(downloadPiconPath))[0]
		return downloadPage(downloadPiconUrl, downloadPiconPath)

	def downloadError(self, error):
		if self.aktdl_pico:
			if not "by name" in self['list'].getCurrent()[0][0].lower():
				for channel in self.chlist:
					if channel[0] == self.aktdl_pico.replace('_', ':') + ":":
						self.aktdl_pico = self.aktdl_pico + " = " + channel[1] + " / " + channel[0]
						notfoundWrite(self.aktdl_pico)
		self.counterrors += 1
		self['piconerror'].setText(_("Not found Picons:") + " %s" % str(self.counterrors))
		total = self.countload + self.counterrors
		self["piconslider"].setValue(total)
		if self.countchlist == total:
			self.checkDouble(5)

	def downloadDone(self, data):
		self.countload += 1
		self['picondownload'].setText(_("Loaded Picons:") + " %s" % str(self.countload))
		total = self.countload + self.counterrors
		self["piconslider"].setValue(total)
		if self.countchlist == total:
			self.checkDouble(5)
			self.getFreeSpace()

	def checkDouble(self, num=0):
		if num == 5:
			try:
				os.remove("/tmp/piconmanager_err")
			except:
				pass
			lena = 1
			self['piconpath2'].setText(_("Clean up the directory"))
			for channel in self.chlist:
				downloadPiconUrl = channel[0]
				downloadPiconUrl = str(downloadPiconUrl).split("http")[0]
				downloadPiconUrl = str(downloadPiconUrl).split("rtmp")[0]
				downloadPiconUrl = downloadPiconUrl.replace(':', '_')
				downloadPiconUrl = self.piconfolder + downloadPiconUrl[:-1] + ".png"
				d2 = self.piconfolder + channel[1] + ".png"
				try:
					if os.path.exists(downloadPiconUrl) and os.path.exists(d2):
						if "by name" in self['list'].getCurrent()[0][0].lower():
							os.remove(downloadPiconUrl)
						else:
							os.remove(d2)

				except:
					pass
				if lena < len(self.chlist):
					lena += 1
				else:
					self['piconpath2'].setText(_("Download finished !"))

	def dataError2(self, error=None):
		if hasattr(self, "server_url"):
			errorWrite(str(self.server_url) + "\n")
			self.tried_mirrors.append(self.server_url)
			all_mirrors = True
			for x in server_choices:
				if x[0] not in self.tried_mirrors:
					self.server_url = x[0]
					all_mirrors = False
					break
			if all_mirrors:
				self.channelMenuList.setList(list(map(ListEntry, [(_("Sorry, service is temporarily unavailable"),)])))
			else:
				self.getPiconList()

	def dataError(self, error):
		print("[PiconManager] ERROR" % str(error))
		try:
			if "500 Internal Server Error" in error:
				self.session.open(MessageBox, _("Server temporarily unavailable"), MessageBox.TYPE_ERROR, timeout=10)
		except TypeError:
			pass
		errorWrite(str(len(self.auswahl)) + " - " + str(self.auswahl) + "\n" + str(error) + "\n")
		self["picon"].hide()

	def showPiconFile(self, data, picPath):
		if os.path.exists(picPath):
			self["picon"].show()
			if picPath is not None:
				self["picon"].instance.setPixmapFromFile(picPath)
class serienRecSearchResultScreen(serienRecBaseScreen, Screen, HelpableScreen):
	def __init__(self, session, serien_name):
		serienRecBaseScreen.__init__(self, session)
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)

		self.displayTimer = None
		self.displayMode = 2
		self.session = session
		self.picload = ePicLoad()
		self.serien_name = serien_name
		self.serienlist = []
		self.skin = None
		self.displayTimer_conn = None

		self["actions"] = HelpableActionMap(self, "SerienRecorderActions", {
			"ok": (self.keyOK, "Marker für ausgewählte Serie hinzufügen"),
			"cancel": (self.keyCancel, "zurück zur vorherigen Ansicht"),
			"left": (self.keyLeft, "zur vorherigen Seite blättern"),
			"right": (self.keyRight, "zur nächsten Seite blättern"),
			"up": (self.keyUp, "eine Zeile nach oben"),
			"down": (self.keyDown, "eine Zeile nach unten"),
			"red": (self.keyRed, "zurück zur vorherigen Ansicht"),
			"blue": (self.keyBlue, "Serie manuell suchen"),
			"menu": (self.recSetup, "Menü für globale Einstellungen öffnen"),
			"startTeletext": (self.wunschliste, "Informationen zur ausgewählten Serie auf Wunschliste anzeigen"),
			"0"	: (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
			"3"		: (self.showProposalDB, "Liste der Serien/Staffel-Starts anzeigen"),
			"4"		: (self.serieInfo, "Informationen zur ausgewählten Serie anzeigen"),
			"6"		: (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
			"7"		: (self.showWishlist, "Merkzettel (vorgemerkte Folgen) anzeigen"),
		}, -1)
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["SerienRecorderActions" ,], {
			"displayHelp"      : self.showHelp,
			"displayHelp_long" : self.showManual,
		}, 0)

		self.setupSkin()

		self.loading = True

		self.onLayoutFinish.append(self.searchSerie)
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.setSkinProperties)

	def callHelpAction(self, *args):
		HelpableScreen.callHelpAction(self, *args)

	def setSkinProperties(self):
		super(self.__class__, self).setSkinProperties()

		self['text_red'].setText("Abbrechen")
		self['text_ok'].setText("Marker hinzufügen")
		self['text_blue'].setText("Suche wiederholen")

		super(self.__class__, self).startDisplayTimer()

	def setupSkin(self):
		self.skin = None
		InitSkin(self)

		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList.l.setItemHeight(int(25 *skinFactor))
		self['menu_list'] = self.chooseMenuList
		self['menu_list'].show()

		if config.plugins.serienRec.showCover.value:
			self['cover'].show()

		if not config.plugins.serienRec.showAllButtons.value:
			self['bt_red'].show()
			self['bt_ok'].show()
			self['bt_blue'].show()
			self['bt_exit'].show()
			self['bt_text'].show()
			self['bt_info'].show()
			self['bt_menu'].show()

			self['text_red'].show()
			self['text_ok'].show()
			self['text_blue'].show()
			self['text_0'].show()
			self['text_1'].show()
			self['text_2'].show()
			self['text_3'].show()
			self['text_4'].show()

	def updateMenuKeys(self):
		updateMenuKeys(self)

	def serieInfo(self):
		if self.loading:
			return

		check = self['menu_list'].getCurrent()
		if check is None:
			return

		serien_id = self['menu_list'].getCurrent()[0][2]
		serien_name = self['menu_list'].getCurrent()[0][0]
		from SerienRecorderSeriesInfoScreen import serienRecShowInfo
		self.session.open(serienRecShowInfo, serien_name, serien_id)

	def setupClose(self, result):
		super(self.__class__, self).setupClose(result)
		if result[1]:
			self.searchSerie()

	def searchSerie(self, start = 0):
		print "[SerienRecorder] suche ' %s '" % self.serien_name
		self['title'].setText("Suche nach ' %s '" % self.serien_name)
		self['title'].instance.setForegroundColor(parseColor("foreground"))
		if start == 0:
			self.serienlist = []

		searchResults = downloadSearchResults(self.serien_name, start)
		searchResults.start()
		searchResults.join()

		self.results(searchResults.getData())

	def results(self, serienlist):
		(startOffset, moreResults, searchResults) = serienlist
		self.serienlist.extend(searchResults)
		self['title'].setText("Die Suche für ' %s ' ergab %s Teffer." % (self.serien_name, str(len(self.serienlist))))
		self['title'].instance.setForegroundColor(parseColor("foreground"))

		# deep copy list
		resultList = self.serienlist[:]

		if moreResults > 0:
			resultList.append(("", "", ""))
			resultList.append(("=> Weitere Ergebnisse laden?", str(moreResults), "-1"))
		self.chooseMenuList.setList(map(self.buildList, resultList))
		self['menu_list'].moveToIndex(startOffset)
		self.loading = False
		self.getCover()

	@staticmethod
	def buildList(entry):
		(name_Serie, year_Serie, id_Serie) = entry

		# weitere Ergebnisse Eintrag
		if id_Serie == "-1":
			year_Serie = ""

		# name_Serie = doReplaces(name_Serie)

		return [entry,
		        (eListboxPythonMultiContent.TYPE_TEXT, 40, 0, 500 * skinFactor, 25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, name_Serie),
		        (eListboxPythonMultiContent.TYPE_TEXT, 600 * skinFactor, 0, 350 * skinFactor, 25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, year_Serie)
		        ]

	def keyOK(self):
		if self.loading:
			return

		check = self['menu_list'].getCurrent()
		if check is None:
			print "[SerienRecorder] keine infos gefunden"
			return

		Serie = self['menu_list'].getCurrent()[0][0]
		Year = self['menu_list'].getCurrent()[0][1]
		Id = self['menu_list'].getCurrent()[0][2]
		print Serie, Year, Id

		if Id == "":
			return

		if Id == "-1":
			self.chooseMenuList.setList([])
			self.searchSerie(int(Year))
			return

		self.serien_name = ""
		database = SRDatabase(SerienRecorder.serienRecDataBaseFilePath)
		if config.plugins.serienRec.activateNewOnThisSTBOnly.value:
			boxID = None
		else:
			boxID = config.plugins.serienRec.BoxID.value

		if database.addMarker(str(Id), Serie, Year, boxID, 0):
			from SerienRecorderLogWriter import SRLogger
			SRLogger.writeLog("\nSerien Marker für ' %s ' wurde angelegt" % Serie, True)
			self['title'].setText("Serie '- %s -' zum Serien Marker hinzugefügt." % Serie)
			self['title'].instance.setForegroundColor(parseColor("green"))
			if config.plugins.serienRec.openMarkerScreen.value:
				self.close(Serie)
		else:
			self['title'].setText("Serie '- %s -' existiert bereits im Serien Marker." % Serie)
			self['title'].instance.setForegroundColor(parseColor("red"))

	def keyRed(self):
		self.close()

	def keyBlue(self):
		self.session.openWithCallback(self.wSearch, NTIVirtualKeyBoard, title = "Serien Titel eingeben:", text = self.serien_name)

	def wSearch(self, serien_name):
		if serien_name:
			print serien_name
			self.chooseMenuList.setList([])
			self['title'].setText("")
			self['title'].instance.setForegroundColor(parseColor("foreground"))
			self.serien_name = serien_name
			self.serienlist = []
			self.searchSerie()

	def keyLeft(self):
		self['menu_list'].pageUp()
		self.getCover()

	def keyRight(self):
		self['menu_list'].pageDown()
		self.getCover()

	def keyDown(self):
		self['menu_list'].down()
		self.getCover()

	def keyUp(self):
		self['menu_list'].up()
		self.getCover()

	def wunschliste(self):
		serien_id = self['menu_list'].getCurrent()[0][2]
		super(self.__class__, self).wunschliste(serien_id)

	def getCover(self):
		if self.loading:
			return

		check = self['menu_list'].getCurrent()
		if check is None:
			return

		serien_name = self['menu_list'].getCurrent()[0][0]
		serien_id = self['menu_list'].getCurrent()[0][2]
		SerienRecorder.getCover(self, serien_name, serien_id)

	def __onClose(self):
		self.stopDisplayTimer()

	def keyCancel(self):
		self['title'].instance.setForegroundColor(parseColor("foreground"))
		self.close()
Ejemplo n.º 39
0
class StreamTVList(Screen):
    skin = """
		<screen name="StreamTVList" position="center,center" size="600,350" title="StreamTV List">
			<widget name="streamlist" position="0,0" size="600,350" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
	        </screen>
		"""

    def __init__(self, session):
        self.session = session
        Screen.__init__(self, session)
        self["actions"] = ActionMap(
            [
                "OkCancelActions", "ShortcutActions", "WizardActions",
                "ColorActions", "SetupActions", "NumberActions", "MenuActions"
            ], {
                "ok": self.keyOK,
                "cancel": self.keyCancel,
                "up": self.keyUp,
                "down": self.keyDown,
                "left": self.keyLeft,
                "right": self.keyRight,
            }, -1)

        self.streamBin = resolveFilename(SCOPE_PLUGINS,
                                         "Extensions/StreamTV/rtmpdump")
        self.streamFile = resolveFilename(SCOPE_PLUGINS,
                                          "Extensions/StreamTV/stream.xml")

        self.streamList = []
        self.makeStreamList()

        self.streamMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.streamMenuList.l.setFont(0, gFont('Regular', 22))
        self.streamMenuList.l.setFont(1, gFont('Regular', 18))
        self.streamMenuList.l.setItemHeight(37)
        self['streamlist'] = self.streamMenuList
        self.streamMenuList.setList(map(streamListEntry, self.streamList))

        self.onLayoutFinish.append(self.layoutFinished)

        self.rtmpConsole = None
        self.beforeService = None
        self.currentService = None
        self.playerStoped = False
        self.serviceDoCommand = None

        self.keyLocked = False

    def layoutFinished(self):
        rc = os.popen('ps -ef | grep rtmpdump | grep -v grep').read()
        print "a process already running :", rc
        if rc is not None:
            if rc.strip() != '':
                os.system('killall -INT rtmpdump')

    def keyLeft(self):
        if self.keyLocked:
            return
        self['streamlist'].pageUp()

    def keyRight(self):
        if self.keyLocked:
            return
        self['streamlist'].pageDown()

    def keyUp(self):
        if self.keyLocked:
            return
        self['streamlist'].up()

    def keyDown(self):
        if self.keyLocked:
            return
        self['streamlist'].down()

    def keyCancel(self):
        self.cbAppClosed(True)
        self.close()

    def keyOK(self):
        if self.keyLocked:
            return
        self.keyLocked = True
        self.rtmpConsole = None
        self.beforeService = None
        self.currentService = None
        self.playerStoped = False
        self.serviceDoCommand = None

        streamInfo = self["streamlist"].getCurrent()[0][1]
        uriInfo = streamInfo.get('uri')
        typeInfo = streamInfo.get('type').split(':')

        protocol = typeInfo[0]
        url = uriInfo.get('URL')
        if protocol == 'rtmp':
            self.layoutFinished()
            self.rtmpConsole = eConsoleAppContainer()
            self.rtmpConsole.dataAvail.append(self.cbDataAvail)
            self.rtmpConsole.appClosed.append(self.cbAppClosed)
            self.rtmpConsole.execute(self.makeCommand(uriInfo))
        elif protocol in ('rtsp', 'http', 'hls'):
            serviceType = typeInfo[1]
            bufferSize = typeInfo[2]
            self.doStreamAction(url, serviceType, bufferSize)

    def doStreamAction(self, url=None, serviceType='4097', bufferSize=None):
        if url is None:
            url = '/tmp/stream.avi'
            self.streamPlayerTimer.stop()
            #if os.path.exists(url):
            #	os.unlink(url)
        try:
            serviceType = int(serviceType)
        except:
            serviceType = 4097
        try:
            bufferSize = int(bufferSize)
        except:
            bufferSize = None

        service = eServiceReference(serviceType, 0, url)
        #if bufferSize is not None:
        #	service.setData(2, bufferSize*1024)

        streamInfo = self["streamlist"].getCurrent()[0][1]
        uriInfo = streamInfo.get('uri')
        self.beforeService = self.session.nav.getCurrentlyPlayingServiceReference(
        )
        self.currentService = self.session.openWithCallback(
            self.cbFinishedStream,
            StreamTVPlayer,
            service,
            cbServiceCommand=self.cbServiceCommand,
            chName=str(streamInfo.get('name')),
            chURL=str(uriInfo.get('URL')),
            chIcon=str(streamInfo.get('icon')))

    def cbServiceCommand(self, params=None):
        if params is None:
            self.playerStoped = True
            return
        if params[0] == 'docommand':
            self.serviceDoCommand = params[1]

    def cbAppClosed(self, ret):
        print ret
        self.doConsoleStop()
        if self.currentService is not None and not self.playerStoped:
            self.serviceDoCommand('bypass_exit')
            message = "The connection was terminated from the stream server."
            self.session.open(MessageBox, message, type=MessageBox.TYPE_INFO)
            self.currentService.close()
            self.currentService = None
            self.serviceDoCommand = None

    def cbDataAvail(self, data):
        print data
        if str(data) == 'Connected...':
            self.streamPlayerTimer = eTimer()
            self.streamPlayerTimer.timeout.get().append(self.doStreamAction)
            self.streamPlayerTimer.start(1000)

    def cbFinishedStream(self):
        self.doConsoleStop()
        self.session.nav.playService(self.beforeService)
        print 'player done!!'

    def doConsoleStop(self):
        self.keyLocked = False
        if self.rtmpConsole is not None:
            self.rtmpConsole.sendCtrlC()
            self.rtmpConsole = None

    def makeCommand(self, uriInfo):
        def appendCommand(key, option):
            try:
                d = uriInfo.get(key)
                if d is not None:
                    return "-%s %s " % (option, d)
            except:
                pass
            return ''

        command = '%s -v ' % (self.streamBin)
        command += appendCommand('URL', 'r')
        command += appendCommand('PLAYPATH', 'y')
        command += appendCommand('SWFURL', 'W')
        return command

    def makeStreamList(self):
        streamDB = StreamURIParser(self.streamFile).parseStreamList()
        self.streamList = []
        for x in streamDB:
            self.streamList.append((x.get('name'), x))
class serienRecWishlistScreen(serienRecBaseScreen, Screen, HelpableScreen):
    def __init__(self, session):
        serienRecBaseScreen.__init__(self, session)
        Screen.__init__(self, session)
        HelpableScreen.__init__(self)
        self.session = session
        self.picload = ePicLoad()
        self.database = SRDatabase(SerienRecorder.serienRecDataBaseFilePath)
        self.chooseMenuList_popup = MenuList(
            [], enableWrapAround=True, content=eListboxPythonMultiContent)

        self["actions"] = HelpableActionMap(
            self, "SerienRecorderActions", {
                "ok": (self.keyOK,
                       "für die ausgewählte Serien neue Einträge hinzufügen"),
                "cancel": (self.keyCancel, "zurück zur vorherigen Ansicht"),
                "left": (self.keyLeft, "zur vorherigen Seite blättern"),
                "right": (self.keyRight, "zur nächsten Seite blättern"),
                "up": (self.keyUp, "eine Zeile nach oben"),
                "down": (self.keyDown, "eine Zeile nach unten"),
                "red": (self.keyRed, "ausgewählten Eintrag löschen"),
                "green":
                (self.keyGreen,
                 "alle Änderungen speichern und zurück zur vorherigen Ansicht"
                 ),
                "yellow": (self.keyYellow, "umschalten Sortierung ein/aus"),
                "blue": (self.keyBlue,
                         "alle Einträge aus der Liste endgültig löschen"),
                "menu":
                (self.recSetup, "Menü für globale Einstellungen öffnen"),
                "0":
                (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
                "3": (self.showProposalDB,
                      "Liste der Serien/Staffel-Starts anzeigen"),
                "4": (self.serieInfo,
                      "Informationen zur ausgewählten Serie anzeigen"),
                "6":
                (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
            }, -1)
        self.helpList[0][2].sort()

        self["helpActions"] = ActionMap([
            "SerienRecorderActions",
        ], {
            "displayHelp": self.showHelp,
            "displayHelp_long": self.showManual,
        }, 0)

        self.setupSkin()

        self.delAdded = False
        self.wishlist = []
        self.wishlist_tmp = []
        self.dbData = []
        self.modus = "menu_list"
        self.aSerie = ""
        self.aSerieFSID = None
        self.aStaffel = 0
        self.aFromEpisode = 0
        self.aToEpisode = 0

        self.onLayoutFinish.append(self.readWishlist)
        self.onClose.append(self.__onClose)
        self.onLayoutFinish.append(self.setSkinProperties)

    def callHelpAction(self, *args):
        HelpableScreen.callHelpAction(self, *args)

    def setSkinProperties(self):
        super(self.__class__, self).setSkinProperties()

        self['text_red'].setText("Eintrag löschen")
        self['text_green'].setText("Speichern")
        self['text_ok'].setText("Eintrag anlegen")
        if config.plugins.serienRec.wishListSorted.value:
            self['text_yellow'].setText("unsortierte Liste")
        else:
            self['text_yellow'].setText("Sortieren")
        self['text_blue'].setText("Liste leeren")
        self.num_bt_text[2][1] = buttonText_na

        super(self.__class__, self).startDisplayTimer()

    def setupSkin(self):
        self.skin = None
        InitSkin(self)

        # normal
        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.chooseMenuList.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList.l.setItemHeight(int(25 * skinFactor))
        self['menu_list'] = self.chooseMenuList
        self['menu_list'].show()

        # popup
        self.chooseMenuList_popup = MenuList(
            [], enableWrapAround=True, content=eListboxPythonMultiContent)
        self.chooseMenuList_popup.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList_popup.l.setItemHeight(int(25 * skinFactor))
        self['popup_list'] = self.chooseMenuList_popup
        self['popup_list'].hide()

        self['title'].setText("Diese Episoden sind zur Aufnahme vorgemerkt")

        if config.plugins.serienRec.showCover.value:
            self['cover'].show()

        if not config.plugins.serienRec.showAllButtons.value:
            self['bt_red'].show()
            self['bt_green'].show()
            self['bt_ok'].show()
            self['bt_yellow'].show()
            self['bt_blue'].show()
            self['bt_exit'].show()
            #self['bt_text'].show()
            self['bt_info'].show()
            self['bt_menu'].show()

            self['text_red'].show()
            self['text_green'].show()
            self['text_ok'].show()
            self['text_yellow'].show()
            self['text_blue'].show()
            self['text_0'].show()
            self['text_1'].show()
            self['text_2'].show()
            self['text_3'].show()
            self['text_4'].show()

    def updateMenuKeys(self):
        updateMenuKeys(self)

    def getCurrentSelection(self):
        if self.modus == "menu_list":
            if self['menu_list'].getCurrent() is None:
                return None, None, None
            serien_name = self['menu_list'].getCurrent()[0][1]
            serien_wlid = self['menu_list'].getCurrent()[0][4]
            serien_fsid = self['menu_list'].getCurrent()[0][5]
        else:
            if self['popup_list'].getCurrent() is None:
                return None, None, None
            serien_name = self['popup_list'].getCurrent()[0][0]
            serien_wlid = self['popup_list'].getCurrent()[0][1]
            serien_fsid = self['popup_list'].getCurrent()[0][3]

        return serien_name, serien_wlid, serien_fsid

    def serieInfo(self):
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        if serien_name and serien_wlid:
            from .SerienRecorderSeriesInfoScreen import serienRecShowInfo
            self.session.open(serienRecShowInfo, serien_name, serien_wlid,
                              serien_fsid)

    def wunschliste(self):
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        if serien_wlid:
            super(self.__class__, self).wunschliste(serien_wlid)

    def setupClose(self, result):
        super(self.__class__, self).setupClose(result)
        if result[1]:
            self.readWishlist()

    def readWishlist(self):
        self.wishlist = []
        bookmarks = self.database.getBookmarks()
        for bookmark in bookmarks:
            (Serie, Staffel, Episode, numberOfRecordings, fsID) = bookmark
            row = "%s S%sE%s" % (Serie, str(Staffel).zfill(2),
                                 str(Episode).zfill(2))
            wlID = self.database.getMarkerWLID(fsID)
            self.wishlist.append((row, Serie, Staffel, Episode, wlID, fsID))

        self.wishlist_tmp = self.wishlist[:]
        if config.plugins.serienRec.wishListSorted.value:
            self.wishlist_tmp.sort()
        self.chooseMenuList.setList(
            list(map(self.buildList, self.wishlist_tmp)))
        self.getCover()

    @staticmethod
    def buildList(entry):
        (row, serien_name, serien_season, serien_episode, serien_wlid,
         serien_fsid) = entry
        return [
            entry,
            (eListboxPythonMultiContent.TYPE_TEXT, 20, 00, 1280 * skinFactor,
             25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, row)
        ]

    @staticmethod
    def buildList_popup(entry):
        (serien_name, serien_wlid, serien_info, serien_fsid) = entry
        return [
            entry,
            (eListboxPythonMultiContent.TYPE_TEXT, 5, 0, 560 * skinFactor,
             25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER,
             serien_name),
            (eListboxPythonMultiContent.TYPE_TEXT, 600 * skinFactor, 0,
             350 * skinFactor, 25 * skinFactor, 0,
             RT_HALIGN_LEFT | RT_VALIGN_CENTER, serien_info)
        ]

    def answerStaffel(self, aStaffel):
        self.aStaffel = aStaffel
        if self.aStaffel is None or self.aStaffel == "":
            return
        self.session.openWithCallback(self.answerFromEpisode,
                                      NTIVirtualKeyBoard,
                                      title="von Episode:")

    def answerFromEpisode(self, aFromEpisode):
        self.aFromEpisode = aFromEpisode
        if self.aFromEpisode is None or self.aFromEpisode == "":
            return
        self.session.openWithCallback(self.answerToEpisode,
                                      NTIVirtualKeyBoard,
                                      title="bis Episode:")

    def answerToEpisode(self, aToEpisode):
        self.aToEpisode = aToEpisode
        print("[SerienRecorder] Staffel: %s" % self.aStaffel)
        print("[SerienRecorder] von Episode: %s" % self.aFromEpisode)
        print("[SerienRecorder] bis Episode: %s" % self.aToEpisode)

        if self.aToEpisode is None or self.aFromEpisode is None or self.aStaffel is None or self.aToEpisode == "":
            return
        else:
            if self.aStaffel.startswith('0') and len(self.aStaffel) > 1:
                self.aStaffel = self.aStaffel[1:]

            self.database.addBookmark(
                self.aSerie, self.aSerieFSID, self.aFromEpisode,
                self.aToEpisode, self.aStaffel,
                int(config.plugins.serienRec.NoOfRecords.value))
            self.readWishlist()

    def keyOK(self):
        if self.modus == "menu_list":
            self.modus = "popup_list"
            self['popup_list'].show()
            self['popup_bg'].show()
            self['menu_list'].hide()
            l = self.database.getMarkerNames()
            self.chooseMenuList_popup.setList(
                list(map(self.buildList_popup, l)))
            self['popup_list'].moveToIndex(0)
        else:
            self.modus = "menu_list"
            self['menu_list'].show()
            self['popup_list'].hide()
            self['popup_bg'].hide()

            if self['popup_list'].getCurrent() is None:
                print("[SerienRecorder] Marker-Liste leer.")
                return

            self.aSerie = self['popup_list'].getCurrent()[0][0]
            self.aSerieFSID = self['popup_list'].getCurrent()[0][3]
            self.aStaffel = 0
            self.aFromEpisode = 0
            self.aToEpisode = 0
            self.session.openWithCallback(self.answerStaffel,
                                          NTIVirtualKeyBoard,
                                          title="%s: Staffel eingeben:" %
                                          self.aSerie)

    def keyRed(self):
        if self['menu_list'].getCurrent() is None:
            print("[SerienRecorder] Merkzettel ist leer.")
            return

        zeile = self['menu_list'].getCurrent()[0]
        (title, serie, staffel, episode, wlID, fsID) = zeile
        self.dbData.append((fsID, str(staffel).lower(), episode.lower()))
        self.wishlist_tmp.remove(zeile)
        self.wishlist.remove(zeile)
        self.chooseMenuList.setList(
            list(map(self.buildList, self.wishlist_tmp)))
        self.delAdded = True

    def keyGreen(self):
        if self.delAdded:
            self.database.removeBookmarks(self.dbData)
        self.close()

    def keyYellow(self):
        if len(self.wishlist_tmp) != 0:
            if config.plugins.serienRec.wishListSorted.value:
                self.wishlist_tmp = self.wishlist[:]
                self['text_yellow'].setText("Sortieren")
                config.plugins.serienRec.wishListSorted.setValue(False)
            else:
                self.wishlist_tmp.sort()
                self['text_yellow'].setText("unsortierte Liste")
                config.plugins.serienRec.wishListSorted.setValue(True)
            config.plugins.serienRec.wishListSorted.save()
            SerienRecorder.configfile.save()

            self.chooseMenuList.setList(
                list(map(self.buildList, self.wishlist_tmp)))
            self.getCover()

    def keyBlue(self):
        if self['menu_list'].getCurrent() is None:
            print("[SerienRecorder] Merkzettel ist leer.")
            return

        if config.plugins.serienRec.confirmOnDelete.value:
            self.session.openWithCallback(
                self.callClearListMsg,
                MessageBox,
                "Soll die Liste wirklich geleert werden?",
                MessageBox.TYPE_YESNO,
                default=False)
        else:
            self.callClearListMsg(True)

    def callClearListMsg(self, answer):
        if answer:
            self.database.removeAllBookmarks()
            self.readWishlist()
        else:
            return

    def getCover(self):
        (serien_name, serien_wlid, serien_fsid) = self.getCurrentSelection()
        if serien_name and serien_wlid:
            SerienRecorder.getCover(self, serien_name, serien_wlid,
                                    serien_fsid)

    def keyLeft(self):
        self[self.modus].pageUp()
        self.getCover()

    def keyRight(self):
        self[self.modus].pageDown()
        self.getCover()

    def keyDown(self):
        self[self.modus].down()
        self.getCover()

    def keyUp(self):
        self[self.modus].up()
        self.getCover()

    def __onClose(self):
        self.stopDisplayTimer()

    def callDeleteMsg(self, answer):
        if answer:
            self.keyGreen()
        self.close()

    def keyCancel(self):
        if self.delAdded:
            self.session.openWithCallback(
                self.callDeleteMsg,
                MessageBox,
                "Sollen die Änderungen gespeichert werden?",
                MessageBox.TYPE_YESNO,
                default=True)
        else:
            self.close()
class ArchiverMenuScreen(Screen):
    skin = """
		<screen position="40,80" size="1200,600" title="" >
			<widget name="list_left_head" position="10,10" size="1180,60" font="Regular;20" foregroundColor="#00fff000"/>
			<widget name="list_left" position="10,85" size="570,470" scrollbarMode="showOnDemand"/>
			<widget name="unpacking" position="10,250" size="570,30" scrollbarMode="showOnDemand" foregroundColor="#00ffffff"/>
			<widget source="key_red" render="Label" position="100,570" size="260,25" transparent="1" font="Regular;20"/>
			<widget source="key_green" render="Label" position="395,570" size="260,25"  transparent="1" font="Regular;20"/>
			<widget source="key_yellow" render="Label" position="690,570" size="260,25" transparent="1" font="Regular;20"/>
			<widget source="key_blue" render="Label" position="985,570" size="260,25" transparent="1" font="Regular;20"/>
			<ePixmap position="70,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_red.png" transparent="1" alphatest="on"/>
			<ePixmap position="365,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_green.png" transparent="1" alphatest="on"/>
			<ePixmap position="660,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_yellow.png" transparent="1" alphatest="on"/>
			<ePixmap position="955,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_blue.png" transparent="1" alphatest="on"/>
		</screen>"""

    def __init__(self, session, sourcelist, targetlist):
        self.session = session

        self.pname = pname
        self.pdesc = pdesc
        self.pversion = pversion

        self.SOURCELIST = sourcelist
        self.TARGETLIST = targetlist
        Screen.__init__(self, session)
        self.filename = self.SOURCELIST.getFilename()
        self.sourceDir = self.SOURCELIST.getCurrentDirectory()
        self.targetDir = self.TARGETLIST.getCurrentDirectory() or '/tmp/'
        self.list = []

        self.commands = {}

        self.errlog = ""

        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        font = skin.fonts.get("FileList", ("Regular", 20, 25))
        self.chooseMenuList.l.setFont(0, gFont(font[0], font[1]))
        self.chooseMenuList.l.setItemHeight(font[2])
        self['list_left'] = self.chooseMenuList

        self.chooseMenuList2 = MenuList([],
                                        enableWrapAround=True,
                                        content=eListboxPythonMultiContent)
        self.chooseMenuList2.l.setFont(0, gFont(font[0], font[1]))
        self.chooseMenuList2.l.setItemHeight(font[2])
        self['unpacking'] = self.chooseMenuList2
        self['unpacking'].selectionEnabled(0)

        self["list_left_head"] = Label("%s%s" %
                                       (self.sourceDir, self.filename))

        self["key_red"] = StaticText(_("Cancel"))
        self["key_green"] = StaticText(_("OK"))
        self["key_yellow"] = StaticText("")
        self["key_blue"] = StaticText("")

        self["setupActions"] = ActionMap(["SetupActions"], {
            "cancel": self.cancel,
            "save": self.ok,
            "ok": self.ok,
        }, -2)

        self.onLayoutFinish.append(self.onLayout)

    def onLayout(self):
        self.setTitle(self.pname)
        self.chooseMenuList.setList(map(self.ListEntry, self.list))

    def ListEntry(self, entry):
        x, y, w, h = skin.parameters.get("FileListName", (10, 0, 1180, 25))
        x = 10
        w = self['list_left'].l.getItemSize().width()
        return [
            entry,
            MultiContentEntryText(pos=(x, y),
                                  size=(w - x, h),
                                  font=0,
                                  flags=RT_HALIGN_LEFT,
                                  text=entry[0])
        ]

    def UnpackListEntry(self, entry):
        # print("[ArchiverMenuScreen] UnpackListEntry", entry)
        currentProgress = int(float(100) / float(int(100)) * int(entry))
        progpercent = str(currentProgress) + "%"
        x, y, w, h = skin.parameters.get("FileListMultiName",
                                         (60, 0, 1180, 25))
        x2 = x
        x = 10
        w = self['list_left'].l.getItemSize().width()
        return [
            entry,
            MultiContentEntryProgress(pos=(x + x2, y + int(h / 3)),
                                      size=(w - (x + x2), int(h / 3)),
                                      percent=int(currentProgress),
                                      borderWidth=1),
            MultiContentEntryText(pos=(x, y),
                                  size=(x2, h),
                                  font=0,
                                  flags=RT_HALIGN_LEFT,
                                  text=str(progpercent))
        ]

    def ok(self):
        selectName = self['list_left'].getCurrent()[0][0]
        self.selectId = self['list_left'].getCurrent()[0][1]
        print("[ArchiverMenuScreen] Select:", selectName, self.selectId)
        self.unpackModus(self.selectId)

    def unpackModus(self, id):
        return

    # unpackPopen and unpackEConsoleApp run unpack and info
    # commands for the specific archive unpackers.

    def unpackPopen(self, cmd, infoScreen):

        # cmd is either a string or a list/tuple
        # containing the command name and arguments.
        # It it's a string, it's passed to the shell
        # for interpretation. If it's a tuple/list,
        # it's effectively run by execvp().
        # infoScreen is used by to display the output
        # of the command. It must have an API compatible
        # with ArchiverInfoScreen.

        print("[ArchiverMenuScreen] unpackPopen", cmd)
        try:
            shellcmd = type(cmd) not in (tuple, list)
            p = subprocess.Popen(cmd,
                                 shell=shellcmd,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE)
        except OSError as ex:
            cmdname = cmd.split()[0] if shellcmd else cmd[0]
            msg = _(
                "Can not run %s: %s.\n%s may be in a plugin that is not installed."
            ) % (cmdname, ex.strerror, cmdname)
            print("[ArchiverMenuScreen]", msg)
            self.session.open(MessageBox,
                              msg,
                              MessageBox.TYPE_ERROR,
                              simple=True)
            return
        output = map(str.splitlines, p.communicate())
        if output[0] and output[1]:
            output[1].append("----------")
        self.extractlist = [(l, ) for l in output[1] + output[0]]
        if not self.extractlist:
            self.extractlist = [(_("No files found."), )]
        self.session.open(infoScreen, self.extractlist, self.sourceDir,
                          self.filename)

    def unpackEConsoleApp(self, cmd, exePath=None, logCallback=None):

        # cmd is either a string or a list/tuple
        # containing the command name and arguments.
        # It it's a string, it's passed to the shell
        # for interpretation. If it's a tuple/list,
        # it's effectively run by execvp().
        # exePath is the optional full pathname of the
        # command, otherwise a search of $PATH is used
        # to find the command. Only used if cmd is a
        # list/tuple
        # logCallback is used to update the command
        # progress indicator using the command output
        # (see unrar.py)

        print("[ArchiverMenuScreen] unpackEConsoleApp", cmd)
        self.errlog = ""
        self.container = eConsoleAppContainer()
        self.container.appClosed.append(
            boundFunction(self.extractDone, self.filename))
        if logCallback is not None:
            self.container.stdoutAvail.append(self.log)
        self.container.stderrAvail.append(self.logerrs)
        self.ulist = []
        if type(cmd) in (tuple, list):
            exe = exePath or cmd[0]
            self.container.execute(exe, *cmd)
        else:
            self.container.execute(cmd)

    def extractDone(self, filename, data):
        print("[ArchiverMenuScreen] extractDone", data)
        if data:
            type = MessageBox.TYPE_ERROR
            timeout = 15
            message = _("%s - extraction errors.") % filename
            if data == -1:
                self.errlog = self.errlog.rstrip()
                self.errlog += "\nTerminated by a signal"
            if self.errlog:
                self.errlog = self.errlog.strip()
                message += "\n----------\n" + self.errlog
            self.errlog = ""
        else:
            type = MessageBox.TYPE_INFO
            timeout = 8
            message = _("%s successfully extracted.") % filename
        self.session.open(MessageBox,
                          message,
                          type,
                          timeout=timeout,
                          simple=True)

    def logerrs(self, data):
        self.errlog += data

    def cancel(self):
        self.close(False)
Ejemplo n.º 42
0
class GreekStreamTVList(Screen):
    skin = '\n \t\t<screen name="GreekStreamTVList" position="center,center" size="800,400" title="GreekStreamTV List (Livestreamer) v3.2">\n\t\t\t<widget name="streamlist" position="0,0" size="800,360" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />\n\t\t\t<widget name="info" position="0,365" zPosition="2" size="800,35" font="Regular;22" foregroundColor="#ffffff" transparent="1" halign="center" valign="center" />\n\t\t</screen>\n           '

    def __init__(self, session, streamFile=None):
        self.session = session
        Screen.__init__(self, session)
        self['info'] = Label('...')
        self['actions'] = ActionMap(
            [
                'OkCancelActions', 'ShortcutActions', 'WizardActions',
                'ColorActions', 'SetupActions', 'NumberActions', 'MenuActions'
            ], {
                'ok': self.keyOK,
                'cancel': self.keyCancel,
                'up': self.keyUp,
                'down': self.keyDown,
                'left': self.keyLeft,
                'right': self.keyRight
            }, -1)
        self.streamBin = '/usr/bin/rtmpdump'
        self.streamPipe = '/tmp/greekstreamtv.avi'
        if not streamFile:
            self.streamFile = resolveFilename(
                SCOPE_PLUGINS, 'Extensions/GreekStreamTV/stream.xml')
        else:
            self.streamFile = streamFile
        self.lvstreamer = Livestreamer()
        self.streamList = []
        self.makeStreamList()
        self.streamMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.streamMenuList.l.setFont(0, gFont('Regular', 22))
        self.streamMenuList.l.setFont(1, gFont('Regular', 18))
        self.streamMenuList.l.setItemHeight(37)
        self['streamlist'] = self.streamMenuList
        self.streamMenuList.setList(map(streamListEntry, self.streamList))
        self.onLayoutFinish.append(self.layoutFinished)
        self.beforeService = None
        self.currentService = None
        self.playerStoped = False
        self.keyLocked = False
        self.pd = None
        self.qsel = None
        return

    def layoutFinished(self):
        os.system('killall -9 rtmpdump')
        self.showName()

    def keyLeft(self):
        if self.keyLocked:
            return
        self['streamlist'].pageUp()
        self.showName()

    def keyRight(self):
        if self.keyLocked:
            return
        self['streamlist'].pageDown()
        self.showName()

    def keyUp(self):
        if self.keyLocked:
            return
        self['streamlist'].up()
        self.showName()

    def keyDown(self):
        if self.keyLocked:
            return
        self['streamlist'].down()
        self.showName()

    def keyCancel(self):
        self.LivestreamerStop()
        if '/usr/lib/enigma2/python/Plugins/Extensions/GreekStreamTV' in path:
            path.remove(
                '/usr/lib/enigma2/python/Plugins/Extensions/GreekStreamTV')
        self.close()

    def showName(self):
        try:
            tmpName = self['streamlist'].getCurrent()[0][1].get('name')
        except:
            tmpName = '...'

        self['info'].setText(tmpName)

    def keyOK(self):
        print '[GreekStreamTVList::keyOK]'
        if self.keyLocked:
            return
        uriName = self['streamlist'].getCurrent()[0][1].get('name')
        self['info'].setText('Starting %s Please Wait...' % uriName)
        self.timer = eTimer()
        self.timer.callback.append(self.StartStream)
        self.timer.start(100, 1)

    def StartStream(self):
        self.timer.stop()
        self.keyLocked = True
        self.beforeService = None
        self.currentService = None
        self.playerStoped = False
        self.pd = None
        streamInfo = self['streamlist'].getCurrent()[0][1]
        uriInfo = streamInfo.get('uri')
        typeInfo = streamInfo.get('type').split(':')
        protocol = typeInfo[0]
        serviceType = typeInfo[1]
        bufferSize = typeInfo[2]
        url = uriInfo.get('URL')
        if protocol == 'rtmp':
            url += ' '
            url += ' '.join([
                '%s=%s' % (key, value) for key, value in uriInfo.items()
                if key != 'URL'
            ])
            url = ' '.join(url.split())
            print '[GreekStreamTVList::keyOK] URL is ', url, ' URI is ', uriInfo
            self.doStreamAction(url, serviceType, bufferSize)
        elif protocol in ('rtsp', 'http'):
            self.doStreamAction(url, serviceType, bufferSize)
        elif protocol == 'livestreamer':
            channel = None
            streams = None
            try:
                url += ' '
                url += ' '.join([
                    '%s=%s' % (key, value) for key, value in uriInfo.items()
                    if key != 'URL'
                ])
                url = ' '.join(url.split())
                print '[GreekStreamTVList::keyOK] URL is ', url, ' URI is ', uriInfo
                channel = self.lvstreamer.resolve_url(url)
                streams = channel.get_streams()
                print '[GreekStreamTVList::keyOK] Streams: ', streams.keys()
                print '[GreekStreamTVList::keyOK] Streams: ', streams.items()
                if len(streams
                       ) == 3 and 'best' in streams and 'worst' in streams:
                    self.streamPreBuffer(streams['best'])
                elif len(streams) == 0:
                    raise Exception('No Streams Found')
                else:
                    self.qsel = self.session.openWithCallback(
                        self.QualitySelClosed, SelectQuality, streams,
                        self.streamPreBuffer)
            except Exception as err:
                print '[GreekStreamTVList::keyOK::Exception] Error: ', err
                tmpMessage = 'An Error Occured: ' + str(err)[:200] + '...'
                self.session.openWithCallback(self.stopPlayer,
                                              MessageBox,
                                              tmpMessage,
                                              type=MessageBox.TYPE_ERROR,
                                              timeout=20)

        else:
            print '[GreekStreamTVList::keyOK] Unknown Protocol: ', protocol
            tmpMessage = 'Unknown Protocol: ' + protocol
            self.session.openWithCallback(self.stopPlayer,
                                          MessageBox,
                                          tmpMessage,
                                          type=MessageBox.TYPE_WARNING,
                                          timeout=20)
        return

    def QualitySelClosed(self, recursive):
        if self.qsel:
            self.qsel.close()
        self.qsel = None
        self.stopPlayer()
        return

    def streamPreBuffer(self, stream):
        fd = None
        try:
            fd = stream.open()
            prebuffer = fd.read(1049088)
            if len(prebuffer) == 0:
                raise Exception('No Data Received From Stream Server')
            start_new_thread(self.streamCopy, (fd, prebuffer))
            sleep(1.5)
            self.doStreamAction(self.streamPipe)
        except Exception as err:
            if fd and hasattr(fd, 'close'):
                fd.close()
            print '[GreekStreamTVList::streamPreBuffer::Exception] Error: ', err
            tmpMessage = 'An Error Occured while buffering: ' + str(
                err)[:200] + '...'
            self.session.openWithCallback(self.stopPlayer,
                                          MessageBox,
                                          tmpMessage,
                                          type=MessageBox.TYPE_ERROR,
                                          timeout=20)

        return

    def streamCopy(self, fd, prebuffer):
        print '[GreekStreamTVList::streamCopy]'
        if os.access(self.streamPipe, os.F_OK):
            os.remove(self.streamPipe)
        os.mkfifo(self.streamPipe)
        self.pd = open(self.streamPipe, 'wb')
        try:
            self.pd.write(prebuffer)
            while self is not None and self.session is not None and not self.playerStoped:
                data = fd.read(8192)
                if len(data) == 0:
                    break
                self.pd.write(data)

            print '[GreekStreamTVList:streamCopy] playerStoped'
            self.pd.close()
            if hasattr(fd, 'close'):
                fd.close()
            fd = None
        except Exception as err:
            print '[GreekStreamTVList::streamCopy] Exception: ', err
        finally:
            self.playerStoped = True
            if fd and hasattr(fd, 'close'):
                fd.close()

        return

    def LivestreamerStop(self):
        print '[GreekStreamTVList::LivestreamStop]'
        self['info'].setText('...')
        self.keyLocked = False
        self.playerStoped = True
        os.system('killall -9 rtmpdump')
        sleep(0.5)
        if self.pd:
            try:
                self.pd.close()
            except:
                sleep(0.5)
                try:
                    self.pd.close()
                except:
                    pass

        if self.qsel is not None:
            self.qsel.close(False)
        self.pd = None
        self.qsel = None
        return

    def doStreamAction(self, url=None, serviceType=4097, bufferSize=None):
        if url is None:
            url = self.streamPipe
            self.streamPlayerTimer.stop()
        try:
            serviceType = int(serviceType)
        except:
            serviceType = 4097

        try:
            bufferSize = int(bufferSize)
        except:
            bufferSize = None

        service = eServiceReference(serviceType, 0, url)
        streamInfo = self['streamlist'].getCurrent()[0][1]
        service.setName(str(streamInfo.get('name')))
        uriInfo = streamInfo.get('uri')
        self.beforeService = self.session.nav.getCurrentlyPlayingServiceReference(
        )
        self.currentService = self.session.openWithCallback(
            self.onStreamFinished,
            GreekStreamTVPlayer,
            service,
            stopPlayer=self.stopPlayer,
            chName=str(streamInfo.get('name')),
            chURL=str(uriInfo.get('URL')),
            chIcon=str(streamInfo.get('icon')))
        return

    def stopPlayer(self, params=None):
        print '[GreekStreamTV::stopPlayer]'
        if params is None or isinstance(params, bool):
            self.playerStoped = True
            self.LivestreamerStop()
            return
        else:
            return

    def onStreamFinished(self):
        print '[GreekStreamTV::onStreamFinished]'
        self.LivestreamerStop()
        self.session.nav.playService(self.beforeService)
        print '[GreekStreamTV::onStreamFinished] player done!!'

    def makeStreamList(self):
        try:
            streamDB = StreamURIParser(self.streamFile).parseStreamList()
        except Exception as err:
            print '[GreekStreamTV::makeStreamList] Error: ', err
            streamDB = []

        self.streamList = [(x.get('name'), x) for x in streamDB]
Ejemplo n.º 43
0
class SkyChannelSelect(Screen):
	
	def __init__(self, session):
		self.session = session
		
		path = "%s/skins/%s/screen_channel_select.xml" % (getPluginPath(), config.plugins.skyrecorder.anytime_skin.value)
		with open(path, "r") as f:
			self.skin = f.read()
			f.close()
			
		Screen.__init__(self, session)
		
		pluginName = config.plugins.skyrecorder.pluginname.value
		contentSize = config.plugins.skyrecorder.contentsize.value
		
		self["actions"]  = ActionMap(["OkCancelActions", "ShortcutActions", "EPGSelectActions", "WizardActions", "ColorActions", "NumberActions", "MenuActions", "MoviePlayerActions"], {
			"ok"    : self.keyOK,
			"cancel": self.keyCancel,
			"green" : self.keyChange
		}, -1)
		
		self['title'] = Label(pluginName)
		self['head'] = Label("Channel Selection")
		
		self.channelliste = []
		self.streamMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.streamMenuList.l.setFont(0, gFont('Regular', contentSize))
		self.streamMenuList.l.setItemHeight(25)
		self['channelselect'] = self.streamMenuList
		
		self.sky_channel_path = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/sky_channels"
		self.sky_channel_path_tmp = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/sky_channels.tmp"
		
		self.last_index = 0
		
		self.onLayoutFinish.append(self.readChannels)
	
	
	def skyChannelSelectListEntry(self,entry):
		if entry[1] == "True":
			plus = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/plus.png"
			return [entry,
				(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 15, 5, 20, 18, LoadPixmap(plus)),
				(eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 550, 25, 0, RT_HALIGN_LEFT, str(entry[0]))
				]
		else:
			minus = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/minus.png"
			return [entry,
				(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 15, 5, 20, 18, LoadPixmap(minus)),
				(eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 550, 25, 0, RT_HALIGN_LEFT, str(entry[0]))
				]
			
	def readChannels(self):
		try:
			sql.cur.execute('SELECT SQLITE_VERSION()')
		except Exception:
			sys.exc_clear()
			try:
				sql.connect()
			except Exception:
				return
		
		self.channelliste = []
		for (channel,status) in sql.readChannel():
			self.channelliste.append((channel,status))
		print "[skyrecorder] reload channelSelectListe."
		self.channelliste.sort()
		self.streamMenuList.setList(map(self.skyChannelSelectListEntry, self.channelliste))
		if self.last_index < len(self.channelliste):
			self['channelselect'].moveToIndex(self.last_index)
			#self['channelselect'].selectionChanged()
		
	
	def keyChange(self):
		print "change"
		self.last_index = self['channelselect'].getSelectionIndex()
		self.session.openWithCallback(self.readChannels, SkyChannelEditor, self.last_index)
		
	def keyOK(self):
		exist = self['channelselect'].getCurrent()
		if exist == None:
			return

		channel_auswahl = self['channelselect'].getCurrent()[0][0]
		self.last_index = self['channelselect'].getSelectionIndex()
		print channel_auswahl
		sql.changeChannel(channel_auswahl)
		self.readChannels()
		
		
	def keyCancel(self):
		self.close()
Ejemplo n.º 44
0
class UnzipMenuScreen(Screen):
	skin = """
		<screen position="40,80" size="1200,600" title="" >
			<widget name="list_left_head" position="10,10" size="570,60" font="Regular;20" foregroundColor="#00fff000"/>
			<widget name="list_left" position="10,85" size="570,470" scrollbarMode="showOnDemand"/>
			<widget name="unpacking" position="10,250" size="570,30" scrollbarMode="showOnDemand" foregroundColor="#00ffffff"/>
			<widget name="key_red" position="100,570" size="260,25" transparent="1" font="Regular;20"/>
			<widget name="key_green" position="395,570" size="260,25"  transparent="1" font="Regular;20"/>
			<widget name="key_yellow" position="690,570" size="260,25" transparent="1" font="Regular;20"/>
			<widget name="key_blue" position="985,570" size="260,25" transparent="1" font="Regular;20"/>
			<ePixmap position="70,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_red.png" transparent="1" alphatest="on"/>
			<ePixmap position="365,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_green.png" transparent="1" alphatest="on"/>
			<ePixmap position="660,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_yellow.png" transparent="1" alphatest="on"/>
			<ePixmap position="955,570" size="260,25" zPosition="0" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/FileCommander/pic/button_blue.png" transparent="1" alphatest="on"/>
		</screen>"""

	def __init__(self, session, sourcelist, targetlist):
		self.session = session
		self.SOURCELIST = sourcelist
		self.TARGETLIST = targetlist
		Screen.__init__(self, session)
		self.filename = self.SOURCELIST.getFilename()
		self.sourceDir = self.SOURCELIST.getCurrentDirectory()
		self.targetDir = self.TARGETLIST.getCurrentDirectory()
		self.list = []
		self.list.append((_("Show content of zip File"), 1))
		self.list.append((_("Unpack to current folder"), 2))
		self.list.append((_("Unpack to %s") % (self.targetDir), 3))
		self.list.append((_("Unpack to /media/hdd/movie/"), 4))
		#self.list.append((_("Unpack with Password"), 5))

		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20))
		self.chooseMenuList.l.setItemHeight(25)
		self['list_left'] = self.chooseMenuList
		
		self.chooseMenuList2 = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList2.l.setFont(0, gFont('Regular', 25))
		self.chooseMenuList2.l.setItemHeight(30)
		self['unpacking'] = self.chooseMenuList2
		self['unpacking'].selectionEnabled(0)

		self["list_left_head"] = Label("%s%s" % (self.sourceDir, self.filename))

		self["key_red"] = Label(_("cancel"))
		self["key_green"] = Label(_("ok"))
		self["key_yellow"] = Label("")
		self["key_blue"] = Label("")

		self["setupActions"] = ActionMap(["SetupActions"],
		{
			"red": self.cancel,
			"green": self.ok,
			"cancel": self.cancel,
			"ok": self.ok,
		}, -2)

		self.onLayoutFinish.append(self.onLayout)

	def onLayout(self):
		self.setTitle(pname)
		self.chooseMenuList.setList(map(self.ListEntry, self.list))

	def ListEntry(self, entry):
		return [entry,
			(eListboxPythonMultiContent.TYPE_TEXT, 10, 0, 1180, 25, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, entry[0])
			]
			
	def UnpackListEntry(self, entry):
		print entry
		currentProgress = int(float(100) / float(int(100)) * int(entry))
		proanzeige = str(currentProgress)+"%"
#		color2 = 0x00ffffff #Weiss
		return [entry,
			(eListboxPythonMultiContent.TYPE_PROGRESS, 10, 0, 560, 30, int(currentProgress), None, None, None, None),
			(eListboxPythonMultiContent.TYPE_TEXT, 10, 3, 560, 30, 0, RT_HALIGN_CENTER | RT_VALIGN_CENTER, str(proanzeige))
			]

	def ok(self):
		selectName = self['list_left'].getCurrent()[0][0]
		self.selectId = self['list_left'].getCurrent()[0][1]
		print "Select:", selectName, self.selectId
		self.unpackModus(self.selectId)

	def unpackModus(self, id):
		if id == 1:
			cmd = "unzip -l %s%s" % (self.sourceDir, self.filename)
			print cmd
			p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
			output = p.stdout.readlines()
			if output:
				self.extractlist = []
				#self.extractlist.append(("<" +_("List of Storage Devices") + ">"))
				for line in output:
					#print line.split('\n')
					self.extractlist.append((line.split('\n')))
				
				if len(self.extractlist) != 0:
					self.session.open(UnpackInfoScreen, self.extractlist, self.sourceDir, self.filename)
				else:
					self.extractlist.append((_("no files found.")))
					self.session.open(UnpackInfoScreen, self.extractlist, self.sourceDir, self.filename)

		elif id == 2:
			self.container = eConsoleAppContainer()
			self.container.appClosed.append(boundFunction(self.extractDone, self.filename))
			#self.container.dataAvail.append(self.log)
			self.ulist = []
			cmd = "unzip %s%s -d %s" % (self.sourceDir, self.filename, self.sourceDir)
			self.container.execute(cmd)

		elif id == 3:
			self.container = eConsoleAppContainer()
			self.container.appClosed.append(boundFunction(self.extractDone, self.filename))
			#self.container.dataAvail.append(self.log)
			self.ulist = []
			cmd = "unzip %s%s -d %s" % (self.sourceDir, self.filename, self.targetDir)
			self.container.execute(cmd)

		elif id == 4:
			self.container = eConsoleAppContainer()
			self.container.appClosed.append(boundFunction(self.extractDone, self.filename))
			#self.container.dataAvail.append(self.log)
			self.ulist = []
			cmd = "unzip %s%s -d /media/hdd/movie/" % (self.sourceDir, self.filename)
			self.container.execute(cmd)

	def extractDone(self, filename, data):
		message = self.session.open(MessageBox, (_("%s successful extracted.") % filename), MessageBox.TYPE_INFO, timeout=8)

	def cancel(self):
		self.close(False)
Ejemplo n.º 45
0
class SkySkipWordsSelect(Screen):
	
	def __init__(self, session):
		self.session = session
		
		path = "%s/skins/%s/screen_skipwords.xml" % (getPluginPath(), config.plugins.skyrecorder.anytime_skin.value)
		with open(path, "r") as f:
			self.skin = f.read()
			f.close()
			
		Screen.__init__(self, session)
		
		pluginName = config.plugins.skyrecorder.pluginname.value
		contentSize = config.plugins.skyrecorder.contentsize.value

		self["actions"]  = ActionMap(["OkCancelActions", "ShortcutActions", "EPGSelectActions", "WizardActions", "ColorActions", "NumberActions", "MenuActions", "MoviePlayerActions"], {
			"ok"    : self.keyOK,
			"cancel": self.keyCancel,
			"green" : self.keyAdd,
			"red" : self.keyDel,
		}, -1)
		
		self['title'] = Label(pluginName)
		self['head'] = Label("Skiplist")
		
		self.skipwordliste = []
		self.streamMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.streamMenuList.l.setFont(0, gFont('Regular', contentSize))
		self.streamMenuList.l.setItemHeight(25)
		self['skipwordselect'] = self.streamMenuList
		
		self.sky_skipwords_path = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/sky_skipwords"
		self.sky_skipwords_path_tmp = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/sky_skipwords.tmp"
	
		self.onLayoutFinish.append(self.readSkipWords)
	
	
	def skySkipWordSelectListEntry(self,entry):
		if entry[1] == "True":
			plus = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/plus.png"
			return [entry,
				(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 15, 5, 20, 18, LoadPixmap(plus)),
				(eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 550, 25, 0, RT_HALIGN_LEFT, str(entry[0]))
				]
		else:
			minus = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/minus.png"
			return [entry,
				(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 15, 5, 20, 18, LoadPixmap(minus)),
				(eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 550, 25, 0, RT_HALIGN_LEFT, str(entry[0]))
				]
	
	def readSkipWords(self):
		try:
			sql.cur.execute('SELECT SQLITE_VERSION()')
		except Exception:
			sys.exc_clear()
			try:
				sql.connect()
			except Exception:
				return
		
		self.skipwordliste = []
		for (skipword,status) in sql.readSkipSelect():
			self.skipwordliste.append((skipword,status))
		print "[skyrecorder] reload skips."
		self.skipwordliste.sort()
		self.streamMenuList.setList(map(self.skySkipWordSelectListEntry, self.skipwordliste))
	
	
	def keyOK(self):
		exist = self['skipwordselect'].getCurrent()
		if exist == None:
			return
		skipword_auswahl = self['skipwordselect'].getCurrent()[0][0]
		print skipword_auswahl
		sql.changeSkip(skipword_auswahl)
		self.readSkipWords()
		
		#exist = self['skipwordselect'].getCurrent()
		#if exist == None:
		#	return

	def keyAdd(self):
		print "add"
		self.session.openWithCallback(self.addSkipWord, VirtualKeyBoard, title = ("Skip word eintragen:"))

	def addSkipWord(self, word = None):
		if word != None or word == "":
			sql.addSkip(word)
			print "[skyrecorder] add skip: %s" % word
		self.readSkipWords()
	
	def keyDel(self):
		exist = self['skipwordselect'].getCurrent()
		if exist == None:
			return
		skipword_auswahl = self['skipwordselect'].getCurrent()[0][0]
		sql.delSkip(skipword_auswahl)
		print "[skyrecorder] del skip: %s" % skipword_auswahl
		self.readSkipWords()
		
		#print "del"
		#exist = self['skipwordselect'].getCurrent()
		#if exist == None:
		#	return
			
	def keyCancel(self):
		self.close()
Ejemplo n.º 46
0
class SkySkipWordsSelect(Screen):
    def __init__(self, session):
        self.session = session

        path = "%s/skins/%s/screen_skipwords.xml" % (
            getPluginPath(), config.plugins.skyrecorder.anytime_skin.value)
        with open(path, "r") as f:
            self.skin = f.read()
            f.close()

        Screen.__init__(self, session)

        pluginName = config.plugins.skyrecorder.pluginname.value
        contentSize = config.plugins.skyrecorder.contentsize.value

        self["actions"] = ActionMap(
            [
                "OkCancelActions", "ShortcutActions", "EPGSelectActions",
                "WizardActions", "ColorActions", "NumberActions",
                "MenuActions", "MoviePlayerActions"
            ], {
                "ok": self.keyOK,
                "cancel": self.keyCancel,
                "green": self.keyAdd,
                "red": self.keyDel,
            }, -1)

        self.skipwordliste = []
        self.streamMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.streamMenuList.l.setFont(0, gFont('Regular', 30))
        self.streamMenuList.l.setItemHeight(75)
        self['skipwordselect'] = self.streamMenuList

        self.sky_skipwords_path = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/sky_skipwords"
        self.sky_skipwords_path_tmp = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/sky_skipwords.tmp"

        self.onLayoutFinish.append(self.readSkipWords)

    def skySkipWordSelectListEntry(self, entry):
        if entry[1] == "True":
            plus = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/plus.png"
            return [
                entry,
                (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 15, 5, 20,
                 18, LoadPixmap(plus)),
                (eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 850, 25, 0,
                 RT_HALIGN_LEFT, str(entry[0]))
            ]
        else:
            minus = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/minus.png"
            return [
                entry,
                (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 15, 5, 20,
                 18, LoadPixmap(minus)),
                (eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 850, 25, 0,
                 RT_HALIGN_LEFT, str(entry[0]))
            ]

    def readSkipWords(self):
        try:
            sql.cur.execute('SELECT SQLITE_VERSION()')
        except Exception:
            sys.exc_clear()
            try:
                sql.connect()
            except Exception:
                return

        self.skipwordliste = []
        for (skipword, status) in sql.readSkipSelect():
            self.skipwordliste.append((skipword, status))
        print "[skyrecorder] reload skips."
        self.skipwordliste.sort()
        self.streamMenuList.setList(
            map(self.skySkipWordSelectListEntry, self.skipwordliste))

    def keyOK(self):
        exist = self['skipwordselect'].getCurrent()
        if exist == None:
            return
        skipword_auswahl = self['skipwordselect'].getCurrent()[0][0]
        print skipword_auswahl
        sql.changeSkip(skipword_auswahl)
        self.readSkipWords()

        #exist = self['skipwordselect'].getCurrent()
        #if exist == None:
        #	return

    def keyAdd(self):
        print "add"
        self.session.openWithCallback(self.addSkipWord,
                                      VirtualKeyBoard,
                                      title=("Skip word eintragen:"))

    def addSkipWord(self, word=None):
        if word != None or word == "":
            sql.addSkip(word)
            print "[skyrecorder] add skip: %s" % word
        self.readSkipWords()

    def keyDel(self):
        exist = self['skipwordselect'].getCurrent()
        if exist == None:
            return
        skipword_auswahl = self['skipwordselect'].getCurrent()[0][0]
        sql.delSkip(skipword_auswahl)
        print "[skyrecorder] del skip: %s" % skipword_auswahl
        self.readSkipWords()

        #print "del"
        #exist = self['skipwordselect'].getCurrent()
        #if exist == None:
        #	return

    def keyCancel(self):
        self.close()
Ejemplo n.º 47
0
class VpnScreen(Screen):
    def __init__(self, session):
        self.skin = """
              <screen name="Vpn Menu" backgroundColor="#00000000" position="center,center" size="666,420" title="Vpn" flags="wfNoBorder">
              <widget name="countryPng" position="30,5" alphatest="blend" size="50,33" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/VpnChanger/icon/default.png" zPosition="2" />
              <widget name="list" position="center,70" size="600,160" backgroundColor="#00000000" scrollbarMode="showOnDemand" zPosition="2" transparent="1" />
              <widget name="vpnLoad" position="center,70" size="600,160" backgroundColor="#00000000" foregroundColor="#00B8B8B8" font="Regular; 24" valign="top" halign="left"  zPosition="2" transparent="1" />
              <widget name="ipLabel" position="80,5" size="600,33" backgroundColor="#00000000" foregroundColor="#00B8B8B8" font="Regular; 24" valign="top" halign="left"  zPosition="2" transparent="1" />
              <eLabel position="30,253" size="5,33" zPosition="2" backgroundColor="#00ff0000" />
              <eLabel text="Start/Stop OpenVpn" position="40,253" size="333,33" backgroundColor="#00000000" transparent="1" foregroundColor="#00B8B8B8" zPosition="2" font="Regular; 24" valign="top" halign="left" />
              <widget name="vpnStatus" position="303,253" size="290,33" backgroundColor="#00000000" foregroundColor="#00B8B8B8" font="Regular; 24" valign="top" halign="left"  zPosition="2" transparent="1" />
              <widget name="vpnInfo" position="303,293" size="290,33" backgroundColor="#00000000" foregroundColor="#00B8B8B8" font="Regular; 24" valign="top" halign="left"  zPosition="2" transparent="1" />
              <eLabel position="30,293" size="5,33" zPosition="2" backgroundColor="#0000ff00" />
              <widget name="vpnDir" position="40,293" size="290,33" backgroundColor="#00000000" foregroundColor="#00B8B8B8" font="Regular; 24" valign="top" halign="left"  zPosition="2" transparent="1" />
              <eLabel position="30,333" size="5,33" zPosition="2" backgroundColor="#00ebff00" />
              <widget name="check" position="40,333" size="290,33" backgroundColor="#00000000" foregroundColor="#00B8B8B8" font="Regular; 24" valign="top" halign="left"  zPosition="2" transparent="1" />
              <widget name="checkLabel" position="303,333" size="290,33" backgroundColor="#00000000" foregroundColor="#00B8B8B8" font="Regular; 24" valign="top" halign="left"  zPosition="2" transparent="1" />
              <eLabel position="30,373" size="5,33" zPosition="2" backgroundColor="#003000ff" />
              <widget name="network" position="40,373" size="290,33" backgroundColor="#00000000" foregroundColor="#00B8B8B8" font="Regular; 24" valign="top" halign="left"  zPosition="2" transparent="1" />
              </screen>"""

        Screen.__init__(self, session)

        self["actions"] = ActionMap(
            ["OkCancelActions", "ColorActions", "SetupActions"], {
                "ok": self.keyOK,
                "red": self.keyRed,
                "green": self.keyGreen,
                "yellow": self.keyYellow,
                "blue": self.keyBlue,
                "cancel": self.keyCancel
            }, -1)

        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        if DESKTOPSIZE.width() == 1920:
            self.chooseMenuList.l.setFont(0, gFont('Regular', 29))
            self.chooseMenuList.l.setItemHeight(31)
        else:
            self.chooseMenuList.l.setFont(0, gFont('Regular', 19))
            self.chooseMenuList.l.setItemHeight(22)

        self['countryPng'] = Pixmap()
        self["ipLabel"] = Label("")
        self["check"] = Label("Start/Stop Check Vpn")
        self["network"] = Label(_("Restart Network"))
        if config.vpnChanger.vpnCheck.value:
            text = "Vpn Check is Enabled"
        else:
            text = "Vpn Check is Disabled"
        self["checkLabel"] = Label(text)
        self['vpnInfo'] = Label(config.vpnChanger.lastVpn.value)
        self['vpnDir'] = Label(config.vpnChanger.dir.value)
        self['list'] = self.chooseMenuList
        self['vpnLoad'] = Label("OpenVpn is Loading.....")
        if "openvpn" in str(os.listdir("/var/run")):
            text = "OpenVpn is Running"
        else:
            text = "OpenVpn is not Running"
        self['vpnStatus'] = Label(text)

        self['vpnLoad'].hide()
        self.Timer = 0
        self.StatusTimer = eTimer()
        self.StatusTimer.callback.append(self.statusVpn)

        self.onLayoutFinish.append(self.setList)

    def setList(self):
        self.vpnList = []
        if os.path.exists(config.vpnChanger.dir.value):
            for i in os.listdir(config.vpnChanger.dir.value):
                self.vpnList.append((i, ))

        if self.vpnList:
            self.vpnList.sort()
            self.chooseMenuList.setList(map(enterListEntry, self.vpnList))
        threading.Thread(target=self.readIP).start()

    def keyOK(self):
        if self.vpnList:
            vpn = self['list'].getCurrent()[0][0]
            #Check Vpn running
            if "openvpn" in str(os.listdir("/var/run")):
                try:
                    f = open(LOGFILE, "a")
                    f.write(
                        time.strftime("%d.%m.%Y %H:%M:%S") +
                        " Stopping OpenVpn\n")
                    f.close()
                except:
                    print "Log File Error"
                os.system("/etc/init.d/openvpn stop")

            # Alte OpenVpn configs loeschen so wie das Log File
            if os.path.exists("/etc/openvpn"):
                for i in os.listdir("/etc/openvpn"):
                    if i.split('.')[-1] == 'conf':
                        f = open("/etc/openvpn/%s" % i, "r")
                        for line in f:
                            if "log" in line:
                                try:
                                    f = open(LOGFILE, "a")
                                    f.write(
                                        time.strftime("%d.%m.%Y %H:%M:%S") +
                                        " Delet Vpn Log " + line[4:].strip() +
                                        "\n")
                                    f.close()
                                except:
                                    print "Log File Error"
                                os.system("rm %s" % line[4:].strip())
                        f.close()
                try:
                    f = open(LOGFILE, "a")
                    f.write(
                        time.strftime("%d.%m.%Y %H:%M:%S") +
                        " Delet Vpn Configs\n")
                    f.close()
                except:
                    print "Log File Error"
                os.system("rm -R /etc/openvpn/*")

            #Neue Configs in openvpn erstellen
            try:
                f = open(LOGFILE, "a")
                f.write(
                    time.strftime("%d.%m.%Y %H:%M:%S") +
                    " cp new Vpn Configs " + str(vpn) + "\n")
                f.close()
            except:
                print "Log File Error"
            os.system("cp -R %s%s/* /etc/openvpn" %
                      (config.vpnChanger.dir.value, vpn))

            #Lesen der neuen Config und wenn kein log file angegeben ist eins hinzufuegen
            if os.path.exists("/etc/openvpn"):
                log = True
                confData = []
                for i in os.listdir("/etc/openvpn"):
                    if i.split('.')[-1] == 'conf':
                        new = open("/etc/openvpn/%snew" % i, "a")
                        old = open("/etc/openvpn/%s" % i, "r")
                        for line in old:
                            if "log" in line:
                                if not line[0] == "#":
                                    print "Vpn LogFile OK ", line[4:].strip()
                                    log = False
                                    confData.append((line))
                            else:
                                confData.append((line))
                        if log:
                            new.write("log /etc/openvpn/openvpn.log\n")
                        if confData:
                            for line in confData:
                                new.write(str(line))
                            if fileExists("/etc/openvpn/%snew" % i):
                                os.system(
                                    "mv /etc/openvpn/%snew /etc/openvpn/%s" %
                                    (i, i))
                        old.close()
                        new.close()

            else:
                try:
                    f = open(LOGFILE, "a")
                    f.write(
                        time.strftime("%d.%m.%Y %H:%M:%S") +
                        " /etc/openvpn not found\n")
                    f.close()
                except:
                    print "Log File Error"
                self.session.open(
                    MessageBox,
                    _("/etc/openvpn not found!\nIs OpenVpn installed?"),
                    MessageBox.TYPE_ERROR,
                    timeout=10)
                return
            #Vpn config chmod 755
            try:
                f = open(LOGFILE, "a")
                f.write(
                    time.strftime("%d.%m.%Y %H:%M:%S") +
                    " chmod 755 /etc/openvpn/\n")
                f.close()
            except:
                print "Log File Error"
            os.system("chmod 755 /etc/openvpn/*")

            #Neustarten von Vpn
            try:
                f = open(LOGFILE, "a")
                f.write(
                    time.strftime("%d.%m.%Y %H:%M:%S") + " OpenVpn Starting\n")
                f.close()
            except:
                print "Log File Error"
            os.system("/etc/init.d/openvpn start")
            #Check running openVpn
            if "openvpn" in str(os.listdir("/var/run")):
                config.vpnChanger.lastVpn.value = vpn + " is Enabled"
                self['vpnStatus'].setText("OpenVpn is Running")
                self['list'].hide()
                self['vpnLoad'].show()
                self.statusVpn()
                try:
                    f = open(LOGFILE, "a")
                    f.write(
                        time.strftime("%d.%m.%Y %H:%M:%S ") + str(vpn) +
                        " is Running\n")
                    f.close()
                except:
                    print "Log File Error"
            else:
                config.vpnChanger.lastVpn.value = vpn + " Error"
                self['vpnStatus'].setText("OpenVpn is not Running")
                self.session.open(
                    MessageBox,
                    _("Vpn Config %s konnte nicht gestartet werden!" % vpn),
                    MessageBox.TYPE_ERROR,
                    timeout=10)
                try:
                    f = open(LOGFILE, "a")
                    f.write(
                        time.strftime("%d.%m.%Y %H:%M:%S ") + str(vpn) +
                        " is not Running\n")
                    f.close()
                except:
                    print "Log File Error"
            self['vpnInfo'].setText(config.vpnChanger.lastVpn.value)
            config.vpnChanger.lastVpn.save()
            configfile.save()

    def keyRed(self):
        if "openvpn" in str(os.listdir("/var/run")):
            os.system("/etc/init.d/openvpn stop")
            self['vpnStatus'].setText("OpenVpn is not Running")
            self.session.open(MessageBox,
                              _("OpneVpn wurde gestoppt!"),
                              MessageBox.TYPE_INFO,
                              timeout=10)
            threading.Thread(target=self.readIP).start()
            try:
                f = open(LOGFILE, "a")
                f.write(
                    time.strftime("%d.%m.%Y %H:%M:%S ") + "OpenVpn Stopping\n")
                f.close()
            except:
                print "Log File Error"
        else:
            os.system("/etc/init.d/openvpn start")
            if "openvpn" in str(os.listdir("/var/run")):
                self['vpnStatus'].setText("OpenVpn is Running")
                self['list'].hide()
                self['vpnLoad'].show()
                self.statusVpn()
                try:
                    f = open(LOGFILE, "a")
                    f.write(
                        time.strftime("%d.%m.%Y %H:%M:%S ") +
                        "OpenVpn is Running\n")
                    f.close()
                except:
                    print "Log File Error"
            else:
                try:
                    f = open(LOGFILE, "a")
                    f.write(
                        time.strftime("%d.%m.%Y %H:%M:%S ") +
                        "OpenVpn Starting Error\n")
                    f.close()
                except:
                    print "Log File Error"
                self['vpnStatus'].setText("OpenVpn is not Running")
                self.session.open(MessageBox,
                                  _("OpneVpn konnte nicht gestartet werden!"),
                                  MessageBox.TYPE_ERROR,
                                  timeout=10)

    def keyYellow(self):
        if config.vpnChanger.vpnCheck.value:
            config.vpnChanger.vpnCheck.value = False
            self["checkLabel"].setText("Vpn Check is Disabled")
            try:
                f = open(LOGFILE, "a")
                f.write(
                    time.strftime("%d.%m.%Y %H:%M:%S ") +
                    "Vpn Check Disabled\n")
                f.close()
            except:
                print "Log File Error"
        else:
            config.vpnChanger.vpnCheck.value = True
            self["checkLabel"].setText("Vpn Check is Enabled")
            self.session.openWithCallback(
                self.readAnswer, MessageBox,
                _('Netzwerkverbindung trenne wenn die Vpn Verbindung\nnicht mehr besteht? '
                  ), MessageBox.TYPE_YESNO)
            try:
                f = open(LOGFILE, "a")
                f.write(
                    time.strftime("%d.%m.%Y %H:%M:%S ") +
                    "Vpn Check Enabled\n")
                f.close()
            except:
                print "Log File Error"
        config.vpnChanger.vpnCheck.save()
        configfile.save()

    def keyBlue(self):
        print "Restart Network"
        self.session.openWithCallback(self.readIP, RestartNetwork)

    def readAnswer(self, answer):
        if answer is False:
            config.vpnChanger.setNetwork.value = False
            try:
                f = open(LOGFILE, "a")
                f.write(
                    time.strftime("%d.%m.%Y %H:%M:%S ") +
                    "Vpn Check Network is Disabled\n")
                f.close()
            except:
                print "Log File Error"
        else:
            config.vpnChanger.setNetwork.value = True
            try:
                f = open(LOGFILE, "a")
                f.write(
                    time.strftime("%d.%m.%Y %H:%M:%S ") +
                    "Vpn Check Network is Enabled\n")
                f.close()
            except:
                print "Log File Error"
        config.vpnChanger.setNetwork.save()
        configfile.save()

    def keyGreen(self):
        self.session.openWithCallback(self.reload, FolderScreen,
                                      config.vpnChanger.dir.value)

    def reload(self):
        self['vpnDir'].setText(config.vpnChanger.dir.value)
        self.vpnList = []
        if os.path.exists(config.vpnChanger.dir.value):
            for i in os.listdir(config.vpnChanger.dir.value):
                self.vpnList.append((i, ))

        if self.vpnList:
            self.vpnList.sort()
            self.chooseMenuList.setList(map(enterListEntry, self.vpnList))

    def statusVpn(self):
        logFile = None
        if os.path.exists("/etc/openvpn"):
            for i in os.listdir("/etc/openvpn"):
                if i.split('.')[-1] == 'conf':
                    f = open("/etc/openvpn/%s" % i, "r")
                    for line in f:
                        if "log" in line:
                            logFile = line[4:].strip()
                            break
                            f.close()
                    f.close()

        if logFile:
            if fileExists(logFile):
                f = open(logFile, "r")
                for line in f:
                    if re.search("Initialization Sequence Completed", line):
                        self['vpnLoad'].hide()
                        self['list'].show()
                        threading.Thread(target=self.readIP).start()
                        f.close()
                        try:
                            f = open(LOGFILE, "a")
                            f.write(
                                time.strftime("%d.%m.%Y %H:%M:%S ") +
                                "OpenVpn Initialization Sequence Completed\n")
                            f.close()
                        except:
                            print "Log File Error"
                        if fileExists(
                                "/usr/lib/enigma2/python/Plugins/Extensions/VpnChanger/script/myStart.sh"
                        ):
                            try:
                                os.system(
                                    "/usr/lib/enigma2/python/Plugins/Extensions/VpnChanger/script/myStart.sh"
                                )
                                f = open(LOGFILE, "a")
                                f.write(
                                    time.strftime("%d.%m.%Y %H:%M:%S ") +
                                    "Start myStart Script\n")
                                f.close()
                            except:
                                try:
                                    f = open(LOGFILE, "a")
                                    f.write(
                                        time.strftime("%d.%m.%Y %H:%M:%S ") +
                                        "Start myStart Script Error\n")
                                    f.close()
                                except:
                                    print "Log File Error"
                        self.Timer = 0
                        return
                    if re.search("VERIFY ERROR", line):
                        self['vpnLoad'].hide()
                        self['list'].show()
                        threading.Thread(target=self.readIP).start()
                        f.close()
                        try:
                            f = open(LOGFILE, "a")
                            f.write(
                                time.strftime("%d.%m.%Y %H:%M:%S ") +
                                "OpenVpn VERIFY ERROR\n")
                            f.close()
                        except:
                            print "Log File Error"
                        if fileExists(
                                "/usr/lib/enigma2/python/Plugins/Extensions/VpnChanger/script/myStart.sh"
                        ):
                            try:
                                os.system(
                                    "/usr/lib/enigma2/python/Plugins/Extensions/VpnChanger/script/myStart.sh"
                                )
                                f = open(LOGFILE, "a")
                                f.write(
                                    time.strftime("%d.%m.%Y %H:%M:%S ") +
                                    "Start myStart Script\n")
                                f.close()
                            except:
                                try:
                                    f = open(LOGFILE, "a")
                                    f.write(
                                        time.strftime("%d.%m.%Y %H:%M:%S ") +
                                        "Start myStart Script Error\n")
                                    f.close()
                                except:
                                    print "Log File Error"
                        self.Timer = 0
                        return
                if not self.Timer == 7:
                    self.Timer = self.Timer + 1
                    self.StatusTimer.start(3000, True)
                    f.close()
                else:
                    self.Timer = 0
                    self['vpnLoad'].hide()
                    self['list'].show()
                    threading.Thread(target=self.readIP).start()
                    f.close()
                    try:
                        f = open(LOGFILE, "a")
                        f.write(
                            time.strftime("%d.%m.%Y %H:%M:%S ") +
                            "Load OpenVpn Loading to long\n")
                        f.close()
                    except:
                        print "Log File Error"
                    if fileExists(
                            "/usr/lib/enigma2/python/Plugins/Extensions/VpnChanger/script/myStart.sh"
                    ):
                        try:
                            os.system(
                                "/usr/lib/enigma2/python/Plugins/Extensions/VpnChanger/script/myStart.sh"
                            )
                            f = open(LOGFILE, "a")
                            f.write(
                                time.strftime("%d.%m.%Y %H:%M:%S ") +
                                "Start myStart Script\n")
                            f.close()
                        except:
                            try:
                                f = open(LOGFILE, "a")
                                f.write(
                                    time.strftime("%d.%m.%Y %H:%M:%S ") +
                                    "Start myStart Script Error\n")
                                f.close()
                            except:
                                print "Log File Error"
            else:
                self['vpnLoad'].hide()
                self['list'].show()
                threading.Thread(target=self.readIP).start()
                try:
                    f = open(LOGFILE, "a")
                    f.write(
                        time.strftime("%d.%m.%Y %H:%M:%S ") +
                        "Load OpenVpn Log File ERROR\n")
                    f.close()
                except:
                    print "Log File Error"

    def readIP(self):
        print "[Vpn] read IP"
        ipData = []
        pngData = []
        try:
            response = urllib2.urlopen(IPCHECK)
            data = response.read()
            response.close()
        except:
            print "Read Url Error"
        else:
            # IP
            ipData = re.findall(
                '<strong>([0-9]+.[0-9]+.[0-9]+.[0-9]+)</strong></div>', data,
                re.S)
            # png
            pngData = re.findall(
                '<div class="location"><img src="(https://.*?/img/country/.*?png)"'
                ' alt="(.*?)" />.*?</div>', data, re.S)
        if ipData:
            ip = "IP: " + str(ipData[0])
        else:
            try:
                response = urllib2.urlopen("https://api.ipify.org/")
                data = response.read()
                response.close()
            except:
                ip = "IP: No Data Found!"
            else:
                ip = "IP: " + str(data).strip()

        if pngData:
            (Url, Land) = pngData[0]
            ip = str(Land) + "  " + ip
            pngUrl = Url
        else:
            ip = "Country: ?  " + ip
            pngUrl = DEFAULTCOUNTRY

        self['ipLabel'].setText(ip)
        self.loadPic(pngUrl)

    def loadPic(self, pngUrl):
        downloadPage(pngUrl, "/tmp/country.png").addCallback(self.ShowPng)

    def ShowPng(self, Data):
        if fileExists("/tmp/country.png"):
            self['countryPng'].instance.setPixmap(gPixmapPtr())
            self.scale = AVSwitch().getFramebufferScale()
            self.picload = ePicLoad()
            size = self['countryPng'].instance.size()
            self.picload.setPara((size.width(), size.height(), self.scale[0],
                                  self.scale[1], False, 1, "#00000000"))
            if self.picload.startDecode("/tmp/country.png", 0, 0, False) == 0:
                ptr = self.picload.getData()
                if ptr != None:
                    self['countryPng'].instance.setPixmap(ptr)
                    self['countryPng'].show()
                    del self.picload

    def keyCancel(self):
        self.close()
class serienRecShowConflicts(serienRecBaseScreen, Screen, HelpableScreen):
    def __init__(self, session):
        serienRecBaseScreen.__init__(self, session)
        Screen.__init__(self, session)
        HelpableScreen.__init__(self)
        self.skin = None
        self.conflictsListe = []
        self.session = session
        self.database = SRDatabase(SerienRecorder.serienRecDataBaseFilePath)

        self["actions"] = HelpableActionMap(
            self, "SerienRecorderActions", {
                "cancel": (self.keyCancel, "zurück zur vorherigen Ansicht"),
                "left": (self.keyLeft, "zur vorherigen Seite blättern"),
                "right": (self.keyRight, "zur nächsten Seite blättern"),
                "up": (self.keyUp, "eine Zeile nach oben"),
                "down": (self.keyDown, "eine Zeile nach unten"),
                "red": (self.keyCancel, "zurück zur vorherigen Ansicht"),
                "blue": (self.keyBlue,
                         "alle Einträge aus der Liste endgültig löschen"),
                "menu":
                (self.recSetup, "Menü für globale Einstellungen öffnen"),
                "0":
                (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
                "3": (self.showProposalDB,
                      "Liste der Serien/Staffel-Starts anzeigen"),
                "7": (self.showWishlist,
                      "Merkzettel (vorgemerkte Folgen) anzeigen"),
            }, -1)
        self.helpList[0][2].sort()

        self["helpActions"] = ActionMap([
            "SerienRecorderActions",
        ], {
            "displayHelp": self.showHelp,
            "displayHelp_long": self.showManual,
        }, 0)

        self.setupSkin()

        self.onLayoutFinish.append(self.readConflicts)
        self.onClose.append(self.__onClose)
        self.onLayoutFinish.append(self.setSkinProperties)

    def callHelpAction(self, *args):
        HelpableScreen.callHelpAction(self, *args)

    def setSkinProperties(self):
        super(self.__class__, self).setSkinProperties()

        self['text_red'].setText("Abbrechen")
        self['text_blue'].setText("Liste leeren")
        self.num_bt_text[1][1] = buttonText_na
        self.num_bt_text[4][0] = buttonText_na

        super(self.__class__, self).startDisplayTimer()

    def setupSkin(self):
        InitSkin(self)

        self.chooseMenuList = MenuList([],
                                       enableWrapAround=True,
                                       content=eListboxPythonMultiContent)
        self.chooseMenuList.l.setFont(
            0,
            gFont('Regular',
                  20 + int(config.plugins.serienRec.listFontsize.value)))
        self.chooseMenuList.l.setItemHeight(int(25 * skinFactor))
        self['menu_list'] = self.chooseMenuList
        self['menu_list'].show()

        self['title'].setText("Timer-Konflikte")

        if not config.plugins.serienRec.showAllButtons.value:
            self['bt_red'].show()
            self['bt_blue'].show()
            self['bt_exit'].show()
            self['bt_info'].show()
            self['bt_menu'].show()

            self['text_red'].show()
            self['text_blue'].show()
            self['text_0'].show()
            self['text_1'].show()
            self['text_2'].show()
            self['text_3'].show()
            self['text_4'].show()

    def updateMenuKeys(self):
        updateMenuKeys(self)

    def setupClose(self, result):
        super(self.__class__, self).setupClose(result)
        if result[1]:
            self.readConflicts()

    def readConflicts(self):
        conflicts = self.database.getTimerConflicts()
        for conflict in conflicts:
            (zeile, start_time, webChannel) = conflict
            data = zeile.split('/')
            if data:
                self.conflictsListe.append(("%s" % data[0].strip()))
                self.conflictsListe.append(
                    ("    @ %s (%s) in Konflikt mit:" %
                     (webChannel,
                      time.strftime("%d.%m.%Y - %H:%M",
                                    time.localtime(start_time)))))
                data = data[1:]
                for row2 in data:
                    self.conflictsListe.append(
                        ("            -> %s" % row2.strip()))
                self.conflictsListe.append(("-" * 100))
                self.conflictsListe.append("")
        self.chooseMenuList.setList(
            list(map(self.buildList, self.conflictsListe)))

    @staticmethod
    def buildList(entry):
        (zeile) = entry
        return [
            entry,
            (eListboxPythonMultiContent.TYPE_TEXT, 00, 00, 850 * skinFactor,
             20 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, zeile)
        ]

    def keyLeft(self):
        self['menu_list'].pageUp()

    def keyRight(self):
        self['menu_list'].pageDown()

    def keyDown(self):
        self['menu_list'].down()

    def keyUp(self):
        self['menu_list'].up()

    def keyBlue(self):
        if self['menu_list'].getCurrent() is None:
            print("[SerienRecorder] Conflict-List leer.")
            return
        else:
            if config.plugins.serienRec.confirmOnDelete.value:
                self.session.openWithCallback(
                    self.callDeleteMsg,
                    MessageBox,
                    "Soll die Liste wirklich geleert werden?",
                    MessageBox.TYPE_YESNO,
                    default=False)
            else:
                self.callDeleteMsg(True)

    def callDeleteMsg(self, answer):
        if answer:
            self.database.removeAllTimerConflicts()
            self.readConflicts()
        else:
            return

    def __onClose(self):
        self.stopDisplayTimer()

    def keyCancel(self):
        self.close()
Ejemplo n.º 49
0
class persianFavoritescrn(Screen):
    try:
        sz_w = getDesktop(0).size().width()
        if sz_w == 1280:
            HD_Res = True
        else:
            HD_Res = False
    except:
        HD_Res = False

    if HD_Res:
        skin = '\n                <screen  position="center,center" size="920,600" title=""  flags="wfNoBorder" >\n                <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PurePrestige/images/frame.png" position="0,0" size="920,600" transparent="1"/>\t\n                        <ePixmap alphatest="on" name="red" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PurePrestige/Applications//NetRadioPersian/buttons/red.png" position="15,30" size="200,40" transparent="1" zPosition="4"/>\n\t\t\t<ePixmap alphatest="on" name="green" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PurePrestige/Applications//NetRadioPersian/buttons/green.png" position="215,30" size="200,40" transparent="1" zPosition="4"/>\n\t\t\t<ePixmap alphatest="on" name="yellow" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PurePrestige/Applications//NetRadioPersian/buttons/yellow.png" position="415,30" size="200,40" transparent="1" zPosition="4"/>\n\t\t\t<ePixmap alphatest="on" name="blue" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PurePrestige/Applications//NetRadioPersian/buttons/blue.png" position="615,30" size="215,30" transparent="1" zPosition="4"/>\n\t\t\t<widget font="Regular;21" foregroundColor="white" halign="center" name="key_red" position="15,30" shadowColor="black" shadowOffset="-1,-1" size="150,40" transparent="1" valign="center" zPosition="5"/>\n\t\t\t<widget font="Regular;21" foregroundColor="white" halign="center" name="key_green" position="215,30" shadowColor="black" shadowOffset="-1,-1" size="150,40" transparent="1" valign="center" zPosition="5"/>\n\t\t\t<widget font="Regular;21" foregroundColor="white" halign="center" name="key_yellow" position="415,30" shadowColor="black" shadowOffset="-1,-1" size="150,40" transparent="1" valign="center" zPosition="5"/>\n\t\t\t<widget font="Regular;21" foregroundColor="white" halign="center" name="key_blue" position="615,30" shadowColor="black" shadowOffset="-1,-1" size="150,40" transparent="1" valign="center" zPosition="5"/>\n                        <ePixmap position="15,700" size="890,5" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PurePrestige/Applications/NetRadioPersian/icons/slider.png" alphatest="blend" transparent="1" backgroundColor="transparent"/>\n\t\t\t<widget name="favoritemenu" position="15,80" size="890,520"  itemHeight="40" scrollbarMode="showOnDemand" transparent="1" zPosition="4" />\n\t\t\t\n\t\t</screen>'
    else:
        skin = '\n                    <screen  position="center,center" size="580,450" title=""  flags="wfNoBorder" >\n                <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PurePrestige/images/framesd.png" position="0,0" size="640,520"/>\t\n\t\t        \n            <ePixmap name="red" position="10,15" zPosition="4" size="150,40" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PurePrestige/Applications//NetRadioPersian/buttons/red.png" transparent="1" alphatest="on" />\n\n                        <ePixmap name="green" position="160,15" zPosition="4" size="150,40" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PurePrestige/Applications//NetRadioPersian/buttons/green.png" transparent="1" alphatest="on" />\n\t\t\t<ePixmap name="yellow" position="310,15" zPosition="4" size="150,40" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PurePrestige/Applications//NetRadioPersian/buttons/yellow.png" transparent="1" alphatest="on" />\n\t\t\t<ePixmap name="blue" position="460,15" zPosition="4" size="150,40" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PurePrestige/Applications//NetRadioPersian/buttons/blue.png" transparent="1" alphatest="on" />\n\t\t\t<widget name="key_red" position="10,15" zPosition="5" size="150,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />\n\t\t\t<widget name="key_green" position="160,15" zPosition="5" size="150,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />\n\t\t\t<widget name="key_yellow" position="310,15" zPosition="5" size="150,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />\n\t\t\t<widget name="key_blue" position="460,15" zPosition="5" size="150,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />\n\t\t\t<widget name="favoritemenu" position="20,50" size="600,400" scrollbarMode="showOnDemand" transparent="1" zPosition="4" />\n\t\t\t\n\t\t        \n                </screen>'

    def __init__(self, session):
        self.session = session
        self.skin = persianFavoritescrn.skin
        Screen.__init__(self, session)
        self['key_red'] = Button(_('Exit'))
        self['key_green'] = Button(_('Delete'))
        self['key_yellow'] = Button(_('Add station'))
        self['key_blue'] = Button(_('About'))
        self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference(
        )
        try:
            self.session.nav.stopService()
        except:
            pass

        self.onClose.append(self.__onClose)
        self['actions'] = ActionMap(
            ['SetupActions', 'ColorActions'], {
                'ok': self.ok,
                'blue': self.ShowAbout,
                'yellow': self.Addstation,
                'green': self.Delselected,
                'red': self.close,
                'cancel': self.close
            }, -2)
        self.list = MenuList([])
        self['favoritemenu'] = self.list
        lst = lsSelected()
        self.list.setList(lst)
        if config.plugins.Cradio.stations_count.value == 0:
            self['key_green'].hide()
        else:
            self['key_green'].show()

    def ShowAbout(self):
        self.session.open(persianAboutScreen)

    def Addstation(self):
        self.session.openWithCallback(self.close, persianStationsScreen)

    def Showsettings(self):
        self.close

    def Delselected(self):
        try:
            sel = self['favoritemenu'].getSelectedIndex()
            config.plugins.Cradio.stations_count.value = config.plugins.Cradio.stations_count.value - 1
            config.plugins.Cradio.stations_count.save()
            del config.plugins.Cradio.stations[sel]
            config.plugins.Cradio.stations.save()
            config.plugins.Cradio.save()
            configfile.save()
            lst = []
            lst = lsSelected()
            self['favoritemenu'].setList(lst)
            if config.plugins.Cradio.stations_count.value == 0:
                self['key_green'].hide()
            else:
                self['key_green'].show()
        except:
            pass

    def playServiceStream(self, url):
        try:
            self.session.nav.stopService()
            sref = eServiceReference(4097, 0, url)
            self.session.nav.playService(sref)
            self.currentStreamingURL = url
        except:
            pass

    def ok(self):
        try:
            station = self.list.getSelectionIndex()
            currentindex = station
            cname = config.plugins.Cradio.stations[station].code.value
            tup1 = cname.split(',')
            cstation = tup1[0]
            curl = tup1[1]
            self.currentStreamingURL = ''
            self.currentStreamingStation = ''
            self.session.nav.stopService()
            self.currentStreamingStation = cstation
            self.playServiceStream(curl)
            currentservice = self.CurrentService
            self.session.open(persianplayingscrn, cstation, currentservice,
                              currentindex)
        except:
            pass

    def playServiceStream(self, url):
        try:
            self.session.nav.stopService()
            sref = eServiceReference(4097, 0, url)
            self.session.nav.playService(sref)
            self.currentStreamingURL = url
        except:
            pass

    def __onClose(self):
        self.session.nav.playService(self.CurrentService)
Ejemplo n.º 50
0
class TwitchStreamGrid(Screen):
	TMP_PREVIEW_FILE_PATH = "/tmp/twitch_channel_preview.jpg"
	SKIN_COMPONENT_KEY = "TwitchStreamGrid"
	SKIN_COMPONENT_HEADER_HEIGHT = "headerHeight"
	SKIN_COMPONENT_FOOTER_HEIGHT = "footerHeight"
	SKIN_COMPONENT_ITEM_PADDING = "itemPadding"

	def __init__(self, session, windowTitle=_("TwitchTV")):
		Screen.__init__(self, session, windowTitle=windowTitle)
		self.skinName = "TwitchStreamGrid"
		self["actions"] = ActionMap(["OkCancelActions", "ColorActions"],
		{
			"ok": self._onOk,
			"cancel": self.close,
			"red": self._onRed,
			"green": self._onGreen,
			"yellow" : self._onYellow,
			"blue": self._onBlue,
		}, -1)

		self["key_red"] = StaticText()
		self["key_green"] = StaticText()
		self["key_blue"] = StaticText()
		self["key_yellow"] = StaticText()
		self._setupButtons()

		sizes = componentSizes[TwitchStreamGrid.SKIN_COMPONENT_KEY]
		self._itemWidth = sizes.get(ComponentSizes.ITEM_WIDTH, 280)
		self._itemHeight = sizes.get(ComponentSizes.ITEM_HEIGHT, 162)
		self._bannerHeight = sizes.get(TwitchStreamGrid.SKIN_COMPONENT_HEADER_HEIGHT, 30)
		self._footerHeight = sizes.get(TwitchStreamGrid.SKIN_COMPONENT_FOOTER_HEIGHT, 60)
		self._itemPadding = sizes.get(TwitchStreamGrid.SKIN_COMPONENT_ITEM_PADDING, 5)
		#one-off calculations
		pad = self._itemPadding * 2
		self._contentWidth = self._itemWidth - pad
		self._contentHeight = self._itemHeight - pad
		self._footerOffset = self._itemHeight - self._itemPadding - self._footerHeight

		self._items = []
		self._list = MenuList(self._items, mode=eListbox.layoutGrid, content=eListboxPythonMultiContent, itemWidth=self._itemWidth, itemHeight=self._itemHeight)
		self["list"] = self._list

		tlf = TemplatedListFonts()
		self._list.l.setFont(0, gFont(tlf.face(tlf.MEDIUM), tlf.size(tlf.MEDIUM)))
		self._list.l.setFont(1, gFont(tlf.face(tlf.SMALLER), tlf.size(tlf.SMALL)))
		self._list.l.setBuildFunc(self._buildFunc, True)

		self.twitch = Twitch()
		self.twitchMiddleware = TwitchMiddleware.instance

		self._picload = ePicLoad()
		self._picload.setPara((self._itemWidth, self._itemHeight, self._itemWidth, self._itemHeight, False, 0, '#000000'))
		self._picload_conn = self._picload.PictureData.connect(self._onDefaultPixmapReady)

		agent = Agent(reactor, contextFactory=TLSSNIContextFactory(), pool=HTTPConnectionPool(reactor))
		self._agent = BrowserLikeRedirectAgent(agent)
		self._cachingDeferred = None

		self._loadDefaultPixmap()

		self._pixmapCache = {}
		self._currentEntry = 0
		self._endEntry = 0
		self.onLayoutFinish.append(self._onLayoutFinish)
		self.onClose.append(self.__onClose)

	def __onClose(self):
		if self._cachingDeferred:
			Log.w("Cancelling pending image download...")
			self._cachingDeferred.cancel()
		self._picload_conn = None
		self._picload = None

	def _setupButtons(self):
		pass

	def _onLayoutFinish(self):
		self.validateCache(True)

	def reload(self):
		self._items = [ ("loading",) ]
		self._list.setList(self._items)
		self._loadContent()

	def _onRed(self):
		pass

	def _onGreen(self):
		pass

	def _onYellow(self):
		pass

	def _onBlue(self):
		pass

	def _loadContent(self):
		raise NotImplementedError

	def _getCurrent(self):
		return self._list.getCurrent()[0]
	current = property(_getCurrent)

	def _buildFunc(self, stream, selected):
		raise NotImplementedError

	def _onOk(self):
		raise NotImplementedError

	def goDetails(self):
		stream = self.current
		if stream is None or not isinstance(stream, TwitchVideoBase):
			return
		self.session.open(TwitchChannelDetails, stream=stream)

	def validateCache(self, clear=False):
		if not self._list.instance:
			return
		if clear:
			self._pixmapCache = {}
		self._currentEntry = -1
		self._endEntry = len(self._items) - 1
		self._nextForCache()

	def _nextForCache(self):
		self._currentEntry += 1
		if self._currentEntry > self._endEntry:
			return

		if self._currentEntry < len(self._items):
			item = self._items[self._currentEntry][0]
			Log.d(item.preview)
			self._loadPixmapForCache(self._currentEntry, item.preview)

	def _onDownloadPageResponse(self, response, index, url):
		self._cachingDeferred = readBody(response)
		self._cachingDeferred.addCallbacks(self._onDownloadPageBody, self._errorPixmapForCache, callbackArgs=[index, url])

	def _onDownloadPageBody(self, body, index, url):
		with open(self.TMP_PREVIEW_FILE_PATH, 'w') as f:
			f.write(body)
		self._gotPixmapForCache(index, url, None)

	def _loadPixmapForCache(self, index, url):
		self._cachingDeferred = self._agent.request('GET', url)
		self._cachingDeferred.addCallbacks(self._onDownloadPageResponse, self._errorPixmapForCache, callbackArgs=[index,url])

	def _gotPixmapForCache(self, index, url, data):
		self._cachingDeferred = None
		callback = boundFunction(self._decodedPixmapForCache, index, url)
		self._picload_conn = self._picload.PictureData.connect(callback)
		self._picload.startDecode(self.TMP_PREVIEW_FILE_PATH)

	def _decodedPixmapForCache(self, index, url, picInfo=None):
		Log.d(url)
		self._pixmapCache[url] = self._picload.getData()
		self._list.setList(self._items[:])
		self._nextForCache()

	def _errorPixmapForCache(self, *args):
		Log.w(args)
		self._cachingDeferred = None
		if self._picload:
			self._nextForCache()

	def _onAllStreams(self, streams):
		self._items = []
		for stream in streams:
			self._items.append((stream,))
		self._list.setList(self._items)
		if self._list.instance:
			self.validateCache(True)

	def addToFavs(self):
		stream = self.current
		if stream is None or not isinstance(stream, TwitchVideoBase):
			return
		self.twitchMiddleware.addToFavorites(stream.channel)

	def _loadDefaultPixmap(self, *args):
		self._picload.startDecode(resolveFilename(SCOPE_PLUGINS, "Extensions/TwitchTV/twitch.svg"))

	def _errorDefaultPixmap(self, *args):
		Log.w(args)

	def _onDefaultPixmapReady(self, picInfo=None):
		self._defaultPixmap = self._picload.getData()
		self.reload()
Ejemplo n.º 51
0
class serienRecMainChannelEdit(serienRecBaseScreen, Screen, HelpableScreen):
	def __init__(self, session):
		serienRecBaseScreen.__init__(self, session)
		Screen.__init__(self, session)
		HelpableScreen.__init__(self)
		self.session = session
		self.serienRecChannelList = []
		self.stbChannelList = []
		self.selected_sender = None
		self.skin = None
		self.displayMode = 2
		self.chooseMenuList = None
		self.chooseMenuList_popup = None
		self.chooseMenuList_popup2 = None

		from .SerienRecorder import serienRecDataBaseFilePath
		from .SerienRecorderDatabase import SRDatabase
		self.database = SRDatabase(serienRecDataBaseFilePath)

		# from difflib import SequenceMatcher
		# self.sequenceMatcher = SequenceMatcher(" ".__eq__, "", "")
		
		self["actions"] = HelpableActionMap(self, "SerienRecorderActions", {
			"ok"       : (self.keyOK, "Popup-Fenster zur Auswahl des STB-Sender öffnen"),
			"cancel"   : (self.keyCancel, "zurück zur Serienplaner-Ansicht"),
			"red"	   : (self.keyRed, "umschalten ausgewählter Sender für Timererstellung aktiviert/deaktiviert"),
			"red_long" : (self.keyRedLong, "ausgewählten Sender aus der Channelliste endgültig löschen"),
			"green"    : (self.keyGreen, "Sender-Zuordnung aktualisieren"),
			"blue"     : (self.keyBlue, "Automatische Sender-Zuordnung"),
			"menu"     : (self.channelSetup, "Menü für Sender-Einstellungen öffnen"),
			"menu_long": (self.recSetup, "Menü für globale Einstellungen öffnen"),
			"left"     : (self.keyLeft, "zur vorherigen Seite blättern"),
			"right"    : (self.keyRight, "zur nächsten Seite blättern"),
			"up"       : (self.keyUp, "eine Zeile nach oben"),
			"down"     : (self.keyDown, "eine Zeile nach unten"),
			"0"		   : (self.readLogFile, "Log-File des letzten Suchlaufs anzeigen"),
			"3"		   : (self.showProposalDB, "Liste der Serien/Staffel-Starts anzeigen"),
			"6"		   : (self.showConflicts, "Liste der Timer-Konflikte anzeigen"),
			"7"		   : (self.showWishlist, "Merkzettel (vorgemerkte Folgen) anzeigen"),
			"8"		   : (self.checkChannels, "Sender prüfen"),
			"9"		   : (self.resetChannelList, "Alle Zuordnungen löschen"),
		}, -1)
		self.helpList[0][2].sort()

		self["helpActions"] = ActionMap(["SerienRecorderActions",], {
			"displayHelp"      : self.showHelp,
			"displayHelp_long" : self.showManual,
		}, 0)

		self.setupSkin()

		self.modus = "list"
		self.changesMade = False

		self.onLayoutFinish.append(self.showChannels)
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.setSkinProperties)


	def callHelpAction(self, *args):
		HelpableScreen.callHelpAction(self, *args)

	def setSkinProperties(self):
		super(self.__class__, self).setSkinProperties()

		self['text_green'].setText("Aktualisieren")
		self['text_ok'].setText("Sender auswählen")

		self.num_bt_text[3][1] = "Sender prüfen"
		self.num_bt_text[4][1] = "Alle löschen"
		self.num_bt_text[4][0] = buttonText_na
		self['text_red'].setText("Ein/Löschen")
		self.num_bt_text[4][2] = "Setup Sender/global"

		self['text_blue'].setText("Auto-Zuordnung")

		self.num_bt_text[2][2] = buttonText_na
		self.num_bt_text[3][2] = buttonText_na

		super(self.__class__, self).startDisplayTimer()

	def setupSkin(self):
		self.skin = None
		InitSkin(self)

		# normal
		self.chooseMenuList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList.l.setItemHeight(int(25*skinFactor))
		self['list'] = self.chooseMenuList
		self['list'].show()

		# popup
		self.chooseMenuList_popup = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList_popup.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList_popup.l.setItemHeight(int(25*skinFactor))
		self['popup_list'] = self.chooseMenuList_popup
		self['popup_list'].hide()

		# popup2
		self.chooseMenuList_popup2 = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.chooseMenuList_popup2.l.setFont(0, gFont('Regular', 20 + int(config.plugins.serienRec.listFontsize.value)))
		self.chooseMenuList_popup2.l.setItemHeight(int(25*skinFactor))
		self['popup_list2'] = self.chooseMenuList_popup2
		self['popup_list2'].hide()

		self['title'].setText("Lade Wunschliste-Sender...")

		self['Web_Channel'].setText("Wunschliste")
		self['STB_Channel'].setText("Box-Sender")
		self['alt_STB_Channel'].setText("alt. Box-Sender")

		self['Web_Channel'].show()
		self['STB_Channel'].show()
		self['alt_STB_Channel'].show()
		self['separator'].show()

		if not config.plugins.serienRec.showAllButtons.value:
			self['bt_red'].show()
			self['bt_green'].show()
			self['bt_blue'].show()
			self['bt_ok'].show()
			self['bt_exit'].show()
			#self['bt_text'].show()
			self['bt_epg'].hide()
			self['bt_info'].show()
			self['bt_menu'].show()

			self['text_red'].show()
			self['text_green'].show()
			self['text_blue'].show()
			self['text_ok'].show()
			self['text_0'].show()
			self['text_1'].show()
			self['text_2'].show()
			self['text_3'].show()
			self['text_4'].show()

	def updateMenuKeys(self):
		updateMenuKeys(self)

	def channelSetup(self):
		webSender = self['list'].getCurrent()[0][0]
		self.session.open(serienRecChannelSetup, webSender)

	def setupClose(self, result):
		super(self.__class__, self).setupClose(result)

		if result[1]:
			self.showChannels()

	def checkChannels(self):
		channels = self.database.getChannels(True)
		if config.plugins.serienRec.selectBouquets.value:
			stbChannelList = STBHelpers.buildSTBChannelList(config.plugins.serienRec.MainBouquet.value)
		else:
			stbChannelList = STBHelpers.buildSTBChannelList()

		stbServiceRefs = [x[1] for x in stbChannelList]
		serviceRefs = [x[2] for x in channels]
		missingServiceRefs = []
		missingServices = []

		for serviceRef in serviceRefs:
			if serviceRef not in stbServiceRefs:
				missingServiceRefs.append(serviceRef)

		for missingServiceRef in missingServiceRefs:
			for channel in channels:
				(webSender, servicename, serviceref, altservicename, altserviceref, status) = channel
				if serviceref is missingServiceRef and servicename and int(status) != 0:
					missingServices.append(servicename)
					SRLogger.writeLog("%s => %s" % (missingServiceRef, servicename), True)
					break

		if missingServices:
			self.session.open(MessageBox, "Für folgende Sender existiert die ServiceRef nicht mehr,\nbitte die Sender neu zuweisen:\n\n" + "\n".join(missingServices), MessageBox.TYPE_INFO, timeout=0)
		else:
			self.session.open(MessageBox, "Alle zugewiesenen Sender sind noch vorhanden.", MessageBox.TYPE_INFO, timeout=7)

	def showChannels(self):
		self.serienRecChannelList = []
		channels = self.database.getChannels(True)
		for channel in channels:
			(webSender, servicename, serviceref, altservicename, altserviceref, status) = channel
			self.serienRecChannelList.append((webSender, servicename, altservicename, status))

		if len(self.serienRecChannelList) != 0:
			self['title'].setText("Sender zuordnen")
			self.chooseMenuList.setList(list(map(self.buildList, self.serienRecChannelList)))
		else:
			self.channelReset(True)
		self.setMenuKeyText()

	def createWebChannels(self, webChannelList, autoMatch):
		if webChannelList:
			webChannelList.sort(key=lambda x: x.lower())
			self.serienRecChannelList = []

			if len(webChannelList) != 0:
				self['title'].setText("Erstelle Sender-Liste...")

				# Get existing channels from database
				dbChannels = self.database.getChannelPairs()

				if autoMatch:
					# Get all unassigned web channels and try to find the STB channel equivalent
					# Update only matching channels in list
					#sql = "UPDATE OR IGNORE Channels SET STBChannel=?, ServiceRef=?, Erlaubt=? WHERE LOWER(WebChannel)=?"
					unassignedWebChannels = self.getUnassignedWebChannels(dbChannels)

					channels = []
					for webChannel in unassignedWebChannels:
						# Unmapped web channel
						(servicename, serviceref) = self.findWebChannelInSTBChannels(webChannel)
						if servicename and serviceref:
							channels.append((servicename, serviceref, 1, webChannel.lower()))
							self.serienRecChannelList.append((webChannel, servicename, "", "1"))

						self.database.updateChannels(channels)
						self.changesMade = True
				else:
					# Get all new web channels (missing in SR database)
					(newWebChannels, removedWebChannels) = self.getMissingWebChannels(webChannelList, dbChannels)

					# Delete remove channels
					if removedWebChannels:
						SRLogger.writeLog("Folgende Sender wurden bei Wunschliste nicht mehr gefunden, die Zuordnung im SerienRecorder wurde gelöscht:\n" + "\n".join(removedWebChannels), True)
						self.session.open(MessageBox, "Folgende Sender wurden bei Wunschliste nicht mehr gefunden,\ndie Zuordnung im SerienRecorder wurde gelöscht:\n\n" + "\n".join(removedWebChannels), MessageBox.TYPE_INFO, timeout=10)
						for webChannel in removedWebChannels:
							self.selected_sender = webChannel
							self.channelDelete(True)

					if not newWebChannels:
						SRLogger.writeLog("Die SerienRecorder Senderliste ist aktuell, es wurden keine neuen Sender bei Wunschliste gefunden.")
						self.session.open(MessageBox, "Es wurden keine neuen Sender bei Wunschliste gefunden.", MessageBox.TYPE_INFO, timeout=10)
						self.showChannels()
					else:
						newChannelsMessage = "Folgende Sender wurden neu bei Wunschliste gefunden:\n" + "\n".join(newWebChannels)
						SRLogger.writeLog(newChannelsMessage, True)
						self.session.open(MessageBox, "Folgende Sender wurden neu bei Wunschliste gefunden,\nsie wurden am Ende der Liste eingefügt:\n\n" + "\n".join(newWebChannels), MessageBox.TYPE_INFO, timeout=10)
						channels = []
						for webChannel in newWebChannels:
							channels.append((webChannel, "", "", 0))
							self.serienRecChannelList.append((webChannel, "", "", "0"))
						self.database.addChannels(channels)

			else:
				print("[SerienRecorder] webChannel list leer.")

			if len(self.serienRecChannelList) != 0:
				self.chooseMenuList.setList(list(map(self.buildList, self.serienRecChannelList)))
			else:
				print("[SerienRecorder] Fehler bei der Erstellung der SerienRecChlist.")

		else:
			print("[SerienRecorder] get webChannel error.")

		self['title'].setText("Wunschliste-Sender / Box-Sender")

	@staticmethod
	def getMissingWebChannels(webChannels, dbChannels):
		added = []
		removed = []

		dbWebChannels = [x[0] for x in dbChannels]

		# append missing (new) channels
		for webChannel in webChannels:
			if webChannel not in [dbWebChannel for dbWebChannel in dbWebChannels]:
				added.append(toStr(webChannel))

		# append removed channels
		for dbWebChannel in dbWebChannels:
			if dbWebChannel not in [webChannel for webChannel in webChannels]:
				removed.append(dbWebChannel)

		return added, removed

	@staticmethod
	def getUnassignedWebChannels(dbChannels):
		result = []

		#append unassigned
		for x in dbChannels:
			if not x[1]:
				result.append(x[0])

		return result

	def findWebChannelInSTBChannels(self, webChannel):
		from difflib import SequenceMatcher

		result = (None, None)
		channelFound = False

		# Try to find the HD version first
		webChannelHD = webChannel + " HD"
		for servicename,serviceref in self.stbChannelList:
			ratio = SequenceMatcher(None, webChannelHD.lower(), servicename.lower()).ratio()
			if ratio >= 0.98:
				result = (servicename, serviceref)
				channelFound = True
				break

		if not channelFound:
			for servicename,serviceref in self.stbChannelList:
				ratio = SequenceMatcher(None, webChannel.lower(), servicename.lower()).ratio()
				if ratio >= 0.98:
					result = (servicename, serviceref)
					break

		return result

	@staticmethod
	def buildList(entry):
		(webSender, stbSender, altstbSender, status) = entry
		serienRecMainPath = os.path.dirname(__file__)
		if int(status) == 0:
			imageStatus = "%s/images/minus.png" % serienRecMainPath
		else:
			imageStatus = "%s/images/plus.png" % serienRecMainPath

		return [entry,
			(eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 7 * skinFactor, 16 * skinFactor, 16 * skinFactor, loadPNG(imageStatus)),
			(eListboxPythonMultiContent.TYPE_TEXT, 40 * skinFactor, 0, 300 * skinFactor, 26 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, webSender),
			(eListboxPythonMultiContent.TYPE_TEXT, 350 * skinFactor, 0, 250 * skinFactor, 26 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, stbSender),
			(eListboxPythonMultiContent.TYPE_TEXT, 600 * skinFactor, 0, 250 * skinFactor, 26 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, altstbSender, parseColor('yellow').argb())
			]

	@staticmethod
	def buildList_popup(entry):
		(servicename,serviceref) = entry
		return [entry,
			(eListboxPythonMultiContent.TYPE_TEXT, 5, 1, 250 * skinFactor, 25 * skinFactor, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, servicename)
			]

	def keyOK(self):
		if self['list'].getCurrent() is None:
			print("[SerienRecorder] Sender-Liste leer.")
			return

		if self.modus == "list":
			self.modus = "popup_list"
			self['popup_list'].show()
			self['popup_bg'].show()
			if config.plugins.serienRec.selectBouquets.value:
				self.stbChannelList = STBHelpers.buildSTBChannelList(config.plugins.serienRec.MainBouquet.value)
			else:
				self.stbChannelList = STBHelpers.buildSTBChannelList()
			self.stbChannelList.insert(0, ("", ""))
			self.chooseMenuList_popup.setList(list(map(self.buildList_popup, self.stbChannelList)))
			idx = 0
			(stbChannel, altstbChannel) = self.database.getSTBChannel(self['list'].getCurrent()[0][0])
			if stbChannel:
				try:
					idx = list(zip(*self.stbChannelList))[0].index(stbChannel)
				except:
					pass
			self['popup_list'].moveToIndex(idx)
			self['title'].setText("Standard STB-Sender für %s:" % self['list'].getCurrent()[0][0])
		elif config.plugins.serienRec.selectBouquets.value:
			if self.modus == "popup_list":
				self.modus = "popup_list2"
				self['popup_list'].hide()
				self['popup_list2'].show()
				self['popup_bg'].show()
				self.stbChannelList = STBHelpers.buildSTBChannelList(config.plugins.serienRec.AlternativeBouquet.value)
				self.stbChannelList.insert(0, ("", ""))
				self.chooseMenuList_popup2.setList(list(map(self.buildList_popup, self.stbChannelList)))
				idx = 0
				(stbChannel, altstbChannel) = self.database.getSTBChannel(self['list'].getCurrent()[0][0])
				if stbChannel:
					try:
						idx = list(zip(*self.stbChannelList))[0].index(altstbChannel)
					except:
						pass
				self['popup_list2'].moveToIndex(idx)
				self['title'].setText("alternativer Box-Sender für %s:" % self['list'].getCurrent()[0][0])
			else:
				self.modus = "list"
				self['popup_list'].hide()
				self['popup_list2'].hide()
				self['popup_bg'].hide()

				if self['list'].getCurrent() is None or self['popup_list'].getCurrent() is None:
					return

				chlistSender = self['list'].getCurrent()[0][0]
				stbSender = self['popup_list'].getCurrent()[0][0]
				stbRef = self['popup_list'].getCurrent()[0][1]
				altstbSender = self['popup_list2'].getCurrent()[0][0]
				altstbRef = self['popup_list2'].getCurrent()[0][1]
				print("[SerienRecorder] select:", chlistSender, stbSender, stbRef, altstbSender, altstbRef)
				channels = []
				if stbSender != "" or altstbSender != "":
					channels.append((stbSender, stbRef, altstbSender, altstbRef, 1, chlistSender.lower()))
				else:
					channels.append((stbSender, stbRef, altstbSender, altstbRef, 0, chlistSender.lower()))
				self.database.updateChannels(channels, True)
				self.changesMade = True
				self['title'].setText("Sender zuordnen")
				self.showChannels()
		else:
			self.modus = "list"
			self['popup_list'].hide()
			self['popup_list2'].hide()
			self['popup_bg'].hide()

			if self['list'].getCurrent() is None:
				print("[SerienRecorder] Sender-Liste leer (list).")
				return

			if self['popup_list'].getCurrent() is None:
				print("[SerienRecorder] Sender-Liste leer (popup_list).")
				return

			chlistSender = self['list'].getCurrent()[0][0]
			stbSender = self['popup_list'].getCurrent()[0][0]
			stbRef = self['popup_list'].getCurrent()[0][1]
			print("[SerienRecorder] select:", chlistSender, stbSender, stbRef)
			channels = []
			if stbSender != "":
				channels.append((stbSender, stbRef, 1, chlistSender.lower()))
			else:
				channels.append((stbSender, stbRef, 0, chlistSender.lower()))
			self.database.updateChannels(channels)
			self.changesMade = True
			self['title'].setText("Sender zuordnen")
			self.showChannels()

	def keyRed(self):
		if self['list'].getCurrent() is None:
			print("[SerienRecorder] Sender-Liste leer.")
			return

		if self.modus == "list":
			chlistSender = self['list'].getCurrent()[0][0]

			self.database.changeChannelStatus(chlistSender)
			self['title'].instance.setForegroundColor(parseColor("red"))
			self['title'].setText("")
			self['title'].setText("Sender '- %s -' wurde geändert." % chlistSender)

			self.changesMade = True
			self['title'].instance.setForegroundColor(parseColor("foreground"))
			self.showChannels()

	def keyGreen(self):
		self.session.openWithCallback(self.channelReset, MessageBox, "Senderliste aktualisieren?", MessageBox.TYPE_YESNO)

	def channelReset(self, execute):
		if execute:
			print("[SerienRecorder] channel-list reset...")
			SRLogger.writeLog("Senderliste wird aktualisiert...")

			if config.plugins.serienRec.selectBouquets.value:
				self.stbChannelList = STBHelpers.buildSTBChannelList(config.plugins.serienRec.MainBouquet.value)
			else:
				self.stbChannelList = STBHelpers.buildSTBChannelList()
			self['title'].setText("Lade Wunschliste-Sender...")

			def downloadWebChannels():
				return SeriesServer().doGetWebChannels()
			def onDownloadWebChannelsSuccessful(result):
				self.createWebChannels(result, False)
				self.database.setChannelListLastUpdate()
			def onDownloadWebChannelsFailed():
				self['title'].setText("Fehler beim Laden der Wunschliste-Sender")
				SRLogger.writeLog("Fehler beim Laden der Senderliste vom SerienServer.", True)

			import twisted.python.runtime
			if twisted.python.runtime.platform.supportsThreads():
				from twisted.internet.threads import deferToThread
				deferToThread(downloadWebChannels).addCallback(onDownloadWebChannelsSuccessful).addErrback(onDownloadWebChannelsFailed)
			else:
				try:
					result = downloadWebChannels()
					onDownloadWebChannelsSuccessful(result)
				except:
					onDownloadWebChannelsFailed()
		else:
			print("[SerienRecorder] channel-list ok.")

	def keyBlue(self):
		self.session.openWithCallback(self.autoMatch, MessageBox, "Es wird versucht, für alle nicht zugeordneten Wunschliste-Sender, einen passenden Box-Sender zu finden, dabei werden zunächst HD Sender bevorzugt.\n\nDies kann, je nach Umfang der Senderliste, einige Zeit (u.U. einige Minuten) dauern - bitte haben Sie Geduld!\n\nAutomatische Zuordnung jetzt durchführen?", MessageBox.TYPE_YESNO)

	def autoMatch(self, execute):
		if execute:
			if config.plugins.serienRec.selectBouquets.value:
				self.stbChannelList = STBHelpers.buildSTBChannelList(config.plugins.serienRec.MainBouquet.value)
			else:
				self.stbChannelList = STBHelpers.buildSTBChannelList()
			self['title'].setText("Versuche automatische Zuordnung...")

			def downloadWebChannels():
				return SeriesServer().doGetWebChannels()
			def onDownloadWebChannelsSuccessful(result):
				self.createWebChannels(result, True)
				self.database.setChannelListLastUpdate()
			def onDownloadWebChannelsFailed():
				self['title'].setText("Fehler beim Laden der Wunschliste-Sender")
				SRLogger.writeLog("Fehler beim Laden der Senderliste vom SerienServer.", True)

			import twisted.python.runtime
			if twisted.python.runtime.platform.supportsThreads():
				from twisted.internet.threads import deferToThread
				deferToThread(downloadWebChannels).addCallback(onDownloadWebChannelsSuccessful).addErrback(onDownloadWebChannelsFailed)
			else:
				try:
					result = downloadWebChannels()
					onDownloadWebChannelsSuccessful(result)
				except:
					onDownloadWebChannelsFailed()

	def keyRedLong(self):
		if self['list'].getCurrent() is None:
			print("[SerienRecorder] Sender Tabelle leer.")
			return
		else:
			self.selected_sender = self['list'].getCurrent()[0][0]
			if config.plugins.serienRec.confirmOnDelete.value:
				self.session.openWithCallback(self.channelDelete, MessageBox, "Soll '%s' wirklich entfernt werden?" % self.selected_sender, MessageBox.TYPE_YESNO, default = False)
			else:
				self.channelDelete(True)

	def channelDelete(self, answer):
		if not answer:
			return
		self.database.removeChannel(self.selected_sender)
		self.changesMade = True
		self['title'].instance.setForegroundColor(parseColor("red"))
		self['title'].setText("Sender '- %s -' entfernt." % self.selected_sender)
		self.showChannels()

	def resetChannelList(self):
		if config.plugins.serienRec.confirmOnDelete.value:
			self.session.openWithCallback(self.channelDeleteAll, MessageBox,
			                              "Sollen wirklich alle Senderzuordnungen entfernt werden?",
			                              MessageBox.TYPE_YESNO, default=False)
		else:
			self.channelDeleteAll(True)

	def channelDeleteAll(self, answer):
		if not answer:
			return
		self.database.removeAllChannels()
		self.changesMade = True
		self['title'].instance.setForegroundColor(parseColor("red"))
		self['title'].setText("Alle Senderzuordnungen entfernt.")
		self.showChannels()

	def setMenuKeyText(self):
		if self['list'].getCurrent() is None:
			print("[SerienRecorder] Sender Tabelle leer.")
			return
		else:
			status = self['list'].getCurrent()[0][3]
			if int(status) == 0:
				self['text_red'].setText("Ein/Löschen")
			else:
				self['text_red'].setText("Aus/Löschen")

	def keyLeft(self):
		self[self.modus].pageUp()
		self.setMenuKeyText()

	def keyRight(self):
		self[self.modus].pageDown()
		self.setMenuKeyText()

	def keyDown(self):
		self[self.modus].down()
		self.setMenuKeyText()

	def keyUp(self):
		self[self.modus].up()
		self.setMenuKeyText()

	def __onClose(self):
		self.stopDisplayTimer()

	def keyCancel(self):
		if self.modus == "popup_list":
			self.modus = "list"
			self['popup_list'].hide()
			self['popup_bg'].hide()
		elif self.modus == "popup_list2":
			self.modus = "list"
			self['popup_list2'].hide()
			self['popup_bg'].hide()
		else:
			self.close(self.changesMade)
Ejemplo n.º 52
0
class SkyRecorderArchiv(Screen):

	def __init__(self, session):
		self.session = session
		path = "%s/skins/%s/screen_archiv.xml" % (getPluginPath(), config.plugins.skyrecorder.anytime_skin.value)
		with open(path, "r") as f:
			self.skin = f.read()
			f.close()
		
		Screen.__init__(self, session)
		
		pluginName = config.plugins.skyrecorder.pluginname.value
		contentSize = config.plugins.skyrecorder.contentsize.value
		
		# try to get the ayntimefolder
		try:
			anytimefolder = config.plugins.skyrecorder.anytimefolder.value
		except Exception:
			sys.exc_clear()
			anytimefolder = resolveFilename(SCOPE_HDD)
		
		self.anytimefolder = anytimefolder
		
		self.serviceHandler = eServiceCenter.getInstance()
		
		self["actions"]  = ActionMap(["OkCancelActions", "ShortcutActions", "EPGSelectActions", "WizardActions", "ColorActions", "NumberActions", "MenuActions", "MoviePlayerActions"], {
			"ok" : self.keyOK,
			"cancel" : self.keyCancel,
			"up" : self.keyUp,
			"down" : self.keyDown,
			"right" : self.keySwitchList,
			"left" : self.keySwitchList,
			"red": self.keyRed,
			"green": self.keyGreen,
			"prevBouquet" : self.keyPageDown,
			"nextBouquet" : self.keyPageUp
		}, -1)
		
		# Genrelist
		self.showGenreList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.showGenreList.l.setFont(0, gFont('Regular', contentSize))
		self.showGenreList.l.setItemHeight(25)
		self['genreselect'] = self.showGenreList
		self['genreselect'].setList([])
		
		#Movielist
		self.showMovieList = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
		self.showMovieList.l.setFont(0, gFont('Regular', contentSize))
		self.showMovieList.l.setItemHeight(25)
		self['movieselect'] = self.showMovieList
		self['movieselect'].setList([])
		
		# Auswahl der liste welche als erstes angezeigt werden soll
		self["genreselect"].selectionEnabled(0)
		self["movieselect"].selectionEnabled(1)
		self.currentList = "movieselect"
		
		self['mainselect'] = Label("SkyRecorder Archiv")
		self['handlung'] = Label("")
		
		self.onLayoutFinish.append(self.getGenreList)
		self['movieselect'].onSelectionChanged.append(self.showDetails)
		
		
	def skyAnytimeGenreListEntry(self,entry):
		neu  = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/neu.png"
		return [entry,
			(eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 210, 40, 0, RT_HALIGN_CENTER, str(entry))
			]

	def skyAnytimeMovieListEntry(self,entry):
		neu  = "/usr/lib/enigma2/python/Plugins/Extensions/skyrecorder/images/neu.png"
		begin_date = time.strftime("%d.%m.%Y %H:%M", time.localtime(float(entry[2])))
		return [entry,
			(eListboxPythonMultiContent.TYPE_TEXT, 50, 0, 200, 25, 0, RT_HALIGN_LEFT, str(begin_date)),
			(eListboxPythonMultiContent.TYPE_TEXT, 250, 0, 445, 25, 0, RT_HALIGN_LEFT, str(entry[0])),
			(eListboxPythonMultiContent.TYPE_TEXT, 700, 0, 200, 25, 0, RT_HALIGN_LEFT, str(entry[1]))
			]


	def showDetails(self):
		self['handlung'].setText(" ")
		if len(self.movielist) < 1:
			return

		try:
			serviceref = self['movieselect'].getCurrent()[0][4]
		except Exception:
			return
		
		if not serviceref:
			return
		
		try:
			info = self.serviceHandler.info(serviceref)
			title = info.getName(serviceref)	
			filminfo = info.getEvent(serviceref).getExtendedDescription()
		except Exception:
			return
		self['handlung'].setText(filminfo)


	def getMyDirs(self, my_folder = None, max_depth = 3, my_group="A-Z"):
		self.movielist = []
		
		if not my_folder or not os.path.isdir(my_folder):
			my_folder = self.anytimefolder
		
		my_dirs = []
		my_dirs.append(my_folder) # append base folder
		n = 0
		for root, dirs, files in os.walk(my_folder):
			if len(dirs) != 0:
				n += 1
				for a_dir in dirs:
					if a_dir[-1:] != "/":
						a_dir += "/"
					my_dirs.append(os.path.join(root, a_dir))
			if n == max_depth:
				break
		
		self.loadFiles(my_dirs, my_group)


	def loadFiles(self, my_dirs = None, my_group="A-Z"):
		
		self['handlung'].setText(" ")
		self.movielist = [ ]
		
		if not my_dirs:
			return
		
		my_list = None
		tags = set()
		
		for a_dir in my_dirs:
			if not os.path.isdir(a_dir):
				continue
			
			root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + a_dir)
			my_list = self.serviceHandler.list(root)
			if my_list is None:
				#print "listing of movies failed"
				continue
			
			# get current folder name for group mapping
			if a_dir[-1:] != "/":
				basedir_name = a_dir.split('/')[-1:][0]
			else:
				basedir_name = a_dir.split('/')[-2:-1][0] # -2 is true, because we have a leading slash in a_dir string
							
			while 1:
				serviceref = my_list.getNext()
				if not serviceref.valid():
					break
				
				filetype = serviceref.toString().split('.')
				filetype = filetype[-1].lower()
				if not filetype in MEDIAFILES_MOVIE:
					continue
				
				info = self.serviceHandler.info(serviceref)
				if info is None:
					continue
				
				begin = info.getInfo(serviceref, iServiceInformation.sTimeCreate)
				description = info.getInfoString(serviceref, iServiceInformation.sDescription)
				moviefile = os.path.realpath(serviceref.getPath())
				title = info.getName(serviceref)
				#channel = ServiceReference(info.getInfoString(parent, iServiceInformation.sServiceref)).getServiceName()	# Sender
				
				if my_group != "A-Z":
					if not basedir_name == my_group: # skip this folder, if the name does not match our group and we are not in A-Z
						group_check = None
						group_check = sql.getGenregroupByGenre(description)
						if not group_check or my_group != group_check:
							continue

				# convert space-seperated list of tags into a set
				this_tags = info.getInfoString(serviceref, iServiceInformation.sTags).split(' ')
				if this_tags == ['']:
					this_tags = []
				this_tags = set(this_tags)
				tags |= this_tags
			
				self.movielist.append((title, description, begin, moviefile, serviceref))
				
		if len(self.movielist) < 1:
			self.keySwitchList(set_list="genreselect")
			self.showMovieList.setList([ ])
		else:
			if my_group != "A-Z":
				self.movielist.sort(key=lambda x: -x[2]) # sort by date and time, if we are not in A-Z
			else:
				self.movielist = sorted(self.movielist, key=lambda x: x[0], reverse=False)
			self.showMovieList.setList(map(self.skyAnytimeMovieListEntry, self.movielist))
			self.keySwitchList(set_list="movieselect")

	
	def getGenreList(self):
		# get groupnames
		self.groupnames = []
		self.groupnames.append(("A-Z"))
		rows = sql.readGroupsShort()
		for t_row in rows:
			row = list(t_row)
			self.groupnames.append(row[1])
		self.showGenreList.setList(map(self.skyAnytimeGenreListEntry, self.groupnames))
		
		#self.loadFiles("A-Z")
		self.getMyDirs(self.anytimefolder, 3, "A-Z")
		
	def keySwitchList(self,set_list=None):
		if set_list:
			if set_list == "movieselect":
				if len(self.movielist) < 1:
					return
				self["genreselect"].selectionEnabled(0)
				self["movieselect"].selectionEnabled(1)
				self.currentList = set_list
			else:
				self["movieselect"].selectionEnabled(0)
				self["genreselect"].selectionEnabled(1)
				self.currentList = set_list
		else:
			if self.currentList == "genreselect":
				self["genreselect"].selectionEnabled(0)
				self["movieselect"].selectionEnabled(1)
				self.currentList = "movieselect"
			else:
				self["movieselect"].selectionEnabled(0)
				self["genreselect"].selectionEnabled(1)
				self.currentList = "genreselect"
			
	def keyPageDown(self):
		exist = self[self.currentList].getCurrent()
		if exist == None:
			return
		self[self.currentList].pageDown()
		
	def keyPageUp(self):
		exist = self[self.currentList].getCurrent()
		if exist == None:
			return
		self[self.currentList].pageUp()
		
	def skysettings(self):
		pass

	def keyLeft(self):
		pass
		exist = self[self.currentList].getCurrent()
		if exist == None:
			return
		self[self.currentList].pageUp()

	def keyRight(self):
		pass
		exist = self[self.currentList].getCurrent()
		if exist == None:
			return
		self[self.currentList].pageDown()

	def keyUp(self):
		exist = self[self.currentList].getCurrent()
		if exist == None:
			return	
		self[self.currentList].up()


	def keyDown(self):
		exist = self[self.currentList].getCurrent()
		if exist == None:
			return	
		self[self.currentList].down()


	def keyRed(self):
		#pass
		self.close()

	def keyGreen(self):
		#pass
		self.keyOK()

	def keyYellow(self):
		pass

	def keyBlue(self):
		self.close()

	def keyOK(self):
		if self.currentList == "genreselect":
			exist = self['genreselect'].getCurrent()
			if exist == None:
				return
			genre_auswahl = self['genreselect'].getCurrent()[0]
			#self.loadFiles(genre_auswahl)
			self.getMyDirs(self.anytimefolder, 3, genre_auswahl)
			
		else:
			exist = self['movieselect'].getCurrent()
			if exist == None:
				return
			title = self['movieselect'].getCurrent()[0][0]
			file = self['movieselect'].getCurrent()[0][3]
			if fileExists(file):
				self.play(title, file)
			else:
				print "Aufnahme nicht vorhanden."
				message = self.session.open(MessageBox, _("Die Aufnahme ist noch nicht vorhanden.\n'{0}'".format(file)), MessageBox.TYPE_INFO, timeout=-1)
			
			
	def play(self,title,file):
		sref = eServiceReference(1, 0, file)
		sref.setName(title)
		self.mp = self.session.open(MoviePlayer, sref)
		self.mp.leavePlayer = self.leavePlayerForced # overwrite MoviePlayer leave function
	
	def leavePlayerForced(self):
		self.mp.leavePlayerConfirmed([True, "quit"])
		
	def keyCancel(self):
		self.close()