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()
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)
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,))
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)
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))
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
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 ]
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)
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 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()
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))
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)
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()
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)
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()
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()
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)
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,))
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()
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()
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()
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()
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()
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()
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)
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()
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)
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]
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()
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)
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()
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()
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()
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)
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()
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)
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()