do not reload curlytx on startup
[enigma2-curlytx.git] / src / CurlyTx.py
1 # -*- coding: utf-8 -*-
2 # CurlyTx main window
3 # Copyright (C) 2011 Christian Weiske <cweiske@cweiske.de>
4
5 from . import _
6
7 from Screens.Screen import Screen
8 from Screens.HelpMenu import HelpableScreen
9 from Screens.MessageBox import MessageBox
10 from Components.Label import Label
11 from Components.ScrollLabel import ScrollLabel
12 from Components.ActionMap import ActionMap
13 from Components.Sources.StaticText import StaticText
14 from twisted.web import client
15 from twisted.web.client import _makeGetterFactory, HTTPClientFactory
16 from enigma import gFont
17
18 from . import config
19 from Components.config import config
20
21 class CurlyTx(Screen,HelpableScreen):
22     skin = """
23         <screen name="CurlyTx" position="center,center" size="560,400" title="CurlyTx" >
24           <ePixmap position="0,0" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
25           <ePixmap position="140,0" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
26           <ePixmap position="280,0" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
27           <ePixmap position="420,0" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
28           <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" shadowColor="black" shadowOffset="-1,-1" />
29           <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" shadowColor="black" shadowOffset="-1,-1" />
30           <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" shadowColor="black" shadowOffset="-1,-1" />
31           <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" shadowColor="black" shadowOffset="-1,-1" />
32           <widget name="text" position="5,45" size="550,350" font="Console;20" />
33         </screen>"""
34
35     currentUrl = None
36     currentPage = None
37     currentFontSize = 20
38     httpGetterFactory = None
39     showingHeaders = False
40
41     def __init__(self, session, args = None):
42         #self.skin = CurlyTx.skin
43         Screen.__init__(self, session)
44         HelpableScreen.__init__(self)
45         #self.skinName = [ "CurlyTx", "Setup" ]
46
47         self["text"] = ScrollLabel("foo")
48
49         self["key_red"]    = StaticText(_("Settings"))
50         self["key_green"]  = StaticText(_("Reload"))
51         self["key_yellow"] = StaticText(_("Prev"))
52         self["key_blue"]   = StaticText(_("Next"))
53
54
55         self["actions"] = ActionMap(
56             ["WizardActions", "ColorActions", "InputActions", "InfobarEPGActions"], {
57                 "ok":   self.close,
58                 "back": self.close,
59                 "up":   self.pageUp,
60                 "down": self.pageDown,
61
62                 "red":    self.showSettings,
63                 "green":  self.reload,
64                 "yellow": self.prevPage,
65                 "blue":   self.nextPage,
66
67                 "showEventInfo": self.showHeader
68             }, -1)
69
70         self.loadHelp()
71         self.loadButtons()
72         self.loadUrl(config.plugins.CurlyTx.defaultPage.value)
73         self.onLayoutFinish.append(self.setTextFont)
74
75     def loadHelp(self):
76         self.helpList.append((
77                 self["actions"], "WizardActions",
78                 [("up", _("Scroll page contents up"))]))
79         self.helpList.append((
80                 self["actions"], "WizardActions",
81                 [("down", _("Scroll page contents down"))]))
82         self.helpList.append((
83                 self["actions"], "InfobarEPGActions",
84                 [("showEventInfo", _("Show HTTP response headers"))]))
85         self.helpList.append((
86                 self["actions"], "ColorActions",
87                 [("red", _("Show program settings"))]))
88         self.helpList.append((
89                 self["actions"], "ColorActions",
90                 [("green", _("Reload current page URL"))]))
91         self.helpList.append((
92                 self["actions"], "ColorActions",
93                 [("yellow", _("Switch to next configured page URL"))]))
94         self.helpList.append((
95                 self["actions"], "ColorActions",
96                 [("blue", _("Switch to previous configured page URL"))]))
97         self.helpList.append((
98                 self["actions"], "WizardActions",
99                 [("ok", _("Close window"))]))
100         self.helpList.append((
101                 self["actions"], "WizardActions",
102                 [("back", _("Close window"))]))
103         self.helpList.append((
104                 self["actions"], "HelpActions",
105                 [("displayHelp", _("Show this help screen"))]))
106
107     def loadButtons(self):
108         pageCount = len(config.plugins.CurlyTx.pages)
109         if pageCount == 0:
110             self["key_green"].setText("")
111             self["key_yellow"].setText("")
112             self["key_blue"].setText("")
113         elif pageCount == 1:
114             self["key_green"].setText(_("Reload"))
115             self["key_yellow"].setText("")
116             self["key_blue"].setText("")
117         else:
118             self["key_green"].setText(_("Reload"))
119             self["key_yellow"].setText(_("Prev"))
120             self["key_blue"].setText(_("Next"))
121
122     def pageUp(self):
123         self["text"].pageUp()
124
125     def pageDown(self):
126         self["text"].pageDown()
127
128     def prevPage(self):
129         if self.currentPage == None:
130             return
131
132         pageId = self.currentPage - 1
133         if pageId < 0:
134             pageId = len(config.plugins.CurlyTx.pages) - 1
135         self.loadUrl(pageId)
136
137     def nextPage(self):
138         if self.currentPage == None:
139             return
140
141         pageId = self.currentPage + 1
142         if pageId > len(config.plugins.CurlyTx.pages) - 1:
143             pageId = 0
144         self.loadUrl(pageId)
145
146     def reload(self):
147         if self.currentPage == None:
148             return
149
150         self.loadUrl(self.currentPage)
151
152     def loadUrl(self, pageId):
153         if pageId == None:
154             self.loadNoPage()
155             return
156
157         cfg = config.plugins.CurlyTx
158         pageCount = len(cfg.pages)
159         pageId = int(pageId)
160         if pageId > (pageCount - 1):
161             if len(cfg.pages) == 0:
162                 self.loadNoPage()
163             else:
164                 self["text"].setText(_("Invalid page") + " " + pageId);
165             return
166
167         url   = cfg.pages[pageId].uri.value
168         title = cfg.pages[pageId].title.value
169
170         if pageCount > 1:
171             title = "{0} [{1}/{2}]".format(title, pageId + 1, pageCount)
172
173         self.currentPage = pageId
174         self.currentUrl = url
175         self.currentFontSize = cfg.pages[pageId].fontSize.value
176
177         self.setTitle(title)
178         self.setTextFont()
179         self["text"].setText(_("Loading ...") + "\n" + url);
180
181         self.getPageWebClient(url).addCallback(self.urlLoaded).addErrback(self.urlFailed, url)
182
183     def setTextFont(self):
184         if self["text"].long_text is not None:
185             self["text"].long_text.setFont(gFont("Console", self.currentFontSize))
186
187     def urlLoaded(self, html):
188         self["text"].setText(html)
189
190     def urlFailed(self, error, url):
191         self["text"].setText(
192             _("Error fetching URL:") + "\n " + error.getErrorMessage()
193             + "\n\nURL: " + url
194             )
195
196     def loadNoPage(self):
197         self["text"].setText(_("Go and add a page in the settings"));
198
199     def showHeader(self):
200         if self.showingHeaders:
201             self["text"].setText(self.pageContent)
202             self.pageContent    = None
203             self.showingHeaders = False
204         else:
205             headers = _("HTTP response headers for") + "\n" + self.currentUrl + "\n\n"
206             for (k, v) in self.httpGetterFactory.response_headers.items():
207                 headers += k + ": " + ("\n" + k + ": ").join(v) + "\n"
208             self.pageContent = self["text"].getText()
209             self["text"].setText(headers)
210             self.showingHeaders = True
211
212     def showSettings(self):
213         from CurlyTxSettings import CurlyTxSettings
214         self.session.openWithCallback(self.onSettingsChanged, CurlyTxSettings)
215
216     def onSettingsChanged(self):
217         self.loadButtons()
218         if len(config.plugins.CurlyTx.pages) == 0:
219             self.currentPage = None
220             self.loadUrl(self.currentPage)
221         elif self.currentPage == None:
222             self.currentPage = 0
223             self.loadUrl(self.currentPage)
224
225
226     def getPageWebClient(self, url, contextFactory=None, *args, **kwargs):
227         """
228         Download a web page as a string.
229
230         COPY OF twisted.web.client.getPage to store the factory
231
232         Download a page. Return a deferred, which will callback with a
233         page (as a string) or errback with a description of the error.
234
235         See L{HTTPClientFactory} to see what extra arguments can be passed.
236         """
237         self.httpGetterFactory = _makeGetterFactory(
238             url,
239             HTTPClientFactory,
240             contextFactory=contextFactory,
241             *args, **kwargs)
242         return self.httpGetterFactory.deferred