2 from enigma import eTimer
3 from Screens.Screen import Screen
4 from Components.ActionMap import ActionMap
5 from Components.Label import Label
6 from Components.MenuList import MenuList
8 from Components.MultiContent import MultiContentEntryText
9 from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT, RT_WRAP
11 from Plugins.Plugin import PluginDescriptor
12 import xml.dom.minidom
14 from twisted.web.client import getPage
15 from twisted.internet import reactor
17 ###############################################################################
18 class TrafficInfoMain(Screen):
20 <screen position="110,83" size="530,430" title="Verkehrsinfo" >
22 <widget name="sectionlist" position="0,0" size="530,125" scrollbarMode="showOnDemand" />
23 <widget name="itemlist" position="0,130" size="530,125" scrollbarMode="showOnDemand" />
24 <widget name="itemdetails" position="0,260" size="530,140" font="Regular;20" halign=\"center\" valign=\"center\"/>
25 <widget name="statuslabel" position="0,400" size="530,30" halign=\"left\"/>
28 def __init__(self, session,args = 0):
29 self.loadinginprogress = False
30 self.skin = TrafficInfoMain.skin
31 self.session = session
32 Screen.__init__(self, session)
34 self["sectionlist"] = MenuList([])
35 self["itemlist"] = ItemList([])
36 self["statuslabel"] = Label("")
37 self["itemdetails"] = Label("")
38 self["actions"] = ActionMap(["ChannelSelectBaseActions","WizardActions", "DirectionActions","MenuActions","NumberActions"],
42 "nextBouquet": self.selectSectionlist,
43 "prevBouquet": self.selectItemlist,
49 self.statuslabelcleartimer = eTimer()
50 self.statuslabelcleartimer.timeout.get().append(self.clearStatusLabel)
52 self["itemlist"].onSelectionChanged.append(self.onItemSelected)
53 self.selectSectionlist()
55 self.onShown.append(self.getSections)
58 if self.loadinginprogress:
59 reactor.callLater(1,self.exit)
63 def selectSectionlist(self):
64 self.currList = "sectionlist"
65 self["sectionlist"].selectionEnabled(1)
66 self["itemlist"].selectionEnabled(0)
68 def selectItemlist(self):
69 self.currList = "itemlist"
70 self["sectionlist"].selectionEnabled(0)
71 self["itemlist"].selectionEnabled(1)
72 self["itemlist"].selectionChanged()
75 if self.currList == "sectionlist":
76 self.onSectionSelected()
79 self[self.currList].up()
82 self[self.currList].down()
85 self[self.currList].pageUp()
88 self[self.currList].pageDown()
90 def onSectionSelected(self):
91 c = self["sectionlist"].getCurrent()
93 self.setTitle("Verkehrsinfo: "+c[1].name)
94 self.getItemsOfSection(c[1])
96 def onItemSelected(self):
97 if self["itemlist"].getCurrent() is not None:
98 c = self["itemlist"].getCurrent()[0]
100 self["itemdetails"].setText(c.text)
103 def clearStatusLabel(self):
104 self["statuslabel"].setText("")
106 def setStatusLabel(self,text):
107 self.statuslabelcleartimer.stop()
108 self["statuslabel"].setText(text)
109 self.statuslabelcleartimer.start(3000)
111 def getSections(self):
112 self.setStatusLabel("loading sections")
113 self.loadinginprogress = True
114 getPage("http://wap.verkehrsinfo.de/wvindex.php3").addCallback(self.sectionsLoaded).addErrback(self.sectionsLoadingFaild)
116 def sectionsLoadingFaild(self,raw):
117 self.loadinginprogress = False
118 self.setStatusLabel("loading sections failed"+raw)
120 def sectionsLoaded(self,raw):
121 self.loadinginprogress = False
123 xmldoc = xml.dom.minidom.parseString( raw)
125 for i in xmldoc.getElementsByTagName("a"):
126 link = "/"+i.getAttribute("href")
127 name = i.toxml().split(">")[1].split("<")[0]
128 self.sections.append(TrafficInfoSection(name,link))
129 self.onSectionsLoaded()
130 except xml.parsers.expat.ExpatError,e:
133 self.setStatusLabel("loading sections failed")
135 def onSectionsLoaded(self):
136 self.setStatusLabel("sections loaded")
138 for i in self.sections:
139 if i.name.startswith("BRD") is not True:
140 list.append((i.name,i))
142 self["sectionlist"].l.setList(list)
143 self["sectionlist"].instance.moveSelectionTo(0)
145 def onItemsLoaded(self):
147 for item in self.trafficitems:
149 res.append(MultiContentEntryText(pos=(0, 0), size=(75, 20), font=0, flags = RT_HALIGN_LEFT|RT_WRAP, text = item.street))
150 res.append(MultiContentEntryText(pos=(75,0), size=(455, 20), font=1, flags = RT_HALIGN_LEFT, text = item.direction))
152 self["itemlist"].l.setList(list)
153 self["itemlist"].instance.moveSelectionTo(0)
154 self.setStatusLabel("messages loaded")
157 def getItemsOfSection(self,section):
158 print "loading section",section.name ,section.link
159 self.setStatusLabel("loading messages "+section.name)
160 self.loadinginprogress = True
161 getPage("http://wap.verkehrsinfo.de"+section.link).addCallback(self.trafficitemsLoaded).addErrback(self.trafficitemsLoadingFaild)
163 def trafficitemsLoadingFaild(self,raw):
164 self.loadinginprogress = False
165 print "loading items faild",raw
166 self.setStatusLabel("loading messages faild"+raw)
168 def trafficitemsLoaded(self,raw):
169 self.loadinginprogress = False
171 raw = raw.replace("&","")
172 xmldoc = xml.dom.minidom.parseString( raw)
173 self.trafficitems = []
174 for item in xmldoc.getElementsByTagName("p"):
175 self.trafficitems.append(self.parseItem(item))
177 except xml.parsers.expat.ExpatError,e:
180 self.setStatusLabel("loading messages faild! Parsing Error")
182 def parseItem(self,item):
184 i= item.getElementsByTagName("b")
185 source=source.replace(i[0].toxml(),"")
186 street = i[0].toxml().replace("<b>","").replace("</b>","").replace("\n","")
188 source=source.replace(i[1].toxml(),"")
189 direction = i[1].toxml().replace("<b>","").replace("</b>","").replace("\n","")
190 details = source.replace("<p>","").replace("</p>","").replace("<small>","").replace("</small>","").replace("<br/>","").replace("\n","")
193 return TrafficInfoItem(street,direction,details)
195 class ItemList(MenuList):
196 def __init__(self, items):
197 MenuList.__init__(self,items)
198 self.l = eListboxPythonMultiContent()
199 self.l.setFont(0, gFont("Regular", 20))
200 self.l.setFont(1, gFont("Regular", 18))
201 GUI_WIDGET = eListbox
203 def getCurrentEntry(self):
204 return self.l.getCurrentSelection()
207 class TrafficInfoSection:
208 def __init__(self, name,link):
209 self.name = name.encode("utf-8")
210 self.link = link.encode("utf-8")
213 return "name="+self.name+", link="+self.link
216 class TrafficInfoItem:
217 def __init__(self, street,direction,text):
218 self.street = street.encode("utf-8")
219 self.direction = direction.encode("utf-8")
220 self.text = text.encode("utf-8")
223 return "street="+self.street+", dir="+self.direction+", text="+self.text
225 #############################
226 def main(session, **kwargs):
227 session.open(TrafficInfoMain)
229 def Plugins(**kwargs):
230 return PluginDescriptor(name="Verkehrsinfo",description="view german traffic jam informations",where = PluginDescriptor.WHERE_PLUGINMENU,fnc = main)