X-Git-Url: https://git.cweiske.de/enigma2-curlytx.git/blobdiff_plain/faa10042694d9e596797d1d80e1eae53bcf12bcf..14252bfaadaacc1d9afc1c1971eae0f1a1b30eed:/src/CurlyTx.py diff --git a/src/CurlyTx.py b/src/CurlyTx.py index e37c32c..3e74c5e 100644 --- a/src/CurlyTx.py +++ b/src/CurlyTx.py @@ -1,33 +1,47 @@ +# -*- coding: utf-8 -*- +# CurlyTx main window +# Copyright (C) 2011 Christian Weiske +# License: GPLv3 or later + from . import _ from Screens.Screen import Screen from Screens.HelpMenu import HelpableScreen -from Screens.MessageBox import MessageBox from Components.Label import Label from Components.ScrollLabel import ScrollLabel -from Components.ActionMap import NumberActionMap +from Components.ActionMap import ActionMap from Components.Sources.StaticText import StaticText +from Tools import Directories from twisted.web import client +from twisted.web.client import _makeGetterFactory, HTTPClientFactory +from enigma import gFont from . import config +from config import createPage, loadDefaultPageOptions, feedPagesToConfig, feedSettingsToConfig, savePageConfig from Components.config import config -class CurlyTx(Screen,HelpableScreen): +import os + +class CurlyTx(Screen, HelpableScreen): skin = """ - + - - - - - + + + + + """ currentUrl = None currentPage = None + currentFontSize = 20 + httpGetterFactory = None + showingHeaders = False + staticPageFeedFile = 'curlytx-pagefeed.xml' def __init__(self, session, args = None): #self.skin = CurlyTx.skin @@ -43,8 +57,8 @@ class CurlyTx(Screen,HelpableScreen): self["key_blue"] = StaticText(_("Next")) - self["actions"] = NumberActionMap( - ["WizardActions", "ColorActions", "InputActions", "HelpActions"], { + self["actions"] = ActionMap( + ["WizardActions", "ColorActions", "InputActions", "InfobarEPGActions"], { "ok": self.close, "back": self.close, "up": self.pageUp, @@ -53,10 +67,18 @@ class CurlyTx(Screen,HelpableScreen): "red": self.showSettings, "green": self.reload, "yellow": self.prevPage, - "blue": self.nextPage + "blue": self.nextPage, + + "showEventInfo": self.showHeader }, -1) self.loadHelp() + self.loadButtons() + self.onFirstExecBegin.append(self.afterLayout) + + def afterLayout(self): + self.setTextFont + self.loadStaticConfig() self.loadUrl(config.plugins.CurlyTx.defaultPage.value) def loadHelp(self): @@ -66,6 +88,9 @@ class CurlyTx(Screen,HelpableScreen): self.helpList.append(( self["actions"], "WizardActions", [("down", _("Scroll page contents down"))])) + self.helpList.append(( + self["actions"], "InfobarEPGActions", + [("showEventInfo", _("Show HTTP response headers"))])) self.helpList.append(( self["actions"], "ColorActions", [("red", _("Show program settings"))])) @@ -84,9 +109,26 @@ class CurlyTx(Screen,HelpableScreen): self.helpList.append(( self["actions"], "WizardActions", [("back", _("Close window"))])) - self.helpList.append(( - self["actions"], "HelpActions", - [("displayHelp", _("Show this help screen"))])) + + def loadButtons(self): + pageCount = len(config.plugins.CurlyTx.pages) + if pageCount == 0: + self["key_green"].setText("") + self["key_yellow"].setText("") + self["key_blue"].setText("") + elif pageCount == 1: + self["key_green"].setText(_("Reload")) + self["key_yellow"].setText("") + self["key_blue"].setText("") + else: + self["key_green"].setText(_("Reload")) + self["key_yellow"].setText(_("Prev")) + self["key_blue"].setText(_("Next")) + + if config.plugins.CurlyTx.enableSettings.getValue(): + self["key_red"].setText(_("Settings")) + else: + self["key_red"].setText("") def pageUp(self): self["text"].pageUp() @@ -119,48 +161,145 @@ class CurlyTx(Screen,HelpableScreen): self.loadUrl(self.currentPage) def loadUrl(self, pageId): + self.httpGetterFactory = None if pageId == None: self.loadNoPage() return + cfg = config.plugins.CurlyTx + pageCount = len(cfg.pages) pageId = int(pageId) - if pageId > (len(config.plugins.CurlyTx.pages) - 1): - if len(config.plugins.CurlyTx.pages) == 0: + if pageId > (pageCount - 1): + if len(cfg.pages) == 0: self.loadNoPage() else: - self["text"].setText("Invalid page " + pageId); + self["text"].setText(_("Invalid page") + " " + pageId); return - url = config.plugins.CurlyTx.pages[pageId].uri.value - title = config.plugins.CurlyTx.pages[pageId].title.value + url = cfg.pages[pageId].uri.value + title = cfg.pages[pageId].title.value + + if pageCount > 1: + title = "{0} [{1}/{2}]".format(title, pageId + 1, pageCount) + self.currentPage = pageId self.currentUrl = url + self.currentFontSize = cfg.pages[pageId].fontSize.value self.setTitle(title) - self["text"].setText("Loading ...\n" + url); + self.setTextFont() + self["text"].setText(_("Loading ...") + "\n" + url); + + if (url.startswith('file://')): + self.loadLocalFile(url) + else: + self.getPageWebClient(url).addCallback(self.urlLoaded).addErrback(self.urlFailed, url) + + def loadLocalFile(self, url): + file = url[7:] + if not os.path.exists(file): + self.showFail('File does not exist', file) + return + + with open(file, 'r') as f: + self.urlLoaded(f.read()) - client.getPage(url).addCallback(self.urlLoaded).addErrback(self.urlFailed, url) + def setTextFont(self): + if self["text"].long_text is not None: + self["text"].long_text.setFont(gFont("Console", self.currentFontSize)) def urlLoaded(self, html): self["text"].setText(html) def urlFailed(self, error, url): + self.showFail(error.getErrorMessage(), url) + + def showFail(self, message, url): self["text"].setText( - "Error fetching URL:\n " + error.getErrorMessage() + _("Error fetching URL:") + "\n " + message + "\n\nURL: " + url ) def loadNoPage(self): - self["text"].setText("Go and add a page in the settings"); + self["text"].setText(_("Go and add a page in the settings")); + + def showHeader(self): + if not self.httpGetterFactory: + return + + if self.showingHeaders: + self["text"].setText(self.pageContent) + self.pageContent = None + self.showingHeaders = False + elif self.httpGetterFactory.response_headers: + headers = _("HTTP response headers for") + "\n" + self.currentUrl + "\n\n" + for (k, v) in self.httpGetterFactory.response_headers.items(): + headers += k + ": " + ("\n" + k + ": ").join(v) + "\n" + self.pageContent = self["text"].getText() + self["text"].setText(headers) + self.showingHeaders = True def showSettings(self): + if not config.plugins.CurlyTx.enableSettings.getValue(): + return + from CurlyTxSettings import CurlyTxSettings self.session.openWithCallback(self.onSettingsChanged, CurlyTxSettings) def onSettingsChanged(self): + self.loadButtons() if len(config.plugins.CurlyTx.pages) == 0: self.currentPage = None self.loadUrl(self.currentPage) elif self.currentPage == None: self.currentPage = 0 self.loadUrl(self.currentPage) + + + def getPageWebClient(self, url, contextFactory=None, *args, **kwargs): + """ + Download a web page as a string. + + COPY OF twisted.web.client.getPage to store the factory + + Download a page. Return a deferred, which will callback with a + page (as a string) or errback with a description of the error. + + See L{HTTPClientFactory} to see what extra arguments can be passed. + """ + self.httpGetterFactory = _makeGetterFactory( + url, + HTTPClientFactory, + contextFactory=contextFactory, + *args, **kwargs) + return self.httpGetterFactory.deferred + + def loadStaticConfig(self): + """ + Always try to load the static config file from + /etc/enigma2/curlytx-pagefeed.xml + """ + staticFeedPath = Directories.resolveFilename(Directories.SCOPE_CONFIG, self.staticPageFeedFile) + if not os.path.exists(staticFeedPath): + return + + from AtomFeed import AtomFeed + AtomFeed( + 'file://' + staticFeedPath, + self.saveStaticConfig, self.loadStaticConfigFail + ) + + def loadStaticConfigFail(self, errorMessage): + """ Loading the page url feed failed somehow """ + from Screens.MessageBox import MessageBox + self.session.open( + MessageBox, + _("Error loading page feed:") + "\n\n" + str(errorMessage), + type = MessageBox.TYPE_ERROR + ) + + def saveStaticConfig(self, pages, settings): + feedPagesToConfig(pages) + feedSettingsToConfig(settings) + savePageConfig() + self.loadButtons()