1 # -*- coding: utf-8 -*-
3 # Copyright (C) 2011 Christian Weiske <cweiske@cweiske.de>
4 # License: GPLv3 or later
8 from Screens.Screen import Screen
9 from Screens.HelpMenu import HelpableScreen
10 from Screens.MessageBox import MessageBox
11 from Components.Label import Label
12 from Components.ScrollLabel import ScrollLabel
13 from Components.ActionMap import ActionMap
14 from Components.Sources.StaticText import StaticText
15 from twisted.web import client
16 from twisted.web.client import _makeGetterFactory, HTTPClientFactory
17 from enigma import gFont
20 from Components.config import config
22 class CurlyTx(Screen,HelpableScreen):
24 <screen name="CurlyTx" position="center,center" size="560,430" title="CurlyTx" >
25 <ePixmap position="0,0" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
26 <ePixmap position="140,0" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
27 <ePixmap position="280,0" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
28 <ePixmap position="420,0" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
29 <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" />
30 <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" />
31 <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" />
32 <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" />
33 <widget name="text" position="5,45" size="550,380" font="Console;20" />
39 httpGetterFactory = None
40 showingHeaders = False
42 def __init__(self, session, args = None):
43 #self.skin = CurlyTx.skin
44 Screen.__init__(self, session)
45 HelpableScreen.__init__(self)
46 #self.skinName = [ "CurlyTx", "Setup" ]
48 self["text"] = ScrollLabel("foo")
50 self["key_red"] = StaticText(_("Settings"))
51 self["key_green"] = StaticText(_("Reload"))
52 self["key_yellow"] = StaticText(_("Prev"))
53 self["key_blue"] = StaticText(_("Next"))
56 self["actions"] = ActionMap(
57 ["WizardActions", "ColorActions", "InputActions", "InfobarEPGActions"], {
61 "down": self.pageDown,
63 "red": self.showSettings,
65 "yellow": self.prevPage,
66 "blue": self.nextPage,
68 "showEventInfo": self.showHeader
73 self.loadUrl(config.plugins.CurlyTx.defaultPage.value)
74 self.onLayoutFinish.append(self.setTextFont)
77 self.helpList.append((
78 self["actions"], "WizardActions",
79 [("up", _("Scroll page contents up"))]))
80 self.helpList.append((
81 self["actions"], "WizardActions",
82 [("down", _("Scroll page contents down"))]))
83 self.helpList.append((
84 self["actions"], "InfobarEPGActions",
85 [("showEventInfo", _("Show HTTP response headers"))]))
86 self.helpList.append((
87 self["actions"], "ColorActions",
88 [("red", _("Show program settings"))]))
89 self.helpList.append((
90 self["actions"], "ColorActions",
91 [("green", _("Reload current page URL"))]))
92 self.helpList.append((
93 self["actions"], "ColorActions",
94 [("yellow", _("Switch to next configured page URL"))]))
95 self.helpList.append((
96 self["actions"], "ColorActions",
97 [("blue", _("Switch to previous configured page URL"))]))
98 self.helpList.append((
99 self["actions"], "WizardActions",
100 [("ok", _("Close window"))]))
101 self.helpList.append((
102 self["actions"], "WizardActions",
103 [("back", _("Close window"))]))
104 self.helpList.append((
105 self["actions"], "HelpActions",
106 [("displayHelp", _("Show this help screen"))]))
108 def loadButtons(self):
109 pageCount = len(config.plugins.CurlyTx.pages)
111 self["key_green"].setText("")
112 self["key_yellow"].setText("")
113 self["key_blue"].setText("")
115 self["key_green"].setText(_("Reload"))
116 self["key_yellow"].setText("")
117 self["key_blue"].setText("")
119 self["key_green"].setText(_("Reload"))
120 self["key_yellow"].setText(_("Prev"))
121 self["key_blue"].setText(_("Next"))
124 self["text"].pageUp()
127 self["text"].pageDown()
130 if self.currentPage == None:
133 pageId = self.currentPage - 1
135 pageId = len(config.plugins.CurlyTx.pages) - 1
139 if self.currentPage == None:
142 pageId = self.currentPage + 1
143 if pageId > len(config.plugins.CurlyTx.pages) - 1:
148 if self.currentPage == None:
151 self.loadUrl(self.currentPage)
153 def loadUrl(self, pageId):
158 cfg = config.plugins.CurlyTx
159 pageCount = len(cfg.pages)
161 if pageId > (pageCount - 1):
162 if len(cfg.pages) == 0:
165 self["text"].setText(_("Invalid page") + " " + pageId);
168 url = cfg.pages[pageId].uri.value
169 title = cfg.pages[pageId].title.value
172 title = "{0} [{1}/{2}]".format(title, pageId + 1, pageCount)
174 self.currentPage = pageId
175 self.currentUrl = url
176 self.currentFontSize = cfg.pages[pageId].fontSize.value
180 self["text"].setText(_("Loading ...") + "\n" + url);
182 self.getPageWebClient(url).addCallback(self.urlLoaded).addErrback(self.urlFailed, url)
184 def setTextFont(self):
185 if self["text"].long_text is not None:
186 self["text"].long_text.setFont(gFont("Console", self.currentFontSize))
188 def urlLoaded(self, html):
189 self["text"].setText(html)
191 def urlFailed(self, error, url):
192 self["text"].setText(
193 _("Error fetching URL:") + "\n " + error.getErrorMessage()
197 def loadNoPage(self):
198 self["text"].setText(_("Go and add a page in the settings"));
200 def showHeader(self):
201 if self.showingHeaders:
202 self["text"].setText(self.pageContent)
203 self.pageContent = None
204 self.showingHeaders = False
205 elif self.httpGetterFactory.response_headers:
206 headers = _("HTTP response headers for") + "\n" + self.currentUrl + "\n\n"
207 for (k, v) in self.httpGetterFactory.response_headers.items():
208 headers += k + ": " + ("\n" + k + ": ").join(v) + "\n"
209 self.pageContent = self["text"].getText()
210 self["text"].setText(headers)
211 self.showingHeaders = True
213 def showSettings(self):
214 from CurlyTxSettings import CurlyTxSettings
215 self.session.openWithCallback(self.onSettingsChanged, CurlyTxSettings)
217 def onSettingsChanged(self):
219 if len(config.plugins.CurlyTx.pages) == 0:
220 self.currentPage = None
221 self.loadUrl(self.currentPage)
222 elif self.currentPage == None:
224 self.loadUrl(self.currentPage)
227 def getPageWebClient(self, url, contextFactory=None, *args, **kwargs):
229 Download a web page as a string.
231 COPY OF twisted.web.client.getPage to store the factory
233 Download a page. Return a deferred, which will callback with a
234 page (as a string) or errback with a description of the error.
236 See L{HTTPClientFactory} to see what extra arguments can be passed.
238 self.httpGetterFactory = _makeGetterFactory(
241 contextFactory=contextFactory,
243 return self.httpGetterFactory.deferred