1 from Screen import Screen
2 from Components.config import config
3 from Components.ActionMap import ActionMap
4 from Components.Sources.StaticText import StaticText
5 from Components.Harddisk import harddiskmanager
6 from Components.NimManager import nimmanager
7 from Components.About import about
8 from Components.ScrollLabel import ScrollLabel
9 from Components.Button import Button
11 from Components.Label import Label
12 from Components.ProgressBar import ProgressBar
14 from Tools.StbHardware import getFPVersion
15 from enigma import eTimer, eLabel
17 from Components.HTMLComponent import HTMLComponent
18 from Components.GUIComponent import GUIComponent
22 def __init__(self, session):
23 Screen.__init__(self, session)
24 hddsplit, = skin.parameters.get("AboutHddSplit", (0,))
26 AboutText = _("Hardware: ") + about.getHardwareTypeString() + "\n"
27 AboutText += _("CPU: ") + about.getCPUInfoString() + "\n"
28 AboutText += _("Image: ") + about.getImageTypeString() + "\n"
29 AboutText += _("Installed: ") + about.getFlashDateString() + "\n"
30 AboutText += _("Kernel version: ") + about.getKernelVersionString() + "\n"
32 EnigmaVersion = "Enigma: " + about.getEnigmaVersionString()
33 self["EnigmaVersion"] = StaticText(EnigmaVersion)
34 AboutText += EnigmaVersion + "\n"
35 AboutText += _("Enigma (re)starts: %d\n") % config.misc.startCounter.value
37 GStreamerVersion = "GStreamer: " + about.getGStreamerVersionString().replace("GStreamer","")
38 self["GStreamerVersion"] = StaticText(GStreamerVersion)
39 AboutText += GStreamerVersion + "\n"
41 ImageVersion = _("Last upgrade: ") + about.getImageVersionString()
42 self["ImageVersion"] = StaticText(ImageVersion)
43 AboutText += ImageVersion + "\n"
45 AboutText += _("DVB drivers: ") + about.getDriverInstalledDate() + "\n"
47 AboutText += _("Python version: ") + about.getPythonVersionString() + "\n"
49 fp_version = getFPVersion()
50 if fp_version is None:
53 fp_version = _("Frontprocessor version: %d") % fp_version
54 AboutText += fp_version + "\n"
56 self["FPVersion"] = StaticText(fp_version)
58 self["TunerHeader"] = StaticText(_("Detected NIMs:"))
59 AboutText += "\n" + _("Detected NIMs:") + "\n"
61 nims = nimmanager.nimList()
62 for count in range(len(nims)):
64 self["Tuner" + str(count)] = StaticText(nims[count])
66 self["Tuner" + str(count)] = StaticText("")
67 AboutText += nims[count] + "\n"
69 self["HDDHeader"] = StaticText(_("Detected HDD:"))
70 AboutText += "\n" + _("Detected HDD:") + "\n"
72 hddlist = harddiskmanager.HDDList()
75 formatstring = hddsplit and "%s:%s, %.1f %sB %s" or "%s\n(%s, %.1f %sB %s)"
76 for count in range(len(hddlist)):
79 hdd = hddlist[count][1]
80 if int(hdd.free()) > 1024:
81 hddinfo += formatstring % (hdd.model(), hdd.capacity(), hdd.free()/1024, "G", _("free"))
83 hddinfo += formatstring % (hdd.model(), hdd.capacity(), hdd.free()/1024, "M", _("free"))
86 self["hddA"] = StaticText(hddinfo)
88 self["AboutScrollLabel"] = ScrollLabel(AboutText)
89 self["key_green"] = Button(_("Translations"))
90 self["key_red"] = Button(_("Latest Commits"))
91 self["key_blue"] = Button(_("Memory Info"))
93 self["actions"] = ActionMap(["ColorActions", "SetupActions", "DirectionActions"],
97 "red": self.showCommits,
98 "green": self.showTranslationInfo,
99 "blue": self.showMemoryInfo,
100 "up": self["AboutScrollLabel"].pageUp,
101 "down": self["AboutScrollLabel"].pageDown
104 def showTranslationInfo(self):
105 self.session.open(TranslationInfo)
107 def showCommits(self):
108 self.session.open(CommitInfo)
110 def showMemoryInfo(self):
111 self.session.open(MemoryInfo)
113 class TranslationInfo(Screen):
114 def __init__(self, session):
115 Screen.__init__(self, session)
116 # don't remove the string out of the _(), or it can't be "translated" anymore.
118 # TRANSLATORS: Add here whatever should be shown in the "translator" about screen, up to 6 lines (use \n for newline)
119 info = _("TRANSLATOR_INFO")
121 if info == "TRANSLATOR_INFO":
124 infolines = _("").split("\n")
131 infomap[type] = value
134 self["key_red"] = Button(_("Cancel"))
135 self["TranslationInfo"] = StaticText(info)
137 translator_name = infomap.get("Language-Team", "none")
138 if translator_name == "none":
139 translator_name = infomap.get("Last-Translator", "")
141 self["TranslatorName"] = StaticText(translator_name)
143 self["actions"] = ActionMap(["SetupActions"],
145 "cancel": self.close,
149 class CommitInfo(Screen):
150 def __init__(self, session):
151 Screen.__init__(self, session)
152 self.skinName = ["CommitInfo", "About"]
153 self["AboutScrollLabel"] = ScrollLabel(_("Please wait"))
155 self["actions"] = ActionMap(["SetupActions", "DirectionActions"],
157 "cancel": self.close,
159 "up": self["AboutScrollLabel"].pageUp,
160 "down": self["AboutScrollLabel"].pageDown,
165 self["key_red"] = Button(_("Cancel"))
169 ("enigma2", "Enigma2"),
170 ("openpli-oe-core", "Openpli Oe Core"),
171 ("enigma2-plugins", "Enigma2 Plugins"),
172 ("aio-grab", "Aio Grab"),
173 ("gst-plugin-dvbmediasink", "Gst Plugin Dvbmediasink"),
174 ("openembedded", "Openembedded"),
175 ("plugin-xmltvimport", "Plugin Xmltvimport"),
176 ("plugins-enigma2", "Plugins Enigma2"),
177 ("skin-magic", "Skin Magic"),
180 self.cachedProjects = {}
181 self.Timer = eTimer()
182 self.Timer.callback.append(self.readCommitLogs)
183 self.Timer.start(50, True)
185 def readCommitLogs(self):
186 url = 'http://sourceforge.net/p/openpli/%s/feed' % self.projects[self.project][0]
188 from urllib2 import urlopen
190 commitlog += 80 * '-' + '\n'
191 commitlog += url.split('/')[-2] + '\n'
192 commitlog += 80 * '-' + '\n'
193 for x in urlopen(url, timeout=5).read().split('<title>')[2:]:
194 for y in x.split("><"):
197 if '</dc:creator' in y:
198 creator = y.split('>')[1].split('<')[0]
200 date = y.split('>')[1].split('<')[0][:-6]
201 commitlog += date + ' ' + creator + '\n' + title + 2 * '\n'
202 self.cachedProjects[self.projects[self.project][1]] = commitlog
204 commitlog = _("Currently the commit log cannot be retrieved - please try later again")
205 self["AboutScrollLabel"].setText(commitlog)
207 def updateCommitLogs(self):
208 if self.cachedProjects.has_key(self.projects[self.project][1]):
209 self["AboutScrollLabel"].setText(self.cachedProjects[self.projects[self.project][1]])
211 self["AboutScrollLabel"].setText(_("Please wait"))
212 self.Timer.start(50, True)
215 self.project = self.project == 0 and len(self.projects) - 1 or self.project - 1
216 self.updateCommitLogs()
219 self.project = self.project != len(self.projects) - 1 and self.project + 1 or 0
220 self.updateCommitLogs()
222 class MemoryInfo(Screen):
223 def __init__(self, session):
224 Screen.__init__(self, session)
226 self["actions"] = ActionMap(["SetupActions", "ColorActions"],
228 "cancel": self.close,
229 "ok": self.getMemoryInfo,
230 "green": self.getMemoryInfo,
231 "blue": self.clearMemory,
234 self["key_red"] = Label(_("Cancel"))
235 self["key_green"] = Label(_("Refresh"))
236 self["key_blue"] = Label(_("Clear"))
238 self['lmemtext'] = Label()
239 self['lmemvalue'] = Label()
240 self['rmemtext'] = Label()
241 self['rmemvalue'] = Label()
243 self['pfree'] = Label()
244 self['pused'] = Label()
245 self["slide"] = ProgressBar()
246 self["slide"].setValue(100)
248 self["params"] = MemoryInfoSkinParams()
250 self['info'] = Label(_("This info is for developers only.\nFor a normal users it is not important.\nDon't panic, please, when here will be displayed any suspicious informations!"))
252 self.setTitle(_("Memory Info"))
253 self.onLayoutFinish.append(self.getMemoryInfo)
255 def getMemoryInfo(self):
262 for line in open('/proc/meminfo','r'):
263 ( name, size, units ) = line.strip().split()
264 if "MemTotal" in name:
266 if "MemFree" in name:
268 if i < self["params"].rows_in_column:
269 ltext += "".join((name,"\n"))
270 lvalue += "".join((size," ",units,"\n"))
272 rtext += "".join((name,"\n"))
273 rvalue += "".join((size," ",units,"\n"))
275 self['lmemtext'].setText(ltext)
276 self['lmemvalue'].setText(lvalue)
277 self['rmemtext'].setText(rtext)
278 self['rmemvalue'].setText(rvalue)
280 self["slide"].setValue(int(100.0*(mem-free)/mem+0.25))
281 self['pfree'].setText("%.1f %s" % (100.*free/mem,'%'))
282 self['pused'].setText("%.1f %s" % (100.*(mem-free)/mem,'%'))
285 print "[About] getMemoryInfo FAIL:", e
287 def clearMemory(self):
288 from os import system
290 system("echo 3 > /proc/sys/vm/drop_caches")
293 class MemoryInfoSkinParams(HTMLComponent, GUIComponent):
295 GUIComponent.__init__(self)
296 self.rows_in_column = 25
298 def applySkin(self, desktop, screen):
299 if self.skinAttributes is not None:
301 for (attrib, value) in self.skinAttributes:
302 if attrib == "rowsincolumn":
303 self.rows_in_column = int(value)
304 self.skinAttributes = attribs
305 return GUIComponent.applySkin(self, desktop, screen)