[TVCharts] Use channelname from lamedb and not user-bouquet
[vuplus_dvbapp-plugin] / tvcharts / src / plugin.py
1 #####################################################
2 # TVCharts Plugin for Enigma2 Dreamboxes
3 # Coded by Homey (c) 2011
4 #
5 # Version: 1.3
6 # Support: www.i-have-a-dreambox.com
7 #####################################################
8 from Components.About import about
9 from Components.ActionMap import ActionMap
10 from Components.Button import Button
11 from Components.config import config, configfile, getConfigListEntry, ConfigSubsection, ConfigYesNo, ConfigInteger, ConfigSelection
12 from Components.ConfigList import ConfigList, ConfigListScreen
13 from Components.Label import Label
14 from Components.MenuList import MenuList
15 from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
16 from Components.Network import iNetwork
17 from Components.ServiceEventTracker import ServiceEventTracker
18 from Components.Sources.StaticText import StaticText
19 from Components.UsageConfig import preferredTimerPath
20 from Components.Pixmap import Pixmap
21 from RecordTimer import RecordTimer, RecordTimerEntry, parseEvent
22 from ServiceReference import ServiceReference
23 from Screens.EventView import EventViewSimple
24 from Screens.MessageBox import MessageBox
25 from Screens.Screen import Screen
26 from Screens.Setup import SetupSummary
27 from Screens.TimerEntry import TimerEntry
28 from Screens.TimerEdit import TimerSanityConflict
29 from Tools.Directories import fileExists
30 from Tools.HardwareInfo import HardwareInfo
31 from Plugins.Plugin import PluginDescriptor
32
33 from enigma import eTimer, eEPGCache, loadJPG, loadPNG, loadPic, eListboxPythonMultiContent, gFont, eServiceReference, eServiceCenter, iPlayableService
34 from random import randint
35 from time import time, gmtime, strftime
36 from twisted.web.client import getPage
37 from xml.dom.minidom import parse, parseString
38 from urllib import urlencode
39
40 import timer
41 import xml.etree.cElementTree
42 import Screens.Standby
43
44 ##############################
45 #####  CONFIG SETTINGS   #####
46 ##############################
47 config.plugins.tvcharts = ConfigSubsection()
48 config.plugins.tvcharts.enabled = ConfigYesNo(default = True)
49 config.plugins.tvcharts.maxentries = ConfigInteger(default=10, limits=(5, 100))
50 config.plugins.tvcharts.maxtimerentries = ConfigInteger(default=10, limits=(5, 100))
51 config.plugins.tvcharts.submittimers = ConfigYesNo(default = True)
52 config.plugins.tvcharts.bouquetfilter = ConfigYesNo(default = True)
53
54 ##########################################################
55 session = [ ]
56
57 #Channellist Menu Entry
58 class ChannelListMenu(MenuList):
59         def __init__(self, list, enableWrapAround=False):
60                 MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
61                 self.l.setFont(0, gFont("Regular", 24))
62                 self.l.setFont(1, gFont("Regular", 20))
63                 self.l.setFont(2, gFont("Regular", 16))
64                 self.l.setItemHeight(76)
65
66 def ChannelListEntryComponent(type, channelname, serviceref, eventid, eventname, starttime, endtime, usercount, percent):
67         res = [ (serviceref, eventid) ]
68
69         # PIXMAP / PICON
70         pixmap = "/usr/share/enigma2/skin_default/picon_default.png"
71         searchPaths = ('/usr/share/enigma2/picon/','/media/cf/picon/','/media/usb/picon/')
72
73         srefstring = serviceref
74         pos = srefstring.rfind(':')
75         if pos != -1:
76                 srefstring = srefstring[:pos].rstrip(':').replace(':','_')
77                 for path in searchPaths:
78                         pngname = path + srefstring + ".png"
79                         if fileExists(pngname):
80                                 pixmap = pngname
81
82         # Build Menu
83         if type == "tvcharts":
84                 res.append(MultiContentEntryPixmapAlphaTest(pos=(8, 8), size=(100, 60), png=loadPNG(pixmap)))
85                 res.append(MultiContentEntryText(pos=(130, 5), size=(480, 30), font=0, text="%s (Viewer: %s)" % (channelname, usercount)))
86                 res.append(MultiContentEntryText(pos=(130, 35), size=(480, 25), font=1, text=eventname))
87         elif type == "timercharts":
88                 res.append(MultiContentEntryPixmapAlphaTest(pos=(10, 10), size=(100, 60), png=loadPNG(pixmap)))
89                 res.append(MultiContentEntryText(pos=(130, 5), size=(480, 28), font=0, text="%s (User: %s)" % (channelname, usercount)))
90                 res.append(MultiContentEntryText(pos=(130, 33), size=(480, 25), font=1, text=eventname))
91                 res.append(MultiContentEntryText(pos=(130, 57), size=(480, 20), font=2, text="%s Uhr - %s Uhr (%smin)" % (strftime("%d.%m.%Y %H:%M", gmtime(starttime)), strftime("%H:%M", gmtime(endtime)), int((endtime-starttime)/60))))
92         elif type == "moviecharts":
93                 res.append(MultiContentEntryPixmapAlphaTest(pos=(8, 8), size=(100, 60), png=loadPNG(pixmap)))
94                 res.append(MultiContentEntryText(pos=(130, 5), size=(480, 30), font=0, text=eventname))
95                 res.append(MultiContentEntryText(pos=(130, 33), size=(480, 25), font=1, text="Viewer: %s" % (usercount)))
96                 res.append(MultiContentEntryText(pos=(130, 57), size=(480, 20), font=2, text="%s Uhr - %s" % (strftime("%d.%m.%Y %H:%M", gmtime(starttime)), channelname)))
97
98         return res
99
100 ##############################
101 #####   TV Charts MAIN   #####
102 ##############################
103
104 class TVChartsMain(Screen):
105
106         skin = """
107         <screen position="center,center" size="620,510" title="TV Charts">
108                 <widget name="channellist" position="10,10" zPosition="1" size="600,458" scrollbarMode="showOnDemand" />
109                 <widget name="info" position="0,447" zPosition="2" size="620,20" font="Regular;18" noWrap="1" foregroundColor="#ffffff" transparent="1" halign="center" valign="center" />
110                 <ePixmap name="red"    position="22,470"  zPosition="3" size="140,40" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/TVCharts/images/key_red.png" transparent="1" alphatest="on" />
111                 <ePixmap name="green"  position="167,470" zPosition="3" size="140,40" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/TVCharts/images/key_green.png" transparent="1" alphatest="on" />
112                 <ePixmap name="yellow" position="312,470" zPosition="3" size="140,40" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/TVCharts/images/key_yellow.png" transparent="1" alphatest="on" />
113                 <ePixmap name="blue"   position="457,470" zPosition="3" size="140,40" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/TVCharts/images/key_blue.png" transparent="1" alphatest="on" />
114                 <widget name="key_red" position="22,470" zPosition="4" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
115                 <widget name="key_green" position="167,470" zPosition="4" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
116                 <widget name="key_yellow" position="312,470" zPosition="4" size="140,40" valign="center" halign="center"  font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
117                 <widget name="key_blue" position="457,470" zPosition="4" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
118         </screen>"""
119
120         def __init__(self, session):
121                 Screen.__init__(self, session)
122
123                 self.session = session
124
125                 self["channellist"] = ChannelListMenu([])
126                 self["info"] = Label()
127
128                 self["key_red"] = Button("TV Charts")
129                 self["key_green"] = Button("Timer Charts")
130                 self["key_yellow"] = Button("Movie Charts")
131                 self["key_blue"] = Button("Settings")
132
133                 self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "EPGSelectActions"],
134                 {
135                         "ok": self.okClicked,
136                         "red": self.switchToTVCharts,
137                         "green": self.switchToTimerCharts,
138                         "yellow": self.switchToMovieCharts,
139                         "blue": self.SettingsMenu,
140                         "info": self.ShowEventInfo,
141                         "cancel": self.close
142                 }, -1)
143
144                 self.epgcache = eEPGCache.getInstance()
145                 self.eventcache = []
146
147                 self.RefreshTimer = eTimer()
148                 self.RefreshTimer.callback.append(self.downloadList)
149
150                 self.onLayoutFinish.append(self.firstPluginExec)
151
152         def firstPluginExec(self):
153                 self.updateEventCache()
154                 self.switchToTVCharts()
155
156         def okClicked(self):
157                 current = self["channellist"].getCurrent()
158                 if current is None:
159                         return
160
161                 if self.mode == "tvcharts":
162                         service = eServiceReference(str(current[0][0]))
163                         self.session.nav.playService(service)
164                 elif self.mode == "timercharts":
165                         serviceref = ServiceReference(current[0][0])
166                         eventid = int(current[0][1])
167                         event = self.getEventFromId(serviceref, eventid)
168                         if event is not None:
169                                 newEntry = RecordTimerEntry(serviceref, *parseEvent(event), checkOldTimers = True, dirname = preferredTimerPath())
170                                 self.session.openWithCallback(self.addTimerCallback, TimerEntry, newEntry)
171                         else:
172                                 self.session.open(MessageBox, "Sorry, no EPG Info available for this event", type=MessageBox.TYPE_ERROR, timeout=10)
173                 elif self.mode == "moviecharts":
174                         print "[TVCharts] ToDo: Show Movie Info here ..."
175                         return
176
177         def addTimerCallback(self, answer):
178                 if answer[0]:
179                         entry = answer[1]
180                         simulTimerList = self.session.nav.RecordTimer.record(entry)
181                         if simulTimerList is not None:
182                                 for x in simulTimerList:
183                                         if x.setAutoincreaseEnd(entry):
184                                                 self.session.nav.RecordTimer.timeChanged(x)
185                                 simulTimerList = self.session.nav.RecordTimer.record(entry)
186                                 if simulTimerList is not None:
187                                         self.session.openWithCallback(self.finishSanityCorrection, TimerSanityConflict, simulTimerList)
188                 else:
189                         print "Timeredit aborted"
190
191         def finishSanityCorrection(self, answer):
192                 self.addTimerCallback(answer)
193
194         def SettingsMenu(self):
195                 self.session.open(TVChartsSetup)
196
197         def ShowEventInfo(self):
198                 current = self["channellist"].getCurrent()
199                 if current is None:
200                         return
201
202                 serviceref = current[0][0]
203                 eventid = current[0][1]
204
205                 service = ServiceReference(serviceref)
206                 event = self.getEventFromId(service, eventid)
207
208                 if event is not None:
209                         self.session.open(EventViewSimple, event, service)
210
211         def getEventFromId(self, service, eventid):
212                 event = None
213                 if self.epgcache is not None and eventid is not None:
214                         event = self.epgcache.lookupEventId(service.ref, eventid)
215                 return event
216
217         def updateEventCache(self):
218                 try:
219                         from Screens.ChannelSelection import service_types_tv
220                         from Components.Sources.ServiceList import ServiceList
221                         bouquetlist = ServiceList(eServiceReference(service_types_tv + ' FROM BOUQUET "bouquets.tv" ORDER BY bouquet'), validate_commands=False).getServicesAsList()
222                         for bouquetitem in bouquetlist:
223                                 serviceHandler = eServiceCenter.getInstance()
224                                 list = serviceHandler.list(eServiceReference(str(bouquetitem[0])))
225                                 services = list and list.getContent('S')
226                                 search = ['IBDCTSERNX']
227
228                                 if services: # It's a Bouquet
229                                         search.extend([(service, 0, -1) for service in services])
230
231                                 events = self.epgcache.lookupEvent(search)
232
233                                 for eventinfo in events:
234                                         #0 eventID | 4 eventname | 5 short descr | 6 long descr | 7 serviceref | 8 channelname
235                                         self.eventcache.append((eventinfo[0], eventinfo[7], eventinfo[8], eventinfo[4]))
236
237                 except Exception:
238                         print "[TVCharts Plugin] Error creating eventcache!"
239
240         def switchToTVCharts(self):
241                 self.mode = "tvcharts"
242                 self.setTitle("TV Charts")
243                 self["channellist"].setList([])
244                 self.feedurl = "http://www.dreambox-plugins.de/feeds/topchannels.php"
245                 self.downloadList()
246
247         def switchToTimerCharts(self):
248                 self.mode = "timercharts"
249                 self.setTitle("Timer Charts")
250                 self["channellist"].setList([])
251                 self.feedurl = "http://www.dreambox-plugins.de/feeds/toptimers.php?limit=%s" % config.plugins.tvcharts.maxtimerentries.value
252                 self.downloadList()
253
254         def switchToMovieCharts(self):
255                 self.mode = "moviecharts"
256                 self.setTitle("Movie Charts")
257                 self["channellist"].setList([])
258                 self.feedurl = "http://www.dreambox-plugins.de/feeds/topmovies.php"
259                 self.downloadList()
260
261         def downloadList(self):
262                 if config.plugins.tvcharts.enabled.value:
263                         self["info"].setText("Downloading feeds from server ...")
264                         getPage(self.feedurl).addCallback(self.downloadListCallback).addErrback(self.downloadListError)
265                 else:
266                         self["info"].setText("Error: Plugin disabled in Settings ...")
267
268         def downloadListError(self, error=""):
269                 print str(error)
270                 self.session.open(MessageBox, "Error downloading Feed:\n%s" % str(error), type=MessageBox.TYPE_ERROR)
271                 self["info"].setText("Error downloading Feed!")
272
273         def downloadListCallback(self, page=""):
274                 self["info"].setText("Parsing Feeds ...")
275
276                 channellist = []
277                 channelcount = 0
278                 useronline = 0
279                 totalusers = 0
280                 totaltimer = 0
281                 totalmovies = 0
282                 xml = parseString(page)
283
284                 if self.mode == "tvcharts":
285                         for node in xml.getElementsByTagName("DATA"):
286                                 useronline = int(node.getElementsByTagName("USERCOUNT")[0].childNodes[0].data)
287                                 totalusers = int(node.getElementsByTagName("TOTALUSERS")[0].childNodes[0].data)
288
289                         for node in xml.getElementsByTagName("CHANNEL"):
290                                 event_id = None
291                                 channelname =str(node.getElementsByTagName("NAME")[0].childNodes[0].data)
292                                 serviceref = str(node.getElementsByTagName("SERVICEREF")[0].childNodes[0].data)
293                                 eventname = str(node.getElementsByTagName("EVENTNAME")[0].childNodes[0].data)
294                                 usercount = int(node.getElementsByTagName("USERCOUNT")[0].childNodes[0].data)
295                                 percent = int(node.getElementsByTagName("PERCENT")[0].childNodes[0].data)
296                                 inBouquet = False
297
298                                 # Look for favourite channel for this event in my bouqets
299                                 for sepginfo in self.eventcache:
300                                         if sepginfo[2] == channelname:
301                                                 inBouquet = True
302                                         if sepginfo[3] == eventname:
303                                                 event_id = sepginfo[0]
304                                         if sepginfo[3] == eventname and sepginfo[1] != serviceref:
305                                                 if channelname[0:3].lower() == sepginfo[2][0:3].lower():
306                                                         serviceref = sepginfo[1]
307                                                         channelname = sepginfo[2]
308                                                 inBouquet = True
309                                                 break
310                                         elif sepginfo[3] == eventname and sepginfo[1] == serviceref:
311                                                 break
312
313                                 # Skip Channels that are not in my bouquets
314                                 if config.plugins.tvcharts.bouquetfilter.value and not inBouquet:
315                                         continue
316
317                                 # Skip Channels that are not in my bouquets
318                                 channelcount += 1
319                                 if channelcount > config.plugins.tvcharts.maxentries.value:
320                                         break
321
322                                 # Add to List
323                                 channellist.append(ChannelListEntryComponent(self.mode, channelname, serviceref, event_id, eventname, 0, 0, usercount, percent))
324
325                         if totalusers > 0:
326                                 self.setTitle("TV Charts (User online: %s of %s)" % (useronline, totalusers))
327
328                 elif self.mode == "timercharts":
329                         for node in xml.getElementsByTagName("DATA"):
330                                 totaltimer = int(node.getElementsByTagName("TIMERCOUNT")[0].childNodes[0].data)
331
332                         for node in xml.getElementsByTagName("TIMER"):
333                                 eitID = int(node.getElementsByTagName("ID")[0].childNodes[0].data)
334                                 channelname = str(node.getElementsByTagName("CHANNELNAME")[0].childNodes[0].data)
335                                 serviceref = str(node.getElementsByTagName("SERVICEREF")[0].childNodes[0].data)
336                                 eventname = str(node.getElementsByTagName("EVENTNAME")[0].childNodes[0].data)
337                                 starttime = int(node.getElementsByTagName("STARTTIME")[0].childNodes[0].data)
338                                 endtime = int(node.getElementsByTagName("ENDTIME")[0].childNodes[0].data)
339                                 usercount = int(node.getElementsByTagName("USERCOUNT")[0].childNodes[0].data)
340                                 percent = int(node.getElementsByTagName("PERCENT")[0].childNodes[0].data)
341
342                                 # Look for favourite channel for this event in my bouqets
343                                 for sepginfo in self.eventcache:
344                                         if sepginfo[2] == channelname:
345                                                 serviceref = sepginfo[1]
346                                                 channelname = sepginfo[2]
347                                                 inBouquet = True
348                                                 break
349
350                                 # Add to List
351                                 channellist.append(ChannelListEntryComponent(self.mode, channelname, serviceref, eitID, eventname, starttime, endtime, usercount, percent))
352
353                         if totaltimer > 0:
354                                 self.setTitle("Timer Charts (Total Timer: %s)" % (totaltimer))
355
356                 elif self.mode == "moviecharts":
357                         for node in xml.getElementsByTagName("DATA"):
358                                 totalmovies = int(node.getElementsByTagName("MOVIECOUNT")[0].childNodes[0].data)
359
360                         for node in xml.getElementsByTagName("MOVIE"):
361                                 eventid = int(node.getElementsByTagName("EVENTID")[0].childNodes[0].data)
362                                 eventname = str(node.getElementsByTagName("EVENTNAME")[0].childNodes[0].data)
363                                 channelname = str(node.getElementsByTagName("CHANNELNAME")[0].childNodes[0].data)
364                                 serviceref = str(node.getElementsByTagName("SERVICEREF")[0].childNodes[0].data)
365                                 starttime = int(node.getElementsByTagName("STARTTIME")[0].childNodes[0].data)
366                                 usercount = int(node.getElementsByTagName("USERCOUNT")[0].childNodes[0].data)
367
368                                 # Add to List
369                                 channellist.append(ChannelListEntryComponent(self.mode, channelname, serviceref, eventid, eventname, starttime, 0, usercount, 0))
370
371                         #if totalmovies > 0:
372                         #       self.setTitle("Movie Charts (Total Movies: %s)" % (totalmovies))
373
374                 self["info"].setText("")
375                 self["channellist"].setList(channellist)
376
377                 self.RefreshTimer.start(60000, True)
378
379 ############################
380 #####  SETTINGS SCREEN #####
381 ############################
382 class TVChartsSetup(Screen, ConfigListScreen):
383         def __init__(self, session):
384                 Screen.__init__(self, session)
385                 self.skinName = [ "TVChartsSetup", "Setup" ]
386                 self.setup_title = _("TV Charts Settings")
387
388                 self.onChangedEntry = [ ]
389                 self.list = [ ]
390                 ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changedEntry)
391
392                 self["actions"] = ActionMap(["SetupActions", "ColorActions"],
393                 {
394                         "ok": self.SaveSettings,
395                         "green": self.SaveSettings,
396                         "red": self.Exit,
397                         "cancel": self.Exit
398                 }, -2)
399
400                 self["key_green"] = StaticText(_("OK"))
401                 self["key_red"] = StaticText(_("Cancel"))
402
403                 self.createSetup()
404                 self.onLayoutFinish.append(self.layoutFinished)
405
406         def layoutFinished(self):
407                 self.setTitle(self.setup_title)
408
409         def createSetup(self):
410                 self.list = [ getConfigListEntry(_("TV Charts Plugin Enable"), config.plugins.tvcharts.enabled) ]
411                 if config.plugins.tvcharts.enabled.value:
412                         self.list.extend((
413                                 getConfigListEntry(_("Max Toplist Entries"), config.plugins.tvcharts.maxentries),
414                                 getConfigListEntry(_("Max Timerlist Entries"), config.plugins.tvcharts.maxtimerentries),
415                                 getConfigListEntry(_("Enable Bouquet-Filter?"), config.plugins.tvcharts.bouquetfilter),
416                                 getConfigListEntry(_("Submit Timerlist?"), config.plugins.tvcharts.submittimers),
417                         ))
418
419                 self["config"].list = self.list
420                 self["config"].setList(self.list)
421
422         def keyLeft(self):
423                 ConfigListScreen.keyLeft(self)
424                 if self["config"].getCurrent()[1] == config.plugins.tvcharts.enabled:
425                         self.createSetup()
426
427         def keyRight(self):
428                 ConfigListScreen.keyRight(self)
429                 if self["config"].getCurrent()[1] == config.plugins.tvcharts.enabled:
430                         self.createSetup()
431
432         def changedEntry(self):
433                 for x in self.onChangedEntry:
434                         x()
435
436         def getCurrentEntry(self):
437                 return self["config"].getCurrent()[0]
438
439         def getCurrentValue(self):
440                 return str(self["config"].getCurrent()[1].getText())
441
442         def createSummary(self):
443                 return SetupSummary
444
445         def SaveSettings(self):
446                 config.plugins.tvcharts.save()
447                 configfile.save()
448                 self.close()
449
450         def Exit(self):
451                 self.close()
452
453
454 ##############################
455 #####   UPDATE STATUS    #####
456 ##############################
457 class DBUpdateStatus(Screen):
458         def __init__(self, session):
459                 Screen.__init__(self, session)
460
461                 self.DBStatusTimer = eTimer()
462                 self.DBStatusTimer.callback.append(self.updateStatus)
463
464                 self.__event_tracker = ServiceEventTracker(screen = self, eventmap =
465                         {
466                                 iPlayableService.evUpdatedInfo: self.restartTimer,
467                                 iPlayableService.evUpdatedEventInfo: self.restartTimer
468                         })
469
470                 self.recordtimer = session.nav.RecordTimer
471                 self.NetworkConnectionAvailable = False
472                 self.LastTimerlistUpdate = 0
473
474                 self.onShow.append(self.restartTimer)
475
476         def restartTimer(self):
477                 if self.NetworkConnectionAvailable:
478                         self.DBStatusTimer.stop()
479                         self.DBStatusTimer.start((randint(15,60))*1000, True)
480                 else:
481                         iNetwork.checkNetworkState(self.checkNetworkCB)
482
483         def checkNetworkCB(self, data):
484                 if data is not None:
485                         if data <= 2:
486                                 self.NetworkConnectionAvailable = True
487                                 self.restartTimer()
488                         else:
489                                 self.NetworkConnectionAvailable = False
490                                 self.DBStatusTimer.stop()
491
492         def updateStatus(self):
493                 print "[TVCharts] Status Update ..."
494                 self.DBStatusTimer.stop()
495
496                 if not config.plugins.tvcharts.enabled.value or Screens.Standby.inStandby:
497                         return
498
499                 # Get Channelname
500                 ref = eServiceReference(self.session.nav.getCurrentlyPlayingServiceReference().toString())
501                 if ref is not None:
502                         ref.setName("")
503                         serviceHandler = eServiceCenter.getInstance()
504                         info = serviceHandler.info(ref)
505                         channel_name = info and info.getName(ref).replace('\xc2\x86', '').replace('\xc2\x87', '').decode("utf-8", "ignore").encode("utf-8") or ""
506                         self.serviceref = ref.toString()
507                 else:
508                         channel_name = ""
509                         self.serviceref = ""
510
511                 # Get Event Info
512                 service = self.session.nav.getCurrentService()
513                 info = service and service.info()
514                 event = info and info.getEvent(0)
515                 event_name = event and event.getEventName() or ""
516                 event_description = ""
517                 event_begin = 0
518
519                 if event is not None:
520                         curEvent = parseEvent(event)
521                         event_begin = int(curEvent[0])+(config.recording.margin_before.value*60)
522                         event_description = event.getExtendedDescription()
523
524                 # Get Box Info
525                 self.BoxID = iNetwork.getAdapterAttribute("eth0", "mac")
526                 self.DeviceName = HardwareInfo().get_device_name()
527                 self.EnigmaVersion = about.getEnigmaVersionString()
528                 self.ImageVersion = about.getVersionString()
529
530                 # Get TimerList
531                 self.timerlist = ""
532                 if config.plugins.tvcharts.submittimers.value and self.LastTimerlistUpdate <= (time()-1800):
533                         self.LastTimerlistUpdate = time()
534                         try:
535                                 for timer in self.recordtimer.timer_list:
536                                         if timer.disabled == 0 and timer.justplay == 0:
537                                                 self.timerlist += "%s|%s|%s|%s|%s|%s\n" % (timer.eit,str(int(timer.begin)+(config.recording.margin_before.value*60)), str(int(timer.end)-(config.recording.margin_after.value*60)), str(timer.service_ref), timer.name, timer.service_ref.getServiceName().replace('\xc2\x86', '').replace('\xc2\x87', '').decode("utf-8", "ignore").encode("utf-8"))
538                         except Exception:
539                                 print "[TVCharts] Error loading timers!"
540
541                 # Status Update
542                 getPage(url='http://www.dreambox-plugins.de/feeds/TVCharts/status.php', method='POST', headers={'Content-Type':'application/x-www-form-urlencoded'}, postdata=urlencode({'boxid' : self.BoxID, 'devicename' : self.DeviceName, 'imageversion' : self.ImageVersion, 'enigmaversion' : self.EnigmaVersion, 'lastchannel' : channel_name, 'lastevent' : event_name, 'eventdescr' : event_description, 'lastbegin' : event_begin, 'lastserviceref' : self.serviceref, 'timerlist' : self.timerlist})).addErrback(self.updateError)
543
544                 # Restart Timer
545                 self.DBStatusTimer.start(900000, True)
546
547         def updateError(self, error=""):
548                 self.NetworkConnectionAvailable = False
549                 self.DBStatusTimer.stop()
550
551 #############################
552 #####    INIT PLUGIN    #####
553 #############################
554 def main(session, **kwargs):
555         session.open(TVChartsMain)
556
557 def autostart(reason, **kwargs):
558         global session
559         if "session" in kwargs:
560                 session = kwargs["session"]
561                 DBUpdateStatus(session)
562
563 def Plugins(path, **kwargs):
564         return [
565                 PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART], fnc = autostart),
566                 PluginDescriptor(name="TV Charts", description="TV Charts Plugin", where=PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=main),
567                 PluginDescriptor(name="TV Charts", description="TV Charts Plugin", where=PluginDescriptor.WHERE_PLUGINMENU, fnc=main) ]